diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 3c1d80454..9cb79a143 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -13,7 +13,7 @@ name: "CodeQL" on: push: - branches: [ "release-next", "*codeql*" ] + branches: [ "main", "*codeql*" ] schedule: - cron: '36 20 * * 3' diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bc3ef6388..4aead0eb6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -5,7 +5,6 @@ on: branches: - main - release-v* - - release-next pull_request: workflow_dispatch: @@ -480,7 +479,7 @@ jobs: echo "DEBUG: GITHUB_REPOSITORY=${GITHUB_REPOSITORY} GITHUB_REF=${GITHUB_REF} GITHUB_RUN_ID=${GITHUB_RUN_ID}" (set -x; git remote -v show;) - # compute next patch level for non-release branches + # compute next release candidate version on non-release branches ZITI_VERSION="$($(go env GOPATH)/bin/ziti-ci -q get-next-version ${ZITI_BASE_VERSION:+--base-version $ZITI_BASE_VERSION})" validateSemver "${ZITI_VERSION}" @@ -496,26 +495,25 @@ jobs: if: ${{ !cancelled() && needs.publish.result == 'success' - && github.ref == 'refs/heads/release-next' + && github.ref == 'refs/heads/main' }} - name: Publish Release Next Docker Images + name: Publish Release Candidate Docker Images needs: publish uses: ./.github/workflows/publish-docker-images.yml secrets: inherit with: - ziti-tag: release-next + ziti-tag: main - # call on release-next and release branches to publish linux packages to - # "testing" and "release" package repos in Artifactory + # call on default branch "main" to publish linux packages to "testing" package repos in Artifactory call-publish-linux-packages: # - !cancelled() allows evaluating further conditional expressions even if # needed jobs were skipped if: ${{ !cancelled() && needs.publish.result == 'success' - && github.ref == 'refs/heads/release-next' + && github.ref == 'refs/heads/main' }} - name: Publish Release Next Linux Packages + name: Publish Release Candidate Linux Packages needs: publish uses: ./.github/workflows/publish-linux-packages.yml secrets: inherit diff --git a/.github/workflows/publish-docker-images.yml b/.github/workflows/publish-docker-images.yml index 611818b2d..d29553ba4 100644 --- a/.github/workflows/publish-docker-images.yml +++ b/.github/workflows/publish-docker-images.yml @@ -51,10 +51,8 @@ jobs: id: tagprep_cli shell: bash run: | - DOCKER_TAGS="" DOCKER_TAGS="${IMAGE_REPO}:${IMAGE_TAG}" - echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}" - echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT + echo DOCKER_TAGS="${DOCKER_TAGS}" | tee -a $GITHUB_OUTPUT # this is the base image into which is stuffed the Linux binary for each # arch that was downloaded in ./release/, hence the need to specify the @@ -78,10 +76,8 @@ jobs: id: tagprep_ctrl shell: bash run: | - DOCKER_TAGS="" DOCKER_TAGS="${IMAGE_REPO}:${IMAGE_TAG}" - echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}" - echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT + echo DOCKER_TAGS="${DOCKER_TAGS}" | tee -a $GITHUB_OUTPUT # This is a use-case image based on the minimal CLI image. It needs the # ZITI_CLI_TAG env var so it can build from the versioned image that @@ -107,7 +103,6 @@ jobs: id: tagprep_router shell: bash run: | - DOCKER_TAGS="" DOCKER_TAGS="${IMAGE_REPO}:${IMAGE_TAG}" echo DOCKER_TAGS="${DOCKER_TAGS}" | tee -a $GITHUB_OUTPUT @@ -129,17 +124,11 @@ jobs: env: IMAGE_REPO: ${{ env.ZITI_TUNNEL_IMAGE }} IMAGE_TAG: ${{ env.ZITI_CLI_TAG }} - LEGACY_REPO: netfoundry/ziti-tunnel id: tagprep_tun shell: bash run: | - DOCKER_TAGS="" - for REPO in ${LEGACY_REPO} ${IMAGE_REPO}; do - DOCKER_TAGS="${IMAGE_REPO}:${IMAGE_TAG}" - done - DOCKER_TAGS=${DOCKER_TAGS#,} # drop leading comma char - echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}" - echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT + DOCKER_TAGS="${IMAGE_REPO}:${IMAGE_TAG}" + echo DOCKER_TAGS="${DOCKER_TAGS}" | tee -a $GITHUB_OUTPUT - name: Build & Push Multi-Platform Go Tunneler Container Image to Hub uses: docker/build-push-action@v6 diff --git a/.github/workflows/release-quickstart.yml b/.github/workflows/release-quickstart.yml index 068a50b8b..9816ac44a 100644 --- a/.github/workflows/release-quickstart.yml +++ b/.github/workflows/release-quickstart.yml @@ -5,21 +5,19 @@ on: - closed branches: - main - - release-v* - - release-next + push: + tags: + - 'v*.*.*' jobs: release-quickstart: name: Release Quickstart Job - # when the ref is release-next the label "quickstartrelease" must be present on the PR for this job to run, and when - # the ref is a release branch the label is not required - if: | - github.repository_owner == 'openziti' - && github.event.pull_request.merged == true - && ( - github.ref != 'refs/heads/release-next' - || contains(github.event.pull_request.labels.*.name, 'quickstartrelease') - ) + # this is only run on the official upstream repo when a PR is merged to the default branch "main" or a release tag + # is pushed; merges to main trigger a quickstart release with a commit SHA suffix featuring the previous ziti binary + # release version, whereas release tag pushes trigger a quickstart release with the same tag name and the same ziti + # binary release version + if: github.repository_owner == 'openziti' + && ( github.event.pull_request.merged == true || startsWith(github.ref_name, 'v') ) runs-on: ubuntu-latest env: ZITI_QUICKSTART_IMAGE: ${{ vars.ZITI_QUICKSTART_IMAGE || 'docker.io/openziti/quickstart' }} @@ -76,36 +74,46 @@ jobs: id: get_version env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REF_NAME: ${{ github.ref_name }} shell: bash run: | - QUICKSTART_VERSION="$($(go env GOPATH)/bin/ziti-ci -q get-current-version)" - # drop the leading 'v', if any - QUICKSTART_VERSION=${QUICKSTART_VERSION#v} - if ! [[ "${QUICKSTART_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - # fail the job because we could not obtain the current version from ziti-ci - echo "ERROR: QUICKSTART_VERSION=${QUICKSTART_VERSION} is not a semver" - exit 1 - elif [[ "${GITHUB_REF}" =~ ^refs/heads/(release-v|main$) ]]; then - # Set output parameters for release branches - echo "DEBUG: QUICKSTART_VERSION=${QUICKSTART_VERSION}" - echo QUICKSTART_VERSION="${QUICKSTART_VERSION}" >> $GITHUB_OUTPUT - else - # Append short sha for non-Ziti-release refs to identify quickstart docker images - # shipped from release-next + function validateSemver() { + if ! [[ "${1}" =~ ^v?[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "ERROR: ${1} is not a release semver" >&2 + return 1 + fi + } + + if [[ "${GITHUB_REF_NAME}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + # Set output parameters for release tags + echo QUICKSTART_VERSION="${GITHUB_REF_NAME}" | tee -a $GITHUB_OUTPUT + + elif [[ "${GITHUB_REF_NAME}" =~ ^main$ ]]; then + # compute the latest release version to install in the quickstart image + QUICKSTART_VERSION="$($(go env GOPATH)/bin/ziti-ci -q get-current-version ${ZITI_BASE_VERSION:+--base-version $ZITI_BASE_VERSION})" + + # drop the leading 'v', if any + QUICKSTART_VERSION=${QUICKSTART_VERSION#v} + + validateSemver "${QUICKSTART_VERSION}" + + # Append short SHA to identify quickstart docker images shipped on merge to main QUICKSTART_VERSION="${QUICKSTART_VERSION}-$(git rev-parse --short ${GITHUB_SHA})" - echo "DEBUG: QUICKSTART_VERSION=${QUICKSTART_VERSION}" - echo QUICKSTART_VERSION="${QUICKSTART_VERSION}" >> $GITHUB_OUTPUT + + echo QUICKSTART_VERSION="${QUICKSTART_VERSION}" | tee -a $GITHUB_OUTPUT + + else + echo "ERROR: Unexpected GITHUB_REF_NAME=${GITHUB_REF_NAME}" >&2 + exit 1 fi # configure the env var used by the quickstart's Dockerfile to download the correct version of ziti for the # target architecture of each image build by trimming the hyphenated short sha suffix so that the preceding # release version of the ziti executable is installed in the quickstart container image ZITI_OVERRIDE_VERSION=${QUICKSTART_VERSION%-*} - echo "DEBUG: ZITI_OVERRIDE_VERSION=${ZITI_OVERRIDE_VERSION}" - echo ZITI_OVERRIDE_VERSION="${ZITI_OVERRIDE_VERSION}" >> $GITHUB_OUTPUT + echo ZITI_OVERRIDE_VERSION="${ZITI_OVERRIDE_VERSION}" | tee -a $GITHUB_OUTPUT - # This container differs in that :latest is pushed from branch release-next in addition to main and hotfix - # branches like releasev1.2.x. See https://github.com/openziti/ziti/issues/898 + # container image tag :latest is published on merge to default branch "main" and on release tags - name: Configure Quickstart Container env: IMAGE_REPO: ${{ env.ZITI_QUICKSTART_IMAGE }} @@ -113,11 +121,9 @@ jobs: id: tagprep_qs shell: bash run: | - DOCKER_TAGS="" DOCKER_TAGS="${IMAGE_REPO}:${IMAGE_TAG}" DOCKER_TAGS+=",${IMAGE_REPO}:latest" - echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}" - echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT + echo DOCKER_TAGS="${DOCKER_TAGS}" | tee -a $GITHUB_OUTPUT - name: Build & Push Multi-Platform Quickstart Container Image to Hub uses: docker/build-push-action@v6 diff --git a/.github/workflows/release-validation.yml b/.github/workflows/release-validation.yml deleted file mode 100644 index b168e3260..000000000 --- a/.github/workflows/release-validation.yml +++ /dev/null @@ -1,156 +0,0 @@ -name: release-validation - -on: - workflow_dispatch: - -# cancel older, redundant runs of same workflow on same branch -concurrency: - group: ${{ github.workflow }}-${{github.event_name}}-${{ github.head_ref || github.ref_name }} - cancel-in-progress: true - -env: - GOFLAGS: "-trimpath" - GOX_OUTPUT: "release/{{.Arch}}/{{.OS}}/{{.Dir}}" - GOX_TEST_OUTPUT: "test/{{.Arch}}/{{.OS}}/bin/{{.Dir}}" - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_DEFAULT_REGION: "us-east-2" - gh_ci_key: ${{ secrets.GH_CI_KEY }} - BUILD_NUMBER: ${{ format('{0}-{1}-{2}', github.run_id, github.run_number, github.run_attempt) }} - - -jobs: - link-validation: - name: Link Validation - # not applicable to forks. shouldn't run on release build - if: github.repository_owner == 'openziti' - runs-on: ubuntu-20.04 - steps: - - name: Git Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Install Go - uses: actions/setup-go@v5 - with: - go-version-file: ./go.mod - - - name: Install Ziti CI - uses: openziti/ziti-ci@v1 - - - name: Build and Test - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - ziti_ci_gpg_key: ${{ secrets.ZITI_CI_GPG_KEY }} - ziti_ci_gpg_key_id: ${{ secrets.ZITI_CI_GPG_KEY_ID }} - shell: bash - run: | - $(go env GOPATH)/bin/ziti-ci configure-git - $(go env GOPATH)/bin/ziti-ci generate-build-info common/version/info_generated.go version - pushd zititest && go install ./... && popd - go install -tags=all,tests ./... - - - name: Create Test Environment - shell: bash - run: | - echo "ZITI_ROOT=$(go env GOPATH)/bin" >> "$GITHUB_ENV" - $(go env GOPATH)/bin/links-test create -d links-test-${GITHUB_RUN_NUMBER} -n links-test-${GITHUB_RUN_NUMBER} -l environment=gh-fablab-links-test,ziti_version=$($(go env GOPATH)/bin/ziti-ci -q get-current-version) - $(go env GOPATH)/bin/links-test up - $(go env GOPATH)/bin/links-test exec validateUp - - - name: Run Loop Validation - shell: bash - timeout-minutes: 380 - run: | - echo "ZITI_ROOT=$(go env GOPATH)/bin" >> "$GITHUB_ENV" - $(go env GOPATH)/bin/links-test exec-loop 4h sowChaos validateUp validateLinks - - - name: Create Logs Archive - if: always() - run: | - $(go env GOPATH)/bin/links-test get files '*' "./logs/{{ .Id }}/" ./logs - - - name: Upload artifacts - uses: actions/upload-artifact@v4 - if: always() - with: - name: links-test-logs-${{ github.run_id }} - path: logs/ - compression-level: 7 - retention-days: 5 - - - name: Tear down Test Environment - timeout-minutes: 30 - if: always() - shell: bash - run: | - $(go env GOPATH)/bin/links-test dispose - - sdk-terminator-validation: - name: SDK Terminator Validation - # not applicable to forks. shouldn't run on release build - if: github.repository_owner == 'openziti' - runs-on: ubuntu-20.04 - steps: - - name: Git Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Install Go - uses: actions/setup-go@v5 - with: - go-version-file: ./go.mod - - - name: Install Ziti CI - uses: openziti/ziti-ci@v1 - - - name: Build and Test - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - ziti_ci_gpg_key: ${{ secrets.ZITI_CI_GPG_KEY }} - ziti_ci_gpg_key_id: ${{ secrets.ZITI_CI_GPG_KEY_ID }} - shell: bash - run: | - $(go env GOPATH)/bin/ziti-ci configure-git - $(go env GOPATH)/bin/ziti-ci generate-build-info common/version/info_generated.go version - pushd zititest && go install ./... && popd - go install -tags=all,tests ./... - - - name: Create Test Environment - shell: bash - run: | - echo "ZITI_ROOT=$(go env GOPATH)/bin" >> "$GITHUB_ENV" - $(go env GOPATH)/bin/sdk-hosting-test create -d sdk-hosting-test-${GITHUB_RUN_NUMBER} -n sdk-hosting-test-${GITHUB_RUN_NUMBER} -l environment=gh-fablab-sdk-hosting-test,ziti_version=$($(go env GOPATH)/bin/ziti-ci -q get-current-version) - $(go env GOPATH)/bin/sdk-hosting-test up - $(go env GOPATH)/bin/sdk-hosting-test exec validateUp - - - name: Run SDK Terminator Validation - shell: bash - timeout-minutes: 380 - run: | - echo "ZITI_ROOT=$(go env GOPATH)/bin" >> "$GITHUB_ENV" - $(go env GOPATH)/bin/sdk-hosting-test exec-loop 4h sowChaos validateUp validate - - - name: Create Logs Archive - if: always() - run: | - $(go env GOPATH)/bin/sdk-hosting-test get files '*' "./logs/{{ .Id }}/" ./logs - - - name: Upload artifacts - uses: actions/upload-artifact@v4 - if: always() - with: - name: sdk-hosting-test-logs-${{ github.run_id }} - path: logs/ - compression-level: 7 - retention-days: 5 - - - name: Tear down Test Environment - timeout-minutes: 30 - if: always() - shell: bash - run: | - $(go env GOPATH)/bin/sdk-hosting-test dispose - diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 63487a17a..984fcb72a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,7 +3,7 @@ name: release on: push: tags: - - v* + - 'v*.*.*' workflow_dispatch: env: @@ -248,8 +248,7 @@ jobs: with: ziti-tag: ${{ needs.publish.outputs.ZITI_VERSION }} - # call on release-next and release branches to publish linux packages to - # "testing" and "release" package repos in Artifactory + # call on release tags to publish linux packages to "release" package repos in Artifactory call-publish-linux-packages: # - !cancelled() allows evaluating further conditional expressions even if # needed jobs were skipped diff --git a/.github/workflows/test-cloudfront-proxy.yml b/.github/workflows/test-cloudfront-proxy.yml index 833babab5..fe4307221 100644 --- a/.github/workflows/test-cloudfront-proxy.yml +++ b/.github/workflows/test-cloudfront-proxy.yml @@ -3,7 +3,6 @@ on: workflow_dispatch: pull_request: branches: - - release-next - main - release-v* paths: diff --git a/.github/workflows/test-quickstart.yml b/.github/workflows/test-quickstart.yml index 6fc51a9c7..2b4d57e04 100644 --- a/.github/workflows/test-quickstart.yml +++ b/.github/workflows/test-quickstart.yml @@ -4,7 +4,6 @@ on: # test quickstart changes after merge push: branches: - - release-next - main paths: - 'quickstart/**' diff --git a/common/event_cache.go b/common/event_cache.go index d8353f892..cbf71df48 100644 --- a/common/event_cache.go +++ b/common/event_cache.go @@ -1,3 +1,19 @@ +/* + Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + package common import ( @@ -68,7 +84,7 @@ func (cache *ForgetfulEventCache) Store(event *edge_ctrl_pb.DataState_ChangeSet, if cache.index != nil { if *cache.index >= event.Index { - return fmt.Errorf("out of order event detected, currentIndex: %d, recievedIndex: %d, type :%T", *cache.index, event.Index, cache) + return fmt.Errorf("out of order event detected, currentIndex: %d, receivedIndex: %d, type :%T", *cache.index, event.Index, cache) } } diff --git a/common/oidc_tokens.go b/common/oidc_tokens.go index 9f32c482f..0c4d2837e 100644 --- a/common/oidc_tokens.go +++ b/common/oidc_tokens.go @@ -1,3 +1,19 @@ +/* + Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + package common import ( diff --git a/common/pb/edge_cmd_pb/edge_cmd.pb.go b/common/pb/edge_cmd_pb/edge_cmd.pb.go index 549925fe2..df6c061f1 100644 --- a/common/pb/edge_cmd_pb/edge_cmd.pb.go +++ b/common/pb/edge_cmd_pb/edge_cmd.pb.go @@ -1984,25 +1984,26 @@ type Identity struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Tags map[string]*TagValue `protobuf:"bytes,3,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - IdentityTypeId string `protobuf:"bytes,4,opt,name=identityTypeId,proto3" json:"identityTypeId,omitempty"` - IsDefaultAdmin bool `protobuf:"varint,5,opt,name=isDefaultAdmin,proto3" json:"isDefaultAdmin,omitempty"` - IsAdmin bool `protobuf:"varint,6,opt,name=isAdmin,proto3" json:"isAdmin,omitempty"` - RoleAttributes []string `protobuf:"bytes,7,rep,name=roleAttributes,proto3" json:"roleAttributes,omitempty"` - EnvInfo *Identity_EnvInfo `protobuf:"bytes,8,opt,name=envInfo,proto3,oneof" json:"envInfo,omitempty"` - SdkInfo *Identity_SdkInfo `protobuf:"bytes,9,opt,name=sdkInfo,proto3,oneof" json:"sdkInfo,omitempty"` - DefaultHostingPrecedence uint32 `protobuf:"varint,10,opt,name=defaultHostingPrecedence,proto3" json:"defaultHostingPrecedence,omitempty"` - DefaultHostingCost uint32 `protobuf:"varint,11,opt,name=defaultHostingCost,proto3" json:"defaultHostingCost,omitempty"` - ServiceHostingPrecedences map[string]uint32 `protobuf:"bytes,12,rep,name=serviceHostingPrecedences,proto3" json:"serviceHostingPrecedences,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` - ServiceHostingCosts map[string]uint32 `protobuf:"bytes,13,rep,name=serviceHostingCosts,proto3" json:"serviceHostingCosts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` - AppData []byte `protobuf:"bytes,14,opt,name=appData,proto3" json:"appData,omitempty"` - AuthPolicyId string `protobuf:"bytes,15,opt,name=authPolicyId,proto3" json:"authPolicyId,omitempty"` - ExternalId *string `protobuf:"bytes,16,opt,name=externalId,proto3,oneof" json:"externalId,omitempty"` - Disabled bool `protobuf:"varint,17,opt,name=disabled,proto3" json:"disabled,omitempty"` - DisabledAt *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=disabledAt,proto3,oneof" json:"disabledAt,omitempty"` - DisabledUntil *timestamppb.Timestamp `protobuf:"bytes,19,opt,name=disabledUntil,proto3,oneof" json:"disabledUntil,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Tags map[string]*TagValue `protobuf:"bytes,3,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + IdentityTypeId string `protobuf:"bytes,4,opt,name=identityTypeId,proto3" json:"identityTypeId,omitempty"` + IsDefaultAdmin bool `protobuf:"varint,5,opt,name=isDefaultAdmin,proto3" json:"isDefaultAdmin,omitempty"` + IsAdmin bool `protobuf:"varint,6,opt,name=isAdmin,proto3" json:"isAdmin,omitempty"` + RoleAttributes []string `protobuf:"bytes,7,rep,name=roleAttributes,proto3" json:"roleAttributes,omitempty"` + EnvInfo *Identity_EnvInfo `protobuf:"bytes,8,opt,name=envInfo,proto3,oneof" json:"envInfo,omitempty"` + SdkInfo *Identity_SdkInfo `protobuf:"bytes,9,opt,name=sdkInfo,proto3,oneof" json:"sdkInfo,omitempty"` + DefaultHostingPrecedence uint32 `protobuf:"varint,10,opt,name=defaultHostingPrecedence,proto3" json:"defaultHostingPrecedence,omitempty"` + DefaultHostingCost uint32 `protobuf:"varint,11,opt,name=defaultHostingCost,proto3" json:"defaultHostingCost,omitempty"` + ServiceHostingPrecedences map[string]uint32 `protobuf:"bytes,12,rep,name=serviceHostingPrecedences,proto3" json:"serviceHostingPrecedences,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + ServiceHostingCosts map[string]uint32 `protobuf:"bytes,13,rep,name=serviceHostingCosts,proto3" json:"serviceHostingCosts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + AppData []byte `protobuf:"bytes,14,opt,name=appData,proto3" json:"appData,omitempty"` + AuthPolicyId string `protobuf:"bytes,15,opt,name=authPolicyId,proto3" json:"authPolicyId,omitempty"` + ExternalId *string `protobuf:"bytes,16,opt,name=externalId,proto3,oneof" json:"externalId,omitempty"` + Disabled bool `protobuf:"varint,17,opt,name=disabled,proto3" json:"disabled,omitempty"` + DisabledAt *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=disabledAt,proto3,oneof" json:"disabledAt,omitempty"` + DisabledUntil *timestamppb.Timestamp `protobuf:"bytes,19,opt,name=disabledUntil,proto3,oneof" json:"disabledUntil,omitempty"` + ServiceConfigs []*Identity_ServiceConfig `protobuf:"bytes,20,rep,name=serviceConfigs,proto3" json:"serviceConfigs,omitempty"` } func (x *Identity) Reset() { @@ -2170,6 +2171,13 @@ func (x *Identity) GetDisabledUntil() *timestamppb.Timestamp { return nil } +func (x *Identity) GetServiceConfigs() []*Identity_ServiceConfig { + if x != nil { + return x.ServiceConfigs + } + return nil +} + type CreateIdentityWithEnrollmentsCmd struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3845,6 +3853,69 @@ func (x *Identity_SdkInfo) GetVersion() string { return "" } +type Identity_ServiceConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ServiceId string `protobuf:"bytes,1,opt,name=serviceId,proto3" json:"serviceId,omitempty"` + ConfigTypeId string `protobuf:"bytes,2,opt,name=configTypeId,proto3" json:"configTypeId,omitempty"` + ConfigId string `protobuf:"bytes,3,opt,name=configId,proto3" json:"configId,omitempty"` +} + +func (x *Identity_ServiceConfig) Reset() { + *x = Identity_ServiceConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_cmd_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Identity_ServiceConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Identity_ServiceConfig) ProtoMessage() {} + +func (x *Identity_ServiceConfig) ProtoReflect() protoreflect.Message { + mi := &file_edge_cmd_proto_msgTypes[55] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Identity_ServiceConfig.ProtoReflect.Descriptor instead. +func (*Identity_ServiceConfig) Descriptor() ([]byte, []int) { + return file_edge_cmd_proto_rawDescGZIP(), []int{21, 2} +} + +func (x *Identity_ServiceConfig) GetServiceId() string { + if x != nil { + return x.ServiceId + } + return "" +} + +func (x *Identity_ServiceConfig) GetConfigTypeId() string { + if x != nil { + return x.ConfigTypeId + } + return "" +} + +func (x *Identity_ServiceConfig) GetConfigId() string { + if x != nil { + return x.ConfigId + } + return "" +} + type PostureCheck_Mac struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3856,7 +3927,7 @@ type PostureCheck_Mac struct { func (x *PostureCheck_Mac) Reset() { *x = PostureCheck_Mac{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[59] + mi := &file_edge_cmd_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3869,7 +3940,7 @@ func (x *PostureCheck_Mac) String() string { func (*PostureCheck_Mac) ProtoMessage() {} func (x *PostureCheck_Mac) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[59] + mi := &file_edge_cmd_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3906,7 +3977,7 @@ type PostureCheck_Mfa struct { func (x *PostureCheck_Mfa) Reset() { *x = PostureCheck_Mfa{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[60] + mi := &file_edge_cmd_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3919,7 +3990,7 @@ func (x *PostureCheck_Mfa) String() string { func (*PostureCheck_Mfa) ProtoMessage() {} func (x *PostureCheck_Mfa) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[60] + mi := &file_edge_cmd_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3975,7 +4046,7 @@ type PostureCheck_Os struct { func (x *PostureCheck_Os) Reset() { *x = PostureCheck_Os{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[61] + mi := &file_edge_cmd_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3988,7 +4059,7 @@ func (x *PostureCheck_Os) String() string { func (*PostureCheck_Os) ProtoMessage() {} func (x *PostureCheck_Os) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[61] + mi := &file_edge_cmd_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4029,7 +4100,7 @@ type PostureCheck_OsList struct { func (x *PostureCheck_OsList) Reset() { *x = PostureCheck_OsList{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[62] + mi := &file_edge_cmd_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4042,7 +4113,7 @@ func (x *PostureCheck_OsList) String() string { func (*PostureCheck_OsList) ProtoMessage() {} func (x *PostureCheck_OsList) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[62] + mi := &file_edge_cmd_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4079,7 +4150,7 @@ type PostureCheck_Process struct { func (x *PostureCheck_Process) Reset() { *x = PostureCheck_Process{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[63] + mi := &file_edge_cmd_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4092,7 +4163,7 @@ func (x *PostureCheck_Process) String() string { func (*PostureCheck_Process) ProtoMessage() {} func (x *PostureCheck_Process) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[63] + mi := &file_edge_cmd_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4148,7 +4219,7 @@ type PostureCheck_ProcessMulti struct { func (x *PostureCheck_ProcessMulti) Reset() { *x = PostureCheck_ProcessMulti{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[64] + mi := &file_edge_cmd_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4161,7 +4232,7 @@ func (x *PostureCheck_ProcessMulti) String() string { func (*PostureCheck_ProcessMulti) ProtoMessage() {} func (x *PostureCheck_ProcessMulti) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[64] + mi := &file_edge_cmd_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4202,7 +4273,7 @@ type PostureCheck_Domains struct { func (x *PostureCheck_Domains) Reset() { *x = PostureCheck_Domains{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[65] + mi := &file_edge_cmd_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4215,7 +4286,7 @@ func (x *PostureCheck_Domains) String() string { func (*PostureCheck_Domains) ProtoMessage() {} func (x *PostureCheck_Domains) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[65] + mi := &file_edge_cmd_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4250,7 +4321,7 @@ type UpdateServiceConfigsCmd_ServiceConfig struct { func (x *UpdateServiceConfigsCmd_ServiceConfig) Reset() { *x = UpdateServiceConfigsCmd_ServiceConfig{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[72] + mi := &file_edge_cmd_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4263,7 +4334,7 @@ func (x *UpdateServiceConfigsCmd_ServiceConfig) String() string { func (*UpdateServiceConfigsCmd_ServiceConfig) ProtoMessage() {} func (x *UpdateServiceConfigsCmd_ServiceConfig) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[72] + mi := &file_edge_cmd_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4785,7 +4856,7 @@ var file_edge_cmd_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, - 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x22, 0xca, 0x0c, 0x0a, 0x08, 0x49, 0x64, + 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x22, 0x8b, 0x0e, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x61, @@ -4846,327 +4917,339 @@ var file_edge_cmd_proto_rawDesc = []byte{ 0x62, 0x6c, 0x65, 0x64, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x04, 0x52, 0x0d, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x88, 0x01, 0x01, 0x1a, - 0x9d, 0x01, 0x0a, 0x07, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x41, - 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, - 0x0e, 0x0a, 0x02, 0x4f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x73, 0x12, - 0x1c, 0x0a, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x1a, - 0xa1, 0x01, 0x0a, 0x07, 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x41, - 0x70, 0x70, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x41, 0x70, 0x70, 0x49, - 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, - 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4c, 0x0a, 0x1e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x46, 0x0a, 0x18, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0a, - 0x0a, 0x08, 0x5f, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x73, - 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x41, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0xcd, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x57, 0x69, 0x74, 0x68, 0x45, 0x6e, 0x72, - 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6d, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x88, 0x01, 0x01, 0x12, + 0x50, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x1a, 0x9d, 0x01, 0x0a, 0x07, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, + 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, + 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, + 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x1a, 0xa1, 0x01, 0x0a, 0x07, 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, + 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x41, 0x70, + 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x6d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, + 0x70, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x49, 0x64, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4c, 0x0a, 0x1e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, + 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x46, 0x0a, 0x18, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, + 0x0a, 0x0a, 0x08, 0x5f, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x0a, 0x0a, 0x08, 0x5f, + 0x73, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x41, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0xcd, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x57, 0x69, 0x74, 0x68, 0x45, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6d, 0x64, 0x12, 0x36, 0x0a, 0x08, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, + 0x62, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0b, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, + 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, + 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x52, 0x03, 0x63, 0x74, 0x78, 0x22, 0x9d, 0x02, 0x0a, 0x03, 0x4d, 0x66, 0x61, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x33, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, - 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0b, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x6f, - 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, - 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x52, 0x03, 0x63, 0x74, 0x78, 0x22, 0x9d, 0x02, 0x0a, 0x03, 0x4d, 0x66, 0x61, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x33, - 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, - 0x4d, 0x66, 0x61, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, - 0x61, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x72, - 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, - 0x73, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x2e, 0x4d, 0x66, 0x61, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x24, 0x0a, 0x0d, + 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, + 0x65, 0x73, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, + 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa0, 0x0a, 0x0a, 0x0c, 0x50, 0x6f, 0x73, 0x74, + 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, + 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, + 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x79, + 0x70, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x79, 0x70, 0x65, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, + 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x03, 0x6d, 0x61, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, + 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x2e, 0x4d, 0x61, 0x63, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x63, 0x12, 0x36, 0x0a, 0x03, + 0x6d, 0x66, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, + 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4d, 0x66, 0x61, 0x48, 0x00, 0x52, + 0x03, 0x6d, 0x66, 0x61, 0x12, 0x3f, 0x0a, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x6f, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, + 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x48, 0x00, + 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x51, 0x0a, 0x0c, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, + 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x48, 0x00, 0x52, 0x0c, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x12, 0x42, 0x0a, 0x07, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, + 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, + 0x1a, 0x29, 0x0a, 0x03, 0x4d, 0x61, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x63, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, + 0x61, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0xaf, 0x01, 0x0a, 0x03, + 0x4d, 0x66, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x50, + 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, 0x61, 0x6b, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, 0x61, 0x6b, 0x65, 0x12, + 0x26, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, + 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, + 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x34, 0x0a, 0x15, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4c, 0x65, + 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x1a, 0x3c, 0x0a, + 0x02, 0x4f, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x4f, + 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x43, 0x0a, 0x06, 0x4f, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4f, 0x73, 0x52, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x1a, 0x71, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, + 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x73, 0x1a, 0x70, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, + 0x44, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x23, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, + 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, + 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, + 0x09, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x22, 0xe7, 0x01, 0x0a, 0x0a, 0x52, + 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x73, 0x41, 0x74, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, + 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, + 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, + 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, 0x02, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x61, + 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x2e, 0x0a, + 0x12, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x26, 0x0a, + 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, + 0x2e, 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x6e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, + 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa0, 0x0a, 0x0a, 0x0c, 0x50, 0x6f, 0x73, 0x74, 0x75, - 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x74, - 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, 0x69, - 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, - 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x79, 0x70, - 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x72, - 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x03, 0x6d, 0x61, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, - 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x2e, 0x4d, 0x61, 0x63, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x63, 0x12, 0x36, 0x0a, 0x03, 0x6d, - 0x66, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, - 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4d, 0x66, 0x61, 0x48, 0x00, 0x52, 0x03, - 0x6d, 0x66, 0x61, 0x12, 0x3f, 0x0a, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, - 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x2e, 0x4f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, - 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, - 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x51, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, - 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x48, 0x00, 0x52, 0x0c, 0x70, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x12, 0x42, 0x0a, 0x07, 0x64, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, - 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x44, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x1a, - 0x29, 0x0a, 0x03, 0x4d, 0x61, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x63, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, - 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0xaf, 0x01, 0x0a, 0x03, 0x4d, - 0x66, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, - 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, 0x61, 0x6b, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, 0x61, 0x6b, 0x65, 0x12, 0x26, - 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, - 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x34, 0x0a, 0x15, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4c, 0x65, 0x67, - 0x61, 0x63, 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x1a, 0x3c, 0x0a, 0x02, - 0x4f, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x4f, 0x73, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, - 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x43, 0x0a, 0x06, 0x4f, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, - 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4f, 0x73, 0x52, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x1a, - 0x71, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x73, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x22, - 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, - 0x74, 0x73, 0x1a, 0x70, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x44, - 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, - 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x65, 0x73, 0x1a, 0x23, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc5, 0x02, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, + 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x28, 0x0a, 0x0f, 0x65, + 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x09, - 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x22, 0xe7, 0x01, 0x0a, 0x0a, 0x52, 0x65, - 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, - 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, - 0x41, 0x74, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, - 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, - 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x53, - 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, - 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xff, 0x02, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, - 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x61, 0x67, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x2e, 0x0a, 0x12, - 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, - 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x26, 0x0a, 0x0e, - 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x2e, - 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x20, - 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, - 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc5, 0x02, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, - 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x64, - 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x54, - 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x64, - 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfb, 0x02, - 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, - 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, - 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x24, - 0x0a, 0x0d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, - 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, - 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8e, 0x04, 0x0a, 0x0d, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, - 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, - 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, - 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x12, 0x25, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, - 0x72, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x15, 0x75, 0x6e, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x15, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x88, - 0x01, 0x01, 0x12, 0x31, 0x0a, 0x11, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, - 0x11, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x50, - 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x6f, 0x54, - 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x6e, 0x6f, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfb, + 0x02, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, + 0x24, 0x0a, 0x0d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x70, 0x6f, 0x73, + 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0e, 0x0a, 0x0c, - 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x18, 0x0a, 0x16, - 0x5f, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x67, 0x65, - 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x75, 0x6e, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x22, 0xc2, 0x01, 0x0a, - 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x72, 0x43, 0x6d, 0x64, 0x12, 0x37, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, - 0x12, 0x3c, 0x0a, 0x0a, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, - 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x0a, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x31, - 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, - 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x63, 0x74, - 0x78, 0x22, 0xaa, 0x02, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x43, 0x6d, 0x64, 0x12, 0x1e, 0x0a, - 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x10, 0x0a, - 0x03, 0x61, 0x64, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x64, 0x64, 0x12, - 0x5f, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x43, - 0x6d, 0x64, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, - 0x12, 0x31, 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, - 0x63, 0x74, 0x78, 0x1a, 0x49, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x2a, 0x80, - 0x02, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, - 0x0a, 0x04, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x45, 0x64, 0x67, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x10, 0xe8, 0x07, 0x12, 0x2b, 0x0a, 0x26, 0x52, 0x65, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, - 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xe9, 0x07, 0x12, 0x19, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x64, - 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xea, 0x07, 0x12, - 0x1c, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xeb, 0x07, 0x12, 0x26, 0x0a, - 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x57, - 0x69, 0x74, 0x68, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xec, 0x07, 0x12, 0x1d, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xed, 0x07, 0x12, 0x1b, 0x0a, 0x16, 0x52, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, - 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xee, - 0x07, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x70, 0x62, - 0x2f, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8e, 0x04, 0x0a, + 0x0d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, + 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, + 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x12, 0x25, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x15, 0x75, 0x6e, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x15, 0x75, 0x6e, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x11, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, + 0x52, 0x11, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, + 0x50, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x6f, + 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x6e, 0x6f, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0e, 0x0a, + 0x0c, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x18, 0x0a, + 0x16, 0x5f, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x67, + 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x75, 0x6e, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x22, 0xc2, 0x01, + 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6d, 0x64, 0x12, 0x37, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, + 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x12, 0x3c, 0x0a, 0x0a, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x31, 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, + 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x63, + 0x74, 0x78, 0x22, 0xaa, 0x02, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x43, 0x6d, 0x64, 0x12, 0x1e, + 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x10, + 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x64, 0x64, + 0x12, 0x5f, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, + 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x43, 0x6d, 0x64, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x12, 0x31, 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, + 0x62, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, + 0x03, 0x63, 0x74, 0x78, 0x1a, 0x49, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x2a, + 0x80, 0x02, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x08, 0x0a, 0x04, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x18, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x45, 0x64, 0x67, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe8, 0x07, 0x12, 0x2b, 0x0a, 0x26, 0x52, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, + 0x68, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x79, + 0x70, 0x65, 0x10, 0xe9, 0x07, 0x12, 0x19, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, + 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xea, 0x07, + 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xeb, 0x07, 0x12, 0x26, + 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x57, 0x69, 0x74, 0x68, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xec, 0x07, 0x12, 0x1d, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x54, 0x79, + 0x70, 0x65, 0x10, 0xed, 0x07, 0x12, 0x1b, 0x0a, 0x16, 0x52, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, + 0xee, 0x07, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x70, + 0x62, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5182,7 +5265,7 @@ func file_edge_cmd_proto_rawDescGZIP() []byte { } var file_edge_cmd_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_edge_cmd_proto_msgTypes = make([]protoimpl.MessageInfo, 73) +var file_edge_cmd_proto_msgTypes = make([]protoimpl.MessageInfo, 74) var file_edge_cmd_proto_goTypes = []interface{}{ (CommandType)(0), // 0: ziti.edge_cmd.pb.CommandType (*ChangeContext)(nil), // 1: ziti.edge_cmd.pb.ChangeContext @@ -5240,25 +5323,26 @@ var file_edge_cmd_proto_goTypes = []interface{}{ nil, // 53: ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry (*Identity_EnvInfo)(nil), // 54: ziti.edge_cmd.pb.Identity.EnvInfo (*Identity_SdkInfo)(nil), // 55: ziti.edge_cmd.pb.Identity.SdkInfo - nil, // 56: ziti.edge_cmd.pb.Identity.TagsEntry - nil, // 57: ziti.edge_cmd.pb.Identity.ServiceHostingPrecedencesEntry - nil, // 58: ziti.edge_cmd.pb.Identity.ServiceHostingCostsEntry - nil, // 59: ziti.edge_cmd.pb.Mfa.TagsEntry - (*PostureCheck_Mac)(nil), // 60: ziti.edge_cmd.pb.PostureCheck.Mac - (*PostureCheck_Mfa)(nil), // 61: ziti.edge_cmd.pb.PostureCheck.Mfa - (*PostureCheck_Os)(nil), // 62: ziti.edge_cmd.pb.PostureCheck.Os - (*PostureCheck_OsList)(nil), // 63: ziti.edge_cmd.pb.PostureCheck.OsList - (*PostureCheck_Process)(nil), // 64: ziti.edge_cmd.pb.PostureCheck.Process - (*PostureCheck_ProcessMulti)(nil), // 65: ziti.edge_cmd.pb.PostureCheck.ProcessMulti - (*PostureCheck_Domains)(nil), // 66: ziti.edge_cmd.pb.PostureCheck.Domains - nil, // 67: ziti.edge_cmd.pb.PostureCheck.TagsEntry - nil, // 68: ziti.edge_cmd.pb.Revocation.TagsEntry - nil, // 69: ziti.edge_cmd.pb.Service.TagsEntry - nil, // 70: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry - nil, // 71: ziti.edge_cmd.pb.ServicePolicy.TagsEntry - nil, // 72: ziti.edge_cmd.pb.TransitRouter.TagsEntry - (*UpdateServiceConfigsCmd_ServiceConfig)(nil), // 73: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ServiceConfig - (*timestamppb.Timestamp)(nil), // 74: google.protobuf.Timestamp + (*Identity_ServiceConfig)(nil), // 56: ziti.edge_cmd.pb.Identity.ServiceConfig + nil, // 57: ziti.edge_cmd.pb.Identity.TagsEntry + nil, // 58: ziti.edge_cmd.pb.Identity.ServiceHostingPrecedencesEntry + nil, // 59: ziti.edge_cmd.pb.Identity.ServiceHostingCostsEntry + nil, // 60: ziti.edge_cmd.pb.Mfa.TagsEntry + (*PostureCheck_Mac)(nil), // 61: ziti.edge_cmd.pb.PostureCheck.Mac + (*PostureCheck_Mfa)(nil), // 62: ziti.edge_cmd.pb.PostureCheck.Mfa + (*PostureCheck_Os)(nil), // 63: ziti.edge_cmd.pb.PostureCheck.Os + (*PostureCheck_OsList)(nil), // 64: ziti.edge_cmd.pb.PostureCheck.OsList + (*PostureCheck_Process)(nil), // 65: ziti.edge_cmd.pb.PostureCheck.Process + (*PostureCheck_ProcessMulti)(nil), // 66: ziti.edge_cmd.pb.PostureCheck.ProcessMulti + (*PostureCheck_Domains)(nil), // 67: ziti.edge_cmd.pb.PostureCheck.Domains + nil, // 68: ziti.edge_cmd.pb.PostureCheck.TagsEntry + nil, // 69: ziti.edge_cmd.pb.Revocation.TagsEntry + nil, // 70: ziti.edge_cmd.pb.Service.TagsEntry + nil, // 71: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry + nil, // 72: ziti.edge_cmd.pb.ServicePolicy.TagsEntry + nil, // 73: ziti.edge_cmd.pb.TransitRouter.TagsEntry + (*UpdateServiceConfigsCmd_ServiceConfig)(nil), // 74: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ServiceConfig + (*timestamppb.Timestamp)(nil), // 75: google.protobuf.Timestamp } var file_edge_cmd_proto_depIdxs = []int32{ 33, // 0: ziti.edge_cmd.pb.ChangeContext.attributes:type_name -> ziti.edge_cmd.pb.ChangeContext.AttributesEntry @@ -5277,7 +5361,7 @@ var file_edge_cmd_proto_depIdxs = []int32{ 44, // 13: ziti.edge_cmd.pb.Ca.externalIdClaim:type_name -> ziti.edge_cmd.pb.Ca.ExternalIdClaim 46, // 14: ziti.edge_cmd.pb.Config.tags:type_name -> ziti.edge_cmd.pb.Config.TagsEntry 47, // 15: ziti.edge_cmd.pb.ConfigType.tags:type_name -> ziti.edge_cmd.pb.ConfigType.TagsEntry - 74, // 16: ziti.edge_cmd.pb.Controller.lastJoinedAt:type_name -> google.protobuf.Timestamp + 75, // 16: ziti.edge_cmd.pb.Controller.lastJoinedAt:type_name -> google.protobuf.Timestamp 48, // 17: ziti.edge_cmd.pb.Controller.tags:type_name -> ziti.edge_cmd.pb.Controller.TagsEntry 49, // 18: ziti.edge_cmd.pb.Controller.apiAddresses:type_name -> ziti.edge_cmd.pb.Controller.ApiAddressesEntry 14, // 19: ziti.edge_cmd.pb.ApiAddressList.addresses:type_name -> ziti.edge_cmd.pb.ApiAddress @@ -5288,72 +5372,73 @@ var file_edge_cmd_proto_depIdxs = []int32{ 1, // 24: ziti.edge_cmd.pb.CreateEdgeRouterCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext 51, // 25: ziti.edge_cmd.pb.EdgeRouterPolicy.tags:type_name -> ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry 52, // 26: ziti.edge_cmd.pb.Enrollment.tags:type_name -> ziti.edge_cmd.pb.Enrollment.TagsEntry - 74, // 27: ziti.edge_cmd.pb.Enrollment.issuedAt:type_name -> google.protobuf.Timestamp - 74, // 28: ziti.edge_cmd.pb.Enrollment.expiresAt:type_name -> google.protobuf.Timestamp + 75, // 27: ziti.edge_cmd.pb.Enrollment.issuedAt:type_name -> google.protobuf.Timestamp + 75, // 28: ziti.edge_cmd.pb.Enrollment.expiresAt:type_name -> google.protobuf.Timestamp 7, // 29: ziti.edge_cmd.pb.ReplaceEnrollmentWithAuthenticatorCmd.authenticator:type_name -> ziti.edge_cmd.pb.Authenticator 1, // 30: ziti.edge_cmd.pb.ReplaceEnrollmentWithAuthenticatorCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext 53, // 31: ziti.edge_cmd.pb.ExternalJwtSigner.tags:type_name -> ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry - 74, // 32: ziti.edge_cmd.pb.ExternalJwtSigner.notAfter:type_name -> google.protobuf.Timestamp - 74, // 33: ziti.edge_cmd.pb.ExternalJwtSigner.notBefore:type_name -> google.protobuf.Timestamp - 56, // 34: ziti.edge_cmd.pb.Identity.tags:type_name -> ziti.edge_cmd.pb.Identity.TagsEntry + 75, // 32: ziti.edge_cmd.pb.ExternalJwtSigner.notAfter:type_name -> google.protobuf.Timestamp + 75, // 33: ziti.edge_cmd.pb.ExternalJwtSigner.notBefore:type_name -> google.protobuf.Timestamp + 57, // 34: ziti.edge_cmd.pb.Identity.tags:type_name -> ziti.edge_cmd.pb.Identity.TagsEntry 54, // 35: ziti.edge_cmd.pb.Identity.envInfo:type_name -> ziti.edge_cmd.pb.Identity.EnvInfo 55, // 36: ziti.edge_cmd.pb.Identity.sdkInfo:type_name -> ziti.edge_cmd.pb.Identity.SdkInfo - 57, // 37: ziti.edge_cmd.pb.Identity.serviceHostingPrecedences:type_name -> ziti.edge_cmd.pb.Identity.ServiceHostingPrecedencesEntry - 58, // 38: ziti.edge_cmd.pb.Identity.serviceHostingCosts:type_name -> ziti.edge_cmd.pb.Identity.ServiceHostingCostsEntry - 74, // 39: ziti.edge_cmd.pb.Identity.disabledAt:type_name -> google.protobuf.Timestamp - 74, // 40: ziti.edge_cmd.pb.Identity.disabledUntil:type_name -> google.protobuf.Timestamp - 22, // 41: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.identity:type_name -> ziti.edge_cmd.pb.Identity - 19, // 42: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.enrollments:type_name -> ziti.edge_cmd.pb.Enrollment - 1, // 43: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 59, // 44: ziti.edge_cmd.pb.Mfa.tags:type_name -> ziti.edge_cmd.pb.Mfa.TagsEntry - 67, // 45: ziti.edge_cmd.pb.PostureCheck.tags:type_name -> ziti.edge_cmd.pb.PostureCheck.TagsEntry - 60, // 46: ziti.edge_cmd.pb.PostureCheck.mac:type_name -> ziti.edge_cmd.pb.PostureCheck.Mac - 61, // 47: ziti.edge_cmd.pb.PostureCheck.mfa:type_name -> ziti.edge_cmd.pb.PostureCheck.Mfa - 63, // 48: ziti.edge_cmd.pb.PostureCheck.osList:type_name -> ziti.edge_cmd.pb.PostureCheck.OsList - 64, // 49: ziti.edge_cmd.pb.PostureCheck.process:type_name -> ziti.edge_cmd.pb.PostureCheck.Process - 65, // 50: ziti.edge_cmd.pb.PostureCheck.processMulti:type_name -> ziti.edge_cmd.pb.PostureCheck.ProcessMulti - 66, // 51: ziti.edge_cmd.pb.PostureCheck.domains:type_name -> ziti.edge_cmd.pb.PostureCheck.Domains - 74, // 52: ziti.edge_cmd.pb.Revocation.expiresAt:type_name -> google.protobuf.Timestamp - 68, // 53: ziti.edge_cmd.pb.Revocation.tags:type_name -> ziti.edge_cmd.pb.Revocation.TagsEntry - 69, // 54: ziti.edge_cmd.pb.Service.tags:type_name -> ziti.edge_cmd.pb.Service.TagsEntry - 70, // 55: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.tags:type_name -> ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry - 71, // 56: ziti.edge_cmd.pb.ServicePolicy.tags:type_name -> ziti.edge_cmd.pb.ServicePolicy.TagsEntry - 72, // 57: ziti.edge_cmd.pb.TransitRouter.tags:type_name -> ziti.edge_cmd.pb.TransitRouter.TagsEntry - 30, // 58: ziti.edge_cmd.pb.CreateTransitRouterCmd.router:type_name -> ziti.edge_cmd.pb.TransitRouter - 19, // 59: ziti.edge_cmd.pb.CreateTransitRouterCmd.enrollment:type_name -> ziti.edge_cmd.pb.Enrollment - 1, // 60: ziti.edge_cmd.pb.CreateTransitRouterCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 73, // 61: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.serviceConfigs:type_name -> ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ServiceConfig - 1, // 62: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 6, // 63: ziti.edge_cmd.pb.JsonMap.ValueEntry.value:type_name -> ziti.edge_cmd.pb.JsonValue - 3, // 64: ziti.edge_cmd.pb.Authenticator.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 41, // 65: ziti.edge_cmd.pb.AuthPolicy.Primary.cert:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.Cert - 42, // 66: ziti.edge_cmd.pb.AuthPolicy.Primary.updb:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.Updb - 43, // 67: ziti.edge_cmd.pb.AuthPolicy.Primary.extJwt:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.ExtJwt - 3, // 68: ziti.edge_cmd.pb.AuthPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 69: ziti.edge_cmd.pb.Ca.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 70: ziti.edge_cmd.pb.Config.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 71: ziti.edge_cmd.pb.ConfigType.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 72: ziti.edge_cmd.pb.Controller.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 13, // 73: ziti.edge_cmd.pb.Controller.ApiAddressesEntry.value:type_name -> ziti.edge_cmd.pb.ApiAddressList - 3, // 74: ziti.edge_cmd.pb.EdgeRouter.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 75: ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 76: ziti.edge_cmd.pb.Enrollment.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 77: ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 78: ziti.edge_cmd.pb.Identity.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 79: ziti.edge_cmd.pb.Mfa.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 62, // 80: ziti.edge_cmd.pb.PostureCheck.OsList.osList:type_name -> ziti.edge_cmd.pb.PostureCheck.Os - 64, // 81: ziti.edge_cmd.pb.PostureCheck.ProcessMulti.processes:type_name -> ziti.edge_cmd.pb.PostureCheck.Process - 3, // 82: ziti.edge_cmd.pb.PostureCheck.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 83: ziti.edge_cmd.pb.Revocation.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 84: ziti.edge_cmd.pb.Service.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 85: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 86: ziti.edge_cmd.pb.ServicePolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 87: ziti.edge_cmd.pb.TransitRouter.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 88, // [88:88] is the sub-list for method output_type - 88, // [88:88] is the sub-list for method input_type - 88, // [88:88] is the sub-list for extension type_name - 88, // [88:88] is the sub-list for extension extendee - 0, // [0:88] is the sub-list for field type_name + 58, // 37: ziti.edge_cmd.pb.Identity.serviceHostingPrecedences:type_name -> ziti.edge_cmd.pb.Identity.ServiceHostingPrecedencesEntry + 59, // 38: ziti.edge_cmd.pb.Identity.serviceHostingCosts:type_name -> ziti.edge_cmd.pb.Identity.ServiceHostingCostsEntry + 75, // 39: ziti.edge_cmd.pb.Identity.disabledAt:type_name -> google.protobuf.Timestamp + 75, // 40: ziti.edge_cmd.pb.Identity.disabledUntil:type_name -> google.protobuf.Timestamp + 56, // 41: ziti.edge_cmd.pb.Identity.serviceConfigs:type_name -> ziti.edge_cmd.pb.Identity.ServiceConfig + 22, // 42: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.identity:type_name -> ziti.edge_cmd.pb.Identity + 19, // 43: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.enrollments:type_name -> ziti.edge_cmd.pb.Enrollment + 1, // 44: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext + 60, // 45: ziti.edge_cmd.pb.Mfa.tags:type_name -> ziti.edge_cmd.pb.Mfa.TagsEntry + 68, // 46: ziti.edge_cmd.pb.PostureCheck.tags:type_name -> ziti.edge_cmd.pb.PostureCheck.TagsEntry + 61, // 47: ziti.edge_cmd.pb.PostureCheck.mac:type_name -> ziti.edge_cmd.pb.PostureCheck.Mac + 62, // 48: ziti.edge_cmd.pb.PostureCheck.mfa:type_name -> ziti.edge_cmd.pb.PostureCheck.Mfa + 64, // 49: ziti.edge_cmd.pb.PostureCheck.osList:type_name -> ziti.edge_cmd.pb.PostureCheck.OsList + 65, // 50: ziti.edge_cmd.pb.PostureCheck.process:type_name -> ziti.edge_cmd.pb.PostureCheck.Process + 66, // 51: ziti.edge_cmd.pb.PostureCheck.processMulti:type_name -> ziti.edge_cmd.pb.PostureCheck.ProcessMulti + 67, // 52: ziti.edge_cmd.pb.PostureCheck.domains:type_name -> ziti.edge_cmd.pb.PostureCheck.Domains + 75, // 53: ziti.edge_cmd.pb.Revocation.expiresAt:type_name -> google.protobuf.Timestamp + 69, // 54: ziti.edge_cmd.pb.Revocation.tags:type_name -> ziti.edge_cmd.pb.Revocation.TagsEntry + 70, // 55: ziti.edge_cmd.pb.Service.tags:type_name -> ziti.edge_cmd.pb.Service.TagsEntry + 71, // 56: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.tags:type_name -> ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry + 72, // 57: ziti.edge_cmd.pb.ServicePolicy.tags:type_name -> ziti.edge_cmd.pb.ServicePolicy.TagsEntry + 73, // 58: ziti.edge_cmd.pb.TransitRouter.tags:type_name -> ziti.edge_cmd.pb.TransitRouter.TagsEntry + 30, // 59: ziti.edge_cmd.pb.CreateTransitRouterCmd.router:type_name -> ziti.edge_cmd.pb.TransitRouter + 19, // 60: ziti.edge_cmd.pb.CreateTransitRouterCmd.enrollment:type_name -> ziti.edge_cmd.pb.Enrollment + 1, // 61: ziti.edge_cmd.pb.CreateTransitRouterCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext + 74, // 62: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.serviceConfigs:type_name -> ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ServiceConfig + 1, // 63: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext + 6, // 64: ziti.edge_cmd.pb.JsonMap.ValueEntry.value:type_name -> ziti.edge_cmd.pb.JsonValue + 3, // 65: ziti.edge_cmd.pb.Authenticator.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 41, // 66: ziti.edge_cmd.pb.AuthPolicy.Primary.cert:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.Cert + 42, // 67: ziti.edge_cmd.pb.AuthPolicy.Primary.updb:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.Updb + 43, // 68: ziti.edge_cmd.pb.AuthPolicy.Primary.extJwt:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.ExtJwt + 3, // 69: ziti.edge_cmd.pb.AuthPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 70: ziti.edge_cmd.pb.Ca.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 71: ziti.edge_cmd.pb.Config.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 72: ziti.edge_cmd.pb.ConfigType.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 73: ziti.edge_cmd.pb.Controller.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 13, // 74: ziti.edge_cmd.pb.Controller.ApiAddressesEntry.value:type_name -> ziti.edge_cmd.pb.ApiAddressList + 3, // 75: ziti.edge_cmd.pb.EdgeRouter.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 76: ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 77: ziti.edge_cmd.pb.Enrollment.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 78: ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 79: ziti.edge_cmd.pb.Identity.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 80: ziti.edge_cmd.pb.Mfa.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 63, // 81: ziti.edge_cmd.pb.PostureCheck.OsList.osList:type_name -> ziti.edge_cmd.pb.PostureCheck.Os + 65, // 82: ziti.edge_cmd.pb.PostureCheck.ProcessMulti.processes:type_name -> ziti.edge_cmd.pb.PostureCheck.Process + 3, // 83: ziti.edge_cmd.pb.PostureCheck.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 84: ziti.edge_cmd.pb.Revocation.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 85: ziti.edge_cmd.pb.Service.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 86: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 87: ziti.edge_cmd.pb.ServicePolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 88: ziti.edge_cmd.pb.TransitRouter.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 89, // [89:89] is the sub-list for method output_type + 89, // [89:89] is the sub-list for method input_type + 89, // [89:89] is the sub-list for extension type_name + 89, // [89:89] is the sub-list for extension extendee + 0, // [0:89] is the sub-list for field type_name } func init() { file_edge_cmd_proto_init() } @@ -5866,8 +5951,8 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostureCheck_Mac); i { + file_edge_cmd_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Identity_ServiceConfig); i { case 0: return &v.state case 1: @@ -5879,7 +5964,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostureCheck_Mfa); i { + switch v := v.(*PostureCheck_Mac); i { case 0: return &v.state case 1: @@ -5891,7 +5976,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostureCheck_Os); i { + switch v := v.(*PostureCheck_Mfa); i { case 0: return &v.state case 1: @@ -5903,7 +5988,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostureCheck_OsList); i { + switch v := v.(*PostureCheck_Os); i { case 0: return &v.state case 1: @@ -5915,7 +6000,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostureCheck_Process); i { + switch v := v.(*PostureCheck_OsList); i { case 0: return &v.state case 1: @@ -5927,7 +6012,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostureCheck_ProcessMulti); i { + switch v := v.(*PostureCheck_Process); i { case 0: return &v.state case 1: @@ -5939,6 +6024,18 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PostureCheck_ProcessMulti); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_cmd_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_Domains); i { case 0: return &v.state @@ -5950,7 +6047,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateServiceConfigsCmd_ServiceConfig); i { case 0: return &v.state @@ -6003,7 +6100,7 @@ func file_edge_cmd_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_edge_cmd_proto_rawDesc, NumEnums: 1, - NumMessages: 73, + NumMessages: 74, NumExtensions: 0, NumServices: 0, }, diff --git a/common/pb/edge_cmd_pb/edge_cmd.proto b/common/pb/edge_cmd_pb/edge_cmd.proto index 0cb345a97..a234bbc44 100644 --- a/common/pb/edge_cmd_pb/edge_cmd.proto +++ b/common/pb/edge_cmd_pb/edge_cmd.proto @@ -175,7 +175,7 @@ message Controller { bool isOnline = 6; google.protobuf.Timestamp lastJoinedAt = 7; map tags = 8; - map apiAddresses = 9; + map apiAddresses = 9; } message ApiAddressList { @@ -291,6 +291,12 @@ message Identity { string Version = 6; } + message ServiceConfig { + string serviceId = 1; + string configTypeId = 2; + string configId = 3; + } + string id = 1; string name = 2; map tags = 3; @@ -310,6 +316,7 @@ message Identity { bool disabled = 17; optional google.protobuf.Timestamp disabledAt = 18; optional google.protobuf.Timestamp disabledUntil = 19; + repeated ServiceConfig serviceConfigs = 20; } message CreateIdentityWithEnrollmentsCmd { diff --git a/common/pb/edge_ctrl_pb/edge_ctrl.pb.go b/common/pb/edge_ctrl_pb/edge_ctrl.pb.go index 8333e22f8..717675b25 100644 --- a/common/pb/edge_ctrl_pb/edge_ctrl.pb.go +++ b/common/pb/edge_ctrl_pb/edge_ctrl.pb.go @@ -553,7 +553,7 @@ func (x DataState_Action) Number() protoreflect.EnumNumber { // Deprecated: Use DataState_Action.Descriptor instead. func (DataState_Action) EnumDescriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 0} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 0} } type DataState_PublicKey_Usage int32 @@ -599,7 +599,7 @@ func (x DataState_PublicKey_Usage) Number() protoreflect.EnumNumber { // Deprecated: Use DataState_PublicKey_Usage.Descriptor instead. func (DataState_PublicKey_Usage) EnumDescriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 7, 0} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 10, 0} } type DataState_PublicKey_Format int32 @@ -645,7 +645,7 @@ func (x DataState_PublicKey_Format) Number() protoreflect.EnumNumber { // Deprecated: Use DataState_PublicKey_Format.Descriptor instead. func (DataState_PublicKey_Format) EnumDescriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 7, 1} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 10, 1} } type ServerHello struct { @@ -991,69 +991,6 @@ func (x *Error) GetCause() string { return "" } -type Service struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - EncryptionRequired bool `protobuf:"varint,3,opt,name=encryptionRequired,proto3" json:"encryptionRequired,omitempty"` -} - -func (x *Service) Reset() { - *x = Service{} - if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Service) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Service) ProtoMessage() {} - -func (x *Service) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Service.ProtoReflect.Descriptor instead. -func (*Service) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{5} -} - -func (x *Service) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Service) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Service) GetEncryptionRequired() bool { - if x != nil { - return x.EncryptionRequired - } - return false -} - type DataState struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1066,7 +1003,7 @@ type DataState struct { func (x *DataState) Reset() { *x = DataState{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[6] + mi := &file_edge_ctrl_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1079,7 +1016,7 @@ func (x *DataState) String() string { func (*DataState) ProtoMessage() {} func (x *DataState) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[6] + mi := &file_edge_ctrl_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1092,7 +1029,7 @@ func (x *DataState) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState.ProtoReflect.Descriptor instead. func (*DataState) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5} } func (x *DataState) GetEvents() []*DataState_Event { @@ -1109,101 +1046,6 @@ func (x *DataState) GetEndIndex() uint64 { return 0 } -type Session struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - Type SessionType `protobuf:"varint,2,opt,name=type,proto3,enum=ziti.edge_ctrl.pb.SessionType" json:"type,omitempty"` - CertFingerprints []string `protobuf:"bytes,3,rep,name=certFingerprints,proto3" json:"certFingerprints,omitempty"` - Urls []string `protobuf:"bytes,4,rep,name=urls,proto3" json:"urls,omitempty"` - Service *Service `protobuf:"bytes,5,opt,name=service,proto3" json:"service,omitempty"` - Id string `protobuf:"bytes,7,opt,name=id,proto3" json:"id,omitempty"` - ApiSessionId string `protobuf:"bytes,8,opt,name=apiSessionId,proto3" json:"apiSessionId,omitempty"` -} - -func (x *Session) Reset() { - *x = Session{} - if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Session) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Session) ProtoMessage() {} - -func (x *Session) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Session.ProtoReflect.Descriptor instead. -func (*Session) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{7} -} - -func (x *Session) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -func (x *Session) GetType() SessionType { - if x != nil { - return x.Type - } - return SessionType_Dial -} - -func (x *Session) GetCertFingerprints() []string { - if x != nil { - return x.CertFingerprints - } - return nil -} - -func (x *Session) GetUrls() []string { - if x != nil { - return x.Urls - } - return nil -} - -func (x *Session) GetService() *Service { - if x != nil { - return x.Service - } - return nil -} - -func (x *Session) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Session) GetApiSessionId() string { - if x != nil { - return x.ApiSessionId - } - return "" -} - type ApiSession struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1217,7 +1059,7 @@ type ApiSession struct { func (x *ApiSession) Reset() { *x = ApiSession{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[8] + mi := &file_edge_ctrl_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1230,7 +1072,7 @@ func (x *ApiSession) String() string { func (*ApiSession) ProtoMessage() {} func (x *ApiSession) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[8] + mi := &file_edge_ctrl_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1243,7 +1085,7 @@ func (x *ApiSession) ProtoReflect() protoreflect.Message { // Deprecated: Use ApiSession.ProtoReflect.Descriptor instead. func (*ApiSession) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{8} + return file_edge_ctrl_proto_rawDescGZIP(), []int{6} } func (x *ApiSession) GetToken() string { @@ -1279,7 +1121,7 @@ type ApiSessionAdded struct { func (x *ApiSessionAdded) Reset() { *x = ApiSessionAdded{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[9] + mi := &file_edge_ctrl_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1292,7 +1134,7 @@ func (x *ApiSessionAdded) String() string { func (*ApiSessionAdded) ProtoMessage() {} func (x *ApiSessionAdded) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[9] + mi := &file_edge_ctrl_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1305,7 +1147,7 @@ func (x *ApiSessionAdded) ProtoReflect() protoreflect.Message { // Deprecated: Use ApiSessionAdded.ProtoReflect.Descriptor instead. func (*ApiSessionAdded) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{9} + return file_edge_ctrl_proto_rawDescGZIP(), []int{7} } func (x *ApiSessionAdded) GetIsFullState() bool { @@ -1333,7 +1175,7 @@ type ApiSessionUpdated struct { func (x *ApiSessionUpdated) Reset() { *x = ApiSessionUpdated{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[10] + mi := &file_edge_ctrl_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1346,7 +1188,7 @@ func (x *ApiSessionUpdated) String() string { func (*ApiSessionUpdated) ProtoMessage() {} func (x *ApiSessionUpdated) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[10] + mi := &file_edge_ctrl_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1359,7 +1201,7 @@ func (x *ApiSessionUpdated) ProtoReflect() protoreflect.Message { // Deprecated: Use ApiSessionUpdated.ProtoReflect.Descriptor instead. func (*ApiSessionUpdated) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{10} + return file_edge_ctrl_proto_rawDescGZIP(), []int{8} } func (x *ApiSessionUpdated) GetApiSessions() []*ApiSession { @@ -1381,7 +1223,7 @@ type ApiSessionRemoved struct { func (x *ApiSessionRemoved) Reset() { *x = ApiSessionRemoved{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[11] + mi := &file_edge_ctrl_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1394,7 +1236,7 @@ func (x *ApiSessionRemoved) String() string { func (*ApiSessionRemoved) ProtoMessage() {} func (x *ApiSessionRemoved) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[11] + mi := &file_edge_ctrl_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1407,7 +1249,7 @@ func (x *ApiSessionRemoved) ProtoReflect() protoreflect.Message { // Deprecated: Use ApiSessionRemoved.ProtoReflect.Descriptor instead. func (*ApiSessionRemoved) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{11} + return file_edge_ctrl_proto_rawDescGZIP(), []int{9} } func (x *ApiSessionRemoved) GetTokens() []string { @@ -1435,7 +1277,7 @@ type ApiSessionHeartbeat struct { func (x *ApiSessionHeartbeat) Reset() { *x = ApiSessionHeartbeat{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[12] + mi := &file_edge_ctrl_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1448,7 +1290,7 @@ func (x *ApiSessionHeartbeat) String() string { func (*ApiSessionHeartbeat) ProtoMessage() {} func (x *ApiSessionHeartbeat) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[12] + mi := &file_edge_ctrl_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1461,7 +1303,7 @@ func (x *ApiSessionHeartbeat) ProtoReflect() protoreflect.Message { // Deprecated: Use ApiSessionHeartbeat.ProtoReflect.Descriptor instead. func (*ApiSessionHeartbeat) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{12} + return file_edge_ctrl_proto_rawDescGZIP(), []int{10} } func (x *ApiSessionHeartbeat) GetTokens() []string { @@ -1483,7 +1325,7 @@ type SessionRemoved struct { func (x *SessionRemoved) Reset() { *x = SessionRemoved{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[13] + mi := &file_edge_ctrl_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1496,7 +1338,7 @@ func (x *SessionRemoved) String() string { func (*SessionRemoved) ProtoMessage() {} func (x *SessionRemoved) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[13] + mi := &file_edge_ctrl_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1509,7 +1351,7 @@ func (x *SessionRemoved) ProtoReflect() protoreflect.Message { // Deprecated: Use SessionRemoved.ProtoReflect.Descriptor instead. func (*SessionRemoved) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{13} + return file_edge_ctrl_proto_rawDescGZIP(), []int{11} } func (x *SessionRemoved) GetTokens() []string { @@ -1537,7 +1379,7 @@ type RequestClientReSync struct { func (x *RequestClientReSync) Reset() { *x = RequestClientReSync{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[14] + mi := &file_edge_ctrl_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1550,7 +1392,7 @@ func (x *RequestClientReSync) String() string { func (*RequestClientReSync) ProtoMessage() {} func (x *RequestClientReSync) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[14] + mi := &file_edge_ctrl_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1563,7 +1405,7 @@ func (x *RequestClientReSync) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestClientReSync.ProtoReflect.Descriptor instead. func (*RequestClientReSync) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{14} + return file_edge_ctrl_proto_rawDescGZIP(), []int{12} } func (x *RequestClientReSync) GetReason() string { @@ -1588,7 +1430,7 @@ type CreateCircuitRequest struct { func (x *CreateCircuitRequest) Reset() { *x = CreateCircuitRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[15] + mi := &file_edge_ctrl_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1601,7 +1443,7 @@ func (x *CreateCircuitRequest) String() string { func (*CreateCircuitRequest) ProtoMessage() {} func (x *CreateCircuitRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[15] + mi := &file_edge_ctrl_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1614,7 +1456,7 @@ func (x *CreateCircuitRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateCircuitRequest.ProtoReflect.Descriptor instead. func (*CreateCircuitRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{15} + return file_edge_ctrl_proto_rawDescGZIP(), []int{13} } func (x *CreateCircuitRequest) GetSessionToken() string { @@ -1666,7 +1508,7 @@ type CreateCircuitResponse struct { func (x *CreateCircuitResponse) Reset() { *x = CreateCircuitResponse{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[16] + mi := &file_edge_ctrl_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1679,7 +1521,7 @@ func (x *CreateCircuitResponse) String() string { func (*CreateCircuitResponse) ProtoMessage() {} func (x *CreateCircuitResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[16] + mi := &file_edge_ctrl_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1692,7 +1534,7 @@ func (x *CreateCircuitResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateCircuitResponse.ProtoReflect.Descriptor instead. func (*CreateCircuitResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{16} + return file_edge_ctrl_proto_rawDescGZIP(), []int{14} } func (x *CreateCircuitResponse) GetCircuitId() string { @@ -1741,7 +1583,7 @@ type CreateTerminatorRequest struct { func (x *CreateTerminatorRequest) Reset() { *x = CreateTerminatorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[17] + mi := &file_edge_ctrl_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1754,7 +1596,7 @@ func (x *CreateTerminatorRequest) String() string { func (*CreateTerminatorRequest) ProtoMessage() {} func (x *CreateTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[17] + mi := &file_edge_ctrl_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1767,7 +1609,7 @@ func (x *CreateTerminatorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTerminatorRequest.ProtoReflect.Descriptor instead. func (*CreateTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{17} + return file_edge_ctrl_proto_rawDescGZIP(), []int{15} } func (x *CreateTerminatorRequest) GetSessionToken() string { @@ -1845,7 +1687,7 @@ type CreateTerminatorV2Request struct { func (x *CreateTerminatorV2Request) Reset() { *x = CreateTerminatorV2Request{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[18] + mi := &file_edge_ctrl_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1858,7 +1700,7 @@ func (x *CreateTerminatorV2Request) String() string { func (*CreateTerminatorV2Request) ProtoMessage() {} func (x *CreateTerminatorV2Request) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[18] + mi := &file_edge_ctrl_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1871,7 +1713,7 @@ func (x *CreateTerminatorV2Request) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTerminatorV2Request.ProtoReflect.Descriptor instead. func (*CreateTerminatorV2Request) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{18} + return file_edge_ctrl_proto_rawDescGZIP(), []int{16} } func (x *CreateTerminatorV2Request) GetAddress() string { @@ -1950,7 +1792,7 @@ type CreateTerminatorV2Response struct { func (x *CreateTerminatorV2Response) Reset() { *x = CreateTerminatorV2Response{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[19] + mi := &file_edge_ctrl_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1963,7 +1805,7 @@ func (x *CreateTerminatorV2Response) String() string { func (*CreateTerminatorV2Response) ProtoMessage() {} func (x *CreateTerminatorV2Response) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[19] + mi := &file_edge_ctrl_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1976,7 +1818,7 @@ func (x *CreateTerminatorV2Response) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTerminatorV2Response.ProtoReflect.Descriptor instead. func (*CreateTerminatorV2Response) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{19} + return file_edge_ctrl_proto_rawDescGZIP(), []int{17} } func (x *CreateTerminatorV2Response) GetTerminatorId() string { @@ -2014,7 +1856,7 @@ type RemoveTerminatorRequest struct { func (x *RemoveTerminatorRequest) Reset() { *x = RemoveTerminatorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[20] + mi := &file_edge_ctrl_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2027,7 +1869,7 @@ func (x *RemoveTerminatorRequest) String() string { func (*RemoveTerminatorRequest) ProtoMessage() {} func (x *RemoveTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[20] + mi := &file_edge_ctrl_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2040,7 +1882,7 @@ func (x *RemoveTerminatorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveTerminatorRequest.ProtoReflect.Descriptor instead. func (*RemoveTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{20} + return file_edge_ctrl_proto_rawDescGZIP(), []int{18} } func (x *RemoveTerminatorRequest) GetSessionToken() string { @@ -2089,7 +1931,7 @@ type UpdateTerminatorRequest struct { func (x *UpdateTerminatorRequest) Reset() { *x = UpdateTerminatorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[21] + mi := &file_edge_ctrl_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2102,7 +1944,7 @@ func (x *UpdateTerminatorRequest) String() string { func (*UpdateTerminatorRequest) ProtoMessage() {} func (x *UpdateTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[21] + mi := &file_edge_ctrl_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2115,7 +1957,7 @@ func (x *UpdateTerminatorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateTerminatorRequest.ProtoReflect.Descriptor instead. func (*UpdateTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{21} + return file_edge_ctrl_proto_rawDescGZIP(), []int{19} } func (x *UpdateTerminatorRequest) GetSessionToken() string { @@ -2189,7 +2031,7 @@ type HealthEventRequest struct { func (x *HealthEventRequest) Reset() { *x = HealthEventRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[22] + mi := &file_edge_ctrl_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2202,7 +2044,7 @@ func (x *HealthEventRequest) String() string { func (*HealthEventRequest) ProtoMessage() {} func (x *HealthEventRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[22] + mi := &file_edge_ctrl_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2215,7 +2057,7 @@ func (x *HealthEventRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthEventRequest.ProtoReflect.Descriptor instead. func (*HealthEventRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{22} + return file_edge_ctrl_proto_rawDescGZIP(), []int{20} } func (x *HealthEventRequest) GetSessionToken() string { @@ -2264,7 +2106,7 @@ type ValidateSessionsRequest struct { func (x *ValidateSessionsRequest) Reset() { *x = ValidateSessionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[23] + mi := &file_edge_ctrl_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2277,7 +2119,7 @@ func (x *ValidateSessionsRequest) String() string { func (*ValidateSessionsRequest) ProtoMessage() {} func (x *ValidateSessionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[23] + mi := &file_edge_ctrl_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2290,7 +2132,7 @@ func (x *ValidateSessionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSessionsRequest.ProtoReflect.Descriptor instead. func (*ValidateSessionsRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{23} + return file_edge_ctrl_proto_rawDescGZIP(), []int{21} } func (x *ValidateSessionsRequest) GetSessionTokens() []string { @@ -2316,7 +2158,7 @@ type EnvInfo struct { func (x *EnvInfo) Reset() { *x = EnvInfo{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[24] + mi := &file_edge_ctrl_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2329,7 +2171,7 @@ func (x *EnvInfo) String() string { func (*EnvInfo) ProtoMessage() {} func (x *EnvInfo) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[24] + mi := &file_edge_ctrl_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2342,7 +2184,7 @@ func (x *EnvInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use EnvInfo.ProtoReflect.Descriptor instead. func (*EnvInfo) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{24} + return file_edge_ctrl_proto_rawDescGZIP(), []int{22} } func (x *EnvInfo) GetArch() string { @@ -2403,7 +2245,7 @@ type SdkInfo struct { func (x *SdkInfo) Reset() { *x = SdkInfo{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[25] + mi := &file_edge_ctrl_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2416,7 +2258,7 @@ func (x *SdkInfo) String() string { func (*SdkInfo) ProtoMessage() {} func (x *SdkInfo) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[25] + mi := &file_edge_ctrl_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2429,7 +2271,7 @@ func (x *SdkInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use SdkInfo.ProtoReflect.Descriptor instead. func (*SdkInfo) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{25} + return file_edge_ctrl_proto_rawDescGZIP(), []int{23} } func (x *SdkInfo) GetAppId() string { @@ -2487,7 +2329,7 @@ type CreateApiSessionRequest struct { func (x *CreateApiSessionRequest) Reset() { *x = CreateApiSessionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[26] + mi := &file_edge_ctrl_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2500,7 +2342,7 @@ func (x *CreateApiSessionRequest) String() string { func (*CreateApiSessionRequest) ProtoMessage() {} func (x *CreateApiSessionRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[26] + mi := &file_edge_ctrl_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2513,7 +2355,7 @@ func (x *CreateApiSessionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateApiSessionRequest.ProtoReflect.Descriptor instead. func (*CreateApiSessionRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{26} + return file_edge_ctrl_proto_rawDescGZIP(), []int{24} } func (x *CreateApiSessionRequest) GetEnvInfo() *EnvInfo { @@ -2557,7 +2399,7 @@ type CreateApiSessionResponse struct { func (x *CreateApiSessionResponse) Reset() { *x = CreateApiSessionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[27] + mi := &file_edge_ctrl_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2570,7 +2412,7 @@ func (x *CreateApiSessionResponse) String() string { func (*CreateApiSessionResponse) ProtoMessage() {} func (x *CreateApiSessionResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[27] + mi := &file_edge_ctrl_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2583,7 +2425,7 @@ func (x *CreateApiSessionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateApiSessionResponse.ProtoReflect.Descriptor instead. func (*CreateApiSessionResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{27} + return file_edge_ctrl_proto_rawDescGZIP(), []int{25} } func (x *CreateApiSessionResponse) GetSessionId() string { @@ -2670,7 +2512,7 @@ type CreateCircuitForServiceRequest struct { func (x *CreateCircuitForServiceRequest) Reset() { *x = CreateCircuitForServiceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[28] + mi := &file_edge_ctrl_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2683,7 +2525,7 @@ func (x *CreateCircuitForServiceRequest) String() string { func (*CreateCircuitForServiceRequest) ProtoMessage() {} func (x *CreateCircuitForServiceRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[28] + mi := &file_edge_ctrl_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2696,7 +2538,7 @@ func (x *CreateCircuitForServiceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateCircuitForServiceRequest.ProtoReflect.Descriptor instead. func (*CreateCircuitForServiceRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{28} + return file_edge_ctrl_proto_rawDescGZIP(), []int{26} } func (x *CreateCircuitForServiceRequest) GetSessionId() string { @@ -2739,7 +2581,7 @@ type CreateSessionResponse struct { func (x *CreateSessionResponse) Reset() { *x = CreateSessionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[29] + mi := &file_edge_ctrl_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2752,7 +2594,7 @@ func (x *CreateSessionResponse) String() string { func (*CreateSessionResponse) ProtoMessage() {} func (x *CreateSessionResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[29] + mi := &file_edge_ctrl_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2765,7 +2607,7 @@ func (x *CreateSessionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateSessionResponse.ProtoReflect.Descriptor instead. func (*CreateSessionResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{29} + return file_edge_ctrl_proto_rawDescGZIP(), []int{27} } func (x *CreateSessionResponse) GetSessionId() string { @@ -2798,7 +2640,7 @@ type CreateCircuitForServiceResponse struct { func (x *CreateCircuitForServiceResponse) Reset() { *x = CreateCircuitForServiceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[30] + mi := &file_edge_ctrl_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2811,7 +2653,7 @@ func (x *CreateCircuitForServiceResponse) String() string { func (*CreateCircuitForServiceResponse) ProtoMessage() {} func (x *CreateCircuitForServiceResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[30] + mi := &file_edge_ctrl_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2824,7 +2666,7 @@ func (x *CreateCircuitForServiceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateCircuitForServiceResponse.ProtoReflect.Descriptor instead. func (*CreateCircuitForServiceResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{30} + return file_edge_ctrl_proto_rawDescGZIP(), []int{28} } func (x *CreateCircuitForServiceResponse) GetApiSession() *CreateApiSessionResponse { @@ -2882,7 +2724,7 @@ type CreateTunnelCircuitV2Request struct { func (x *CreateTunnelCircuitV2Request) Reset() { *x = CreateTunnelCircuitV2Request{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[31] + mi := &file_edge_ctrl_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2895,7 +2737,7 @@ func (x *CreateTunnelCircuitV2Request) String() string { func (*CreateTunnelCircuitV2Request) ProtoMessage() {} func (x *CreateTunnelCircuitV2Request) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[31] + mi := &file_edge_ctrl_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2908,7 +2750,7 @@ func (x *CreateTunnelCircuitV2Request) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnelCircuitV2Request.ProtoReflect.Descriptor instead. func (*CreateTunnelCircuitV2Request) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{31} + return file_edge_ctrl_proto_rawDescGZIP(), []int{29} } func (x *CreateTunnelCircuitV2Request) GetServiceName() string { @@ -2946,7 +2788,7 @@ type CreateTunnelCircuitV2Response struct { func (x *CreateTunnelCircuitV2Response) Reset() { *x = CreateTunnelCircuitV2Response{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[32] + mi := &file_edge_ctrl_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2959,7 +2801,7 @@ func (x *CreateTunnelCircuitV2Response) String() string { func (*CreateTunnelCircuitV2Response) ProtoMessage() {} func (x *CreateTunnelCircuitV2Response) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[32] + mi := &file_edge_ctrl_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2972,7 +2814,7 @@ func (x *CreateTunnelCircuitV2Response) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnelCircuitV2Response.ProtoReflect.Descriptor instead. func (*CreateTunnelCircuitV2Response) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{32} + return file_edge_ctrl_proto_rawDescGZIP(), []int{30} } func (x *CreateTunnelCircuitV2Response) GetCircuitId() string { @@ -3015,7 +2857,7 @@ type ServicesList struct { func (x *ServicesList) Reset() { *x = ServicesList{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[33] + mi := &file_edge_ctrl_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3028,7 +2870,7 @@ func (x *ServicesList) String() string { func (*ServicesList) ProtoMessage() {} func (x *ServicesList) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[33] + mi := &file_edge_ctrl_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3041,7 +2883,7 @@ func (x *ServicesList) ProtoReflect() protoreflect.Message { // Deprecated: Use ServicesList.ProtoReflect.Descriptor instead. func (*ServicesList) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{33} + return file_edge_ctrl_proto_rawDescGZIP(), []int{31} } func (x *ServicesList) GetLastUpdate() []byte { @@ -3074,7 +2916,7 @@ type TunnelService struct { func (x *TunnelService) Reset() { *x = TunnelService{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[34] + mi := &file_edge_ctrl_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3087,7 +2929,7 @@ func (x *TunnelService) String() string { func (*TunnelService) ProtoMessage() {} func (x *TunnelService) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[34] + mi := &file_edge_ctrl_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3100,7 +2942,7 @@ func (x *TunnelService) ProtoReflect() protoreflect.Message { // Deprecated: Use TunnelService.ProtoReflect.Descriptor instead. func (*TunnelService) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{34} + return file_edge_ctrl_proto_rawDescGZIP(), []int{32} } func (x *TunnelService) GetId() string { @@ -3164,7 +3006,7 @@ type CreateTunnelTerminatorRequest struct { func (x *CreateTunnelTerminatorRequest) Reset() { *x = CreateTunnelTerminatorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[35] + mi := &file_edge_ctrl_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3177,7 +3019,7 @@ func (x *CreateTunnelTerminatorRequest) String() string { func (*CreateTunnelTerminatorRequest) ProtoMessage() {} func (x *CreateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[35] + mi := &file_edge_ctrl_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3190,7 +3032,7 @@ func (x *CreateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnelTerminatorRequest.ProtoReflect.Descriptor instead. func (*CreateTunnelTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{35} + return file_edge_ctrl_proto_rawDescGZIP(), []int{33} } func (x *CreateTunnelTerminatorRequest) GetServiceName() string { @@ -3270,7 +3112,7 @@ type CreateTunnelTerminatorResponse struct { func (x *CreateTunnelTerminatorResponse) Reset() { *x = CreateTunnelTerminatorResponse{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[36] + mi := &file_edge_ctrl_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3283,7 +3125,7 @@ func (x *CreateTunnelTerminatorResponse) String() string { func (*CreateTunnelTerminatorResponse) ProtoMessage() {} func (x *CreateTunnelTerminatorResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[36] + mi := &file_edge_ctrl_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3296,7 +3138,7 @@ func (x *CreateTunnelTerminatorResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnelTerminatorResponse.ProtoReflect.Descriptor instead. func (*CreateTunnelTerminatorResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{36} + return file_edge_ctrl_proto_rawDescGZIP(), []int{34} } func (x *CreateTunnelTerminatorResponse) GetApiSession() *CreateApiSessionResponse { @@ -3342,7 +3184,7 @@ type UpdateTunnelTerminatorRequest struct { func (x *UpdateTunnelTerminatorRequest) Reset() { *x = UpdateTunnelTerminatorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[37] + mi := &file_edge_ctrl_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3355,7 +3197,7 @@ func (x *UpdateTunnelTerminatorRequest) String() string { func (*UpdateTunnelTerminatorRequest) ProtoMessage() {} func (x *UpdateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[37] + mi := &file_edge_ctrl_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3368,7 +3210,7 @@ func (x *UpdateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateTunnelTerminatorRequest.ProtoReflect.Descriptor instead. func (*UpdateTunnelTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{37} + return file_edge_ctrl_proto_rawDescGZIP(), []int{35} } func (x *UpdateTunnelTerminatorRequest) GetTerminatorId() string { @@ -3419,7 +3261,7 @@ type EnrollmentExtendRouterRequest struct { func (x *EnrollmentExtendRouterRequest) Reset() { *x = EnrollmentExtendRouterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[38] + mi := &file_edge_ctrl_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3432,7 +3274,7 @@ func (x *EnrollmentExtendRouterRequest) String() string { func (*EnrollmentExtendRouterRequest) ProtoMessage() {} func (x *EnrollmentExtendRouterRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[38] + mi := &file_edge_ctrl_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3445,7 +3287,7 @@ func (x *EnrollmentExtendRouterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EnrollmentExtendRouterRequest.ProtoReflect.Descriptor instead. func (*EnrollmentExtendRouterRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{38} + return file_edge_ctrl_proto_rawDescGZIP(), []int{36} } func (x *EnrollmentExtendRouterRequest) GetClientCertCsr() string { @@ -3482,7 +3324,7 @@ type EnrollmentCertsResponse struct { func (x *EnrollmentCertsResponse) Reset() { *x = EnrollmentCertsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[39] + mi := &file_edge_ctrl_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3495,7 +3337,7 @@ func (x *EnrollmentCertsResponse) String() string { func (*EnrollmentCertsResponse) ProtoMessage() {} func (x *EnrollmentCertsResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[39] + mi := &file_edge_ctrl_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3508,7 +3350,7 @@ func (x *EnrollmentCertsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EnrollmentCertsResponse.ProtoReflect.Descriptor instead. func (*EnrollmentCertsResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{39} + return file_edge_ctrl_proto_rawDescGZIP(), []int{37} } func (x *EnrollmentCertsResponse) GetClientCertPem() string { @@ -3543,7 +3385,7 @@ type EnrollmentExtendRouterVerifyRequest struct { func (x *EnrollmentExtendRouterVerifyRequest) Reset() { *x = EnrollmentExtendRouterVerifyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[40] + mi := &file_edge_ctrl_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3556,7 +3398,7 @@ func (x *EnrollmentExtendRouterVerifyRequest) String() string { func (*EnrollmentExtendRouterVerifyRequest) ProtoMessage() {} func (x *EnrollmentExtendRouterVerifyRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[40] + mi := &file_edge_ctrl_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3569,7 +3411,7 @@ func (x *EnrollmentExtendRouterVerifyRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use EnrollmentExtendRouterVerifyRequest.ProtoReflect.Descriptor instead. func (*EnrollmentExtendRouterVerifyRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{40} + return file_edge_ctrl_proto_rawDescGZIP(), []int{38} } func (x *EnrollmentExtendRouterVerifyRequest) GetClientCertPem() string { @@ -3579,24 +3421,198 @@ func (x *EnrollmentExtendRouterVerifyRequest) GetClientCertPem() string { return "" } +type DataState_ConfigType struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *DataState_ConfigType) Reset() { + *x = DataState_ConfigType{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_ConfigType) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_ConfigType) ProtoMessage() {} + +func (x *DataState_ConfigType) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataState_ConfigType.ProtoReflect.Descriptor instead. +func (*DataState_ConfigType) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 0} +} + +func (x *DataState_ConfigType) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *DataState_ConfigType) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type DataState_Config struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + TypeId string `protobuf:"bytes,2,opt,name=typeId,proto3" json:"typeId,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + DataJson string `protobuf:"bytes,4,opt,name=dataJson,proto3" json:"dataJson,omitempty"` +} + +func (x *DataState_Config) Reset() { + *x = DataState_Config{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_Config) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_Config) ProtoMessage() {} + +func (x *DataState_Config) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataState_Config.ProtoReflect.Descriptor instead. +func (*DataState_Config) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 1} +} + +func (x *DataState_Config) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *DataState_Config) GetTypeId() string { + if x != nil { + return x.TypeId + } + return "" +} + +func (x *DataState_Config) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DataState_Config) GetDataJson() string { + if x != nil { + return x.DataJson + } + return "" +} + +type DataState_ServiceConfigs struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Configs map[string]string `protobuf:"bytes,1,rep,name=configs,proto3" json:"configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *DataState_ServiceConfigs) Reset() { + *x = DataState_ServiceConfigs{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_ServiceConfigs) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_ServiceConfigs) ProtoMessage() {} + +func (x *DataState_ServiceConfigs) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataState_ServiceConfigs.ProtoReflect.Descriptor instead. +func (*DataState_ServiceConfigs) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 2} +} + +func (x *DataState_ServiceConfigs) GetConfigs() map[string]string { + if x != nil { + return x.Configs + } + return nil +} + type DataState_Identity struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - DefaultHostingPrecedence TerminatorPrecedence `protobuf:"varint,3,opt,name=defaultHostingPrecedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"defaultHostingPrecedence,omitempty"` - DefaultHostingCost uint32 `protobuf:"varint,4,opt,name=defaultHostingCost,proto3" json:"defaultHostingCost,omitempty"` - ServiceHostingPrecedences map[string]TerminatorPrecedence `protobuf:"bytes,5,rep,name=serviceHostingPrecedences,proto3" json:"serviceHostingPrecedences,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence"` - ServiceHostingCosts map[string]uint32 `protobuf:"bytes,6,rep,name=serviceHostingCosts,proto3" json:"serviceHostingCosts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` - AppDataJson []byte `protobuf:"bytes,7,opt,name=appDataJson,proto3" json:"appDataJson,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + DefaultHostingPrecedence TerminatorPrecedence `protobuf:"varint,3,opt,name=defaultHostingPrecedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"defaultHostingPrecedence,omitempty"` + DefaultHostingCost uint32 `protobuf:"varint,4,opt,name=defaultHostingCost,proto3" json:"defaultHostingCost,omitempty"` + ServiceHostingPrecedences map[string]TerminatorPrecedence `protobuf:"bytes,5,rep,name=serviceHostingPrecedences,proto3" json:"serviceHostingPrecedences,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence"` + ServiceHostingCosts map[string]uint32 `protobuf:"bytes,6,rep,name=serviceHostingCosts,proto3" json:"serviceHostingCosts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + AppDataJson []byte `protobuf:"bytes,7,opt,name=appDataJson,proto3" json:"appDataJson,omitempty"` + ServiceConfigs map[string]*DataState_ServiceConfigs `protobuf:"bytes,8,rep,name=serviceConfigs,proto3" json:"serviceConfigs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *DataState_Identity) Reset() { *x = DataState_Identity{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[44] + mi := &file_edge_ctrl_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3609,7 +3625,7 @@ func (x *DataState_Identity) String() string { func (*DataState_Identity) ProtoMessage() {} func (x *DataState_Identity) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[44] + mi := &file_edge_ctrl_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3622,7 +3638,7 @@ func (x *DataState_Identity) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_Identity.ProtoReflect.Descriptor instead. func (*DataState_Identity) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 0} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 3} } func (x *DataState_Identity) GetId() string { @@ -3674,20 +3690,28 @@ func (x *DataState_Identity) GetAppDataJson() []byte { return nil } +func (x *DataState_Identity) GetServiceConfigs() map[string]*DataState_ServiceConfigs { + if x != nil { + return x.ServiceConfigs + } + return nil +} + type DataState_Service struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - EncryptionRequired bool `protobuf:"varint,3,opt,name=encryptionRequired,proto3" json:"encryptionRequired,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + EncryptionRequired bool `protobuf:"varint,3,opt,name=encryptionRequired,proto3" json:"encryptionRequired,omitempty"` + Configs []string `protobuf:"bytes,4,rep,name=configs,proto3" json:"configs,omitempty"` } func (x *DataState_Service) Reset() { *x = DataState_Service{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[45] + mi := &file_edge_ctrl_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3700,7 +3724,7 @@ func (x *DataState_Service) String() string { func (*DataState_Service) ProtoMessage() {} func (x *DataState_Service) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[45] + mi := &file_edge_ctrl_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3713,7 +3737,7 @@ func (x *DataState_Service) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_Service.ProtoReflect.Descriptor instead. func (*DataState_Service) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 1} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 4} } func (x *DataState_Service) GetId() string { @@ -3737,6 +3761,13 @@ func (x *DataState_Service) GetEncryptionRequired() bool { return false } +func (x *DataState_Service) GetConfigs() []string { + if x != nil { + return x.Configs + } + return nil +} + type DataState_ServicePolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3750,7 +3781,7 @@ type DataState_ServicePolicy struct { func (x *DataState_ServicePolicy) Reset() { *x = DataState_ServicePolicy{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[46] + mi := &file_edge_ctrl_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3763,7 +3794,7 @@ func (x *DataState_ServicePolicy) String() string { func (*DataState_ServicePolicy) ProtoMessage() {} func (x *DataState_ServicePolicy) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[46] + mi := &file_edge_ctrl_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3776,7 +3807,7 @@ func (x *DataState_ServicePolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_ServicePolicy.ProtoReflect.Descriptor instead. func (*DataState_ServicePolicy) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 2} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 5} } func (x *DataState_ServicePolicy) GetId() string { @@ -3812,7 +3843,7 @@ type DataState_Revocation struct { func (x *DataState_Revocation) Reset() { *x = DataState_Revocation{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[47] + mi := &file_edge_ctrl_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3825,7 +3856,7 @@ func (x *DataState_Revocation) String() string { func (*DataState_Revocation) ProtoMessage() {} func (x *DataState_Revocation) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[47] + mi := &file_edge_ctrl_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3838,7 +3869,7 @@ func (x *DataState_Revocation) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_Revocation.ProtoReflect.Descriptor instead. func (*DataState_Revocation) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 3} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 6} } func (x *DataState_Revocation) GetId() string { @@ -3869,7 +3900,7 @@ type DataState_ServicePolicyChange struct { func (x *DataState_ServicePolicyChange) Reset() { *x = DataState_ServicePolicyChange{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[48] + mi := &file_edge_ctrl_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3882,7 +3913,7 @@ func (x *DataState_ServicePolicyChange) String() string { func (*DataState_ServicePolicyChange) ProtoMessage() {} func (x *DataState_ServicePolicyChange) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[48] + mi := &file_edge_ctrl_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3895,7 +3926,7 @@ func (x *DataState_ServicePolicyChange) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_ServicePolicyChange.ProtoReflect.Descriptor instead. func (*DataState_ServicePolicyChange) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 4} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 7} } func (x *DataState_ServicePolicyChange) GetPolicyId() string { @@ -3939,7 +3970,7 @@ type DataState_ChangeSet struct { func (x *DataState_ChangeSet) Reset() { *x = DataState_ChangeSet{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[49] + mi := &file_edge_ctrl_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3952,7 +3983,7 @@ func (x *DataState_ChangeSet) String() string { func (*DataState_ChangeSet) ProtoMessage() {} func (x *DataState_ChangeSet) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[49] + mi := &file_edge_ctrl_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3965,7 +3996,7 @@ func (x *DataState_ChangeSet) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_ChangeSet.ProtoReflect.Descriptor instead. func (*DataState_ChangeSet) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 5} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 8} } func (x *DataState_ChangeSet) GetIndex() uint64 { @@ -4006,13 +4037,15 @@ type DataState_Event struct { // *DataState_Event_PublicKey // *DataState_Event_Revocation // *DataState_Event_ServicePolicyChange + // *DataState_Event_ConfigType + // *DataState_Event_Config Model isDataState_Event_Model `protobuf_oneof:"Model"` } func (x *DataState_Event) Reset() { *x = DataState_Event{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[50] + mi := &file_edge_ctrl_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4025,7 +4058,7 @@ func (x *DataState_Event) String() string { func (*DataState_Event) ProtoMessage() {} func (x *DataState_Event) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[50] + mi := &file_edge_ctrl_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4038,7 +4071,7 @@ func (x *DataState_Event) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_Event.ProtoReflect.Descriptor instead. func (*DataState_Event) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 9} } func (x *DataState_Event) GetAction() DataState_Action { @@ -4111,6 +4144,20 @@ func (x *DataState_Event) GetServicePolicyChange() *DataState_ServicePolicyChang return nil } +func (x *DataState_Event) GetConfigType() *DataState_ConfigType { + if x, ok := x.GetModel().(*DataState_Event_ConfigType); ok { + return x.ConfigType + } + return nil +} + +func (x *DataState_Event) GetConfig() *DataState_Config { + if x, ok := x.GetModel().(*DataState_Event_Config); ok { + return x.Config + } + return nil +} + type isDataState_Event_Model interface { isDataState_Event_Model() } @@ -4143,6 +4190,14 @@ type DataState_Event_ServicePolicyChange struct { ServicePolicyChange *DataState_ServicePolicyChange `protobuf:"bytes,16,opt,name=servicePolicyChange,proto3,oneof"` } +type DataState_Event_ConfigType struct { + ConfigType *DataState_ConfigType `protobuf:"bytes,17,opt,name=configType,proto3,oneof"` +} + +type DataState_Event_Config struct { + Config *DataState_Config `protobuf:"bytes,18,opt,name=config,proto3,oneof"` +} + func (*DataState_Event_Identity) isDataState_Event_Model() {} func (*DataState_Event_Service) isDataState_Event_Model() {} @@ -4157,6 +4212,10 @@ func (*DataState_Event_Revocation) isDataState_Event_Model() {} func (*DataState_Event_ServicePolicyChange) isDataState_Event_Model() {} +func (*DataState_Event_ConfigType) isDataState_Event_Model() {} + +func (*DataState_Event_Config) isDataState_Event_Model() {} + type DataState_PublicKey struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4171,7 +4230,7 @@ type DataState_PublicKey struct { func (x *DataState_PublicKey) Reset() { *x = DataState_PublicKey{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[51] + mi := &file_edge_ctrl_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4184,7 +4243,7 @@ func (x *DataState_PublicKey) String() string { func (*DataState_PublicKey) ProtoMessage() {} func (x *DataState_PublicKey) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[51] + mi := &file_edge_ctrl_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4197,7 +4256,7 @@ func (x *DataState_PublicKey) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_PublicKey.ProtoReflect.Descriptor instead. func (*DataState_PublicKey) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 7} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 10} } func (x *DataState_PublicKey) GetData() []byte { @@ -4250,7 +4309,7 @@ type DataState_PostureCheck struct { func (x *DataState_PostureCheck) Reset() { *x = DataState_PostureCheck{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[52] + mi := &file_edge_ctrl_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4263,7 +4322,7 @@ func (x *DataState_PostureCheck) String() string { func (*DataState_PostureCheck) ProtoMessage() {} func (x *DataState_PostureCheck) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[52] + mi := &file_edge_ctrl_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4276,7 +4335,7 @@ func (x *DataState_PostureCheck) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_PostureCheck.ProtoReflect.Descriptor instead. func (*DataState_PostureCheck) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 8} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 11} } func (x *DataState_PostureCheck) GetId() string { @@ -4400,7 +4459,7 @@ type DataState_PostureCheck_Mac struct { func (x *DataState_PostureCheck_Mac) Reset() { *x = DataState_PostureCheck_Mac{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[55] + mi := &file_edge_ctrl_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4413,7 +4472,7 @@ func (x *DataState_PostureCheck_Mac) String() string { func (*DataState_PostureCheck_Mac) ProtoMessage() {} func (x *DataState_PostureCheck_Mac) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[55] + mi := &file_edge_ctrl_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4426,7 +4485,7 @@ func (x *DataState_PostureCheck_Mac) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_PostureCheck_Mac.ProtoReflect.Descriptor instead. func (*DataState_PostureCheck_Mac) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 8, 0} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 11, 0} } func (x *DataState_PostureCheck_Mac) GetMacAddresses() []string { @@ -4450,7 +4509,7 @@ type DataState_PostureCheck_Mfa struct { func (x *DataState_PostureCheck_Mfa) Reset() { *x = DataState_PostureCheck_Mfa{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[56] + mi := &file_edge_ctrl_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4463,7 +4522,7 @@ func (x *DataState_PostureCheck_Mfa) String() string { func (*DataState_PostureCheck_Mfa) ProtoMessage() {} func (x *DataState_PostureCheck_Mfa) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[56] + mi := &file_edge_ctrl_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4476,7 +4535,7 @@ func (x *DataState_PostureCheck_Mfa) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_PostureCheck_Mfa.ProtoReflect.Descriptor instead. func (*DataState_PostureCheck_Mfa) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 8, 1} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 11, 1} } func (x *DataState_PostureCheck_Mfa) GetTimeoutSeconds() int64 { @@ -4519,7 +4578,7 @@ type DataState_PostureCheck_Os struct { func (x *DataState_PostureCheck_Os) Reset() { *x = DataState_PostureCheck_Os{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[57] + mi := &file_edge_ctrl_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4532,7 +4591,7 @@ func (x *DataState_PostureCheck_Os) String() string { func (*DataState_PostureCheck_Os) ProtoMessage() {} func (x *DataState_PostureCheck_Os) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[57] + mi := &file_edge_ctrl_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4545,7 +4604,7 @@ func (x *DataState_PostureCheck_Os) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_PostureCheck_Os.ProtoReflect.Descriptor instead. func (*DataState_PostureCheck_Os) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 8, 2} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 11, 2} } func (x *DataState_PostureCheck_Os) GetOsType() string { @@ -4573,7 +4632,7 @@ type DataState_PostureCheck_OsList struct { func (x *DataState_PostureCheck_OsList) Reset() { *x = DataState_PostureCheck_OsList{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[58] + mi := &file_edge_ctrl_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4586,7 +4645,7 @@ func (x *DataState_PostureCheck_OsList) String() string { func (*DataState_PostureCheck_OsList) ProtoMessage() {} func (x *DataState_PostureCheck_OsList) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[58] + mi := &file_edge_ctrl_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4599,7 +4658,7 @@ func (x *DataState_PostureCheck_OsList) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_PostureCheck_OsList.ProtoReflect.Descriptor instead. func (*DataState_PostureCheck_OsList) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 8, 3} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 11, 3} } func (x *DataState_PostureCheck_OsList) GetOsList() []*DataState_PostureCheck_Os { @@ -4623,7 +4682,7 @@ type DataState_PostureCheck_Process struct { func (x *DataState_PostureCheck_Process) Reset() { *x = DataState_PostureCheck_Process{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[59] + mi := &file_edge_ctrl_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4636,7 +4695,7 @@ func (x *DataState_PostureCheck_Process) String() string { func (*DataState_PostureCheck_Process) ProtoMessage() {} func (x *DataState_PostureCheck_Process) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[59] + mi := &file_edge_ctrl_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4649,7 +4708,7 @@ func (x *DataState_PostureCheck_Process) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_PostureCheck_Process.ProtoReflect.Descriptor instead. func (*DataState_PostureCheck_Process) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 8, 4} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 11, 4} } func (x *DataState_PostureCheck_Process) GetOsType() string { @@ -4692,7 +4751,7 @@ type DataState_PostureCheck_ProcessMulti struct { func (x *DataState_PostureCheck_ProcessMulti) Reset() { *x = DataState_PostureCheck_ProcessMulti{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[60] + mi := &file_edge_ctrl_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4705,7 +4764,7 @@ func (x *DataState_PostureCheck_ProcessMulti) String() string { func (*DataState_PostureCheck_ProcessMulti) ProtoMessage() {} func (x *DataState_PostureCheck_ProcessMulti) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[60] + mi := &file_edge_ctrl_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4718,7 +4777,7 @@ func (x *DataState_PostureCheck_ProcessMulti) ProtoReflect() protoreflect.Messag // Deprecated: Use DataState_PostureCheck_ProcessMulti.ProtoReflect.Descriptor instead. func (*DataState_PostureCheck_ProcessMulti) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 8, 5} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 11, 5} } func (x *DataState_PostureCheck_ProcessMulti) GetSemantic() string { @@ -4746,7 +4805,7 @@ type DataState_PostureCheck_Domains struct { func (x *DataState_PostureCheck_Domains) Reset() { *x = DataState_PostureCheck_Domains{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[61] + mi := &file_edge_ctrl_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4759,7 +4818,7 @@ func (x *DataState_PostureCheck_Domains) String() string { func (*DataState_PostureCheck_Domains) ProtoMessage() {} func (x *DataState_PostureCheck_Domains) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[61] + mi := &file_edge_ctrl_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4772,7 +4831,7 @@ func (x *DataState_PostureCheck_Domains) ProtoReflect() protoreflect.Message { // Deprecated: Use DataState_PostureCheck_Domains.ProtoReflect.Descriptor instead. func (*DataState_PostureCheck_Domains) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 8, 6} + return file_edge_ctrl_proto_rawDescGZIP(), []int{5, 11, 6} } func (x *DataState_PostureCheck_Domains) GetDomains() []string { @@ -4847,857 +4906,878 @@ var file_edge_ctrl_proto_rawDesc = []byte{ 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, - 0x5d, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, - 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x97, - 0x1c, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3a, 0x0a, 0x06, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x1a, 0x9b, 0x05, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x63, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, - 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x82, 0x01, 0x0a, 0x19, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, - 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x19, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, - 0x70, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, - 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x4a, 0x73, 0x6f, 0x6e, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x4a, - 0x73, 0x6f, 0x6e, 0x1a, 0x75, 0x0a, 0x1e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, + 0xc5, 0x21, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3a, 0x0a, + 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x65, 0x6e, 0x64, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x1a, 0x30, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x60, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x1a, 0xa0, 0x01, 0x0a, 0x0e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x52, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x1a, 0x3a, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xee, 0x06, 0x0a, + 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x63, 0x0a, + 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, + 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, + 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, + 0x73, 0x74, 0x12, 0x82, 0x01, 0x0a, 0x19, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x46, 0x0a, 0x18, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, - 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x1a, 0x72, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x7a, 0x69, 0x74, - 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x56, 0x0a, 0x0a, 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x1a, 0xd0, 0x01, - 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, - 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x6c, - 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x73, 0x12, 0x5f, 0x0a, - 0x11, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, - 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, - 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x11, 0x72, 0x65, 0x6c, - 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x64, 0x64, - 0x1a, 0x81, 0x01, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, - 0x74, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x53, 0x79, 0x6e, - 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x12, 0x3c, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x1a, 0x94, 0x05, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, - 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x69, - 0x73, 0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x69, 0x73, 0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x12, 0x43, 0x0a, - 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, - 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, + 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x19, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, + 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x70, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, + 0x44, 0x61, 0x74, 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, + 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x61, 0x0a, 0x0e, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x69, - 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x00, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x4f, 0x0a, 0x0c, 0x70, 0x6f, 0x73, 0x74, - 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, - 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x6f, 0x73, - 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x46, 0x0a, 0x09, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x4b, 0x65, 0x79, 0x48, 0x00, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, - 0x79, 0x12, 0x49, 0x0a, 0x0a, 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, - 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, - 0x52, 0x0a, 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x64, 0x0a, 0x13, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x7a, 0x69, 0x74, 0x69, - 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x13, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x1a, 0xa6, 0x02, 0x0a, 0x09, - 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x69, 0x64, 0x12, - 0x44, 0x0a, 0x06, 0x75, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, - 0x2c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, - 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x2e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x75, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x75, + 0x0a, 0x1e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, + 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x46, 0x0a, 0x18, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6e, 0x0a, + 0x13, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x41, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x2e, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x38, 0x0a, 0x05, - 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4a, 0x57, 0x54, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x58, 0x35, 0x30, 0x39, 0x43, 0x65, 0x72, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x22, 0x2c, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x12, 0x0f, 0x0a, 0x0b, 0x58, 0x35, 0x30, 0x39, 0x43, 0x65, 0x72, 0x74, 0x44, 0x65, 0x72, 0x10, - 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x4b, 0x49, 0x58, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x10, 0x01, 0x1a, 0xa3, 0x09, 0x0a, 0x0c, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x79, 0x70, - 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, - 0x64, 0x12, 0x41, 0x0a, 0x03, 0x6d, 0x61, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, - 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4d, 0x61, 0x63, 0x48, 0x00, 0x52, - 0x03, 0x6d, 0x61, 0x63, 0x12, 0x41, 0x0a, 0x03, 0x6d, 0x66, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, - 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, - 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4d, 0x66, 0x61, - 0x48, 0x00, 0x52, 0x03, 0x6d, 0x66, 0x61, 0x12, 0x4a, 0x0a, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x2e, 0x4f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x73, 0x4c, - 0x69, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x77, 0x0a, + 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x12, + 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x72, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x56, 0x0a, 0x0a, 0x52, 0x65, + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x45, 0x78, 0x70, 0x69, + 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, + 0x41, 0x74, 0x1a, 0xd0, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, + 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, + 0x64, 0x73, 0x12, 0x5f, 0x0a, 0x11, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x11, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x03, 0x61, 0x64, 0x64, 0x1a, 0x81, 0x01, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x53, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x53, + 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x69, 0x73, 0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x12, 0x3c, 0x0a, 0x07, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x7a, + 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x1a, 0x9e, 0x06, 0x0a, 0x05, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, + 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, + 0x69, 0x63, 0x12, 0x43, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, - 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x12, 0x5c, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, + 0x74, 0x65, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52, 0x08, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x48, 0x00, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x12, 0x4d, 0x0a, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, + 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, + 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, + 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x00, 0x52, 0x0d, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x4f, 0x0a, + 0x0c, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, + 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x48, 0x00, + 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x46, + 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, - 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x44, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x1a, - 0x29, 0x0a, 0x03, 0x4d, 0x61, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x63, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, - 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0xaf, 0x01, 0x0a, 0x03, 0x4d, - 0x66, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, - 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, 0x61, 0x6b, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, 0x61, 0x6b, 0x65, 0x12, 0x26, - 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, - 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x34, 0x0a, 0x15, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4c, 0x65, 0x67, - 0x61, 0x63, 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x1a, 0x3c, 0x0a, 0x02, - 0x4f, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x4f, 0x73, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, - 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x4e, 0x0a, 0x06, 0x4f, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x48, 0x00, 0x52, 0x09, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x0a, 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, + 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x64, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, + 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, + 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x48, 0x00, 0x52, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x49, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x54, 0x79, 0x70, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x7a, 0x69, + 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x42, 0x07, 0x0a, 0x05, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x1a, 0xa6, 0x02, 0x0a, 0x09, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x69, 0x64, 0x12, 0x44, + 0x0a, 0x06, 0x75, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2c, + 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, + 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x2e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x75, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, - 0x4f, 0x73, 0x52, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x71, 0x0a, 0x07, 0x50, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x6e, - 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0c, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x1a, 0x7b, 0x0a, - 0x0c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x4f, 0x0a, 0x09, 0x70, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, - 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, - 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x23, 0x0a, 0x07, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x42, - 0x09, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2c, 0x0a, 0x06, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x10, 0x00, - 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x02, 0x22, 0xfd, 0x01, 0x0a, 0x07, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2a, - 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, - 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, - 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x72, - 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, 0x72, 0x6c, 0x73, 0x12, 0x34, - 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, - 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x70, 0x69, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x5e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x10, - 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x74, 0x0a, 0x0f, 0x41, 0x70, 0x69, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, - 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x69, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, - 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, - 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x54, - 0x0a, 0x11, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x69, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3d, 0x0a, 0x11, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, - 0x69, 0x64, 0x73, 0x22, 0x2d, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x22, 0x3a, 0x0a, 0x0e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, - 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x2d, - 0x0a, 0x13, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xcc, 0x02, - 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, - 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x32, - 0x0a, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x74, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x51, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, - 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, - 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, - 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, - 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, - 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe1, 0x02, 0x0a, - 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, - 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, - 0x69, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x52, - 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x36, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, - 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x46, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, - 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, - 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xc3, 0x03, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x6e, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, - 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, - 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, - 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, - 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, - 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe1, 0x03, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x22, - 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, - 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x56, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, - 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, - 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, - 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x3b, 0x0a, - 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x95, 0x01, 0x0a, 0x1a, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, - 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x41, 0x0a, - 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, - 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, - 0x73, 0x67, 0x22, 0xaf, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, - 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xd8, 0x02, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x63, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, - 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, - 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, - 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, - 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0xcc, 0x01, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, - 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, - 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x65, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, - 0x73, 0x73, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, - 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3f, - 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, - 0x9d, 0x01, 0x0a, 0x07, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x61, - 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x12, - 0x0e, 0x0a, 0x02, 0x4f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x73, 0x12, - 0x1c, 0x0a, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, - 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, - 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, - 0xa1, 0x01, 0x0a, 0x07, 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x41, - 0x70, 0x70, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x41, 0x70, 0x70, 0x49, - 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x34, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x65, 0x6e, - 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x64, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x07, 0x73, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x8a, 0x06, - 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x36, - 0x0a, 0x16, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, - 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, - 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x63, 0x0a, 0x18, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, - 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, - 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x2e, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x4a, 0x73, 0x6f, - 0x6e, 0x12, 0x73, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, - 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, + 0x74, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x2e, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x38, 0x0a, 0x05, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4a, 0x57, 0x54, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x58, 0x35, 0x30, 0x39, 0x43, 0x65, 0x72, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x22, 0x2c, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, + 0x0f, 0x0a, 0x0b, 0x58, 0x35, 0x30, 0x39, 0x43, 0x65, 0x72, 0x74, 0x44, 0x65, 0x72, 0x10, 0x00, + 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x4b, 0x49, 0x58, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, + 0x79, 0x10, 0x01, 0x1a, 0xa3, 0x09, 0x0a, 0x0c, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65, + 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, + 0x12, 0x41, 0x0a, 0x03, 0x6d, 0x61, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, - 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x1a, 0x6e, 0x0a, 0x17, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, - 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xae, 0x02, 0x0a, 0x1e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, + 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, + 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4d, 0x61, 0x63, 0x48, 0x00, 0x52, 0x03, + 0x6d, 0x61, 0x63, 0x12, 0x41, 0x0a, 0x03, 0x6d, 0x66, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, + 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, + 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4d, 0x66, 0x61, 0x48, + 0x00, 0x52, 0x03, 0x6d, 0x66, 0x61, 0x12, 0x4a, 0x0a, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x2e, 0x4f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x73, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, + 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x12, 0x5c, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x48, + 0x00, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x12, + 0x4d, 0x0a, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, + 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, + 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x1a, 0x29, + 0x0a, 0x03, 0x4d, 0x61, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x63, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x63, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0xaf, 0x01, 0x0a, 0x03, 0x4d, 0x66, + 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, + 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, 0x61, 0x6b, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, 0x61, 0x6b, 0x65, 0x12, 0x26, 0x0a, + 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x55, + 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x34, 0x0a, 0x15, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4c, + 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4c, 0x65, 0x67, 0x61, + 0x63, 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x1a, 0x3c, 0x0a, 0x02, 0x4f, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x4f, 0x73, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x4f, + 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x4e, 0x0a, 0x06, 0x4f, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, + 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4f, + 0x73, 0x52, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x71, 0x0a, 0x07, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x67, + 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, + 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x1a, 0x7b, 0x0a, 0x0c, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x12, 0x1a, 0x0a, 0x08, + 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x4f, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x69, + 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, + 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x09, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x23, 0x0a, 0x07, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x42, 0x09, + 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2c, 0x0a, 0x06, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x02, 0x22, 0x5e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x63, + 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x74, 0x0a, 0x0f, 0x41, 0x70, 0x69, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, + 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x69, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0b, + 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, + 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x54, 0x0a, + 0x11, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x69, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x3d, 0x0a, 0x11, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, + 0x64, 0x73, 0x22, 0x2d, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x22, 0x3a, 0x0a, 0x0e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, + 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x2d, 0x0a, + 0x13, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x53, 0x79, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xcc, 0x02, 0x0a, + 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, + 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x5b, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, + 0x64, 0x12, 0x51, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, - 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x3b, + 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, + 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, + 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x15, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x90, 0x04, 0x0a, 0x1f, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0a, - 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x61, - 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x07, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, - 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, - 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x5c, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, - 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe1, 0x02, 0x0a, 0x15, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, + 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x52, 0x0a, + 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x46, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x32, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, + 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xc3, 0x03, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, + 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, + 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, + 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x28, + 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, + 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe1, 0x03, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x22, 0x0a, + 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x56, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, - 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x50, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, - 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, - 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8c, 0x02, 0x0a, 0x1c, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x69, 0x72, 0x63, - 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, - 0x0a, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x74, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x59, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, - 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, + 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, + 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, + 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, + 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, + 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x95, 0x01, 0x0a, 0x1a, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x41, 0x0a, 0x06, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x7a, + 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, + 0x67, 0x22, 0xaf, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, + 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0xd8, 0x02, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, + 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, + 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, + 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, + 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, + 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xcc, + 0x01, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, + 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, + 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x65, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, + 0x73, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, + 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3f, 0x0a, + 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x9d, + 0x01, 0x0a, 0x07, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, + 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x12, 0x0e, + 0x0a, 0x02, 0x4f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x73, 0x12, 0x1c, + 0x0a, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0xa1, + 0x01, 0x0a, 0x07, 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, + 0x70, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, + 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x16, 0x0a, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0xa7, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, + 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x65, 0x6e, 0x76, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x07, 0x73, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x8a, 0x06, 0x0a, + 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x36, 0x0a, + 0x16, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x72, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x63, 0x0a, 0x18, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, + 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, + 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2e, + 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x43, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x4a, 0x73, 0x6f, 0x6e, + 0x12, 0x73, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, + 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x7a, + 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x43, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x7a, 0x69, + 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x1a, 0x6e, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xae, 0x02, 0x0a, 0x1e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x14, + 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x74, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, + 0x12, 0x5b, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, + 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf9, 0x02, 0x0a, 0x1d, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x69, 0x72, 0x63, 0x75, - 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x15, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x90, 0x04, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x61, + 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x61, 0x70, + 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, + 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x5a, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x5c, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x4e, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, - 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, - 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, - 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6c, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x22, 0xa1, 0x01, 0x0a, 0x0d, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, - 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0xd5, 0x03, 0x0a, 0x1d, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x5a, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, + 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x50, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, + 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, + 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8c, 0x02, 0x0a, 0x1c, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x69, 0x72, 0x63, 0x75, + 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, + 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x59, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, + 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, + 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf9, 0x02, 0x0a, 0x1d, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, + 0x74, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, + 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x5a, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x4e, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x69, + 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, + 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6c, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x22, 0xa1, 0x01, 0x0a, 0x0d, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x65, + 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0xd5, 0x03, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x5a, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, + 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xf3, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, - 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, - 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, - 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, - 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, - 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xf3, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, - 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x42, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, - 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x63, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, - 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, - 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, - 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, - 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x43, 0x6f, 0x73, 0x74, 0x22, 0x9d, 0x01, 0x0a, 0x1d, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, - 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x12, 0x24, 0x0a, - 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, - 0x43, 0x73, 0x72, 0x12, 0x30, 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x85, 0x01, 0x0a, 0x17, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, - 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, - 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x12, 0x1e, 0x0a, - 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x73, 0x50, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x73, 0x50, 0x65, 0x6d, 0x22, 0x4b, 0x0a, - 0x23, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, - 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x2a, 0xf3, 0x0b, 0x0a, 0x0b, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x65, - 0x72, 0x6f, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, - 0x6c, 0x6c, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x10, 0xa1, - 0x9c, 0x01, 0x12, 0x0f, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, - 0xa2, 0x9c, 0x01, 0x12, 0x18, 0x0a, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0x86, 0x9d, 0x01, 0x12, 0x19, 0x0a, - 0x13, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x65, 0x64, - 0x54, 0x79, 0x70, 0x65, 0x10, 0xe8, 0x9d, 0x01, 0x12, 0x1b, 0x0a, 0x15, 0x41, 0x70, 0x69, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xe9, 0x9d, 0x01, 0x12, 0x1b, 0x0a, 0x15, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0xea, - 0x9d, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xeb, 0x9d, - 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x79, 0x70, 0x65, 0x10, 0xec, 0x9d, 0x01, - 0x12, 0x1e, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xed, 0x9d, 0x01, - 0x12, 0x1f, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xee, 0x9d, - 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x10, 0xef, 0x9d, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x10, 0xf0, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf1, 0x9d, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf2, 0x9d, 0x01, 0x12, - 0x21, 0x0a, 0x1b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf3, - 0x9d, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xf4, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf5, 0x9d, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf6, 0x9d, 0x01, - 0x12, 0x23, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xf8, 0x9d, 0x01, 0x12, 0x24, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf9, 0x9d, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfa, 0x9d, 0x01, 0x12, 0x21, 0x0a, - 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfb, 0x9d, 0x01, - 0x12, 0x26, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, - 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x10, 0xfc, 0x9d, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, - 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfd, 0x9d, - 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x10, - 0xcc, 0x9e, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, - 0x74, 0x43, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xcd, 0x9e, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, - 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xce, 0x9e, 0x01, 0x12, - 0x2d, 0x0a, 0x27, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcf, 0x9e, 0x01, 0x12, 0x21, - 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb0, 0x9f, - 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xb1, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, - 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb2, 0x9f, 0x01, 0x12, - 0x29, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, - 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb3, 0x9f, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x4c, 0x69, - 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb4, 0x9f, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb5, 0x9f, 0x01, - 0x12, 0x27, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb6, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, - 0xb7, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb8, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xb9, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x42, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, + 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xba, 0x9f, 0x01, 0x12, - 0x28, 0x0a, 0x22, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xbb, 0x9f, 0x01, 0x12, 0x1b, 0x0a, 0x15, 0x54, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xbc, 0x9f, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0x94, 0xa0, 0x01, 0x12, 0x1c, 0x0a, 0x16, 0x44, - 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0x95, 0xa0, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x10, 0x96, 0xa0, 0x01, - 0x2a, 0x21, 0x0a, 0x0b, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x08, 0x0a, 0x04, 0x44, 0x69, 0x61, 0x6c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x69, 0x6e, - 0x64, 0x10, 0x01, 0x2a, 0x6e, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, - 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x11, 0x0a, - 0x0c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x10, 0xfe, 0x07, - 0x12, 0x10, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x65, 0x64, 0x10, - 0xff, 0x07, 0x12, 0x14, 0x0a, 0x0f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x10, 0x80, 0x08, 0x12, 0x19, 0x0a, 0x14, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x10, 0x81, 0x08, 0x2a, 0x3f, 0x0a, 0x0a, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x69, 0x61, 0x6c, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x69, 0x6e, 0x64, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x10, 0x02, 0x2a, 0x7a, 0x0a, 0x1e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0x00, 0x12, 0x12, - 0x0a, 0x0e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x61, 0x74, - 0x65, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x10, 0x03, - 0x2a, 0x3d, 0x0a, 0x14, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, - 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x2a, - 0x76, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x49, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, - 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x10, 0x02, 0x12, 0x0e, 0x0a, - 0x0a, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x42, 0x75, 0x73, 0x79, 0x10, 0x03, 0x12, 0x18, 0x0a, - 0x14, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x04, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x7a, - 0x69, 0x74, 0x69, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x62, 0x2f, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, + 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, + 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, + 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, + 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x73, 0x74, 0x22, 0x9d, 0x01, 0x0a, 0x1d, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, + 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x12, 0x24, 0x0a, 0x0d, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x43, + 0x73, 0x72, 0x12, 0x30, 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x13, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x85, 0x01, 0x0a, 0x17, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, + 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, + 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, + 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x73, 0x50, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x73, 0x50, 0x65, 0x6d, 0x22, 0x4b, 0x0a, 0x23, + 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, + 0x74, 0x50, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x2a, 0xf3, 0x0b, 0x0a, 0x0b, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x65, 0x72, + 0x6f, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, + 0x6c, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x10, 0xa1, 0x9c, + 0x01, 0x12, 0x0f, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xa2, + 0x9c, 0x01, 0x12, 0x18, 0x0a, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0x86, 0x9d, 0x01, 0x12, 0x19, 0x0a, 0x13, + 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x65, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xe8, 0x9d, 0x01, 0x12, 0x1b, 0x0a, 0x15, 0x41, 0x70, 0x69, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, + 0x10, 0xe9, 0x9d, 0x01, 0x12, 0x1b, 0x0a, 0x15, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0xea, 0x9d, + 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, + 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xeb, 0x9d, 0x01, + 0x12, 0x1d, 0x0a, 0x17, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x79, 0x70, 0x65, 0x10, 0xec, 0x9d, 0x01, 0x12, + 0x1e, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xed, 0x9d, 0x01, 0x12, + 0x1f, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xee, 0x9d, 0x01, + 0x12, 0x21, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, + 0xef, 0x9d, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xf0, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf1, 0x9d, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf2, 0x9d, 0x01, 0x12, 0x21, + 0x0a, 0x1b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf3, 0x9d, + 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xf4, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x10, 0xf5, 0x9d, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf6, 0x9d, 0x01, 0x12, + 0x23, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x10, 0xf8, 0x9d, 0x01, 0x12, 0x24, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf9, 0x9d, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfa, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfb, 0x9d, 0x01, 0x12, + 0x26, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, + 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xfc, 0x9d, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfd, 0x9d, 0x01, + 0x12, 0x10, 0x0a, 0x0a, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcc, + 0x9e, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, + 0x43, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xcd, 0x9e, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, + 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xce, 0x9e, 0x01, 0x12, 0x2d, + 0x0a, 0x27, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcf, 0x9e, 0x01, 0x12, 0x21, 0x0a, + 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb0, 0x9f, 0x01, + 0x12, 0x22, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x10, 0xb1, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, + 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb2, 0x9f, 0x01, 0x12, 0x29, + 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, + 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb3, 0x9f, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x4c, 0x69, 0x73, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x10, 0xb4, 0x9f, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb5, 0x9f, 0x01, 0x12, + 0x27, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x10, 0xb6, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb7, + 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb8, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xb9, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xba, 0x9f, 0x01, 0x12, 0x28, + 0x0a, 0x22, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x10, 0xbb, 0x9f, 0x01, 0x12, 0x1b, 0x0a, 0x15, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xbc, 0x9f, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0x94, 0xa0, 0x01, 0x12, 0x1c, 0x0a, 0x16, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x10, 0x95, 0xa0, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x10, 0x96, 0xa0, 0x01, 0x2a, + 0x21, 0x0a, 0x0b, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, + 0x0a, 0x04, 0x44, 0x69, 0x61, 0x6c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x69, 0x6e, 0x64, + 0x10, 0x01, 0x2a, 0x6e, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x0a, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0c, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x10, 0xfe, 0x07, 0x12, + 0x10, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x65, 0x64, 0x10, 0xff, + 0x07, 0x12, 0x14, 0x0a, 0x0f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x10, 0x80, 0x08, 0x12, 0x19, 0x0a, 0x14, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x10, + 0x81, 0x08, 0x2a, 0x3f, 0x0a, 0x0a, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x69, 0x61, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x69, 0x6e, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x10, 0x02, 0x2a, 0x7a, 0x0a, 0x1e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0x00, 0x12, 0x12, 0x0a, + 0x0e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x10, + 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, + 0x64, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x10, 0x03, 0x2a, + 0x3d, 0x0a, 0x14, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, + 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x2a, 0x76, + 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, + 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x46, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x42, 0x75, 0x73, 0x79, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x04, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x7a, 0x69, + 0x74, 0x69, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x62, 0x2f, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -5713,7 +5793,7 @@ func file_edge_ctrl_proto_rawDescGZIP() []byte { } var file_edge_ctrl_proto_enumTypes = make([]protoimpl.EnumInfo, 10) -var file_edge_ctrl_proto_msgTypes = make([]protoimpl.MessageInfo, 76) +var file_edge_ctrl_proto_msgTypes = make([]protoimpl.MessageInfo, 79) var file_edge_ctrl_proto_goTypes = []interface{}{ (ContentType)(0), // 0: ziti.edge_ctrl.pb.ContentType (SessionType)(0), // 1: ziti.edge_ctrl.pb.SessionType @@ -5730,151 +5810,157 @@ var file_edge_ctrl_proto_goTypes = []interface{}{ (*Listener)(nil), // 12: ziti.edge_ctrl.pb.Listener (*ClientHello)(nil), // 13: ziti.edge_ctrl.pb.ClientHello (*Error)(nil), // 14: ziti.edge_ctrl.pb.Error - (*Service)(nil), // 15: ziti.edge_ctrl.pb.Service - (*DataState)(nil), // 16: ziti.edge_ctrl.pb.DataState - (*Session)(nil), // 17: ziti.edge_ctrl.pb.Session - (*ApiSession)(nil), // 18: ziti.edge_ctrl.pb.ApiSession - (*ApiSessionAdded)(nil), // 19: ziti.edge_ctrl.pb.ApiSessionAdded - (*ApiSessionUpdated)(nil), // 20: ziti.edge_ctrl.pb.ApiSessionUpdated - (*ApiSessionRemoved)(nil), // 21: ziti.edge_ctrl.pb.ApiSessionRemoved - (*ApiSessionHeartbeat)(nil), // 22: ziti.edge_ctrl.pb.ApiSessionHeartbeat - (*SessionRemoved)(nil), // 23: ziti.edge_ctrl.pb.SessionRemoved - (*RequestClientReSync)(nil), // 24: ziti.edge_ctrl.pb.RequestClientReSync - (*CreateCircuitRequest)(nil), // 25: ziti.edge_ctrl.pb.CreateCircuitRequest - (*CreateCircuitResponse)(nil), // 26: ziti.edge_ctrl.pb.CreateCircuitResponse - (*CreateTerminatorRequest)(nil), // 27: ziti.edge_ctrl.pb.CreateTerminatorRequest - (*CreateTerminatorV2Request)(nil), // 28: ziti.edge_ctrl.pb.CreateTerminatorV2Request - (*CreateTerminatorV2Response)(nil), // 29: ziti.edge_ctrl.pb.CreateTerminatorV2Response - (*RemoveTerminatorRequest)(nil), // 30: ziti.edge_ctrl.pb.RemoveTerminatorRequest - (*UpdateTerminatorRequest)(nil), // 31: ziti.edge_ctrl.pb.UpdateTerminatorRequest - (*HealthEventRequest)(nil), // 32: ziti.edge_ctrl.pb.HealthEventRequest - (*ValidateSessionsRequest)(nil), // 33: ziti.edge_ctrl.pb.ValidateSessionsRequest - (*EnvInfo)(nil), // 34: ziti.edge_ctrl.pb.EnvInfo - (*SdkInfo)(nil), // 35: ziti.edge_ctrl.pb.SdkInfo - (*CreateApiSessionRequest)(nil), // 36: ziti.edge_ctrl.pb.CreateApiSessionRequest - (*CreateApiSessionResponse)(nil), // 37: ziti.edge_ctrl.pb.CreateApiSessionResponse - (*CreateCircuitForServiceRequest)(nil), // 38: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest - (*CreateSessionResponse)(nil), // 39: ziti.edge_ctrl.pb.CreateSessionResponse - (*CreateCircuitForServiceResponse)(nil), // 40: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse - (*CreateTunnelCircuitV2Request)(nil), // 41: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Request - (*CreateTunnelCircuitV2Response)(nil), // 42: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Response - (*ServicesList)(nil), // 43: ziti.edge_ctrl.pb.ServicesList - (*TunnelService)(nil), // 44: ziti.edge_ctrl.pb.TunnelService - (*CreateTunnelTerminatorRequest)(nil), // 45: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest - (*CreateTunnelTerminatorResponse)(nil), // 46: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse - (*UpdateTunnelTerminatorRequest)(nil), // 47: ziti.edge_ctrl.pb.UpdateTunnelTerminatorRequest - (*EnrollmentExtendRouterRequest)(nil), // 48: ziti.edge_ctrl.pb.EnrollmentExtendRouterRequest - (*EnrollmentCertsResponse)(nil), // 49: ziti.edge_ctrl.pb.EnrollmentCertsResponse - (*EnrollmentExtendRouterVerifyRequest)(nil), // 50: ziti.edge_ctrl.pb.EnrollmentExtendRouterVerifyRequest - nil, // 51: ziti.edge_ctrl.pb.ServerHello.DataEntry - nil, // 52: ziti.edge_ctrl.pb.ServerHello.ByteDataEntry - nil, // 53: ziti.edge_ctrl.pb.ClientHello.DataEntry - (*DataState_Identity)(nil), // 54: ziti.edge_ctrl.pb.DataState.Identity - (*DataState_Service)(nil), // 55: ziti.edge_ctrl.pb.DataState.Service - (*DataState_ServicePolicy)(nil), // 56: ziti.edge_ctrl.pb.DataState.ServicePolicy - (*DataState_Revocation)(nil), // 57: ziti.edge_ctrl.pb.DataState.Revocation - (*DataState_ServicePolicyChange)(nil), // 58: ziti.edge_ctrl.pb.DataState.ServicePolicyChange - (*DataState_ChangeSet)(nil), // 59: ziti.edge_ctrl.pb.DataState.ChangeSet - (*DataState_Event)(nil), // 60: ziti.edge_ctrl.pb.DataState.Event - (*DataState_PublicKey)(nil), // 61: ziti.edge_ctrl.pb.DataState.PublicKey - (*DataState_PostureCheck)(nil), // 62: ziti.edge_ctrl.pb.DataState.PostureCheck - nil, // 63: ziti.edge_ctrl.pb.DataState.Identity.ServiceHostingPrecedencesEntry - nil, // 64: ziti.edge_ctrl.pb.DataState.Identity.ServiceHostingCostsEntry - (*DataState_PostureCheck_Mac)(nil), // 65: ziti.edge_ctrl.pb.DataState.PostureCheck.Mac - (*DataState_PostureCheck_Mfa)(nil), // 66: ziti.edge_ctrl.pb.DataState.PostureCheck.Mfa - (*DataState_PostureCheck_Os)(nil), // 67: ziti.edge_ctrl.pb.DataState.PostureCheck.Os - (*DataState_PostureCheck_OsList)(nil), // 68: ziti.edge_ctrl.pb.DataState.PostureCheck.OsList - (*DataState_PostureCheck_Process)(nil), // 69: ziti.edge_ctrl.pb.DataState.PostureCheck.Process - (*DataState_PostureCheck_ProcessMulti)(nil), // 70: ziti.edge_ctrl.pb.DataState.PostureCheck.ProcessMulti - (*DataState_PostureCheck_Domains)(nil), // 71: ziti.edge_ctrl.pb.DataState.PostureCheck.Domains - nil, // 72: ziti.edge_ctrl.pb.CreateCircuitRequest.PeerDataEntry - nil, // 73: ziti.edge_ctrl.pb.CreateCircuitResponse.PeerDataEntry - nil, // 74: ziti.edge_ctrl.pb.CreateCircuitResponse.TagsEntry - nil, // 75: ziti.edge_ctrl.pb.CreateTerminatorRequest.PeerDataEntry - nil, // 76: ziti.edge_ctrl.pb.CreateTerminatorV2Request.PeerDataEntry - nil, // 77: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry - nil, // 78: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServiceCostsEntry - nil, // 79: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.PeerDataEntry - nil, // 80: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.PeerDataEntry - nil, // 81: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.TagsEntry - nil, // 82: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Request.PeerDataEntry - nil, // 83: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Response.PeerDataEntry - nil, // 84: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Response.TagsEntry - nil, // 85: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.PeerDataEntry - (*timestamppb.Timestamp)(nil), // 86: google.protobuf.Timestamp + (*DataState)(nil), // 15: ziti.edge_ctrl.pb.DataState + (*ApiSession)(nil), // 16: ziti.edge_ctrl.pb.ApiSession + (*ApiSessionAdded)(nil), // 17: ziti.edge_ctrl.pb.ApiSessionAdded + (*ApiSessionUpdated)(nil), // 18: ziti.edge_ctrl.pb.ApiSessionUpdated + (*ApiSessionRemoved)(nil), // 19: ziti.edge_ctrl.pb.ApiSessionRemoved + (*ApiSessionHeartbeat)(nil), // 20: ziti.edge_ctrl.pb.ApiSessionHeartbeat + (*SessionRemoved)(nil), // 21: ziti.edge_ctrl.pb.SessionRemoved + (*RequestClientReSync)(nil), // 22: ziti.edge_ctrl.pb.RequestClientReSync + (*CreateCircuitRequest)(nil), // 23: ziti.edge_ctrl.pb.CreateCircuitRequest + (*CreateCircuitResponse)(nil), // 24: ziti.edge_ctrl.pb.CreateCircuitResponse + (*CreateTerminatorRequest)(nil), // 25: ziti.edge_ctrl.pb.CreateTerminatorRequest + (*CreateTerminatorV2Request)(nil), // 26: ziti.edge_ctrl.pb.CreateTerminatorV2Request + (*CreateTerminatorV2Response)(nil), // 27: ziti.edge_ctrl.pb.CreateTerminatorV2Response + (*RemoveTerminatorRequest)(nil), // 28: ziti.edge_ctrl.pb.RemoveTerminatorRequest + (*UpdateTerminatorRequest)(nil), // 29: ziti.edge_ctrl.pb.UpdateTerminatorRequest + (*HealthEventRequest)(nil), // 30: ziti.edge_ctrl.pb.HealthEventRequest + (*ValidateSessionsRequest)(nil), // 31: ziti.edge_ctrl.pb.ValidateSessionsRequest + (*EnvInfo)(nil), // 32: ziti.edge_ctrl.pb.EnvInfo + (*SdkInfo)(nil), // 33: ziti.edge_ctrl.pb.SdkInfo + (*CreateApiSessionRequest)(nil), // 34: ziti.edge_ctrl.pb.CreateApiSessionRequest + (*CreateApiSessionResponse)(nil), // 35: ziti.edge_ctrl.pb.CreateApiSessionResponse + (*CreateCircuitForServiceRequest)(nil), // 36: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest + (*CreateSessionResponse)(nil), // 37: ziti.edge_ctrl.pb.CreateSessionResponse + (*CreateCircuitForServiceResponse)(nil), // 38: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse + (*CreateTunnelCircuitV2Request)(nil), // 39: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Request + (*CreateTunnelCircuitV2Response)(nil), // 40: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Response + (*ServicesList)(nil), // 41: ziti.edge_ctrl.pb.ServicesList + (*TunnelService)(nil), // 42: ziti.edge_ctrl.pb.TunnelService + (*CreateTunnelTerminatorRequest)(nil), // 43: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest + (*CreateTunnelTerminatorResponse)(nil), // 44: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse + (*UpdateTunnelTerminatorRequest)(nil), // 45: ziti.edge_ctrl.pb.UpdateTunnelTerminatorRequest + (*EnrollmentExtendRouterRequest)(nil), // 46: ziti.edge_ctrl.pb.EnrollmentExtendRouterRequest + (*EnrollmentCertsResponse)(nil), // 47: ziti.edge_ctrl.pb.EnrollmentCertsResponse + (*EnrollmentExtendRouterVerifyRequest)(nil), // 48: ziti.edge_ctrl.pb.EnrollmentExtendRouterVerifyRequest + nil, // 49: ziti.edge_ctrl.pb.ServerHello.DataEntry + nil, // 50: ziti.edge_ctrl.pb.ServerHello.ByteDataEntry + nil, // 51: ziti.edge_ctrl.pb.ClientHello.DataEntry + (*DataState_ConfigType)(nil), // 52: ziti.edge_ctrl.pb.DataState.ConfigType + (*DataState_Config)(nil), // 53: ziti.edge_ctrl.pb.DataState.Config + (*DataState_ServiceConfigs)(nil), // 54: ziti.edge_ctrl.pb.DataState.ServiceConfigs + (*DataState_Identity)(nil), // 55: ziti.edge_ctrl.pb.DataState.Identity + (*DataState_Service)(nil), // 56: ziti.edge_ctrl.pb.DataState.Service + (*DataState_ServicePolicy)(nil), // 57: ziti.edge_ctrl.pb.DataState.ServicePolicy + (*DataState_Revocation)(nil), // 58: ziti.edge_ctrl.pb.DataState.Revocation + (*DataState_ServicePolicyChange)(nil), // 59: ziti.edge_ctrl.pb.DataState.ServicePolicyChange + (*DataState_ChangeSet)(nil), // 60: ziti.edge_ctrl.pb.DataState.ChangeSet + (*DataState_Event)(nil), // 61: ziti.edge_ctrl.pb.DataState.Event + (*DataState_PublicKey)(nil), // 62: ziti.edge_ctrl.pb.DataState.PublicKey + (*DataState_PostureCheck)(nil), // 63: ziti.edge_ctrl.pb.DataState.PostureCheck + nil, // 64: ziti.edge_ctrl.pb.DataState.ServiceConfigs.ConfigsEntry + nil, // 65: ziti.edge_ctrl.pb.DataState.Identity.ServiceHostingPrecedencesEntry + nil, // 66: ziti.edge_ctrl.pb.DataState.Identity.ServiceHostingCostsEntry + nil, // 67: ziti.edge_ctrl.pb.DataState.Identity.ServiceConfigsEntry + (*DataState_PostureCheck_Mac)(nil), // 68: ziti.edge_ctrl.pb.DataState.PostureCheck.Mac + (*DataState_PostureCheck_Mfa)(nil), // 69: ziti.edge_ctrl.pb.DataState.PostureCheck.Mfa + (*DataState_PostureCheck_Os)(nil), // 70: ziti.edge_ctrl.pb.DataState.PostureCheck.Os + (*DataState_PostureCheck_OsList)(nil), // 71: ziti.edge_ctrl.pb.DataState.PostureCheck.OsList + (*DataState_PostureCheck_Process)(nil), // 72: ziti.edge_ctrl.pb.DataState.PostureCheck.Process + (*DataState_PostureCheck_ProcessMulti)(nil), // 73: ziti.edge_ctrl.pb.DataState.PostureCheck.ProcessMulti + (*DataState_PostureCheck_Domains)(nil), // 74: ziti.edge_ctrl.pb.DataState.PostureCheck.Domains + nil, // 75: ziti.edge_ctrl.pb.CreateCircuitRequest.PeerDataEntry + nil, // 76: ziti.edge_ctrl.pb.CreateCircuitResponse.PeerDataEntry + nil, // 77: ziti.edge_ctrl.pb.CreateCircuitResponse.TagsEntry + nil, // 78: ziti.edge_ctrl.pb.CreateTerminatorRequest.PeerDataEntry + nil, // 79: ziti.edge_ctrl.pb.CreateTerminatorV2Request.PeerDataEntry + nil, // 80: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry + nil, // 81: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServiceCostsEntry + nil, // 82: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.PeerDataEntry + nil, // 83: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.PeerDataEntry + nil, // 84: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.TagsEntry + nil, // 85: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Request.PeerDataEntry + nil, // 86: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Response.PeerDataEntry + nil, // 87: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Response.TagsEntry + nil, // 88: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.PeerDataEntry + (*timestamppb.Timestamp)(nil), // 89: google.protobuf.Timestamp } var file_edge_ctrl_proto_depIdxs = []int32{ - 51, // 0: ziti.edge_ctrl.pb.ServerHello.data:type_name -> ziti.edge_ctrl.pb.ServerHello.DataEntry - 52, // 1: ziti.edge_ctrl.pb.ServerHello.byteData:type_name -> ziti.edge_ctrl.pb.ServerHello.ByteDataEntry + 49, // 0: ziti.edge_ctrl.pb.ServerHello.data:type_name -> ziti.edge_ctrl.pb.ServerHello.DataEntry + 50, // 1: ziti.edge_ctrl.pb.ServerHello.byteData:type_name -> ziti.edge_ctrl.pb.ServerHello.ByteDataEntry 11, // 2: ziti.edge_ctrl.pb.Listener.address:type_name -> ziti.edge_ctrl.pb.Address 11, // 3: ziti.edge_ctrl.pb.Listener.advertise:type_name -> ziti.edge_ctrl.pb.Address - 53, // 4: ziti.edge_ctrl.pb.ClientHello.data:type_name -> ziti.edge_ctrl.pb.ClientHello.DataEntry + 51, // 4: ziti.edge_ctrl.pb.ClientHello.data:type_name -> ziti.edge_ctrl.pb.ClientHello.DataEntry 12, // 5: ziti.edge_ctrl.pb.ClientHello.listeners:type_name -> ziti.edge_ctrl.pb.Listener - 60, // 6: ziti.edge_ctrl.pb.DataState.events:type_name -> ziti.edge_ctrl.pb.DataState.Event - 1, // 7: ziti.edge_ctrl.pb.Session.type:type_name -> ziti.edge_ctrl.pb.SessionType - 15, // 8: ziti.edge_ctrl.pb.Session.service:type_name -> ziti.edge_ctrl.pb.Service - 18, // 9: ziti.edge_ctrl.pb.ApiSessionAdded.apiSessions:type_name -> ziti.edge_ctrl.pb.ApiSession - 18, // 10: ziti.edge_ctrl.pb.ApiSessionUpdated.apiSessions:type_name -> ziti.edge_ctrl.pb.ApiSession - 72, // 11: ziti.edge_ctrl.pb.CreateCircuitRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitRequest.PeerDataEntry - 73, // 12: ziti.edge_ctrl.pb.CreateCircuitResponse.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitResponse.PeerDataEntry - 74, // 13: ziti.edge_ctrl.pb.CreateCircuitResponse.tags:type_name -> ziti.edge_ctrl.pb.CreateCircuitResponse.TagsEntry - 75, // 14: ziti.edge_ctrl.pb.CreateTerminatorRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateTerminatorRequest.PeerDataEntry - 5, // 15: ziti.edge_ctrl.pb.CreateTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 76, // 16: ziti.edge_ctrl.pb.CreateTerminatorV2Request.peerData:type_name -> ziti.edge_ctrl.pb.CreateTerminatorV2Request.PeerDataEntry - 5, // 17: ziti.edge_ctrl.pb.CreateTerminatorV2Request.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 6, // 18: ziti.edge_ctrl.pb.CreateTerminatorV2Response.result:type_name -> ziti.edge_ctrl.pb.CreateTerminatorResult - 5, // 19: ziti.edge_ctrl.pb.UpdateTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 34, // 20: ziti.edge_ctrl.pb.CreateApiSessionRequest.envInfo:type_name -> ziti.edge_ctrl.pb.EnvInfo - 35, // 21: ziti.edge_ctrl.pb.CreateApiSessionRequest.sdkInfo:type_name -> ziti.edge_ctrl.pb.SdkInfo - 5, // 22: ziti.edge_ctrl.pb.CreateApiSessionResponse.defaultHostingPrecedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 77, // 23: ziti.edge_ctrl.pb.CreateApiSessionResponse.servicePrecedences:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry - 78, // 24: ziti.edge_ctrl.pb.CreateApiSessionResponse.serviceCosts:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse.ServiceCostsEntry - 79, // 25: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.PeerDataEntry - 37, // 26: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.apiSession:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse - 39, // 27: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.session:type_name -> ziti.edge_ctrl.pb.CreateSessionResponse - 80, // 28: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.PeerDataEntry - 81, // 29: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.tags:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.TagsEntry - 82, // 30: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Request.peerData:type_name -> ziti.edge_ctrl.pb.CreateTunnelCircuitV2Request.PeerDataEntry - 83, // 31: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Response.peerData:type_name -> ziti.edge_ctrl.pb.CreateTunnelCircuitV2Response.PeerDataEntry - 84, // 32: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Response.tags:type_name -> ziti.edge_ctrl.pb.CreateTunnelCircuitV2Response.TagsEntry - 44, // 33: ziti.edge_ctrl.pb.ServicesList.services:type_name -> ziti.edge_ctrl.pb.TunnelService - 85, // 34: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.PeerDataEntry - 5, // 35: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 37, // 36: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse.apiSession:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse - 39, // 37: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse.session:type_name -> ziti.edge_ctrl.pb.CreateSessionResponse - 5, // 38: ziti.edge_ctrl.pb.UpdateTunnelTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 5, // 39: ziti.edge_ctrl.pb.DataState.Identity.defaultHostingPrecedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 63, // 40: ziti.edge_ctrl.pb.DataState.Identity.serviceHostingPrecedences:type_name -> ziti.edge_ctrl.pb.DataState.Identity.ServiceHostingPrecedencesEntry - 64, // 41: ziti.edge_ctrl.pb.DataState.Identity.serviceHostingCosts:type_name -> ziti.edge_ctrl.pb.DataState.Identity.ServiceHostingCostsEntry + 61, // 6: ziti.edge_ctrl.pb.DataState.events:type_name -> ziti.edge_ctrl.pb.DataState.Event + 16, // 7: ziti.edge_ctrl.pb.ApiSessionAdded.apiSessions:type_name -> ziti.edge_ctrl.pb.ApiSession + 16, // 8: ziti.edge_ctrl.pb.ApiSessionUpdated.apiSessions:type_name -> ziti.edge_ctrl.pb.ApiSession + 75, // 9: ziti.edge_ctrl.pb.CreateCircuitRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitRequest.PeerDataEntry + 76, // 10: ziti.edge_ctrl.pb.CreateCircuitResponse.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitResponse.PeerDataEntry + 77, // 11: ziti.edge_ctrl.pb.CreateCircuitResponse.tags:type_name -> ziti.edge_ctrl.pb.CreateCircuitResponse.TagsEntry + 78, // 12: ziti.edge_ctrl.pb.CreateTerminatorRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateTerminatorRequest.PeerDataEntry + 5, // 13: ziti.edge_ctrl.pb.CreateTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 79, // 14: ziti.edge_ctrl.pb.CreateTerminatorV2Request.peerData:type_name -> ziti.edge_ctrl.pb.CreateTerminatorV2Request.PeerDataEntry + 5, // 15: ziti.edge_ctrl.pb.CreateTerminatorV2Request.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 6, // 16: ziti.edge_ctrl.pb.CreateTerminatorV2Response.result:type_name -> ziti.edge_ctrl.pb.CreateTerminatorResult + 5, // 17: ziti.edge_ctrl.pb.UpdateTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 32, // 18: ziti.edge_ctrl.pb.CreateApiSessionRequest.envInfo:type_name -> ziti.edge_ctrl.pb.EnvInfo + 33, // 19: ziti.edge_ctrl.pb.CreateApiSessionRequest.sdkInfo:type_name -> ziti.edge_ctrl.pb.SdkInfo + 5, // 20: ziti.edge_ctrl.pb.CreateApiSessionResponse.defaultHostingPrecedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 80, // 21: ziti.edge_ctrl.pb.CreateApiSessionResponse.servicePrecedences:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry + 81, // 22: ziti.edge_ctrl.pb.CreateApiSessionResponse.serviceCosts:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse.ServiceCostsEntry + 82, // 23: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.PeerDataEntry + 35, // 24: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.apiSession:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse + 37, // 25: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.session:type_name -> ziti.edge_ctrl.pb.CreateSessionResponse + 83, // 26: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.PeerDataEntry + 84, // 27: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.tags:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.TagsEntry + 85, // 28: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Request.peerData:type_name -> ziti.edge_ctrl.pb.CreateTunnelCircuitV2Request.PeerDataEntry + 86, // 29: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Response.peerData:type_name -> ziti.edge_ctrl.pb.CreateTunnelCircuitV2Response.PeerDataEntry + 87, // 30: ziti.edge_ctrl.pb.CreateTunnelCircuitV2Response.tags:type_name -> ziti.edge_ctrl.pb.CreateTunnelCircuitV2Response.TagsEntry + 42, // 31: ziti.edge_ctrl.pb.ServicesList.services:type_name -> ziti.edge_ctrl.pb.TunnelService + 88, // 32: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.PeerDataEntry + 5, // 33: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 35, // 34: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse.apiSession:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse + 37, // 35: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse.session:type_name -> ziti.edge_ctrl.pb.CreateSessionResponse + 5, // 36: ziti.edge_ctrl.pb.UpdateTunnelTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 64, // 37: ziti.edge_ctrl.pb.DataState.ServiceConfigs.configs:type_name -> ziti.edge_ctrl.pb.DataState.ServiceConfigs.ConfigsEntry + 5, // 38: ziti.edge_ctrl.pb.DataState.Identity.defaultHostingPrecedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 65, // 39: ziti.edge_ctrl.pb.DataState.Identity.serviceHostingPrecedences:type_name -> ziti.edge_ctrl.pb.DataState.Identity.ServiceHostingPrecedencesEntry + 66, // 40: ziti.edge_ctrl.pb.DataState.Identity.serviceHostingCosts:type_name -> ziti.edge_ctrl.pb.DataState.Identity.ServiceHostingCostsEntry + 67, // 41: ziti.edge_ctrl.pb.DataState.Identity.serviceConfigs:type_name -> ziti.edge_ctrl.pb.DataState.Identity.ServiceConfigsEntry 3, // 42: ziti.edge_ctrl.pb.DataState.ServicePolicy.policyType:type_name -> ziti.edge_ctrl.pb.PolicyType - 86, // 43: ziti.edge_ctrl.pb.DataState.Revocation.ExpiresAt:type_name -> google.protobuf.Timestamp + 89, // 43: ziti.edge_ctrl.pb.DataState.Revocation.ExpiresAt:type_name -> google.protobuf.Timestamp 4, // 44: ziti.edge_ctrl.pb.DataState.ServicePolicyChange.relatedEntityType:type_name -> ziti.edge_ctrl.pb.ServicePolicyRelatedEntityType - 60, // 45: ziti.edge_ctrl.pb.DataState.ChangeSet.changes:type_name -> ziti.edge_ctrl.pb.DataState.Event + 61, // 45: ziti.edge_ctrl.pb.DataState.ChangeSet.changes:type_name -> ziti.edge_ctrl.pb.DataState.Event 7, // 46: ziti.edge_ctrl.pb.DataState.Event.action:type_name -> ziti.edge_ctrl.pb.DataState.Action - 54, // 47: ziti.edge_ctrl.pb.DataState.Event.identity:type_name -> ziti.edge_ctrl.pb.DataState.Identity - 55, // 48: ziti.edge_ctrl.pb.DataState.Event.service:type_name -> ziti.edge_ctrl.pb.DataState.Service - 56, // 49: ziti.edge_ctrl.pb.DataState.Event.servicePolicy:type_name -> ziti.edge_ctrl.pb.DataState.ServicePolicy - 62, // 50: ziti.edge_ctrl.pb.DataState.Event.postureCheck:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck - 61, // 51: ziti.edge_ctrl.pb.DataState.Event.publicKey:type_name -> ziti.edge_ctrl.pb.DataState.PublicKey - 57, // 52: ziti.edge_ctrl.pb.DataState.Event.revocation:type_name -> ziti.edge_ctrl.pb.DataState.Revocation - 58, // 53: ziti.edge_ctrl.pb.DataState.Event.servicePolicyChange:type_name -> ziti.edge_ctrl.pb.DataState.ServicePolicyChange - 8, // 54: ziti.edge_ctrl.pb.DataState.PublicKey.usages:type_name -> ziti.edge_ctrl.pb.DataState.PublicKey.Usage - 9, // 55: ziti.edge_ctrl.pb.DataState.PublicKey.format:type_name -> ziti.edge_ctrl.pb.DataState.PublicKey.Format - 65, // 56: ziti.edge_ctrl.pb.DataState.PostureCheck.mac:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Mac - 66, // 57: ziti.edge_ctrl.pb.DataState.PostureCheck.mfa:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Mfa - 68, // 58: ziti.edge_ctrl.pb.DataState.PostureCheck.osList:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.OsList - 69, // 59: ziti.edge_ctrl.pb.DataState.PostureCheck.process:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Process - 70, // 60: ziti.edge_ctrl.pb.DataState.PostureCheck.processMulti:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.ProcessMulti - 71, // 61: ziti.edge_ctrl.pb.DataState.PostureCheck.domains:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Domains - 5, // 62: ziti.edge_ctrl.pb.DataState.Identity.ServiceHostingPrecedencesEntry.value:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 67, // 63: ziti.edge_ctrl.pb.DataState.PostureCheck.OsList.osList:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Os - 69, // 64: ziti.edge_ctrl.pb.DataState.PostureCheck.ProcessMulti.processes:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Process - 5, // 65: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry.value:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 66, // [66:66] is the sub-list for method output_type - 66, // [66:66] is the sub-list for method input_type - 66, // [66:66] is the sub-list for extension type_name - 66, // [66:66] is the sub-list for extension extendee - 0, // [0:66] is the sub-list for field type_name + 55, // 47: ziti.edge_ctrl.pb.DataState.Event.identity:type_name -> ziti.edge_ctrl.pb.DataState.Identity + 56, // 48: ziti.edge_ctrl.pb.DataState.Event.service:type_name -> ziti.edge_ctrl.pb.DataState.Service + 57, // 49: ziti.edge_ctrl.pb.DataState.Event.servicePolicy:type_name -> ziti.edge_ctrl.pb.DataState.ServicePolicy + 63, // 50: ziti.edge_ctrl.pb.DataState.Event.postureCheck:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck + 62, // 51: ziti.edge_ctrl.pb.DataState.Event.publicKey:type_name -> ziti.edge_ctrl.pb.DataState.PublicKey + 58, // 52: ziti.edge_ctrl.pb.DataState.Event.revocation:type_name -> ziti.edge_ctrl.pb.DataState.Revocation + 59, // 53: ziti.edge_ctrl.pb.DataState.Event.servicePolicyChange:type_name -> ziti.edge_ctrl.pb.DataState.ServicePolicyChange + 52, // 54: ziti.edge_ctrl.pb.DataState.Event.configType:type_name -> ziti.edge_ctrl.pb.DataState.ConfigType + 53, // 55: ziti.edge_ctrl.pb.DataState.Event.config:type_name -> ziti.edge_ctrl.pb.DataState.Config + 8, // 56: ziti.edge_ctrl.pb.DataState.PublicKey.usages:type_name -> ziti.edge_ctrl.pb.DataState.PublicKey.Usage + 9, // 57: ziti.edge_ctrl.pb.DataState.PublicKey.format:type_name -> ziti.edge_ctrl.pb.DataState.PublicKey.Format + 68, // 58: ziti.edge_ctrl.pb.DataState.PostureCheck.mac:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Mac + 69, // 59: ziti.edge_ctrl.pb.DataState.PostureCheck.mfa:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Mfa + 71, // 60: ziti.edge_ctrl.pb.DataState.PostureCheck.osList:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.OsList + 72, // 61: ziti.edge_ctrl.pb.DataState.PostureCheck.process:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Process + 73, // 62: ziti.edge_ctrl.pb.DataState.PostureCheck.processMulti:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.ProcessMulti + 74, // 63: ziti.edge_ctrl.pb.DataState.PostureCheck.domains:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Domains + 5, // 64: ziti.edge_ctrl.pb.DataState.Identity.ServiceHostingPrecedencesEntry.value:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 54, // 65: ziti.edge_ctrl.pb.DataState.Identity.ServiceConfigsEntry.value:type_name -> ziti.edge_ctrl.pb.DataState.ServiceConfigs + 70, // 66: ziti.edge_ctrl.pb.DataState.PostureCheck.OsList.osList:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Os + 72, // 67: ziti.edge_ctrl.pb.DataState.PostureCheck.ProcessMulti.processes:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Process + 5, // 68: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry.value:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 69, // [69:69] is the sub-list for method output_type + 69, // [69:69] is the sub-list for method input_type + 69, // [69:69] is the sub-list for extension type_name + 69, // [69:69] is the sub-list for extension extendee + 0, // [0:69] is the sub-list for field type_name } func init() { file_edge_ctrl_proto_init() } @@ -5944,7 +6030,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Service); i { + switch v := v.(*DataState); i { case 0: return &v.state case 1: @@ -5956,7 +6042,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataState); i { + switch v := v.(*ApiSession); i { case 0: return &v.state case 1: @@ -5968,7 +6054,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Session); i { + switch v := v.(*ApiSessionAdded); i { case 0: return &v.state case 1: @@ -5980,7 +6066,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSession); i { + switch v := v.(*ApiSessionUpdated); i { case 0: return &v.state case 1: @@ -5992,7 +6078,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSessionAdded); i { + switch v := v.(*ApiSessionRemoved); i { case 0: return &v.state case 1: @@ -6004,7 +6090,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSessionUpdated); i { + switch v := v.(*ApiSessionHeartbeat); i { case 0: return &v.state case 1: @@ -6016,7 +6102,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSessionRemoved); i { + switch v := v.(*SessionRemoved); i { case 0: return &v.state case 1: @@ -6028,7 +6114,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSessionHeartbeat); i { + switch v := v.(*RequestClientReSync); i { case 0: return &v.state case 1: @@ -6040,7 +6126,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SessionRemoved); i { + switch v := v.(*CreateCircuitRequest); i { case 0: return &v.state case 1: @@ -6052,7 +6138,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestClientReSync); i { + switch v := v.(*CreateCircuitResponse); i { case 0: return &v.state case 1: @@ -6064,7 +6150,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateCircuitRequest); i { + switch v := v.(*CreateTerminatorRequest); i { case 0: return &v.state case 1: @@ -6076,7 +6162,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateCircuitResponse); i { + switch v := v.(*CreateTerminatorV2Request); i { case 0: return &v.state case 1: @@ -6088,7 +6174,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTerminatorRequest); i { + switch v := v.(*CreateTerminatorV2Response); i { case 0: return &v.state case 1: @@ -6100,7 +6186,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTerminatorV2Request); i { + switch v := v.(*RemoveTerminatorRequest); i { case 0: return &v.state case 1: @@ -6112,7 +6198,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTerminatorV2Response); i { + switch v := v.(*UpdateTerminatorRequest); i { case 0: return &v.state case 1: @@ -6124,7 +6210,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveTerminatorRequest); i { + switch v := v.(*HealthEventRequest); i { case 0: return &v.state case 1: @@ -6136,7 +6222,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateTerminatorRequest); i { + switch v := v.(*ValidateSessionsRequest); i { case 0: return &v.state case 1: @@ -6148,7 +6234,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthEventRequest); i { + switch v := v.(*EnvInfo); i { case 0: return &v.state case 1: @@ -6160,7 +6246,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateSessionsRequest); i { + switch v := v.(*SdkInfo); i { case 0: return &v.state case 1: @@ -6172,7 +6258,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnvInfo); i { + switch v := v.(*CreateApiSessionRequest); i { case 0: return &v.state case 1: @@ -6184,7 +6270,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SdkInfo); i { + switch v := v.(*CreateApiSessionResponse); i { case 0: return &v.state case 1: @@ -6196,7 +6282,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateApiSessionRequest); i { + switch v := v.(*CreateCircuitForServiceRequest); i { case 0: return &v.state case 1: @@ -6208,7 +6294,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateApiSessionResponse); i { + switch v := v.(*CreateSessionResponse); i { case 0: return &v.state case 1: @@ -6220,7 +6306,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateCircuitForServiceRequest); i { + switch v := v.(*CreateCircuitForServiceResponse); i { case 0: return &v.state case 1: @@ -6232,7 +6318,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateSessionResponse); i { + switch v := v.(*CreateTunnelCircuitV2Request); i { case 0: return &v.state case 1: @@ -6244,7 +6330,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateCircuitForServiceResponse); i { + switch v := v.(*CreateTunnelCircuitV2Response); i { case 0: return &v.state case 1: @@ -6256,7 +6342,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnelCircuitV2Request); i { + switch v := v.(*ServicesList); i { case 0: return &v.state case 1: @@ -6268,7 +6354,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnelCircuitV2Response); i { + switch v := v.(*TunnelService); i { case 0: return &v.state case 1: @@ -6280,7 +6366,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServicesList); i { + switch v := v.(*CreateTunnelTerminatorRequest); i { case 0: return &v.state case 1: @@ -6292,7 +6378,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TunnelService); i { + switch v := v.(*CreateTunnelTerminatorResponse); i { case 0: return &v.state case 1: @@ -6304,7 +6390,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnelTerminatorRequest); i { + switch v := v.(*UpdateTunnelTerminatorRequest); i { case 0: return &v.state case 1: @@ -6316,7 +6402,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnelTerminatorResponse); i { + switch v := v.(*EnrollmentExtendRouterRequest); i { case 0: return &v.state case 1: @@ -6328,7 +6414,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateTunnelTerminatorRequest); i { + switch v := v.(*EnrollmentCertsResponse); i { case 0: return &v.state case 1: @@ -6340,7 +6426,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnrollmentExtendRouterRequest); i { + switch v := v.(*EnrollmentExtendRouterVerifyRequest); i { case 0: return &v.state case 1: @@ -6351,8 +6437,8 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnrollmentCertsResponse); i { + file_edge_ctrl_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_ConfigType); i { case 0: return &v.state case 1: @@ -6363,8 +6449,8 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnrollmentExtendRouterVerifyRequest); i { + file_edge_ctrl_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_Config); i { case 0: return &v.state case 1: @@ -6376,7 +6462,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataState_Identity); i { + switch v := v.(*DataState_ServiceConfigs); i { case 0: return &v.state case 1: @@ -6388,7 +6474,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataState_Service); i { + switch v := v.(*DataState_Identity); i { case 0: return &v.state case 1: @@ -6400,7 +6486,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataState_ServicePolicy); i { + switch v := v.(*DataState_Service); i { case 0: return &v.state case 1: @@ -6412,7 +6498,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataState_Revocation); i { + switch v := v.(*DataState_ServicePolicy); i { case 0: return &v.state case 1: @@ -6424,7 +6510,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataState_ServicePolicyChange); i { + switch v := v.(*DataState_Revocation); i { case 0: return &v.state case 1: @@ -6436,7 +6522,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataState_ChangeSet); i { + switch v := v.(*DataState_ServicePolicyChange); i { case 0: return &v.state case 1: @@ -6448,7 +6534,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataState_Event); i { + switch v := v.(*DataState_ChangeSet); i { case 0: return &v.state case 1: @@ -6460,7 +6546,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataState_PublicKey); i { + switch v := v.(*DataState_Event); i { case 0: return &v.state case 1: @@ -6472,6 +6558,18 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PublicKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DataState_PostureCheck); i { case 0: return &v.state @@ -6483,7 +6581,7 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_edge_ctrl_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DataState_PostureCheck_Mac); i { case 0: return &v.state @@ -6495,7 +6593,7 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_edge_ctrl_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DataState_PostureCheck_Mfa); i { case 0: return &v.state @@ -6507,7 +6605,7 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_edge_ctrl_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DataState_PostureCheck_Os); i { case 0: return &v.state @@ -6519,7 +6617,7 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_edge_ctrl_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DataState_PostureCheck_OsList); i { case 0: return &v.state @@ -6531,7 +6629,7 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_edge_ctrl_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DataState_PostureCheck_Process); i { case 0: return &v.state @@ -6543,7 +6641,7 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_edge_ctrl_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DataState_PostureCheck_ProcessMulti); i { case 0: return &v.state @@ -6555,7 +6653,7 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_edge_ctrl_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DataState_PostureCheck_Domains); i { case 0: return &v.state @@ -6568,7 +6666,7 @@ func file_edge_ctrl_proto_init() { } } } - file_edge_ctrl_proto_msgTypes[50].OneofWrappers = []interface{}{ + file_edge_ctrl_proto_msgTypes[51].OneofWrappers = []interface{}{ (*DataState_Event_Identity)(nil), (*DataState_Event_Service)(nil), (*DataState_Event_ServicePolicy)(nil), @@ -6576,8 +6674,10 @@ func file_edge_ctrl_proto_init() { (*DataState_Event_PublicKey)(nil), (*DataState_Event_Revocation)(nil), (*DataState_Event_ServicePolicyChange)(nil), + (*DataState_Event_ConfigType)(nil), + (*DataState_Event_Config)(nil), } - file_edge_ctrl_proto_msgTypes[52].OneofWrappers = []interface{}{ + file_edge_ctrl_proto_msgTypes[53].OneofWrappers = []interface{}{ (*DataState_PostureCheck_Mac_)(nil), (*DataState_PostureCheck_Mfa_)(nil), (*DataState_PostureCheck_OsList_)(nil), @@ -6591,7 +6691,7 @@ func file_edge_ctrl_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_edge_ctrl_proto_rawDesc, NumEnums: 10, - NumMessages: 76, + NumMessages: 79, NumExtensions: 0, NumServices: 0, }, diff --git a/common/pb/edge_ctrl_pb/edge_ctrl.proto b/common/pb/edge_ctrl_pb/edge_ctrl.proto index e9a2acd5a..a95cbcb71 100644 --- a/common/pb/edge_ctrl_pb/edge_ctrl.proto +++ b/common/pb/edge_ctrl_pb/edge_ctrl.proto @@ -118,12 +118,6 @@ message Error { string cause = 3; } -message Service { - string id = 1; - string name = 2; - bool encryptionRequired = 3; -} - enum PolicyType { InvalidPolicy = 0; DialPolicy = 1; @@ -147,6 +141,22 @@ message DataState { Delete = 2; } + message ConfigType { + string id = 1; + string name = 2; + } + + message Config { + string id = 1; + string typeId = 2; + string name = 3; + string dataJson = 4; + } + + message ServiceConfigs { + map configs = 1; + } + message Identity { string id = 1; string name = 2; @@ -155,12 +165,14 @@ message DataState { map serviceHostingPrecedences = 5; map serviceHostingCosts = 6; bytes appDataJson = 7; + map serviceConfigs = 8; } message Service { string id = 1; string name = 2; bool encryptionRequired = 3; + repeated string configs = 4; } message ServicePolicy { @@ -200,6 +212,8 @@ message DataState { PublicKey publicKey = 14; Revocation revocation = 15; ServicePolicyChange servicePolicyChange = 16; + ConfigType configType = 17; + Config config = 18; } } @@ -273,16 +287,6 @@ message DataState { } } -message Session { - string token = 1; - SessionType type = 2; - repeated string certFingerprints = 3; - repeated string urls = 4; - Service service = 5; - string id = 7; - string apiSessionId = 8; -} - message ApiSession { string token = 1; repeated string certFingerprints = 2; diff --git a/common/pb/edge_ctrl_pb/impl.go b/common/pb/edge_ctrl_pb/impl.go new file mode 100644 index 000000000..c02c48e03 --- /dev/null +++ b/common/pb/edge_ctrl_pb/impl.go @@ -0,0 +1,34 @@ +/* + Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package edge_ctrl_pb + +func (x *DataState_Identity) GetServiceConfigsAsMap() map[string]map[string]string { + if x.ServiceConfigs == nil { + return nil + } + + result := map[string]map[string]string{} + for k, v := range x.ServiceConfigs { + m := map[string]string{} + for configType, configId := range v.Configs { + m[configType] = configId + } + result[k] = m + } + + return result +} diff --git a/common/pb/mgmt_pb/impl.go b/common/pb/mgmt_pb/impl.go index 4ae9e8299..a81064118 100644 --- a/common/pb/mgmt_pb/impl.go +++ b/common/pb/mgmt_pb/impl.go @@ -47,3 +47,15 @@ func (request *ValidateRouterSdkTerminatorsResponse) GetContentType() int32 { func (request *RouterSdkTerminatorsDetails) GetContentType() int32 { return int32(ContentType_ValidateRouterSdkTerminatorsResultType) } + +func (request *ValidateRouterDataModelRequest) GetContentType() int32 { + return int32(ContentType_ValidateRouterDataModelRequestType) +} + +func (request *ValidateRouterDataModelResponse) GetContentType() int32 { + return int32(ContentType_ValidateRouterDataModelResponseType) +} + +func (request *RouterDataModelDetails) GetContentType() int32 { + return int32(ContentType_ValidateRouterDataModelResultType) +} diff --git a/common/pb/mgmt_pb/mgmt.pb.go b/common/pb/mgmt_pb/mgmt.pb.go index 28210486c..946e7d43d 100644 --- a/common/pb/mgmt_pb/mgmt.pb.go +++ b/common/pb/mgmt_pb/mgmt.pb.go @@ -65,6 +65,9 @@ const ( ContentType_ValidateRouterSdkTerminatorsRequestType ContentType = 10106 ContentType_ValidateRouterSdkTerminatorsResponseType ContentType = 10107 ContentType_ValidateRouterSdkTerminatorsResultType ContentType = 10108 + ContentType_ValidateRouterDataModelRequestType ContentType = 10109 + ContentType_ValidateRouterDataModelResponseType ContentType = 10110 + ContentType_ValidateRouterDataModelResultType ContentType = 10111 ) // Enum value maps for ContentType. @@ -104,6 +107,9 @@ var ( 10106: "ValidateRouterSdkTerminatorsRequestType", 10107: "ValidateRouterSdkTerminatorsResponseType", 10108: "ValidateRouterSdkTerminatorsResultType", + 10109: "ValidateRouterDataModelRequestType", + 10110: "ValidateRouterDataModelResponseType", + 10111: "ValidateRouterDataModelResultType", } ContentType_value = map[string]int32{ "Zero": 0, @@ -140,6 +146,9 @@ var ( "ValidateRouterSdkTerminatorsRequestType": 10106, "ValidateRouterSdkTerminatorsResponseType": 10107, "ValidateRouterSdkTerminatorsResultType": 10108, + "ValidateRouterDataModelRequestType": 10109, + "ValidateRouterDataModelResponseType": 10110, + "ValidateRouterDataModelResultType": 10111, } ) @@ -1840,13 +1849,13 @@ type RouterSdkTerminatorDetail struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TerminatorId string `protobuf:"bytes,1,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` - CtrlState TerminatorState `protobuf:"varint,2,opt,name=ctrlState,proto3,enum=ziti.mgmt_pb.TerminatorState" json:"ctrlState,omitempty"` - RouterState string `protobuf:"bytes,3,opt,name=routerState,proto3" json:"routerState,omitempty"` - IsValid bool `protobuf:"varint,4,opt,name=isValid,proto3" json:"isValid,omitempty"` - OperaationActive bool `protobuf:"varint,5,opt,name=operaationActive,proto3" json:"operaationActive,omitempty"` - CreateTime string `protobuf:"bytes,6,opt,name=createTime,proto3" json:"createTime,omitempty"` - LastAttempt string `protobuf:"bytes,7,opt,name=lastAttempt,proto3" json:"lastAttempt,omitempty"` + TerminatorId string `protobuf:"bytes,1,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` + CtrlState TerminatorState `protobuf:"varint,2,opt,name=ctrlState,proto3,enum=ziti.mgmt_pb.TerminatorState" json:"ctrlState,omitempty"` + RouterState string `protobuf:"bytes,3,opt,name=routerState,proto3" json:"routerState,omitempty"` + IsValid bool `protobuf:"varint,4,opt,name=isValid,proto3" json:"isValid,omitempty"` + OperationActive bool `protobuf:"varint,5,opt,name=operationActive,proto3" json:"operationActive,omitempty"` + CreateTime string `protobuf:"bytes,6,opt,name=createTime,proto3" json:"createTime,omitempty"` + LastAttempt string `protobuf:"bytes,7,opt,name=lastAttempt,proto3" json:"lastAttempt,omitempty"` } func (x *RouterSdkTerminatorDetail) Reset() { @@ -1909,9 +1918,9 @@ func (x *RouterSdkTerminatorDetail) GetIsValid() bool { return false } -func (x *RouterSdkTerminatorDetail) GetOperaationActive() bool { +func (x *RouterSdkTerminatorDetail) GetOperationActive() bool { if x != nil { - return x.OperaationActive + return x.OperationActive } return false } @@ -1930,6 +1939,203 @@ func (x *RouterSdkTerminatorDetail) GetLastAttempt() string { return "" } +type ValidateRouterDataModelRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RouterFilter string `protobuf:"bytes,1,opt,name=routerFilter,proto3" json:"routerFilter,omitempty"` + ValidateCtrl bool `protobuf:"varint,2,opt,name=validateCtrl,proto3" json:"validateCtrl,omitempty"` +} + +func (x *ValidateRouterDataModelRequest) Reset() { + *x = ValidateRouterDataModelRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_mgmt_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidateRouterDataModelRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateRouterDataModelRequest) ProtoMessage() {} + +func (x *ValidateRouterDataModelRequest) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateRouterDataModelRequest.ProtoReflect.Descriptor instead. +func (*ValidateRouterDataModelRequest) Descriptor() ([]byte, []int) { + return file_mgmt_proto_rawDescGZIP(), []int{21} +} + +func (x *ValidateRouterDataModelRequest) GetRouterFilter() string { + if x != nil { + return x.RouterFilter + } + return "" +} + +func (x *ValidateRouterDataModelRequest) GetValidateCtrl() bool { + if x != nil { + return x.ValidateCtrl + } + return false +} + +type ValidateRouterDataModelResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + ComponentCount uint64 `protobuf:"varint,3,opt,name=componentCount,proto3" json:"componentCount,omitempty"` +} + +func (x *ValidateRouterDataModelResponse) Reset() { + *x = ValidateRouterDataModelResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_mgmt_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidateRouterDataModelResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateRouterDataModelResponse) ProtoMessage() {} + +func (x *ValidateRouterDataModelResponse) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateRouterDataModelResponse.ProtoReflect.Descriptor instead. +func (*ValidateRouterDataModelResponse) Descriptor() ([]byte, []int) { + return file_mgmt_proto_rawDescGZIP(), []int{22} +} + +func (x *ValidateRouterDataModelResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +func (x *ValidateRouterDataModelResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *ValidateRouterDataModelResponse) GetComponentCount() uint64 { + if x != nil { + return x.ComponentCount + } + return 0 +} + +type RouterDataModelDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ComponentType string `protobuf:"bytes,1,opt,name=componentType,proto3" json:"componentType,omitempty"` + ComponentId string `protobuf:"bytes,2,opt,name=componentId,proto3" json:"componentId,omitempty"` + ComponentName string `protobuf:"bytes,3,opt,name=componentName,proto3" json:"componentName,omitempty"` + ValidateSuccess bool `protobuf:"varint,4,opt,name=validateSuccess,proto3" json:"validateSuccess,omitempty"` + Errors []string `protobuf:"bytes,5,rep,name=errors,proto3" json:"errors,omitempty"` +} + +func (x *RouterDataModelDetails) Reset() { + *x = RouterDataModelDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_mgmt_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RouterDataModelDetails) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RouterDataModelDetails) ProtoMessage() {} + +func (x *RouterDataModelDetails) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RouterDataModelDetails.ProtoReflect.Descriptor instead. +func (*RouterDataModelDetails) Descriptor() ([]byte, []int) { + return file_mgmt_proto_rawDescGZIP(), []int{23} +} + +func (x *RouterDataModelDetails) GetComponentType() string { + if x != nil { + return x.ComponentType + } + return "" +} + +func (x *RouterDataModelDetails) GetComponentId() string { + if x != nil { + return x.ComponentId + } + return "" +} + +func (x *RouterDataModelDetails) GetComponentName() string { + if x != nil { + return x.ComponentName + } + return "" +} + +func (x *RouterDataModelDetails) GetValidateSuccess() bool { + if x != nil { + return x.ValidateSuccess + } + return false +} + +func (x *RouterDataModelDetails) GetErrors() []string { + if x != nil { + return x.Errors + } + return nil +} + type StreamMetricsRequest_MetricMatcher struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1942,7 +2148,7 @@ type StreamMetricsRequest_MetricMatcher struct { func (x *StreamMetricsRequest_MetricMatcher) Reset() { *x = StreamMetricsRequest_MetricMatcher{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_proto_msgTypes[21] + mi := &file_mgmt_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1955,7 +2161,7 @@ func (x *StreamMetricsRequest_MetricMatcher) String() string { func (*StreamMetricsRequest_MetricMatcher) ProtoMessage() {} func (x *StreamMetricsRequest_MetricMatcher) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_proto_msgTypes[21] + mi := &file_mgmt_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1999,7 +2205,7 @@ type StreamMetricsEvent_IntervalMetric struct { func (x *StreamMetricsEvent_IntervalMetric) Reset() { *x = StreamMetricsEvent_IntervalMetric{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_proto_msgTypes[25] + mi := &file_mgmt_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2012,7 +2218,7 @@ func (x *StreamMetricsEvent_IntervalMetric) String() string { func (*StreamMetricsEvent_IntervalMetric) ProtoMessage() {} func (x *StreamMetricsEvent_IntervalMetric) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_proto_msgTypes[25] + mi := &file_mgmt_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2069,7 +2275,7 @@ type InspectResponse_InspectValue struct { func (x *InspectResponse_InspectValue) Reset() { *x = InspectResponse_InspectValue{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_proto_msgTypes[28] + mi := &file_mgmt_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2082,7 +2288,7 @@ func (x *InspectResponse_InspectValue) String() string { func (*InspectResponse_InspectValue) ProtoMessage() {} func (x *InspectResponse_InspectValue) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_proto_msgTypes[28] + mi := &file_mgmt_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2390,7 +2596,7 @@ var file_mgmt_proto_rawDesc = []byte{ 0x0b, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x53, 0x64, 0x6b, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x22, 0xa6, 0x02, 0x0a, 0x19, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x53, 0x64, + 0x69, 0x6c, 0x73, 0x22, 0xa4, 0x02, 0x0a, 0x19, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x53, 0x64, 0x6b, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, @@ -2401,120 +2607,155 @@ var file_mgmt_proto_rawDesc = []byte{ 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x2a, - 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6c, 0x61, - 0x73, 0x74, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x2a, 0x9f, 0x09, 0x0a, - 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, - 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x17, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xb8, 0x4e, 0x12, 0x1a, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb9, 0x4e, - 0x12, 0x20, 0x0a, 0x1b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x50, 0x69, 0x70, 0x65, 0x54, 0x72, - 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, - 0xbc, 0x4e, 0x12, 0x23, 0x0a, 0x1e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x69, 0x72, 0x63, - 0x75, 0x69, 0x74, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x10, 0xbd, 0x4e, 0x12, 0x1c, 0x0a, 0x17, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xbe, 0x4e, 0x12, 0x1a, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, - 0x72, 0x61, 0x63, 0x65, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xbf, - 0x4e, 0x12, 0x17, 0x0a, 0x12, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xc0, 0x4e, 0x12, 0x18, 0x0a, 0x13, 0x49, 0x6e, - 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xc1, 0x4e, 0x12, 0x1a, 0x0a, 0x15, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x44, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xd6, 0x4e, - 0x12, 0x25, 0x0a, 0x20, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, - 0x6f, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x10, 0xd7, 0x4e, 0x12, 0x2c, 0x0a, 0x27, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x72, 0x44, 0x65, 0x62, 0x75, 0x67, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x74, 0x72, 0x6c, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xd8, 0x4e, 0x12, 0x26, 0x0a, 0x21, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, - 0x65, 0x62, 0x75, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xd9, 0x4e, 0x12, 0x2e, 0x0a, - 0x29, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x65, 0x62, 0x75, 0x67, 0x44, 0x75, 0x6d, 0x70, - 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xda, 0x4e, 0x12, 0x24, 0x0a, - 0x1f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x65, 0x62, 0x75, 0x67, 0x44, 0x75, 0x6d, 0x70, - 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x10, 0xdb, 0x4e, 0x12, 0x22, 0x0a, 0x1d, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x65, 0x62, - 0x75, 0x67, 0x55, 0x6e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x10, 0xdc, 0x4e, 0x12, 0x1d, 0x0a, 0x18, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x72, 0x51, 0x75, 0x69, 0x65, 0x73, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x10, 0xdd, 0x4e, 0x12, 0x1f, 0x0a, 0x1a, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, - 0x44, 0x65, 0x71, 0x75, 0x69, 0x65, 0x73, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x10, 0xde, 0x4e, 0x12, 0x22, 0x0a, 0x1d, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x72, 0x44, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xdf, 0x4e, 0x12, 0x1f, 0x0a, 0x1a, 0x52, - 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe0, 0x4e, 0x12, 0x20, 0x0a, 0x1b, - 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe1, 0x4e, 0x12, 0x1b, - 0x0a, 0x16, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe2, 0x4e, 0x12, 0x1e, 0x0a, 0x19, 0x52, - 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe3, 0x4e, 0x12, 0x26, 0x0a, 0x21, 0x52, - 0x61, 0x66, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x10, 0xe4, 0x4e, 0x12, 0x13, 0x0a, 0x0e, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x46, - 0x72, 0x6f, 0x6d, 0x44, 0x62, 0x10, 0xe5, 0x4e, 0x12, 0x23, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf4, 0x4e, 0x12, 0x23, 0x0a, - 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, - 0xf5, 0x4e, 0x12, 0x21, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xf6, 0x4e, 0x12, 0x23, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf7, 0x4e, 0x12, 0x24, 0x0a, 0x1f, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x6e, 0x6b, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf8, 0x4e, - 0x12, 0x22, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xf9, 0x4e, 0x12, 0x2c, 0x0a, 0x27, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x28, + 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6c, 0x61, 0x73, 0x74, + 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, + 0x61, 0x73, 0x74, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x22, 0x68, 0x0a, 0x1e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x74, 0x72, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x74, 0x72, 0x6c, 0x22, 0x7d, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0xc8, 0x01, 0x0a, 0x16, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x61, + 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x24, + 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2a, 0x9a, + 0x0a, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, + 0x0a, 0x04, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x17, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xb8, 0x4e, 0x12, 0x1a, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, + 0xb9, 0x4e, 0x12, 0x20, 0x0a, 0x1b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x50, 0x69, 0x70, 0x65, + 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xbc, 0x4e, 0x12, 0x23, 0x0a, 0x1e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x69, + 0x72, 0x63, 0x75, 0x69, 0x74, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xbd, 0x4e, 0x12, 0x1c, 0x0a, 0x17, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x10, 0xbe, 0x4e, 0x12, 0x1a, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x10, 0xbf, 0x4e, 0x12, 0x17, 0x0a, 0x12, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xc0, 0x4e, 0x12, 0x18, 0x0a, 0x13, + 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xc1, 0x4e, 0x12, 0x1a, 0x0a, 0x15, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x44, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, + 0xd6, 0x4e, 0x12, 0x25, 0x0a, 0x20, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x65, 0x62, 0x75, + 0x67, 0x46, 0x6f, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xd7, 0x4e, 0x12, 0x2c, 0x0a, 0x27, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x72, 0x44, 0x65, 0x62, 0x75, 0x67, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x74, + 0x72, 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x10, 0xd8, 0x4e, 0x12, 0x26, 0x0a, 0x21, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x44, 0x65, 0x62, 0x75, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xd9, 0x4e, 0x12, + 0x2e, 0x0a, 0x29, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x65, 0x62, 0x75, 0x67, 0x44, 0x75, + 0x6d, 0x70, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xda, 0x4e, 0x12, + 0x24, 0x0a, 0x1f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x65, 0x62, 0x75, 0x67, 0x44, 0x75, + 0x6d, 0x70, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x10, 0xdb, 0x4e, 0x12, 0x22, 0x0a, 0x1d, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, + 0x65, 0x62, 0x75, 0x67, 0x55, 0x6e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xdc, 0x4e, 0x12, 0x1d, 0x0a, 0x18, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x72, 0x51, 0x75, 0x69, 0x65, 0x73, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xdd, 0x4e, 0x12, 0x1f, 0x0a, 0x1a, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x44, 0x65, 0x71, 0x75, 0x69, 0x65, 0x73, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xde, 0x4e, 0x12, 0x22, 0x0a, 0x1d, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x72, 0x44, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xdf, 0x4e, 0x12, 0x1f, 0x0a, + 0x1a, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe0, 0x4e, 0x12, 0x20, + 0x0a, 0x1b, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe1, 0x4e, + 0x12, 0x1b, 0x0a, 0x16, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe2, 0x4e, 0x12, 0x1e, 0x0a, + 0x19, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x65, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe3, 0x4e, 0x12, 0x26, 0x0a, + 0x21, 0x52, 0x61, 0x66, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x10, 0xe4, 0x4e, 0x12, 0x13, 0x0a, 0x0e, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x69, + 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x44, 0x62, 0x10, 0xe5, 0x4e, 0x12, 0x23, 0x0a, 0x1e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf4, 0x4e, 0x12, + 0x23, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xf5, 0x4e, 0x12, 0x21, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x10, 0xf6, 0x4e, 0x12, 0x23, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf7, 0x4e, 0x12, 0x24, 0x0a, 0x1f, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x4c, 0x69, + 0x6e, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, + 0xf8, 0x4e, 0x12, 0x22, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, + 0x75, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xf9, 0x4e, 0x12, 0x2c, 0x0a, 0x27, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x53, 0x64, 0x6b, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xfa, 0x4e, 0x12, 0x2d, 0x0a, 0x28, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x53, 0x64, 0x6b, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, - 0xfa, 0x4e, 0x12, 0x2d, 0x0a, 0x28, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x72, 0x53, 0x64, 0x6b, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfb, - 0x4e, 0x12, 0x2b, 0x0a, 0x26, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x53, 0x64, 0x6b, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfc, 0x4e, 0x2a, 0x53, - 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x6f, 0x6e, 0x65, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x10, 0x0a, 0x12, 0x12, 0x0a, - 0x0e, 0x43, 0x74, 0x72, 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, - 0x0b, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x49, - 0x64, 0x10, 0x0c, 0x2a, 0x78, 0x0a, 0x16, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x69, 0x72, - 0x63, 0x75, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, - 0x0e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x10, - 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x61, 0x74, - 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x69, - 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x04, 0x2a, 0x2b, 0x0a, - 0x0f, 0x54, 0x72, 0x61, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, - 0x07, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x01, 0x2a, 0x77, 0x0a, 0x0f, 0x54, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x09, 0x0a, - 0x05, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x02, - 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x10, 0x03, 0x12, 0x13, - 0x0a, 0x0f, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x42, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x10, 0x04, 0x2a, 0x53, 0x0a, 0x09, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x6b, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, - 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x69, 0x6e, 0x6b, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x65, 0x64, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x6b, 0x50, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x6b, 0x44, - 0x69, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x10, 0x03, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, - 0x66, 0x61, 0x62, 0x72, 0x69, 0x63, 0x2f, 0x70, 0x62, 0x2f, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x10, 0xfb, 0x4e, 0x12, 0x2b, 0x0a, 0x26, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x53, 0x64, 0x6b, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfc, 0x4e, + 0x12, 0x27, 0x0a, 0x22, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfd, 0x4e, 0x12, 0x28, 0x0a, 0x23, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x10, 0xfe, 0x4e, 0x12, 0x26, 0x0a, 0x21, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xff, 0x4e, 0x2a, 0x53, 0x0a, 0x06, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x6f, 0x6e, 0x65, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x10, 0x0a, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x74, + 0x72, 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x0b, 0x12, 0x10, + 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x10, 0x0c, + 0x2a, 0x78, 0x0a, 0x16, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x69, + 0x72, 0x63, 0x75, 0x69, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x10, 0x00, 0x12, 0x12, + 0x0a, 0x0e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x50, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x61, 0x74, 0x68, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x69, 0x72, 0x63, 0x75, + 0x69, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x04, 0x2a, 0x2b, 0x0a, 0x0f, 0x54, 0x72, + 0x61, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, + 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, + 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x01, 0x2a, 0x77, 0x0a, 0x0f, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x1c, 0x0a, + 0x18, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x49, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x42, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x10, 0x04, + 0x2a, 0x53, 0x0a, 0x09, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, + 0x0b, 0x4c, 0x69, 0x6e, 0x6b, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x13, + 0x0a, 0x0f, 0x4c, 0x69, 0x6e, 0x6b, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, + 0x64, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x6b, 0x50, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x6b, 0x44, 0x69, 0x61, 0x6c, + 0x69, 0x6e, 0x67, 0x10, 0x03, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x66, 0x61, 0x62, + 0x72, 0x69, 0x63, 0x2f, 0x70, 0x62, 0x2f, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2530,7 +2771,7 @@ func file_mgmt_proto_rawDescGZIP() []byte { } var file_mgmt_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_mgmt_proto_msgTypes = make([]protoimpl.MessageInfo, 29) +var file_mgmt_proto_msgTypes = make([]protoimpl.MessageInfo, 32) var file_mgmt_proto_goTypes = []interface{}{ (ContentType)(0), // 0: ziti.mgmt_pb.ContentType (Header)(0), // 1: ziti.mgmt_pb.Header @@ -2559,28 +2800,31 @@ var file_mgmt_proto_goTypes = []interface{}{ (*ValidateRouterSdkTerminatorsResponse)(nil), // 24: ziti.mgmt_pb.ValidateRouterSdkTerminatorsResponse (*RouterSdkTerminatorsDetails)(nil), // 25: ziti.mgmt_pb.RouterSdkTerminatorsDetails (*RouterSdkTerminatorDetail)(nil), // 26: ziti.mgmt_pb.RouterSdkTerminatorDetail - (*StreamMetricsRequest_MetricMatcher)(nil), // 27: ziti.mgmt_pb.StreamMetricsRequest.MetricMatcher - nil, // 28: ziti.mgmt_pb.StreamMetricsEvent.TagsEntry - nil, // 29: ziti.mgmt_pb.StreamMetricsEvent.IntMetricsEntry - nil, // 30: ziti.mgmt_pb.StreamMetricsEvent.FloatMetricsEntry - (*StreamMetricsEvent_IntervalMetric)(nil), // 31: ziti.mgmt_pb.StreamMetricsEvent.IntervalMetric - nil, // 32: ziti.mgmt_pb.StreamMetricsEvent.MetricGroupEntry - nil, // 33: ziti.mgmt_pb.StreamMetricsEvent.IntervalMetric.ValuesEntry - (*InspectResponse_InspectValue)(nil), // 34: ziti.mgmt_pb.InspectResponse.InspectValue - (*timestamppb.Timestamp)(nil), // 35: google.protobuf.Timestamp + (*ValidateRouterDataModelRequest)(nil), // 27: ziti.mgmt_pb.ValidateRouterDataModelRequest + (*ValidateRouterDataModelResponse)(nil), // 28: ziti.mgmt_pb.ValidateRouterDataModelResponse + (*RouterDataModelDetails)(nil), // 29: ziti.mgmt_pb.RouterDataModelDetails + (*StreamMetricsRequest_MetricMatcher)(nil), // 30: ziti.mgmt_pb.StreamMetricsRequest.MetricMatcher + nil, // 31: ziti.mgmt_pb.StreamMetricsEvent.TagsEntry + nil, // 32: ziti.mgmt_pb.StreamMetricsEvent.IntMetricsEntry + nil, // 33: ziti.mgmt_pb.StreamMetricsEvent.FloatMetricsEntry + (*StreamMetricsEvent_IntervalMetric)(nil), // 34: ziti.mgmt_pb.StreamMetricsEvent.IntervalMetric + nil, // 35: ziti.mgmt_pb.StreamMetricsEvent.MetricGroupEntry + nil, // 36: ziti.mgmt_pb.StreamMetricsEvent.IntervalMetric.ValuesEntry + (*InspectResponse_InspectValue)(nil), // 37: ziti.mgmt_pb.InspectResponse.InspectValue + (*timestamppb.Timestamp)(nil), // 38: google.protobuf.Timestamp } var file_mgmt_proto_depIdxs = []int32{ - 27, // 0: ziti.mgmt_pb.StreamMetricsRequest.matchers:type_name -> ziti.mgmt_pb.StreamMetricsRequest.MetricMatcher - 35, // 1: ziti.mgmt_pb.StreamMetricsEvent.timestamp:type_name -> google.protobuf.Timestamp - 28, // 2: ziti.mgmt_pb.StreamMetricsEvent.tags:type_name -> ziti.mgmt_pb.StreamMetricsEvent.TagsEntry - 29, // 3: ziti.mgmt_pb.StreamMetricsEvent.intMetrics:type_name -> ziti.mgmt_pb.StreamMetricsEvent.IntMetricsEntry - 30, // 4: ziti.mgmt_pb.StreamMetricsEvent.floatMetrics:type_name -> ziti.mgmt_pb.StreamMetricsEvent.FloatMetricsEntry - 31, // 5: ziti.mgmt_pb.StreamMetricsEvent.intervalMetrics:type_name -> ziti.mgmt_pb.StreamMetricsEvent.IntervalMetric - 32, // 6: ziti.mgmt_pb.StreamMetricsEvent.metricGroup:type_name -> ziti.mgmt_pb.StreamMetricsEvent.MetricGroupEntry + 30, // 0: ziti.mgmt_pb.StreamMetricsRequest.matchers:type_name -> ziti.mgmt_pb.StreamMetricsRequest.MetricMatcher + 38, // 1: ziti.mgmt_pb.StreamMetricsEvent.timestamp:type_name -> google.protobuf.Timestamp + 31, // 2: ziti.mgmt_pb.StreamMetricsEvent.tags:type_name -> ziti.mgmt_pb.StreamMetricsEvent.TagsEntry + 32, // 3: ziti.mgmt_pb.StreamMetricsEvent.intMetrics:type_name -> ziti.mgmt_pb.StreamMetricsEvent.IntMetricsEntry + 33, // 4: ziti.mgmt_pb.StreamMetricsEvent.floatMetrics:type_name -> ziti.mgmt_pb.StreamMetricsEvent.FloatMetricsEntry + 34, // 5: ziti.mgmt_pb.StreamMetricsEvent.intervalMetrics:type_name -> ziti.mgmt_pb.StreamMetricsEvent.IntervalMetric + 35, // 6: ziti.mgmt_pb.StreamMetricsEvent.metricGroup:type_name -> ziti.mgmt_pb.StreamMetricsEvent.MetricGroupEntry 2, // 7: ziti.mgmt_pb.StreamCircuitsEvent.eventType:type_name -> ziti.mgmt_pb.StreamCircuitEventType 8, // 8: ziti.mgmt_pb.StreamCircuitsEvent.path:type_name -> ziti.mgmt_pb.Path 3, // 9: ziti.mgmt_pb.StreamTracesRequest.filterType:type_name -> ziti.mgmt_pb.TraceFilterType - 34, // 10: ziti.mgmt_pb.InspectResponse.values:type_name -> ziti.mgmt_pb.InspectResponse.InspectValue + 37, // 10: ziti.mgmt_pb.InspectResponse.values:type_name -> ziti.mgmt_pb.InspectResponse.InspectValue 14, // 11: ziti.mgmt_pb.RaftMemberListResponse.members:type_name -> ziti.mgmt_pb.RaftMember 4, // 12: ziti.mgmt_pb.TerminatorDetail.state:type_name -> ziti.mgmt_pb.TerminatorState 22, // 13: ziti.mgmt_pb.RouterLinkDetails.linkDetails:type_name -> ziti.mgmt_pb.RouterLinkDetail @@ -2588,9 +2832,9 @@ var file_mgmt_proto_depIdxs = []int32{ 5, // 15: ziti.mgmt_pb.RouterLinkDetail.routerState:type_name -> ziti.mgmt_pb.LinkState 26, // 16: ziti.mgmt_pb.RouterSdkTerminatorsDetails.details:type_name -> ziti.mgmt_pb.RouterSdkTerminatorDetail 4, // 17: ziti.mgmt_pb.RouterSdkTerminatorDetail.ctrlState:type_name -> ziti.mgmt_pb.TerminatorState - 35, // 18: ziti.mgmt_pb.StreamMetricsEvent.IntervalMetric.intervalStartUTC:type_name -> google.protobuf.Timestamp - 35, // 19: ziti.mgmt_pb.StreamMetricsEvent.IntervalMetric.intervalEndUTC:type_name -> google.protobuf.Timestamp - 33, // 20: ziti.mgmt_pb.StreamMetricsEvent.IntervalMetric.values:type_name -> ziti.mgmt_pb.StreamMetricsEvent.IntervalMetric.ValuesEntry + 38, // 18: ziti.mgmt_pb.StreamMetricsEvent.IntervalMetric.intervalStartUTC:type_name -> google.protobuf.Timestamp + 38, // 19: ziti.mgmt_pb.StreamMetricsEvent.IntervalMetric.intervalEndUTC:type_name -> google.protobuf.Timestamp + 36, // 20: ziti.mgmt_pb.StreamMetricsEvent.IntervalMetric.values:type_name -> ziti.mgmt_pb.StreamMetricsEvent.IntervalMetric.ValuesEntry 21, // [21:21] is the sub-list for method output_type 21, // [21:21] is the sub-list for method input_type 21, // [21:21] is the sub-list for extension type_name @@ -2857,6 +3101,42 @@ func file_mgmt_proto_init() { } } file_mgmt_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidateRouterDataModelRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mgmt_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidateRouterDataModelResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mgmt_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RouterDataModelDetails); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mgmt_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StreamMetricsRequest_MetricMatcher); i { case 0: return &v.state @@ -2868,7 +3148,7 @@ func file_mgmt_proto_init() { return nil } } - file_mgmt_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_mgmt_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StreamMetricsEvent_IntervalMetric); i { case 0: return &v.state @@ -2880,7 +3160,7 @@ func file_mgmt_proto_init() { return nil } } - file_mgmt_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_mgmt_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InspectResponse_InspectValue); i { case 0: return &v.state @@ -2900,7 +3180,7 @@ func file_mgmt_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mgmt_proto_rawDesc, NumEnums: 6, - NumMessages: 29, + NumMessages: 32, NumExtensions: 0, NumServices: 0, }, diff --git a/common/pb/mgmt_pb/mgmt.proto b/common/pb/mgmt_pb/mgmt.proto index 383d186e8..83ca91772 100644 --- a/common/pb/mgmt_pb/mgmt.proto +++ b/common/pb/mgmt_pb/mgmt.proto @@ -58,6 +58,9 @@ enum ContentType { ValidateRouterSdkTerminatorsResponseType = 10107; ValidateRouterSdkTerminatorsResultType = 10108; + ValidateRouterDataModelRequestType = 10109; + ValidateRouterDataModelResponseType = 10110; + ValidateRouterDataModelResultType = 10111; } enum Header { @@ -265,7 +268,26 @@ message RouterSdkTerminatorDetail { TerminatorState ctrlState = 2; string routerState = 3; bool isValid = 4; - bool operaationActive = 5; + bool operationActive = 5; string createTime = 6; string lastAttempt = 7; +} + +message ValidateRouterDataModelRequest { + string routerFilter = 1; + bool validateCtrl = 2; +} + +message ValidateRouterDataModelResponse { + bool success = 1; + string message = 2; + uint64 componentCount = 3; +} + +message RouterDataModelDetails { + string componentType = 1; + string componentId = 2; + string componentName = 3; + bool validateSuccess = 4; + repeated string errors = 5; } \ No newline at end of file diff --git a/common/router_data_model.go b/common/router_data_model.go index fec108f4f..f9446e345 100644 --- a/common/router_data_model.go +++ b/common/router_data_model.go @@ -1,3 +1,19 @@ +/* + Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + package common import ( @@ -7,8 +23,10 @@ import ( "github.com/michaelquigley/pfxlog" "github.com/openziti/ziti/common/pb/edge_ctrl_pb" cmap "github.com/orcaman/concurrent-map/v2" + "github.com/sirupsen/logrus" "io" "os" + "sync/atomic" ) // AccessPolicies represents the Identity's access to a Service through many Policies. The PostureChecks provided @@ -16,7 +34,7 @@ import ( // a valid policy and posture access path. type AccessPolicies struct { Identity *Identity - Service *edge_ctrl_pb.DataState_Service + Service *Service Policies []*ServicePolicy PostureChecks map[string]*edge_ctrl_pb.DataState_PostureCheck } @@ -26,6 +44,36 @@ type DataStateIdentity = edge_ctrl_pb.DataState_Identity type Identity struct { *DataStateIdentity ServicePolicies map[string]struct{} `json:"servicePolicies"` + IdentityIndex uint64 + ServiceSetIndex uint64 +} + +type DataStateConfigType = edge_ctrl_pb.DataState_ConfigType + +type ConfigType struct { + *DataStateConfigType + Index uint64 +} + +type DataStateConfig = edge_ctrl_pb.DataState_Config + +type Config struct { + *DataStateConfig + Index uint64 +} + +type DataStateService = edge_ctrl_pb.DataState_Service + +type Service struct { + *DataStateService + Index uint64 +} + +type DataStatePostureCheck = edge_ctrl_pb.DataState_PostureCheck + +type PostureCheck struct { + *DataStatePostureCheck + Index uint64 } type DataStateServicePolicy = edge_ctrl_pb.DataState_ServicePolicy @@ -45,15 +93,23 @@ type RouterDataModel struct { EventCache listeners map[chan *edge_ctrl_pb.DataState_ChangeSet]struct{} - Identities cmap.ConcurrentMap[string, *Identity] `json:"identities"` - Services cmap.ConcurrentMap[string, *edge_ctrl_pb.DataState_Service] `json:"services"` - ServicePolicies cmap.ConcurrentMap[string, *ServicePolicy] `json:"servicePolicies"` - PostureChecks cmap.ConcurrentMap[string, *edge_ctrl_pb.DataState_PostureCheck] `json:"postureChecks"` - PublicKeys cmap.ConcurrentMap[string, *edge_ctrl_pb.DataState_PublicKey] `json:"publicKeys"` - Revocations cmap.ConcurrentMap[string, *edge_ctrl_pb.DataState_Revocation] `json:"revocations"` + ConfigTypes cmap.ConcurrentMap[string, *ConfigType] `json:"configTypes"` + Configs cmap.ConcurrentMap[string, *Config] `json:"configs"` + Identities cmap.ConcurrentMap[string, *Identity] `json:"identities"` + Services cmap.ConcurrentMap[string, *Service] `json:"services"` + ServicePolicies cmap.ConcurrentMap[string, *ServicePolicy] `json:"servicePolicies"` + PostureChecks cmap.ConcurrentMap[string, *PostureCheck] `json:"postureChecks"` + PublicKeys cmap.ConcurrentMap[string, *edge_ctrl_pb.DataState_PublicKey] `json:"publicKeys"` + Revocations cmap.ConcurrentMap[string, *edge_ctrl_pb.DataState_Revocation] `json:"revocations"` listenerBufferSize uint lastSaveIndex *uint64 + + subscriptions cmap.ConcurrentMap[string, *IdentitySubscription] + events chan subscriberEvent + closeNotify <-chan struct{} + stopNotify chan struct{} + stopped atomic.Bool } // NewSenderRouterDataModel creates a new RouterDataModel that will store events in a circular buffer of @@ -61,10 +117,12 @@ type RouterDataModel struct { func NewSenderRouterDataModel(logSize uint64, listenerBufferSize uint) *RouterDataModel { return &RouterDataModel{ EventCache: NewLoggingEventCache(logSize), + ConfigTypes: cmap.New[*ConfigType](), + Configs: cmap.New[*Config](), Identities: cmap.New[*Identity](), - Services: cmap.New[*edge_ctrl_pb.DataState_Service](), + Services: cmap.New[*Service](), ServicePolicies: cmap.New[*ServicePolicy](), - PostureChecks: cmap.New[*edge_ctrl_pb.DataState_PostureCheck](), + PostureChecks: cmap.New[*PostureCheck](), PublicKeys: cmap.New[*edge_ctrl_pb.DataState_PublicKey](), Revocations: cmap.New[*edge_ctrl_pb.DataState_Revocation](), listenerBufferSize: listenerBufferSize, @@ -73,22 +131,30 @@ func NewSenderRouterDataModel(logSize uint64, listenerBufferSize uint) *RouterDa // NewReceiverRouterDataModel creates a new RouterDataModel that does not store events. listenerBufferSize affects the // buffer size of channels returned to listeners of the data model. -func NewReceiverRouterDataModel(listenerBufferSize uint) *RouterDataModel { - return &RouterDataModel{ +func NewReceiverRouterDataModel(listenerBufferSize uint, closeNotify <-chan struct{}) *RouterDataModel { + result := &RouterDataModel{ EventCache: NewForgetfulEventCache(), + ConfigTypes: cmap.New[*ConfigType](), + Configs: cmap.New[*Config](), Identities: cmap.New[*Identity](), - Services: cmap.New[*edge_ctrl_pb.DataState_Service](), + Services: cmap.New[*Service](), ServicePolicies: cmap.New[*ServicePolicy](), - PostureChecks: cmap.New[*edge_ctrl_pb.DataState_PostureCheck](), + PostureChecks: cmap.New[*PostureCheck](), PublicKeys: cmap.New[*edge_ctrl_pb.DataState_PublicKey](), Revocations: cmap.New[*edge_ctrl_pb.DataState_Revocation](), listenerBufferSize: listenerBufferSize, + subscriptions: cmap.New[*IdentitySubscription](), + events: make(chan subscriberEvent), + closeNotify: closeNotify, + stopNotify: make(chan struct{}), } + go result.processSubscriberEvents() + return result } // NewReceiverRouterDataModelFromFile creates a new RouterDataModel that does not store events and is initialized from // a file backup. listenerBufferSize affects the buffer size of channels returned to listeners of the data model. -func NewReceiverRouterDataModelFromFile(path string, listenerBufferSize uint) (*RouterDataModel, error) { +func NewReceiverRouterDataModelFromFile(path string, listenerBufferSize uint, closeNotify <-chan struct{}) (*RouterDataModel, error) { file, err := os.Open(path) if err != nil { return nil, err @@ -107,7 +173,7 @@ func NewReceiverRouterDataModelFromFile(path string, listenerBufferSize uint) (* } rdmContents := &rdmDb{ - RouterDataModel: NewReceiverRouterDataModel(listenerBufferSize), + RouterDataModel: NewReceiverRouterDataModel(listenerBufferSize, closeNotify), } err = json.Unmarshal(data, rdmContents) @@ -120,6 +186,25 @@ func NewReceiverRouterDataModelFromFile(path string, listenerBufferSize uint) (* return rdmContents.RouterDataModel, nil } +func (rdm *RouterDataModel) processSubscriberEvents() { + for !rdm.stopped.Load() { + select { + case <-rdm.closeNotify: + return + case <-rdm.stopNotify: + return + case evt := <-rdm.events: + evt.process(rdm) + } + } +} + +func (rdm *RouterDataModel) Stop() { + if rdm.stopped.CompareAndSwap(false, true) { + close(rdm.stopNotify) + } +} + // NewListener returns a channel that will receive the events applied to this data model. func (rdm *RouterDataModel) NewListener() <-chan *edge_ctrl_pb.DataState_ChangeSet { if rdm.listeners == nil { @@ -138,12 +223,24 @@ func (rdm *RouterDataModel) sendEvent(event *edge_ctrl_pb.DataState_ChangeSet) { } } -// Apply applies the given even to the router data model. +// ApplyChangeSet applies the given even to the router data model. func (rdm *RouterDataModel) ApplyChangeSet(change *edge_ctrl_pb.DataState_ChangeSet) { changeAccepted := false err := rdm.EventCache.Store(change, func(index uint64, change *edge_ctrl_pb.DataState_ChangeSet) { - for _, event := range change.Changes { - rdm.Handle(event) + syncSubscribers := false + for idx, event := range change.Changes { + pfxlog.Logger(). + WithField("index", index). + WithField("entry", idx). + WithField("action", event.Action). + WithField("type", fmt.Sprintf("%T", event.Model)). + Debug("handling change set entry") + if rdm.Handle(index, event) { + syncSubscribers = true + } + } + if syncSubscribers { + rdm.SyncAllSubscribers() } changeAccepted = true }) @@ -159,53 +256,119 @@ func (rdm *RouterDataModel) ApplyChangeSet(change *edge_ctrl_pb.DataState_Change } } -func (rdm *RouterDataModel) Handle(event *edge_ctrl_pb.DataState_Event) { +func (rdm *RouterDataModel) Handle(index uint64, event *edge_ctrl_pb.DataState_Event) bool { switch typedModel := event.Model.(type) { + case *edge_ctrl_pb.DataState_Event_ConfigType: + rdm.HandleConfigTypeEvent(index, event, typedModel) + case *edge_ctrl_pb.DataState_Event_Config: + rdm.HandleConfigEvent(index, event, typedModel) case *edge_ctrl_pb.DataState_Event_Identity: - rdm.HandleIdentityEvent(event, typedModel) + rdm.HandleIdentityEvent(index, event, typedModel) + return false // identity events are handled individually, don't require a full subscriber sync case *edge_ctrl_pb.DataState_Event_Service: - rdm.HandleServiceEvent(event, typedModel) + rdm.HandleServiceEvent(index, event, typedModel) case *edge_ctrl_pb.DataState_Event_ServicePolicy: rdm.HandleServicePolicyEvent(event, typedModel) case *edge_ctrl_pb.DataState_Event_PostureCheck: - rdm.HandlePostureCheckEvent(event, typedModel) + rdm.HandlePostureCheckEvent(index, event, typedModel) case *edge_ctrl_pb.DataState_Event_PublicKey: rdm.HandlePublicKeyEvent(event, typedModel) + return false // don't affect identity subscribers, so don't require a sync case *edge_ctrl_pb.DataState_Event_Revocation: rdm.HandleRevocationEvent(event, typedModel) + return false // don't affect identity subscribers, so don't require a sync case *edge_ctrl_pb.DataState_Event_ServicePolicyChange: - rdm.HandleServicePolicyChange(typedModel.ServicePolicyChange) + rdm.HandleServicePolicyChange(index, typedModel.ServicePolicyChange) + } + return true +} + +func (rdm *RouterDataModel) queueEvent(event subscriberEvent) { + if rdm.events != nil { + rdm.events <- event + } +} + +func (rdm *RouterDataModel) SyncAllSubscribers() { + if rdm.events != nil { + rdm.events <- syncAllSubscribersEvent{} } } // HandleIdentityEvent will apply the delta event to the router data model. It is not restricted by index calculations. // Use ApplyIdentityEvent for event logged event handling. This method is generally meant for bulk loading of data // during startup. -func (rdm *RouterDataModel) HandleIdentityEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_Identity) { +func (rdm *RouterDataModel) HandleIdentityEvent(index uint64, event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_Identity) { if event.Action == edge_ctrl_pb.DataState_Delete { rdm.Identities.Remove(model.Identity.Id) + rdm.queueEvent(identityRemoveEvent{identityId: model.Identity.Id}) } else { + var identity *Identity rdm.Identities.Upsert(model.Identity.Id, nil, func(exist bool, valueInMap *Identity, newValue *Identity) *Identity { if valueInMap == nil { - return &Identity{ + identity = &Identity{ DataStateIdentity: model.Identity, ServicePolicies: map[string]struct{}{}, + IdentityIndex: index, + } + } else { + identity = &Identity{ + DataStateIdentity: model.Identity, + ServicePolicies: valueInMap.ServicePolicies, + IdentityIndex: index, + ServiceSetIndex: valueInMap.ServiceSetIndex, } } - valueInMap.DataStateIdentity = model.Identity - return valueInMap + return identity }) + + if event.Action == edge_ctrl_pb.DataState_Create { + rdm.queueEvent(identityCreatedEvent{identity: identity}) + } else if event.Action == edge_ctrl_pb.DataState_Update { + rdm.queueEvent(identityUpdatedEvent{identity: identity}) + } } } // HandleServiceEvent will apply the delta event to the router data model. It is not restricted by index calculations. // Use ApplyServiceEvent for event logged event handling. This method is generally meant for bulk loading of data // during startup. -func (rdm *RouterDataModel) HandleServiceEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_Service) { +func (rdm *RouterDataModel) HandleServiceEvent(index uint64, event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_Service) { if event.Action == edge_ctrl_pb.DataState_Delete { rdm.Services.Remove(model.Service.Id) } else { - rdm.Services.Set(model.Service.Id, model.Service) + rdm.Services.Set(model.Service.Id, &Service{ + DataStateService: model.Service, + Index: index, + }) + } +} + +// HandleConfigTypeEvent will apply the delta event to the router data model. It is not restricted by index calculations. +// Use ApplyConfigTypeEvent for event logged event handling. This method is generally meant for bulk loading of data +// during startup. +func (rdm *RouterDataModel) HandleConfigTypeEvent(index uint64, event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_ConfigType) { + if event.Action == edge_ctrl_pb.DataState_Delete { + rdm.ConfigTypes.Remove(model.ConfigType.Id) + } else { + rdm.ConfigTypes.Set(model.ConfigType.Id, &ConfigType{ + DataStateConfigType: model.ConfigType, + Index: index, + }) + } +} + +// HandleConfigEvent will apply the delta event to the router data model. It is not restricted by index calculations. +// Use ApplyConfigEvent for event logged event handling. This method is generally meant for bulk loading of data +// during startup. +func (rdm *RouterDataModel) HandleConfigEvent(index uint64, event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_Config) { + if event.Action == edge_ctrl_pb.DataState_Delete { + rdm.Configs.Remove(model.Config.Id) + } else { + rdm.Configs.Set(model.Config.Id, &Config{ + DataStateConfig: model.Config, + Index: index, + }) } } @@ -218,9 +381,13 @@ func (rdm *RouterDataModel) applyUpdateServicePolicyEvent(event *edge_ctrl_pb.Da Services: map[string]struct{}{}, PostureChecks: map[string]struct{}{}, } + } else { + return &ServicePolicy{ + DataStateServicePolicy: servicePolicy, + Services: valueInMap.Services, + PostureChecks: valueInMap.PostureChecks, + } } - valueInMap.DataStateServicePolicy = servicePolicy - return valueInMap }) } @@ -232,6 +399,7 @@ func (rdm *RouterDataModel) applyDeleteServicePolicyEvent(_ *edge_ctrl_pb.DataSt // Use ApplyServicePolicyEvent for event logged event handling. This method is generally meant for bulk loading of data // during startup. func (rdm *RouterDataModel) HandleServicePolicyEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_ServicePolicy) { + pfxlog.Logger().WithField("policyId", model.ServicePolicy.Id).WithField("action", event.Action).Debug("applying service policy event") switch event.Action { case edge_ctrl_pb.DataState_Create: rdm.applyUpdateServicePolicyEvent(event, model) @@ -245,11 +413,14 @@ func (rdm *RouterDataModel) HandleServicePolicyEvent(event *edge_ctrl_pb.DataSta // HandlePostureCheckEvent will apply the delta event to the router data model. It is not restricted by index calculations. // Use ApplyPostureCheckEvent for event logged event handling. This method is generally meant for bulk loading of data // during startup. -func (rdm *RouterDataModel) HandlePostureCheckEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_PostureCheck) { +func (rdm *RouterDataModel) HandlePostureCheckEvent(index uint64, event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_PostureCheck) { if event.Action == edge_ctrl_pb.DataState_Delete { rdm.PostureChecks.Remove(model.PostureCheck.Id) } else { - rdm.PostureChecks.Set(model.PostureCheck.Id, model.PostureCheck) + rdm.PostureChecks.Set(model.PostureCheck.Id, &PostureCheck{ + DataStatePostureCheck: model.PostureCheck, + Index: index, + }) } } @@ -275,7 +446,14 @@ func (rdm *RouterDataModel) HandleRevocationEvent(event *edge_ctrl_pb.DataState_ } } -func (rdm *RouterDataModel) HandleServicePolicyChange(model *edge_ctrl_pb.DataState_ServicePolicyChange) { +func (rdm *RouterDataModel) HandleServicePolicyChange(index uint64, model *edge_ctrl_pb.DataState_ServicePolicyChange) { + pfxlog.Logger(). + WithField("policyId", model.PolicyId). + WithField("isAdd", model.Add). + WithField("relatedEntityType", model.RelatedEntityType). + WithField("relatedEntityIds", model.RelatedEntityIds). + Debug("applying service policy change event") + if model.RelatedEntityType == edge_ctrl_pb.ServicePolicyRelatedEntityType_RelatedIdentity { for _, identityId := range model.RelatedEntityIds { rdm.Identities.Upsert(identityId, nil, func(exist bool, valueInMap *Identity, newValue *Identity) *Identity { @@ -285,6 +463,7 @@ func (rdm *RouterDataModel) HandleServicePolicyChange(model *edge_ctrl_pb.DataSt } else { delete(valueInMap.ServicePolicies, model.PolicyId) } + valueInMap.ServiceSetIndex = index } return valueInMap }) @@ -292,6 +471,10 @@ func (rdm *RouterDataModel) HandleServicePolicyChange(model *edge_ctrl_pb.DataSt return } + if !rdm.ServicePolicies.Has(model.PolicyId) { + return + } + rdm.ServicePolicies.Upsert(model.PolicyId, nil, func(exist bool, valueInMap *ServicePolicy, newValue *ServicePolicy) *ServicePolicy { if valueInMap == nil { return nil @@ -322,7 +505,6 @@ func (rdm *RouterDataModel) HandleServicePolicyChange(model *edge_ctrl_pb.DataSt return valueInMap }) - } func (rdm *RouterDataModel) GetPublicKeys() map[string]*edge_ctrl_pb.DataState_PublicKey { @@ -333,6 +515,26 @@ func (rdm *RouterDataModel) GetDataState() *edge_ctrl_pb.DataState { var events []*edge_ctrl_pb.DataState_Event rdm.EventCache.WhileLocked(func(_ uint64, _ bool) { + rdm.ConfigTypes.IterCb(func(key string, v *ConfigType) { + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: &edge_ctrl_pb.DataState_Event_ConfigType{ + ConfigType: v.DataStateConfigType, + }, + } + events = append(events, newEvent) + }) + + rdm.Configs.IterCb(func(key string, v *Config) { + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: &edge_ctrl_pb.DataState_Event_Config{ + Config: v.DataStateConfig, + }, + } + events = append(events, newEvent) + }) + servicePolicyIdentities := map[string]*edge_ctrl_pb.DataState_ServicePolicyChange{} rdm.Identities.IterCb(func(key string, v *Identity) { @@ -358,21 +560,21 @@ func (rdm *RouterDataModel) GetDataState() *edge_ctrl_pb.DataState { } }) - rdm.Services.IterCb(func(key string, v *edge_ctrl_pb.DataState_Service) { + rdm.Services.IterCb(func(key string, v *Service) { newEvent := &edge_ctrl_pb.DataState_Event{ Action: edge_ctrl_pb.DataState_Create, Model: &edge_ctrl_pb.DataState_Event_Service{ - Service: v, + Service: v.DataStateService, }, } events = append(events, newEvent) }) - rdm.PostureChecks.IterCb(func(key string, v *edge_ctrl_pb.DataState_PostureCheck) { + rdm.PostureChecks.IterCb(func(key string, v *PostureCheck) { newEvent := &edge_ctrl_pb.DataState_Event{ Action: edge_ctrl_pb.DataState_Create, Model: &edge_ctrl_pb.DataState_Event_PostureCheck{ - PostureCheck: v, + PostureCheck: v.DataStatePostureCheck, }, } events = append(events, newEvent) @@ -531,7 +733,7 @@ func (rdm *RouterDataModel) GetServiceAccessPolicies(identityId string, serviceI //ignore ok, if !ok postureCheck == nil which will trigger //failure during evaluation postureCheck, _ := rdm.PostureChecks.Get(postureCheckId) - postureChecks[postureCheckId] = postureCheck + postureChecks[postureCheckId] = postureCheck.DataStatePostureCheck } } } @@ -543,3 +745,152 @@ func (rdm *RouterDataModel) GetServiceAccessPolicies(identityId string, serviceI PostureChecks: postureChecks, }, nil } + +func CloneMap[V any](m cmap.ConcurrentMap[string, V]) cmap.ConcurrentMap[string, V] { + result := cmap.New[V]() + m.IterCb(func(key string, v V) { + result.Set(key, v) + }) + return result +} + +func (rdm *RouterDataModel) SubscribeToIdentityChanges(identityId string, subscriber IdentityEventSubscriber, isRouterIdentity bool) error { + pfxlog.Logger().WithField("identityId", identityId).Debug("subscribing to changes for identity") + identity, ok := rdm.Identities.Get(identityId) + if !ok && !isRouterIdentity { + return fmt.Errorf("identity %s not found", identityId) + } + + subscription := rdm.subscriptions.Upsert(identityId, nil, func(exist bool, valueInMap *IdentitySubscription, newValue *IdentitySubscription) *IdentitySubscription { + if exist { + valueInMap.Listeners.Append(subscriber) + return valueInMap + } + result := &IdentitySubscription{ + IdentityId: identityId, + } + result.Listeners.Append(subscriber) + return result + }) + + if identity != nil { + state := subscription.initialize(rdm, identity) + subscriber.NotifyIdentityEvent(state, EventFullState) + } + + return nil +} + +func (rdm *RouterDataModel) InheritSubscribers(other *RouterDataModel) { + other.subscriptions.IterCb(func(key string, v *IdentitySubscription) { + rdm.subscriptions.Set(key, v) + }) +} + +func (rdm *RouterDataModel) buildServiceList(sub *IdentitySubscription) (map[string]*IdentityService, map[string]*PostureCheck) { + log := pfxlog.Logger().WithField("identityId", sub.IdentityId) + services := map[string]*IdentityService{} + postureChecks := map[string]*PostureCheck{} + + for policyId := range sub.Identity.ServicePolicies { + policy, ok := rdm.ServicePolicies.Get(policyId) + if !ok { + log.WithField("policyId", policyId).Error("could not find service policy") + continue + } + + for serviceId := range policy.Services { + service, ok := rdm.Services.Get(serviceId) + if !ok { + log.WithField("policyId", policyId). + WithField("serviceId", serviceId). + Error("could not find service") + continue + } + + identityService, ok := services[serviceId] + if !ok { + identityService = &IdentityService{ + Service: service, + Configs: map[string]*IdentityConfig{}, + Checks: map[string]struct{}{}, + } + services[serviceId] = identityService + rdm.loadServiceConfigs(sub.Identity, identityService) + rdm.loadServicePostureChecks(sub.Identity, policy, identityService, postureChecks) + } + + if policy.PolicyType == edge_ctrl_pb.PolicyType_BindPolicy { + identityService.BindAllowed = true + } else if policy.PolicyType == edge_ctrl_pb.PolicyType_DialPolicy { + identityService.DialAllowed = true + } + } + } + + return services, postureChecks +} + +func (rdm *RouterDataModel) loadServicePostureChecks(identity *Identity, policy *ServicePolicy, svc *IdentityService, checks map[string]*PostureCheck) { + log := pfxlog.Logger(). + WithField("identityId", identity.Id). + WithField("serviceId", svc.Service.Id). + WithField("policyId", policy.Id) + + for postureCheckId := range policy.PostureChecks { + check, ok := rdm.PostureChecks.Get(postureCheckId) + if !ok { + log.WithField("postureCheckId", postureCheckId).Error("could not find posture check") + } else { + svc.Checks[postureCheckId] = struct{}{} + checks[postureCheckId] = check + } + } +} + +func (rdm *RouterDataModel) loadServiceConfigs(identity *Identity, svc *IdentityService) { + log := pfxlog.Logger(). + WithField("identityId", identity.Id). + WithField("serviceId", svc.Service.Id) + + result := map[string]*IdentityConfig{} + + for _, configId := range svc.Service.Configs { + identityConfig := rdm.loadIdentityConfig(configId, log) + if identityConfig != nil { + result[identityConfig.ConfigType.Name] = identityConfig + } + } + + if serviceConfigs, hasOverride := identity.ServiceConfigs[svc.Service.Id]; hasOverride { + for _, configId := range serviceConfigs.Configs { + identityConfig := rdm.loadIdentityConfig(configId, log) + if identityConfig != nil { + result[identityConfig.ConfigType.Name] = identityConfig + } + } + } + + svc.Configs = result +} + +func (rdm *RouterDataModel) loadIdentityConfig(configId string, log *logrus.Entry) *IdentityConfig { + config, ok := rdm.Configs.Get(configId) + if !ok { + log.WithField("configId", configId).Error("could not find config") + return nil + } + + configType, ok := rdm.ConfigTypes.Get(config.TypeId) + if !ok { + log.WithField("configId", configId). + WithField("configTypeId", config.TypeId). + Error("could not find config type") + return nil + } + + return &IdentityConfig{ + Config: config, + ConfigType: configType, + } +} diff --git a/common/subscriber.go b/common/subscriber.go new file mode 100644 index 000000000..31a0bc11a --- /dev/null +++ b/common/subscriber.go @@ -0,0 +1,324 @@ +/* + Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package common + +import ( + "github.com/michaelquigley/pfxlog" + "github.com/openziti/foundation/v2/concurrenz" + "sync" +) + +type IdentityConfig struct { + Config *Config + ConfigType *ConfigType +} + +type IdentityService struct { + Service *Service + Checks map[string]struct{} + Configs map[string]*IdentityConfig + DialAllowed bool + BindAllowed bool +} + +func (self *IdentityService) Equals(other *IdentityService) bool { + if self.Service.Index != other.Service.Index { + return false + } + + if len(self.Checks) != len(other.Checks) { + return false + } + + if len(self.Configs) != len(other.Configs) { + return false + } + + if self.DialAllowed != other.DialAllowed { + return false + } + + if self.BindAllowed != other.BindAllowed { + return false + } + + for id := range self.Checks { + if _, ok := other.Checks[id]; !ok { + return false + } + } + + for id, config := range self.Configs { + otherConfig, ok := other.Configs[id] + if !ok { + return false + } + if config.Config.Index != otherConfig.Config.Index { + return false + } + if config.ConfigType.Index != otherConfig.ConfigType.Index { + return false + } + } + + return true +} + +type IdentitySubscription struct { + IdentityId string + Identity *Identity + Services map[string]*IdentityService + Listeners concurrenz.CopyOnWriteSlice[IdentityEventSubscriber] + Checks map[string]*PostureCheck + + sync.Mutex +} + +func (self *IdentitySubscription) getState() *IdentityState { + return &IdentityState{ + Identity: self.Identity, + PostureChecks: self.Checks, + Services: self.Services, + } +} + +func (self *IdentitySubscription) identityUpdated(rdm *RouterDataModel, identity *Identity) { + notify := false + present := false + var state *IdentityState + self.Lock() + if self.Identity != nil { + if identity.IdentityIndex > self.Identity.IdentityIndex { + self.Identity = identity + notify = true + } + present = true + state = self.getState() + } + self.Unlock() + + if !present { + for _, subscriber := range self.Listeners.Value() { + subscriber.NotifyIdentityEvent(state, EventFullState) + } + } else if notify { + for _, subscriber := range self.Listeners.Value() { + subscriber.NotifyIdentityEvent(state, EventIdentityUpdated) + } + } +} + +func (self *IdentitySubscription) identityRemoved() { + notify := false + self.Lock() + var state *IdentityState + if self.Identity != nil { + state = self.getState() + self.Identity = nil + self.Checks = nil + self.Services = nil + notify = true + } + self.Unlock() + + if notify { + for _, subscriber := range self.Listeners.Value() { + subscriber.NotifyIdentityEvent(state, EventIdentityDeleted) + } + } +} + +func (self *IdentitySubscription) initialize(rdm *RouterDataModel, identity *Identity) *IdentityState { + self.Lock() + defer self.Unlock() + if self.Identity == nil { + self.Identity = identity + if self.Services == nil { + self.Services, self.Checks = rdm.buildServiceList(self) + } + } + return self.getState() +} + +func (self *IdentitySubscription) checkForChanges(rdm *RouterDataModel) { + self.Lock() + newIdentity, ok := rdm.Identities.Get(self.IdentityId) + notifyRemoved := !ok && self.Identity != nil + oldIdentity := self.Identity + oldServices := self.Services + oldChecks := self.Checks + self.Identity = newIdentity + if ok { + self.Services, self.Checks = rdm.buildServiceList(self) + } + newServices := self.Services + newChecks := self.Checks + self.Unlock() + + if notifyRemoved { + state := &IdentityState{ + Identity: oldIdentity, + PostureChecks: oldChecks, + Services: oldServices, + } + for _, subscriber := range self.Listeners.Value() { + subscriber.NotifyIdentityEvent(state, EventIdentityDeleted) + } + return + } + + if !ok { + return + } + + state := &IdentityState{ + Identity: newIdentity, + PostureChecks: newChecks, + Services: newServices, + } + + if oldIdentity == nil { + for _, subscriber := range self.Listeners.Value() { + subscriber.NotifyIdentityEvent(state, EventFullState) + } + return + } + + if oldIdentity.IdentityIndex < newIdentity.IdentityIndex { + for _, subscriber := range self.Listeners.Value() { + subscriber.NotifyIdentityEvent(state, EventIdentityUpdated) + } + } + + for svcId, service := range oldServices { + newService, ok := newServices[svcId] + if !ok { + for _, subscriber := range self.Listeners.Value() { + subscriber.NotifyServiceChange(state, service, EventAccessRemoved) + } + } else if !service.Equals(newService) { + for _, subscriber := range self.Listeners.Value() { + subscriber.NotifyServiceChange(state, newService, EventUpdated) + } + } + } + + for svcId, service := range newServices { + if _, ok := oldServices[svcId]; !ok { + for _, subscriber := range self.Listeners.Value() { + subscriber.NotifyServiceChange(state, service, EventAccessGained) + } + } + } + + checksChanged := false + if len(oldChecks) != len(newChecks) { + checksChanged = true + } else { + for checkId, check := range oldChecks { + newCheck, ok := newChecks[checkId] + if !ok { + checksChanged = true + break + } + if check.Index != newCheck.Index { + checksChanged = true + break + } + } + } + + if checksChanged { + for _, subscriber := range self.Listeners.Value() { + subscriber.NotifyIdentityEvent(state, EventPostureChecksUpdated) + } + } +} + +type IdentityEventType byte + +type ServiceEventType byte + +const ( + EventAccessGained ServiceEventType = 1 + EventUpdated ServiceEventType = 2 + EventAccessRemoved ServiceEventType = 3 + + EventFullState IdentityEventType = 4 + EventIdentityUpdated IdentityEventType = 5 + EventPostureChecksUpdated IdentityEventType = 6 + EventIdentityDeleted IdentityEventType = 7 +) + +type IdentityState struct { + Identity *Identity + PostureChecks map[string]*PostureCheck + Services map[string]*IdentityService +} + +type IdentityEventSubscriber interface { + NotifyIdentityEvent(state *IdentityState, eventType IdentityEventType) + NotifyServiceChange(state *IdentityState, service *IdentityService, eventType ServiceEventType) +} + +type subscriberEvent interface { + process(rdm *RouterDataModel) +} + +type identityRemoveEvent struct { + identityId string +} + +func (self identityRemoveEvent) process(rdm *RouterDataModel) { + if sub, found := rdm.subscriptions.Get(self.identityId); found { + sub.identityRemoved() + } +} + +type identityCreatedEvent struct { + identity *Identity +} + +func (self identityCreatedEvent) process(rdm *RouterDataModel) { + pfxlog.Logger().WithField("subs", rdm.subscriptions.Count()).WithField("identityId", self.identity.Id).Info("handling identity created event") + + if sub, found := rdm.subscriptions.Get(self.identity.Id); found { + state := sub.initialize(rdm, self.identity) + for _, subscriber := range sub.Listeners.Value() { + subscriber.NotifyIdentityEvent(state, EventFullState) + } + } +} + +type identityUpdatedEvent struct { + identity *Identity +} + +func (self identityUpdatedEvent) process(rdm *RouterDataModel) { + if sub, found := rdm.subscriptions.Get(self.identity.Id); found { + sub.identityUpdated(rdm, self.identity) + } +} + +type syncAllSubscribersEvent struct{} + +func (self syncAllSubscribersEvent) process(rdm *RouterDataModel) { + pfxlog.Logger().WithField("subs", rdm.subscriptions.Count()).Info("sync all subscribers") + rdm.subscriptions.IterCb(func(key string, v *IdentitySubscription) { + v.checkForChanges(rdm) + }) +} diff --git a/common/version/info.go b/common/version/info.go index 56a33effa..1780f5016 100644 --- a/common/version/info.go +++ b/common/version/info.go @@ -39,10 +39,6 @@ func (c cmdBuildInfo) BuildDate() string { return BuildDate } -func (c cmdBuildInfo) Branch() string { - return Branch -} - func (c cmdBuildInfo) AsVersionInfo() *versions.VersionInfo { return &versions.VersionInfo{ Version: c.Version(), @@ -57,23 +53,6 @@ func GetCmdBuildInfo() versions.VersionProvider { return cmdBuildInfo{} } -func GetBuildMetadata(verbose bool) string { - if !verbose { - return GetVersion() - } - str := - "\n\t" + "Version: " + GetVersion() + - "\n\t" + "Build Date: " + GetBuildDate() + - "\n\t" + "Git Branch: " + GetBranch() + - "\n\t" + "Git SHA: " + GetRevision() + - "\n\t" + "Go Version: " + GetGoVersion() + - "\n\t" + "OS: " + GetOS() + - "\n\t" + "Arch: " + GetArchitecture() + - "\n" - - return str -} - func GetVersion() string { return Version } @@ -82,10 +61,6 @@ func GetRevision() string { return Revision } -func GetBranch() string { - return Branch -} - func GetBuildDate() string { return BuildDate } diff --git a/common/version/info_generated.go b/common/version/info_generated.go index bb6b6fbc2..65413b843 100644 --- a/common/version/info_generated.go +++ b/common/version/info_generated.go @@ -5,7 +5,5 @@ package version var ( Version = "v0.0.0" Revision = "local" - Branch = "local" - BuildUser = "local" BuildDate = "2020-01-01 01:01:01" ) diff --git a/controller/api_impl/management-api.go b/controller/api_impl/management-api.go index 552b390fe..4e003f4a8 100644 --- a/controller/api_impl/management-api.go +++ b/controller/api_impl/management-api.go @@ -24,14 +24,15 @@ import ( "github.com/michaelquigley/pfxlog" "github.com/openziti/channel/v2" "github.com/openziti/channel/v2/websockets" + "github.com/openziti/foundation/v2/concurrenz" + "github.com/openziti/identity" + "github.com/openziti/xweb/v2" "github.com/openziti/ziti/controller/handler_mgmt" "github.com/openziti/ziti/controller/network" - "github.com/openziti/ziti/controller/xmgmt" "github.com/openziti/ziti/controller/rest_client" "github.com/openziti/ziti/controller/rest_server" "github.com/openziti/ziti/controller/rest_server/operations" - "github.com/openziti/identity" - "github.com/openziti/xweb/v2" + "github.com/openziti/ziti/controller/xmgmt" "net/http" "strings" ) @@ -46,14 +47,15 @@ type ManagementApiFactory struct { InitFunc func(managementApi *ManagementApiHandler) error network *network.Network nodeId identity.Identity - xmgmts []xmgmt.Xmgmt + xmgmts *concurrenz.CopyOnWriteSlice[xmgmt.Xmgmt] } func (factory *ManagementApiFactory) Validate(_ *xweb.InstanceConfig) error { return nil } -func NewManagementApiFactory(nodeId identity.Identity, network *network.Network, xmgmts []xmgmt.Xmgmt) *ManagementApiFactory { +func NewManagementApiFactory(nodeId identity.Identity, network *network.Network, xmgmts *concurrenz.CopyOnWriteSlice[xmgmt.Xmgmt]) *ManagementApiFactory { + pfxlog.Logger().Infof("initializing management api factory with %d xmgmt instances", len(xmgmts.Value())) return &ManagementApiFactory{ network: network, nodeId: nodeId, diff --git a/controller/api_impl/metrics-api.go b/controller/api_impl/metrics-api.go index 151d9e7ad..4bd9d2d70 100644 --- a/controller/api_impl/metrics-api.go +++ b/controller/api_impl/metrics-api.go @@ -23,10 +23,9 @@ import ( "errors" "fmt" "github.com/michaelquigley/pfxlog" - "github.com/openziti/ziti/controller/network" - "github.com/openziti/ziti/controller/xmgmt" "github.com/openziti/identity" "github.com/openziti/xweb/v2" + "github.com/openziti/ziti/controller/network" "net/http" "os" "strings" @@ -37,18 +36,16 @@ var _ xweb.ApiHandlerFactory = &MetricsApiFactory{} type MetricsApiFactory struct { network *network.Network nodeId identity.Identity - xmgmts []xmgmt.Xmgmt } func (factory *MetricsApiFactory) Validate(_ *xweb.InstanceConfig) error { return nil } -func NewMetricsApiFactory(nodeId identity.Identity, network *network.Network, xmgmts []xmgmt.Xmgmt) *MetricsApiFactory { +func NewMetricsApiFactory(nodeId identity.Identity, network *network.Network) *MetricsApiFactory { return &MetricsApiFactory{ network: network, nodeId: nodeId, - xmgmts: xmgmts, } } diff --git a/controller/controller.go b/controller/controller.go index 82131540d..92bc4b51f 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -22,6 +22,7 @@ import ( "crypto/x509" "encoding/json" "fmt" + "github.com/openziti/foundation/v2/concurrenz" "github.com/openziti/transport/v2" "github.com/openziti/transport/v2/tls" "github.com/openziti/ziti/common/capabilities" @@ -76,7 +77,7 @@ type Controller struct { localDispatcher *command.LocalDispatcher ctrlConnectHandler *handler_ctrl.ConnectHandler xctrls []xctrl.Xctrl - xmgmts []xmgmt.Xmgmt + xmgmts concurrenz.CopyOnWriteSlice[xmgmt.Xmgmt] xwebFactoryRegistry xweb.Registry xweb xweb.Instance @@ -292,11 +293,11 @@ func (c *Controller) initWeb() { logrus.WithError(err).Fatalf("failed to create health checks api factory") } - if err := c.xweb.GetRegistry().Add(api_impl.NewManagementApiFactory(c.config.Id, c.network, c.xmgmts)); err != nil { + if err := c.xweb.GetRegistry().Add(api_impl.NewManagementApiFactory(c.config.Id, c.network, &c.xmgmts)); err != nil { logrus.WithError(err).Fatalf("failed to create management api factory") } - if err := c.xweb.GetRegistry().Add(api_impl.NewMetricsApiFactory(c.config.Id, c.network, c.xmgmts)); err != nil { + if err := c.xweb.GetRegistry().Add(api_impl.NewMetricsApiFactory(c.config.Id, c.network)); err != nil { logrus.WithError(err).Fatalf("failed to create metrics api factory") } @@ -487,8 +488,9 @@ func (c *Controller) RegisterXmgmt(x xmgmt.Xmgmt) error { if err := c.config.Configure(x); err != nil { return err } + pfxlog.Logger().Infof("adding xmgmt %T, enabled? %v", x, x.Enabled()) if x.Enabled() { - c.xmgmts = append(c.xmgmts, x) + c.xmgmts.Append(x) } return nil } diff --git a/controller/db/config_store.go b/controller/db/config_store.go index 1f34d73ab..32850c36f 100644 --- a/controller/db/config_store.go +++ b/controller/db/config_store.go @@ -17,6 +17,7 @@ package db import ( + "fmt" "github.com/openziti/foundation/v2/errorz" "github.com/openziti/storage/ast" "github.com/openziti/storage/boltz" @@ -139,13 +140,7 @@ func (store *configStoreImpl) DeleteById(ctx boltz.MutateContext, id string) err } identityId := keys[0] serviceId := keys[1] - err = store.stores.identity.removeServiceConfigs(ctx.Tx(), identityId, func(identityServiceId, _, configId string) bool { - return identityServiceId == serviceId && configId == id - }) - if err != nil { - mapCtx.SetError(err) - return - } + mapCtx.SetError(fmt.Errorf("config is in use by identity %s for service %s", identityId, serviceId)) }) if err != nil { return err diff --git a/controller/db/external_jwt_signer_store.go b/controller/db/external_jwt_signer_store.go index 71a968708..264ec2615 100644 --- a/controller/db/external_jwt_signer_store.go +++ b/controller/db/external_jwt_signer_store.go @@ -74,6 +74,7 @@ func (entity *ExternalJwtSigner) GetEntityType() string { var _ ExternalJwtSignerStore = (*externalJwtSignerStoreImpl)(nil) type ExternalJwtSignerStore interface { + NameIndexed Store[*ExternalJwtSigner] } @@ -96,6 +97,10 @@ type externalJwtSignerStoreImpl struct { issuerIndex boltz.ReadIndex } +func (store *externalJwtSignerStoreImpl) GetNameIndex() boltz.ReadIndex { + return store.indexName +} + func (store *externalJwtSignerStoreImpl) initializeLocal() { store.AddExtEntitySymbols() store.indexName = store.addUniqueNameField() diff --git a/controller/db/identity_store.go b/controller/db/identity_store.go index 0901aeb9b..d6ebad001 100644 --- a/controller/db/identity_store.go +++ b/controller/db/identity_store.go @@ -92,25 +92,26 @@ type SdkInfo struct { type Identity struct { boltz.BaseExtEntity - Name string `json:"name"` - IdentityTypeId string `json:"identityTypeId"` - IsDefaultAdmin bool `json:"isDefaultAdmin"` - IsAdmin bool `json:"isAdmin"` - Enrollments []string `json:"enrollments"` - Authenticators []string `json:"authenticators"` - RoleAttributes []string `json:"roleAttributes"` - SdkInfo *SdkInfo `json:"sdkInfo"` - EnvInfo *EnvInfo `json:"envInfo"` - DefaultHostingPrecedence ziti.Precedence `json:"defaultHostingPrecedence"` - DefaultHostingCost uint16 `json:"defaultHostingCost"` - ServiceHostingPrecedences map[string]ziti.Precedence `json:"serviceHostingPrecedences"` - ServiceHostingCosts map[string]uint16 `json:"serviceHostingCosts"` - AppData map[string]interface{} `json:"appData"` - AuthPolicyId string `json:"authPolicyId"` - ExternalId *string `json:"externalId"` - DisabledAt *time.Time `json:"disabledAt"` - DisabledUntil *time.Time `json:"disabledUntil"` - Disabled bool `json:"disabled"` + Name string `json:"name"` + IdentityTypeId string `json:"identityTypeId"` + IsDefaultAdmin bool `json:"isDefaultAdmin"` + IsAdmin bool `json:"isAdmin"` + Enrollments []string `json:"enrollments"` + Authenticators []string `json:"authenticators"` + RoleAttributes []string `json:"roleAttributes"` + SdkInfo *SdkInfo `json:"sdkInfo"` + EnvInfo *EnvInfo `json:"envInfo"` + DefaultHostingPrecedence ziti.Precedence `json:"defaultHostingPrecedence"` + DefaultHostingCost uint16 `json:"defaultHostingCost"` + ServiceHostingPrecedences map[string]ziti.Precedence `json:"serviceHostingPrecedences"` + ServiceHostingCosts map[string]uint16 `json:"serviceHostingCosts"` + AppData map[string]interface{} `json:"appData"` + AuthPolicyId string `json:"authPolicyId"` + ExternalId *string `json:"externalId"` + DisabledAt *time.Time `json:"disabledAt"` + DisabledUntil *time.Time `json:"disabledUntil"` + Disabled bool `json:"disabled"` + ServiceConfigs map[string]map[string]string `json:"serviceConfigs"` } func (entity *Identity) GetEntityType() string { @@ -121,11 +122,6 @@ func (entity *Identity) GetName() string { return entity.Name } -type ServiceConfig struct { - ServiceId string - ConfigId string -} - var identityFieldMappings = map[string]string{FieldIdentityType: "identityTypeId"} var _ IdentityStore = (*identityStoreImpl)(nil) @@ -137,9 +133,6 @@ type IdentityStore interface { GetRoleAttributesIndex() boltz.SetReadIndex GetRoleAttributesCursorProvider(values []string, semantic string) (ast.SetCursorProvider, error) - AssignServiceConfigs(tx *bbolt.Tx, identityId string, serviceConfigs ...ServiceConfig) error - RemoveServiceConfigs(tx *bbolt.Tx, identityId string, serviceConfigs ...ServiceConfig) error - GetServiceConfigs(tx *bbolt.Tx, identityId string) ([]ServiceConfig, error) LoadServiceConfigsByServiceAndType(tx *bbolt.Tx, identityId string, configTypes map[string]struct{}) map[string]map[string]map[string]interface{} GetIdentityServicesCursorProvider(identityId string) ast.SetCursorProvider } @@ -273,6 +266,34 @@ func (store *identityStoreImpl) FillEntity(entity *Identity, bucket *boltz.Typed for k, v := range bucket.GetMap(FieldIdentityServiceHostingCosts) { entity.ServiceHostingCosts[k] = uint16(v.(int32)) } + + store.fillServiceConfig(entity, bucket) +} + +func (store *identityStoreImpl) fillServiceConfig(entity *Identity, entityBucket *boltz.TypedBucket) { + configsBucket := entityBucket.GetBucket(FieldIdentityServiceConfigs) + if configsBucket != nil { + servicesCursor := configsBucket.Cursor() + for sKey, _ := servicesCursor.First(); sKey != nil; sKey, _ = servicesCursor.Next() { + serviceMap := map[string]string{} + serviceId := string(sKey) + serviceBucket := configsBucket.GetBucket(serviceId) + if serviceBucket != nil { + cursor := serviceBucket.Cursor() + for k, v := cursor.First(); k != nil; k, v = cursor.Next() { + configType := string(k) + configId := *boltz.FieldToString(boltz.GetTypeAndValue(v)) + serviceMap[configType] = configId + } + } + if len(serviceMap) > 0 { + if entity.ServiceConfigs == nil { + entity.ServiceConfigs = map[string]map[string]string{} + } + entity.ServiceConfigs[serviceId] = serviceMap + } + } + } } func (store *identityStoreImpl) PersistEntity(entity *Identity, ctx *boltz.PersistContext) { @@ -360,6 +381,115 @@ func (store *identityStoreImpl) PersistEntity(entity *Identity, ctx *boltz.Persi if ctx.IsCreate && len(entity.RoleAttributes) == 0 { store.rolesChanged(ctx.MutateContext, []byte(entity.Id), nil, nil, ctx.Bucket) } + + store.persistServiceConfigs(entity, ctx) +} + +func (store *identityStoreImpl) persistServiceConfigs(entity *Identity, ctx *boltz.PersistContext) { + if !ctx.ProceedWithSet(FieldIdentityServiceConfigs) { + return + } + + entityBucket := ctx.Bucket + + configsBucket := entityBucket.GetOrCreateBucket(FieldIdentityServiceConfigs) + if configsBucket.HasError() { + return + } + + var serviceEvents []*ServiceEvent + + foundServices := map[string]struct{}{} + + servicesCursor := configsBucket.Cursor() + for sKey, _ := servicesCursor.First(); sKey != nil; sKey, _ = servicesCursor.Next() { + serviceId := string(sKey) + serviceMap := map[string]string{} + foundServices[serviceId] = struct{}{} + serviceBucket := configsBucket.GetOrCreateBucket(serviceId) + + cursor := serviceBucket.Cursor() + for k, v := cursor.First(); k != nil; k, v = cursor.Next() { + configType := string(k) + configId := *boltz.FieldToString(boltz.GetTypeAndValue(v)) + serviceMap[configType] = configId + } + + serviceUpdated := false + updated, serviceFound := entity.ServiceConfigs[serviceId] + + for configType, configId := range serviceMap { + newConfigId, configTypeFound := updated[configType] + if !configTypeFound || configId != newConfigId { + // un-index old value + if err := store.stores.config.identityServicesLinks.RemoveCompoundLink(ctx.Tx(), configId, ss(entity.Id, serviceId)); err != nil { + ctx.Bucket.SetError(err) + return + } + serviceUpdated = true + } + if !configTypeFound { + serviceBucket.DeleteValue([]byte(configType)) + } + } + + for configType, configId := range updated { + oldConfigId, ok := serviceMap[configType] + if !ok || configId != oldConfigId { + serviceUpdated = true + // set new value + serviceBucket.SetString(configType, configId, nil) + + // index new value + if err := store.stores.config.identityServicesLinks.AddCompoundLink(ctx.Tx(), configId, ss(entity.Id, serviceId)); err != nil { + serviceBucket.SetError(err) + return + } + } + } + + if !serviceFound { + // no overrides for service, delete existing + configsBucket.DeleteEntity(serviceId) + } + + if serviceUpdated { + serviceEvents = append(serviceEvents, &ServiceEvent{ + Type: ServiceUpdated, + IdentityId: entity.Id, + ServiceId: serviceId, + }) + } + } + + // handle new service mappings + for serviceId, configMappings := range entity.ServiceConfigs { + if _, ok := foundServices[serviceId]; ok { + continue + } + + serviceBucket := configsBucket.GetOrCreateBucket(serviceId) + for configType, configId := range configMappings { + // set new value + serviceBucket.SetString(configType, configId, nil) + + // index new value + if err := store.stores.config.identityServicesLinks.AddCompoundLink(ctx.Tx(), configId, ss(entity.Id, serviceId)); err != nil { + serviceBucket.SetError(err) + return + } + } + + serviceEvents = append(serviceEvents, &ServiceEvent{ + Type: ServiceUpdated, + IdentityId: entity.Id, + ServiceId: serviceId, + }) + } + + ctx.Tx().OnCommit(func() { + ServiceEvents.dispatchEventsAsync(serviceEvents) + }) } func (store *identityStoreImpl) rolesChanged(mutateCtx boltz.MutateContext, rowId []byte, _ []boltz.FieldTypeAndValue, new []boltz.FieldTypeAndValue, holder errorz.ErrorHolder) { @@ -433,98 +563,6 @@ func (store *identityStoreImpl) DeleteById(ctx boltz.MutateContext, id string) e return store.baseStore.DeleteById(ctx, id) } -func (store *identityStoreImpl) AssignServiceConfigs(tx *bbolt.Tx, identityId string, serviceConfigs ...ServiceConfig) error { - entityBucket := store.GetEntityBucket(tx, []byte(identityId)) - if entityBucket == nil { - return boltz.NewNotFoundError(store.GetSingularEntityType(), "id", identityId) - } - configsBucket := entityBucket.GetOrCreateBucket(FieldIdentityServiceConfigs) - if configsBucket.HasError() { - return configsBucket.GetError() - } - configTypes := map[string]struct{}{} - for _, serviceConfig := range serviceConfigs { - config, err := store.stores.config.LoadById(tx, serviceConfig.ConfigId) - if err != nil { - return err - } - - if _, ok := configTypes[config.Type]; ok { - return errors.Errorf("multiple service configs provided for identity %v of config type %v", identityId, config.Type) - } - configTypes[config.Type] = struct{}{} - - serviceBucket := configsBucket.GetOrCreateBucket(serviceConfig.ServiceId) - if serviceBucket.HasError() { - return serviceBucket.GetError() - } - - // un-index old value - if currentConfigId := serviceBucket.GetString(config.Type); currentConfigId != nil { - if err := store.stores.config.identityServicesLinks.RemoveCompoundLink(tx, *currentConfigId, ss(identityId, serviceConfig.ServiceId)); err != nil { - return err - } - } - // set new value - if serviceBucket.SetString(config.Type, config.Id, nil).HasError() { - return serviceBucket.GetError() - } - - // index new value - if err := store.stores.config.identityServicesLinks.AddCompoundLink(tx, config.Id, ss(identityId, serviceConfig.ServiceId)); err != nil { - return err - } - } - - var serviceEvents []*ServiceEvent - - for _, serviceConfig := range serviceConfigs { - serviceEvents = append(serviceEvents, &ServiceEvent{ - Type: ServiceUpdated, - IdentityId: identityId, - ServiceId: serviceConfig.ServiceId, - }) - } - - tx.OnCommit(func() { - ServiceEvents.dispatchEventsAsync(serviceEvents) - }) - - return nil -} - -func (store *identityStoreImpl) RemoveServiceConfigs(tx *bbolt.Tx, identityId string, serviceConfigs ...ServiceConfig) error { - // could make this more efficient with maps, but only necessary if we have large number of overrides, which seems unlikely - // optimize later, if necessary - result := store.removeServiceConfigs(tx, identityId, func(serviceId, _, configId string) bool { - if len(serviceConfigs) == 0 { - return true - } - for _, config := range serviceConfigs { - if config.ServiceId == serviceId && config.ConfigId == configId { - return true - } - } - return false - }) - - var serviceEvents []*ServiceEvent - - for _, serviceConfig := range serviceConfigs { - serviceEvents = append(serviceEvents, &ServiceEvent{ - Type: ServiceUpdated, - IdentityId: identityId, - ServiceId: serviceConfig.ServiceId, - }) - } - - tx.OnCommit(func() { - ServiceEvents.dispatchEventsAsync(serviceEvents) - }) - - return result -} - func (store *identityStoreImpl) removeServiceConfigs(tx *bbolt.Tx, identityId string, removeFilter func(serviceId, configTypeId, configId string) bool) error { entityBucket := store.GetEntityBucket(tx, []byte(identityId)) if entityBucket == nil { @@ -561,35 +599,6 @@ func (store *identityStoreImpl) removeServiceConfigs(tx *bbolt.Tx, identityId st return nil } -func (store *identityStoreImpl) GetServiceConfigs(tx *bbolt.Tx, identityId string) ([]ServiceConfig, error) { - entityBucket := store.GetEntityBucket(tx, []byte(identityId)) - if entityBucket == nil { - return nil, boltz.NewNotFoundError(store.GetSingularEntityType(), "id", identityId) - } - var result []ServiceConfig - configsBucket := entityBucket.GetBucket(FieldIdentityServiceConfigs) - if configsBucket == nil { - // no service configs found, nothing to do, bail out - return result, nil - } - - servicesCursor := configsBucket.Cursor() - for sKey, _ := servicesCursor.First(); sKey != nil; sKey, _ = servicesCursor.Next() { - serviceId := string(sKey) - serviceBucket := configsBucket.GetBucket(serviceId) - if serviceBucket == nil { - // doesn't exist, nothing to do, continue - continue - } - cursor := serviceBucket.Cursor() - for k, v := cursor.First(); k != nil; k, v = cursor.Next() { - configId := *boltz.FieldToString(boltz.GetTypeAndValue(v)) - result = append(result, ServiceConfig{ServiceId: serviceId, ConfigId: configId}) - } - } - return result, nil -} - func (store *identityStoreImpl) LoadServiceConfigsByServiceAndType(tx *bbolt.Tx, identityId string, configTypes map[string]struct{}) map[string]map[string]map[string]interface{} { if len(configTypes) == 0 { return nil diff --git a/controller/db/identity_store_test.go b/controller/db/identity_store_test.go index db35c7c5d..f0d2b5fb7 100644 --- a/controller/db/identity_store_test.go +++ b/controller/db/identity_store_test.go @@ -1,12 +1,11 @@ package db import ( - "fmt" + "github.com/google/go-cmp/cmp" "github.com/openziti/storage/boltz" "github.com/openziti/storage/boltztest" "github.com/openziti/ziti/common/eid" "github.com/openziti/ziti/controller/change" - "github.com/pkg/errors" "go.etcd.io/bbolt" "testing" ) @@ -20,19 +19,22 @@ func Test_IdentityStore(t *testing.T) { } func (ctx *TestContext) testIdentityServiceConfigs(_ *testing.T) { - service := ctx.RequireNewService(eid.New()) + service1 := ctx.RequireNewService(eid.New()) + service2 := ctx.RequireNewService(eid.New()) identity := ctx.RequireNewIdentity(eid.New(), false) + boltztest.RequireReload(ctx, identity) + boltztest.ValidateBaseline(ctx, identity) clientConfigTypeId := "" err := ctx.GetDb().View(func(tx *bbolt.Tx) error { - clientConfigTypeId = string(ctx.stores.ConfigType.GetNameIndex().Read(tx, []byte("ziti-tunneler-client.v1"))) + clientConfigTypeId = string(ctx.stores.ConfigType.GetNameIndex().Read(tx, []byte("intercept.v1"))) return nil }) ctx.NoError(err) serverConfigTypeId := "" err = ctx.GetDb().View(func(tx *bbolt.Tx) error { - serverConfigTypeId = string(ctx.stores.ConfigType.GetNameIndex().Read(tx, []byte("ziti-tunneler-server.v1"))) + serverConfigTypeId = string(ctx.stores.ConfigType.GetNameIndex().Read(tx, []byte("host.v1"))) return nil }) ctx.NoError(err) @@ -57,127 +59,116 @@ func (ctx *TestContext) testIdentityServiceConfigs(_ *testing.T) { mutateCtx := change.New().NewMutateContext() err = ctx.GetDb().Update(mutateCtx, func(mutateCtx boltz.MutateContext) error { - err := ctx.stores.Identity.AssignServiceConfigs(mutateCtx.Tx(), identity.Id, - ServiceConfig{ServiceId: service.Id, ConfigId: config.Id}, - ServiceConfig{ServiceId: service.Id, ConfigId: config2.Id}) - ctx.EqualError(err, fmt.Sprintf("multiple service configs provided for identity %v of config type %v", identity.Id, clientConfigTypeId)) - return nil + identity.ServiceConfigs = map[string]map[string]string{ + service1.Id: { + config.Type: config.Id, + config3.Type: config3.Id, + }, + } + return ctx.stores.Identity.Update(mutateCtx, identity, boltz.MapFieldChecker{ + FieldIdentityServiceConfigs: struct{}{}, + }) }) ctx.NoError(err) + ctx.validateServiceConfigs(identity) mutateCtx = change.New().NewMutateContext() - err = ctx.GetDb().Update(mutateCtx, func(mutateCtx boltz.MutateContext) error { - tx := mutateCtx.Tx() - err := ctx.stores.Identity.AssignServiceConfigs(tx, identity.Id, ServiceConfig{ServiceId: service.Id, ConfigId: config.Id}) - ctx.NoError(err) - + err = ctx.GetDb().View(func(tx *bbolt.Tx) error { serviceConfigs := ctx.getServiceConfigs(tx, identity.Id, "all") ctx.Equal(1, len(serviceConfigs)) - serviceMap, ok := serviceConfigs[service.Id] + serviceMap, ok := serviceConfigs[service1.Id] ctx.True(ok) - ctx.Equal(1, len(serviceMap)) - _, ok = serviceMap[config.Type] + ctx.Equal(2, len(serviceMap)) + cfg, ok := serviceMap[config.Type] ctx.True(ok) + ctx.Equal(config.Data, cfg) - identityServices := ctx.getIdentityServices(tx, config.Id) - ctx.Equal(1, len(identityServices)) - ctx.Equal(identity.Id, identityServices[0].identityId) - ctx.Equal(service.Id, identityServices[0].serviceId) + cfg, ok = serviceMap[config3.Type] + ctx.True(ok) + ctx.Equal(config3.Data, cfg) return nil }) ctx.NoError(err) - mutateCtx = change.New().NewMutateContext() err = ctx.GetDb().Update(mutateCtx, func(mutateCtx boltz.MutateContext) error { - tx := mutateCtx.Tx() - err := ctx.stores.Identity.RemoveServiceConfigs(tx, identity.Id, ServiceConfig{ServiceId: service.Id, ConfigId: config.Id}) - ctx.NoError(err) - - serviceConfigs := ctx.getServiceConfigs(tx, identity.Id, "all") - ctx.Equal(0, len(serviceConfigs)) + identity.ServiceConfigs = map[string]map[string]string{ + service2.Id: { + config.Type: config.Id, + config3.Type: config3.Id, + }, + } - identityServices := ctx.getIdentityServices(tx, config.Id) - ctx.Equal(0, len(identityServices)) - return nil + return ctx.stores.Identity.Update(mutateCtx, identity, boltz.MapFieldChecker{ + FieldIdentityServiceConfigs: struct{}{}, + }) }) - ctx.NoError(err) - boltztest.RequireDelete(ctx, config) - err = ctx.GetDb().View(func(tx *bbolt.Tx) error { - serviceConfigs := ctx.getServiceConfigs(tx, identity.Id, "all") - ctx.Equal(0, len(serviceConfigs)) - return nil - }) ctx.NoError(err) - - boltztest.RequireCreate(ctx, config) + ctx.validateServiceConfigs(identity) mutateCtx = change.New().NewMutateContext() - err = ctx.GetDb().Update(mutateCtx, func(mutateCtx boltz.MutateContext) error { - tx := mutateCtx.Tx() - err := ctx.stores.Identity.AssignServiceConfigs(tx, identity.Id, - ServiceConfig{ServiceId: service.Id, ConfigId: config.Id}, - ServiceConfig{ServiceId: service.Id, ConfigId: config3.Id}) - ctx.NoError(err) - + err = ctx.GetDb().View(func(tx *bbolt.Tx) error { serviceConfigs := ctx.getServiceConfigs(tx, identity.Id, "all") ctx.Equal(1, len(serviceConfigs)) - serviceMap, ok := serviceConfigs[service.Id] + serviceMap, ok := serviceConfigs[service2.Id] ctx.True(ok) ctx.Equal(2, len(serviceMap)) - _, ok = serviceMap[config.Type] - ctx.True(ok) - _, ok = serviceMap[config3.Type] + cfg, ok := serviceMap[config.Type] ctx.True(ok) + ctx.Equal(config.Data, cfg) - serviceConfigs = ctx.getServiceConfigs(tx, identity.Id, serverConfigTypeId) - ctx.Equal(1, len(serviceConfigs)) - serviceMap, ok = serviceConfigs[service.Id] + cfg, ok = serviceMap[config3.Type] ctx.True(ok) - ctx.Equal(1, len(serviceMap)) - _, ok = serviceMap[config3.Type] - ctx.True(ok) - - identityServices := ctx.getIdentityServices(tx, config.Id) - ctx.Equal(1, len(identityServices)) - ctx.Equal(identity.Id, identityServices[0].identityId) - ctx.Equal(service.Id, identityServices[0].serviceId) + ctx.Equal(config3.Data, cfg) return nil }) + ctx.NoError(err) - boltztest.RequireDelete(ctx, identity) + err = ctx.GetDb().Update(mutateCtx, func(mutateCtx boltz.MutateContext) error { + identity.ServiceConfigs = map[string]map[string]string{ + service2.Id: { + config.Type: config2.Id, + }, + } + + return ctx.stores.Identity.Update(mutateCtx, identity, boltz.MapFieldChecker{ + FieldIdentityServiceConfigs: struct{}{}, + }) + }) + + ctx.NoError(err) + ctx.validateServiceConfigs(identity) err = ctx.GetDb().View(func(tx *bbolt.Tx) error { - identityServices := ctx.getIdentityServices(tx, config.Id) - ctx.Equal(0, len(identityServices)) + serviceConfigs := ctx.getServiceConfigs(tx, identity.Id, "all") + ctx.Equal(1, len(serviceConfigs)) + serviceMap, ok := serviceConfigs[service2.Id] + ctx.True(ok) + ctx.Equal(1, len(serviceMap)) + cfg, ok := serviceMap[config.Type] + ctx.True(ok) + ctx.Equal(config2.Data, cfg) - identityServices = ctx.getIdentityServices(tx, config3.Id) - ctx.Equal(0, len(identityServices)) return nil }) ctx.NoError(err) + } -func (ctx *TestContext) getIdentityServices(tx *bbolt.Tx, configId string) []testIdentityServices { - var result []testIdentityServices - identityServiceSymbol := ctx.stores.Config.GetSymbol(FieldConfigIdentityService).(boltz.EntitySetSymbol) - err := identityServiceSymbol.Map(tx, []byte(configId), func(ctx *boltz.MapContext) { - decoded, err := boltz.DecodeStringSlice(ctx.Value()) - if err != nil { - ctx.SetError(err) - return - } - if len(decoded) != 2 { - ctx.SetError(errors.Errorf("expected 2 fields, got %v", len(decoded))) - } - result = append(result, testIdentityServices{identityId: decoded[0], serviceId: decoded[1]}) - }) - ctx.NoError(err) - return result +func (ctx *TestContext) validateServiceConfigs(identity *Identity) { + compareIdentity := &Identity{ + BaseExtEntity: boltz.BaseExtEntity{ + Id: identity.Id, + }, + } + boltztest.RequireReload(ctx, compareIdentity) + ctx.Require().True(cmp.Equal(identity.ServiceConfigs, compareIdentity.ServiceConfigs), + cmp.Diff(identity.ServiceConfigs, compareIdentity.ServiceConfigs)) + } func (ctx *TestContext) getServiceConfigs(tx *bbolt.Tx, identityId string, configTypes ...string) map[string]map[string]map[string]interface{} { @@ -187,8 +178,3 @@ func (ctx *TestContext) getServiceConfigs(tx *bbolt.Tx, identityId string, confi } return ctx.stores.Identity.LoadServiceConfigsByServiceAndType(tx, identityId, configTypeMap) } - -type testIdentityServices struct { - identityId string - serviceId string -} diff --git a/controller/db/policy_common.go b/controller/db/policy_common.go index 3253266c8..704fb822e 100644 --- a/controller/db/policy_common.go +++ b/controller/db/policy_common.go @@ -106,6 +106,21 @@ func (self *roleAttributeChangeContext) notifyOfPolicyChangeEvent( }) } +func (self *roleAttributeChangeContext) processServicePolicyEvents() { + if len(self.servicePolicyEvents) > 0 { + self.mutateCtx.UpdateContext(func(stateCtx context.Context) context.Context { + eventSlice := self.servicePolicyEvents + currentValue := stateCtx.Value(ServicePolicyEventsKey) + if currentValue != nil { + currentSlice := currentValue.([]*edge_ctrl_pb.DataState_ServicePolicyChange) + eventSlice = append(eventSlice, currentSlice...) + } + return context.WithValue(stateCtx, ServicePolicyEventsKey, eventSlice) + }) + self.servicePolicyEvents = nil + } +} + func (store *baseStore[E]) validateRoleAttributes(attributes []string, holder errorz.ErrorHolder) { for _, attr := range attributes { if strings.HasPrefix(attr, "#") { @@ -194,20 +209,17 @@ func (store *baseStore[E]) updateServicePolicyRelatedRoles(ctx *roleAttributeCha ctx.addServiceUpdatedEvent(store.stores, ctx.tx(), toId) } } - evaluatePolicyAgainstEntity(ctx, semantic, entityId, policyId, ids, roles, entityRoles) - } - if len(ctx.servicePolicyEvents) > 0 { - ctx.mutateCtx.UpdateContext(func(stateCtx context.Context) context.Context { - eventSlice := ctx.servicePolicyEvents - currentValue := stateCtx.Value(ServicePolicyEventsKey) - if currentValue != nil { - currentSlice := currentValue.([]*edge_ctrl_pb.DataState_ServicePolicyChange) - eventSlice = append(eventSlice, currentSlice...) - } - return context.WithValue(stateCtx, ServicePolicyEventsKey, eventSlice) - }) + log := pfxlog.ChannelLogger("policyEval", ctx.rolesSymbol.GetStore().GetSingularEntityType()+"Eval"). + WithFields(logrus.Fields{ + "id": string(policyId), + "semantic": semantic, + "symbol": ctx.rolesSymbol.GetName(), + }) + evaluatePolicyAgainstEntity(ctx, semantic, entityId, policyId, ids, roles, entityRoles, log) } + + ctx.processServicePolicyEvents() } func EvaluatePolicy(ctx *roleAttributeChangeContext, policy Policy, roleAttributesSymbol boltz.EntitySetSymbol) { @@ -221,7 +233,7 @@ func EvaluatePolicy(ctx *roleAttributeChangeContext, policy Policy, roleAttribut log := pfxlog.ChannelLogger("policyEval", ctx.rolesSymbol.GetStore().GetSingularEntityType()+"Eval"). WithFields(logrus.Fields{ - "id": policyId, + "id": policy.GetId(), "semantic": semantic, "symbol": ctx.rolesSymbol.GetName(), }) @@ -245,9 +257,10 @@ func EvaluatePolicy(ctx *roleAttributeChangeContext, policy Policy, roleAttribut for ; cursor.IsValid(); cursor.Next() { entityId := cursor.Current() entityRoleAttributes := roleAttributesSymbol.EvalStringList(ctx.tx(), entityId) - match, change := evaluatePolicyAgainstEntity(ctx, semantic, entityId, policyId, ids, roles, entityRoleAttributes) + match, change := evaluatePolicyAgainstEntity(ctx, semantic, entityId, policyId, ids, roles, entityRoleAttributes, log) log.Tracef("evaluating %v match: %v, change: %v", string(entityId), match, change) } + ctx.processServicePolicyEvents() } func validateEntityIds(tx *bbolt.Tx, store boltz.Store, field string, ids []string) error { @@ -281,21 +294,30 @@ func UpdateRelatedRoles(ctx *roleAttributeChangeContext, entityId []byte, newRol if _, semanticValue := semanticSymbol.Eval(ctx.tx(), policyId); semanticValue != nil { semantic = string(semanticValue) } - evaluatePolicyAgainstEntity(ctx, semantic, entityId, policyId, ids, roles, entityRoles) + + log := pfxlog.ChannelLogger("policyEval", ctx.rolesSymbol.GetStore().GetSingularEntityType()+"Eval"). + WithFields(logrus.Fields{ + "id": string(policyId), + "semantic": semantic, + "symbol": ctx.rolesSymbol.GetName(), + }) + evaluatePolicyAgainstEntity(ctx, semantic, entityId, policyId, ids, roles, entityRoles, log) } + + ctx.processServicePolicyEvents() } -func evaluatePolicyAgainstEntity(ctx *roleAttributeChangeContext, semantic string, entityId, policyId []byte, ids, roles, roleAttributes []string) (bool, bool) { +func evaluatePolicyAgainstEntity(ctx *roleAttributeChangeContext, semantic string, entityId, policyId []byte, ids, roles, roleAttributes []string, log *logrus.Entry) (bool, bool) { if stringz.Contains(ids, string(entityId)) || stringz.Contains(roles, "all") || (strings.EqualFold(semantic, SemanticAllOf) && len(roles) > 0 && stringz.ContainsAll(roleAttributes, roles...)) || (strings.EqualFold(semantic, SemanticAnyOf) && len(roles) > 0 && stringz.ContainsAny(roleAttributes, roles...)) { - return true, ProcessEntityPolicyMatched(ctx, entityId, policyId) + return true, ProcessEntityPolicyMatched(ctx, entityId, policyId, log) } else { - return false, ProcessEntityPolicyUnmatched(ctx, entityId, policyId) + return false, ProcessEntityPolicyUnmatched(ctx, entityId, policyId, log) } } -func ProcessEntityPolicyMatched(ctx *roleAttributeChangeContext, entityId, policyId []byte) bool { +func ProcessEntityPolicyMatched(ctx *roleAttributeChangeContext, entityId, policyId []byte, log *logrus.Entry) bool { // first add it to the denormalize link table from the policy to the entity (ex: service policy -> identity) // If it's already there (in other words, this policy didn't change in relation to the entity, // we don't have any further work to do @@ -303,6 +325,11 @@ func ProcessEntityPolicyMatched(ctx *roleAttributeChangeContext, entityId, polic return false } + if ctx.changeHandler != nil { + log.Tracef("change add handler called for entity %s", entityId) + ctx.changeHandler(policyId, entityId, true) + } + // next iterate over the denormalized link tables going from entity to entity (ex: service -> identity) // If we were added to a policy, we need to update all the link tables for all the entities on the // other side of the policy. If we're the first link, we get added to the link table, otherwise we @@ -315,22 +342,25 @@ func ProcessEntityPolicyMatched(ctx *roleAttributeChangeContext, entityId, polic return false } if ctx.denormChangeHandler != nil && newCount == 1 { + log.Tracef("denorm change add handler called for entity %s -> related entity %s", entityId, relatedEntityId) ctx.denormChangeHandler(entityId, relatedEntityId, true) } - if ctx.changeHandler != nil { - ctx.changeHandler(policyId, entityId, true) - } } return true } -func ProcessEntityPolicyUnmatched(ctx *roleAttributeChangeContext, entityId, policyId []byte) bool { +func ProcessEntityPolicyUnmatched(ctx *roleAttributeChangeContext, entityId, policyId []byte, log *logrus.Entry) bool { // first remove it from the denormalize link table from the policy to the entity (ex: service policy -> identity) // If wasn't there (in other words, this policy didn't change in relation to the entity, we don't have any further work to do if removed, err := ctx.linkCollection.RemoveLink(ctx.tx(), policyId, entityId); ctx.SetError(err) || !removed { return false } + if ctx.changeHandler != nil { + log.Tracef("change remove handler called for entity %s", entityId) + ctx.changeHandler(policyId, entityId, false) + } + // next iterate over the denormalized link tables going from entity to entity (ex: service -> identity) // If we were remove from a policy, we need to update all the link tables for all the entities on the // other side of the policy. If we're the last link, we get removed from the link table, otherwise we @@ -343,11 +373,9 @@ func ProcessEntityPolicyUnmatched(ctx *roleAttributeChangeContext, entityId, pol return false } if ctx.denormChangeHandler != nil && newCount == 0 { + log.Tracef("denorm change remove handler called for entity %s -> related entity %s", entityId, relatedEntityId) ctx.denormChangeHandler(entityId, relatedEntityId, false) } - if ctx.changeHandler != nil { - ctx.changeHandler(policyId, entityId, false) - } } return true } diff --git a/controller/env/appenv.go b/controller/env/appenv.go index f040aa4c2..a820b9c8e 100644 --- a/controller/env/appenv.go +++ b/controller/env/appenv.go @@ -573,6 +573,11 @@ func (ae *AppEnv) ProcessJwt(rc *response.RequestContext, token *jwt.Token) erro } func (ae *AppEnv) FillRequestContext(rc *response.RequestContext) error { + // do no process auth headers on authenticate request + if strings.HasSuffix(rc.Request.URL.Path, "/v1/authenticate") && !strings.HasSuffix(rc.Request.URL.Path, "/authenticate/mfa") { + return nil + } + ztSession := ae.getZtSessionFromRequest(rc.Request) if ztSession != "" { diff --git a/controller/env/broker.go b/controller/env/broker.go index 1d8a832ff..af7dc605c 100644 --- a/controller/env/broker.go +++ b/controller/env/broker.go @@ -88,6 +88,10 @@ func NewBroker(ae *AppEnv, synchronizer RouterSyncStrategy) *Broker { return broker } +func (broker *Broker) ValidateRouterDataModel() []error { + return broker.routerSyncStrategy.Validate() +} + func (broker *Broker) AcceptClusterEvent(clusterEvent *event.ClusterEvent) { if broker.ae.HostController.IsRaftLeader() { if clusterEvent.EventType == event.ClusterPeerConnected { diff --git a/controller/env/sync.go b/controller/env/sync.go index a325fa888..2d8e5eb96 100644 --- a/controller/env/sync.go +++ b/controller/env/sync.go @@ -61,6 +61,7 @@ type RouterSyncStrategy interface { GetPublicKeys() map[string]*edge_ctrl_pb.DataState_PublicKey RouterConnectionHandler RouterSynchronizerEventHandler + Validate() []error } // RouterConnectionHandler is responsible for handling router connect/disconnect for synchronizing state. diff --git a/controller/events/file_logger.go b/controller/events/file_logger.go index 31d1f9698..a85958841 100644 --- a/controller/events/file_logger.go +++ b/controller/events/file_logger.go @@ -56,7 +56,7 @@ func NewFileEventLogger(formatterFactory LoggingHandlerFactory, stdout bool, con } } - var output io.WriteCloser = os.Stdout + var output = &newlineWriter{out: os.Stdout} if !stdout { // allow config to override the max file size diff --git a/controller/handler_edge_mgmt/validate_router_data_model.go b/controller/handler_edge_mgmt/validate_router_data_model.go new file mode 100644 index 000000000..e254ff524 --- /dev/null +++ b/controller/handler_edge_mgmt/validate_router_data_model.go @@ -0,0 +1,166 @@ +/* + Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package handler_edge_mgmt + +import ( + "fmt" + "github.com/michaelquigley/pfxlog" + "github.com/openziti/channel/v2" + "github.com/openziti/channel/v2/protobufs" + "github.com/openziti/foundation/v2/concurrenz" + "github.com/openziti/ziti/common/pb/mgmt_pb" + "github.com/openziti/ziti/controller/env" + "github.com/openziti/ziti/controller/network" + "google.golang.org/protobuf/proto" + "time" +) + +type validateRouterDataModelHandler struct { + appEnv *env.AppEnv +} + +func NewValidateRouterDataModelHandler(appEnv *env.AppEnv) channel.TypedReceiveHandler { + return &validateRouterDataModelHandler{appEnv: appEnv} +} + +func (*validateRouterDataModelHandler) ContentType() int32 { + return int32(mgmt_pb.ContentType_ValidateRouterDataModelRequestType) +} + +func (handler *validateRouterDataModelHandler) getNetwork() *network.Network { + return handler.appEnv.GetHostController().GetNetwork() +} + +func (handler *validateRouterDataModelHandler) HandleReceive(msg *channel.Message, ch channel.Channel) { + log := pfxlog.ContextLogger(ch.Label()) + request := &mgmt_pb.ValidateRouterDataModelRequest{} + + var err error + + var count int64 + var evalF func() + if err = proto.Unmarshal(msg.Body, request); err == nil { + count, evalF, err = handler.ValidateRouterDataModel(request.ValidateCtrl, request.RouterFilter, func(detail *mgmt_pb.RouterDataModelDetails) { + if !ch.IsClosed() { + if sendErr := protobufs.MarshalTyped(detail).WithTimeout(15 * time.Second).SendAndWaitForWire(ch); sendErr != nil { + log.WithError(sendErr).Error("send of router data model detail failed, closing channel") + if closeErr := ch.Close(); closeErr != nil { + log.WithError(closeErr).Error("failed to close channel") + } + } + } else { + log.Info("channel closed, unable to send router data model detail") + } + }) + } else { + log.WithError(err).Error("failed to unmarshal request") + return + } + + response := &mgmt_pb.ValidateRouterDataModelResponse{ + Success: err == nil, + ComponentCount: uint64(count), + } + if err != nil { + response.Message = fmt.Sprintf("%v: failed to unmarshall request: %v", handler.getNetwork().GetAppId(), err) + } + + body, err := proto.Marshal(response) + if err != nil { + pfxlog.Logger().WithError(err).Error("unexpected error serializing ValidateRouterDataModelResponse") + return + } + + responseMsg := channel.NewMessage(int32(mgmt_pb.ContentType_ValidateRouterDataModelResponseType), body) + responseMsg.ReplyTo(msg) + if err = ch.Send(responseMsg); err != nil { + pfxlog.Logger().WithError(err).Error("unexpected error sending ValidateRouterDataModelResponse") + } + + if evalF != nil { + evalF() + } +} + +type RouterDataModelValidationCallback func(detail *mgmt_pb.RouterDataModelDetails) + +func (handler *validateRouterDataModelHandler) ValidateRouterDataModel(includeCtrl bool, filter string, cb RouterDataModelValidationCallback) (int64, func(), error) { + result, err := handler.appEnv.Managers.Router.BaseList(filter) + if err != nil { + return 0, nil, err + } + + sem := concurrenz.NewSemaphore(10) + + evalF := func() { + if includeCtrl { + sem.Acquire() + go func() { + defer sem.Release() + errs := handler.appEnv.Broker.ValidateRouterDataModel() + + var errStrings []string + for _, err := range errs { + errStrings = append(errStrings, err.Error()) + } + + details := &mgmt_pb.RouterDataModelDetails{ + ComponentType: "controller", + ComponentId: handler.getNetwork().GetAppId(), + ComponentName: handler.getNetwork().GetAppId(), + ValidateSuccess: len(errs) == 0, + Errors: errStrings, + } + cb(details) + }() + } + for _, router := range result.Entities { + connectedRouter := handler.appEnv.GetHostController().GetNetwork().GetConnectedRouter(router.Id) + if connectedRouter != nil { + sem.Acquire() + go func() { + defer sem.Release() + + details := &mgmt_pb.RouterDataModelDetails{ + ComponentType: "router", + ComponentId: router.Id, + ComponentName: router.Name, + ValidateSuccess: false, + Errors: []string{"not yet implemented"}, + } + cb(details) + }() + } else { + details := &mgmt_pb.RouterDataModelDetails{ + ComponentType: "router", + ComponentId: router.Id, + ComponentName: router.Name, + ValidateSuccess: false, + Errors: []string{"router not connected to controller"}, + } + cb(details) + } + } + } + + count := int64(len(result.Entities)) + if includeCtrl { + count++ + } + + return count, evalF, nil +} diff --git a/controller/handler_mgmt/bind.go b/controller/handler_mgmt/bind.go index 2c9837ee4..ca18d3bed 100644 --- a/controller/handler_mgmt/bind.go +++ b/controller/handler_mgmt/bind.go @@ -18,6 +18,7 @@ package handler_mgmt import ( "github.com/openziti/channel/v2" + "github.com/openziti/foundation/v2/concurrenz" "github.com/openziti/ziti/common/trace" "github.com/openziti/ziti/controller/network" "github.com/openziti/ziti/controller/xmgmt" @@ -25,10 +26,10 @@ import ( type BindHandler struct { network *network.Network - xmgmts []xmgmt.Xmgmt + xmgmts *concurrenz.CopyOnWriteSlice[xmgmt.Xmgmt] } -func NewBindHandler(network *network.Network, xmgmts []xmgmt.Xmgmt) channel.BindHandler { +func NewBindHandler(network *network.Network, xmgmts *concurrenz.CopyOnWriteSlice[xmgmt.Xmgmt]) channel.BindHandler { return &BindHandler{network: network, xmgmts: xmgmts} } @@ -70,7 +71,7 @@ func (bindHandler *BindHandler) BindChannel(binding channel.Binding) error { binding.AddPeekHandler(trace.NewChannelPeekHandler(bindHandler.network.GetAppId(), binding.GetChannel(), bindHandler.network.GetTraceController())) xmgmtDone := make(chan struct{}) - for _, x := range bindHandler.xmgmts { + for _, x := range bindHandler.xmgmts.Value() { if err := binding.Bind(x); err != nil { return err } @@ -78,7 +79,7 @@ func (bindHandler *BindHandler) BindChannel(binding channel.Binding) error { return err } } - if len(bindHandler.xmgmts) > 0 { + if len(bindHandler.xmgmts.Value()) > 0 { binding.AddCloseHandler(newXmgmtCloseHandler(xmgmtDone)) } diff --git a/controller/internal/routes/external_jwt_signer_router.go b/controller/internal/routes/external_jwt_signer_router.go index 35785aa9a..5f8f31874 100644 --- a/controller/internal/routes/external_jwt_signer_router.go +++ b/controller/internal/routes/external_jwt_signer_router.go @@ -19,6 +19,7 @@ package routes import ( "github.com/go-openapi/runtime/middleware" "github.com/michaelquigley/pfxlog" + external_jwt_signer_client "github.com/openziti/edge-api/rest_client_api_server/operations/external_jwt_signer" "github.com/openziti/edge-api/rest_management_api_server/operations/external_jwt_signer" "github.com/openziti/ziti/controller/db" "github.com/openziti/ziti/controller/env" @@ -45,7 +46,7 @@ func NewExternalJwtSignerRouter() *ExternalJwtSignerRouter { func (r *ExternalJwtSignerRouter) Register(ae *env.AppEnv) { // client - ae.ManagementApi.ExternalJWTSignerListExternalJWTSignersHandler = external_jwt_signer.ListExternalJWTSignersHandlerFunc(func(params external_jwt_signer.ListExternalJWTSignersParams, _ interface{}) middleware.Responder { + ae.ClientApi.ExternalJWTSignerListExternalJWTSignersHandler = external_jwt_signer_client.ListExternalJWTSignersHandlerFunc(func(params external_jwt_signer_client.ListExternalJWTSignersParams) middleware.Responder { return ae.IsAllowed(r.ListClient, params.HTTPRequest, "", "", permissions.Always()) }) diff --git a/controller/internal/routes/identity_router.go b/controller/internal/routes/identity_router.go index 7fdc82f5d..3db0a9610 100644 --- a/controller/internal/routes/identity_router.go +++ b/controller/internal/routes/identity_router.go @@ -275,30 +275,32 @@ func (r *IdentityRouter) listEdgeRouters(ae *env.AppEnv, rc *response.RequestCon func (r *IdentityRouter) listServiceConfigs(ae *env.AppEnv, rc *response.RequestContext) { listWithId(rc, func(id string) ([]interface{}, error) { - serviceConfigs, err := ae.Managers.Identity.GetServiceConfigs(id) + modelIdentity, err := ae.Managers.Identity.Read(id) if err != nil { return nil, err } result := make([]interface{}, 0) - for _, serviceConfig := range serviceConfigs { - service, err := ae.Managers.EdgeService.Read(serviceConfig.Service) + for serviceId, configData := range modelIdentity.ServiceConfigs { + service, err := ae.Managers.EdgeService.Read(serviceId) if err != nil { - pfxlog.Logger().Debugf("listing service configs for identity [%s] could not find service [%s]: %v", id, serviceConfig.Service, err) + pfxlog.Logger().Debugf("listing service configs for identity [%s] could not find service [%s]: %v", id, serviceId, err) continue } - config, err := ae.Managers.Config.Read(serviceConfig.Config) - if err != nil { - pfxlog.Logger().Debugf("listing service configs for identity [%s] could not find config [%s]: %v", id, serviceConfig.Config, err) - continue + for _, configId := range configData { + config, err := ae.Managers.Config.Read(configId) + if err != nil { + pfxlog.Logger().Debugf("listing service configs for identity [%s] could not find config [%s]: %v", id, configId, err) + continue + } + + result = append(result, rest_model.ServiceConfigDetail{ + Config: ToEntityRef(config.Name, config, ConfigLinkFactory), + ConfigID: &config.Id, + Service: ToEntityRef(service.Name, service, ServiceLinkFactory), + ServiceID: &service.Id, + }) } - - result = append(result, rest_model.ServiceConfigDetail{ - Config: ToEntityRef(config.Name, config, ConfigLinkFactory), - ConfigID: &config.Id, - Service: ToEntityRef(service.Name, service, ServiceLinkFactory), - ServiceID: &service.Id, - }) } return result, nil }) diff --git a/controller/model/authenticator.go b/controller/model/authenticator.go index e66cc9226..c92b678cf 100644 --- a/controller/model/authenticator.go +++ b/controller/model/authenticator.go @@ -24,14 +24,11 @@ import ( ) type AuthResult interface { - IdentityId() string - ExternalId() string AuthenticatorId() string SessionCerts() []*x509.Certificate Identity() *Identity Authenticator() *Authenticator AuthPolicy() *AuthPolicy - AuthPolicyId() string IsSuccessful() bool } @@ -121,25 +118,14 @@ func (context *AuthContextHttp) GetChangeContext() *change.Context { var _ AuthResult = &AuthResultBase{} type AuthResultBase struct { - identityId string - externalId string identity *Identity authenticatorId string authenticator *Authenticator sessionCerts []*x509.Certificate - authPolicyId string authPolicy *AuthPolicy env Env } -func (a *AuthResultBase) IdentityId() string { - return a.identityId -} - -func (a *AuthResultBase) ExternalId() string { - return a.externalId -} - func (a *AuthResultBase) AuthenticatorId() string { return a.authenticatorId } @@ -149,14 +135,6 @@ func (a *AuthResultBase) SessionCerts() []*x509.Certificate { } func (a *AuthResultBase) Identity() *Identity { - if a.identity == nil { - if a.identityId != "" { - a.identity, _ = a.env.GetManagers().Identity.Read(a.identityId) - } else if a.externalId != "" { - a.identity, _ = a.env.GetManagers().Identity.ReadByExternalId(a.externalId) - } - - } return a.identity } @@ -168,17 +146,9 @@ func (a *AuthResultBase) Authenticator() *Authenticator { } func (a *AuthResultBase) AuthPolicy() *AuthPolicy { - if a.authPolicy == nil { - a.authPolicy, _ = a.env.GetManagers().AuthPolicy.Read(a.authPolicyId) - } - return a.authPolicy } -func (a *AuthResultBase) AuthPolicyId() string { - return a.authPolicyId -} - func (a *AuthResultBase) IsSuccessful() bool { - return a.identityId != "" + return a.identity != nil } diff --git a/controller/model/authenticator_mod_cert.go b/controller/model/authenticator_mod_cert.go index 329428899..02c2a3c33 100644 --- a/controller/model/authenticator_mod_cert.go +++ b/controller/model/authenticator_mod_cert.go @@ -23,7 +23,6 @@ import ( "github.com/michaelquigley/pfxlog" "github.com/openziti/foundation/v2/errorz" nfpem "github.com/openziti/foundation/v2/pem" - "github.com/openziti/foundation/v2/stringz" "github.com/openziti/ziti/common/cert" "github.com/openziti/ziti/controller/apierror" "github.com/openziti/ziti/controller/change" @@ -225,13 +224,10 @@ func (module *AuthModuleCert) Process(context AuthContext) (AuthResult, error) { } return &AuthResultBase{ - identityId: identity.Id, - externalId: stringz.OrEmpty(identity.ExternalId), identity: identity, authenticatorId: authenticator.Id, authenticator: authenticator, sessionCerts: []*x509.Certificate{clientCert}, - authPolicyId: authPolicy.Id, authPolicy: authPolicy, env: module.env, }, nil diff --git a/controller/model/authenticator_mod_ext_jwt.go b/controller/model/authenticator_mod_ext_jwt.go index 5b980d269..92111975b 100644 --- a/controller/model/authenticator_mod_ext_jwt.go +++ b/controller/model/authenticator_mod_ext_jwt.go @@ -28,8 +28,10 @@ import ( "github.com/openziti/storage/boltz" "github.com/openziti/ziti/controller/apierror" "github.com/openziti/ziti/controller/db" + "github.com/openziti/ziti/controller/models" cmap "github.com/orcaman/concurrent-map/v2" "github.com/pkg/errors" + "github.com/sirupsen/logrus" "go.etcd.io/bbolt" "strings" "sync" @@ -39,11 +41,53 @@ import ( var _ AuthProcessor = &AuthModuleExtJwt{} const ( - AuthMethodExtJwt = "ext-jwt" - ExtJwtInternalClaim = "-internal-ext-jwt" - JwksQueryTimeout = 1 * time.Second + AuthMethodExtJwt = "ext-jwt" + ExtJwtInternalClaim = "-internal-ext-jwt" + JwksQueryTimeout = 1 * time.Second + MaxCandidateJwtProcessing = 2 ) +type candidateResult struct { + Error error + + ExpectedIssuer string + EncounteredIssuer string + ExpectedAudience string + EncounteredAudiences []string + EncounteredExtJwtSigner *db.ExternalJwtSigner + ExpectedExtJwtSignerIds []string + + AuthPolicy *AuthPolicy + Identity *Identity + + IdClaimProperty string + IdClaimsValue string +} + +func (r *candidateResult) LogResult(logger *logrus.Entry, index int) { + if r.AuthPolicy != nil { + logger = logger.WithField("authPolicyId", r.AuthPolicy.Id) + } + + if r.Identity != nil { + logger = logger.WithField("identityId", r.Identity.Id) + } + + if r.EncounteredExtJwtSigner != nil { + logger = logger.WithField("extJwtSignerId", r.EncounteredExtJwtSigner.Id) + } + + logger = logger.WithField("issuer", r.ExpectedIssuer) + logger = logger.WithField("audience", r.ExpectedAudience) + + if r.Error == nil { + logger.Debugf("validated candidate JWT at index %d", index) + } else { + logger.WithError(r.Error).Errorf("failed to validate candidate JWT at index %d", index) + } + +} + type AuthModuleExtJwt struct { env Env method string @@ -268,224 +312,77 @@ func (a *AuthModuleExtJwt) ProcessSecondary(context AuthContext) (AuthResult, er type AuthResultJwt struct { AuthResultBase - externalJwtSignerId string - externalJwtSigner *db.ExternalJwtSigner + externalJwtSigner *db.ExternalJwtSigner } func (a *AuthResultJwt) IsSuccessful() bool { - return a.externalJwtSignerId != "" && a.AuthResultBase.identityId != "" + return a.externalJwtSigner != nil && a.Identity() != nil } func (a *AuthResultJwt) AuthenticatorId() string { - return "extJwtId:" + a.externalJwtSignerId -} - -func (a *AuthModuleExtJwt) process(context AuthContext, isPrimary bool) (AuthResult, error) { - logger := pfxlog.Logger().WithField("authMethod", AuthMethodExtJwt) - - headers := map[string]interface{}{} - - for key, value := range context.GetHeaders() { - headers[strings.ToLower(key)] = value + if a.externalJwtSigner == nil { + return "" } - var authHeaders []string - - if authHeaderVal, ok := headers["authorization"]; ok { - authHeaders = authHeaderVal.([]string) - } + return "extJwtId:" + a.externalJwtSigner.Id +} - if len(authHeaders) != 1 { - logger.Error("no authorization header found") - return nil, apierror.NewInvalidAuth() +func (a *AuthResultJwt) Authenticator() *Authenticator { + authenticator := &Authenticator{ + BaseEntity: models.BaseEntity{ + Id: AuthMethodExtJwt, + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + IsSystem: true, + }, + Method: AuthMethodExtJwt, } - authHeader := authHeaders[0] - if !strings.HasPrefix(authHeader, "Bearer ") { - logger.Error("authorization header missing Bearer prefix") - return nil, apierror.NewInvalidAuth() + if a.identity != nil { + authenticator.IdentityId = a.identity.Id } - jwtStr := strings.Replace(authHeader, "Bearer ", "", 1) - - //pubKeyLookup also handles extJwtSigner.enabled checking - jwtToken, err := jwt.Parse(jwtStr, a.pubKeyLookup) - - if err == nil && jwtToken.Valid { - mapClaims := jwtToken.Claims.(jwt.MapClaims) - extJwt := mapClaims[ExtJwtInternalClaim].(*db.ExternalJwtSigner) - - if extJwt == nil { - logger.Error("no external jwt signer found for internal claims") - return nil, apierror.NewInvalidAuth() - } - - logger = logger.WithField("externalJwtSignerId", extJwt.Id) - - issuer := "" - if issuerVal, ok := mapClaims["iss"]; ok { - issuer, ok = issuerVal.(string) - if !ok { - logger.Error("issuer in claims was not a string") - return nil, apierror.NewInvalidAuth() - } - } - - logger = logger.WithField("claimsIssuer", issuer) - - if extJwt.Issuer != nil && *extJwt.Issuer != issuer { - logger.WithField("expectedIssuer", *extJwt.Issuer).Error("invalid issuer") - return nil, apierror.NewInvalidAuth() - } - - if extJwt.Audience != nil { - audValues := mapClaims["aud"] + return authenticator +} - if audValues == nil { - logger.WithField("audience", audValues).Error("audience is missing") - return nil, apierror.NewInvalidAuth() - } +func (a *AuthModuleExtJwt) process(context AuthContext, isPrimary bool) (AuthResult, error) { + logger := pfxlog.Logger().WithField("authMethod", AuthMethodExtJwt) - audSlice, ok := audValues.([]string) + candidates := a.getJwtsFromAuthHeader(context) - if !ok { - audISlice, ok := audValues.([]interface{}) - - if ok { - audSlice = []string{} - for _, aud := range audISlice { - audSlice = append(audSlice, aud.(string)) - } - } else { - audString, ok := audValues.(string) - - if !ok { - logger.WithField("audience", audValues).Error("audience is not a string or array of strings") - return nil, apierror.NewInvalidAuth() - } - - audSlice = []string{audString} - } - } + var verifyResults []*candidateResult - found := false - for _, validAud := range audSlice { - if validAud == *extJwt.Audience { - found = true - break - } - } + for i, candidate := range candidates { + verifyResult := a.verifyCandidate(context, isPrimary, candidate) - if !found { - logger.WithField("expectedAudience", *extJwt.Audience).WithField("claimsAudiences", audSlice).Error("invalid audience") - return nil, apierror.NewInvalidAuth() + if verifyResult.Error == nil { + //success + result := &AuthResultJwt{ + AuthResultBase: AuthResultBase{ + authPolicy: verifyResult.AuthPolicy, + identity: verifyResult.Identity, + env: a.env, + }, + externalJwtSigner: verifyResult.EncounteredExtJwtSigner, } - } - - idClaimProperty := "sub" - if extJwt.ClaimsProperty != nil { - idClaimProperty = *extJwt.ClaimsProperty - } - - logger = logger.WithField("idClaimProperty", idClaimProperty) - - identityIdInterface, ok := mapClaims[idClaimProperty] - if !ok { - logger.Error("claims property on external jwt signer not found in claims") - return nil, apierror.NewInvalidAuth() - } + verifyResult.LogResult(logger, i) - claimsId, ok := identityIdInterface.(string) - - if !ok || claimsId == "" { - logger.Error("expected claims id was not a string or was empty") - return nil, apierror.NewInvalidAuth() - } - - var authPolicy *AuthPolicy - - var identity *Identity - if extJwt.UseExternalId { - authPolicy, identity, err = getAuthPolicyByExternalId(a.env, AuthMethodExtJwt, "", claimsId) + return result, nil } else { - authPolicy, identity, err = getAuthPolicyByIdentityId(a.env, AuthMethodExtJwt, "", claimsId) - } - - if err != nil { - logger.WithError(err).Error("encountered unhandled error during authentication") - return nil, apierror.NewInvalidAuth() - } - - if authPolicy == nil { - logger.WithError(err).Error("encountered unhandled nil auth policy during authentication") - return nil, apierror.NewInvalidAuth() - } - - if identity == nil { - logger.WithError(err).Error("encountered unhandled nil identity during authentication") - return nil, apierror.NewInvalidAuth() - } - - externalJwtSignerId := "" - if identity.Disabled { - logger. - WithField("disabledAt", identity.DisabledAt). - WithField("disabledUntil", identity.DisabledUntil). - Error("authentication failed, identity is disabled") - return nil, apierror.NewInvalidAuth() - } - - if !authPolicy.Primary.ExtJwt.Allowed { - logger.Error("external jwt authentication on auth policy is disabled") - return nil, apierror.NewInvalidAuth() - } - - if isPrimary { - if len(authPolicy.Primary.ExtJwt.AllowedExtJwtSigners) > 0 { - found := false - for _, allowedId := range authPolicy.Primary.ExtJwt.AllowedExtJwtSigners { - if allowedId == extJwt.Id { - externalJwtSignerId = allowedId - found = true - break - } - } - - if !found { - logger. - WithField("allowedSigners", authPolicy.Primary.ExtJwt.AllowedExtJwtSigners). - Error("auth policy does not allow specified signer") - return nil, apierror.NewInvalidAuth() - } - } else { - externalJwtSignerId = extJwt.Id - } - } else if authPolicy.Secondary.RequiredExtJwtSigner != nil { - if extJwt.Id != *authPolicy.Secondary.RequiredExtJwtSigner { - return nil, apierror.NewInvalidAuth() - } - - externalJwtSignerId = extJwt.Id - } - - result := &AuthResultJwt{ - AuthResultBase: AuthResultBase{ - authPolicyId: authPolicy.Id, - authPolicy: authPolicy, - identity: identity, - identityId: identity.Id, - externalId: stringz.OrEmpty(identity.ExternalId), - env: a.env, - }, - externalJwtSignerId: externalJwtSignerId, - externalJwtSigner: extJwt, + verifyResults = append(verifyResults, verifyResult) } + } - return result, nil + authType := "secondary" + if isPrimary { + authType = "primary" + } + logger.Errorf("encountered %d candidate JWTs and all failed to validate for %s authentication, see the following log messages", len(verifyResults), authType) + for i, result := range verifyResults { + result.LogResult(logger, i) } - logger.Error("authorization failed, jwt did not verify") return nil, apierror.NewInvalidAuth() } @@ -582,3 +479,251 @@ func (a *AuthModuleExtJwt) loadExistingSigners() { pfxlog.Logger().Errorf("error loading external jwt signerByIssuer: %v", err) } } + +func (a *AuthModuleExtJwt) verifyAudience(expectedAudience *string, mapClaims jwt.MapClaims) error { + + if expectedAudience == nil { + return errors.New("audience on ext-jwt signer is nil, audience is required") + } + + audValues := mapClaims["aud"] + + if audValues == nil { + return errors.New("audience field is missing or is empty in JWT") + } + + audSlice, ok := audValues.([]string) + + if !ok { + audISlice, ok := audValues.([]interface{}) + + if ok { + audSlice = []string{} + for _, aud := range audISlice { + audSlice = append(audSlice, aud.(string)) + } + } else { + audString, ok := audValues.(string) + + if !ok { + return errors.New("jwt audience field is not a string or an array of strings") + } + + audSlice = []string{audString} + } + } + + for _, validAud := range audSlice { + if validAud == *expectedAudience { + return nil + } + } + + return errors.New("audience value is invalid, no audiences matched the expected audience") +} + +func (a *AuthModuleExtJwt) verifyIssuer(expectedIssuer *string, mapClaims jwt.MapClaims) error { + + if expectedIssuer == nil { + return errors.New("no issuer found for external jwt signer, issuer is required") + } + + issuer := "" + if issuerVal, ok := mapClaims["iss"]; ok { + issuer, ok = issuerVal.(string) + if !ok { + return fmt.Errorf("issuer in claims was not a string, got %T", issuerVal) + } + } + + if *expectedIssuer == issuer { + return nil + } + + return fmt.Errorf("invalid issuer, got: %s", issuer) +} + +func (a *AuthModuleExtJwt) getJwtsFromAuthHeader(context AuthContext) []string { + headers := map[string]interface{}{} + + for key, value := range context.GetHeaders() { + headers[strings.ToLower(key)] = value + } + + var authHeaders []string + + if authHeaderVal, ok := headers["authorization"]; ok { + authHeaders = authHeaderVal.([]string) + } + + var candidates []string + for _, authHeader := range authHeaders { + if strings.HasPrefix(authHeader, "Bearer ") { + jwtStr := strings.Replace(authHeader, "Bearer ", "", 1) + jwtStr = strings.TrimSpace(jwtStr) + + if jwtStr != "" { + candidates = append(candidates, jwtStr) + } + } + } + + if len(candidates) > MaxCandidateJwtProcessing { + candidates = candidates[:MaxCandidateJwtProcessing] + } + + return candidates +} + +func (a *AuthModuleExtJwt) verifyAsPrimary(authPolicy *AuthPolicy, extJwt *db.ExternalJwtSigner) error { + if !authPolicy.Primary.ExtJwt.Allowed { + return errors.New("primary external jwt authentication on auth policy is disabled") + } + + if len(authPolicy.Primary.ExtJwt.AllowedExtJwtSigners) == 0 { + //allow any valid JWT + return nil + } + + for _, allowedId := range authPolicy.Primary.ExtJwt.AllowedExtJwtSigners { + if allowedId == extJwt.Id { + return nil + } + } + + return fmt.Errorf("allowed signers does not contain the external jwt id: %s, expected one of: %v", extJwt.Id, authPolicy.Primary.ExtJwt.AllowedExtJwtSigners) +} + +func (a *AuthModuleExtJwt) verifyCandidate(context AuthContext, isPrimary bool, jwtStr string) *candidateResult { + result := &candidateResult{} + + //pubKeyLookup also handles extJwtSigner.enabled checking + jwtToken, err := jwt.Parse(jwtStr, a.pubKeyLookup) + + if err != nil { + result.Error = fmt.Errorf("jwt failed to parse: %w", err) + return result + } + + if !jwtToken.Valid { + result.Error = errors.New("authorization failed, jwt did not pass signature verification") + return result + } + + mapClaims := jwtToken.Claims.(jwt.MapClaims) + extJwt := mapClaims[ExtJwtInternalClaim].(*db.ExternalJwtSigner) + + if extJwt == nil { + result.Error = errors.New("no external jwt signer found for internal claims") + return result + } + + result.EncounteredExtJwtSigner = extJwt + result.ExpectedIssuer = stringz.OrEmpty(extJwt.Issuer) + result.ExpectedAudience = stringz.OrEmpty(extJwt.Audience) + result.EncounteredIssuer, _ = mapClaims.GetIssuer() + result.EncounteredAudiences, _ = mapClaims.GetAudience() + + err = a.verifyIssuer(extJwt.Issuer, mapClaims) + + if err != nil { + result.Error = fmt.Errorf("issuer validation failed: %w", err) + return result + } + + err = a.verifyAudience(extJwt.Audience, mapClaims) + + if err != nil { + result.Error = fmt.Errorf("audience validation failed: %w", err) + return result + } + + idClaimProperty := "sub" + if extJwt.ClaimsProperty != nil { + idClaimProperty = *extJwt.ClaimsProperty + } + + result.IdClaimProperty = idClaimProperty + + identityIdInterface, ok := mapClaims[idClaimProperty] + + if !ok { + result.Error = fmt.Errorf("claims property [%s] was not found in the claims", idClaimProperty) + return result + } + + claimId, ok := identityIdInterface.(string) + + if !ok || claimId == "" { + result.Error = fmt.Errorf("claims property [%s] was not a string or was empty: %v", idClaimProperty, identityIdInterface) + return result + } + + result.IdClaimsValue = claimId + + var authPolicy *AuthPolicy + + var identity *Identity + claimIdLookupMethod := "" + if extJwt.UseExternalId { + claimIdLookupMethod = "external id" + authPolicy, identity, err = getAuthPolicyByExternalId(a.env, AuthMethodExtJwt, "", claimId) + } else { + claimIdLookupMethod = "identity id" + authPolicy, identity, err = getAuthPolicyByIdentityId(a.env, AuthMethodExtJwt, "", claimId) + } + + if err != nil { + result.Error = fmt.Errorf("error during authentication policy and identity lookup by claims type [%s] and claimd id [%s]: %w", claimIdLookupMethod, claimId, err) + return result + } + + if authPolicy == nil { + result.Error = fmt.Errorf("no authentication policy found for claims type [%s] and claimd id [%s]: %w", claimIdLookupMethod, claimId, err) + return result + } + + result.AuthPolicy = authPolicy + + if identity == nil { + result.Error = fmt.Errorf("no identity found for claims type [%s] and claimd id [%s]: %w", claimIdLookupMethod, claimId, err) + return result + } + + result.Identity = identity + + if identity.Disabled { + result.Error = fmt.Errorf("the identity [%s] is disabled, disabledAt %v, disabledUntil: %v", identity.Id, identity.DisabledAt, identity.DisabledUntil) + return result + } + + if isPrimary { + err = a.verifyAsPrimary(authPolicy, extJwt) + + if len(authPolicy.Primary.ExtJwt.AllowedExtJwtSigners) == 0 { + result.ExpectedExtJwtSignerIds = []string{""} + } else { + result.ExpectedExtJwtSignerIds = authPolicy.Primary.ExtJwt.AllowedExtJwtSigners + } + + if err != nil { + result.Error = fmt.Errorf("primary external jwt processing failed on authentication policy [%s]: %w", authPolicy.Id, err) + return result + } + + } else { + if authPolicy.Secondary.RequiredExtJwtSigner == nil { + result.Error = fmt.Errorf("secondary external jwt authentication on authentication policy [%s] is not configured", authPolicy.Id) + return result + } + + result.ExpectedExtJwtSignerIds = []string{*authPolicy.Secondary.RequiredExtJwtSigner} + + if extJwt.Id != *authPolicy.Secondary.RequiredExtJwtSigner { + result.Error = fmt.Errorf("secondary external jwt authentication failed on authentication policy [%s]: the required ext-jwt signer [%s] did not match the validating id [%s]", authPolicy.Id, *authPolicy.Secondary.RequiredExtJwtSigner, extJwt.Id) + return result + } + } + + return result +} diff --git a/controller/model/authenticator_mod_updb.go b/controller/model/authenticator_mod_updb.go index 3c4f03bd2..0dc06cecd 100644 --- a/controller/model/authenticator_mod_updb.go +++ b/controller/model/authenticator_mod_updb.go @@ -150,7 +150,6 @@ func (module *AuthModuleUpdb) Process(context AuthContext) (AuthResult, error) { return &AuthResultBase{ identity: identity, - identityId: updb.IdentityId, authenticator: authenticator, authenticatorId: authenticator.Id, env: module.env, diff --git a/controller/model/base_manager.go b/controller/model/base_manager.go index 56f0c0738..d23af8b25 100644 --- a/controller/model/base_manager.go +++ b/controller/model/base_manager.go @@ -425,3 +425,10 @@ func NewFieldChecker(fields ...string) boltz.FieldChecker { } return result } + +type NotFieldChecker map[string]struct{} + +func (checker NotFieldChecker) IsUpdated(field string) bool { + _, ok := checker[field] + return !ok +} diff --git a/controller/model/controller_manager.go b/controller/model/controller_manager.go index 294568a77..919b44c2e 100644 --- a/controller/model/controller_manager.go +++ b/controller/model/controller_manager.go @@ -95,24 +95,6 @@ func (self *ControllerManager) ReadByName(name string) (*Controller, error) { return modelEntity, nil } -func (self *ControllerManager) MapControllerNamesToIds(values []string, identityId string) map[string]struct{} { - var result []string - if stringz.Contains(values, "all") { - result = []string{"all"} - } else { - for _, val := range values { - if Controller, _ := self.Read(val); Controller != nil { - result = append(result, val) - } else if Controller, _ := self.ReadByName(val); Controller != nil { - result = append(result, Controller.Id) - } else { - pfxlog.Logger().Debugf("user %v submitted %v as a config type of interest, but no matching records found", identityId, val) - } - } - } - return stringz.SliceToSet(result) -} - func (self *ControllerManager) Marshall(entity *Controller) ([]byte, error) { msg := &edge_cmd_pb.Controller{ Id: entity.Id, diff --git a/controller/model/identity_manager.go b/controller/model/identity_manager.go index e13d8dd42..c61a6a6e9 100644 --- a/controller/model/identity_manager.go +++ b/controller/model/identity_manager.go @@ -141,8 +141,16 @@ func (self *IdentityManager) Update(entity *Identity, checker fields.UpdatedFiel } func (self *IdentityManager) ApplyUpdate(cmd *command.UpdateEntityCommand[*Identity], ctx boltz.MutateContext) error { - var checker boltz.FieldChecker = self - if cmd.UpdatedFields != nil { + var checker boltz.FieldChecker + + if cmd.UpdatedFields == nil { + checker = &AndFieldChecker{ + first: self, + second: NotFieldChecker{ + db.FieldIdentityServiceConfigs: struct{}{}, + }, + } + } else { checker = &AndFieldChecker{first: self, second: cmd.UpdatedFields} } return self.updateEntity(cmd.Entity, checker, ctx) @@ -374,24 +382,6 @@ func (self *IdentityManager) CreateWithAuthenticator(identity *Identity, authent return identity.Id, authenticator.Id, nil } -func (self *IdentityManager) GetServiceConfigs(id string) ([]ServiceConfig, error) { - var result []ServiceConfig - err := self.GetDb().View(func(tx *bbolt.Tx) error { - configs, err := self.env.GetStores().Identity.GetServiceConfigs(tx, id) - if err != nil { - return err - } - for _, config := range configs { - result = append(result, ServiceConfig{Service: config.ServiceId, Config: config.ConfigId}) - } - return nil - }) - if err != nil { - return nil, err - } - return result, nil -} - func (self *IdentityManager) AssignServiceConfigs(id string, serviceConfigs []ServiceConfig, ctx *change.Context) error { cmd := &UpdateServiceConfigsCmd{ manager: self, @@ -415,24 +405,39 @@ func (self *IdentityManager) RemoveServiceConfigs(id string, serviceConfigs []Se } func (self *IdentityManager) ApplyUpdateServiceConfigs(cmd *UpdateServiceConfigsCmd, ctx boltz.MutateContext) error { - if cmd.add { - return self.GetDb().Update(ctx, func(ctx boltz.MutateContext) error { - boltServiceConfigs, err := toBoltServiceConfigs(ctx.Tx(), self.env, cmd.serviceConfigs) - if err != nil { - return err - } - return self.env.GetStores().Identity.AssignServiceConfigs(ctx.Tx(), cmd.identityId, boltServiceConfigs...) - }) - } - + identityStore := self.env.GetStores().Identity return self.GetDb().Update(ctx, func(ctx boltz.MutateContext) error { - boltServiceConfigs, err := toBoltServiceConfigs(ctx.Tx(), self.env, cmd.serviceConfigs) + identity, err := identityStore.LoadById(ctx.Tx(), cmd.identityId) if err != nil { return err } - return self.env.GetStores().Identity.RemoveServiceConfigs(ctx.Tx(), cmd.identityId, boltServiceConfigs...) - }) + for _, serviceConfig := range cmd.serviceConfigs { + config, err := self.env.GetStores().Config.LoadById(ctx.Tx(), serviceConfig.Config) + if err != nil { + return err + } + if cmd.add { + if identity.ServiceConfigs == nil { + identity.ServiceConfigs = map[string]map[string]string{} + } + serviceMap, ok := identity.ServiceConfigs[serviceConfig.Service] + if !ok { + serviceMap = map[string]string{} + identity.ServiceConfigs[serviceConfig.Service] = serviceMap + } + serviceMap[config.Type] = config.Id + } else if identity.ServiceConfigs != nil { + if serviceMap, ok := identity.ServiceConfigs[serviceConfig.Service]; ok { + delete(serviceMap, config.Type) + } + } + } + + return identityStore.Update(ctx, identity, boltz.MapFieldChecker{ + db.FieldIdentityServiceConfigs: struct{}{}, + }) + }) } func (self *IdentityManager) QueryRoleAttributes(queryString string) ([]string, *models.QueryMetaData, error) { @@ -626,6 +631,16 @@ func (self *IdentityManager) IdentityToProtobuf(entity *Identity) (*edge_cmd_pb. DisabledUntil: timePtrToPb(entity.DisabledUntil), } + for serviceId, configInfo := range entity.ServiceConfigs { + for configTypeId, configId := range configInfo { + msg.ServiceConfigs = append(msg.ServiceConfigs, &edge_cmd_pb.Identity_ServiceConfig{ + ServiceId: serviceId, + ConfigTypeId: configTypeId, + ConfigId: configId, + }) + } + } + return msg, nil } @@ -677,6 +692,21 @@ func (self *IdentityManager) ProtobufToIdentity(msg *edge_cmd_pb.Identity) (*Ide return nil, err } + var serviceConfigs map[string]map[string]string + + for _, serviceConfig := range msg.ServiceConfigs { + if serviceConfigs == nil { + serviceConfigs = map[string]map[string]string{} + } + + serviceMap, ok := serviceConfigs[serviceConfig.ServiceId] + if !ok { + serviceMap = map[string]string{} + serviceConfigs[serviceConfig.ServiceId] = serviceMap + } + serviceMap[serviceConfig.ConfigTypeId] = serviceConfig.ConfigId + } + return &Identity{ BaseEntity: models.BaseEntity{ Id: msg.Id, @@ -699,6 +729,7 @@ func (self *IdentityManager) ProtobufToIdentity(msg *edge_cmd_pb.Identity) (*Ide Disabled: msg.Disabled, DisabledAt: pbTimeToTimePtr(msg.DisabledAt), DisabledUntil: pbTimeToTimePtr(msg.DisabledUntil), + ServiceConfigs: serviceConfigs, }, nil } diff --git a/controller/model/identity_model.go b/controller/model/identity_model.go index 29c67adf8..03a154c07 100644 --- a/controller/model/identity_model.go +++ b/controller/model/identity_model.go @@ -94,6 +94,7 @@ type Identity struct { Disabled bool DisabledAt *time.Time DisabledUntil *time.Time + ServiceConfigs map[string]map[string]string } func (entity *Identity) toBoltEntityForCreate(_ *bbolt.Tx, env Env) (*db.Identity, error) { @@ -133,6 +134,7 @@ func (entity *Identity) toBoltEntityForCreate(_ *bbolt.Tx, env Env) (*db.Identit ExternalId: entity.ExternalId, DisabledAt: entity.DisabledAt, DisabledUntil: entity.DisabledUntil, + ServiceConfigs: entity.ServiceConfigs, } if entity.EnvInfo != nil { @@ -242,6 +244,7 @@ func (entity *Identity) toBoltEntityForUpdate(tx *bbolt.Tx, env Env, checker bol DisabledAt: entity.DisabledAt, DisabledUntil: entity.DisabledUntil, IsAdmin: entity.IsAdmin, + ServiceConfigs: entity.ServiceConfigs, } identityStore := env.GetManagers().Identity.GetStore() @@ -285,6 +288,7 @@ func (entity *Identity) fillFrom(env Env, _ *bbolt.Tx, boltIdentity *db.Identity entity.DisabledUntil = boltIdentity.DisabledUntil entity.DisabledAt = boltIdentity.DisabledAt entity.Disabled = boltIdentity.Disabled + entity.ServiceConfigs = boltIdentity.ServiceConfigs fillModelInfo(entity, boltIdentity.EnvInfo, boltIdentity.SdkInfo) return nil @@ -294,25 +298,3 @@ type ServiceConfig struct { Service string Config string } - -func toBoltServiceConfigs(tx *bbolt.Tx, env Env, serviceConfigs []ServiceConfig) ([]db.ServiceConfig, error) { - serviceStore := env.GetStores().EdgeService - configStore := env.GetStores().Config - - var boltServiceConfigs []db.ServiceConfig - for _, serviceConfig := range serviceConfigs { - if !serviceStore.IsEntityPresent(tx, serviceConfig.Service) { - return nil, boltz.NewNotFoundError(serviceStore.GetSingularEntityType(), "id or name", serviceConfig.Service) - } - - if !configStore.IsEntityPresent(tx, serviceConfig.Config) { - return nil, boltz.NewNotFoundError(configStore.GetSingularEntityType(), "id or name", serviceConfig.Config) - } - - boltServiceConfigs = append(boltServiceConfigs, db.ServiceConfig{ - ServiceId: serviceConfig.Service, - ConfigId: serviceConfig.Config, - }) - } - return boltServiceConfigs, nil -} diff --git a/controller/model/router_manager.go b/controller/model/router_manager.go index c2da5d15d..2124da497 100644 --- a/controller/model/router_manager.go +++ b/controller/model/router_manager.go @@ -451,12 +451,12 @@ func (self *RouterManager) ValidateRouterSdkTerminators(router *Router, cb func( for _, entry := range inspectResult.Entries { detail := &mgmt_pb.RouterSdkTerminatorDetail{ - TerminatorId: entry.Id, - RouterState: entry.State, - IsValid: true, - OperaationActive: entry.OperationActive, - CreateTime: entry.CreateTime, - LastAttempt: entry.LastAttempt, + TerminatorId: entry.Id, + RouterState: entry.State, + IsValid: true, + OperationActive: entry.OperationActive, + CreateTime: entry.CreateTime, + LastAttempt: entry.LastAttempt, } result.Details = append(result.Details, detail) diff --git a/controller/models/base_model.go b/controller/models/base_model.go index cc965dbfb..0cc9c6eea 100644 --- a/controller/models/base_model.go +++ b/controller/models/base_model.go @@ -275,7 +275,7 @@ func (ctrl *BaseEntityManager[E]) ValidateNameOnUpdate(ctx boltz.MutateContext, return errorz.NewFieldError("name is must be unique", "name", namedEntity.GetName()) } } else { - pfxlog.Logger().Errorf("entity of type %v is named, but store doesn't have name index", reflect.TypeOf(updatedEntity)) + pfxlog.Logger().Errorf("entity of type %v is named, but store doesn't implement the NamedIndexStore interface", reflect.TypeOf(updatedEntity)) } } } @@ -299,7 +299,7 @@ func (handler *BaseEntityManager[E]) ValidateNameOnCreate(tx *bbolt.Tx, entity i return errorz.NewFieldError("name is must be unique", "name", namedEntity.GetName()) } } else { - pfxlog.Logger().Errorf("entity of type %v is named, but store doesn't have name index", reflect.TypeOf(entity)) + pfxlog.Logger().Errorf("entity of type %v is named, but store doesn't implement the NamedIndexStore interface", reflect.TypeOf(entity)) } } return nil diff --git a/controller/network/network.go b/controller/network/network.go index 8b790e13a..3787f2ecc 100644 --- a/controller/network/network.go +++ b/controller/network/network.go @@ -558,7 +558,7 @@ func (network *Network) CreateCircuit(params model.CreateCircuitParams) (*model. // 1: Allocate Circuit Identifier circuitId, err := network.circuitIdGenerator.NextAlphaNumericPrefixedId() if err != nil { - network.CircuitFailedEvent(circuitId, params, startTime, nil, nil, CircuitFailureInvalidService) + network.CircuitFailedEvent(circuitId, params, startTime, nil, nil, CircuitFailureIdGenerationError) return nil, err } ctx.WithFields(map[string]interface{}{ diff --git a/controller/network/network_test.go b/controller/network/network_test.go index 3502dc47e..3e29efa91 100644 --- a/controller/network/network_test.go +++ b/controller/network/network_test.go @@ -175,10 +175,6 @@ func TestCreateCircuit(t *testing.T) { type VersionProviderTest struct { } -func (v VersionProviderTest) Branch() string { - return "local" -} - func (v VersionProviderTest) EncoderDecoder() versions.VersionEncDec { return &versions.StdVersionEncDec } diff --git a/controller/oidc_auth/storage.go b/controller/oidc_auth/storage.go index abf2df4d1..d8870f8b8 100644 --- a/controller/oidc_auth/storage.go +++ b/controller/oidc_auth/storage.go @@ -208,7 +208,7 @@ func (s *HybridStorage) Authenticate(authCtx model.AuthContext, id string, confi return nil, apierror.NewInvalidAuth() } - authRequest.IdentityId = result.IdentityId() + authRequest.IdentityId = result.Identity().Id authRequest.AddAmr(authCtx.GetMethod()) configTypeIds := s.env.GetManagers().ConfigType.MapConfigTypeNamesToIds(configTypes, authRequest.IdentityId) diff --git a/controller/server/controller.go b/controller/server/controller.go index 72e6a7095..30802a419 100644 --- a/controller/server/controller.go +++ b/controller/server/controller.go @@ -152,6 +152,7 @@ func (c *Controller) GetCtrlHandlers(binding channel.Binding) []channel.TypedRec func (c *Controller) GetMgmtHandlers() []channel.TypedReceiveHandler { return []channel.TypedReceiveHandler{ handler_edge_mgmt.NewInitEdgeHandler(c.AppEnv), + handler_edge_mgmt.NewValidateRouterDataModelHandler(c.AppEnv), } } diff --git a/controller/sync_strats/sync_instant.go b/controller/sync_strats/sync_instant.go index da78fc1e8..db0d116e7 100644 --- a/controller/sync_strats/sync_instant.go +++ b/controller/sync_strats/sync_instant.go @@ -106,13 +106,6 @@ type InstantStrategy struct { stopNotify chan struct{} stopped atomic.Bool *common.RouterDataModel - servicePolicyHandler *constraintToIndexedEvents[*db.ServicePolicy] - identityHandler *constraintToIndexedEvents[*db.Identity] - postureCheckHandler *constraintToIndexedEvents[*db.PostureCheck] - serviceHandler *constraintToIndexedEvents[*db.EdgeService] - caHandler *constraintToIndexedEvents[*db.Ca] - revocationHandler *constraintToIndexedEvents[*db.Revocation] - controllerHandler *constraintToIndexedEvents[*db.Controller] changeSetLock sync.Mutex changeSets map[uint64]*edge_ctrl_pb.DataState_ChangeSet @@ -143,7 +136,7 @@ func (strategy *InstantStrategy) Initialize(logSize uint64, bufferSize uint) err } } - err := strategy.BuildAll() + err := strategy.BuildAll(strategy.RouterDataModel) if err != nil { return err @@ -152,65 +145,84 @@ func (strategy *InstantStrategy) Initialize(logSize uint64, bufferSize uint) err go strategy.handleRouterModelEvents(strategy.RouterDataModel.NewListener()) //policy create/delete/update - strategy.servicePolicyHandler = &constraintToIndexedEvents[*db.ServicePolicy]{ + servicePolicyHandler := &constraintToIndexedEvents[*db.ServicePolicy]{ indexProvider: strategy.indexProvider, createHandler: strategy.ServicePolicyCreate, updateHandler: strategy.ServicePolicyUpdate, deleteHandler: strategy.ServicePolicyDelete, } - strategy.ae.GetStores().ServicePolicy.AddEntityConstraint(strategy.servicePolicyHandler) + strategy.ae.GetStores().ServicePolicy.AddEntityConstraint(servicePolicyHandler) //identity create/delete/update - strategy.identityHandler = &constraintToIndexedEvents[*db.Identity]{ + identityHandler := &constraintToIndexedEvents[*db.Identity]{ indexProvider: strategy.indexProvider, createHandler: strategy.IdentityCreate, updateHandler: strategy.IdentityUpdate, deleteHandler: strategy.IdentityDelete, } - strategy.ae.GetStores().Identity.AddEntityConstraint(strategy.identityHandler) + strategy.ae.GetStores().Identity.AddEntityConstraint(identityHandler) //posture check create/delete/update - strategy.postureCheckHandler = &constraintToIndexedEvents[*db.PostureCheck]{ + postureCheckHandler := &constraintToIndexedEvents[*db.PostureCheck]{ indexProvider: strategy.indexProvider, createHandler: strategy.PostureCheckCreate, updateHandler: strategy.PostureCheckUpdate, deleteHandler: strategy.PostureCheckDelete, } - strategy.ae.GetStores().PostureCheck.AddEntityConstraint(strategy.postureCheckHandler) + strategy.ae.GetStores().PostureCheck.AddEntityConstraint(postureCheckHandler) + + //configType create/delete/update + configTypeHandler := &constraintToIndexedEvents[*db.ConfigType]{ + indexProvider: strategy.indexProvider, + createHandler: strategy.ConfigTypeCreate, + updateHandler: strategy.ConfigTypeUpdate, + deleteHandler: strategy.ConfigTypeDelete, + } + strategy.ae.GetStores().ConfigType.AddEntityConstraint(configTypeHandler) + + //config create/delete/update + configHandler := &constraintToIndexedEvents[*db.Config]{ + indexProvider: strategy.indexProvider, + createHandler: strategy.ConfigCreate, + updateHandler: strategy.ConfigUpdate, + deleteHandler: strategy.ConfigDelete, + } + strategy.ae.GetStores().Config.AddEntityConstraint(configHandler) //service create/delete/update - strategy.serviceHandler = &constraintToIndexedEvents[*db.EdgeService]{ + serviceHandler := &constraintToIndexedEvents[*db.EdgeService]{ indexProvider: strategy.indexProvider, createHandler: strategy.ServiceCreate, updateHandler: strategy.ServiceUpdate, deleteHandler: strategy.ServiceDelete, } - strategy.ae.GetStores().EdgeService.AddEntityConstraint(strategy.serviceHandler) + strategy.ae.GetStores().EdgeService.AddEntityConstraint(serviceHandler) //ca create/delete/update - strategy.caHandler = &constraintToIndexedEvents[*db.Ca]{ + caHandler := &constraintToIndexedEvents[*db.Ca]{ indexProvider: strategy.indexProvider, createHandler: strategy.CaCreate, updateHandler: strategy.CaUpdate, deleteHandler: strategy.CaDelete, } - strategy.ae.GetStores().Ca.AddEntityConstraint(strategy.caHandler) + strategy.ae.GetStores().Ca.AddEntityConstraint(caHandler) //revocation create/delete/update - strategy.revocationHandler = &constraintToIndexedEvents[*db.Revocation]{ + revocationHandler := &constraintToIndexedEvents[*db.Revocation]{ indexProvider: strategy.indexProvider, createHandler: strategy.RevocationCreate, updateHandler: strategy.RevocationUpdate, deleteHandler: strategy.RevocationDelete, } - strategy.ae.GetStores().Revocation.AddEntityConstraint(strategy.revocationHandler) + strategy.ae.GetStores().Revocation.AddEntityConstraint(revocationHandler) - strategy.controllerHandler = &constraintToIndexedEvents[*db.Controller]{ + controllerHandler := &constraintToIndexedEvents[*db.Controller]{ indexProvider: strategy.indexProvider, createHandler: strategy.ControllerCreate, updateHandler: strategy.ControllerUpdate, } + strategy.ae.GetStores().Controller.AddEntityConstraint(controllerHandler) strategy.ae.GetDb().AddTxCompleteListener(strategy.completeChangeSet) return nil @@ -825,7 +837,7 @@ type InstantSyncState struct { Sequence int `json:"sequence"` //increasing id from 0 per id for the } -func (strategy *InstantStrategy) BuildServicePolicies(tx *bbolt.Tx) error { +func (strategy *InstantStrategy) BuildServicePolicies(tx *bbolt.Tx, rdm *common.RouterDataModel) error { for cursor := strategy.ae.GetStores().ServicePolicy.IterateIds(tx, ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { currentBytes := cursor.Current() currentId := string(currentBytes) @@ -843,7 +855,7 @@ func (strategy *InstantStrategy) BuildServicePolicies(tx *bbolt.Tx) error { Action: edge_ctrl_pb.DataState_Create, Model: newModel, } - strategy.HandleServicePolicyEvent(newEvent, newModel) + rdm.HandleServicePolicyEvent(newEvent, newModel) result := strategy.ae.GetManagers().ServicePolicy.ListAssociatedIds(tx, storeModel.Id) @@ -854,7 +866,7 @@ func (strategy *InstantStrategy) BuildServicePolicies(tx *bbolt.Tx) error { Add: true, } - strategy.HandleServicePolicyChange(addServicesEvent) + rdm.HandleServicePolicyChange(strategy.indexProvider.CurrentIndex(), addServicesEvent) addIdentitiesEvent := &edge_ctrl_pb.DataState_ServicePolicyChange{ PolicyId: currentId, @@ -862,7 +874,7 @@ func (strategy *InstantStrategy) BuildServicePolicies(tx *bbolt.Tx) error { RelatedEntityType: edge_ctrl_pb.ServicePolicyRelatedEntityType_RelatedIdentity, Add: true, } - strategy.HandleServicePolicyChange(addIdentitiesEvent) + rdm.HandleServicePolicyChange(strategy.indexProvider.CurrentIndex(), addIdentitiesEvent) addPostureChecksEvent := &edge_ctrl_pb.DataState_ServicePolicyChange{ PolicyId: currentId, @@ -870,13 +882,13 @@ func (strategy *InstantStrategy) BuildServicePolicies(tx *bbolt.Tx) error { RelatedEntityType: edge_ctrl_pb.ServicePolicyRelatedEntityType_RelatedPostureCheck, Add: true, } - strategy.HandleServicePolicyChange(addPostureChecksEvent) + rdm.HandleServicePolicyChange(strategy.indexProvider.CurrentIndex(), addPostureChecksEvent) } return nil } -func (strategy *InstantStrategy) BuildPublicKeys(tx *bbolt.Tx) error { +func (strategy *InstantStrategy) BuildPublicKeys(tx *bbolt.Tx, rdm *common.RouterDataModel) error { serverTls := strategy.ae.HostController.Identity().ServerCert() newModel := &edge_ctrl_pb.DataState_Event_PublicKey{PublicKey: newPublicKey(serverTls[0].Certificate[0], edge_ctrl_pb.DataState_PublicKey_X509CertDer, []edge_ctrl_pb.DataState_PublicKey_Usage{edge_ctrl_pb.DataState_PublicKey_JWTValidation, edge_ctrl_pb.DataState_PublicKey_ClientX509CertValidation})} @@ -942,35 +954,44 @@ func (strategy *InstantStrategy) BuildPublicKeys(tx *bbolt.Tx) error { Action: edge_ctrl_pb.DataState_Create, Model: newModel, } - strategy.HandlePublicKeyEvent(newEvent, newModel) + rdm.HandlePublicKeyEvent(newEvent, newModel) } return nil } -func (strategy *InstantStrategy) BuildAll() error { +func (strategy *InstantStrategy) BuildAll(rdm *common.RouterDataModel) error { err := strategy.ae.GetDb().View(func(tx *bbolt.Tx) error { - if err := strategy.BuildIdentities(tx); err != nil { + index := strategy.indexProvider.CurrentIndex() + if err := strategy.BuildConfigTypes(index, tx, rdm); err != nil { return err } - if err := strategy.BuildServices(tx); err != nil { + if err := strategy.BuildConfigs(index, tx, rdm); err != nil { return err } - if err := strategy.BuildPostureChecks(tx); err != nil { + if err := strategy.BuildIdentities(index, tx, rdm); err != nil { return err } - if err := strategy.BuildServicePolicies(tx); err != nil { + if err := strategy.BuildServices(index, tx, rdm); err != nil { return err } - if err := strategy.BuildPublicKeys(tx); err != nil { + if err := strategy.BuildPostureChecks(index, tx, rdm); err != nil { return err } - strategy.SetCurrentIndex(strategy.indexProvider.CurrentIndex()) + if err := strategy.BuildServicePolicies(tx, rdm); err != nil { + return err + } + + if err := strategy.BuildPublicKeys(tx, rdm); err != nil { + return err + } + + rdm.SetCurrentIndex(strategy.indexProvider.CurrentIndex()) return nil }) @@ -978,7 +999,279 @@ func (strategy *InstantStrategy) BuildAll() error { return err } -func (strategy *InstantStrategy) BuildIdentities(tx *bbolt.Tx) error { +func (strategy *InstantStrategy) BuildConfigTypes(index uint64, tx *bbolt.Tx, rdm *common.RouterDataModel) error { + for cursor := strategy.ae.GetStores().ConfigType.IterateIds(tx, ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { + currentBytes := cursor.Current() + currentId := string(currentBytes) + + configType, err := newConfigTypeById(tx, strategy.ae, currentId) + + if err != nil { + return err + } + + newModel := &edge_ctrl_pb.DataState_Event_ConfigType{ConfigType: configType} + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: newModel, + } + rdm.HandleConfigTypeEvent(index, newEvent, newModel) + } + + return nil +} + +func (strategy *InstantStrategy) ValidateConfigTypes(tx *bbolt.Tx, rdm *common.RouterDataModel) []error { + return ValidateType(tx, strategy.ae.GetStores().ConfigType, rdm.ConfigTypes, func(t *db.ConfigType, v *common.ConfigType) []error { + var result []error + result = diffVals("config type", t.Id, "name", t.Name, v.Name, result) + return result + }) +} + +func (strategy *InstantStrategy) ValidateConfigs(tx *bbolt.Tx, rdm *common.RouterDataModel) []error { + return ValidateType(tx, strategy.ae.GetStores().Config, rdm.Configs, func(t *db.Config, v *common.Config) []error { + var result []error + result = diffVals("config", t.Id, "name", t.Name, v.Name, result) + + dataJson, err := json.Marshal(t.Data) + if err != nil { + result = append(result, err) + return result + } + result = diffVals("config", t.Id, "data", string(dataJson), v.DataJson, result) + return result + }) +} + +func (strategy *InstantStrategy) ValidateIdentities(tx *bbolt.Tx, rdm *common.RouterDataModel) []error { + return ValidateType(tx, strategy.ae.GetStores().Identity, rdm.Identities, func(t *db.Identity, v *common.Identity) []error { + var result []error + + serviceConfigs := v.GetServiceConfigsAsMap() + + result = diffVals("identity", t.Id, "name", t.Name, v.Name, result) + result = diffVals("identity", t.Id, "default hosting precedence", byte(t.DefaultHostingPrecedence), byte(v.DefaultHostingPrecedence), result) + result = diffVals("identity", t.Id, "default hosting cost", uint32(t.DefaultHostingCost), v.DefaultHostingCost, result) + result = diffJson("identity", t.Id, "service configs", t.ServiceConfigs, serviceConfigs, result) + result = diffJson("identity", t.Id, "app data", t.AppData, v.AppDataJson, result) + result = diffJson("identity", t.Id, "service hosting costs", t.ServiceHostingCosts, v.ServiceHostingCosts, result) + result = diffJson("identity", t.Id, "service hosting precedences", t.ServiceHostingPrecedences, v.ServiceHostingPrecedences, result) + + policyList := strategy.ae.GetStores().Identity.GetRelatedEntitiesIdList(tx, t.Id, db.EntityTypeServicePolicies) + policySet := genext.SliceToSet(policyList) + result = diffSets("identity", t.Id, "service policy", policySet, v.ServicePolicies, result) + + return result + }) +} + +func (strategy *InstantStrategy) ValidateServices(tx *bbolt.Tx, rdm *common.RouterDataModel) []error { + return ValidateType(tx, strategy.ae.GetStores().EdgeService, rdm.Services, func(t *db.EdgeService, v *common.Service) []error { + var result []error + result = diffVals("service", t.Id, "name", t.Name, v.Name, result) + result = diffVals("service", t.Id, "encryption required", t.EncryptionRequired, v.EncryptionRequired, result) + result = diffJson("service", t.Id, "configs", t.Configs, v.Configs, result) + return result + }) +} + +func (strategy *InstantStrategy) ValidatePostureChecks(tx *bbolt.Tx, rdm *common.RouterDataModel) []error { + return ValidateType(tx, strategy.ae.GetStores().PostureCheck, rdm.PostureChecks, func(t *db.PostureCheck, v *common.PostureCheck) []error { + var result []error + result = diffVals("posture check", t.Id, "name", t.Name, v.Name, result) + result = diffVals("posture check", t.Id, "type", t.TypeId, v.TypeId, result) + + strToList := func(v string) []string { + if v == "" { + return nil + } + return []string{v} + } + + switch subType := t.SubType.(type) { + case *db.PostureCheckMacAddresses: + if rdmSubType, ok := v.Subtype.(*edge_ctrl_pb.DataState_PostureCheck_Mac_); ok && rdmSubType.Mac != nil { + result = diffJson("posture check", t.Id, "mac addresses", subType.MacAddresses, rdmSubType.Mac.MacAddresses, result) + } else { + result = append(result, fmt.Errorf("for posture check %s, sub type not mac address, rather: %T", t.Id, v.Subtype)) + } + case *db.PostureCheckMfa: + if rdmSubType, ok := v.Subtype.(*edge_ctrl_pb.DataState_PostureCheck_Mfa_); ok && rdmSubType.Mfa != nil { + result = diffVals("posture check", t.Id, "mfa ignore legacy endpoints", subType.IgnoreLegacyEndpoints, rdmSubType.Mfa.IgnoreLegacyEndpoints, result) + result = diffVals("posture check", t.Id, "mfa prompt on wake", subType.PromptOnWake, rdmSubType.Mfa.PromptOnWake, result) + result = diffVals("posture check", t.Id, "mfa prompt on unlock", subType.PromptOnUnlock, rdmSubType.Mfa.PromptOnUnlock, result) + result = diffVals("posture check", t.Id, "mfa timeout seconds", subType.TimeoutSeconds, rdmSubType.Mfa.TimeoutSeconds, result) + } else { + result = append(result, fmt.Errorf("for posture check %s, sub type not mfa, rather: %T", t.Id, v.Subtype)) + } + case *db.PostureCheckOperatingSystem: + if rdmSubType, ok := v.Subtype.(*edge_ctrl_pb.DataState_PostureCheck_OsList_); ok && rdmSubType.OsList != nil { + result = diffVals("posture check", t.Id, "os list len", len(subType.OperatingSystems), len(rdmSubType.OsList.OsList), result) + if len(subType.OperatingSystems) == len(rdmSubType.OsList.OsList) { + for idx, os := range subType.OperatingSystems { + rdmOs := rdmSubType.OsList.OsList[idx] + if os.OsType != rdmOs.OsType { + result = append(result, fmt.Errorf("for posture check %s, os type at %d doesn't match rather: %s != %xs", t.Id, idx, os.OsType, rdmOs.OsType)) + } + result = diffJson("posture check", t.Id, fmt.Sprintf("os %d versions", idx), os.OsVersions, rdmOs.OsVersions, result) + } + } + } else { + result = append(result, fmt.Errorf("for posture check %s, sub type not os list, rather: %T", t.Id, v.Subtype)) + } + case *db.PostureCheckProcess: + if rdmSubType, ok := v.Subtype.(*edge_ctrl_pb.DataState_PostureCheck_Process_); ok && rdmSubType.Process != nil { + result = diffJson("posture check", t.Id, "process fingerprints", strToList(subType.Fingerprint), rdmSubType.Process.Fingerprints, result) + result = diffJson("posture check", t.Id, "process hashes", subType.Hashes, rdmSubType.Process.Hashes, result) + result = diffVals("posture check", t.Id, "process path", subType.Path, rdmSubType.Process.Path, result) + result = diffVals("posture check", t.Id, "process operating system", subType.OperatingSystem, rdmSubType.Process.OsType, result) + } else { + result = append(result, fmt.Errorf("for posture check %s, sub type not process, rather: %T", t.Id, v.Subtype)) + } + case *db.PostureCheckProcessMulti: + if rdmSubType, ok := v.Subtype.(*edge_ctrl_pb.DataState_PostureCheck_ProcessMulti_); ok && rdmSubType.ProcessMulti != nil { + result = diffVals("posture check", t.Id, "process multi semantic", subType.Semantic, rdmSubType.ProcessMulti.Semantic, result) + result = diffVals("posture check", t.Id, "process multi list len", len(subType.Processes), len(rdmSubType.ProcessMulti.Processes), result) + if len(subType.Processes) == len(rdmSubType.ProcessMulti.Processes) { + for idx, process := range subType.Processes { + rdmProcess := rdmSubType.ProcessMulti.Processes[idx] + result = diffJson("posture check", t.Id, fmt.Sprintf("process %d fingerprint", idx), process.SignerFingerprints, rdmProcess.Fingerprints, result) + result = diffJson("posture check", t.Id, fmt.Sprintf("process %d hashes", idx), process.Hashes, rdmProcess.Hashes, result) + result = diffVals("posture check", t.Id, fmt.Sprintf("process %d path", idx), process.Path, rdmProcess.Path, result) + result = diffVals("posture check", t.Id, fmt.Sprintf("process %d os type", idx), process.OsType, rdmProcess.OsType, result) + } + } + } else { + result = append(result, fmt.Errorf("for posture check %s, sub type not process multi, rather: %T", t.Id, v.Subtype)) + } + } + + return result + }) +} + +func (strategy *InstantStrategy) ValidateServicePolicies(tx *bbolt.Tx, rdm *common.RouterDataModel) []error { + return ValidateType(tx, strategy.ae.GetStores().ServicePolicy, rdm.ServicePolicies, func(t *db.ServicePolicy, v *common.ServicePolicy) []error { + var result []error + + result = diffVals("service policy", t.Id, "name", t.Name, v.Name, result) + result = diffVals("service policy", t.Id, "policy type", t.PolicyType.Id(), int32(v.PolicyType), result) + + policyList := strategy.ae.GetStores().ServicePolicy.GetRelatedEntitiesIdList(tx, t.Id, db.EntityTypeServices) + policySet := genext.SliceToSet(policyList) + result = diffSets("service policy", t.Id, "service", policySet, v.Services, result) + + policyList = strategy.ae.GetStores().ServicePolicy.GetRelatedEntitiesIdList(tx, t.Id, db.EntityTypePostureChecks) + policySet = genext.SliceToSet(policyList) + result = diffSets("service policy", t.Id, "posture check", policySet, v.PostureChecks, result) + + return result + }) +} + +func diffVals[T comparable](entityType, id, field string, a, b T, errors []error) []error { + if a != b { + return append(errors, fmt.Errorf("for %s %s: %s %v do not match rdm value: %v", entityType, id, field, a, b)) + } + return errors +} + +func diffJson(entityType, id, field string, a interface{}, b interface{}, errors []error) []error { + orig := "" + rdm := "" + + if a != nil { + origBytes, err := json.Marshal(a) + if err != nil { + return append(errors, err) + } + orig = string(origBytes) + } + + if b != nil { + if bytes, ok := b.([]byte); ok { + rdm = string(bytes) + } else { + rdmBytes, err := json.Marshal(b) + if err != nil { + return append(errors, err) + } + rdm = string(rdmBytes) + } + } + + if orig != rdm { + return append(errors, fmt.Errorf("for %s %s: %s %s do not match rdm value: %s", entityType, id, field, orig, rdm)) + } + return errors +} + +func diffSets(entityType, id, field string, a, b map[string]struct{}, result []error) []error { + result = diffVals(entityType, id, field+" count", len(a), len(b), result) + + for entityId := range a { + _, found := b[entityId] + result = diffVals(entityType, id, fmt.Sprintf("has %s %s", field, entityId), true, found, result) + } + + for entityId := range b { + _, found := a[entityId] + result = diffVals(entityType, id, fmt.Sprintf("has %s %s", field, entityId), found, true, result) + } + + return result +} + +func ValidateType[T boltz.ExtEntity, V any](tx *bbolt.Tx, store db.Store[T], m cmap.ConcurrentMap[string, V], checkF func(T, V) []error) []error { + var result []error + entities := common.CloneMap(m) + for cursor := store.IterateIds(tx, ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { + entity, err := store.LoadById(tx, string(cursor.Current())) + if err != nil { + result = append(result, err) + continue + } + rdmEntity, found := entities.Get(entity.GetId()) + if !found { + result = append(result, fmt.Errorf("no %s found with id: %s", + entity.GetEntityType(), entity.GetId())) + continue + } + + entities.Remove(entity.GetId()) + + if errs := checkF(entity, rdmEntity); len(errs) > 0 { + result = append(result, errs...) + } + } + + return result +} + +func (strategy *InstantStrategy) BuildConfigs(index uint64, tx *bbolt.Tx, rdm *common.RouterDataModel) error { + for cursor := strategy.ae.GetStores().Config.IterateIds(tx, ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { + currentBytes := cursor.Current() + currentId := string(currentBytes) + + config, err := newConfigById(tx, strategy.ae, currentId) + + if err != nil { + return err + } + + newModel := &edge_ctrl_pb.DataState_Event_Config{Config: config} + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: newModel, + } + rdm.HandleConfigEvent(index, newEvent, newModel) + } + + return nil +} + +func (strategy *InstantStrategy) BuildIdentities(index uint64, tx *bbolt.Tx, rdm *common.RouterDataModel) error { for cursor := strategy.ae.GetStores().Identity.IterateIds(tx, ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { currentBytes := cursor.Current() currentId := string(currentBytes) @@ -995,13 +1288,13 @@ func (strategy *InstantStrategy) BuildIdentities(tx *bbolt.Tx) error { Action: edge_ctrl_pb.DataState_Create, Model: newModel, } - strategy.HandleIdentityEvent(newEvent, newModel) + rdm.HandleIdentityEvent(index, newEvent, newModel) } return nil } -func (strategy *InstantStrategy) BuildServices(tx *bbolt.Tx) error { +func (strategy *InstantStrategy) BuildServices(index uint64, tx *bbolt.Tx, rdm *common.RouterDataModel) error { for cursor := strategy.ae.GetStores().EdgeService.IterateIds(tx, ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { currentBytes := cursor.Current() currentId := string(currentBytes) @@ -1017,13 +1310,13 @@ func (strategy *InstantStrategy) BuildServices(tx *bbolt.Tx) error { Action: edge_ctrl_pb.DataState_Create, Model: newModel, } - strategy.HandleServiceEvent(newEvent, newModel) + rdm.HandleServiceEvent(index, newEvent, newModel) } return nil } -func (strategy *InstantStrategy) BuildPostureChecks(tx *bbolt.Tx) error { +func (strategy *InstantStrategy) BuildPostureChecks(index uint64, tx *bbolt.Tx, rdm *common.RouterDataModel) error { for cursor := strategy.ae.GetStores().PostureCheck.IterateIds(tx, ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { currentBytes := cursor.Current() currentId := string(currentBytes) @@ -1039,11 +1332,54 @@ func (strategy *InstantStrategy) BuildPostureChecks(tx *bbolt.Tx) error { Action: edge_ctrl_pb.DataState_Create, Model: newModel, } - strategy.HandlePostureCheckEvent(newEvent, newModel) + rdm.HandlePostureCheckEvent(index, newEvent, newModel) } return nil } +func (strategy *InstantStrategy) Validate() []error { + return strategy.ValidateAll(strategy.RouterDataModel) +} + +func (strategy *InstantStrategy) ValidateAll(rdm *common.RouterDataModel) []error { + var result []error + err := strategy.ae.GetDb().View(func(tx *bbolt.Tx) error { + if errs := strategy.ValidateConfigTypes(tx, rdm); len(errs) > 0 { + result = append(result, errs...) + } + + if errs := strategy.ValidateConfigs(tx, rdm); len(errs) > 0 { + result = append(result, errs...) + } + + if errs := strategy.ValidateIdentities(tx, rdm); len(errs) > 0 { + result = append(result, errs...) + } + + if errs := strategy.ValidateServices(tx, rdm); len(errs) > 0 { + result = append(result, errs...) + } + + if errs := strategy.ValidatePostureChecks(tx, rdm); len(errs) != 0 { + result = append(result, errs...) + } + + if errs := strategy.ValidateServicePolicies(tx, rdm); len(errs) != 0 { + result = append(result, errs...) + } + + // TODO: validate public keys + + return nil + }) + + if err != nil { + result = append(result, err) + } + + return result +} + func newIdentityById(tx *bbolt.Tx, ae *env.AppEnv, id string) (*edge_ctrl_pb.DataState_Identity, error) { identityModel, err := ae.GetStores().Identity.LoadById(tx, id) @@ -1080,6 +1416,18 @@ func newIdentity(identityModel *db.Identity) *edge_ctrl_pb.DataState_Identity { } } + var serviceConfigsMap map[string]*edge_ctrl_pb.DataState_ServiceConfigs + + if len(identityModel.ServiceConfigs) > 0 { + serviceConfigsMap = map[string]*edge_ctrl_pb.DataState_ServiceConfigs{} + } + + for serviceId, configInfo := range identityModel.ServiceConfigs { + serviceConfigs := &edge_ctrl_pb.DataState_ServiceConfigs{} + serviceConfigs.Configs = configInfo + serviceConfigsMap[serviceId] = serviceConfigs + } + return &edge_ctrl_pb.DataState_Identity{ Id: identityModel.Id, Name: identityModel.Name, @@ -1088,6 +1436,7 @@ func newIdentity(identityModel *db.Identity) *edge_ctrl_pb.DataState_Identity { ServiceHostingPrecedences: hostingPrecedences, ServiceHostingCosts: hostingCosts, AppDataJson: appDataJson, + ServiceConfigs: serviceConfigsMap, } } @@ -1101,6 +1450,47 @@ func newServicePolicy(storeModel *db.ServicePolicy) *edge_ctrl_pb.DataState_Serv return servicePolicy } +func newConfigTypeById(tx *bbolt.Tx, ae *env.AppEnv, id string) (*edge_ctrl_pb.DataState_ConfigType, error) { + storeModel, err := ae.GetStores().ConfigType.LoadById(tx, id) + + if err != nil { + return nil, err + } + + return newConfigType(storeModel), nil +} + +func newConfigType(storeModel *db.ConfigType) *edge_ctrl_pb.DataState_ConfigType { + return &edge_ctrl_pb.DataState_ConfigType{ + Id: storeModel.Id, + Name: storeModel.Name, + } +} + +func newConfigById(tx *bbolt.Tx, ae *env.AppEnv, id string) (*edge_ctrl_pb.DataState_Config, error) { + storeModel, err := ae.GetStores().Config.LoadById(tx, id) + + if err != nil { + return nil, err + } + + return newConfig(storeModel) +} + +func newConfig(entity *db.Config) (*edge_ctrl_pb.DataState_Config, error) { + jsonData, err := json.Marshal(entity.Data) + if err != nil { + return nil, err + } + + return &edge_ctrl_pb.DataState_Config{ + Id: entity.Id, + TypeId: entity.Type, + Name: entity.Name, + DataJson: string(jsonData), + }, nil +} + func newServiceById(tx *bbolt.Tx, ae *env.AppEnv, id string) (*edge_ctrl_pb.DataState_Service, error) { storeModel, err := ae.GetStores().EdgeService.LoadById(tx, id) @@ -1113,8 +1503,10 @@ func newServiceById(tx *bbolt.Tx, ae *env.AppEnv, id string) (*edge_ctrl_pb.Data func newService(storeModel *db.EdgeService) *edge_ctrl_pb.DataState_Service { return &edge_ctrl_pb.DataState_Service{ - Id: storeModel.Id, - Name: storeModel.Name, + Id: storeModel.Id, + Name: storeModel.Name, + EncryptionRequired: storeModel.EncryptionRequired, + Configs: storeModel.Configs, } } @@ -1261,6 +1653,30 @@ func (strategy *InstantStrategy) handleIdentity(index uint64, action edge_ctrl_p }) } +func (strategy *InstantStrategy) ConfigTypeCreate(index uint64, entity *db.ConfigType) { + strategy.handleConfigType(index, edge_ctrl_pb.DataState_Create, entity) +} + +func (strategy *InstantStrategy) ConfigTypeUpdate(index uint64, entity *db.ConfigType) { + strategy.handleConfigType(index, edge_ctrl_pb.DataState_Update, entity) +} + +func (strategy *InstantStrategy) ConfigTypeDelete(index uint64, entity *db.ConfigType) { + strategy.handleConfigType(index, edge_ctrl_pb.DataState_Delete, entity) +} + +func (strategy *InstantStrategy) ConfigCreate(index uint64, entity *db.Config) { + strategy.handleConfig(index, edge_ctrl_pb.DataState_Create, entity) +} + +func (strategy *InstantStrategy) ConfigUpdate(index uint64, entity *db.Config) { + strategy.handleConfig(index, edge_ctrl_pb.DataState_Update, entity) +} + +func (strategy *InstantStrategy) ConfigDelete(index uint64, entity *db.Config) { + strategy.handleConfig(index, edge_ctrl_pb.DataState_Delete, entity) +} + func (strategy *InstantStrategy) ServiceCreate(index uint64, service *db.EdgeService) { strategy.handleService(index, edge_ctrl_pb.DataState_Create, service) } @@ -1273,6 +1689,33 @@ func (strategy *InstantStrategy) ServiceDelete(index uint64, service *db.EdgeSer strategy.handleService(index, edge_ctrl_pb.DataState_Delete, service) } +func (strategy *InstantStrategy) handleConfigType(index uint64, action edge_ctrl_pb.DataState_Action, entity *db.ConfigType) { + configType := newConfigType(entity) + + strategy.addToChangeSet(index, &edge_ctrl_pb.DataState_Event{ + Action: action, + Model: &edge_ctrl_pb.DataState_Event_ConfigType{ + ConfigType: configType, + }, + }) +} + +func (strategy *InstantStrategy) handleConfig(index uint64, action edge_ctrl_pb.DataState_Action, entity *db.Config) { + config, err := newConfig(entity) + + if err != nil { + pfxlog.Logger().WithError(err).WithField("configId", entity.Id).Error("unable to marshal config json") + return + } + + strategy.addToChangeSet(index, &edge_ctrl_pb.DataState_Event{ + Action: action, + Model: &edge_ctrl_pb.DataState_Event_Config{ + Config: config, + }, + }) +} + func (strategy *InstantStrategy) handleService(index uint64, action edge_ctrl_pb.DataState_Action, service *db.EdgeService) { svc := newService(service) diff --git a/dist/dist-packages/linux/install.bash b/dist/dist-packages/linux/install.bash index 304b579bf..b232e56ba 100644 --- a/dist/dist-packages/linux/install.bash +++ b/dist/dist-packages/linux/install.bash @@ -139,7 +139,7 @@ main(){ exit 1 fi # Detect the system's distribution family - if [ -f /etc/redhat-release ]; then + if [[ -f /etc/redhat-release || -f /etc/amazon-linux-release ]]; then installRedHat "$@" elif [ -f /etc/debian_version ]; then installDebian "$@" diff --git a/doc/ha/upgrading.md b/doc/ha/upgrading.md index 4c2ab03cd..925353670 100644 --- a/doc/ha/upgrading.md +++ b/doc/ha/upgrading.md @@ -2,6 +2,18 @@ ## Controller Changes +### Updating Certificates + +The controller client certificate (or server certificate if it's also used as the client), must have +a SPIFFE ID in it. This is how controllers present their identity to other controllers. + +You may need to regenerate the controller's client and/or server certificate. As long as you use the +same root certificate, there shouldn't be any client/router connection issues. There is no need to +regenerate intermediate certificates using for signing client/router certificates. + +Outstanding enrollments will need to be re-issued as they are signed by the controller's server +certificate. + ### Updating Configuration Add a `raft` stanza to the configuration. See the @@ -13,6 +25,16 @@ raft: dataDir: /path/to/data/dir ``` +Add `advertiseAddress` to the `ctrl` stanza. Note that the `advertiseAddress` should have the +hostname or IP at which other controllers can reach this controller. + +```yaml +ctrl: + listener: tls:127.0.0.1:6262 + options: + advertiseAddress: tls:192.168.1.100:6262 +``` + The `dataDir` will be used to store the following: * `ctrl-ha.db` - the ziti model bbolt database diff --git a/etc/ctrl.with.edge.yml b/etc/ctrl.with.edge.yml index 060650aa4..9490523ed 100644 --- a/etc/ctrl.with.edge.yml +++ b/etc/ctrl.with.edge.yml @@ -263,16 +263,9 @@ web: # - edge-client # - fabric-management - binding: health-checks - options: { } - binding: fabric - binding: edge-management - # options - variable optional/required - # This section is used to define values that are specified by the API they are associated with. - # These settings are per API. The example below is for the `edge-api` and contains both optional values and - # required values. - options: { } - binding: edge-client - options: { } - binding: edge-oidc options: secret: 38de0de7fa283e8c8ef2a7823a6d3e727681ade50b9eb7bee2424197fb22bf18 diff --git a/go.mod b/go.mod index e3de773ef..f70ed7c3a 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ require ( github.com/natefinch/lumberjack v2.0.0+incompatible github.com/openziti/agent v1.0.16 github.com/openziti/channel/v2 v2.0.136 - github.com/openziti/edge-api v0.26.20 + github.com/openziti/edge-api v0.26.22 github.com/openziti/foundation/v2 v2.0.47 github.com/openziti/identity v1.0.81 github.com/openziti/jwks v1.0.3 @@ -175,11 +175,11 @@ require ( github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.mongodb.org/mongo-driver v1.15.0 // indirect + go.mongodb.org/mongo-driver v1.16.0 // indirect go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect + go.opentelemetry.io/otel v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.28.0 // indirect + go.opentelemetry.io/otel/trace v1.28.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect diff --git a/go.sum b/go.sum index 23aab80b7..9f332afba 100644 --- a/go.sum +++ b/go.sum @@ -570,8 +570,8 @@ github.com/openziti/channel/v2 v2.0.136 h1:XWjcNrPhto2XiD5HLhsh7GhmqfHEweQIJ/eUj github.com/openziti/channel/v2 v2.0.136/go.mod h1:7jhk6JtJPP1O8aWYx+w2IuwCunFJ88Ot4AQcrKiX5og= github.com/openziti/dilithium v0.3.3 h1:PLgQ6PMNLSTzCFbX/h98cmudgz/cU6TmjdSv5NAPD8k= github.com/openziti/dilithium v0.3.3/go.mod h1:vsCjI2AU/hon9e+dLhUFbCNGesJDj2ASgkySOcpmvjo= -github.com/openziti/edge-api v0.26.20 h1:r/61qDzU475mTXjZV/t3oGNN5szndzAR4OyhKjXb2jk= -github.com/openziti/edge-api v0.26.20/go.mod h1:BQryKiWKvoVn4sZEjVToSW/2tL+M1ylSWsNzRKUfl9Q= +github.com/openziti/edge-api v0.26.22 h1:kpd+SxdO4UO4/SO3DFWyndseY90J5zWtO5EsAqHJHvM= +github.com/openziti/edge-api v0.26.22/go.mod h1:t0qfgV5u2+HItpvgDIShA69v6m7RZ+PrbQuLQaDDdx8= github.com/openziti/foundation/v2 v2.0.47 h1:f2LM6FQOhHXJ9QMTpr4GAKq8qXspNG3EGczMjjyz7uc= github.com/openziti/foundation/v2 v2.0.47/go.mod h1:pj5nPmVtAdF1QX+aRtALw69hxcsAzrWDpBUe+Zrc73Q= github.com/openziti/identity v1.0.81 h1:zeS+sCxsfIbNAvlLHqM+74BcCPitW4Vpmarlrcun6hw= @@ -804,8 +804,8 @@ go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= -go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.mongodb.org/mongo-driver v1.16.0 h1:tpRsfBJMROVHKpdGyc1BBEzzjDUWjItxbVSZ8Ls4BQ4= +go.mongodb.org/mongo-driver v1.16.0/go.mod h1:oB6AhJQvFQL4LEHyXi6aJzQJtBiTQHiAd83l0GdFaiw= go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 h1:CCriYyAfq1Br1aIYettdHZTy8mBTIPo7We18TuO/bak= go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= @@ -816,14 +816,14 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= +go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= +go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= +go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= +go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= diff --git a/router/state/dataState.go b/router/state/dataState.go index 8809b3373..5e8e5b954 100644 --- a/router/state/dataState.go +++ b/router/state/dataState.go @@ -30,11 +30,11 @@ func (dsh *DataStateHandler) HandleReceive(msg *channel.Message, ch channel.Chan return } - model := common.NewReceiverRouterDataModel(RouterDataModelListerBufferSize) + model := common.NewReceiverRouterDataModel(RouterDataModelListerBufferSize, dsh.state.GetEnv().GetCloseNotify()) pfxlog.Logger().WithField("endIndex", newState.EndIndex).Debug("received full router data model state") for _, event := range newState.Events { - model.Handle(event) + model.Handle(newState.EndIndex, event) } model.SetCurrentIndex(newState.EndIndex) diff --git a/router/state/dataStateChangeSetEvent.go b/router/state/dataStateChangeSetEvent.go index 2f4176d9d..49c748a6e 100644 --- a/router/state/dataStateChangeSetEvent.go +++ b/router/state/dataStateChangeSetEvent.go @@ -26,7 +26,7 @@ func (eventHandler *dataStateChangeSetHandler) HandleReceive(msg *channel.Messag } model := eventHandler.state.RouterDataModel() - pfxlog.Logger().WithField("index", newEvent.Index).Debug("received data state change set") + pfxlog.Logger().WithField("index", newEvent.Index).Info("received data state change set") model.ApplyChangeSet(newEvent) } diff --git a/router/state/manager.go b/router/state/manager.go index fff247234..62c1662a9 100644 --- a/router/state/manager.go +++ b/router/state/manager.go @@ -36,6 +36,7 @@ import ( "github.com/sirupsen/logrus" "google.golang.org/protobuf/proto" "math/rand" + "os" "strings" "sync" "sync/atomic" @@ -207,11 +208,15 @@ func (sm *ManagerImpl) StartRouterModelSave(filePath string, duration time.Durat } func (sm *ManagerImpl) LoadRouterModel(filePath string) { - model, err := common.NewReceiverRouterDataModelFromFile(filePath, RouterDataModelListerBufferSize) + model, err := common.NewReceiverRouterDataModelFromFile(filePath, RouterDataModelListerBufferSize, sm.env.GetCloseNotify()) if err != nil { - pfxlog.Logger().WithError(err).Infof("could not load router model from file [%s]", filePath) - model = common.NewReceiverRouterDataModel(RouterDataModelListerBufferSize) + if !os.IsNotExist(err) { + pfxlog.Logger().WithError(err).Errorf("could not load router model from file [%s]", filePath) + } else { + pfxlog.Logger().Infof("router data model file does not exist [%s]", filePath) + } + model = common.NewReceiverRouterDataModel(RouterDataModelListerBufferSize, sm.env.GetCloseNotify()) } sm.SetRouterDataModel(model) @@ -322,20 +327,19 @@ func (sm *ManagerImpl) pubKeyLookup(token *jwt.Token) (any, error) { } func (sm *ManagerImpl) RouterDataModel() *common.RouterDataModel { - rdm := sm.routerDataModel.Load() - if rdm == nil { - rdm = common.NewReceiverRouterDataModel(RouterDataModelListerBufferSize) - sm.routerDataModel.Store(rdm) - } - return rdm + return sm.routerDataModel.Load() } func (sm *ManagerImpl) SetRouterDataModel(model *common.RouterDataModel) { publicKeys := model.PublicKeys.Items() pfxlog.Logger().Debugf("number of public keys in rdm: %d", len(publicKeys)) - sm.routerDataModel.Store(model) - + existing := sm.routerDataModel.Swap(model) + if existing != nil { + existing.Stop() + model.InheritSubscribers(existing) + } + model.SyncAllSubscribers() } func (sm *ManagerImpl) MarkSyncInProgress(trackerId string) { diff --git a/router/xgress_edge/accept.go b/router/xgress_edge/accept.go index 0e1a9752f..0ed152dac 100644 --- a/router/xgress_edge/accept.go +++ b/router/xgress_edge/accept.go @@ -101,10 +101,43 @@ func (self *Acceptor) BindChannel(binding channel.Binding) error { // Since data is most common type, it gets to dispatch directly binding.AddTypedReceiveHandler(proxy.msgMux) binding.AddCloseHandler(proxy) - + binding.AddPeekHandler(debugPeekHandler{}) return self.sessionBindHandler.BindChannel(binding, proxy) } +type debugPeekHandler struct{} + +func (d debugPeekHandler) Connect(ch channel.Channel, remoteAddress string) { +} + +func (d debugPeekHandler) Rx(m *channel.Message, ch channel.Channel) { + if m.ContentType == edge.ContentTypeDialSuccess || m.ContentType == edge.ContentTypeDialFailed { + connId, _ := m.GetUint32Header(edge.ConnIdHeader) + result, err := edge.UnmarshalDialResult(m) + if err != nil { + pfxlog.Logger().WithError(err).Infof("err unmarshalling dial result, seq: %d , replyTo: %d, connId: %d", + m.Sequence(), m.ReplyFor(), connId) + } else { + pfxlog.Logger().Infof("received dial result: seq: %d , replyTo: %d, connId: %d, newConnId: %d, success: %v, msg: %s", + m.Sequence(), m.ReplyFor(), connId, result.NewConnId, result.Success, result.Message) + } + } +} + +func (d debugPeekHandler) Tx(m *channel.Message, ch channel.Channel) { + if m.ContentType == edge.ContentTypeDial { + connId, _ := m.GetUint32Header(edge.ConnIdHeader) + newConnId, _ := m.GetUint32Header(edge.RouterProvidedConnId) + circuitId, _ := m.GetStringHeader(edge.CircuitIdHeader) + + pfxlog.Logger().Infof("sending dial: seq: %d , connId: %d, newConnId: %d, circuitId: %s", + m.Sequence(), connId, newConnId, circuitId) + } +} + +func (d debugPeekHandler) Close(ch channel.Channel) { +} + func NewAcceptor(listener *listener, uListener channel.UnderlayListener, options *channel.Options) *Acceptor { sessionHandler := newSessionConnectHandler(listener.factory.stateManager, listener.options, listener.factory.metricsRegistry) diff --git a/router/xgress_edge/dialer.go b/router/xgress_edge/dialer.go index f84a04c12..0d11a9bb5 100644 --- a/router/xgress_edge/dialer.go +++ b/router/xgress_edge/dialer.go @@ -128,6 +128,7 @@ func (dialer *dialer) Dial(params xgress.DialParams) (xt.PeerData, error) { if timeToDeadline > 0 && timeToDeadline < to { to = timeToDeadline } + log.Info("sending dial request to sdk") reply, err := dialRequest.WithPriority(channel.Highest).WithTimeout(to).SendForReply(terminator.Channel) if err != nil { conn.close(false, err.Error()) @@ -144,6 +145,7 @@ func (dialer *dialer) Dial(params xgress.DialParams) (xt.PeerData, error) { if !result.Success { msg := fmt.Sprintf("failed to establish connection with terminator address %v. error: (%v)", terminatorAddress, result.Message) + log.Info(msg) conn.close(false, msg) x.Close() return nil, fmt.Errorf(msg) diff --git a/router/xgress_edge/factory.go b/router/xgress_edge/factory.go index a2e416f82..c25feddd6 100644 --- a/router/xgress_edge/factory.go +++ b/router/xgress_edge/factory.go @@ -122,7 +122,7 @@ func (factory *Factory) LoadConfig(configMap map[interface{}]interface{}) error if factory.routerConfig.Ha.Enabled { factory.stateManager.LoadRouterModel(factory.edgeRouterConfig.Db) } else { - factory.stateManager.SetRouterDataModel(common.NewReceiverRouterDataModel(state.RouterDataModelListerBufferSize)) + factory.stateManager.SetRouterDataModel(common.NewReceiverRouterDataModel(state.RouterDataModelListerBufferSize, factory.env.GetCloseNotify())) } go apiproxy.Start(config) diff --git a/router/xgress_edge_tunnel/fabric.go b/router/xgress_edge_tunnel/fabric.go index c53ed86da..c306ccca0 100644 --- a/router/xgress_edge_tunnel/fabric.go +++ b/router/xgress_edge_tunnel/fabric.go @@ -251,7 +251,8 @@ func (self *fabricProvider) tunnelServiceV1( peerData map[uint32][]byte, keyPair *kx.KeyPair) error { - log := logrus.WithField("service", service.GetName()) + log := logrus.WithField("service", service.GetName()). + WithField("ctrlId", ctrlCh.Id()) sessionId := self.getDialSession(service.GetName()) request := &edge_ctrl_pb.CreateCircuitForServiceRequest{ @@ -316,7 +317,8 @@ func (self *fabricProvider) tunnelServiceV2( peerData map[uint32][]byte, keyPair *kx.KeyPair) error { - log := logrus.WithField("service", service.GetName()) + log := logrus.WithField("service", service.GetName()). + WithField("ctrlId", ctrlCh.Id()) rdm := self.factory.stateManager.RouterDataModel() if policy, err := posture.HasAccess(rdm, self.factory.routerConfig.Id.Token, service.GetId(), nil, edge_ctrl_pb.PolicyType_DialPolicy); err != nil && policy != nil { diff --git a/tests/context.go b/tests/context.go index 96f4b8ce4..40b9b58d7 100644 --- a/tests/context.go +++ b/tests/context.go @@ -18,6 +18,7 @@ package tests import ( "github.com/openziti/ziti/controller/config" + "github.com/openziti/ziti/zitirest" "io" "net" "net/http" @@ -125,6 +126,7 @@ type TestContext struct { AdminAuthenticator *updbAuthenticator AdminManagementSession *session AdminClientSession *session + RestClients *zitirest.Clients fabricController *controller.Controller EdgeController *server.Controller Req *require.Assertions @@ -260,7 +262,7 @@ func (ctx *TestContext) DefaultManagementApiClient() *resty.Client { ctx.managementApiClient, _, _ = ctx.NewClientComponents(EdgeManagementApiPath) ctx.managementApiClient.AllowGetMethodPayload = true } - return ctx.clientApiClient + return ctx.managementApiClient } func (ctx *TestContext) NewClientComponents(apiPath string) (*resty.Client, *http.Client, *http.Transport) { @@ -479,22 +481,33 @@ func (ctx *TestContext) startTransitRouter() { func (ctx *TestContext) CreateEnrollAndStartTunnelerEdgeRouter(roleAttributes ...string) { ctx.shutdownRouters() ctx.createAndEnrollEdgeRouter(true, roleAttributes...) - ctx.startEdgeRouter() + ctx.startEdgeRouter(nil) +} + +func (ctx *TestContext) CreateEnrollAndStartEdgeRouter(roleAttributes ...string) *router.Router { + ctx.shutdownRouters() + ctx.createAndEnrollEdgeRouter(false, roleAttributes...) + return ctx.startEdgeRouter(nil) } -func (ctx *TestContext) CreateEnrollAndStartEdgeRouter(roleAttributes ...string) { +func (ctx *TestContext) CreateEnrollAndStartHAEdgeRouter(roleAttributes ...string) *router.Router { ctx.shutdownRouters() ctx.createAndEnrollEdgeRouter(false, roleAttributes...) - ctx.startEdgeRouter() + return ctx.startEdgeRouter(func(r *router.Config) { + r.Ha.Enabled = true + }) } -func (ctx *TestContext) startEdgeRouter() { +func (ctx *TestContext) startEdgeRouter(cfgTweaks func(*router.Config)) *router.Router { configFile := EdgeRouterConfFile if ctx.edgeRouterEntity.isTunnelerEnabled { configFile = TunnelerEdgeRouterConfFile } config, err := router.LoadConfig(configFile) ctx.Req.NoError(err) + if cfgTweaks != nil { + cfgTweaks(config) + } newRouter := router.Create(config, NewVersionProviderTest()) ctx.routers = append(ctx.routers, newRouter) @@ -508,6 +521,7 @@ func (ctx *TestContext) startEdgeRouter() { ctx.Req.NoError(newRouter.RegisterXrctrl(xgressEdgeTunnelFactory)) ctx.Req.NoError(newRouter.RegisterXrctrl(newRouter.GetStateManager())) ctx.Req.NoError(newRouter.Start()) + return newRouter } func (ctx *TestContext) EnrollIdentity(identityId string) *ziti.Config { @@ -551,6 +565,9 @@ func (ctx *TestContext) RequireAdminManagementApiLogin() { var err error ctx.AdminManagementSession, err = ctx.AdminAuthenticator.AuthenticateManagementApi(ctx) ctx.Req.NoError(err) + ctx.RestClients, err = zitirest.NewManagementClients(ctx.ApiHost) + ctx.Req.NoError(err) + ctx.RestClients.SetSessionToken(*ctx.AdminManagementSession.AuthResponse.Token) } func (ctx *TestContext) RequireAdminClientApiLogin() { @@ -577,6 +594,11 @@ func (ctx *TestContext) newAnonymousClientApiRequest() *resty.Request { SetHeader("content-type", "application/json") } +func (ctx *TestContext) newAnonymousManagementApiRequest() *resty.Request { + return ctx.DefaultManagementApiClient().R(). + SetHeader("content-type", "application/json") +} + func (ctx *TestContext) newRequestWithClientCert(cert *x509.Certificate, privateKey crypto.PrivateKey) *resty.Request { client, _, _ := ctx.NewClientComponentsWithClientCert(cert, privateKey) diff --git a/tests/external_jwt_signer_test.go b/tests/external_jwt_signer_test.go index 8e5c75940..4132a1a45 100644 --- a/tests/external_jwt_signer_test.go +++ b/tests/external_jwt_signer_test.go @@ -63,7 +63,51 @@ func Test_ExternalJWTSigner(t *testing.T) { ctx.Req.NoError(err) ctx.Req.Equal(http.StatusCreated, resp.StatusCode()) - t.Run("get after create returns 200 Ok", func(t *testing.T) { + t.Run("list after create returns 200 OK and a list as an admin on the management api", func(t *testing.T) { + ctx.testContextChanged(t) + jwtSignerListEnv := &rest_model.ListExternalJWTSignersEnvelope{} + + resp, err := ctx.AdminManagementSession.newAuthenticatedRequest().SetResult(jwtSignerListEnv).Get("/external-jwt-signers/") + ctx.Req.NoError(err) + ctx.Req.Equal(http.StatusOK, resp.StatusCode()) + + t.Run("list response has 1 entry", func(t *testing.T) { + ctx.testContextChanged(t) + + ctx.Req.NotNil(jwtSignerListEnv) + ctx.Req.NotNil(jwtSignerListEnv.Data) + ctx.Req.Len(jwtSignerListEnv.Data, 1) + }) + }) + + t.Run("list after create returns 401 as anonymous on the management api", func(t *testing.T) { + ctx.testContextChanged(t) + + resp, err := ctx.newAnonymousManagementApiRequest().Get("/external-jwt-signers") + ctx.Req.NoError(err) + ctx.Req.Equal(http.StatusUnauthorized, resp.StatusCode()) + }) + + t.Run("list after create returns 200 OK and a list as anonymous on the client api", func(t *testing.T) { + ctx.testContextChanged(t) + jwtSignerListEnv := &rest_model.ListExternalJWTSignersEnvelope{} + + resp, err := ctx.newAnonymousClientApiRequest().SetResult(jwtSignerListEnv).Get("/external-jwt-signers/") + ctx.Req.NoError(err) + ctx.Req.Equal(http.StatusOK, resp.StatusCode()) + + t.Run("list response has 1 entry", func(t *testing.T) { + ctx.testContextChanged(t) + + ctx.Req.NotNil(jwtSignerListEnv) + ctx.Req.NotNil(jwtSignerListEnv.Data) + ctx.Req.Len(jwtSignerListEnv.Data, 1) + ctx.Req.Equal(*jwtSigner.Name, *jwtSignerListEnv.Data[0].Name) + ctx.Req.Equal(*jwtSigner.ExternalAuthURL, *jwtSignerListEnv.Data[0].ExternalAuthURL) + }) + }) + + t.Run("detail after create returns 200 Ok", func(t *testing.T) { ctx.testContextChanged(t) jwtSignerDetailEnv := &rest_model.DetailExternalJWTSignerEnvelope{} diff --git a/tests/router_data_model_test.go b/tests/router_data_model_test.go new file mode 100644 index 000000000..a166fcf8e --- /dev/null +++ b/tests/router_data_model_test.go @@ -0,0 +1,499 @@ +//go:build dataflow +// +build dataflow + +/* + Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package tests + +import ( + "encoding/json" + "github.com/google/uuid" + "github.com/openziti/edge-api/rest_management_api_client/posture_checks" + "github.com/openziti/edge-api/rest_model" + "github.com/openziti/ziti/common" + "github.com/openziti/ziti/common/eid" + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + "strings" + "sync" + "testing" + "time" +) + +type identityEvent struct { + state *common.IdentityState + eventType common.IdentityEventType +} + +type serviceEvent struct { + state *common.IdentityState + service *common.IdentityService + eventType common.ServiceEventType +} + +type testSubscriber struct { + ctx *TestContext + identityEvents chan *identityEvent + serviceEvents chan *serviceEvent + currentState *common.IdentityState + mutex sync.Mutex + savedServiceEvents []*serviceEvent +} + +func newTestSubscriber(ctx *TestContext) *testSubscriber { + return &testSubscriber{ + ctx: ctx, + identityEvents: make(chan *identityEvent, 100), + serviceEvents: make(chan *serviceEvent, 100), + } +} + +func (self *testSubscriber) NotifyIdentityEvent(state *common.IdentityState, eventType common.IdentityEventType) { + self.mutex.Lock() + defer self.mutex.Unlock() + self.identityEvents <- &identityEvent{ + state: state, + eventType: eventType, + } + self.currentState = state +} + +func (self *testSubscriber) NotifyServiceChange(state *common.IdentityState, service *common.IdentityService, eventType common.ServiceEventType) { + self.mutex.Lock() + defer self.mutex.Unlock() + + self.serviceEvents <- &serviceEvent{ + state: state, + service: service, + eventType: eventType, + } + self.currentState = state +} + +func (self *testSubscriber) getNextIdentityEvent(eventType common.IdentityEventType) *identityEvent { + select { + case evt := <-self.identityEvents: + self.ctx.Equal(eventType, evt.eventType) + return evt + case <-time.After(time.Second): + self.ctx.Fail("timed out waiting for identity event") + return nil + } +} + +func (self *testSubscriber) getSavedEvent(eventType common.ServiceEventType) *serviceEvent { + var newList []*serviceEvent + var result *serviceEvent + for _, savedEvent := range self.savedServiceEvents { + if savedEvent.eventType == eventType { + result = savedEvent + } else { + newList = append(newList, savedEvent) + } + } + self.savedServiceEvents = newList + return result +} + +func (self *testSubscriber) getNextServiceEvent(eventType common.ServiceEventType) *serviceEvent { + evt := self.getSavedEvent(eventType) + if evt != nil { + return evt + } + + select { + case evt = <-self.serviceEvents: + self.ctx.Equal(eventType, evt.eventType) + return evt + case <-time.After(time.Second): + self.ctx.Fail("timed out waiting for service event") + return nil + } +} + +func (self *testSubscriber) getNextServiceEventOfType(eventType common.ServiceEventType) *serviceEvent { + evt := self.getSavedEvent(eventType) + if evt != nil { + return evt + } + + start := time.Now() + for time.Since(start) < time.Second { + select { + case evt = <-self.serviceEvents: + if evt.eventType == eventType { + return evt + } else { + self.savedServiceEvents = append(self.savedServiceEvents, evt) + } + case <-time.After(time.Second): + self.ctx.Fail("timed out waiting for service event") + return nil + } + } + self.ctx.Fail("timed out waiting for service event") + return nil +} + +func Test_RouterDataModel_ServicePolicies(t *testing.T) { + ctx := NewTestContext(t) + defer ctx.Teardown() + ctx.StartServer() + ctx.RequireAdminManagementApiLogin() + + router := ctx.CreateEnrollAndStartHAEdgeRouter() + + sub := newTestSubscriber(ctx) + + identityRole1 := eid.New() + identityRole2 := eid.New() + + testIdentity, _ := ctx.AdminManagementSession.requireCreateIdentityWithUpdbEnrollment(eid.New(), eid.New(), false, identityRole1, identityRole2) + ctx.Req.NoError(router.GetRouterDataModel().SubscribeToIdentityChanges(testIdentity.Id, sub, false)) + + // test that initial event shows up + idEvent := sub.getNextIdentityEvent(common.EventFullState) + ctx.Equal(0, len(idEvent.state.Services)) + ctx.Equal(0, len(idEvent.state.PostureChecks)) + + serviceRole1 := eid.New() + serviceRole2 := eid.New() + service1 := ctx.AdminManagementSession.requireNewService(s(serviceRole1), nil) + + policy1 := ctx.AdminManagementSession.requireNewServicePolicyWithSemantic("Dial", "AnyOf", s("#"+serviceRole1, "#"+serviceRole2), s("#"+identityRole1), s()) + + svcEvent := sub.getNextServiceEvent(common.EventAccessGained) + ctx.Equal(service1.Id, svcEvent.service.Service.Id) + ctx.Equal(true, svcEvent.service.DialAllowed) + ctx.Equal(false, svcEvent.service.BindAllowed) + + // add and remove a policy to ensure no extraneous events are created + policy2 := ctx.AdminManagementSession.requireNewServicePolicy("Dial", s("#"+serviceRole1), s("#"+identityRole1), s()) + ctx.AdminManagementSession.requireDeleteEntity(policy2) + + // add a policy for later + _ = ctx.AdminManagementSession.requireNewServicePolicy("Dial", s("#"+serviceRole2), s("#"+identityRole1), s()) + + // add a bind policy to ensure and make sure the service change shows up + policy2 = ctx.AdminManagementSession.requireNewServicePolicyWithSemantic("Bind", "AnyOf", s("#"+serviceRole1, "#"+serviceRole2), s("#"+identityRole1), s()) + + svcEvent = sub.getNextServiceEvent(common.EventUpdated) + ctx.Equal(service1.Id, svcEvent.service.Service.Id) + ctx.Equal(true, svcEvent.service.DialAllowed) + ctx.Equal(true, svcEvent.service.BindAllowed) + + // remove the initial policy, dial should now be disabled + ctx.AdminManagementSession.requireDeleteEntity(policy1) + + svcEvent = sub.getNextServiceEvent(common.EventUpdated) + ctx.Equal(service1.Id, svcEvent.service.Service.Id) + ctx.Equal(false, svcEvent.service.DialAllowed) + ctx.Equal(true, svcEvent.service.BindAllowed) + + service2 := ctx.AdminManagementSession.requireNewService(s(serviceRole2), nil) + svcEvent = sub.getNextServiceEvent(common.EventAccessGained) + ctx.Equal(service2.Id, svcEvent.service.Service.Id) + ctx.Equal(true, svcEvent.service.DialAllowed) + ctx.Equal(true, svcEvent.service.BindAllowed) + + // testing losing access via loss of policy + ctx.AdminManagementSession.requireDeleteEntity(policy2) + + svcEvent = sub.getNextServiceEventOfType(common.EventAccessRemoved) + ctx.Equal(service1.Id, svcEvent.service.Service.Id) + + svcEvent = sub.getNextServiceEventOfType(common.EventUpdated) + ctx.Equal(service2.Id, svcEvent.service.Service.Id) + ctx.Equal(true, svcEvent.service.DialAllowed) + ctx.Equal(false, svcEvent.service.BindAllowed) + + // testing losing access via service being removed + ctx.AdminManagementSession.requireDeleteEntity(service2) + svcEvent = sub.getNextServiceEvent(common.EventAccessRemoved) + ctx.Equal(service2.Id, svcEvent.service.Service.Id) +} + +func Test_RouterDataModel_Configs(t *testing.T) { + ctx := NewTestContext(t) + defer ctx.Teardown() + ctx.StartServer() + ctx.RequireAdminManagementApiLogin() + + router := ctx.CreateEnrollAndStartHAEdgeRouter() + + sub := newTestSubscriber(ctx) + + identityRole1 := eid.New() + identityRole2 := eid.New() + + testIdentity, _ := ctx.AdminManagementSession.requireCreateIdentityWithUpdbEnrollment(eid.New(), eid.New(), false, identityRole1, identityRole2) + ctx.Req.NoError(router.GetRouterDataModel().SubscribeToIdentityChanges(testIdentity.Id, sub, false)) + + // test that initial event shows up + idEvent := sub.getNextIdentityEvent(common.EventFullState) + ctx.Equal(0, len(idEvent.state.Services)) + ctx.Equal(0, len(idEvent.state.PostureChecks)) + + ct := ctx.newConfigType() + ct.Schema = map[string]interface{}{ + "$id": "http://ziti-edge.netfoundry.io/schemas/test.config.json", + "type": "object", + "additionalProperties": false, + "required": []interface{}{ + "hostname", + "port", + }, + "properties": map[string]interface{}{ + "hostname": map[string]interface{}{ + "type": "string", + }, + "port": map[string]interface{}{ + "type": "number", + }, + }, + } + ctx.AdminManagementSession.requireCreateEntity(ct) + + cfg := ctx.newConfig(ct.Id, map[string]interface{}{ + "port": float64(22), + "hostname": "ssh.globotech.bizniz", + }) + ctx.AdminManagementSession.requireCreateEntity(cfg) + + serviceRole1 := eid.New() + service1 := ctx.AdminManagementSession.requireNewService(s(serviceRole1), s(cfg.Id)) + + ctx.AdminManagementSession.requireNewServicePolicy("Dial", s("#"+serviceRole1), s("#"+identityRole1), s()) + + svcEvent := sub.getNextServiceEvent(common.EventAccessGained) + ctx.Equal(service1.Id, svcEvent.service.Service.Id) + ctx.Equal(true, svcEvent.service.DialAllowed) + ctx.Equal(false, svcEvent.service.BindAllowed) + ctx.NotNil(svcEvent.service.Configs[ct.Name]) + ctx.Equal(ct.Id, svcEvent.service.Configs[ct.Name].ConfigType.Id) + ctx.Equal(ct.Name, svcEvent.service.Configs[ct.Name].ConfigType.Name) + ctx.Equal(cfg.Id, svcEvent.service.Configs[ct.Name].Config.Id) + ctx.Equal(cfg.Name, svcEvent.service.Configs[ct.Name].Config.Name) + + configData := map[string]interface{}{} + ctx.NoError(json.Unmarshal([]byte(svcEvent.service.Configs[ct.Name].Config.DataJson), &configData)) + ctx.Equal(float64(22), configData["port"]) + ctx.Equal("ssh.globotech.bizniz", configData["hostname"]) + + // create new config type and config, and ensure we don't get any spurious events + ct2 := ctx.newConfigType() + ct2.Schema = map[string]interface{}{ + "$id": "http://ziti-edge.netfoundry.io/schemas/test.config.json", + "type": "object", + "additionalProperties": false, + "required": []interface{}{ + "port", + }, + "properties": map[string]interface{}{ + "port": map[string]interface{}{ + "type": "number", + }, + }, + } + ctx.AdminManagementSession.requireCreateEntity(ct2) + + cfg2 := ctx.newConfig(ct2.Id, map[string]interface{}{ + "port": float64(22), + }) + ctx.AdminManagementSession.requireCreateEntity(cfg2) + + // change config type name + oldConfigTypeName := ct.Name + ct.Name = eid.New() + ctx.AdminManagementSession.requireUpdateEntity(ct) + + svcEvent = sub.getNextServiceEvent(common.EventUpdated) + ctx.Equal(service1.Id, svcEvent.service.Service.Id) + ctx.Nil(svcEvent.service.Configs[oldConfigTypeName]) + ctx.NotNil(svcEvent.service.Configs[ct.Name]) + ctx.Equal(ct.Id, svcEvent.service.Configs[ct.Name].ConfigType.Id) + ctx.Equal(ct.Name, svcEvent.service.Configs[ct.Name].ConfigType.Name) + ctx.Equal(cfg.Id, svcEvent.service.Configs[ct.Name].Config.Id) + ctx.Equal(cfg.Name, svcEvent.service.Configs[ct.Name].Config.Name) + + cfg.Data = map[string]interface{}{ + "port": float64(33), + "hostname": "fizzy.globotech.bizniz", + } + ctx.AdminManagementSession.requireUpdateEntity(cfg) + + svcEvent = sub.getNextServiceEvent(common.EventUpdated) + ctx.Equal(service1.Id, svcEvent.service.Service.Id) + ctx.NotNil(svcEvent.service.Configs[ct.Name]) + ctx.Equal(ct.Id, svcEvent.service.Configs[ct.Name].ConfigType.Id) + ctx.Equal(ct.Name, svcEvent.service.Configs[ct.Name].ConfigType.Name) + ctx.Equal(cfg.Id, svcEvent.service.Configs[ct.Name].Config.Id) + ctx.Equal(cfg.Name, svcEvent.service.Configs[ct.Name].Config.Name) + + configData = map[string]interface{}{} + ctx.NoError(json.Unmarshal([]byte(svcEvent.service.Configs[ct.Name].Config.DataJson), &configData)) + ctx.Equal(float64(33), configData["port"]) + ctx.Equal("fizzy.globotech.bizniz", configData["hostname"]) +} + +func Test_RouterDataModel_PostureChecks(t *testing.T) { + ctx := NewTestContext(t) + defer ctx.Teardown() + ctx.StartServer() + ctx.RequireAdminManagementApiLogin() + + router := ctx.CreateEnrollAndStartHAEdgeRouter() + + sub := newTestSubscriber(ctx) + + identityRole1 := eid.New() + identityRole2 := eid.New() + + testIdentity, _ := ctx.AdminManagementSession.requireCreateIdentityWithUpdbEnrollment(eid.New(), eid.New(), false, identityRole1, identityRole2) + ctx.Req.NoError(router.GetRouterDataModel().SubscribeToIdentityChanges(testIdentity.Id, sub, false)) + + // test that initial event shows up + idEvent := sub.getNextIdentityEvent(common.EventFullState) + ctx.Equal(0, len(idEvent.state.Services)) + ctx.Equal(0, len(idEvent.state.PostureChecks)) + + postureCheck1 := &rest_model.PostureCheckMacAddressCreate{ + MacAddresses: []string{strings.ReplaceAll(uuid.NewString(), "-", "")}, + } + postureCheckRole1 := eid.New() + postureCheck1.SetName(ToPtr("check1")) + postureCheck1.SetRoleAttributes(ToPtr(rest_model.Attributes(s(postureCheckRole1)))) + + resp, err := ctx.RestClients.Edge.PostureChecks.CreatePostureCheck(&posture_checks.CreatePostureCheckParams{ + PostureCheck: postureCheck1, + }, nil) + ctx.NoError(err) + postureCheck1Id := resp.Payload.Data.ID + + serviceRole1 := eid.New() + service1 := ctx.AdminManagementSession.requireNewService(s(serviceRole1), nil) + + postureCheckRole2 := eid.New() + sp := ctx.AdminManagementSession.requireNewServicePolicyWithSemantic("Dial", "AnyOf", s("#"+serviceRole1), s("#"+identityRole1), s("#"+postureCheckRole1, "#"+postureCheckRole2)) + + svcEvent := sub.getNextServiceEvent(common.EventAccessGained) + ctx.Equal(service1.Id, svcEvent.service.Service.Id) + ctx.Equal(true, svcEvent.service.DialAllowed) + ctx.Equal(false, svcEvent.service.BindAllowed) + + idEvent = sub.getNextIdentityEvent(common.EventPostureChecksUpdated) + ctx.Equal(1, len(idEvent.state.PostureChecks)) + testPostureCheck := idEvent.state.PostureChecks[postureCheck1Id] + ctx.NotNil(testPostureCheck) + subType, ok := testPostureCheck.Subtype.(*edge_ctrl_pb.DataState_PostureCheck_Mac_) + ctx.True(ok) + ctx.Equal(1, len(subType.Mac.MacAddresses)) + ctx.Equal(postureCheck1.MacAddresses[0], subType.Mac.MacAddresses[0]) + + // update posture check + postureUpdate1 := &rest_model.PostureCheckMacAddressPatch{ + MacAddresses: []string{strings.ReplaceAll(uuid.NewString(), "-", "")}, + } + _, err = ctx.RestClients.Edge.PostureChecks.PatchPostureCheck(&posture_checks.PatchPostureCheckParams{ + ID: postureCheck1Id, + PostureCheck: postureUpdate1, + }, nil) + ctx.NoError(err) + + idEvent = sub.getNextIdentityEvent(common.EventPostureChecksUpdated) + ctx.Equal(1, len(idEvent.state.PostureChecks)) + testPostureCheck = idEvent.state.PostureChecks[postureCheck1Id] + ctx.NotNil(testPostureCheck) + subType, ok = testPostureCheck.Subtype.(*edge_ctrl_pb.DataState_PostureCheck_Mac_) + ctx.True(ok) + ctx.Equal(1, len(subType.Mac.MacAddresses)) + ctx.Equal(postureUpdate1.MacAddresses[0], subType.Mac.MacAddresses[0]) + + // Add a second posture check + postureCheck2 := &rest_model.PostureCheckMacAddressCreate{ + MacAddresses: []string{strings.ReplaceAll(uuid.NewString(), "-", "")}, + } + postureCheck2.SetName(ToPtr("check2")) + postureCheck2.SetRoleAttributes(ToPtr(rest_model.Attributes(s(postureCheckRole2)))) + + resp, err = ctx.RestClients.Edge.PostureChecks.CreatePostureCheck(&posture_checks.CreatePostureCheckParams{ + PostureCheck: postureCheck2, + }, nil) + ctx.NoError(err) + postureCheck2Id := resp.Payload.Data.ID + + idEvent = sub.getNextIdentityEvent(common.EventPostureChecksUpdated) + ctx.Equal(2, len(idEvent.state.PostureChecks)) + testPostureCheck = idEvent.state.PostureChecks[postureCheck1Id] + ctx.NotNil(testPostureCheck) + subType, ok = testPostureCheck.Subtype.(*edge_ctrl_pb.DataState_PostureCheck_Mac_) + ctx.True(ok) + ctx.Equal(1, len(subType.Mac.MacAddresses)) + ctx.Equal(postureUpdate1.MacAddresses[0], subType.Mac.MacAddresses[0]) + + testPostureCheck = idEvent.state.PostureChecks[postureCheck2Id] + ctx.NotNil(testPostureCheck) + subType, ok = testPostureCheck.Subtype.(*edge_ctrl_pb.DataState_PostureCheck_Mac_) + ctx.True(ok) + ctx.Equal(1, len(subType.Mac.MacAddresses)) + ctx.Equal(postureCheck2.MacAddresses[0], subType.Mac.MacAddresses[0]) + + // remove one of the posture checks from the policy + sp.postureCheckRoles = s("#" + postureCheckRole2) + ctx.AdminManagementSession.requireUpdateEntity(sp) + + idEvent = sub.getNextIdentityEvent(common.EventPostureChecksUpdated) + ctx.Equal(1, len(idEvent.state.PostureChecks)) + testPostureCheck = idEvent.state.PostureChecks[postureCheck2Id] + ctx.NotNil(testPostureCheck) + subType, ok = testPostureCheck.Subtype.(*edge_ctrl_pb.DataState_PostureCheck_Mac_) + ctx.True(ok) + ctx.Equal(1, len(subType.Mac.MacAddresses)) + ctx.Equal(postureCheck2.MacAddresses[0], subType.Mac.MacAddresses[0]) + + // add it back + sp.postureCheckRoles = s("#"+postureCheckRole1, "#"+postureCheckRole2) + ctx.AdminManagementSession.requireUpdateEntity(sp) + + idEvent = sub.getNextIdentityEvent(common.EventPostureChecksUpdated) + ctx.Equal(2, len(idEvent.state.PostureChecks)) + + // delete the service + ctx.AdminManagementSession.requireDeleteEntity(service1) + idEvent = sub.getNextIdentityEvent(common.EventPostureChecksUpdated) + ctx.Equal(0, len(idEvent.state.PostureChecks)) + + service1 = ctx.AdminManagementSession.requireNewService(s(serviceRole1), nil) + idEvent = sub.getNextIdentityEvent(common.EventPostureChecksUpdated) + ctx.Equal(2, len(idEvent.state.PostureChecks)) + ctx.NotNil(idEvent.state.PostureChecks[postureCheck1Id]) + ctx.NotNil(idEvent.state.PostureChecks[postureCheck2Id]) + + // delete a posture check + _, err = ctx.RestClients.Edge.PostureChecks.DeletePostureCheck(&posture_checks.DeletePostureCheckParams{ + ID: postureCheck1Id, + }, nil) + ctx.NoError(err) + + idEvent = sub.getNextIdentityEvent(common.EventPostureChecksUpdated) + ctx.Equal(1, len(idEvent.state.PostureChecks)) + ctx.NotNil(idEvent.state.PostureChecks[postureCheck2Id]) + + // delete the service policy + ctx.AdminManagementSession.requireDeleteEntity(sp) + idEvent = sub.getNextIdentityEvent(common.EventPostureChecksUpdated) + ctx.Equal(0, len(idEvent.state.PostureChecks)) +} diff --git a/tests/service_list_refresh_test.go b/tests/service_list_refresh_test.go index 14320ef1c..8d4de9cad 100644 --- a/tests/service_list_refresh_test.go +++ b/tests/service_list_refresh_test.go @@ -316,8 +316,18 @@ func Test_ServiceListRefresh(t *testing.T) { nonAdminUserSession.requireServiceUpdateTimeAdvanced() nonAdminUserSession.requireServiceUpdateTimeUnchanged() - ctx.AdminManagementSession.requireDeleteEntity(config) + time.Sleep(time.Millisecond) + ctx.AdminManagementSession.requireRemoveIdentityServiceConfigs(identity.Id, serviceConfig{ + ServiceId: service.Id, + ConfigId: config.Id, + }) + nonAdminUserSession.requireServiceUpdateTimeAdvanced() + nonAdminUserSession.requireServiceUpdateTimeUnchanged() + + time.Sleep(time.Millisecond) + ctx.AdminManagementSession.requireDeleteEntity(config) + nonAdminUserSession.requireServiceUpdateTimeUnchanged() }) t.Run("test identity config removed", func(t *testing.T) { diff --git a/tests/service_test.go b/tests/service_test.go index e84efdd5a..e2178cb2a 100644 --- a/tests/service_test.go +++ b/tests/service_test.go @@ -285,7 +285,7 @@ func Test_ServiceListWithConfigs(t *testing.T) { } sort.Sort(sortableServiceConfigSlice(checkConfigs)) currentConfigs = ctx.AdminManagementSession.listIdentityServiceConfigs(*session.AuthResponse.IdentityID) - ctx.Req.Equal(checkConfigs, currentConfigs) + ctx.Req.Equal(checkConfigs, currentConfigs, "configs don't match for id %s", *session.AuthResponse.IdentityID) service1V.configs[configType3.Name] = config5 service3V.configs[configType1.Name] = config1 @@ -317,7 +317,10 @@ func Test_ServiceListWithConfigs(t *testing.T) { service.configs = map[string]*Config{} } - ctx.AdminManagementSession.requireRemoveIdentityServiceConfigs(*session.AuthResponse.IdentityID) + ctx.AdminManagementSession.requireRemoveIdentityServiceConfigs(*session.AuthResponse.IdentityID, + serviceConfig{ServiceId: service4.Id, ConfigId: config1.Id}, + serviceConfig{ServiceId: service4.Id, ConfigId: config5.Id}, + serviceConfig{ServiceId: service3.Id, ConfigId: config4.Id}) currentConfigs = ctx.AdminManagementSession.listIdentityServiceConfigs(*session.AuthResponse.IdentityID) ctx.Req.Equal(0, len(currentConfigs)) diff --git a/ziti/cmd/fabric/root.go b/ziti/cmd/fabric/root.go index 14f32e159..f71786e08 100644 --- a/ziti/cmd/fabric/root.go +++ b/ziti/cmd/fabric/root.go @@ -111,6 +111,7 @@ func newValidateCommand(p common.OptionsProvider) *cobra.Command { validateCmd.AddCommand(NewValidateTerminatorsCmd(p)) validateCmd.AddCommand(NewValidateRouterLinksCmd(p)) validateCmd.AddCommand(NewValidateRouterSdkTerminatorsCmd(p)) + validateCmd.AddCommand(NewValidateRouterDataModelCmd(p)) return validateCmd } diff --git a/ziti/cmd/fabric/validate_router_data_model.go b/ziti/cmd/fabric/validate_router_data_model.go new file mode 100644 index 000000000..a3b22240c --- /dev/null +++ b/ziti/cmd/fabric/validate_router_data_model.go @@ -0,0 +1,151 @@ +/* + Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package fabric + +import ( + "fmt" + "github.com/michaelquigley/pfxlog" + "github.com/openziti/channel/v2" + "github.com/openziti/channel/v2/protobufs" + "github.com/openziti/ziti/common/pb/mgmt_pb" + "github.com/openziti/ziti/ziti/cmd/api" + "github.com/openziti/ziti/ziti/cmd/common" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "os" + "time" +) + +type validateRouterDataModelAction struct { + api.Options + validateController bool + includeValidRouters bool + + eventNotify chan *mgmt_pb.RouterDataModelDetails +} + +func NewValidateRouterDataModelCmd(p common.OptionsProvider) *cobra.Command { + action := validateRouterDataModelAction{ + Options: api.Options{ + CommonOptions: p(), + }, + } + + validateLinksCmd := &cobra.Command{ + Use: "router-data-model ", + Short: "Validate the router data model", + Example: "ziti fabric validate router-data-model --filter 'name=\"my-router\"' --include-valid-routers", + Args: cobra.MaximumNArgs(1), + RunE: action.validateRouterDataModel, + } + + action.AddCommonFlags(validateLinksCmd) + validateLinksCmd.Flags().BoolVar(&action.validateController, "validate-controller", true, "Validate the router data model in the controller as well") + validateLinksCmd.Flags().BoolVar(&action.includeValidRouters, "include-successes", false, "Don't hide results for successes") + return validateLinksCmd +} + +func (self *validateRouterDataModelAction) validateRouterDataModel(_ *cobra.Command, args []string) error { + closeNotify := make(chan struct{}) + self.eventNotify = make(chan *mgmt_pb.RouterDataModelDetails, 1) + + bindHandler := func(binding channel.Binding) error { + binding.AddReceiveHandler(int32(mgmt_pb.ContentType_ValidateRouterDataModelResultType), self) + binding.AddCloseHandler(channel.CloseHandlerF(func(ch channel.Channel) { + close(closeNotify) + })) + return nil + } + + ch, err := api.NewWsMgmtChannel(channel.BindHandlerF(bindHandler)) + if err != nil { + return err + } + + filter := "" + if len(args) > 0 { + filter = args[0] + } + + request := &mgmt_pb.ValidateRouterDataModelRequest{ + RouterFilter: filter, + ValidateCtrl: self.validateController, + } + + responseMsg, err := protobufs.MarshalTyped(request).WithTimeout(time.Duration(self.Timeout) * time.Second).SendForReply(ch) + + response := &mgmt_pb.ValidateRouterDataModelResponse{} + if err = protobufs.TypedResponse(response).Unmarshall(responseMsg, err); err != nil { + return err + } + + if !response.Success { + return fmt.Errorf("failed to start router data model validation: %s", response.Message) + } + + fmt.Printf("started validation of %v components\n", response.ComponentCount) + + expected := response.ComponentCount + + errCount := 0 + for expected > 0 { + select { + case <-closeNotify: + fmt.Printf("channel closed, exiting") + return nil + case detail := <-self.eventNotify: + headerDone := false + outputHeader := func() { + if !headerDone { + if detail.ComponentType == "controller" { + fmt.Printf("controllerId: %s, success: %v\n", detail.ComponentId, detail.ValidateSuccess) + } else if detail.ComponentType == "router" { + fmt.Printf("routerId: %s, routerName: %v, success: %v\n", + detail.ComponentId, detail.ComponentName, detail.ValidateSuccess) + } + } + headerDone = true + } + + if self.includeValidRouters { + outputHeader() + } + + for _, errDetail := range detail.Errors { + outputHeader() + fmt.Printf("\t" + errDetail + "\n") + errCount++ + } + expected-- + } + } + fmt.Printf("%v errors found\n", errCount) + if errCount > 0 { + os.Exit(1) + } + return nil +} + +func (self *validateRouterDataModelAction) HandleReceive(msg *channel.Message, _ channel.Channel) { + detail := &mgmt_pb.RouterDataModelDetails{} + if err := proto.Unmarshal(msg.Body, detail); err != nil { + pfxlog.Logger().WithError(err).Error("unable to unmarshal router data model details") + return + } + + self.eventNotify <- detail +} diff --git a/ziti/cmd/fabric/validate_router_sdk_terminators.go b/ziti/cmd/fabric/validate_router_sdk_terminators.go index 2b6c489cb..d3c833335 100644 --- a/ziti/cmd/fabric/validate_router_sdk_terminators.go +++ b/ziti/cmd/fabric/validate_router_sdk_terminators.go @@ -131,7 +131,7 @@ func (self *validateRouterSdkTerminatorsAction) validateRouterSdkTerminators(_ * } fmt.Printf("\tid: %s, ctrlState: %v, routerState: %s, created: %s, lastAttempt: %s, reqOutstanding: %v\n", detail.TerminatorId, detail.CtrlState, detail.RouterState, - detail.CreateTime, detail.LastAttempt, detail.OperaationActive) + detail.CreateTime, detail.LastAttempt, detail.OperationActive) } if !detail.IsValid { errCount++ diff --git a/zititest/zitilab/zitirest/clients.go b/zitirest/clients.go similarity index 97% rename from zititest/zitilab/zitirest/clients.go rename to zitirest/clients.go index b40c9446d..63b1519e4 100644 --- a/zititest/zitilab/zitirest/clients.go +++ b/zitirest/clients.go @@ -83,8 +83,13 @@ func (self *Clients) Authenticate(user, password string) error { } return err } - self.token = *result.Payload.Data.Token pfxlog.Logger().WithField("token", self.token).Info("authenticated successfully") + self.SetSessionToken(*result.Payload.Data.Token) + return nil +} + +func (self *Clients) SetSessionToken(token string) { + self.token = token self.FabricRuntime.DefaultAuthentication = &util.EdgeManagementAuth{ Token: self.token, } @@ -93,7 +98,6 @@ func (self *Clients) Authenticate(user, password string) error { Token: self.token, } - return nil } func (self *Clients) NewWsMgmtChannel(bindHandler channel.BindHandler) (channel.Channel, error) { diff --git a/zititest/go.mod b/zititest/go.mod index e7c3a3e64..23080d6e7 100644 --- a/zititest/go.mod +++ b/zititest/go.mod @@ -7,14 +7,12 @@ replace github.com/openziti/ziti => ../ require ( github.com/Jeffail/gabs v1.4.0 github.com/Jeffail/gabs/v2 v2.7.0 - github.com/go-openapi/runtime v0.28.0 github.com/google/go-cmp v0.6.0 github.com/google/uuid v1.6.0 - github.com/gorilla/websocket v1.5.3 github.com/michaelquigley/pfxlog v0.6.10 github.com/openziti/agent v1.0.16 github.com/openziti/channel/v2 v2.0.136 - github.com/openziti/edge-api v0.26.20 + github.com/openziti/edge-api v0.26.22 github.com/openziti/fablab v0.5.60 github.com/openziti/foundation/v2 v2.0.47 github.com/openziti/identity v1.0.81 @@ -76,6 +74,7 @@ require ( github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/loads v0.22.0 // indirect + github.com/go-openapi/runtime v0.28.0 // indirect github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/strfmt v0.23.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect @@ -88,6 +87,7 @@ require ( github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/schema v1.4.1 // indirect github.com/gorilla/securecookie v1.1.2 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect @@ -177,11 +177,11 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect github.com/zitadel/oidc/v2 v2.12.0 // indirect - go.mongodb.org/mongo-driver v1.15.0 // indirect + go.mongodb.org/mongo-driver v1.16.0 // indirect go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect + go.opentelemetry.io/otel v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.28.0 // indirect + go.opentelemetry.io/otel/trace v1.28.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect go4.org v0.0.0-20180809161055-417644f6feb5 // indirect diff --git a/zititest/go.sum b/zititest/go.sum index 3c85893c7..031c5d1a0 100644 --- a/zititest/go.sum +++ b/zititest/go.sum @@ -592,8 +592,8 @@ github.com/openziti/channel/v2 v2.0.136 h1:XWjcNrPhto2XiD5HLhsh7GhmqfHEweQIJ/eUj github.com/openziti/channel/v2 v2.0.136/go.mod h1:7jhk6JtJPP1O8aWYx+w2IuwCunFJ88Ot4AQcrKiX5og= github.com/openziti/dilithium v0.3.3 h1:PLgQ6PMNLSTzCFbX/h98cmudgz/cU6TmjdSv5NAPD8k= github.com/openziti/dilithium v0.3.3/go.mod h1:vsCjI2AU/hon9e+dLhUFbCNGesJDj2ASgkySOcpmvjo= -github.com/openziti/edge-api v0.26.20 h1:r/61qDzU475mTXjZV/t3oGNN5szndzAR4OyhKjXb2jk= -github.com/openziti/edge-api v0.26.20/go.mod h1:BQryKiWKvoVn4sZEjVToSW/2tL+M1ylSWsNzRKUfl9Q= +github.com/openziti/edge-api v0.26.22 h1:kpd+SxdO4UO4/SO3DFWyndseY90J5zWtO5EsAqHJHvM= +github.com/openziti/edge-api v0.26.22/go.mod h1:t0qfgV5u2+HItpvgDIShA69v6m7RZ+PrbQuLQaDDdx8= github.com/openziti/fablab v0.5.60 h1:RsqrEb3LV6asK5N97uZKyNSDhcNOeDcAuT4OAD/hY9Y= github.com/openziti/fablab v0.5.60/go.mod h1:B/ib+GOtozEIytv2aXSFl9+dL7AiGfbpGS/VjnNduU8= github.com/openziti/foundation/v2 v2.0.47 h1:f2LM6FQOhHXJ9QMTpr4GAKq8qXspNG3EGczMjjyz7uc= @@ -831,8 +831,8 @@ go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= -go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.mongodb.org/mongo-driver v1.16.0 h1:tpRsfBJMROVHKpdGyc1BBEzzjDUWjItxbVSZ8Ls4BQ4= +go.mongodb.org/mongo-driver v1.16.0/go.mod h1:oB6AhJQvFQL4LEHyXi6aJzQJtBiTQHiAd83l0GdFaiw= go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 h1:CCriYyAfq1Br1aIYettdHZTy8mBTIPo7We18TuO/bak= go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= @@ -843,14 +843,14 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= +go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= +go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= +go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= +go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= diff --git a/zititest/models/db-ctrl-test/main.go b/zititest/models/db-ctrl-test/main.go index 5ef96d289..1a13a924c 100644 --- a/zititest/models/db-ctrl-test/main.go +++ b/zititest/models/db-ctrl-test/main.go @@ -53,7 +53,7 @@ const ( ) const ( - useLatestZitiOnRouters = false + useLatestZitiOnRouters = true useLatestZitiOnPublicRouters = true ) diff --git a/zititest/models/links-test/validation.go b/zititest/models/links-test/validation.go index 60cfb5915..079f05c6c 100644 --- a/zititest/models/links-test/validation.go +++ b/zititest/models/links-test/validation.go @@ -26,8 +26,8 @@ import ( "github.com/openziti/fablab/kernel/model" "github.com/openziti/ziti/common/pb/mgmt_pb" "github.com/openziti/ziti/controller/rest_client/link" + "github.com/openziti/ziti/zitirest" "github.com/openziti/ziti/zititest/zitilab/chaos" - "github.com/openziti/ziti/zititest/zitilab/zitirest" "google.golang.org/protobuf/proto" "time" ) diff --git a/zititest/models/sdk-hosting-test/validation.go b/zititest/models/sdk-hosting-test/validation.go index f1fcc4ac6..a1578fc44 100644 --- a/zititest/models/sdk-hosting-test/validation.go +++ b/zititest/models/sdk-hosting-test/validation.go @@ -26,8 +26,8 @@ import ( "github.com/openziti/fablab/kernel/model" "github.com/openziti/ziti/common/pb/mgmt_pb" "github.com/openziti/ziti/controller/rest_client/terminator" + "github.com/openziti/ziti/zitirest" "github.com/openziti/ziti/zititest/zitilab/chaos" - "github.com/openziti/ziti/zititest/zitilab/zitirest" "google.golang.org/protobuf/proto" "math/rand" "time" diff --git a/zititest/models/smoke/actions/bootstrap.go b/zititest/models/smoke/actions/bootstrap.go index ef07380d8..0bed0db51 100644 --- a/zititest/models/smoke/actions/bootstrap.go +++ b/zititest/models/smoke/actions/bootstrap.go @@ -54,7 +54,7 @@ func (a *bootstrapAction) bind(m *model.Model) model.Action { workflow.AddAction(component.Start(".ctrl")) if isHA { - workflow.AddAction(semaphore.Sleep(2 * time.Second)) + workflow.AddAction(semaphore.Sleep(10 * time.Second)) workflow.AddAction(edge.RaftJoin(".ctrl")) workflow.AddAction(semaphore.Sleep(2 * time.Second)) workflow.AddAction(edge.InitRaftController("#ctrl1")) diff --git a/zititest/models/smoke/smoketest.go b/zititest/models/smoke/smoketest.go index fa87e8bba..bed6d25dc 100644 --- a/zititest/models/smoke/smoketest.go +++ b/zititest/models/smoke/smoketest.go @@ -38,7 +38,7 @@ import ( "time" ) -const ZitiEdgeTunnelVersion = "v0.22.30" +const ZitiEdgeTunnelVersion = "v2.0.0-alpha1" //go:embed configs var configResource embed.FS diff --git a/zititest/ziti-fabric-test/subcmd/version.go b/zititest/ziti-fabric-test/subcmd/version.go index 0d0d16ff2..bb3d8ea5c 100644 --- a/zititest/ziti-fabric-test/subcmd/version.go +++ b/zititest/ziti-fabric-test/subcmd/version.go @@ -17,8 +17,8 @@ package subcmd import ( - "github.com/openziti/ziti/common/version" "fmt" + "github.com/openziti/ziti/common/version" "github.com/spf13/cobra" ) @@ -30,6 +30,6 @@ var versionCmd = &cobra.Command{ Use: "version", Short: "Show component version", Run: func(cmd *cobra.Command, args []string) { - fmt.Println(version.GetBuildMetadata(verbose)) + fmt.Println(version.GetVersion()) }, } diff --git a/zititest/zitilab/component_ziti_tunnel.go b/zititest/zitilab/component_ziti_tunnel.go index 53108e1d3..ffabd3ebd 100644 --- a/zititest/zitilab/component_ziti_tunnel.go +++ b/zititest/zitilab/component_ziti_tunnel.go @@ -132,7 +132,7 @@ func (self *ZitiTunnelType) Start(_ model.Run, c *model.Component) error { ha = "--ha" } - serviceCmd := fmt.Sprintf("%s %s tunnel %s -v %s --cli-agent-alias %s --log-formatter pfxlog -i %s > %s 2>&1 &", + serviceCmd := fmt.Sprintf("%s %s tunnel %s -v %s --cli-agent-alias %s --log-formatter json -i %s > %s 2>&1 &", useSudo, binaryPath, mode.String(), ha, c.Id, configPath, logsPath) value, err := c.Host.ExecLogged(