diff --git a/.github/workflows/assign_milestone.yml b/.github/workflows/assign_milestone.yml index 6687a239b57..e0c0b100a74 100644 --- a/.github/workflows/assign_milestone.yml +++ b/.github/workflows/assign_milestone.yml @@ -4,7 +4,9 @@ on: pull_request_target: types: [opened] -permissions: read-all +permissions: + pull-requests: write + contents: read env: GH_TOKEN: ${{ github.token }} @@ -13,18 +15,24 @@ jobs: build: name: Assign Milestone runs-on: ubuntu-24.04 - permissions: - pull-requests: write steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - - - name: Set up Go - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - go-version-file: go.mod + # We must explicitly checkout the base's SHA to avoid executing any code coming from + # the PR's SHA - Which would be executed in the base branch's context. + # This is really important to limit any sort of pwn requests. + ref: ${{ github.base_ref }} + persist-credentials: 'false' - name: Assign Milestone run: | - gh pr edit ${{ github.event.number }} --milestone "v$(sed -n 's/.*versionName.*\"\([[:digit:]\.]*\).*\"/\1/p' ./go/vt/servenv/version.go)" + # Ensure the content we sed from version.go is sanitized and match the correct format + VERSION=$(sed -n 's/.*versionName.*\"\([[:digit:]\.]*\).*\"/\1/p' ./go/vt/servenv/version.go) + if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Invalid version format: $VERSION" + exit 1 + fi + + gh pr edit ${{ github.event.number }} --milestone "v$VERSION" diff --git a/.github/workflows/auto_approve_pr.yml b/.github/workflows/auto_approve_pr.yml index e584337f78b..e76142c659f 100644 --- a/.github/workflows/auto_approve_pr.yml +++ b/.github/workflows/auto_approve_pr.yml @@ -16,7 +16,10 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' + - name: Auto Approve Pull Request env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index 26543c8a948..4008bacb163 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -27,7 +27,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index 1c1bf2cae4f..4df27f4d826 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -27,7 +27,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index 7c98855b783..e444858ff0d 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (12) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_13.yml b/.github/workflows/cluster_endtoend_13.yml index 947d393bbbb..8afefa03c99 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (13) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_15.yml b/.github/workflows/cluster_endtoend_15.yml index aedc1bbd691..dcccc6cc187 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (15) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_18.yml b/.github/workflows/cluster_endtoend_18.yml index 9886b617d51..347eb73f919 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (18) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_21.yml b/.github/workflows/cluster_endtoend_21.yml index e6bccee0004..f2b045e155d 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (21) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index 1f744e85004..ae7485b874e 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (backup_pitr) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml index 6ed73f260df..1794eb893b9 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (backup_pitr_mysqlshell) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml b/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml index 9bb6a4b56f8..6d8f8808565 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (backup_pitr_xtrabackup) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Setup Percona Server for MySQL 8.0 diff --git a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml index e859749ceca..ef256dd83af 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (ers_prs_newfeatures_heavy) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_mysql80.yml b/.github/workflows/cluster_endtoend_mysql80.yml index 653db141b7d..584620fbf0f 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (mysql80) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_mysql_server_vault.yml b/.github/workflows/cluster_endtoend_mysql_server_vault.yml index 9de4aacd499..6b5ecc45495 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (mysql_server_vault) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_onlineddl_revert.yml b/.github/workflows/cluster_endtoend_onlineddl_revert.yml index 54c85944190..cb0eb7919ac 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (onlineddl_revert) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -92,6 +96,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml index 9e117ac0f04..da7b96b6578 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (onlineddl_scheduler) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -92,6 +96,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml index ce0ba65f74f..1d857dc2df5 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (onlineddl_vrepl) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -92,6 +96,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml index 57413f649e1..bb8ff9a4b1c 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (onlineddl_vrepl_stress) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -92,6 +96,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml index e1f949df6f8..ea7782d6d2f 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (onlineddl_vrepl_stress_suite) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -92,6 +96,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml index 18090dd2430..2671a018541 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (onlineddl_vrepl_suite) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -92,6 +96,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml index 2053a75db4c..bdd8dac28a3 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (schemadiff_vrepl) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -92,6 +96,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml index 3e8ffce0ac5..5f445a40b46 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (tabletmanager_consul) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml index cc75ef22937..af87aec2cca 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (tabletmanager_tablegc) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index 0837be5356e..03385c6d45d 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (tabletmanager_throttler_topo) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_topo_connection_cache.yml b/.github/workflows/cluster_endtoend_topo_connection_cache.yml index da6ee53ad53..1e27231dc74 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (topo_connection_cache) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml index 6f502c94d32..f6ab80b04da 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_across_db_versions) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_basic.yml b/.github/workflows/cluster_endtoend_vreplication_basic.yml index 120cf541305..9b21f46e054 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_basic) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml index 760912b4818..95cf9a15214 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_cellalias) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml b/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml index d944a253ce3..6cca449201d 100644 --- a/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml +++ b/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_copy_parallel) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml b/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml index 5bba7760d7e..2890abaef4c 100644 --- a/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml +++ b/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_foreign_key_stress) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml b/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml index 1184fe493ef..4cf82c81f4b 100644 --- a/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml +++ b/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_mariadb_to_mysql) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_migrate.yml b/.github/workflows/cluster_endtoend_vreplication_migrate.yml index 009840800d2..d0667c30ba4 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_migrate) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml b/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml index 9a5935a8907..326591fe820 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_multi_tenant) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml b/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml index 0a10e37e6c4..0124cd03832 100644 --- a/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml +++ b/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_partial_movetables_and_materialize) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_v2.yml b/.github/workflows/cluster_endtoend_vreplication_v2.yml index f023bf9718b..a8285f109a3 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_v2) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_vtctldclient_vdiff2_movetables_tz.yml b/.github/workflows/cluster_endtoend_vreplication_vtctldclient_vdiff2_movetables_tz.yml index 7d96ac60306..0b599116e4c 100644 --- a/.github/workflows/cluster_endtoend_vreplication_vtctldclient_vdiff2_movetables_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_vtctldclient_vdiff2_movetables_tz.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_vtctldclient_vdiff2_movetables_tz) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vstream.yml b/.github/workflows/cluster_endtoend_vstream.yml index acfefb40758..c6a6bbb515f 100644 --- a/.github/workflows/cluster_endtoend_vstream.yml +++ b/.github/workflows/cluster_endtoend_vstream.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vstream) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index 947598bc307..38ff7e41cbc 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtbackup) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml index c6f8712a35a..6ce9887700c 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtctlbackup_sharded_clustertest_heavy) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml index 2cd81fe04ef..840e4c496b9 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_concurrentdml) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml b/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml index 19620d9e3a2..39f03784840 100644 --- a/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml +++ b/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_foreignkey_stress) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_gen4.yml b/.github/workflows/cluster_endtoend_vtgate_gen4.yml index 06961af4ee7..f62a830ea73 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_gen4) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml index e0b21df421a..59db477d840 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_general_heavy) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_godriver.yml b/.github/workflows/cluster_endtoend_vtgate_godriver.yml index 23c9da550c2..b0a32a13b6f 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_godriver) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml index f5d1850aca3..bca24b0a3bc 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_partial_keyspace) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_plantests.yml b/.github/workflows/cluster_endtoend_vtgate_plantests.yml index 93ed6a55f05..9c2c905564d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_plantests.yml +++ b/.github/workflows/cluster_endtoend_vtgate_plantests.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_plantests) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_queries.yml b/.github/workflows/cluster_endtoend_vtgate_queries.yml index 80462086a57..abd4ca2d713 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_queries) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml index 686db1e12ab..a6f24c0f983 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_readafterwrite) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml index 0f4ae20b0a7..72e7405e537 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_reservedconn) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_schema.yml b/.github/workflows/cluster_endtoend_vtgate_schema.yml index 2dca36298e1..c954ac7d455 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_schema) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml index 711f38253cb..fa57ba09a30 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_schema_tracker) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml index 55996d7fa86..520a5a72ca7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_tablet_healthcheck_cache) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_topo.yml b/.github/workflows/cluster_endtoend_vtgate_topo.yml index f47e0a8dd63..c8151df7b79 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_topo) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml index 1b62ac79041..ebde8c3d0d9 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_topo_consul) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml index f88d3b9af3a..a3e11cb8eb9 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_topo_etcd) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_transaction.yml b/.github/workflows/cluster_endtoend_vtgate_transaction.yml index 9ae7b465695..1014508be2a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_transaction) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml index d348606dc31..fa922f575e6 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_unsharded) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml index 16bdee60217..36c75f52d05 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_vindex_heavy) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_vschema.yml b/.github/workflows/cluster_endtoend_vtgate_vschema.yml index fb176119769..d0dd3c7c917 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_vschema) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtorc.yml b/.github/workflows/cluster_endtoend_vtorc.yml index 92c2ea3d5d7..dbaa4b04143 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtorc) runs-on: ubuntu-24.04 @@ -54,7 +55,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -64,6 +67,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -100,6 +104,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml index 9868c382a69..ea1b662e1be 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vttablet_prscomplex) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_xb_backup.yml b/.github/workflows/cluster_endtoend_xb_backup.yml index 26dbfea2def..8ae98fc9ffd 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (xb_backup) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Setup Percona Server for MySQL 8.0 diff --git a/.github/workflows/cluster_endtoend_xb_recovery.yml b/.github/workflows/cluster_endtoend_xb_recovery.yml index 43360690d6b..d617e99dcb9 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (xb_recovery) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -91,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Setup Percona Server for MySQL 8.0 diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index c971466b998..35517c4f6c5 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -13,7 +13,9 @@ jobs: steps: - name: Check out code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in files relevant to code coverage uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 diff --git a/.github/workflows/codeql_analysis.yml b/.github/workflows/codeql_analysis.yml index c523e34c697..864a29898fe 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -27,7 +27,9 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Set up Go uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 @@ -47,6 +49,7 @@ jobs: # queries: security-extended,security-and-quality - name: Get base dependencies + timeout-minutes: 10 run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update # Uninstall any previously installed MySQL first diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 424cc5bfe15..1d88b034164 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -7,22 +7,25 @@ on: release: types: [created] -permissions: read-all +permissions: + contents: write + actions: read jobs: build: name: Create Release runs-on: ubuntu-24.04 - permissions: - contents: write steps: - name: Check out code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Set up Go uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: go-version-file: go.mod + cache: 'false' - name: Tune the OS run: | @@ -33,14 +36,36 @@ jobs: sudo apt-get update sudo apt-get install -y make ruby ruby-dev go mod download - sudo gem install fpm + + # We use fpm to package our artifacts, we want to pin the version we use and + # ensure the checksum of the package matches the one published on the package's webpage. + # https://rubygems.org/gems/fpm/versions + - name: Get fpm + run: | + FPM_VERSION=1.16.0 + gem fetch fpm -v $FPM_VERSION + + # Reviewers: The expected checksum MUST ALWAYS match the one published on this website: + # https://rubygems.org/gems/fpm/versions + EXPECTED_CHECKSUM="d9eafe613cfbdf9d3b8ef2e321e194cd0a2d300ce37f716c0be1b3a42b7db5df" + + GOT_CHECKSUM=$(sha256sum fpm-$FPM_VERSION.gem | awk '{print $1}') + + if [[ "$GOT_CHECKSUM" != "$EXPECTED_CHECKSUM" ]]; then + echo "Checksum validation failed" + echo "Expected: $EXPECTED_CHECKSUM" + echo "Got: $GOT_CHECKSUM" + exit 1 + fi + + sudo gem install fpm-$FPM_VERSION.gem - name: Make Packages run: | ./tools/make-release-packages.sh - name: Upload Files - uses: csexton/release-asset-action@master + uses: csexton/release-asset-action@3567794e918fa3068116688122a76cdeb57b5f09 # v3.0.0 with: github-token: ${{ secrets.GITHUB_TOKEN }} pattern: "releases/*.{tar.gz,rpm,deb}" diff --git a/.github/workflows/docker_build_images.yml b/.github/workflows/docker_build_images.yml index 2024d677205..a9d4ed2ceeb 100644 --- a/.github/workflows/docker_build_images.yml +++ b/.github/workflows/docker_build_images.yml @@ -22,11 +22,13 @@ jobs: strategy: fail-fast: true matrix: - branch: [ mysql80 ] + branch: [ mysql80, mysql84 ] steps: - name: Check out code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Login to Docker Hub uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 @@ -40,7 +42,7 @@ jobs: - name: Build and push on main if: startsWith(github.ref, 'refs/tags/') == false - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: . file: ${{ env.DOCKERFILE }} @@ -61,7 +63,7 @@ jobs: - name: Build and push on tags if: startsWith(github.ref, 'refs/tags/') - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: . file: ${{ env.DOCKERFILE }} @@ -76,11 +78,13 @@ jobs: strategy: fail-fast: true matrix: - branch: [ latest, percona80 ] + branch: [ latest, mysql84, percona80 ] steps: - name: Check out code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Login to Docker Hub uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 @@ -98,7 +102,7 @@ jobs: - name: Build and push on main if: startsWith(github.ref, 'refs/tags/') == false - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: . file: ${{ env.DOCKERFILE }} @@ -123,7 +127,7 @@ jobs: - name: Build and push on tags if: startsWith(github.ref, 'refs/tags/') - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: . file: ${{ env.DOCKERFILE }} @@ -145,7 +149,9 @@ jobs: steps: - name: Check out code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Login to Docker Hub uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 @@ -159,7 +165,7 @@ jobs: - name: Build and push on main latest tag if: startsWith(github.ref, 'refs/tags/') == false && matrix.debian == 'bookworm' - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: ${{ env.DOCKER_CTX }} push: true @@ -170,7 +176,7 @@ jobs: - name: Build and push on main debian specific tag if: startsWith(github.ref, 'refs/tags/') == false - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: ${{ env.DOCKER_CTX }} push: true @@ -202,7 +208,7 @@ jobs: # Build and Push component image to DOCKER_TAG, applies to both debian version - name: Build and push on tags using Debian extension if: startsWith(github.ref, 'refs/tags/') - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: ${{ env.DOCKER_CTX }} push: true @@ -215,7 +221,7 @@ jobs: # It is fine to build a second time here when "matrix.debian == 'bookworm'" as we have cached the first build already - name: Build and push on tags without Debian extension if: startsWith(github.ref, 'refs/tags/') && matrix.debian == 'bookworm' - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: ${{ env.DOCKER_CTX }} push: true diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster.yml similarity index 85% rename from .github/workflows/docker_test_cluster_25.yml rename to .github/workflows/docker_test_cluster.yml index 34463ce3830..6c6310a9efc 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster.yml @@ -1,10 +1,10 @@ -name: docker_test_cluster_25 +name: docker_test_cluster on: [push, pull_request] permissions: read-all jobs: build: - name: Docker Test Cluster 25 + name: Docker Test Cluster runs-on: ubuntu-24.04 steps: @@ -27,7 +27,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -37,6 +39,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'test.go' - 'Makefile' @@ -48,7 +51,7 @@ jobs: - 'config/**' - 'bootstrap.sh' - 'docker/**' - - '.github/workflows/docker_test_cluster_25.yml' + - '.github/workflows/docker_test_cluster.yml' - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -64,4 +67,4 @@ jobs: - name: Run tests which require docker - 2 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | - go run test.go -docker=true --follow -shard 25 + go run test.go -docker=true --follow -shard docker_cluster diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index 50e1e4b9485..abd7355f078 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -26,7 +26,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index f061e8bee68..71b84f7acdc 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -26,7 +26,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/java_docker_test.yml similarity index 85% rename from .github/workflows/docker_test_cluster_10.yml rename to .github/workflows/java_docker_test.yml index 10a7c1551c0..adb87922dfc 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/java_docker_test.yml @@ -1,10 +1,10 @@ -name: docker_test_cluster_10 +name: java_docker_test on: [push, pull_request] permissions: read-all jobs: build: - name: Docker Test Cluster 10 + name: Java Docker Test runs-on: ubuntu-24.04 steps: @@ -27,7 +27,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -37,6 +39,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'test.go' - 'Makefile' @@ -48,7 +51,8 @@ jobs: - 'config/**' - 'bootstrap.sh' - 'docker/**' - - '.github/workflows/docker_test_cluster_10.yml' + - 'java/**' + - '.github/workflows/java_docker_test.yml' - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -65,4 +69,4 @@ jobs: - name: Run tests which require docker - 1 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | - go run test.go -docker=true --follow -shard 10 + go run test.go -docker=true --follow -shard java diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index fc9724aa6ac..ef3569bfb86 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -30,7 +30,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -40,6 +42,7 @@ jobs: token: '' filters: | examples: + - 'test/config.json' - 'go/**/*.go' - 'test.go' - 'Makefile' diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index c17f43eec11..ed190884446 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -30,7 +30,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -40,6 +42,7 @@ jobs: token: '' filters: | examples: + - 'test/config.json' - 'go/**/*.go' - 'test.go' - 'Makefile' diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index cd2cce93827..2773d602ec9 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -31,7 +31,9 @@ jobs: - name: Checkout code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Run FOSSA scan and upload build data uses: fossa-contrib/fossa-action@v3 diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index 8ffb74bd2cb..77f47a6c083 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -43,7 +43,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -53,6 +55,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_race_evalengine.yml b/.github/workflows/unit_race_evalengine.yml index d6d248f066e..9654209f2a9 100644 --- a/.github/workflows/unit_race_evalengine.yml +++ b/.github/workflows/unit_race_evalengine.yml @@ -43,7 +43,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -53,6 +55,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_test_evalengine_mysql57.yml b/.github/workflows/unit_test_evalengine_mysql57.yml index d55b2732c86..eea3a5aad57 100644 --- a/.github/workflows/unit_test_evalengine_mysql57.yml +++ b/.github/workflows/unit_test_evalengine_mysql57.yml @@ -45,7 +45,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +57,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_test_evalengine_mysql80.yml b/.github/workflows/unit_test_evalengine_mysql80.yml index 96af579742e..f48e224808d 100644 --- a/.github/workflows/unit_test_evalengine_mysql80.yml +++ b/.github/workflows/unit_test_evalengine_mysql80.yml @@ -45,7 +45,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +57,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_test_evalengine_mysql84.yml b/.github/workflows/unit_test_evalengine_mysql84.yml index efbe2b0eb9f..6b373d96812 100644 --- a/.github/workflows/unit_test_evalengine_mysql84.yml +++ b/.github/workflows/unit_test_evalengine_mysql84.yml @@ -45,7 +45,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +57,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index eed08e9ce4c..3644170ebdc 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -45,7 +45,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +57,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index 9e0ed7e6977..18bfa546124 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -45,7 +45,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +57,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_test_mysql84.yml b/.github/workflows/unit_test_mysql84.yml index 5948eb0836a..10b3c2b8a6c 100644 --- a/.github/workflows/unit_test_mysql84.yml +++ b/.github/workflows/unit_test_mysql84.yml @@ -45,7 +45,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +57,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/update_golang_dependencies.yml b/.github/workflows/update_golang_dependencies.yml index 33c5157097c..e2a3e7bd847 100644 --- a/.github/workflows/update_golang_dependencies.yml +++ b/.github/workflows/update_golang_dependencies.yml @@ -22,9 +22,10 @@ jobs: go-version-file: go.mod - name: Check out code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: main + persist-credentials: 'false' - name: Upgrade the Golang Dependencies id: detect-and-update diff --git a/.github/workflows/update_golang_version.yml b/.github/workflows/update_golang_version.yml index ad5dceeafa5..1948caf4b82 100644 --- a/.github/workflows/update_golang_version.yml +++ b/.github/workflows/update_golang_version.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Check out code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ matrix.branch }} diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index 0c558b00684..9fc4c00e18e 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -35,9 +35,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +56,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -72,7 +74,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -84,6 +86,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo apt-get update @@ -107,9 +110,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -129,7 +133,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index 7ee6c2db799..6586cca7a13 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -25,9 +25,10 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-next-release-ref @@ -57,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -86,6 +88,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo apt-get update @@ -109,9 +112,10 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -131,7 +135,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 680b0da87e0..7ca2c3ebbea 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -38,9 +38,10 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-previous-release-ref @@ -58,6 +59,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -76,7 +78,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -88,6 +90,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -129,9 +132,10 @@ jobs: # Checkout to the last release of Vitess - name: Checkout to the other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -151,7 +155,9 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml index 768268271a1..96715bbe9de 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -27,9 +27,10 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-next-release-ref @@ -59,6 +60,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -89,6 +91,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -130,9 +133,10 @@ jobs: # Checkout to the next release of Vitess - name: Checkout to the other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -152,7 +156,9 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml b/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml index dd389663a35..03dd28c2e2a 100644 --- a/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml +++ b/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Online DDL flow runs-on: gh-hosted-runners-16cores-1-24.04 @@ -38,9 +39,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -50,6 +52,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -83,7 +86,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -95,6 +98,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -127,9 +131,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out last version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -150,9 +155,10 @@ jobs: # Checkout to the next release of Vitess - name: Check out next version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -173,7 +179,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index e4ccc793933..e155be9f389 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Query Serving (Queries) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -38,9 +39,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-previous-release-ref @@ -58,6 +60,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -75,7 +78,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -87,6 +90,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -135,9 +139,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml index 87a78d0b659..2d58d4c8fae 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Query Serving (Queries - 2) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -38,9 +39,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-previous-release-ref @@ -58,6 +60,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -75,7 +78,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -87,6 +90,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -135,9 +139,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml index d3cfc662b5b..32a00022737 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Query Serving (Queries - 2) Next Release runs-on: gh-hosted-runners-16cores-1-24.04 @@ -27,9 +28,10 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-next-release-ref @@ -59,6 +61,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -88,6 +91,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -120,9 +124,10 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -142,7 +147,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml index c65fff08c52..faea680e0a8 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Query Serving (Queries) Next Release runs-on: gh-hosted-runners-16cores-1-24.04 @@ -27,9 +28,10 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-next-release-ref @@ -59,6 +61,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -88,6 +91,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -120,9 +124,10 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -142,7 +147,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 5616c247888..8c82838594d 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Query Serving (Schema) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -38,9 +39,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-previous-release-ref @@ -58,6 +60,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -75,7 +78,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -87,6 +90,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -119,9 +123,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -141,7 +146,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml index 6157079db6f..2450547966e 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Query Serving (Schema) Next Release runs-on: gh-hosted-runners-16cores-1-24.04 @@ -27,9 +28,10 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-next-release-ref @@ -59,6 +61,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -88,6 +91,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -120,9 +124,10 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -142,7 +147,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml index 931d9174c31..d25a772e423 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Reparent New Vtctl runs-on: gh-hosted-runners-16cores-1-24.04 @@ -27,9 +28,10 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-next-release-ref @@ -59,6 +61,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -88,6 +91,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -120,9 +124,10 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -142,7 +147,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml index d77b7be53b3..62cb6bf2018 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Reparent New VTTablet runs-on: gh-hosted-runners-16cores-1-24.04 @@ -27,9 +28,10 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-next-release-ref @@ -59,6 +61,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -88,6 +91,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -127,9 +131,10 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -149,7 +154,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index 532be0b998e..b3e2cf6451e 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Reparent Old Vtctl runs-on: gh-hosted-runners-16cores-1-24.04 @@ -38,9 +39,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-previous-release-ref @@ -58,6 +60,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -75,7 +78,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -87,6 +90,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -119,9 +123,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -141,7 +146,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 2804e757652..fe0702b2fff 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Reparent Old VTTablet runs-on: gh-hosted-runners-16cores-1-24.04 @@ -38,9 +39,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-previous-release-ref @@ -58,6 +60,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -75,7 +78,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -87,6 +90,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -119,9 +123,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -141,7 +146,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_semi_sync.yml b/.github/workflows/upgrade_downgrade_test_semi_sync.yml index 76706f77b65..cb950d43e4e 100644 --- a/.github/workflows/upgrade_downgrade_test_semi_sync.yml +++ b/.github/workflows/upgrade_downgrade_test_semi_sync.yml @@ -35,9 +35,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +56,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' @@ -72,7 +74,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -84,6 +86,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo apt-get update @@ -107,9 +110,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -129,7 +133,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/vitess_tester_vtgate.yml b/.github/workflows/vitess_tester_vtgate.yml index 7d5cf89a3ec..f9429909374 100644 --- a/.github/workflows/vitess_tester_vtgate.yml +++ b/.github/workflows/vitess_tester_vtgate.yml @@ -45,7 +45,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -55,6 +57,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/vtgate/vitess_tester/**' diff --git a/.github/workflows/vtadmin_web_build.yml b/.github/workflows/vtadmin_web_build.yml index 822fa8a0920..582f8b57647 100644 --- a/.github/workflows/vtadmin_web_build.yml +++ b/.github/workflows/vtadmin_web_build.yml @@ -35,8 +35,10 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: steps.skip-workflow.outputs.skip-workflow == 'false' + with: + persist-credentials: 'false' - uses: actions/setup-node@v4 if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/vtadmin_web_lint.yml b/.github/workflows/vtadmin_web_lint.yml index 694c24734a6..570867f821a 100644 --- a/.github/workflows/vtadmin_web_lint.yml +++ b/.github/workflows/vtadmin_web_lint.yml @@ -35,8 +35,10 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: steps.skip-workflow.outputs.skip-workflow == 'false' + with: + persist-credentials: 'false' - uses: actions/setup-node@v4 if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/vtadmin_web_unit_tests.yml b/.github/workflows/vtadmin_web_unit_tests.yml index 72a887c1926..0138f06b2b7 100644 --- a/.github/workflows/vtadmin_web_unit_tests.yml +++ b/.github/workflows/vtadmin_web_unit_tests.yml @@ -35,8 +35,10 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: steps.skip-workflow.outputs.skip-workflow == 'false' + with: + persist-credentials: 'false' - uses: actions/setup-node@v4 if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/vtop_example.yml b/.github/workflows/vtop_example.yml index fb5ae87c101..0d27d43b959 100644 --- a/.github/workflows/vtop_example.yml +++ b/.github/workflows/vtop_example.yml @@ -36,7 +36,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/Makefile b/Makefile index 13f7fde28e0..aeb1955bf18 100644 --- a/Makefile +++ b/Makefile @@ -284,9 +284,9 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # Please read docker/README.md to understand the different available images. # This rule builds the bootstrap images for all flavors. -DOCKER_IMAGES_FOR_TEST = mysql80 percona80 +DOCKER_IMAGES_FOR_TEST = mysql80 mysql84 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=39 +BOOTSTRAP_VERSION=41 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go @@ -322,7 +322,7 @@ define build_docker_image fi endef -DOCKER_LITE_SUFFIX = percona80 +DOCKER_LITE_SUFFIX = mysql84 percona80 DOCKER_LITE_TARGETS = $(addprefix docker_lite_,$(DOCKER_LITE_SUFFIX)) $(DOCKER_LITE_TARGETS): docker_lite_%: ${call build_docker_image,docker/lite/Dockerfile.$*,vitess/lite:$*} diff --git a/build.env b/build.env index 58abbf41d1b..12431842b6e 100755 --- a/build.env +++ b/build.env @@ -17,7 +17,7 @@ source ./tools/shell_functions.inc go version >/dev/null 2>&1 || fail "Go is not installed or is not in \$PATH. See https://vitess.io/contributing/build-from-source for install instructions." -goversion_min 1.23.4 || echo "Go version reported: `go version`. Version 1.23.4+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." +goversion_min 1.23.5 || echo "Go version reported: `go version`. Version 1.23.5+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." mkdir -p dist mkdir -p bin diff --git a/changelog/19.0/19.0.9/changelog.md b/changelog/19.0/19.0.9/changelog.md new file mode 100644 index 00000000000..5b56b4b2afb --- /dev/null +++ b/changelog/19.0/19.0.9/changelog.md @@ -0,0 +1,49 @@ +# Changelog of Vitess v19.0.9 + +### Bug fixes +#### Query Serving + * [release-19.0] Fix Data race in semi-join (#17417) [#17445](https://github.com/vitessio/vitess/pull/17445) + * [release-19.0] Always return a valid timezone in cursor (#17546) [#17549](https://github.com/vitessio/vitess/pull/17549) +#### VReplication + * [release-19.0] LookupVindex: fix CLI to allow creating non-unique lookups with single column (#17301) [#17347](https://github.com/vitessio/vitess/pull/17347) + * [release-19.0] SwitchTraffic: use separate context while canceling a migration (#17340) [#17364](https://github.com/vitessio/vitess/pull/17364) + * [release-19.0] LookupVindex bug fix: Fix typos from PR 17301 (#17423) [#17436](https://github.com/vitessio/vitess/pull/17436) + * [Direct PR] Fix merge issue in backport [#17509](https://github.com/vitessio/vitess/pull/17509) + * [release-19.0] Tablet picker: Handle the case where a primary tablet is not setup for a shard (#17573) [#17574](https://github.com/vitessio/vitess/pull/17574) +#### VTorc + * [release-19.0] Use uint64 for binary log file position (#17472) [#17505](https://github.com/vitessio/vitess/pull/17505) +#### vttestserver + * [release-19.0] parse transaction timeout as duration (#16338) [#17406](https://github.com/vitessio/vitess/pull/17406) +### CI/Build +#### General + * [release-19.0] Bump go version to 1.22.10 [#17338](https://github.com/vitessio/vitess/pull/17338) + * [release-19.0] Upgrade the Golang version to `go1.22.11` [#17564](https://github.com/vitessio/vitess/pull/17564) +### Dependencies +#### Build/CI + * [release-19.0] Bump golang.org/x/crypto from 0.29.0 to 0.31.0 (#17376) [#17381](https://github.com/vitessio/vitess/pull/17381) +#### General + * [release-19.0] Bump golang.org/x/net from 0.25.0 to 0.33.0 (#17416) [#17420](https://github.com/vitessio/vitess/pull/17420) + * [release-19.0] CVE Fix: Update glog to v1.2.4 (#17524) [#17532](https://github.com/vitessio/vitess/pull/17532) +#### VTAdmin + * [release-19.0] Bump nanoid from 3.3.7 to 3.3.8 in /web/vtadmin (#17375) [#17377](https://github.com/vitessio/vitess/pull/17377) +### Enhancement +#### Documentation + * [release-19.0] [Direct PR] [V21 backport] CobraDocs: Remove commit hash from docs. Fix issue with workdir replacement (#17392) (#17444) [#17450](https://github.com/vitessio/vitess/pull/17450) +#### VTorc + * [release-19.0] `vtorc`: require topo for `Healthy: true` in `/debug/health` (#17129) [#17351](https://github.com/vitessio/vitess/pull/17351) +### Internal Cleanup +#### Build/CI + * [release-19.0] Security improvements to GitHub Actions (#17520) [#17528](https://github.com/vitessio/vitess/pull/17528) +### Regression +#### Query Serving + * Backport v19: Fixing Column aliases in outer join queries (#15384) [#17418](https://github.com/vitessio/vitess/pull/17418) +### Release +#### General + * [release-19.0] Bump to `v19.0.9-SNAPSHOT` after the `v19.0.8` release [#17321](https://github.com/vitessio/vitess/pull/17321) + * [release-19.0] Code Freeze for `v19.0.9` [#17587](https://github.com/vitessio/vitess/pull/17587) +### Testing +#### General + * [release-19.0] Remove broken panic handler (#17354) [#17358](https://github.com/vitessio/vitess/pull/17358) +#### VReplication + * [release-19.0] Flaky TestTickSkip: Remove inherently flaky test (#17504) [#17511](https://github.com/vitessio/vitess/pull/17511) + diff --git a/changelog/19.0/19.0.9/release_notes.md b/changelog/19.0/19.0.9/release_notes.md new file mode 100644 index 00000000000..a729b9f1ee9 --- /dev/null +++ b/changelog/19.0/19.0.9/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v19.0.9 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/19.0/19.0.9/changelog.md). + +The release includes 23 merged Pull Requests. + +Thanks to all our contributors: @app/vitess-bot, @frouioui, @harshit-gangal, @mattlord, @rohit-nayak-ps, @vitess-bot + diff --git a/changelog/19.0/README.md b/changelog/19.0/README.md index 5893d3b1f4c..4d40372096f 100644 --- a/changelog/19.0/README.md +++ b/changelog/19.0/README.md @@ -1,4 +1,8 @@ ## v19.0 +* **[19.0.9](19.0.9)** + * [Changelog](19.0.9/changelog.md) + * [Release Notes](19.0.9/release_notes.md) + * **[19.0.8](19.0.8)** * [Changelog](19.0.8/changelog.md) * [Release Notes](19.0.8/release_notes.md) diff --git a/changelog/20.0/20.0.5/changelog.md b/changelog/20.0/20.0.5/changelog.md new file mode 100644 index 00000000000..ce8895f5d51 --- /dev/null +++ b/changelog/20.0/20.0.5/changelog.md @@ -0,0 +1,46 @@ +# Changelog of Vitess v20.0.5 + +### Bug fixes +#### Query Serving + * [release-20.0] Fix Data race in semi-join (#17417) [#17446](https://github.com/vitessio/vitess/pull/17446) + * [release-20.0] Reference Table DML Join Fix (#17414) [#17473](https://github.com/vitessio/vitess/pull/17473) + * [release-20.0] Fix crash in the evalengine (#17487) [#17489](https://github.com/vitessio/vitess/pull/17489) + * [release-20.0] Always return a valid timezone in cursor (#17546) [#17550](https://github.com/vitessio/vitess/pull/17550) +#### VReplication + * [release-20.0] LookupVindex: fix CLI to allow creating non-unique lookups with single column (#17301) [#17348](https://github.com/vitessio/vitess/pull/17348) + * [release-20.0] SwitchTraffic: use separate context while canceling a migration (#17340) [#17365](https://github.com/vitessio/vitess/pull/17365) + * [release-20.0] LookupVindex bug fix: Fix typos from PR 17301 (#17423) [#17437](https://github.com/vitessio/vitess/pull/17437) + * [release-20.0] Tablet picker: Handle the case where a primary tablet is not setup for a shard (#17573) [#17575](https://github.com/vitessio/vitess/pull/17575) +#### VTorc + * [release-20.0] Use uint64 for binary log file position (#17472) [#17506](https://github.com/vitessio/vitess/pull/17506) +#### vttestserver + * [release-20.0] parse transaction timeout as duration (#16338) [#17405](https://github.com/vitessio/vitess/pull/17405) +### CI/Build +#### General + * [release-20.0] Bump go version to 1.22.10 [#17337](https://github.com/vitessio/vitess/pull/17337) + * [release-20.0] Upgrade the Golang version to `go1.22.11` [#17562](https://github.com/vitessio/vitess/pull/17562) +### Dependencies +#### Build/CI + * [release-20.0] Bump golang.org/x/crypto from 0.29.0 to 0.31.0 (#17376) [#17382](https://github.com/vitessio/vitess/pull/17382) +#### General + * [release-20.0] Bump golang.org/x/net from 0.25.0 to 0.33.0 (#17416) [#17421](https://github.com/vitessio/vitess/pull/17421) + * [release-20.0] CVE Fix: Update glog to v1.2.4 (#17524) [#17533](https://github.com/vitessio/vitess/pull/17533) +#### VTAdmin + * [release-20.0] Bump nanoid from 3.3.7 to 3.3.8 in /web/vtadmin (#17375) [#17378](https://github.com/vitessio/vitess/pull/17378) +### Enhancement +#### Documentation + * [release-20.0] [Direct PR] [V21 backport] CobraDocs: Remove commit hash from docs. Fix issue with workdir replacement (#17392) (#17444) [#17451](https://github.com/vitessio/vitess/pull/17451) +#### VTorc + * [release-20.0] `vtorc`: require topo for `Healthy: true` in `/debug/health` (#17129) [#17352](https://github.com/vitessio/vitess/pull/17352) +### Internal Cleanup +#### Build/CI + * [release-20.0] Security improvements to GitHub Actions (#17520) [#17530](https://github.com/vitessio/vitess/pull/17530) +### Release +#### General + * [release-20.0] Bump to `v20.0.5-SNAPSHOT` after the `v20.0.4` release [#17323](https://github.com/vitessio/vitess/pull/17323) +### Testing +#### General + * [release-20.0] Remove broken panic handler (#17354) [#17359](https://github.com/vitessio/vitess/pull/17359) +#### VReplication + * [release-20.0] Flaky TestTickSkip: Remove inherently flaky test (#17504) [#17512](https://github.com/vitessio/vitess/pull/17512) + diff --git a/changelog/20.0/20.0.5/release_notes.md b/changelog/20.0/20.0.5/release_notes.md new file mode 100644 index 00000000000..ae00e9a6255 --- /dev/null +++ b/changelog/20.0/20.0.5/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v20.0.5 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/20.0/20.0.5/changelog.md). + +The release includes 22 merged Pull Requests. + +Thanks to all our contributors: @app/vitess-bot, @frouioui, @mattlord, @vitess-bot + diff --git a/changelog/20.0/README.md b/changelog/20.0/README.md index 2fe6e3d9d61..59d34ed7173 100644 --- a/changelog/20.0/README.md +++ b/changelog/20.0/README.md @@ -1,4 +1,8 @@ ## v20.0 +* **[20.0.5](20.0.5)** + * [Changelog](20.0.5/changelog.md) + * [Release Notes](20.0.5/release_notes.md) + * **[20.0.4](20.0.4)** * [Changelog](20.0.4/changelog.md) * [Release Notes](20.0.4/release_notes.md) diff --git a/changelog/21.0/21.0.2/changelog.md b/changelog/21.0/21.0.2/changelog.md new file mode 100644 index 00000000000..4b4c45f6117 --- /dev/null +++ b/changelog/21.0/21.0.2/changelog.md @@ -0,0 +1,64 @@ +# Changelog of Vitess v21.0.2 + +### Bug fixes +#### Evalengine + * [release-21.0] Fix week number for date_format evalengine function (#17432) [#17452](https://github.com/vitessio/vitess/pull/17452) +#### Java + * [release-21.0] Use proper `groupId` for mysql connector in java (#17540) [#17541](https://github.com/vitessio/vitess/pull/17541) +#### Query Serving + * [release-21.0] Fix Data race in semi-join (#17417) [#17447](https://github.com/vitessio/vitess/pull/17447) + * [release-21.0] vexplain to protect the log fields from concurrent writes (#17460) [#17463](https://github.com/vitessio/vitess/pull/17463) + * [release-21.0] Reference Table DML Join Fix (#17414) [#17474](https://github.com/vitessio/vitess/pull/17474) + * [release-21.0] Fix crash in the evalengine (#17487) [#17490](https://github.com/vitessio/vitess/pull/17490) + * [release-21.0] Always return a valid timezone in cursor (#17546) [#17551](https://github.com/vitessio/vitess/pull/17551) + * [release-21.0] sizegen: do not ignore type aliases (#17556) [#17557](https://github.com/vitessio/vitess/pull/17557) +#### VReplication + * [release-21.0] LookupVindex: fix CLI to allow creating non-unique lookups with single column (#17301) [#17349](https://github.com/vitessio/vitess/pull/17349) + * [release-21.0] SwitchTraffic: use separate context while canceling a migration (#17340) [#17366](https://github.com/vitessio/vitess/pull/17366) + * [release-21.0] LookupVindex bug fix: Fix typos from PR 17301 (#17423) [#17438](https://github.com/vitessio/vitess/pull/17438) + * [release-21.0] Tablet picker: Handle the case where a primary tablet is not setup for a shard (#17573) [#17576](https://github.com/vitessio/vitess/pull/17576) +#### VTorc + * [release-21.0] Use uint64 for binary log file position (#17472) [#17507](https://github.com/vitessio/vitess/pull/17507) +#### schema management + * [release-21.0] schemadiff: skip keys with expressions in Online DDL analysis (#17475) [#17480](https://github.com/vitessio/vitess/pull/17480) +### CI/Build +#### Build/CI + * [release-21.0] use newer versions of actions in scorecard workflow (#17373) [#17374](https://github.com/vitessio/vitess/pull/17374) + * [release-21.0] split upgrade downgrade queries test to 2 CI workflows (#17464) [#17494](https://github.com/vitessio/vitess/pull/17494) +#### General + * [release-21.0] Bump go version to 1.23.4 [#17336](https://github.com/vitessio/vitess/pull/17336) + * [release-21.0] Upgrade the Golang version to `go1.23.5` [#17561](https://github.com/vitessio/vitess/pull/17561) +### Dependencies +#### Build/CI + * [release-21.0] Bump golang.org/x/crypto from 0.29.0 to 0.31.0 (#17376) [#17383](https://github.com/vitessio/vitess/pull/17383) +#### General + * [release-21.0] Bump golang.org/x/net from 0.29.0 to 0.33.0 (#17416) [#17422](https://github.com/vitessio/vitess/pull/17422) + * [release-21.0] CVE Fix: Update glog to v1.2.4 (#17524) [#17534](https://github.com/vitessio/vitess/pull/17534) +#### Java + * [release-21.0] [Java]: Bump mysql-connector-java version from 8.0.33 to mysql-connector-j 8.4.0 (#17522) [#17527](https://github.com/vitessio/vitess/pull/17527) +#### VTAdmin + * [release-21.0] Bump nanoid from 3.3.7 to 3.3.8 in /web/vtadmin (#17375) [#17379](https://github.com/vitessio/vitess/pull/17379) +### Enhancement +#### Documentation + * [Direct PR] [V21 backport] CobraDocs: Remove commit hash from docs. Fix issue with workdir replacement (#17392) [#17444](https://github.com/vitessio/vitess/pull/17444) +#### VTorc + * [release-21.0] `vtorc`: require topo for `Healthy: true` in `/debug/health` (#17129) [#17353](https://github.com/vitessio/vitess/pull/17353) +### Internal Cleanup +#### Build/CI + * [release-21.0] Security improvements to GitHub Actions (#17520) [#17531](https://github.com/vitessio/vitess/pull/17531) +### Regression +#### Java + * [release-21.0] [Java] Fix dependency issues in Java package (#17481) [#17484](https://github.com/vitessio/vitess/pull/17484) +### Release +#### General + * [release-21.0] Bump to `v21.0.2-SNAPSHOT` after the `v21.0.1` release [#17325](https://github.com/vitessio/vitess/pull/17325) +### Testing +#### General + * [release-21.0] Remove broken panic handler (#17354) [#17360](https://github.com/vitessio/vitess/pull/17360) +#### Query Serving + * [release-21.0] Ensure PRS runs for all the shards in `TestSemiSyncRequiredWithTwoPC` (#17384) [#17385](https://github.com/vitessio/vitess/pull/17385) +#### VReplication + * [release-21.0] Flaky test fix: TestMoveTablesSharded and TestMoveTablesUnsharded (#17343) [#17363](https://github.com/vitessio/vitess/pull/17363) + * [release-21.0] Flaky TestMoveTables(Un)sharded: Handle race condition (#17440) [#17455](https://github.com/vitessio/vitess/pull/17455) + * [release-21.0] Flaky TestTickSkip: Remove inherently flaky test (#17504) [#17513](https://github.com/vitessio/vitess/pull/17513) + diff --git a/changelog/21.0/21.0.2/release_notes.md b/changelog/21.0/21.0.2/release_notes.md new file mode 100644 index 00000000000..10c663ebff2 --- /dev/null +++ b/changelog/21.0/21.0.2/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v21.0.2 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/21.0/21.0.2/changelog.md). + +The release includes 33 merged Pull Requests. + +Thanks to all our contributors: @app/vitess-bot, @dbussink, @frouioui, @rohit-nayak-ps, @vitess-bot + diff --git a/changelog/21.0/README.md b/changelog/21.0/README.md index f3a98feb55a..680a294e34b 100644 --- a/changelog/21.0/README.md +++ b/changelog/21.0/README.md @@ -1,4 +1,8 @@ ## v21.0 +* **[21.0.2](21.0.2)** + * [Changelog](21.0.2/changelog.md) + * [Release Notes](21.0.2/release_notes.md) + * **[21.0.1](21.0.1)** * [Changelog](21.0.1/changelog.md) * [Release Notes](21.0.1/release_notes.md) diff --git a/changelog/22.0/22.0.0/summary.md b/changelog/22.0/22.0.0/summary.md index e63ffcc3547..cbb1f37889c 100644 --- a/changelog/22.0/22.0.0/summary.md +++ b/changelog/22.0/22.0.0/summary.md @@ -12,6 +12,10 @@ - **[Support for More Efficient JSON Replication](#efficient-json-replication)** - **[Support for LAST_INSERT_ID(x)](#last-insert-id)** - **[Support for Maximum Idle Connections in the Pool](#max-idle-connections)** + - **[Stalled Disk Recovery in VTOrc](#stall-disk-recovery)** + - **[Update default MySQL version to 8.0.40](#mysql-8-0-40)** + - **[Update lite images to Debian Bookworm](#debian-bookworm)** + - **[Support for Filtering Query logs on Error](#query-logs)** - **[Minor Changes](#minor-changes)** - **[VTTablet Flags](#flags-vttablet)** - **[Topology read concurrency behaviour changes](#topo-read-concurrency-changes)** @@ -22,7 +26,7 @@ These are the RPC changes made in this release - -1. `GetTransactionInfo` RPC has been added to both `VtctldServer`, and `TabletManagerClient` interface. These RPCs are used to fecilitate the users in reading the state of an unresolved distributed transaction. This can be useful in debugging what went wrong and how to fix the problem. +1. `GetTransactionInfo` RPC has been added to both `VtctldServer`, and `TabletManagerClient` interface. These RPCs are used to facilitate the users in reading the state of an unresolved distributed transaction. This can be useful in debugging what went wrong and how to fix the problem. ### Deprecations and Deletions @@ -100,6 +104,39 @@ You can control idle connection retention for the query server’s query pool, s This feature ensures that, during traffic spikes, idle connections are available for faster responses, while minimizing overhead in low-traffic periods by limiting the number of idle connections retained. It helps strike a balance between performance, efficiency, and cost. +### Stalled Disk Recovery in VTOrc +VTOrc can now identify and recover from stalled disk errors. VTTablets test whether the disk is writable and they send this information in the full status output to VTOrc. If the disk is not writable on the primary tablet, VTOrc will attempt to recover the cluster by promoting a new primary. This is useful in scenarios where the disk is stalled and the primary vttablet is unable to accept writes because of it. + +To opt into this feature, `--enable-primary-disk-stalled-recovery` flag has to be specified on VTOrc, and `--disk-write-dir` flag has to be specified on the vttablets. `--disk-write-interval` and `--disk-write-timeout` flags can be used to configure the polling interval and timeout respectively. + +### Update default MySQL version to 8.0.40 + +The default major MySQL version used by our `vitess/lite:latest` image is going from `8.0.30` to `8.0.40`. +This change was brought by [Pull Request #17552](https://github.com/vitessio/vitess/pull/17552). + +VTGate also advertises MySQL version `8.0.40` by default instead of `8.0.30` if no explicit version is set. The users can set the `mysql_server_version` flag to advertise the correct version. + +#### ⚠️Upgrading to this release with vitess-operator + +If you are using the `vitess-operator`, considering that we are bumping the patch version of MySQL 80 from `8.0.30` to `8.0.40`, you will have to manually upgrade: + +1. Add `innodb_fast_shutdown=0` to your extra cnf in your YAML file. +2. Apply this file. +3. Wait for all the pods to be healthy. +4. Then change your YAML file to use the new Docker Images (`vitess/lite:v22.0.0`). +5. Remove `innodb_fast_shutdown=0` from your extra cnf in your YAML file. +6. Apply this file. + +This is the last time this will be needed in the `8.0.x` series, as starting with MySQL `8.0.35` it is possible to upgrade and downgrade between `8.0.x` versions without needing to run `innodb_fast_shutdown=0`. + +### Update lite images to Debian Bookworm + +The base system now uses Debian Bookworm instead of Debian Bullseye for the `vitess/lite` images. This change was brought by [Pull Request #17552]. + +### Support for Filtering Query logs on Error + +The `querylog-mode` setting can be configured to `error` to log only queries that result in errors. This option is supported in both VTGate and VTTablet. + ## Minor Changes #### VTTablet Flags diff --git a/docker/binaries/vtadmin/Dockerfile b/docker/binaries/vtadmin/Dockerfile index fe69237ea13..b700f8ab74b 100644 --- a/docker/binaries/vtadmin/Dockerfile +++ b/docker/binaries/vtadmin/Dockerfile @@ -13,7 +13,7 @@ # limitations under the License. ARG VT_BASE_VER=latest -ARG DEBIAN_VER=bullseye-slim +ARG DEBIAN_VER=bookworm-slim FROM vitess/lite:${VT_BASE_VER} AS lite diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index b52783d0c30..9728dffbab8 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -153,4 +153,13 @@ List of changes between bootstrap image versions. ## [39] - 2024-12-04 ### Changes -- Update build to golang 1.23.4 \ No newline at end of file +- Update build to golang 1.23.4 + +## [40] - 2025-01-17 +### Changes +- Update build to golang 1.23.5 + +## [41] - 2025-01-15 +### Changes +- Update base image to bookworm +- Add MySQL84 image \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index 3ace19543f1..e0866fe4bda 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.23.4-bullseye +FROM --platform=linux/amd64 golang:1.23.5-bookworm # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ @@ -8,12 +8,13 @@ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-ins chromium \ curl \ default-jdk \ - etcd \ + etcd-client \ + etcd-server \ g++ \ git \ + gnupg \ make \ maven \ - software-properties-common \ unzip \ zip \ xvfb \ diff --git a/docker/bootstrap/Dockerfile.mysql80 b/docker/bootstrap/Dockerfile.mysql80 index b4fec6b7d11..e8ca365a704 100644 --- a/docker/bootstrap/Dockerfile.mysql80 +++ b/docker/bootstrap/Dockerfile.mysql80 @@ -8,9 +8,9 @@ USER root # Install MySQL 8.0 RUN for i in $(seq 1 10); do apt-key adv --no-tty --recv-keys --keyserver keyserver.ubuntu.com 8C718D3B5072E1F5 && break; done && \ for i in $(seq 1 10); do apt-key adv --no-tty --recv-keys --keyserver keyserver.ubuntu.com A8D3785C && break; done && \ - add-apt-repository 'deb http://repo.mysql.com/apt/debian/ bullseye mysql-8.0' && \ + echo 'deb http://repo.mysql.com/apt/debian/ bookworm mysql-8.0' > /etc/apt/sources.list.d/mysql.list && \ for i in $(seq 1 10); do apt-key adv --no-tty --keyserver keyserver.ubuntu.com --recv-keys 9334A25F8507EFA5 && break; done && \ - echo 'deb http://repo.percona.com/apt bullseye main' > /etc/apt/sources.list.d/percona.list && \ + echo 'deb http://repo.percona.com/apt bookworm main' > /etc/apt/sources.list.d/percona.list && \ { \ echo debconf debconf/frontend select Noninteractive; \ echo percona-server-server-8.0 percona-server-server/root_password password 'unused'; \ diff --git a/docker/bootstrap/Dockerfile.mysql84 b/docker/bootstrap/Dockerfile.mysql84 new file mode 100644 index 00000000000..2f90d588701 --- /dev/null +++ b/docker/bootstrap/Dockerfile.mysql84 @@ -0,0 +1,23 @@ +ARG bootstrap_version +ARG image="vitess/bootstrap:${bootstrap_version}-common" + +FROM --platform=linux/amd64 "${image}" + +USER root + +# Install MySQL 8.4 +RUN for i in $(seq 1 10); do apt-key adv --no-tty --recv-keys --keyserver keyserver.ubuntu.com 8C718D3B5072E1F5 && break; done && \ + for i in $(seq 1 10); do apt-key adv --no-tty --recv-keys --keyserver keyserver.ubuntu.com A8D3785C && break; done && \ + echo 'deb http://repo.mysql.com/apt/debian/ bookworm mysql-8.4-lts' > /etc/apt/sources.list.d/mysql.list && \ + for i in $(seq 1 10); do apt-key adv --no-tty --keyserver keyserver.ubuntu.com --recv-keys 9334A25F8507EFA5 && break; done && \ + echo 'deb http://repo.percona.com/pxb-84-lts/apt bookworm main' > /etc/apt/sources.list.d/percona.list && \ + { \ + echo debconf debconf/frontend select Noninteractive; \ + echo percona-server-server-8.4 percona-server-server/root_password password 'unused'; \ + echo percona-server-server-8.4 percona-server-server/root_password_again password 'unused'; \ + } | debconf-set-selections && \ + apt-get update -y && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server libmysqlclient-dev libdbd-mysql-perl rsync libev4 libcurl4-openssl-dev percona-xtrabackup-84 && \ + rm -rf /var/lib/apt/lists/* + +USER vitess diff --git a/docker/bootstrap/Dockerfile.percona80 b/docker/bootstrap/Dockerfile.percona80 index 147b988b002..53b16a8eb4b 100644 --- a/docker/bootstrap/Dockerfile.percona80 +++ b/docker/bootstrap/Dockerfile.percona80 @@ -7,7 +7,7 @@ USER root # Install Percona 8.0 RUN for i in $(seq 1 10); do apt-key adv --no-tty --keyserver keyserver.ubuntu.com --recv-keys 9334A25F8507EFA5 && break; done \ - && echo 'deb http://repo.percona.com/ps-80/apt bullseye main' > /etc/apt/sources.list.d/percona.list && \ + && echo 'deb http://repo.percona.com/ps-80/apt bookworm main' > /etc/apt/sources.list.d/percona.list && \ { \ echo debconf debconf/frontend select Noninteractive; \ echo percona-server-server-8.0 percona-server-server/root_password password 'unused'; \ @@ -23,7 +23,7 @@ RUN for i in $(seq 1 10); do apt-key adv --no-tty --keyserver keyserver.ubuntu.c rsync \ libev4 \ # && rm -f /etc/apt/sources.list.d/percona.list \ - && echo 'deb http://repo.percona.com/apt bullseye main' > /etc/apt/sources.list.d/percona.list \ + && echo 'deb http://repo.percona.com/apt bookworm main' > /etc/apt/sources.list.d/percona.list \ # { \ # echo debconf debconf/frontend select Noninteractive; \ # echo percona-server-server-8.0 percona-server-server/root_password password 'unused'; \ diff --git a/docker/bootstrap/README.md b/docker/bootstrap/README.md index b273305d6b9..7e0f9667e3f 100644 --- a/docker/bootstrap/README.md +++ b/docker/bootstrap/README.md @@ -7,6 +7,7 @@ The `vitess/bootstrap` image comes in different flavors: * `vitess/bootstrap:common` - dependencies that are common to all flavors * `vitess/bootstrap:mysql80` - bootstrap image for MySQL 8.0 +* `vitess/bootstrap:mysql84` - bootstrap image for MySQL 8.4 * `vitess/bootstrap:percona80` - bootstrap image for Percona Server 8.0 **NOTE: Unlike the base image that builds Vitess itself, this bootstrap image diff --git a/docker/lite/Dockerfile b/docker/lite/Dockerfile index fff1414fab6..c75a0a5ad4c 100644 --- a/docker/lite/Dockerfile +++ b/docker/lite/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM --platform=linux/amd64 golang:1.23.4-bullseye AS builder +FROM --platform=linux/amd64 golang:1.23.5-bookworm AS builder # Allows docker builds to set the BUILD_NUMBER ARG BUILD_NUMBER @@ -31,7 +31,7 @@ COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess RUN make install PREFIX=/vt/install # Start over and build the final image. -FROM --platform=linux/amd64 debian:bullseye-slim +FROM --platform=linux/amd64 debian:bookworm-slim # Install locale required for mysqlsh RUN apt-get update && apt-get install -y locales \ diff --git a/docker/lite/Dockerfile.mysql84 b/docker/lite/Dockerfile.mysql84 new file mode 100644 index 00000000000..e2836ca3047 --- /dev/null +++ b/docker/lite/Dockerfile.mysql84 @@ -0,0 +1,63 @@ +# Copyright 2025 The Vitess Authors. +# +# 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 +# +# http://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. + +FROM --platform=linux/amd64 golang:1.23.5-bookworm AS builder + +# Allows docker builds to set the BUILD_NUMBER +ARG BUILD_NUMBER + +WORKDIR /vt/src/vitess.io/vitess + +# Create vitess user +RUN groupadd -r vitess && useradd -r -g vitess vitess +RUN mkdir -p /vt/vtdataroot /home/vitess +RUN chown -R vitess:vitess /vt /home/vitess +USER vitess + +# Re-copy sources from working tree. +COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess + +RUN make install PREFIX=/vt/install + +# Start over and build the final image. +FROM --platform=linux/amd64 debian:bookworm-slim + +# Install locale required for mysqlsh +RUN apt-get update && apt-get install -y locales \ + && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \ + && locale-gen en_US.UTF-8 + +# Install dependencies +COPY docker/utils/install_dependencies.sh /vt/dist/install_dependencies.sh +RUN /vt/dist/install_dependencies.sh mysql84 + +# Set up Vitess user and directory tree. +RUN groupadd -r vitess && useradd -r -g vitess vitess +RUN mkdir -p /vt/vtdataroot /home/vitess && chown -R vitess:vitess /vt /home/vitess + +# Set up Vitess environment (just enough to run pre-built Go binaries) +ENV VTROOT /vt +ENV VTDATAROOT /vt/vtdataroot +ENV PATH $VTROOT/bin:$PATH + +# Copy artifacts from builder layer. +COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt +COPY --from=builder --chown=vitess:vitess /vt/install /vt +COPY --from=builder --chown=vitess:vitess /vt/src/vitess.io/vitess/web/vtadmin /vt/web/vtadmin +COPY --from=builder --chown=vitess:vitess /vt/src/vitess.io/vitess/config/init_db.sql /vt/config/ +COPY --from=builder --chown=vitess:vitess /vt/src/vitess.io/vitess/config/mycnf /vt/config/ + +# Create mount point for actual data (e.g. MySQL data dir) +VOLUME /vt/vtdataroot +USER vitess diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index a839fb35514..16e1da78627 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM --platform=linux/amd64 golang:1.23.4-bullseye AS builder +FROM --platform=linux/amd64 golang:1.23.5-bookworm AS builder # Allows docker builds to set the BUILD_NUMBER ARG BUILD_NUMBER @@ -31,7 +31,7 @@ COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess RUN make install PREFIX=/vt/install # Start over and build the final image. -FROM --platform=linux/amd64 debian:bullseye-slim +FROM --platform=linux/amd64 debian:bookworm-slim # Install dependencies COPY docker/utils/install_dependencies.sh /vt/dist/install_dependencies.sh diff --git a/docker/utils/install_dependencies.sh b/docker/utils/install_dependencies.sh index 91e6e2b8c76..59e16b6303a 100755 --- a/docker/utils/install_dependencies.sh +++ b/docker/utils/install_dependencies.sh @@ -71,64 +71,58 @@ apt-get install -y --no-install-recommends "${BASE_PACKAGES[@]}" # Packages specific to certain flavors. case "${FLAVOR}" in -mysql57) +mysql80) if [ -z "$VERSION" ]; then - VERSION=5.7.31 + VERSION=8.0.40 fi - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-5.7/m/mysql-community/libmysqlclient20_${VERSION}-1debian10_amd64.deb /tmp/libmysqlclient20_${VERSION}-1debian10_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-5.7/m/mysql-community/mysql-community-client_${VERSION}-1debian10_amd64.deb /tmp/mysql-community-client_${VERSION}-1debian10_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-5.7/m/mysql-community/mysql-client_${VERSION}-1debian10_amd64.deb /tmp/mysql-client_${VERSION}-1debian10_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-5.7/m/mysql-community/mysql-community-server_${VERSION}-1debian10_amd64.deb /tmp/mysql-community-server_${VERSION}-1debian10_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-5.7/m/mysql-community/mysql-server_${VERSION}-1debian10_amd64.deb /tmp/mysql-server_${VERSION}-1debian10_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-common_${VERSION}-1debian12_amd64.deb /tmp/mysql-common_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/libmysqlclient21_${VERSION}-1debian12_amd64.deb /tmp/libmysqlclient21_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-client-core_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-client-core_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-client-plugins_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-client-plugins_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-client_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-client_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-client_${VERSION}-1debian12_amd64.deb /tmp/mysql-client_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-server-core_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-server-core_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-server_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-server_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-server_${VERSION}-1debian12_amd64.deb /tmp/mysql-server_${VERSION}-1debian12_amd64.deb PACKAGES=( - /tmp/libmysqlclient20_${VERSION}-1debian10_amd64.deb - /tmp/mysql-community-client_${VERSION}-1debian10_amd64.deb - /tmp/mysql-client_${VERSION}-1debian10_amd64.deb - /tmp/mysql-community-server_${VERSION}-1debian10_amd64.deb - /tmp/mysql-server_${VERSION}-1debian10_amd64.deb + /tmp/mysql-common_${VERSION}-1debian12_amd64.deb + /tmp/libmysqlclient21_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-client-core_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-client-plugins_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-client_${VERSION}-1debian12_amd64.deb + /tmp/mysql-client_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-server-core_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-server_${VERSION}-1debian12_amd64.deb + /tmp/mysql-server_${VERSION}-1debian12_amd64.deb mysql-shell - percona-xtrabackup-24 + percona-xtrabackup-80 ) ;; -mysql80) +mysql84) if [ -z "$VERSION" ]; then - VERSION=8.0.30 + VERSION=8.4.3 fi - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-common_${VERSION}-1debian11_amd64.deb /tmp/mysql-common_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/libmysqlclient21_${VERSION}-1debian11_amd64.deb /tmp/libmysqlclient21_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-client-core_${VERSION}-1debian11_amd64.deb /tmp/mysql-community-client-core_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-client-plugins_${VERSION}-1debian11_amd64.deb /tmp/mysql-community-client-plugins_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-client_${VERSION}-1debian11_amd64.deb /tmp/mysql-community-client_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-client_${VERSION}-1debian11_amd64.deb /tmp/mysql-client_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-server-core_${VERSION}-1debian11_amd64.deb /tmp/mysql-community-server-core_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-server_${VERSION}-1debian11_amd64.deb /tmp/mysql-community-server_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-server_${VERSION}-1debian11_amd64.deb /tmp/mysql-server_${VERSION}-1debian11_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-common_${VERSION}-1debian12_amd64.deb /tmp/mysql-common_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/libmysqlclient24_${VERSION}-1debian12_amd64.deb /tmp/libmysqlclient24_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-community-client-core_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-client-core_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-community-client-plugins_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-client-plugins_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-community-client_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-client_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-client_${VERSION}-1debian12_amd64.deb /tmp/mysql-client_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-community-server-core_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-server-core_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-community-server_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-server_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-server_${VERSION}-1debian12_amd64.deb /tmp/mysql-server_${VERSION}-1debian12_amd64.deb PACKAGES=( - /tmp/mysql-common_${VERSION}-1debian11_amd64.deb - /tmp/libmysqlclient21_${VERSION}-1debian11_amd64.deb - /tmp/mysql-community-client-core_${VERSION}-1debian11_amd64.deb - /tmp/mysql-community-client-plugins_${VERSION}-1debian11_amd64.deb - /tmp/mysql-community-client_${VERSION}-1debian11_amd64.deb - /tmp/mysql-client_${VERSION}-1debian11_amd64.deb - /tmp/mysql-community-server-core_${VERSION}-1debian11_amd64.deb - /tmp/mysql-community-server_${VERSION}-1debian11_amd64.deb - /tmp/mysql-server_${VERSION}-1debian11_amd64.deb + /tmp/mysql-common_${VERSION}-1debian12_amd64.deb + /tmp/libmysqlclient24_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-client-core_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-client-plugins_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-client_${VERSION}-1debian12_amd64.deb + /tmp/mysql-client_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-server-core_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-server_${VERSION}-1debian12_amd64.deb + /tmp/mysql-server_${VERSION}-1debian12_amd64.deb mysql-shell - percona-xtrabackup-80 - ) - ;; -percona) - PACKAGES=( - libcurl3 - percona-server-server-5.6 - percona-xtrabackup - ) - ;; -percona57) - PACKAGES=( - libperconaserverclient20 - percona-server-server-5.7 - percona-xtrabackup-24 + percona-xtrabackup-84 ) ;; percona80) @@ -155,39 +149,30 @@ add_apt_key 9334A25F8507EFA5 # Add extra apt repositories for MySQL. case "${FLAVOR}" in -mysql57) - echo 'deb http://repo.mysql.com/apt/debian/ buster mysql-5.7' > /etc/apt/sources.list.d/mysql.list - ;; mysql80) - echo 'deb http://repo.mysql.com/apt/debian/ bullseye mysql-8.0' > /etc/apt/sources.list.d/mysql.list + echo 'deb http://repo.mysql.com/apt/debian/ bookworm mysql-8.0' > /etc/apt/sources.list.d/mysql.list + ;; +mysql84) + echo 'deb http://repo.mysql.com/apt/debian/ bookworm mysql-8.4-lts' > /etc/apt/sources.list.d/mysql.list ;; esac # Add extra apt repositories for Percona Server and/or Percona XtraBackup. case "${FLAVOR}" in -mysql57) - echo 'deb http://repo.percona.com/apt buster main' > /etc/apt/sources.list.d/percona.list +mysql80) + echo 'deb http://repo.percona.com/apt bookworm main' > /etc/apt/sources.list.d/percona.list ;; -mysql80|percona57) - echo 'deb http://repo.percona.com/apt bullseye main' > /etc/apt/sources.list.d/percona.list +mysql84) + echo 'deb http://repo.percona.com/pxb-84-lts/apt bookworm main' > /etc/apt/sources.list.d/percona.list ;; percona80) - echo 'deb http://repo.percona.com/apt bullseye main' > /etc/apt/sources.list.d/percona.list - echo 'deb http://repo.percona.com/ps-80/apt bullseye main' > /etc/apt/sources.list.d/percona80.list + echo 'deb http://repo.percona.com/apt bookworm main' > /etc/apt/sources.list.d/percona.list + echo 'deb http://repo.percona.com/ps-80/apt bookworm main' > /etc/apt/sources.list.d/percona80.list ;; esac # Pre-fill values for installation prompts that are normally interactive. case "${FLAVOR}" in -percona57) - debconf-set-selections < 99 { + require.FailNow(t, "uid has to be between 0 and 99: %v", uid) + } + mysqlPort := int32(3300 + uid) + tablet := &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{Cell: cell, Uid: uid}, + Hostname: "127.0.0.1", + MysqlHostname: "127.0.0.1", + PortMap: map[string]int32{ + "vt": int32(8100 + uid), + "grpc": int32(8200 + uid), + }, + Keyspace: "test_keyspace", + Shard: "0", + Type: tabletType, + } + tablet.MysqlPort = mysqlPort + for _, option := range options { + option(tablet) + } + _, startHTTPServer := tablet.PortMap["start_http_server"] + delete(tablet.PortMap, "start_http_server") + _, force := tablet.PortMap["force_init"] + delete(tablet.PortMap, "force_init") + if err := ts.InitTablet(context.Background(), tablet, force, true /* createShardAndKeyspace */, false /* allowUpdate */); err != nil { + require.FailNow(t, "cannot create tablet %v: %v", uid, err) + } + + // create a FakeMysqlDaemon with the right information by default. + fakeMysqlDaemon := mysqlctl.NewFakeMysqlDaemon(db) + fakeMysqlDaemon.MysqlPort.Store(mysqlPort) + + return &FakeTablet{ + Tablet: tablet, + FakeMysqlDaemon: fakeMysqlDaemon, + RPCServer: grpc.NewServer(), + StartHTTPServer: startHTTPServer, + } +} + +// StartActionLoop will start the action loop for a fake tablet, +// using ft.FakeMysqlDaemon as the backing mysqld. +func (ft *FakeTablet) StartActionLoop(t *testing.T, ts *topo.Server) { + t.Helper() + if ft.TM != nil { + require.FailNow(t, "TM for %v is already running", ft.Tablet.Alias) + } + + // Listen on a random port for gRPC. + var err error + ft.Listener, err = net.Listen("tcp", "127.0.0.1:0") + if err != nil { + require.FailNow(t, "Cannot listen: %v", err) + } + gRPCPort := int32(ft.Listener.Addr().(*net.TCPAddr).Port) + + // If needed, listen on a random port for HTTP. + vtPort := ft.Tablet.PortMap["vt"] + if ft.StartHTTPServer { + ft.HTTPListener, err = net.Listen("tcp", "127.0.0.1:0") + if err != nil { + require.FailNow(t, "Cannot listen on http port: %v", err) + } + handler := http.NewServeMux() + ft.HTTPServer = &http.Server{ + Handler: handler, + } + go func() { + _ = ft.HTTPServer.Serve(ft.HTTPListener) + }() + vtPort = int32(ft.HTTPListener.Addr().(*net.TCPAddr).Port) + } + ft.Tablet.PortMap["vt"] = vtPort + ft.Tablet.PortMap["grpc"] = gRPCPort + ft.Tablet.Hostname = "127.0.0.1" + + // Create a test tm on that port, and re-read the record + // (it has new ports and IP). + ft.TM = &tabletmanager.TabletManager{ + BatchCtx: context.Background(), + TopoServer: ts, + MysqlDaemon: ft.FakeMysqlDaemon, + DBConfigs: &dbconfigs.DBConfigs{}, + QueryServiceControl: tabletservermock.NewController(), + VREngine: vreplication.NewTestEngine(ts, ft.Tablet.Alias.Cell, ft.FakeMysqlDaemon, binlogplayer.NewFakeDBClient, binlogplayer.NewFakeDBClient, topoproto.TabletDbName(ft.Tablet), nil), + Env: vtenv.NewTestEnv(), + } + if err := ft.TM.Start(ft.Tablet, nil); err != nil { + require.FailNow(t, "Error in tablet - %v, err - %v", topoproto.TabletAliasString(ft.Tablet.Alias), err.Error()) + } + ft.Tablet = ft.TM.Tablet() + + // Register the gRPC server, and starts listening. + grpctmserver.RegisterForTest(ft.RPCServer, ft.TM) + go ft.RPCServer.Serve(ft.Listener) + + // And wait for it to serve, so we don't start using it before it's + // ready. + timeout := 5 * time.Second + step := 10 * time.Millisecond + c := tmclient.NewTabletManagerClient() + for timeout >= 0 { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + err := c.Ping(ctx, ft.TM.Tablet()) + cancel() + if err == nil { + break + } + time.Sleep(step) + timeout -= step + } + if timeout < 0 { + panic("StartActionLoop failed.") + } +} + +// StopActionLoop will stop the Action Loop for the given FakeTablet +func (ft *FakeTablet) StopActionLoop(t *testing.T) { + if ft.TM == nil { + return + } + if ft.StartHTTPServer { + ft.HTTPListener.Close() + } + ft.Listener.Close() + ft.TM.Stop() + ft.TM = nil + ft.Listener = nil + ft.HTTPListener = nil +} + +// Target returns the keyspace/shard/type info of this tablet as Target. +func (ft *FakeTablet) Target() *querypb.Target { + return &querypb.Target{ + Keyspace: ft.Tablet.Keyspace, + Shard: ft.Tablet.Shard, + TabletType: ft.Tablet.Type, + } +} diff --git a/go/cmd/vtctldclient/command/keyspaces.go b/go/cmd/vtctldclient/command/keyspaces.go index 4d1156291cf..7eb9494a9c9 100644 --- a/go/cmd/vtctldclient/command/keyspaces.go +++ b/go/cmd/vtctldclient/command/keyspaces.go @@ -110,19 +110,10 @@ SetKeyspaceDurabilityPolicy --durability-policy='semi_sync' customer`, Args: cobra.ExactArgs(1), RunE: commandSetKeyspaceDurabilityPolicy, } - // ValidateSchemaKeyspace makes a ValidateSchemaKeyspace gRPC call to a vtctld. - ValidateSchemaKeyspace = &cobra.Command{ - Use: "ValidateSchemaKeyspace [--exclude-tables=] [--include-views] [--skip-no-primary] [--include-vschema] ", - Short: "Validates that the schema on the primary tablet for shard 0 matches the schema on all other tablets in the keyspace.", - DisableFlagsInUseLine: true, - Aliases: []string{"validateschemakeyspace"}, - Args: cobra.ExactArgs(1), - RunE: commandValidateSchemaKeyspace, - } // ValidateVersionKeyspace makes a ValidateVersionKeyspace gRPC call to a vtctld. ValidateVersionKeyspace = &cobra.Command{ Use: "ValidateVersionKeyspace ", - Short: "Validates that the version on the primary tablet of shard 0 matches all of the other tablets in the keyspace.", + Short: "Validates that the version on the primary tablet of the first shard matches all of the other tablets in the keyspace.", DisableFlagsInUseLine: true, Aliases: []string{"validateversionkeyspace"}, Args: cobra.ExactArgs(1), @@ -351,38 +342,6 @@ func commandSetKeyspaceDurabilityPolicy(cmd *cobra.Command, args []string) error return nil } -var validateSchemaKeyspaceOptions = struct { - ExcludeTables []string - IncludeViews bool - SkipNoPrimary bool - IncludeVSchema bool -}{} - -func commandValidateSchemaKeyspace(cmd *cobra.Command, args []string) error { - cli.FinishedParsing(cmd) - - ks := cmd.Flags().Arg(0) - resp, err := client.ValidateSchemaKeyspace(commandCtx, &vtctldatapb.ValidateSchemaKeyspaceRequest{ - Keyspace: ks, - ExcludeTables: validateSchemaKeyspaceOptions.ExcludeTables, - IncludeVschema: validateSchemaKeyspaceOptions.IncludeVSchema, - SkipNoPrimary: validateSchemaKeyspaceOptions.SkipNoPrimary, - IncludeViews: validateSchemaKeyspaceOptions.IncludeViews, - }) - - if err != nil { - return err - } - - data, err := cli.MarshalJSON(resp) - if err != nil { - return err - } - - fmt.Printf("%s\n", data) - return nil -} - func commandValidateVersionKeyspace(cmd *cobra.Command, args []string) error { cli.FinishedParsing(cmd) @@ -429,11 +388,5 @@ func init() { SetKeyspaceDurabilityPolicy.Flags().StringVar(&setKeyspaceDurabilityPolicyOptions.DurabilityPolicy, "durability-policy", policy.DurabilityNone, "Type of durability to enforce for this keyspace. Default is none. Other values include 'semi_sync' and others as dictated by registered plugins.") Root.AddCommand(SetKeyspaceDurabilityPolicy) - ValidateSchemaKeyspace.Flags().BoolVar(&validateSchemaKeyspaceOptions.IncludeViews, "include-views", false, "Includes views in compared schemas.") - ValidateSchemaKeyspace.Flags().BoolVar(&validateSchemaKeyspaceOptions.IncludeVSchema, "include-vschema", false, "Includes VSchema validation in validation results.") - ValidateSchemaKeyspace.Flags().BoolVar(&validateSchemaKeyspaceOptions.SkipNoPrimary, "skip-no-primary", false, "Skips validation on whether or not a primary exists in shards.") - ValidateSchemaKeyspace.Flags().StringSliceVar(&validateSchemaKeyspaceOptions.ExcludeTables, "exclude-tables", []string{}, "Tables to exclude during schema comparison.") - Root.AddCommand(ValidateSchemaKeyspace) - Root.AddCommand(ValidateVersionKeyspace) } diff --git a/go/cmd/vtctldclient/command/permissions.go b/go/cmd/vtctldclient/command/permissions.go new file mode 100644 index 00000000000..57dc2c5b38e --- /dev/null +++ b/go/cmd/vtctldclient/command/permissions.go @@ -0,0 +1,114 @@ +/* +Copyright 2025 The Vitess Authors. + +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 + + http://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 command + +import ( + "fmt" + + "github.com/spf13/cobra" + + "vitess.io/vitess/go/cmd/vtctldclient/cli" + "vitess.io/vitess/go/vt/topo/topoproto" + + vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" +) + +var ( + // GetPermissions makes a GetPermissions gRPC call to a vtctld. + GetPermissions = &cobra.Command{ + Use: "GetPermissions ", + Short: "Displays the permissions for a tablet.", + DisableFlagsInUseLine: true, + Args: cobra.ExactArgs(1), + RunE: commandGetPermissions, + } + // ValidatePermissionsShard makes a ValidatePermissionsKeyspace gRPC call to a + // vtctld with the specified shard to examine in the keyspace. + ValidatePermissionsShard = &cobra.Command{ + Use: "ValidatePermissionsShard ", + Short: "Validates that the permissions on the primary match all of the replicas.", + DisableFlagsInUseLine: true, + Args: cobra.ExactArgs(1), + RunE: commandValidatePermissionsShard, + } + // ValidatePermissionsKeyspace makes a ValidatePermissionsKeyspace gRPC call to a + // vtctld. + ValidatePermissionsKeyspace = &cobra.Command{ + Use: "ValidatePermissionsKeyspace ", + Short: "Validates that the permissions on the primary of the first shard match those of all of the other tablets in the keyspace.", + DisableFlagsInUseLine: true, + Args: cobra.ExactArgs(1), + RunE: commandValidatePermissionsKeyspace, + } +) + +func commandGetPermissions(cmd *cobra.Command, args []string) error { + alias, err := topoproto.ParseTabletAlias(cmd.Flags().Arg(0)) + if err != nil { + return err + } + + cli.FinishedParsing(cmd) + + resp, err := client.GetPermissions(commandCtx, &vtctldatapb.GetPermissionsRequest{ + TabletAlias: alias, + }) + if err != nil { + return err + } + p, err := cli.MarshalJSON(resp.Permissions) + if err != nil { + return err + } + fmt.Printf("%s\n", p) + + return nil +} + +func commandValidatePermissionsKeyspace(cmd *cobra.Command, args []string) error { + keyspace := cmd.Flags().Arg(0) + + cli.FinishedParsing(cmd) + + _, err := client.ValidatePermissionsKeyspace(commandCtx, &vtctldatapb.ValidatePermissionsKeyspaceRequest{ + Keyspace: keyspace, + }) + + return err +} + +func commandValidatePermissionsShard(cmd *cobra.Command, args []string) error { + keyspace, shard, err := topoproto.ParseKeyspaceShard(cmd.Flags().Arg(0)) + if err != nil { + return err + } + + cli.FinishedParsing(cmd) + + _, err = client.ValidatePermissionsKeyspace(commandCtx, &vtctldatapb.ValidatePermissionsKeyspaceRequest{ + Keyspace: keyspace, + Shards: []string{shard}, + }) + + return err +} + +func init() { + Root.AddCommand(GetPermissions) + Root.AddCommand(ValidatePermissionsKeyspace) + Root.AddCommand(ValidatePermissionsShard) +} diff --git a/go/cmd/vtctldclient/command/permissions_test.go b/go/cmd/vtctldclient/command/permissions_test.go new file mode 100644 index 00000000000..a9ddba36f7f --- /dev/null +++ b/go/cmd/vtctldclient/command/permissions_test.go @@ -0,0 +1,608 @@ +/* +Copyright 2025 The Vitess Authors. + +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 + + http://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 command + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/vt/discovery" + "vitess.io/vitess/go/vt/topo/topoproto" + "vitess.io/vitess/go/vt/vtctl/grpcvtctldserver" + "vitess.io/vitess/go/vt/vtenv" + + "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/vt/topo" + "vitess.io/vitess/go/vt/topo/memorytopo" + + querypb "vitess.io/vitess/go/vt/proto/query" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" +) + +func TestPermissions(t *testing.T) { + delay := discovery.GetTabletPickerRetryDelay() + defer func() { + discovery.SetTabletPickerRetryDelay(delay) + }() + discovery.SetTabletPickerRetryDelay(5 * time.Millisecond) + + // Initialize our environment. + ctx, cancel := context.WithTimeout(context.Background(), time.Second*60) + defer cancel() + ts := memorytopo.NewServer(ctx, "cell1", "cell2") + defer ts.Close() + vtctld := grpcvtctldserver.NewVtctldServer(vtenv.NewTestEnv(), ts) + + primary := NewFakeTablet(t, ts, "cell1", 0, topodatapb.TabletType_PRIMARY, nil) + replica := NewFakeTablet(t, ts, "cell1", 1, topodatapb.TabletType_REPLICA, nil) + + // Mark the primary for the shard. + _, err := ts.UpdateShardFields(ctx, primary.Tablet.Keyspace, primary.Tablet.Shard, func(si *topo.ShardInfo) error { + si.PrimaryAlias = primary.Tablet.Alias + return nil + }) + require.NoError(t, err) + + // The primary will be asked for permissions. + primary.FakeMysqlDaemon.FetchSuperQueryMap = map[string]*sqltypes.Result{ + "SELECT * FROM mysql.user ORDER BY host, user": { + Fields: []*querypb.Field{ + { + Name: "Host", + Type: sqltypes.Char, + }, + { + Name: "User", + Type: sqltypes.Char, + }, + { + Name: "Password", + Type: sqltypes.Char, + }, + { + Name: "Select_priv", + Type: sqltypes.Char, + }, + { + Name: "Insert_priv", + Type: sqltypes.Char, + }, + { + Name: "Update_priv", + Type: sqltypes.Char, + }, + { + Name: "Delete_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_priv", + Type: sqltypes.Char, + }, + { + Name: "Drop_priv", + Type: sqltypes.Char, + }, + { + Name: "Reload_priv", + Type: sqltypes.Char, + }, + { + Name: "Shutdown_priv", + Type: sqltypes.Char, + }, + { + Name: "Process_priv", + Type: sqltypes.Char, + }, + { + Name: "File_priv", + Type: sqltypes.Char, + }, + { + Name: "Grant_priv", + Type: sqltypes.Char, + }, + { + Name: "References_priv", + Type: sqltypes.Char, + }, + { + Name: "Index_priv", + Type: sqltypes.Char, + }, + { + Name: "Alter_priv", + Type: sqltypes.Char, + }, + { + Name: "Show_db_priv", + Type: sqltypes.Char, + }, + { + Name: "Super_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_tmp_table_priv", + Type: sqltypes.Char, + }, + { + Name: "Lock_tables_priv", + Type: sqltypes.Char, + }, + { + Name: "Execute_priv", + Type: sqltypes.Char, + }, + { + Name: "Repl_slave_priv", + Type: sqltypes.Char, + }, + { + Name: "Repl_client_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_view_priv", + Type: sqltypes.Char, + }, + { + Name: "Show_view_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_routine_priv", + Type: sqltypes.Char, + }, + { + Name: "Alter_routine_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_user_priv", + Type: sqltypes.Char, + }, + { + Name: "Event_priv", + Type: sqltypes.Char, + }, + { + Name: "Trigger_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_tablespace_priv", + Type: sqltypes.Char, + }, + { + Name: "ssl_type", + Type: sqltypes.Char, + }, + { + Name: "ssl_cipher", + Type: 252, + }, + { + Name: "x509_issuer", + Type: 252, + }, + { + Name: "x509_subject", + Type: 252, + }, + { + Name: "max_questions", + Type: 3, + }, + { + Name: "max_updates", + Type: 3, + }, + { + Name: "max_connections", + Type: 3, + }, + { + Name: "max_user_connections", + Type: 3, + }, + { + Name: "plugin", + Type: sqltypes.Char, + }, + { + Name: "authentication_string", + Type: 252, + }, + { + Name: "password_expired", + Type: sqltypes.Char, + }, + { + Name: "is_role", + Type: sqltypes.Char, + }}, + RowsAffected: 0x6, + InsertID: 0x0, + Rows: [][]sqltypes.Value{ + { + sqltypes.NewVarBinary("test_host1"), + sqltypes.NewVarBinary("test_user1"), + sqltypes.NewVarBinary("test_password1"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N")}, + { + sqltypes.NewVarBinary("test_host2"), + sqltypes.NewVarBinary("test_user2"), + sqltypes.NewVarBinary("test_password2"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N")}, + { + sqltypes.NewVarBinary("test_host3"), + sqltypes.NewVarBinary("test_user3"), + sqltypes.NewVarBinary("test_password3"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N")}, + { + sqltypes.NewVarBinary("test_host4"), + sqltypes.NewVarBinary("test_user4"), + sqltypes.NewVarBinary("test_password4"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + }, + }, + }, + "SELECT * FROM mysql.db ORDER BY host, db, user": { + Fields: []*querypb.Field{ + { + Name: "Host", + Type: sqltypes.Char, + }, + { + Name: "Db", + Type: sqltypes.Char, + }, + { + Name: "User", + Type: sqltypes.Char, + }, + { + Name: "Select_priv", + Type: sqltypes.Char, + }, + { + Name: "Insert_priv", + Type: sqltypes.Char, + }, + { + Name: "Update_priv", + Type: sqltypes.Char, + }, + { + Name: "Delete_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_priv", + Type: sqltypes.Char, + }, + { + Name: "Drop_priv", + Type: sqltypes.Char, + }, + { + Name: "Grant_priv", + Type: sqltypes.Char, + }, + { + Name: "References_priv", + Type: sqltypes.Char, + }, + { + Name: "Index_priv", + Type: sqltypes.Char, + }, + { + Name: "Alter_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_tmp_table_priv", + Type: sqltypes.Char, + }, + { + Name: "Lock_tables_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_view_priv", + Type: sqltypes.Char, + }, + { + Name: "Show_view_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_routine_priv", + Type: sqltypes.Char, + }, + { + Name: "Alter_routine_priv", + Type: sqltypes.Char, + }, + { + Name: "Execute_priv", + Type: sqltypes.Char, + }, + { + Name: "Event_priv", + Type: sqltypes.Char, + }, + { + Name: "Trigger_priv", + Type: sqltypes.Char, + }, + }, + RowsAffected: 0, + InsertID: 0, + Rows: [][]sqltypes.Value{ + { + sqltypes.NewVarBinary("test_host"), + sqltypes.NewVarBinary("test_db"), + sqltypes.NewVarBinary("test_user"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + }, + }, + }, + } + primary.StartActionLoop(t, ts) + defer primary.StopActionLoop(t) + + // Make a two-level-deep copy, so we can make them diverge later. + user := *primary.FakeMysqlDaemon.FetchSuperQueryMap["SELECT * FROM mysql.user ORDER BY host, user"] + user.Fields = append([]*querypb.Field{}, user.Fields...) + + // The replica will be asked for permissions. + replica.FakeMysqlDaemon.FetchSuperQueryMap = map[string]*sqltypes.Result{ + "SELECT * FROM mysql.user ORDER BY host, user": &user, + "SELECT * FROM mysql.db ORDER BY host, db, user": primary.FakeMysqlDaemon.FetchSuperQueryMap["SELECT * FROM mysql.db ORDER BY host, db, user"], + } + replica.FakeMysqlDaemon.SetReplicationSourceInputs = append(replica.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(primary.Tablet)) + replica.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ + // These 3 statements come from tablet startup. + "STOP REPLICA", + "FAKE SET SOURCE", + "START REPLICA", + } + replica.StartActionLoop(t, ts) + defer replica.StopActionLoop(t) + + // Overwrite with the correct value to make sure it passes. + replica.FakeMysqlDaemon.FetchSuperQueryMap["SELECT * FROM mysql.user ORDER BY host, user"].Fields[0] = &querypb.Field{ + Name: "Host", + Type: sqltypes.Char, + } + + _, err = vtctld.GetPermissions(ctx, &vtctldatapb.GetPermissionsRequest{ + TabletAlias: primary.Tablet.Alias, + }) + require.NoError(t, err) + + _, err = vtctld.ValidatePermissionsKeyspace(ctx, &vtctldatapb.ValidatePermissionsKeyspaceRequest{ + Keyspace: primary.Tablet.Keyspace, + }) + require.NoError(t, err) + _, err = vtctld.ValidatePermissionsKeyspace(ctx, &vtctldatapb.ValidatePermissionsKeyspaceRequest{ + Keyspace: primary.Tablet.Keyspace, + Shards: []string{primary.Tablet.Shard}, + }) + require.NoError(t, err) + + // Modify one field, which should result in a validation failure/error. + replica.FakeMysqlDaemon.FetchSuperQueryMap["SELECT * FROM mysql.user ORDER BY host, user"].Fields[0] = &querypb.Field{ + Name: "Wrong", + Type: sqltypes.Char, + } + _, err = vtctld.ValidatePermissionsKeyspace(ctx, &vtctldatapb.ValidatePermissionsKeyspaceRequest{ + Keyspace: primary.Tablet.Keyspace, + }) + require.ErrorContains(t, err, "has an extra user") + _, err = vtctld.ValidatePermissionsKeyspace(ctx, &vtctldatapb.ValidatePermissionsKeyspaceRequest{ + Keyspace: primary.Tablet.Keyspace, + Shards: []string{primary.Tablet.Shard}, + }) + require.ErrorContains(t, err, "has an extra user") +} diff --git a/go/cmd/vtctldclient/command/root.go b/go/cmd/vtctldclient/command/root.go index 3ebe019f94d..2a65a59f606 100644 --- a/go/cmd/vtctldclient/command/root.go +++ b/go/cmd/vtctldclient/command/root.go @@ -37,7 +37,6 @@ import ( "vitess.io/vitess/go/vt/vtctl/localvtctldclient" "vitess.io/vitess/go/vt/vtctl/vtctldclient" "vitess.io/vitess/go/vt/vtenv" - "vitess.io/vitess/go/vt/vttablet/tmclient" // These imports ensure init()s within them get called and they register their commands/subcommands. "vitess.io/vitess/go/cmd/vtctldclient/cli" @@ -97,8 +96,8 @@ var ( // Root is the main entrypoint to the vtctldclient CLI. Root = &cobra.Command{ Use: "vtctldclient", - Short: "Executes a cluster management command on the remote vtctld server.", - Long: fmt.Sprintf(`Executes a cluster management command on the remote vtctld server. + Short: "Executes a cluster management command on the remote vtctld server or alternatively as a standalone binary using --server=internal.", + Long: fmt.Sprintf(`Executes a cluster management command on the remote vtctld server or alternatively as a standalone binary using --server=internal. If there are no running vtctld servers -- for example when bootstrapping a new Vitess cluster -- you can specify a --server value of '%s'. When doing so, you would use the --topo* flags so that the client can @@ -204,14 +203,6 @@ func getClientForCommand(cmd *cobra.Command) (vtctldclient.VtctldClient, error) } onTerm = append(onTerm, ts.Close) - // Use internal vtctld server implementation. - // Register a nil grpc handler -- we will not use tmclient at all but - // a factory still needs to be registered. - once.Do(func() { - tmclient.RegisterTabletManagerClientFactory("grpc", func() tmclient.TabletManagerClient { - return nil - }) - }) vtctld := grpcvtctldserver.NewVtctldServer(env, ts) localvtctldclient.SetServer(vtctld) VtctldClientProtocol = "local" diff --git a/go/cmd/vtctldclient/command/root_test.go b/go/cmd/vtctldclient/command/root_test.go index 86333ec0e69..0f0cdca8dcd 100644 --- a/go/cmd/vtctldclient/command/root_test.go +++ b/go/cmd/vtctldclient/command/root_test.go @@ -67,15 +67,15 @@ func TestRootWithInternalVtctld(t *testing.T) { cell := "zone1" ts, factory := memorytopo.NewServerAndFactory(ctx, cell) topo.RegisterFactory("test", factory) + origProtocol := command.VtctldClientProtocol command.VtctldClientProtocol = "local" baseArgs := []string{"vtctldclient", "--server", "internal", "--topo-implementation", "test"} args := append([]string{}, os.Args...) - protocol := command.VtctldClientProtocol t.Cleanup(func() { ts.Close() os.Args = append([]string{}, args...) - command.VtctldClientProtocol = protocol + command.VtctldClientProtocol = origProtocol }) testCases := []struct { diff --git a/go/cmd/vtctldclient/command/schema.go b/go/cmd/vtctldclient/command/schema.go index db34bd2588f..21a995f30a1 100644 --- a/go/cmd/vtctldclient/command/schema.go +++ b/go/cmd/vtctldclient/command/schema.go @@ -32,8 +32,9 @@ import ( "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vtctl/grpcvtctldserver" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" - "vitess.io/vitess/go/vt/proto/vtrpc" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) var ( @@ -58,6 +59,13 @@ For --sql, semi-colons and repeated values may be mixed, for example: Args: cobra.ExactArgs(1), RunE: commandApplySchema, } + CopySchemaShard = &cobra.Command{ + Use: "CopySchemaShard [--tables=,,...] [--exclude-tables=,,...] [--include-views] [--skip-verify] [--wait-replicas-timeout=10s] { || } ", + Short: "Copies the schema from a source shard's primary (or a specific tablet) to a destination shard. The schema is applied directly on the primary of the destination shard, and it is propagated to the replicas through binlogs.", + DisableFlagsInUseLine: true, + Args: cobra.ExactArgs(2), + RunE: commandCopySchemaShard, + } // GetSchema makes a GetSchema gRPC call to a vtctld. GetSchema = &cobra.Command{ Use: "GetSchema [--tables TABLES ...] [--exclude-tables EXCLUDE_TABLES ...] [{--table-names-only | --table-sizes-only}] [--include-views] alias", @@ -90,6 +98,25 @@ For --sql, semi-colons and repeated values may be mixed, for example: Args: cobra.ExactArgs(1), RunE: commandReloadSchemaShard, } + // ValidateSchemaKeyspace makes a ValidateSchemaKeyspace gRPC call to a vtctld. + ValidateSchemaKeyspace = &cobra.Command{ + Use: "ValidateSchemaKeyspace [--exclude-tables=] [--include-views] [--skip-no-primary] [--include-vschema] ", + Short: "Validates that the schema on the primary tablet for the first shard matches the schema on all other tablets in the keyspace.", + DisableFlagsInUseLine: true, + Aliases: []string{"validateschemakeyspace"}, + Args: cobra.ExactArgs(1), + RunE: commandValidateSchemaKeyspace, + } + // ValidateSchemaShard makes a ValidateSchemaKeyspace gRPC call to a vtctld with + // the specified shard to examine in the keyspace. + ValidateSchemaShard = &cobra.Command{ + Use: "ValidateSchemaShard [--exclude-tables=] [--include-views] [--skip-no-primary] [--include-vschema] ", + Short: "Validates that the schema on the primary tablet for the specified shard matches the schema on all other tablets in that shard.", + DisableFlagsInUseLine: true, + Aliases: []string{"validateschemashard"}, + Args: cobra.ExactArgs(1), + RunE: commandValidateSchemaShard, + } ) var applySchemaOptions = struct { @@ -129,9 +156,9 @@ func commandApplySchema(cmd *cobra.Command, args []string) error { cli.FinishedParsing(cmd) - var cid *vtrpc.CallerID + var cid *vtrpcpb.CallerID if applySchemaOptions.CallerID != "" { - cid = &vtrpc.CallerID{Principal: applySchemaOptions.CallerID} + cid = &vtrpcpb.CallerID{Principal: applySchemaOptions.CallerID} } ks := cmd.Flags().Arg(0) @@ -154,6 +181,61 @@ func commandApplySchema(cmd *cobra.Command, args []string) error { return nil } +var copySchemaShardOptions = struct { + tables []string + excludeTables []string + includeViews bool + skipVerify bool + waitReplicasTimeout time.Duration +}{} + +func commandCopySchemaShard(cmd *cobra.Command, args []string) error { + destKeyspace, destShard, err := topoproto.ParseKeyspaceShard(cmd.Flags().Arg(1)) + if err != nil { + return err + } + + cli.FinishedParsing(cmd) + + var sourceTabletAlias *topodatapb.TabletAlias + sourceKeyspace, sourceShard, err := topoproto.ParseKeyspaceShard(cmd.Flags().Arg(0)) + if err == nil { + res, err := client.GetTablets(commandCtx, &vtctldatapb.GetTabletsRequest{ + Keyspace: sourceKeyspace, + Shard: sourceShard, + TabletType: topodatapb.TabletType_PRIMARY, + }) + if err != nil { + return err + } + tablets := res.GetTablets() + if len(tablets) == 0 { + return fmt.Errorf("no primary tablet found in source shard %s/%s", sourceKeyspace, sourceShard) + } + sourceTabletAlias = tablets[0].Alias + } else { + sourceTabletAlias, err = topoproto.ParseTabletAlias(cmd.Flags().Arg(0)) + if err != nil { + return err + } + } + + req := &vtctldatapb.CopySchemaShardRequest{ + SourceTabletAlias: sourceTabletAlias, + Tables: copySchemaShardOptions.tables, + ExcludeTables: copySchemaShardOptions.excludeTables, + IncludeViews: copySchemaShardOptions.includeViews, + SkipVerify: copySchemaShardOptions.skipVerify, + WaitReplicasTimeout: protoutil.DurationToProto(copySchemaShardOptions.waitReplicasTimeout), + DestinationKeyspace: destKeyspace, + DestinationShard: destShard, + } + + _, err = client.CopySchemaShard(commandCtx, req) + + return err +} + var getSchemaOptions = struct { Tables []string ExcludeTables []string @@ -284,6 +366,69 @@ func commandReloadSchemaShard(cmd *cobra.Command, args []string) error { return err } +var validateSchemaKeyspaceOptions = struct { + ExcludeTables []string + IncludeViews bool + SkipNoPrimary bool + IncludeVSchema bool + Shard string +}{} + +func commandValidateSchemaKeyspace(cmd *cobra.Command, args []string) error { + cli.FinishedParsing(cmd) + + keyspace := cmd.Flags().Arg(0) + resp, err := client.ValidateSchemaKeyspace(commandCtx, &vtctldatapb.ValidateSchemaKeyspaceRequest{ + Keyspace: keyspace, + ExcludeTables: validateSchemaKeyspaceOptions.ExcludeTables, + IncludeVschema: validateSchemaKeyspaceOptions.IncludeVSchema, + SkipNoPrimary: validateSchemaKeyspaceOptions.SkipNoPrimary, + IncludeViews: validateSchemaKeyspaceOptions.IncludeViews, + }) + + if err != nil { + return err + } + + data, err := cli.MarshalJSON(resp.ResultsByShard) + if err != nil { + return err + } + + fmt.Printf("%s\n", data) + return nil +} + +func commandValidateSchemaShard(cmd *cobra.Command, args []string) error { + keyspace, shard, err := topoproto.ParseKeyspaceShard(cmd.Flags().Arg(0)) + if err != nil { + return err + } + + cli.FinishedParsing(cmd) + + resp, err := client.ValidateSchemaKeyspace(commandCtx, &vtctldatapb.ValidateSchemaKeyspaceRequest{ + Keyspace: keyspace, + Shards: []string{shard}, + ExcludeTables: validateSchemaKeyspaceOptions.ExcludeTables, + IncludeVschema: validateSchemaKeyspaceOptions.IncludeVSchema, + SkipNoPrimary: validateSchemaKeyspaceOptions.SkipNoPrimary, + IncludeViews: validateSchemaKeyspaceOptions.IncludeViews, + }) + + if err != nil { + return err + } + + data, err := cli.MarshalJSON(resp.Results) + if err != nil { + return err + } + + fmt.Printf("%s\n", data) + return nil +} + func init() { ApplySchema.Flags().StringVar(&applySchemaOptions.DDLStrategy, "ddl-strategy", string(schema.DDLStrategyDirect), "Online DDL strategy, compatible with @@ddl_strategy session variable (examples: 'gh-ost', 'pt-osc', 'gh-ost --max-load=Threads_running=100'.") ApplySchema.Flags().StringSliceVar(&applySchemaOptions.UUIDList, "uuid", nil, "Optional, comma-delimited, repeatable, explicit UUIDs for migration. If given, must match number of DDL changes.") @@ -293,16 +438,21 @@ func init() { ApplySchema.Flags().StringArrayVar(&applySchemaOptions.SQL, "sql", nil, "Semicolon-delimited, repeatable SQL commands to apply. Exactly one of --sql|--sql-file is required.") ApplySchema.Flags().StringVar(&applySchemaOptions.SQLFile, "sql-file", "", "Path to a file containing semicolon-delimited SQL commands to apply. Exactly one of --sql|--sql-file is required.") ApplySchema.Flags().Int64Var(&applySchemaOptions.BatchSize, "batch-size", 0, "How many queries to batch together. Only applicable when all queries are CREATE TABLE|VIEW") - Root.AddCommand(ApplySchema) + CopySchemaShard.Flags().StringSliceVar(©SchemaShardOptions.tables, "tables", nil, "Specifies a comma-separated list of tables to copy. Each is either an exact match, or a regular expression of the form /regexp/") + CopySchemaShard.Flags().StringSliceVar(©SchemaShardOptions.excludeTables, "exclude-tables", nil, "Specifies a comma-separated list of tables to exclude. Each is either an exact match, or a regular expression of the form /regexp/") + CopySchemaShard.Flags().BoolVar(©SchemaShardOptions.includeViews, "include-views", true, "Includes views in the output") + CopySchemaShard.Flags().BoolVar(©SchemaShardOptions.skipVerify, "skip-verify", false, "Skip verification of source and target schema after copy") + CopySchemaShard.Flags().DurationVar(©SchemaShardOptions.waitReplicasTimeout, "wait-replicas-timeout", grpcvtctldserver.DefaultWaitReplicasTimeout, "The amount of time to wait for replicas to receive the schema change via replication.") + Root.AddCommand(CopySchemaShard) + GetSchema.Flags().StringSliceVar(&getSchemaOptions.Tables, "tables", nil, "List of tables to display the schema for. Each is either an exact match, or a regular expression of the form `/regexp/`.") GetSchema.Flags().StringSliceVar(&getSchemaOptions.ExcludeTables, "exclude-tables", nil, "List of tables to exclude from the result. Each is either an exact match, or a regular expression of the form `/regexp/`.") GetSchema.Flags().BoolVar(&getSchemaOptions.IncludeViews, "include-views", false, "Includes views in the output in addition to base tables.") GetSchema.Flags().BoolVarP(&getSchemaOptions.TableNamesOnly, "table-names-only", "n", false, "Display only table names in the result.") GetSchema.Flags().BoolVarP(&getSchemaOptions.TableSizesOnly, "table-sizes-only", "s", false, "Display only size information for matching tables. Ignored if --table-names-only is set.") GetSchema.Flags().BoolVarP(&getSchemaOptions.TableSchemaOnly, "table-schema-only", "", false, "Skip introspecting columns and fields metadata.") - Root.AddCommand(GetSchema) Root.AddCommand(ReloadSchema) @@ -314,4 +464,16 @@ func init() { ReloadSchemaShard.Flags().Int32Var(&reloadSchemaShardOptions.Concurrency, "concurrency", 10, "Number of tablets to reload in parallel. Set to zero for unbounded concurrency.") ReloadSchemaShard.Flags().BoolVar(&reloadSchemaShardOptions.IncludePrimary, "include-primary", false, "Also reload the primary tablet.") Root.AddCommand(ReloadSchemaShard) + + ValidateSchemaKeyspace.Flags().BoolVar(&validateSchemaKeyspaceOptions.IncludeViews, "include-views", false, "Includes views in compared schemas.") + ValidateSchemaKeyspace.Flags().BoolVar(&validateSchemaKeyspaceOptions.IncludeVSchema, "include-vschema", false, "Includes VSchema validation in validation results.") + ValidateSchemaKeyspace.Flags().BoolVar(&validateSchemaKeyspaceOptions.SkipNoPrimary, "skip-no-primary", false, "Skips validation on whether or not a primary exists in shards.") + ValidateSchemaKeyspace.Flags().StringSliceVar(&validateSchemaKeyspaceOptions.ExcludeTables, "exclude-tables", []string{}, "Tables to exclude during schema comparison.") + Root.AddCommand(ValidateSchemaKeyspace) + + ValidateSchemaShard.Flags().BoolVar(&validateSchemaKeyspaceOptions.IncludeViews, "include-views", false, "Includes views in compared schemas.") + ValidateSchemaShard.Flags().BoolVar(&validateSchemaKeyspaceOptions.IncludeVSchema, "include-vschema", false, "Includes VSchema validation in validation results.") + ValidateSchemaShard.Flags().BoolVar(&validateSchemaKeyspaceOptions.SkipNoPrimary, "skip-no-primary", false, "Skips validation on whether or not a primary exists in shards.") + ValidateSchemaShard.Flags().StringSliceVar(&validateSchemaKeyspaceOptions.ExcludeTables, "exclude-tables", []string{}, "Tables to exclude during schema comparison.") + Root.AddCommand(ValidateSchemaShard) } diff --git a/go/cmd/vtctldclient/command/tablets.go b/go/cmd/vtctldclient/command/tablets.go index bb468fbd7ff..3ee7de1e867 100644 --- a/go/cmd/vtctldclient/command/tablets.go +++ b/go/cmd/vtctldclient/command/tablets.go @@ -92,14 +92,6 @@ Note: hook names may not contain slash (/) characters. Args: cobra.ExactArgs(1), RunE: commandGetFullStatus, } - // GetPermissions makes a GetPermissions gRPC call to a vtctld. - GetPermissions = &cobra.Command{ - Use: "GetPermissions ", - Short: "Displays the permissions for a tablet.", - DisableFlagsInUseLine: true, - Args: cobra.ExactArgs(1), - RunE: commandGetPermissions, - } // GetTablet makes a GetTablet gRPC call to a vtctld. GetTablet = &cobra.Command{ Use: "GetTablet ", @@ -380,29 +372,6 @@ func commandGetFullStatus(cmd *cobra.Command, args []string) error { return nil } -func commandGetPermissions(cmd *cobra.Command, args []string) error { - alias, err := topoproto.ParseTabletAlias(cmd.Flags().Arg(0)) - if err != nil { - return err - } - - cli.FinishedParsing(cmd) - - resp, err := client.GetPermissions(commandCtx, &vtctldatapb.GetPermissionsRequest{ - TabletAlias: alias, - }) - if err != nil { - return err - } - p, err := cli.MarshalJSON(resp.Permissions) - if err != nil { - return err - } - fmt.Printf("%s\n", p) - - return nil -} - func commandGetTablet(cmd *cobra.Command, args []string) error { aliasStr := cmd.Flags().Arg(0) alias, err := topoproto.ParseTabletAlias(aliasStr) @@ -685,7 +654,6 @@ func init() { Root.AddCommand(ExecuteHook) Root.AddCommand(GetFullStatus) - Root.AddCommand(GetPermissions) Root.AddCommand(GetTablet) GetTablets.Flags().StringSliceVarP(&getTabletsOptions.TabletAliasStrings, "tablet-alias", "t", nil, "List of tablet aliases to filter by.") diff --git a/go/cmd/vtctldclient/command/topology.go b/go/cmd/vtctldclient/command/topology.go index 6aa6949341c..a03ce403eb8 100644 --- a/go/cmd/vtctldclient/command/topology.go +++ b/go/cmd/vtctldclient/command/topology.go @@ -18,10 +18,13 @@ package command import ( "fmt" + "os" + "strings" "github.com/spf13/cobra" "vitess.io/vitess/go/cmd/vtctldclient/cli" + "vitess.io/vitess/go/vt/topo" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" ) @@ -36,12 +39,30 @@ var ( RunE: commandGetTopologyPath, } + // WriteTopologyPath writes the contents of a local file to a path + // in the topology server. + WriteTopologyPath = &cobra.Command{ + Use: "WriteTopologyPath --server=local ", + Short: "Copies a local file to the topology server at the given path.", + DisableFlagsInUseLine: true, + Args: cobra.ExactArgs(2), + PreRunE: func(cmd *cobra.Command, args []string) error { + if VtctldClientProtocol != "local" { + return fmt.Errorf("The WriteTopologyPath command can only be used with --server=%s", useInternalVtctld) + } + return nil + }, + RunE: commandWriteTopologyPath, + } +) + +var getTopologyPathOptions = struct { // The version of the key/path to get. If not specified, the latest/current // version is returned. - version int64 = 0 + version int64 // If true, only the data is output and it is in JSON format rather than prototext. - dataAsJSON bool = false -) + dataAsJSON bool +}{} func commandGetTopologyPath(cmd *cobra.Command, args []string) error { path := cmd.Flags().Arg(0) @@ -50,14 +71,14 @@ func commandGetTopologyPath(cmd *cobra.Command, args []string) error { resp, err := client.GetTopologyPath(commandCtx, &vtctldatapb.GetTopologyPathRequest{ Path: path, - Version: version, - AsJson: dataAsJSON, + Version: getTopologyPathOptions.version, + AsJson: getTopologyPathOptions.dataAsJSON, }) if err != nil { return err } - if dataAsJSON { + if getTopologyPathOptions.dataAsJSON { if resp.GetCell() == nil || resp.GetCell().GetData() == "" { return fmt.Errorf("no data found for path %s", path) } @@ -75,8 +96,41 @@ func commandGetTopologyPath(cmd *cobra.Command, args []string) error { return nil } +var writeTopologyPathOptions = struct { + // The cell to use for the copy. Defaults to the global cell. + cell string +}{} + +func commandWriteTopologyPath(cmd *cobra.Command, args []string) error { + file := cmd.Flags().Arg(0) + path := cmd.Flags().Arg(1) + ts, err := topo.OpenServer(topoOptions.implementation, strings.Join(topoOptions.globalServerAddresses, ","), topoOptions.globalRoot) + if err != nil { + return fmt.Errorf("failed to connect to the topology server: %v", err) + } + cli.FinishedParsing(cmd) + + conn, err := ts.ConnForCell(cmd.Context(), writeTopologyPathOptions.cell) + if err != nil { + return fmt.Errorf("failed to connect to the topology server: %v", err) + } + data, err := os.ReadFile(file) + if err != nil { + return fmt.Errorf("failed to read file %s: %v", file, err) + } + _, err = conn.Update(cmd.Context(), path, data, nil) + if err != nil { + return fmt.Errorf("failed to write to topology server path %s: %v", path, err) + } + + return nil +} + func init() { - GetTopologyPath.Flags().Int64Var(&version, "version", version, "The version of the path's key to get. If not specified, the latest version is returned.") - GetTopologyPath.Flags().BoolVar(&dataAsJSON, "data-as-json", dataAsJSON, "If true, only the data is output and it is in JSON format rather than prototext.") + GetTopologyPath.Flags().Int64Var(&getTopologyPathOptions.version, "version", getTopologyPathOptions.version, "The version of the path's key to get. If not specified, the latest version is returned.") + GetTopologyPath.Flags().BoolVar(&getTopologyPathOptions.dataAsJSON, "data-as-json", getTopologyPathOptions.dataAsJSON, "If true, only the data is output and it is in JSON format rather than prototext.") Root.AddCommand(GetTopologyPath) + + WriteTopologyPath.Flags().StringVar(&writeTopologyPathOptions.cell, "cell", topo.GlobalCell, "Topology server cell to copy the file to.") + Root.AddCommand(WriteTopologyPath) } diff --git a/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff.go b/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff.go index 38b0521f142..a5d07f0502a 100644 --- a/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff.go +++ b/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff.go @@ -436,7 +436,7 @@ State: {{.State}} RowsCompared: {{.RowsCompared}} HasMismatch: {{.HasMismatch}} StartedAt: {{.StartedAt}} -{{if (eq .State "started")}}Progress: {{printf "%.2f" .Progress.Percentage}}%%{{if .Progress.ETA}}, ETA: {{.Progress.ETA}}{{end}}{{end}} +{{if (eq .State "started")}}Progress: {{printf "%.2f" .Progress.Percentage}}%{{if .Progress.ETA}}, ETA: {{.Progress.ETA}}{{end}}{{end}} {{if .CompletedAt}}CompletedAt: {{.CompletedAt}}{{end}} {{range $table := .TableSummaryMap}} Table {{$table.TableName}}: diff --git a/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff_test.go b/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff_test.go index e27c57f47be..cf713d79579 100644 --- a/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff_test.go +++ b/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff_test.go @@ -680,6 +680,75 @@ func TestVDiffSharded(t *testing.T) { } } +func TestVDiffTextTemplate(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + env := newTestVDiffEnv(t, ctx, []string{"0"}, []string{"0"}, "", nil) + defer env.close() + + now := time.Now() + UUID := uuid.New().String() + req := &tabletmanagerdatapb.VDiffRequest{ + Keyspace: env.targetKeyspace, + Workflow: env.workflow, + Action: string(vdiff.ShowAction), + ActionArg: UUID, + } + starttime := now.UTC().Format(vdiff.TimestampFormat) + + testCases := []struct { + id string + res *sqltypes.Result + report string + }{{ + id: "1", + res: sqltypes.MakeTestResult(fields, + "started||t1|"+UUID+"|started|300|"+starttime+"|30||0|"+ + `{"TableName": "t1", "MatchingRows": 30, "ProcessedRows": 30, "MismatchedRows": 0, "ExtraRowsSource": 0, `+ + `"ExtraRowsTarget": 0}`), + report: fmt.Sprintf(` +VDiff Summary for targetks.vdiffTest (%s) +State: started +RowsCompared: 30 +HasMismatch: false +StartedAt: %s +Progress: 10.00%%, ETA: %s + +Table t1: + State: started + ProcessedRows: 30 + MatchingRows: 30 + +Use "--format=json" for more detailed output. + +`, UUID, starttime, starttime), + }} + + for _, tc := range testCases { + t.Run(tc.id, func(t *testing.T) { + res := &tabletmanagerdatapb.VDiffResponse{ + Id: 1, + Output: sqltypes.ResultToProto3(tc.res), + } + env.tmc.setVDResults(env.tablets[200].tablet, req, res) + req := &vtctldatapb.VDiffShowRequest{ + TargetKeyspace: env.targetKeyspace, + Workflow: env.workflow, + Arg: UUID, + } + + resp, err := env.ws.VDiffShow(context.Background(), req) + require.NoError(t, err) + vds, err := displayShowSingleSummary(env.out, "text", env.targetKeyspace, env.workflow, UUID, resp, true) + require.NoError(t, err) + require.Equal(t, vdiff.StartedState, vds) + + require.Equal(t, tc.report, env.getOutput()) + env.resetOutput() + }) + } +} + func TestGetStructNames(t *testing.T) { type s struct { A string diff --git a/go/cmd/vtctldclient/main.go b/go/cmd/vtctldclient/main.go index a9add98f822..4f31204ca8c 100644 --- a/go/cmd/vtctldclient/main.go +++ b/go/cmd/vtctldclient/main.go @@ -29,6 +29,8 @@ import ( "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/vtctl/grpcclientcommon" "vitess.io/vitess/go/vt/vtctl/vtctlclient" + "vitess.io/vitess/go/vt/vttablet/grpctmclient" + "vitess.io/vitess/go/vt/vttablet/tmclient" _flag "vitess.io/vitess/go/internal/flag" ) @@ -44,6 +46,8 @@ func main() { grpcclient.RegisterFlags(command.Root.PersistentFlags()) grpccommon.RegisterFlags(command.Root.PersistentFlags()) grpcclientcommon.RegisterFlags(command.Root.PersistentFlags()) + grpctmclient.RegisterFlags(command.Root.PersistentFlags()) + tmclient.RegisterFlags(command.Root.PersistentFlags()) servenv.RegisterMySQLServerFlags(command.Root.PersistentFlags()) vtctlclient.RegisterFlags(command.Root.PersistentFlags()) acl.RegisterFlags(command.Root.PersistentFlags()) diff --git a/go/cmd/vtctldclient/plugin_grpctmclient.go b/go/cmd/vtctldclient/plugin_grpctmclient.go new file mode 100644 index 00000000000..890562ddc1a --- /dev/null +++ b/go/cmd/vtctldclient/plugin_grpctmclient.go @@ -0,0 +1,28 @@ +/* +Copyright 2025 The Vitess Authors. + +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 + + http://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 main + +// Imports and registers the gRPC tabletmanager client. +// This is needed when --server=internal as the vtctldclient +// binary will then not only need to talk to the topo server +// directly but it will also need to talk to tablets directly +// via tmclient. + +import ( + _ "vitess.io/vitess/go/vt/vttablet/grpctmclient" + _ "vitess.io/vitess/go/vt/vttablet/tmclient" +) diff --git a/go/flags/endtoend/mysqlctl.txt b/go/flags/endtoend/mysqlctl.txt index 2b179496fff..f803b393a76 100644 --- a/go/flags/endtoend/mysqlctl.txt +++ b/go/flags/endtoend/mysqlctl.txt @@ -71,7 +71,7 @@ Flags: --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) --mysql_port int MySQL port. (default 3306) - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --mysql_socket string Path to the mysqld socket file. --mysqlctl_client_protocol string the protocol to use to talk to the mysqlctl server (default "grpc") --mysqlctl_mycnf_template string template file to use for generating the my.cnf file during server init diff --git a/go/flags/endtoend/mysqlctld.txt b/go/flags/endtoend/mysqlctld.txt index 594329ce073..22c5f37d63f 100644 --- a/go/flags/endtoend/mysqlctld.txt +++ b/go/flags/endtoend/mysqlctld.txt @@ -99,7 +99,7 @@ Flags: --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) --mysql_port int MySQL port (default 3306) - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --mysql_socket string Path to the mysqld socket file --mysqlctl_mycnf_template string template file to use for generating the my.cnf file during server init --mysqlctl_socket string socket file to use for remote mysqlctl actions (empty for local actions) diff --git a/go/flags/endtoend/vtbackup.txt b/go/flags/endtoend/vtbackup.txt index 7bda9048211..7941ce161ff 100644 --- a/go/flags/endtoend/vtbackup.txt +++ b/go/flags/endtoend/vtbackup.txt @@ -184,7 +184,7 @@ Flags: --mysql-shell-speedup-restore speed up restore by disabling redo logging and double write buffer during the restore process --mysql-shutdown-timeout duration how long to wait for mysqld shutdown (default 5m0s) --mysql_port int mysql port (default 3306) - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --mysql_socket string path to the mysql socket --mysql_timeout duration how long to wait for mysqld startup (default 5m0s) --opentsdb_uri string URI of opentsdb /api/put method diff --git a/go/flags/endtoend/vtbench.txt b/go/flags/endtoend/vtbench.txt index 260451f6b03..7b0d72af429 100644 --- a/go/flags/endtoend/vtbench.txt +++ b/go/flags/endtoend/vtbench.txt @@ -69,7 +69,7 @@ Flags: --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) --logtostderr log to standard error instead of files - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --port int VTGate port --pprof strings enable profiling --pprof-http enable pprof http endpoints diff --git a/go/flags/endtoend/vtclient.txt b/go/flags/endtoend/vtclient.txt index 57ddf892ac8..6c0a87d6551 100644 --- a/go/flags/endtoend/vtclient.txt +++ b/go/flags/endtoend/vtclient.txt @@ -35,7 +35,7 @@ Flags: --logtostderr log to standard error instead of files --max_sequence_id int max sequence ID. --min_sequence_id int min sequence ID to generate. When max_sequence_id > min_sequence_id, for each query, a number is generated in [min_sequence_id, max_sequence_id) and attached to the end of the bind variables. - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --parallel int DMLs only: Number of threads executing the same query in parallel. Useful for simple load testing. (default 1) --pprof strings enable profiling --pprof-http enable pprof http endpoints diff --git a/go/flags/endtoend/vtcombo.txt b/go/flags/endtoend/vtcombo.txt index 052c19ecaae..561f6048ce6 100644 --- a/go/flags/endtoend/vtcombo.txt +++ b/go/flags/endtoend/vtcombo.txt @@ -102,13 +102,16 @@ Flags: --ddl_strategy string Set default strategy for DDL statements. Override with @@ddl_strategy session variable (default "direct") --default_tablet_type topodatapb.TabletType The default tablet type to set for queries, when one is not explicitly selected. (default PRIMARY) --degraded_threshold duration replication lag after which a replica is considered degraded (default 30s) + --disk-write-dir string if provided, tablet will attempt to write a file to this directory to check if the disk is stalled + --disk-write-interval duration how often to write to the disk to check whether it is stalled (default 5s) + --disk-write-timeout duration if writes exceed this duration, the disk is considered stalled (default 30s) --emit_stats If set, emit stats to push-based monitoring and stats backends --enable-consolidator Synonym to -enable_consolidator (default true) --enable-consolidator-replicas Synonym to -enable_consolidator_replicas --enable-partial-keyspace-migration (Experimental) Follow shard routing rules: enable only while migrating a keyspace shard by shard. See documentation on Partial MoveTables for more. (default false) --enable-per-workload-table-metrics If true, query counts and query error metrics include a label that identifies the workload --enable-tx-throttler Synonym to -enable_tx_throttler - --enable-views Enable views support in vtgate. + --enable-views Enable views support in vtgate. (default true) --enable_buffer Enable buffering (stalling) of primary traffic during failovers. --enable_buffer_dry_run Detect and log failover events, but do not actually buffer requests. --enable_consolidator This option enables the query consolidator. (default true) @@ -242,7 +245,7 @@ Flags: --mysql_server_ssl_key string Path to ssl key for mysql server plugin SSL --mysql_server_ssl_server_ca string path to server CA in PEM format, which will be combine with server cert, return full certificate chain to clients --mysql_server_tls_min_version string Configures the minimal TLS version negotiated when SSL is enabled. Defaults to TLSv1.2. Options: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3. - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --mysql_server_write_timeout duration connection write timeout --mysql_slow_connect_warn_threshold duration Warn if it takes more than the given threshold for a mysql connection to establish --mysql_tcp_version string Select tcp, tcp4, or tcp6 to control the socket type. (default "tcp") @@ -269,6 +272,7 @@ Flags: --querylog-buffer-size int Maximum number of buffered query logs before throttling log output (default 10) --querylog-filter-tag string string that must be present in the query for it to be logged; if using a value as the tag, you need to disable query normalization --querylog-format string format for query logs ("text" or "json") (default "text") + --querylog-mode string Mode for logging queries. "error" will only log queries that return an error. Otherwise all queries will be logged. (default "all") --querylog-row-threshold uint Number of rows a query has to return or affect before being logged; not useful for streaming queries. 0 means all queries will be logged. --querylog-sample-rate float Sample rate for logging queries. Value must be between 0.0 (no logging) and 1.0 (all queries) --queryserver-config-acl-exempt-acl string an acl that exempt from table acl checking (this acl is free to access any vitess tables). diff --git a/go/flags/endtoend/vtctld.txt b/go/flags/endtoend/vtctld.txt index c84c5fadf5f..764c07a9d69 100644 --- a/go/flags/endtoend/vtctld.txt +++ b/go/flags/endtoend/vtctld.txt @@ -98,7 +98,7 @@ Flags: --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --opentsdb_uri string URI of opentsdb /api/put method diff --git a/go/flags/endtoend/vtctldclient.txt b/go/flags/endtoend/vtctldclient.txt index 5ff2a7b21da..0e0c91fbf7d 100644 --- a/go/flags/endtoend/vtctldclient.txt +++ b/go/flags/endtoend/vtctldclient.txt @@ -1,4 +1,4 @@ -Executes a cluster management command on the remote vtctld server. +Executes a cluster management command on the remote vtctld server or alternatively as a standalone binary using --server=internal. If there are no running vtctld servers -- for example when bootstrapping a new Vitess cluster -- you can specify a --server value of 'internal'. When doing so, you would use the --topo* flags so that the client can @@ -21,6 +21,7 @@ Available Commands: ChangeTabletTags Changes the tablet tags for the specified tablet, if possible. ChangeTabletType Changes the db type for the specified tablet, if possible. CheckThrottler Issue a throttler check on the given tablet. + CopySchemaShard Copies the schema from a source shard's primary (or a specific tablet) to a destination shard. The schema is applied directly on the primary of the destination shard, and it is propagated to the replicas through binlogs. CreateKeyspace Creates the specified keyspace in the topology. CreateShard Creates the specified shard in the topology. DeleteCellInfo Deletes the CellInfo for the provided cell. @@ -104,52 +105,63 @@ Available Commands: VDiff Perform commands related to diffing tables involved in a VReplication workflow between the source and target. Validate Validates that all nodes reachable from the global replication graph, as well as all tablets in discoverable cells, are consistent. ValidateKeyspace Validates that all nodes reachable from the specified keyspace are consistent. - ValidateSchemaKeyspace Validates that the schema on the primary tablet for shard 0 matches the schema on all other tablets in the keyspace. + ValidatePermissionsKeyspace Validates that the permissions on the primary of the first shard match those of all of the other tablets in the keyspace. + ValidatePermissionsShard Validates that the permissions on the primary match all of the replicas. + ValidateSchemaKeyspace Validates that the schema on the primary tablet for the first shard matches the schema on all other tablets in the keyspace. + ValidateSchemaShard Validates that the schema on the primary tablet for the specified shard matches the schema on all other tablets in that shard. ValidateShard Validates that all nodes reachable from the specified shard are consistent. - ValidateVersionKeyspace Validates that the version on the primary tablet of shard 0 matches all of the other tablets in the keyspace. + ValidateVersionKeyspace Validates that the version on the primary tablet of the first shard matches all of the other tablets in the keyspace. ValidateVersionShard Validates that the version on the primary matches all of the replicas. Workflow Administer VReplication workflows (Reshard, MoveTables, etc) in the given keyspace. + WriteTopologyPath Copies a local file to the topology server at the given path. completion Generate the autocompletion script for the specified shell help Help about any command Flags: - --action_timeout duration timeout to use for the command (default 1h0m0s) - --alsologtostderr log to standard error as well as files - --compact use compact format for otherwise verbose outputs - --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. - --grpc_compression string Which protocol to use for compressing gRPC. Default: nothing. Supported: snappy - --grpc_enable_tracing Enable gRPC tracing. - --grpc_initial_conn_window_size int gRPC initial connection window size - --grpc_initial_window_size int gRPC initial window size - --grpc_keepalive_time duration After a duration of this time, if the client doesn't see any activity, it pings the server to see if the transport is still alive. (default 10s) - --grpc_keepalive_timeout duration After having pinged for keepalive check, the client waits for a duration of Timeout and if no activity is seen even after that the connection is closed. (default 10s) - --grpc_max_message_size int Maximum allowed RPC message size. Larger messages will be rejected by gRPC with the error 'exceeding the max size'. (default 16777216) - --grpc_prometheus Enable gRPC monitoring with Prometheus. - -h, --help help for vtctldclient - --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) - --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) - --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace - --log_dir string If non-empty, write log files in this directory - --log_link string If non-empty, add symbolic links in this directory to the log files - --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) - --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. - --logtostderr log to standard error instead of files - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") - --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) - --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) - --server string server to use for the connection (required) - --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) - --topo-global-root string the path of the global topology data in the global topology server (default "/vitess/global") - --topo-global-server-address strings the address of the global topology server(s) (default [localhost:2379]) - --topo-implementation string the topology implementation to use (default "etcd2") - -v, --v Level log level for V logs - --version version for vtctldclient - --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging - --vtctl_client_protocol string Protocol to use to talk to the vtctl server. (default "grpc") - --vtctld_grpc_ca string the server ca to use to validate servers when connecting - --vtctld_grpc_cert string the cert to use to connect - --vtctld_grpc_crl string the server crl to use to validate server certificates when connecting - --vtctld_grpc_key string the key to use to connect - --vtctld_grpc_server_name string the server name to use to validate server certificate + --action_timeout duration timeout to use for the command (default 1h0m0s) + --alsologtostderr log to standard error as well as files + --compact use compact format for otherwise verbose outputs + --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. + --grpc_compression string Which protocol to use for compressing gRPC. Default: nothing. Supported: snappy + --grpc_enable_tracing Enable gRPC tracing. + --grpc_initial_conn_window_size int gRPC initial connection window size + --grpc_initial_window_size int gRPC initial window size + --grpc_keepalive_time duration After a duration of this time, if the client doesn't see any activity, it pings the server to see if the transport is still alive. (default 10s) + --grpc_keepalive_timeout duration After having pinged for keepalive check, the client waits for a duration of Timeout and if no activity is seen even after that the connection is closed. (default 10s) + --grpc_max_message_size int Maximum allowed RPC message size. Larger messages will be rejected by gRPC with the error 'exceeding the max size'. (default 16777216) + --grpc_prometheus Enable gRPC monitoring with Prometheus. + -h, --help help for vtctldclient + --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) + --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace + --log_dir string If non-empty, write log files in this directory + --log_link string If non-empty, add symbolic links in this directory to the log files + --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. + --logtostderr log to standard error instead of files + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") + --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) + --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) + --server string server to use for the connection (required) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) + --tablet_manager_grpc_ca string the server ca to use to validate servers when connecting + --tablet_manager_grpc_cert string the cert to use to connect + --tablet_manager_grpc_concurrency int concurrency to use to talk to a vttablet server for performance-sensitive RPCs (like ExecuteFetchAs{Dba,App}, CheckThrottler and FullStatus) (default 8) + --tablet_manager_grpc_crl string the server crl to use to validate server certificates when connecting + --tablet_manager_grpc_key string the key to use to connect + --tablet_manager_grpc_server_name string the server name to use to validate server certificate + --tablet_manager_protocol string Protocol to use to make tabletmanager RPCs to vttablets. (default "grpc") + --topo-global-root string the path of the global topology data in the global topology server (default "/vitess/global") + --topo-global-server-address strings the address of the global topology server(s) (default [localhost:2379]) + --topo-implementation string the topology implementation to use (default "etcd2") + -v, --v Level log level for V logs + --version version for vtctldclient + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging + --vtctl_client_protocol string Protocol to use to talk to the vtctl server. (default "grpc") + --vtctld_grpc_ca string the server ca to use to validate servers when connecting + --vtctld_grpc_cert string the cert to use to connect + --vtctld_grpc_crl string the server crl to use to validate server certificates when connecting + --vtctld_grpc_key string the key to use to connect + --vtctld_grpc_server_name string the server name to use to validate server certificate Use "vtctldclient [command] --help" for more information about a command. diff --git a/go/flags/endtoend/vtexplain.txt b/go/flags/endtoend/vtexplain.txt index fdd289e63c7..90013fe1b98 100644 --- a/go/flags/endtoend/vtexplain.txt +++ b/go/flags/endtoend/vtexplain.txt @@ -59,7 +59,7 @@ Flags: --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) --logtostderr log to standard error instead of files - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --normalize Whether to enable vtgate normalization --output-mode string Output in human-friendly text or json (default "text") --planner-version string Sets the default planner to use. Valid values are: Gen4, Gen4Greedy, Gen4Left2Right diff --git a/go/flags/endtoend/vtgate.txt b/go/flags/endtoend/vtgate.txt index fde17f89c49..1b3238bca87 100644 --- a/go/flags/endtoend/vtgate.txt +++ b/go/flags/endtoend/vtgate.txt @@ -57,7 +57,7 @@ Flags: --emit_stats If set, emit stats to push-based monitoring and stats backends --enable-balancer Enable the tablet balancer to evenly spread query load for a given tablet type --enable-partial-keyspace-migration (Experimental) Follow shard routing rules: enable only while migrating a keyspace shard by shard. See documentation on Partial MoveTables for more. (default false) - --enable-views Enable views support in vtgate. + --enable-views Enable views support in vtgate. (default true) --enable_buffer Enable buffering (stalling) of primary traffic during failovers. --enable_buffer_dry_run Detect and log failover events, but do not actually buffer requests. --enable_direct_ddl Allow users to submit direct DDL statements (default true) @@ -157,7 +157,7 @@ Flags: --mysql_server_ssl_key string Path to ssl key for mysql server plugin SSL --mysql_server_ssl_server_ca string path to server CA in PEM format, which will be combine with server cert, return full certificate chain to clients --mysql_server_tls_min_version string Configures the minimal TLS version negotiated when SSL is enabled. Defaults to TLSv1.2. Options: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3. - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --mysql_server_write_timeout duration connection write timeout --mysql_slow_connect_warn_threshold duration Warn if it takes more than the given threshold for a mysql connection to establish --mysql_tcp_version string Select tcp, tcp4, or tcp6 to control the socket type. (default "tcp") @@ -177,6 +177,7 @@ Flags: --querylog-buffer-size int Maximum number of buffered query logs before throttling log output (default 10) --querylog-filter-tag string string that must be present in the query for it to be logged; if using a value as the tag, you need to disable query normalization --querylog-format string format for query logs ("text" or "json") (default "text") + --querylog-mode string Mode for logging queries. "error" will only log queries that return an error. Otherwise all queries will be logged. (default "all") --querylog-row-threshold uint Number of rows a query has to return or affect before being logged; not useful for streaming queries. 0 means all queries will be logged. --querylog-sample-rate float Sample rate for logging queries. Value must be between 0.0 (no logging) and 1.0 (all queries) --redact-debug-ui-queries redact full queries and bind variables from debug UI diff --git a/go/flags/endtoend/vtgateclienttest.txt b/go/flags/endtoend/vtgateclienttest.txt index 8a2f18b6b5a..d5b45e57b1e 100644 --- a/go/flags/endtoend/vtgateclienttest.txt +++ b/go/flags/endtoend/vtgateclienttest.txt @@ -53,7 +53,7 @@ Flags: --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. diff --git a/go/flags/endtoend/vtorc.txt b/go/flags/endtoend/vtorc.txt index c2799a72dc1..ca8083709e5 100644 --- a/go/flags/endtoend/vtorc.txt +++ b/go/flags/endtoend/vtorc.txt @@ -33,6 +33,7 @@ Flags: --config-type string Config file type (omit to infer config type from file extension). --consul_auth_static_file string JSON File to read the topos/tokens from. --emit_stats If set, emit stats to push-based monitoring and stats backends + --enable-primary-disk-stalled-recovery Whether VTOrc should detect a stalled disk on the primary and failover --grpc-dial-concurrency-limit int Maximum concurrency of grpc dial operations. This should be less than the golang max thread limit of 10000. (default 1024) --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. --grpc_compression string Which protocol to use for compressing gRPC. Default: nothing. Supported: snappy diff --git a/go/flags/endtoend/vttablet.txt b/go/flags/endtoend/vttablet.txt index e2b0c30db7f..398d10afd7c 100644 --- a/go/flags/endtoend/vttablet.txt +++ b/go/flags/endtoend/vttablet.txt @@ -133,6 +133,9 @@ Flags: --dba_idle_timeout duration Idle timeout for dba connections (default 1m0s) --dba_pool_size int Size of the connection pool for dba connections (default 20) --degraded_threshold duration replication lag after which a replica is considered degraded (default 30s) + --disk-write-dir string if provided, tablet will attempt to write a file to this directory to check if the disk is stalled + --disk-write-interval duration how often to write to the disk to check whether it is stalled (default 5s) + --disk-write-timeout duration if writes exceed this duration, the disk is considered stalled (default 30s) --emit_stats If set, emit stats to push-based monitoring and stats backends --enable-consolidator Synonym to -enable_consolidator (default true) --enable-consolidator-replicas Synonym to -enable_consolidator_replicas @@ -244,7 +247,7 @@ Flags: --mysql-shell-should-drain decide if we should drain while taking a backup or continue to serving traffic --mysql-shell-speedup-restore speed up restore by disabling redo logging and double write buffer during the restore process --mysql-shutdown-timeout duration timeout to use when MySQL is being shut down. (default 5m0s) - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --mysqlctl_mycnf_template string template file to use for generating the my.cnf file during server init --mysqlctl_socket string socket file to use for remote mysqlctl actions (empty for local actions) --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) @@ -261,6 +264,7 @@ Flags: --query-log-stream-handler string URL handler for streaming queries log (default "/debug/querylog") --querylog-filter-tag string string that must be present in the query for it to be logged; if using a value as the tag, you need to disable query normalization --querylog-format string format for query logs ("text" or "json") (default "text") + --querylog-mode string Mode for logging queries. "error" will only log queries that return an error. Otherwise all queries will be logged. (default "all") --querylog-row-threshold uint Number of rows a query has to return or affect before being logged; not useful for streaming queries. 0 means all queries will be logged. --querylog-sample-rate float Sample rate for logging queries. Value must be between 0.0 (no logging) and 1.0 (all queries) --queryserver-config-acl-exempt-acl string an acl that exempt from table acl checking (this acl is free to access any vitess tables). diff --git a/go/flags/endtoend/vttestserver.txt b/go/flags/endtoend/vttestserver.txt index 042ffd37643..385b7194652 100644 --- a/go/flags/endtoend/vttestserver.txt +++ b/go/flags/endtoend/vttestserver.txt @@ -96,7 +96,7 @@ Flags: --mysql-shell-speedup-restore speed up restore by disabling redo logging and double write buffer during the restore process --mysql_bind_host string which host to bind vtgate mysql listener to (default "localhost") --mysql_only If this flag is set only mysql is initialized. The rest of the vitess components are not started. Also, the output specifies the mysql unix socket instead of the vtgate port. - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --mysqlctl_mycnf_template string template file to use for generating the my.cnf file during server init --mysqlctl_socket string socket file to use for remote mysqlctl actions (empty for local actions) --no_scatter when set to true, the planner will fail instead of producing a plan that includes scatter queries diff --git a/go/mysql/binlog_dump.go b/go/mysql/binlog_dump.go index d6768056974..de91484fc64 100644 --- a/go/mysql/binlog_dump.go +++ b/go/mysql/binlog_dump.go @@ -72,21 +72,19 @@ func (c *Conn) parseComBinlogDumpGTID(data []byte) (logFile string, logPos uint6 return logFile, logPos, position, readPacketErr } - if flags2&BinlogDumpNonBlock != 0 { - return logFile, logPos, position, io.EOF + dataSize, pos, ok := readUint32(data, pos) + if !ok { + return logFile, logPos, position, readPacketErr } - if flags2&BinlogThroughGTID != 0 { - dataSize, pos, ok := readUint32(data, pos) - if !ok { - return logFile, logPos, position, readPacketErr - } - if gtid := string(data[pos : pos+int(dataSize)]); gtid != "" { - position, err = replication.DecodePosition(gtid) - if err != nil { - return logFile, logPos, position, err - } + if gtid := string(data[pos : pos+int(dataSize)]); gtid != "" { + position, err = replication.DecodePosition(gtid) + if err != nil { + return logFile, logPos, position, err } } + if flags2&BinlogDumpNonBlock != 0 { + return logFile, logPos, position, io.EOF + } return logFile, logPos, position, nil } diff --git a/go/mysql/capabilities/capability.go b/go/mysql/capabilities/capability.go index 4015059e686..eac25585089 100644 --- a/go/mysql/capabilities/capability.go +++ b/go/mysql/capabilities/capability.go @@ -31,25 +31,26 @@ var ( type FlavorCapability int const ( - NoneFlavorCapability FlavorCapability = iota // default placeholder - FastDropTableFlavorCapability // supported in MySQL 8.0.23 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-23.html - TransactionalGtidExecutedFlavorCapability // - InstantDDLFlavorCapability // ALGORITHM=INSTANT general support - InstantAddLastColumnFlavorCapability // - InstantAddDropVirtualColumnFlavorCapability // - InstantAddDropColumnFlavorCapability // Adding/dropping column in any position/ordinal. - InstantChangeColumnDefaultFlavorCapability // - InstantExpandEnumCapability // - InstantChangeColumnVisibilityCapability // - MySQLUpgradeInServerFlavorCapability // - DynamicRedoLogCapacityFlavorCapability // supported in MySQL 8.0.30 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-30.html - DisableRedoLogFlavorCapability // supported in MySQL 8.0.21 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-21.html - CheckConstraintsCapability // supported in MySQL 8.0.16 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-16.html - PerformanceSchemaDataLocksTableCapability // supported in MySQL 8.0.1 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-1.html - InstantDDLXtrabackupCapability // Supported in 8.0.32 and above, solving a MySQL-vs-Xtrabackup bug starting 8.0.29 - ReplicaTerminologyCapability // Supported in 8.0.26 and above, using SHOW REPLICA STATUS and all variations. - BinaryLogStatus // Supported in 8.2.0 and above, uses SHOW BINARY LOG STATUS - RestrictFKOnNonStandardKey // Supported in 8.4.0 and above, restricts usage of non-standard indexes for foreign keys. + NoneFlavorCapability FlavorCapability = iota // default placeholder + FastDropTableFlavorCapability // supported in MySQL 8.0.23 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-23.html + TransactionalGtidExecutedFlavorCapability // + InstantDDLFlavorCapability // ALGORITHM=INSTANT general support + InstantAddLastColumnFlavorCapability // + InstantAddDropVirtualColumnFlavorCapability // + InstantAddDropColumnFlavorCapability // Adding/dropping column in any position/ordinal. + InstantChangeColumnDefaultFlavorCapability // + InstantExpandEnumCapability // + InstantChangeColumnVisibilityCapability // + MySQLUpgradeInServerFlavorCapability // + DynamicRedoLogCapacityFlavorCapability // supported in MySQL 8.0.30 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-30.html + DisableRedoLogFlavorCapability // supported in MySQL 8.0.21 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-21.html + CheckConstraintsCapability // supported in MySQL 8.0.16 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-16.html + PerformanceSchemaDataLocksTableCapability // supported in MySQL 8.0.1 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-1.html + PerformanceSchemaMetadataLocksTableCapability // supported in MySQL 8.0.2 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-2.html + InstantDDLXtrabackupCapability // Supported in 8.0.32 and above, solving a MySQL-vs-Xtrabackup bug starting 8.0.29 + ReplicaTerminologyCapability // Supported in 8.0.26 and above, using SHOW REPLICA STATUS and all variations. + BinaryLogStatus // Supported in 8.2.0 and above, uses SHOW BINARY LOG STATUS + RestrictFKOnNonStandardKey // Supported in 8.4.0 and above, restricts usage of non-standard indexes for foreign keys. ) type CapableOf func(capability FlavorCapability) (bool, error) @@ -97,6 +98,8 @@ func MySQLVersionHasCapability(serverVersion string, capability FlavorCapability return atLeast(8, 0, 0) case PerformanceSchemaDataLocksTableCapability: return atLeast(8, 0, 1) + case PerformanceSchemaMetadataLocksTableCapability: + return atLeast(8, 0, 2) case MySQLUpgradeInServerFlavorCapability: return atLeast(8, 0, 16) case CheckConstraintsCapability: diff --git a/go/mysql/capabilities/capability_test.go b/go/mysql/capabilities/capability_test.go index aeb18bed22e..cf5e693840e 100644 --- a/go/mysql/capabilities/capability_test.go +++ b/go/mysql/capabilities/capability_test.go @@ -218,6 +218,25 @@ func TestMySQLVersionCapableOf(t *testing.T) { version: "8.0.20", capability: PerformanceSchemaDataLocksTableCapability, isCapable: true, + }, { + version: "5.7.38", + capability: PerformanceSchemaMetadataLocksTableCapability, + isCapable: false, + }, + { + version: "8.0", + capability: PerformanceSchemaMetadataLocksTableCapability, + isCapable: false, + }, + { + version: "8.0.1", + capability: PerformanceSchemaMetadataLocksTableCapability, + isCapable: false, + }, + { + version: "8.0.2", + capability: PerformanceSchemaMetadataLocksTableCapability, + isCapable: true, }, { version: "8.0.29", diff --git a/go/mysql/collations/colldata/cached_size.go b/go/mysql/collations/colldata/cached_size.go index b348baaaed8..190e1731651 100644 --- a/go/mysql/collations/colldata/cached_size.go +++ b/go/mysql/collations/colldata/cached_size.go @@ -19,6 +19,10 @@ package colldata import hack "vitess.io/vitess/go/hack" +type cachedObject interface { + CachedSize(alloc bool) int64 +} + func (cached *eightbitWildcard) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -59,6 +63,10 @@ func (cached *unicodeWildcard) CachedSize(alloc bool) int64 { if alloc { size += int64(48) } + // field charset vitess.io/vitess/go/mysql/collations/charset.Charset + if cc, ok := cached.charset.(cachedObject); ok { + size += cc.CachedSize(true) + } // field pattern []rune { size += hack.RuntimeAllocSize(int64(cap(cached.pattern)) * int64(4)) diff --git a/go/mysql/collations/integration/collations_test.go b/go/mysql/collations/integration/collations_test.go index 519f4560faf..c599eceaa2e 100644 --- a/go/mysql/collations/integration/collations_test.go +++ b/go/mysql/collations/integration/collations_test.go @@ -45,7 +45,7 @@ var collationEnv *collations.Environment func init() { // We require MySQL 8.0 collations for the comparisons in the tests - collationEnv = collations.NewEnvironment("8.0.30") + collationEnv = collations.NewEnvironment("8.0.40") } func getSQLQueries(t *testing.T, testfile string) []string { diff --git a/go/mysql/config/config.go b/go/mysql/config/config.go index 6070d0d6248..4f9a8b3a734 100644 --- a/go/mysql/config/config.go +++ b/go/mysql/config/config.go @@ -1,5 +1,5 @@ package config const DefaultSQLMode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" -const DefaultMySQLVersion = "8.0.30" +const DefaultMySQLVersion = "8.0.40" const LegacyMySQLVersion = "5.7.31" diff --git a/go/mysql/flavor_mysql.go b/go/mysql/flavor_mysql.go index e405dc401ec..c5424259973 100644 --- a/go/mysql/flavor_mysql.go +++ b/go/mysql/flavor_mysql.go @@ -219,7 +219,14 @@ func (mysqlFlavor) sendBinlogDumpCommand(c *Conn, serverID uint32, binlogFilenam // Build the command. sidBlock := gtidSet.SIDBlock() - return c.WriteComBinlogDumpGTID(serverID, binlogFilename, 4, 0, sidBlock) + var flags2 uint16 + if binlogFilename != "" { + flags2 |= BinlogThroughPosition + } + if len(sidBlock) > 0 { + flags2 |= BinlogThroughGTID + } + return c.WriteComBinlogDumpGTID(serverID, binlogFilename, 4, flags2, sidBlock) } // setReplicationPositionCommands is part of the Flavor interface. diff --git a/go/mysql/flavor_test.go b/go/mysql/flavor_test.go index 3d584b8293b..219b9803933 100644 --- a/go/mysql/flavor_test.go +++ b/go/mysql/flavor_test.go @@ -102,6 +102,15 @@ func TestServerVersionCapableOf(t *testing.T) { version: "8.0.20", capability: capabilities.PerformanceSchemaDataLocksTableCapability, isCapable: true, + }, { + version: "5.7.38", + capability: capabilities.PerformanceSchemaMetadataLocksTableCapability, + isCapable: false, + }, + { + version: "8.0.20", + capability: capabilities.PerformanceSchemaMetadataLocksTableCapability, + isCapable: true, }, { // Some ridiculous version diff --git a/go/mysql/replication/mysql56_gtid_set_test.go b/go/mysql/replication/mysql56_gtid_set_test.go index bc5d5a6d6ec..bf87a992d5d 100644 --- a/go/mysql/replication/mysql56_gtid_set_test.go +++ b/go/mysql/replication/mysql56_gtid_set_test.go @@ -854,3 +854,18 @@ func TestMysql56GTIDSet_RemoveUUID(t *testing.T) { }) } } + +func TestSIDs(t *testing.T) { + var set Mysql56GTIDSet // nil + sids := set.SIDs() + assert.NotNil(t, sids) + assert.Empty(t, sids) + + gtid := "8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1:4-24" + gtidSet, err := ParseMysql56GTIDSet(gtid) + require.NoError(t, err) + sids = gtidSet.SIDs() + assert.NotNil(t, sids) + require.Len(t, sids, 1) + assert.Equal(t, "8bc65cca-3fe4-11ed-bbfb-091034d48b3e", sids[0].String()) +} diff --git a/go/mysql/replication_test.go b/go/mysql/replication_test.go index 680cb9e68dc..ded22d838f6 100644 --- a/go/mysql/replication_test.go +++ b/go/mysql/replication_test.go @@ -90,7 +90,9 @@ func TestComBinlogDumpGTID(t *testing.T) { t.Run("WriteComBinlogDumpGTID", func(t *testing.T) { // Write ComBinlogDumpGTID packet, read it, compare. - err := cConn.WriteComBinlogDumpGTID(0x01020304, "moofarm", 0x05060708090a0b0c, 0x0d0e, []byte{0xfa, 0xfb}) + var flags uint16 = 0x0d0e + assert.Equal(t, flags, flags|BinlogThroughGTID) + err := cConn.WriteComBinlogDumpGTID(0x01020304, "moofarm", 0x05060708090a0b0c, flags, []byte{0xfa, 0xfb}) assert.NoError(t, err) data, err := sConn.ReadPacket() require.NoError(t, err, "sConn.ReadPacket - ComBinlogDumpGTID failed: %v", err) diff --git a/go/sqltypes/cached_size.go b/go/sqltypes/cached_size.go index 632c8249455..53bc407278d 100644 --- a/go/sqltypes/cached_size.go +++ b/go/sqltypes/cached_size.go @@ -37,6 +37,14 @@ func (cached *Result) CachedSize(alloc bool) int64 { // field Rows []vitess.io/vitess/go/sqltypes.Row { size += hack.RuntimeAllocSize(int64(cap(cached.Rows)) * int64(24)) + for _, elem := range cached.Rows { + { + size += hack.RuntimeAllocSize(int64(cap(elem)) * int64(32)) + for _, elem := range elem { + size += elem.CachedSize(false) + } + } + } } // field SessionStateChanges string size += hack.RuntimeAllocSize(int64(len(cached.SessionStateChanges))) diff --git a/go/sqltypes/value.go b/go/sqltypes/value.go index 7fb6fa80396..438b51a13ba 100644 --- a/go/sqltypes/value.go +++ b/go/sqltypes/value.go @@ -26,7 +26,6 @@ import ( "math/big" "strconv" "strings" - "time" "google.golang.org/protobuf/encoding/protowire" @@ -436,100 +435,6 @@ func (v Value) String() string { return fmt.Sprintf("%v(%s)", Type(v.typ), v.val) } -// ToTime returns the value as a time.Time in UTC. -// NULL values are returned as zero time. -func (v Value) ToTime() (time.Time, error) { - return v.ToTimeInLocation(time.UTC) -} - -// ToTimeInLocation returns the value as a time.Time in the provided location. -// NULL values are returned as zero time. -func (v Value) ToTimeInLocation(loc *time.Location) (time.Time, error) { - if v.Type() == Null { - return time.Time{}, nil - } - switch v.Type() { - case Datetime, Timestamp: - return datetimeToNative(v, loc) - case Date: - return dateToNative(v, loc) - default: - return time.Time{}, ErrIncompatibleTypeCast - } -} - -// ErrInvalidTime is returned when we fail to parse a datetime -// string from MySQL. This should never happen unless things are -// seriously messed up. -var ErrInvalidTime = errors.New("invalid MySQL time string") - -var isoTimeFormat = "2006-01-02 15:04:05.999999" -var isoNullTime = "0000-00-00 00:00:00.000000" -var isoTimeLength = len(isoTimeFormat) - -// parseISOTime pases a time string in MySQL's textual datetime format. -// This is very similar to ISO8601, with some differences: -// -// - There is no T separator between the date and time sections; -// a space is used instead. -// - There is never a timezone section in the string, as these datetimes -// are not timezone-aware. There isn't a Z value for UTC times for -// the same reason. -// -// Note that this function can handle both DATE (which should _always_ have -// a length of 10) and DATETIME strings (which have a variable length, 18+ -// depending on the number of decimal sub-second places). -// -// Also note that this function handles the case where MySQL returns a NULL -// time (with a string where all sections are zeroes) by returning a zeroed -// out time.Time object. NULL time strings are not considered a parsing error. -// -// See: isoTimeFormat -func parseISOTime(tstr string, loc *time.Location, minLen, maxLen int) (t time.Time, err error) { - tlen := len(tstr) - if tlen < minLen || tlen > maxLen { - err = ErrInvalidTime - return - } - - if tstr == isoNullTime[:tlen] { - // This is what MySQL would send when the date is NULL, - // so return an empty time.Time instead. - // This is not a parsing error - return - } - - if loc == nil { - loc = time.UTC - } - - // Since the time format returned from MySQL never has a Timezone - // section, ParseInLocation will initialize the time.Time struct - // with the default `loc` we're passing here. - return time.ParseInLocation(isoTimeFormat[:tlen], tstr, loc) -} - -// datetimeToNative converts a Datetime Value into a time.Time -func datetimeToNative(v Value, loc *time.Location) (time.Time, error) { - // Valid format string offsets for a DATETIME - // |DATETIME |19+ - // |------------------|------| - // "2006-01-02 15:04:05.999999" - return parseISOTime(v.ToString(), loc, 19, isoTimeLength) -} - -// dateToNative converts a Date Value into a time.Time. -// Note that there's no specific type in the Go stdlib to represent -// dates without time components, so the returned Time will have -// their hours/mins/seconds zeroed out. -func dateToNative(v Value, loc *time.Location) (time.Time, error) { - // Valid format string offsets for a DATE - // |DATE |10 - // |---------| - // "2006-01-02 00:00:00.000000" - return parseISOTime(v.ToString(), loc, 10, 10) -} - // EncodeSQL encodes the value into an SQL statement. Can be binary. func (v Value) EncodeSQL(b BinWriter) { switch { diff --git a/go/sqltypes/value_test.go b/go/sqltypes/value_test.go index 99f8566472e..f6360c8b5c4 100644 --- a/go/sqltypes/value_test.go +++ b/go/sqltypes/value_test.go @@ -18,7 +18,6 @@ package sqltypes import ( "math" - "reflect" "strings" "testing" "time" @@ -623,145 +622,6 @@ func DateValue(str string) Value { return TestValue(Date, str) } -func TestDatetimeToNative(t *testing.T) { - tcases := []struct { - val Value - loc *time.Location - out time.Time - err bool - }{{ - val: DatetimeValue("1899-08-24 17:20:00"), - out: time.Date(1899, 8, 24, 17, 20, 0, 0, time.UTC), - }, { - val: DatetimeValue("1952-03-11 01:02:03"), - loc: time.Local, - out: time.Date(1952, 3, 11, 1, 2, 3, 0, time.Local), - }, { - val: DatetimeValue("1952-03-11 01:02:03"), - loc: randomLocation, - out: time.Date(1952, 3, 11, 1, 2, 3, 0, randomLocation), - }, { - val: DatetimeValue("1952-03-11 01:02:03"), - loc: time.UTC, - out: time.Date(1952, 3, 11, 1, 2, 3, 0, time.UTC), - }, { - val: DatetimeValue("1899-08-24 17:20:00.000000"), - out: time.Date(1899, 8, 24, 17, 20, 0, 0, time.UTC), - }, { - val: DatetimeValue("1899-08-24 17:20:00.000001"), - out: time.Date(1899, 8, 24, 17, 20, 0, int(1*time.Microsecond), time.UTC), - }, { - val: DatetimeValue("1899-08-24 17:20:00.123456"), - out: time.Date(1899, 8, 24, 17, 20, 0, int(123456*time.Microsecond), time.UTC), - }, { - val: DatetimeValue("1899-08-24 17:20:00.222"), - out: time.Date(1899, 8, 24, 17, 20, 0, int(222*time.Millisecond), time.UTC), - }, { - val: DatetimeValue("1899-08-24 17:20:00.1234567"), - err: true, - }, { - val: DatetimeValue("1899-08-24 17:20:00.1"), - out: time.Date(1899, 8, 24, 17, 20, 0, int(100*time.Millisecond), time.UTC), - }, { - val: DatetimeValue("0000-00-00 00:00:00"), - out: time.Time{}, - }, { - val: DatetimeValue("0000-00-00 00:00:00.0"), - out: time.Time{}, - }, { - val: DatetimeValue("0000-00-00 00:00:00.000"), - out: time.Time{}, - }, { - val: DatetimeValue("0000-00-00 00:00:00.000000"), - out: time.Time{}, - }, { - val: DatetimeValue("0000-00-00 00:00:00.0000000"), - err: true, - }, { - val: DatetimeValue("1899-08-24T17:20:00.000000"), - err: true, - }, { - val: DatetimeValue("1899-02-31 17:20:00.000000"), - err: true, - }, { - val: DatetimeValue("1899-08-24 17:20:00."), - out: time.Date(1899, 8, 24, 17, 20, 0, 0, time.UTC), - }, { - val: DatetimeValue("0000-00-00 00:00:00.000001"), - err: true, - }, { - val: DatetimeValue("1899-08-24 17:20:00 +02:00"), - err: true, - }, { - val: DatetimeValue("1899-08-24"), - err: true, - }, { - val: DatetimeValue("This is not a valid timestamp"), - err: true, - }} - - for _, tcase := range tcases { - got, err := datetimeToNative(tcase.val, tcase.loc) - if tcase.err && err == nil { - t.Errorf("datetimeToNative(%v, %#v) succeeded; expected error", tcase.val, tcase.loc) - } - if !tcase.err && err != nil { - t.Errorf("datetimeToNative(%v, %#v) failed: %v", tcase.val, tcase.loc, err) - } - if !reflect.DeepEqual(got, tcase.out) { - t.Errorf("datetimeToNative(%v, %#v): %v, want %v", tcase.val, tcase.loc, got, tcase.out) - } - } -} - -func TestDateToNative(t *testing.T) { - tcases := []struct { - val Value - loc *time.Location - out time.Time - err bool - }{{ - val: DateValue("1899-08-24"), - out: time.Date(1899, 8, 24, 0, 0, 0, 0, time.UTC), - }, { - val: DateValue("1952-03-11"), - loc: time.Local, - out: time.Date(1952, 3, 11, 0, 0, 0, 0, time.Local), - }, { - val: DateValue("1952-03-11"), - loc: randomLocation, - out: time.Date(1952, 3, 11, 0, 0, 0, 0, randomLocation), - }, { - val: DateValue("0000-00-00"), - out: time.Time{}, - }, { - val: DateValue("1899-02-31"), - err: true, - }, { - val: DateValue("1899-08-24 17:20:00"), - err: true, - }, { - val: DateValue("0000-00-00 00:00:00"), - err: true, - }, { - val: DateValue("This is not a valid timestamp"), - err: true, - }} - - for _, tcase := range tcases { - got, err := dateToNative(tcase.val, tcase.loc) - if tcase.err && err == nil { - t.Errorf("dateToNative(%v, %#v) succeeded; expected error", tcase.val, tcase.loc) - } - if !tcase.err && err != nil { - t.Errorf("dateToNative(%v, %#v) failed: %v", tcase.val, tcase.loc, err) - } - if !reflect.DeepEqual(got, tcase.out) { - t.Errorf("dateToNative(%v, %#v): %v, want %v", tcase.val, tcase.loc, got, tcase.out) - } - } -} - func TestEncodeSQLStringBuilder(t *testing.T) { testcases := []struct { in Value diff --git a/go/streamlog/streamlog.go b/go/streamlog/streamlog.go index 40d33b840b4..00fc4dd4478 100644 --- a/go/streamlog/streamlog.go +++ b/go/streamlog/streamlog.go @@ -20,7 +20,7 @@ package streamlog import ( "fmt" "io" - rand "math/rand/v2" + "math/rand/v2" "net/http" "net/url" "os" @@ -47,40 +47,42 @@ var ( []string{"Log", "Subscriber"}) ) -var ( - redactDebugUIQueries bool - queryLogFilterTag string - queryLogRowThreshold uint64 - queryLogFormat = "text" - queryLogSampleRate float64 -) +const ( + // QueryLogFormatText is the format specifier for text querylog output + QueryLogFormatText = "text" -func GetRedactDebugUIQueries() bool { - return redactDebugUIQueries -} + // QueryLogFormatJSON is the format specifier for json querylog output + QueryLogFormatJSON = "json" -func SetRedactDebugUIQueries(newRedactDebugUIQueries bool) { - redactDebugUIQueries = newRedactDebugUIQueries -} + // QueryLogModeAll is the mode specifier for logging all queries + QueryLogModeAll = "all" -func SetQueryLogFilterTag(newQueryLogFilterTag string) { - queryLogFilterTag = newQueryLogFilterTag -} + // QueryLogModeError is the mode specifier for logging only queries that return an error + QueryLogModeError = "error" +) -func SetQueryLogRowThreshold(newQueryLogRowThreshold uint64) { - queryLogRowThreshold = newQueryLogRowThreshold +type QueryLogConfig struct { + RedactDebugUIQueries bool + FilterTag string + Format string + Mode string + RowThreshold uint64 + sampleRate float64 } -func SetQueryLogSampleRate(sampleRate float64) { - queryLogSampleRate = sampleRate +var queryLogConfigInstance = QueryLogConfig{ + Format: QueryLogFormatText, + Mode: QueryLogModeAll, } -func GetQueryLogFormat() string { - return queryLogFormat +func GetQueryLogConfig() QueryLogConfig { + return queryLogConfigInstance } -func SetQueryLogFormat(newQueryLogFormat string) { - queryLogFormat = newQueryLogFormat +func NewQueryLogConfigForTest() QueryLogConfig { + return QueryLogConfig{ + Format: QueryLogFormatText, + } } func init() { @@ -91,28 +93,23 @@ func init() { func registerStreamLogFlags(fs *pflag.FlagSet) { // RedactDebugUIQueries controls whether full queries and bind variables are suppressed from debug UIs. - fs.BoolVar(&redactDebugUIQueries, "redact-debug-ui-queries", redactDebugUIQueries, "redact full queries and bind variables from debug UI") + fs.BoolVar(&queryLogConfigInstance.RedactDebugUIQueries, "redact-debug-ui-queries", queryLogConfigInstance.RedactDebugUIQueries, "redact full queries and bind variables from debug UI") // QueryLogFormat controls the format of the query log (either text or json) - fs.StringVar(&queryLogFormat, "querylog-format", queryLogFormat, "format for query logs (\"text\" or \"json\")") + fs.StringVar(&queryLogConfigInstance.Format, "querylog-format", queryLogConfigInstance.Format, "format for query logs (\"text\" or \"json\")") // QueryLogFilterTag contains an optional string that must be present in the query for it to be logged - fs.StringVar(&queryLogFilterTag, "querylog-filter-tag", queryLogFilterTag, "string that must be present in the query for it to be logged; if using a value as the tag, you need to disable query normalization") + fs.StringVar(&queryLogConfigInstance.FilterTag, "querylog-filter-tag", queryLogConfigInstance.FilterTag, "string that must be present in the query for it to be logged; if using a value as the tag, you need to disable query normalization") // QueryLogRowThreshold only log queries returning or affecting this many rows - fs.Uint64Var(&queryLogRowThreshold, "querylog-row-threshold", queryLogRowThreshold, "Number of rows a query has to return or affect before being logged; not useful for streaming queries. 0 means all queries will be logged.") + fs.Uint64Var(&queryLogConfigInstance.RowThreshold, "querylog-row-threshold", queryLogConfigInstance.RowThreshold, "Number of rows a query has to return or affect before being logged; not useful for streaming queries. 0 means all queries will be logged.") // QueryLogSampleRate causes a sample of queries to be logged - fs.Float64Var(&queryLogSampleRate, "querylog-sample-rate", queryLogSampleRate, "Sample rate for logging queries. Value must be between 0.0 (no logging) and 1.0 (all queries)") -} - -const ( - // QueryLogFormatText is the format specifier for text querylog output - QueryLogFormatText = "text" + fs.Float64Var(&queryLogConfigInstance.sampleRate, "querylog-sample-rate", queryLogConfigInstance.sampleRate, "Sample rate for logging queries. Value must be between 0.0 (no logging) and 1.0 (all queries)") - // QueryLogFormatJSON is the format specifier for json querylog output - QueryLogFormatJSON = "json" -) + // QueryLogMode controls the mode for logging queries (all or error) + fs.StringVar(&queryLogConfigInstance.Mode, "querylog-mode", queryLogConfigInstance.Mode, `Mode for logging queries. "error" will only log queries that return an error. Otherwise all queries will be logged.`) +} // StreamLogger is a non-blocking broadcaster of messages. // Subscribers can use channels or HTTP. @@ -257,27 +254,30 @@ func GetFormatter[T any](logger *StreamLogger[T]) LogFormatter { } } -// shouldSampleQuery returns true if a query should be sampled based on queryLogSampleRate -func shouldSampleQuery() bool { - if queryLogSampleRate <= 0 { +// shouldSampleQuery returns true if a query should be sampled based on sampleRate +func (qlConfig QueryLogConfig) shouldSampleQuery() bool { + if qlConfig.sampleRate <= 0 { return false - } else if queryLogSampleRate >= 1 { + } else if qlConfig.sampleRate >= 1 { return true } - return rand.Float64() <= queryLogSampleRate + return rand.Float64() <= qlConfig.sampleRate } // ShouldEmitLog returns whether the log with the given SQL query // should be emitted or filtered -func ShouldEmitLog(sql string, rowsAffected, rowsReturned uint64) bool { - if shouldSampleQuery() { +func (qlConfig QueryLogConfig) ShouldEmitLog(sql string, rowsAffected, rowsReturned uint64, hasError bool) bool { + if qlConfig.shouldSampleQuery() { return true } - if queryLogRowThreshold > max(rowsAffected, rowsReturned) && queryLogFilterTag == "" { + if qlConfig.RowThreshold > max(rowsAffected, rowsReturned) && qlConfig.FilterTag == "" { return false } - if queryLogFilterTag != "" { - return strings.Contains(sql, queryLogFilterTag) + if qlConfig.FilterTag != "" { + return strings.Contains(sql, qlConfig.FilterTag) + } + if qlConfig.Mode == QueryLogModeError { + return hasError } return true } diff --git a/go/streamlog/streamlog_test.go b/go/streamlog/streamlog_test.go index c1321c92a94..8256ada479e 100644 --- a/go/streamlog/streamlog_test.go +++ b/go/streamlog/streamlog_test.go @@ -266,40 +266,29 @@ func TestFile(t *testing.T) { } func TestShouldSampleQuery(t *testing.T) { - queryLogSampleRate = -1 - assert.False(t, shouldSampleQuery()) + qlConfig := QueryLogConfig{sampleRate: -1} + assert.False(t, qlConfig.shouldSampleQuery()) - queryLogSampleRate = 0 - assert.False(t, shouldSampleQuery()) + qlConfig.sampleRate = 0 + assert.False(t, qlConfig.shouldSampleQuery()) - // for test coverage, can't test a random result - queryLogSampleRate = 0.5 - shouldSampleQuery() + qlConfig.sampleRate = 1.0 + assert.True(t, qlConfig.shouldSampleQuery()) - queryLogSampleRate = 1.0 - assert.True(t, shouldSampleQuery()) - - queryLogSampleRate = 100.0 - assert.True(t, shouldSampleQuery()) + qlConfig.sampleRate = 100.0 + assert.True(t, qlConfig.shouldSampleQuery()) } func TestShouldEmitLog(t *testing.T) { - origQueryLogFilterTag := queryLogFilterTag - origQueryLogRowThreshold := queryLogRowThreshold - origQueryLogSampleRate := queryLogSampleRate - defer func() { - SetQueryLogFilterTag(origQueryLogFilterTag) - SetQueryLogRowThreshold(origQueryLogRowThreshold) - SetQueryLogSampleRate(origQueryLogSampleRate) - }() - tests := []struct { sql string qLogFilterTag string qLogRowThreshold uint64 qLogSampleRate float64 + qLogMode string rowsAffected uint64 rowsReturned uint64 + errored bool ok bool }{ { @@ -356,43 +345,33 @@ func TestShouldEmitLog(t *testing.T) { rowsReturned: 17, ok: true, }, + { + sql: "log only error - no error", + qLogMode: "error", + errored: false, + ok: false, + }, + { + sql: "log only error - errored", + qLogMode: "error", + errored: true, + ok: true, + }, } for _, tt := range tests { t.Run(tt.sql, func(t *testing.T) { - SetQueryLogFilterTag(tt.qLogFilterTag) - SetQueryLogRowThreshold(tt.qLogRowThreshold) - SetQueryLogSampleRate(tt.qLogSampleRate) - - require.Equal(t, tt.ok, ShouldEmitLog(tt.sql, tt.rowsAffected, tt.rowsReturned)) + qlConfig := QueryLogConfig{ + FilterTag: tt.qLogFilterTag, + RowThreshold: tt.qLogRowThreshold, + sampleRate: tt.qLogSampleRate, + Mode: tt.qLogMode, + } + require.Equal(t, tt.ok, qlConfig.ShouldEmitLog(tt.sql, tt.rowsAffected, tt.rowsReturned, tt.errored)) }) } } -func BenchmarkShouldEmitLog(b *testing.B) { - b.Run("default", func(b *testing.B) { - SetQueryLogSampleRate(0.0) - for i := 0; i < b.N; i++ { - ShouldEmitLog("select * from test where user='someone'", 0, 123) - } - }) - b.Run("filter_tag", func(b *testing.B) { - SetQueryLogSampleRate(0.0) - SetQueryLogFilterTag("LOG_QUERY") - defer SetQueryLogFilterTag("") - for i := 0; i < b.N; i++ { - ShouldEmitLog("select /* LOG_QUERY=1 */ * from test where user='someone'", 0, 123) - } - }) - b.Run("50%_sample_rate", func(b *testing.B) { - SetQueryLogSampleRate(0.5) - defer SetQueryLogSampleRate(0.0) - for i := 0; i < b.N; i++ { - ShouldEmitLog("select * from test where user='someone'", 0, 123) - } - }) -} - func TestGetFormatter(t *testing.T) { tests := []struct { name string diff --git a/go/test/endtoend/backup/vtbackup/backup_only_test.go b/go/test/endtoend/backup/vtbackup/backup_only_test.go index c7a09c70d13..0ad25301af0 100644 --- a/go/test/endtoend/backup/vtbackup/backup_only_test.go +++ b/go/test/endtoend/backup/vtbackup/backup_only_test.go @@ -47,6 +47,55 @@ var ( ) Engine=InnoDB;` ) +func TestFailingReplication(t *testing.T) { + prepareCluster(t) + + // Run the entire backup test + firstBackupTest(t, false) + + // Insert one more row, the primary will be ahead of the last backup + _, err := primary.VttabletProcess.QueryTablet("insert into vt_insert_test (msg) values ('test_failure')", keyspaceName, true) + require.NoError(t, err) + + // Disable replication from the primary by removing the grants to 'vt_repl'. + _, err = primary.VttabletProcess.QueryTablet("REVOKE REPLICATION SLAVE ON *.* FROM 'vt_repl'@'%';", keyspaceName, true) + require.NoError(t, err) + _, err = primary.VttabletProcess.QueryTablet("FLUSH PRIVILEGES;", keyspaceName, true) + require.NoError(t, err) + + // Take a backup with vtbackup: the process should fail entirely as it cannot replicate from the primary. + _, err = startVtBackup(t, false, false, false) + require.Error(t, err) + + // keep in mind how many backups we have right now + backups, err := listBackups(shardKsName) + require.NoError(t, err) + + // In 30 seconds, grant the replication permission again to 'vt_repl'. + // This will mean that vtbackup should fail to replicate for ~30 seconds, until we grant the permission again. + go func() { + <-time.After(30 * time.Second) + _, err = primary.VttabletProcess.QueryTablet("GRANT REPLICATION SLAVE ON *.* TO 'vt_repl'@'%';", keyspaceName, true) + require.NoError(t, err) + _, err = primary.VttabletProcess.QueryTablet("FLUSH PRIVILEGES;", keyspaceName, true) + require.NoError(t, err) + }() + + startTime := time.Now() + // this will initially be stuck trying to replicate from the primary, and once we re-grant the permission in + // the goroutine above, the process will work and complete successfully. + _ = vtBackup(t, false, false, false) + + require.GreaterOrEqual(t, time.Since(startTime).Seconds(), float64(30)) + + verifyBackupCount(t, shardKsName, len(backups)+1) + + removeBackups(t) + verifyBackupCount(t, shardKsName, 0) + + tearDown(t, true) +} + func TestTabletInitialBackup(t *testing.T) { // Test Initial Backup Flow // TestTabletInitialBackup will: @@ -59,6 +108,15 @@ func TestTabletInitialBackup(t *testing.T) { // - Bring up a second replica, and restore from the second backup // - list the backups, remove them + prepareCluster(t) + + // Run the entire backup test + firstBackupTest(t, true) + + tearDown(t, true) +} + +func prepareCluster(t *testing.T) { waitForReplicationToCatchup([]cluster.Vttablet{*replica1, *replica2}) dataPointReader := vtBackup(t, true, false, false) @@ -84,11 +142,6 @@ func TestTabletInitialBackup(t *testing.T) { "TabletExternallyReparented", primary.Alias) require.NoError(t, err) restore(t, replica1, "replica", "SERVING") - - // Run the entire backup test - firstBackupTest(t, "replica") - - tearDown(t, true) } func TestTabletBackupOnly(t *testing.T) { @@ -107,12 +160,12 @@ func TestTabletBackupOnly(t *testing.T) { replica1.VttabletProcess.ServingStatus = "NOT_SERVING" initTablets(t, true, true) - firstBackupTest(t, "replica") + firstBackupTest(t, true) tearDown(t, false) } -func firstBackupTest(t *testing.T, tabletType string) { +func firstBackupTest(t *testing.T, removeBackup bool) { // Test First Backup flow. // // firstBackupTest will: @@ -168,11 +221,13 @@ func firstBackupTest(t *testing.T, tabletType string) { // check the new replica has the data cluster.VerifyRowsInTablet(t, replica2, keyspaceName, 2) - removeBackups(t) - verifyBackupCount(t, shardKsName, 0) + if removeBackup { + removeBackups(t) + verifyBackupCount(t, shardKsName, 0) + } } -func vtBackup(t *testing.T, initialBackup bool, restartBeforeBackup, disableRedoLog bool) *opentsdb.DataPointReader { +func startVtBackup(t *testing.T, initialBackup bool, restartBeforeBackup, disableRedoLog bool) (*os.File, error) { mysqlSocket, err := os.CreateTemp("", "vtbackup_test_mysql.sock") require.NoError(t, err) defer os.Remove(mysqlSocket.Name()) @@ -207,9 +262,19 @@ func vtBackup(t *testing.T, initialBackup bool, restartBeforeBackup, disableRedo log.Infof("starting backup tablet %s", time.Now()) err = localCluster.StartVtbackup(newInitDBFile, initialBackup, keyspaceName, shardName, cell, extraArgs...) - require.NoError(t, err) + if err != nil { + return nil, err + } f, err := os.OpenFile(statsPath, os.O_RDONLY, 0) + if err != nil { + return nil, err + } + return f, nil +} + +func vtBackup(t *testing.T, initialBackup bool, restartBeforeBackup, disableRedoLog bool) *opentsdb.DataPointReader { + f, err := startVtBackup(t, initialBackup, restartBeforeBackup, disableRedoLog) require.NoError(t, err) return opentsdb.NewDataPointReader(f) } @@ -222,11 +287,8 @@ func verifyBackupCount(t *testing.T, shardKsName string, expected int) []string } func listBackups(shardKsName string) ([]string, error) { - backups, err := localCluster.VtctlProcess.ExecuteCommandWithOutput( - "--backup_storage_implementation", "file", - "--file_backup_storage_root", - path.Join(os.Getenv("VTDATAROOT"), "tmp", "backupstorage"), - "ListBackups", shardKsName, + backups, err := localCluster.VtctldClientProcess.ExecuteCommandWithOutput( + "GetBackups", shardKsName, ) if err != nil { return nil, err @@ -246,10 +308,7 @@ func removeBackups(t *testing.T) { backups, err := listBackups(shardKsName) require.NoError(t, err) for _, backup := range backups { - _, err := localCluster.VtctlProcess.ExecuteCommandWithOutput( - "--backup_storage_implementation", "file", - "--file_backup_storage_root", - path.Join(os.Getenv("VTDATAROOT"), "tmp", "backupstorage"), + _, err := localCluster.VtctldClientProcess.ExecuteCommandWithOutput( "RemoveBackup", shardKsName, backup, ) require.NoError(t, err) diff --git a/go/test/endtoend/backup/vtbackup/main_test.go b/go/test/endtoend/backup/vtbackup/main_test.go index 6e1840b2979..54003416776 100644 --- a/go/test/endtoend/backup/vtbackup/main_test.go +++ b/go/test/endtoend/backup/vtbackup/main_test.go @@ -76,7 +76,7 @@ func TestMain(m *testing.M) { }, } shard := &localCluster.Keyspaces[0].Shards[0] - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", localCluster.VtctldProcess.GrpcPort, localCluster.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(localCluster.VtctldProcess.GrpcPort, localCluster.TopoPort, "localhost", localCluster.TmpDirectory) _, err = vtctldClientProcess.ExecuteCommandWithOutput("CreateKeyspace", keyspaceName, "--durability-policy=semi_sync") if err != nil { return 1, err diff --git a/go/test/endtoend/backup/vtctlbackup/backup_utils.go b/go/test/endtoend/backup/vtctlbackup/backup_utils.go index 86b2612a044..afa5023a047 100644 --- a/go/test/endtoend/backup/vtctlbackup/backup_utils.go +++ b/go/test/endtoend/backup/vtctlbackup/backup_utils.go @@ -254,7 +254,7 @@ func LaunchCluster(setupType int, streamMode string, stripes int, cDetails *Comp if err := localCluster.InitTablet(replica2, keyspaceName, shard.Name); err != nil { return 1, err } - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", localCluster.VtctldProcess.GrpcPort, localCluster.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(localCluster.VtctldProcess.GrpcPort, localCluster.TopoPort, "localhost", localCluster.TmpDirectory) _, err = vtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspaceName, "--durability-policy=semi_sync") if err != nil { return 1, err diff --git a/go/test/endtoend/cellalias/cell_alias_test.go b/go/test/endtoend/cellalias/cell_alias_test.go index 6e8f901a245..ef003754655 100644 --- a/go/test/endtoend/cellalias/cell_alias_test.go +++ b/go/test/endtoend/cellalias/cell_alias_test.go @@ -109,12 +109,12 @@ func TestMain(m *testing.M) { if err != nil { return 1, err } - err = localCluster.VtctlProcess.AddCellInfo(cell2) + err = localCluster.VtctldClientProcess.AddCellInfo(cell2) if err != nil { return 1, err } - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", localCluster.VtctldProcess.GrpcPort, localCluster.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(localCluster.VtctldProcess.GrpcPort, localCluster.TopoPort, "localhost", localCluster.TmpDirectory) _, err = vtctldClientProcess.ExecuteCommandWithOutput("CreateKeyspace", keyspaceName, "--durability-policy=semi_sync") if err != nil { return 1, err diff --git a/go/test/endtoend/cluster/cluster_process.go b/go/test/endtoend/cluster/cluster_process.go index 2ac46a8d145..ed61f7fd0c9 100644 --- a/go/test/endtoend/cluster/cluster_process.go +++ b/go/test/endtoend/cluster/cluster_process.go @@ -101,9 +101,7 @@ type LocalProcessCluster struct { VtctlMajorVersion int // standalone executable - VtctlclientProcess VtctlClientProcess VtctldClientProcess VtctldClientProcess - VtctlProcess VtctlProcess VtadminProcess VtAdminProcess // background executable processes @@ -249,15 +247,6 @@ func (cluster *LocalProcessCluster) StartTopo() (err error) { } } - cluster.VtctlProcess = *VtctlProcessInstance(cluster.TopoProcess.Port, cluster.Hostname) - if !cluster.ReusingVTDATAROOT { - if err = cluster.VtctlProcess.AddCellInfo(cluster.Cell); err != nil { - log.Error(err) - return - } - cluster.VtctlProcess.LogDir = cluster.TmpDirectory - } - cluster.VtctldProcess = *VtctldProcessInstance(cluster.GetAndReservePort(), cluster.GetAndReservePort(), cluster.TopoProcess.Port, cluster.Hostname, cluster.TmpDirectory) log.Infof("Starting vtctld server on port: %d", cluster.VtctldProcess.Port) @@ -267,8 +256,15 @@ func (cluster *LocalProcessCluster) StartTopo() (err error) { return } - cluster.VtctlclientProcess = *VtctlClientProcessInstance("localhost", cluster.VtctldProcess.GrpcPort, cluster.TmpDirectory) - cluster.VtctldClientProcess = *VtctldClientProcessInstance("localhost", cluster.VtctldProcess.GrpcPort, cluster.TmpDirectory) + cluster.VtctldClientProcess = *cluster.NewVtctldClientProcessInstance("localhost", cluster.VtctldProcess.GrpcPort, cluster.TmpDirectory) + if !cluster.ReusingVTDATAROOT { + if err = cluster.VtctldClientProcess.AddCellInfo(cluster.Cell); err != nil { + log.Error(err) + return + } + cluster.VtctldClientProcess.LogDir = cluster.TmpDirectory + } + return } @@ -388,7 +384,7 @@ func (cluster *LocalProcessCluster) startKeyspace(keyspace Keyspace, shardNames keyspace.SidecarDBName = sidecar.DefaultName } // Create the keyspace if it doesn't already exist. - _ = cluster.VtctlProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) + _ = cluster.VtctldClientProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) for _, shardName := range shardNames { shard, err := cluster.AddShard(keyspace.Name, shardName, totalTabletsRequired, rdonly, customizers) if err != nil { @@ -560,7 +556,7 @@ func (cluster *LocalProcessCluster) StartKeyspaceLegacy(keyspace Keyspace, shard keyspace.SidecarDBName = sidecar.DefaultName } // Create the keyspace if it doesn't already exist. - _ = cluster.VtctlProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) + _ = cluster.VtctldClientProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) var mysqlctlProcessList []*exec.Cmd for _, shardName := range shardNames { shard := &Shard{ @@ -703,7 +699,7 @@ func (cluster *LocalProcessCluster) SetupCluster(keyspace *Keyspace, shards []Sh if !cluster.ReusingVTDATAROOT { // Create Keyspace - err = cluster.VtctlProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) + err = cluster.VtctldClientProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) if err != nil { log.Error(err) return @@ -1294,14 +1290,32 @@ func (cluster *LocalProcessCluster) NewVttabletInstance(tabletType string, UID i // NewVTOrcProcess creates a new VTOrcProcess object func (cluster *LocalProcessCluster) NewVTOrcProcess(config VTOrcConfiguration) *VTOrcProcess { - base := VtctlProcessInstance(cluster.TopoProcess.Port, cluster.Hostname) - base.Binary = "vtorc" + base := VtProcessInstance("vtorc", "vtorc", cluster.TopoProcess.Port, cluster.Hostname) return &VTOrcProcess{ - VtctlProcess: *base, - LogDir: cluster.TmpDirectory, - Config: config, - Port: cluster.GetAndReservePort(), + VtProcess: base, + LogDir: cluster.TmpDirectory, + Config: config, + Port: cluster.GetAndReservePort(), + } +} + +// VtctldClientProcessInstance returns a VtctldProcess handle for a +// vtctldclient process configured with the given Config. +func (cluster *LocalProcessCluster) NewVtctldClientProcessInstance(hostname string, grpcPort int, tmpDirectory string) *VtctldClientProcess { + version, err := GetMajorVersion("vtctldclient") + if err != nil { + log.Warningf("failed to get major vtctldclient version; interop with CLI changes for VEP-4 may not work: %v", err) + } + + base := VtProcessInstance("vtctldclient", "vtctldclient", cluster.TopoProcess.Port, cluster.Hostname) + + vtctldclient := &VtctldClientProcess{ + VtProcess: base, + Server: fmt.Sprintf("%s:%d", hostname, grpcPort), + TempDirectory: tmpDirectory, + VtctldClientMajorVersion: version, } + return vtctldclient } // NewVTAdminProcess creates a new VTAdminProcess object diff --git a/go/test/endtoend/cluster/cluster_util.go b/go/test/endtoend/cluster/cluster_util.go index d449b4c64f7..18f78dcb3d0 100644 --- a/go/test/endtoend/cluster/cluster_util.go +++ b/go/test/endtoend/cluster/cluster_util.go @@ -299,22 +299,6 @@ func NewConnParams(port int, password, socketPath, keyspace string) mysql.ConnPa } -func filterDoubleDashArgs(args []string, version int) (filtered []string) { - if version > 13 { - return args - } - - for _, arg := range args { - if arg == "--" { - continue - } - - filtered = append(filtered, arg) - } - - return filtered -} - // WriteDbCredentialToTmp writes JSON formatted db credentials to the // specified tmp directory. func WriteDbCredentialToTmp(tmpDir string) string { diff --git a/go/test/endtoend/cluster/vt_process.go b/go/test/endtoend/cluster/vt_process.go new file mode 100644 index 00000000000..d1b7180b31d --- /dev/null +++ b/go/test/endtoend/cluster/vt_process.go @@ -0,0 +1,62 @@ +/* +Copyright 2025 The Vitess Authors. + +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 + + http://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 cluster + +import ( + "fmt" +) + +// VtProcess is a structure for holding generic vitess process info. +type VtProcess struct { + Name string + Binary string + LogDir string + TopoImplementation string + TopoGlobalAddress string + TopoGlobalRoot string + TopoServerAddress string + TopoRootPath string +} + +// VtProcessInstance returns a VtProcess handle configured with the given Config. +// The process must be manually started by calling setup() +func VtProcessInstance(name, binary string, topoPort int, hostname string) VtProcess { + // Default values for etcd2 topo server. + topoImplementation := "etcd2" + topoRootPath := "/" + + // Checking and resetting the parameters for required topo server. + switch *topoFlavor { + case "zk2": + topoImplementation = "zk2" + case "consul": + topoImplementation = "consul" + // For consul we do not need "/" in the path + topoRootPath = "" + } + + vt := VtProcess{ + Name: name, + Binary: binary, + TopoImplementation: topoImplementation, + TopoGlobalAddress: fmt.Sprintf("%s:%d", hostname, topoPort), + TopoGlobalRoot: TopoGlobalRoot(*topoFlavor), + TopoServerAddress: fmt.Sprintf("%s:%d", hostname, topoPort), + TopoRootPath: topoRootPath, + } + return vt +} diff --git a/go/test/endtoend/cluster/vtbackup_process.go b/go/test/endtoend/cluster/vtbackup_process.go index 57350922a21..ea12c8200d4 100644 --- a/go/test/endtoend/cluster/vtbackup_process.go +++ b/go/test/endtoend/cluster/vtbackup_process.go @@ -31,13 +31,14 @@ import ( // VtbackupProcess is a generic handle for a running Vtbackup. // It can be spawned manually type VtbackupProcess struct { - Name string - Binary string - CommonArg VtctlProcess + VtProcess LogDir string MysqlPort int Directory string + BackupStorageImplementation string + FileBackupStorageRoot string + Cell string Keyspace string Shard string @@ -56,9 +57,9 @@ type VtbackupProcess struct { func (vtbackup *VtbackupProcess) Setup() (err error) { vtbackup.proc = exec.Command( vtbackup.Binary, - "--topo_implementation", vtbackup.CommonArg.TopoImplementation, - "--topo_global_server_address", vtbackup.CommonArg.TopoGlobalAddress, - "--topo_global_root", vtbackup.CommonArg.TopoGlobalRoot, + "--topo_implementation", vtbackup.TopoImplementation, + "--topo_global_server_address", vtbackup.TopoGlobalAddress, + "--topo_global_root", vtbackup.TopoGlobalRoot, "--log_dir", vtbackup.LogDir, //initDBfile is required to run vtbackup @@ -68,8 +69,8 @@ func (vtbackup *VtbackupProcess) Setup() (err error) { "--init_shard", vtbackup.Shard, //Backup Arguments are not optional - "--backup_storage_implementation", "file", - "--file_backup_storage_root", path.Join(os.Getenv("VTDATAROOT"), "tmp", "backupstorage"), + "--backup_storage_implementation", vtbackup.BackupStorageImplementation, + "--file_backup_storage_root", vtbackup.FileBackupStorageRoot, ) if vtbackup.initialBackup { @@ -129,20 +130,20 @@ func (vtbackup *VtbackupProcess) TearDown() error { // The process must be manually started by calling Setup() func VtbackupProcessInstance(tabletUID int, mysqlPort int, newInitDBFile string, keyspace string, shard string, cell string, hostname string, tmpDirectory string, topoPort int, initialBackup bool) *VtbackupProcess { - vtctl := VtctlProcessInstance(topoPort, hostname) + base := VtProcessInstance("vtbackup", "vtbackup", topoPort, hostname) vtbackup := &VtbackupProcess{ - Name: "vtbackup", - Binary: "vtbackup", - CommonArg: *vtctl, - LogDir: tmpDirectory, - Directory: os.Getenv("VTDATAROOT"), - TabletAlias: fmt.Sprintf("%s-%010d", cell, tabletUID), - initDBfile: newInitDBFile, - Keyspace: keyspace, - Shard: shard, - Cell: cell, - MysqlPort: mysqlPort, - initialBackup: initialBackup, + VtProcess: base, + LogDir: tmpDirectory, + Directory: os.Getenv("VTDATAROOT"), + BackupStorageImplementation: "file", + FileBackupStorageRoot: path.Join(os.Getenv("VTDATAROOT"), "/backups"), + TabletAlias: fmt.Sprintf("%s-%010d", cell, tabletUID), + initDBfile: newInitDBFile, + Keyspace: keyspace, + Shard: shard, + Cell: cell, + MysqlPort: mysqlPort, + initialBackup: initialBackup, } return vtbackup } diff --git a/go/test/endtoend/cluster/vtctl_process.go b/go/test/endtoend/cluster/vtctl_process.go deleted file mode 100644 index 185c3079d34..00000000000 --- a/go/test/endtoend/cluster/vtctl_process.go +++ /dev/null @@ -1,149 +0,0 @@ -/* -Copyright 2019 The Vitess Authors. - -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 - - http://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 cluster - -import ( - "fmt" - "os/exec" - "strings" - - "vitess.io/vitess/go/vt/log" -) - -// VtctlProcess is a generic handle for a running vtctl command . -// It can be spawned manually -type VtctlProcess struct { - Name string - Binary string - LogDir string - TopoImplementation string - TopoGlobalAddress string - TopoGlobalRoot string - TopoServerAddress string - TopoRootPath string - VtctlMajorVersion int -} - -// AddCellInfo executes vtctl command to add cell info -func (vtctl *VtctlProcess) AddCellInfo(Cell string) (err error) { - tmpProcess := exec.Command( - vtctl.Binary, - "--topo_implementation", vtctl.TopoImplementation, - "--topo_global_server_address", vtctl.TopoGlobalAddress, - "--topo_global_root", vtctl.TopoGlobalRoot, - ) - if *isCoverage { - tmpProcess.Args = append(tmpProcess.Args, "--test.coverprofile="+getCoveragePath("vtctl-addcell.out")) - } - tmpProcess.Args = append(tmpProcess.Args, - "AddCellInfo", "--", - "--root", vtctl.TopoRootPath+Cell, - "--server_address", vtctl.TopoServerAddress, - Cell) - tmpProcess.Args = filterDoubleDashArgs(tmpProcess.Args, vtctl.VtctlMajorVersion) - log.Infof("Adding CellInfo for cell %v with command: %v", Cell, strings.Join(tmpProcess.Args, " ")) - return tmpProcess.Run() -} - -// CreateKeyspace executes vtctl command to create keyspace -func (vtctl *VtctlProcess) CreateKeyspace(keyspace, sidecarDBName, durabilityPolicy string) error { - args := []string{ - "CreateKeyspace", keyspace, - "--sidecar-db-name", sidecarDBName, - } - if durabilityPolicy != "" { - args = append(args, "--durability-policy", durabilityPolicy) - } - output, err := vtctl.ExecuteCommandWithOutput(args...) - if err != nil { - log.Errorf("CreateKeyspace returned err: %s, output: %s", err, output) - } - return err -} - -// ExecuteCommandWithOutput executes any vtctlclient command and returns output -func (vtctl *VtctlProcess) ExecuteCommandWithOutput(args ...string) (result string, err error) { - args = append([]string{ - "--log_dir", vtctl.LogDir, - "--topo_implementation", vtctl.TopoImplementation, - "--topo_global_server_address", vtctl.TopoGlobalAddress, - "--topo_global_root", vtctl.TopoGlobalRoot}, args...) - if *isCoverage { - args = append([]string{"--test.coverprofile=" + getCoveragePath("vtctl-o-"+args[0]+".out"), "--test.v"}, args...) - } - tmpProcess := exec.Command( - vtctl.Binary, - filterDoubleDashArgs(args, vtctl.VtctlMajorVersion)..., - ) - log.Info(fmt.Sprintf("Executing vtctlclient with arguments %v", strings.Join(tmpProcess.Args, " "))) - resultByte, err := tmpProcess.CombinedOutput() - return filterResultForWarning(filterResultWhenRunsForCoverage(string(resultByte))), err -} - -// ExecuteCommand executes any vtctlclient command -func (vtctl *VtctlProcess) ExecuteCommand(args ...string) (err error) { - args = append([]string{ - "--topo_implementation", vtctl.TopoImplementation, - "--topo_global_server_address", vtctl.TopoGlobalAddress, - "--topo_global_root", vtctl.TopoGlobalRoot}, args...) - if *isCoverage { - args = append([]string{"--test.coverprofile=" + getCoveragePath("vtctl-"+args[0]+".out"), "--test.v"}, args...) - } - tmpProcess := exec.Command( - vtctl.Binary, - filterDoubleDashArgs(args, vtctl.VtctlMajorVersion)..., - ) - log.Info(fmt.Sprintf("Executing vtctlclient with arguments %v", strings.Join(tmpProcess.Args, " "))) - return tmpProcess.Run() -} - -// VtctlProcessInstance returns a VtctlProcess handle for vtctl process -// configured with the given Config. -// The process must be manually started by calling setup() -func VtctlProcessInstance(topoPort int, hostname string) *VtctlProcess { - - // Default values for etcd2 topo server. - topoImplementation := "etcd2" - topoRootPath := "/" - - // Checking and resetting the parameters for required topo server. - switch *topoFlavor { - case "zk2": - topoImplementation = "zk2" - case "consul": - topoImplementation = "consul" - // For consul we do not need "/" in the path - topoRootPath = "" - } - - version, err := GetMajorVersion("vtctl") - if err != nil { - log.Warningf("failed to get major vtctl version; interop with CLI changes for VEP-4 may not work: %s", err) - } - - vtctl := &VtctlProcess{ - Name: "vtctl", - Binary: "vtctl", - TopoImplementation: topoImplementation, - TopoGlobalAddress: fmt.Sprintf("%s:%d", hostname, topoPort), - TopoGlobalRoot: TopoGlobalRoot(*topoFlavor), - TopoServerAddress: fmt.Sprintf("%s:%d", hostname, topoPort), - TopoRootPath: topoRootPath, - VtctlMajorVersion: version, - } - return vtctl -} diff --git a/go/test/endtoend/cluster/vtctlclient_process.go b/go/test/endtoend/cluster/vtctlclient_process.go deleted file mode 100644 index 0c5fb1bc8c2..00000000000 --- a/go/test/endtoend/cluster/vtctlclient_process.go +++ /dev/null @@ -1,266 +0,0 @@ -/* -Copyright 2019 The Vitess Authors. - -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 - - http://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 cluster - -import ( - "fmt" - "os/exec" - "strings" - "time" - - "vitess.io/vitess/go/vt/vterrors" - - "vitess.io/vitess/go/vt/log" -) - -// VtctlClientProcess is a generic handle for a running vtctlclient command . -// It can be spawned manually -type VtctlClientProcess struct { - Name string - Binary string - Server string - TempDirectory string - ZoneName string - VtctlClientMajorVersion int -} - -// VtctlClientParams encapsulated params to provide if non-default -type VtctlClientParams struct { - DDLStrategy string - MigrationContext string - UUIDList string - CallerID string - BatchSize int -} - -// InitShardPrimary executes vtctlclient command to make specified tablet the primary for the shard. -func (vtctlclient *VtctlClientProcess) InitShardPrimary(Keyspace string, Shard string, Cell string, TabletUID int) (err error) { - output, err := vtctlclient.ExecuteCommandWithOutput( - "InitShardPrimary", "--", - "--force", "--wait_replicas_timeout", "31s", - fmt.Sprintf("%s/%s", Keyspace, Shard), - fmt.Sprintf("%s-%d", Cell, TabletUID)) - if err != nil { - log.Errorf("error in InitShardPrimary output %s, err %s", output, err.Error()) - } - return err -} - -// InitializeShard executes vtctlclient command to make specified tablet the primary for the shard. -func (vtctlclient *VtctlClientProcess) InitializeShard(Keyspace string, Shard string, Cell string, TabletUID int) (err error) { - output, err := vtctlclient.ExecuteCommandWithOutput( - "PlannedReparentShard", "--", - "--keyspace_shard", fmt.Sprintf("%s/%s", Keyspace, Shard), - "--wait_replicas_timeout", "31s", - "--new_primary", fmt.Sprintf("%s-%d", Cell, TabletUID)) - if err != nil { - log.Errorf("error in PlannedReparentShard output %s, err %s", output, err.Error()) - } - return err -} - -// ApplySchemaWithOutput applies SQL schema to the keyspace -func (vtctlclient *VtctlClientProcess) ApplySchemaWithOutput(Keyspace string, SQL string, params VtctlClientParams) (result string, err error) { - args := []string{ - "ApplySchema", "--", - "--sql", SQL, - } - if params.MigrationContext != "" { - args = append(args, "--migration_context", params.MigrationContext) - } - if params.DDLStrategy != "" { - args = append(args, "--ddl_strategy", params.DDLStrategy) - } - if params.UUIDList != "" { - args = append(args, "--uuid_list", params.UUIDList) - } - if params.BatchSize > 0 { - args = append(args, "--batch_size", fmt.Sprintf("%d", params.BatchSize)) - } - if params.CallerID != "" { - args = append(args, "--caller_id", params.CallerID) - } - args = append(args, Keyspace) - return vtctlclient.ExecuteCommandWithOutput(args...) -} - -// ApplySchema applies SQL schema to the keyspace -func (vtctlclient *VtctlClientProcess) ApplySchema(Keyspace string, SQL string) error { - message, err := vtctlclient.ApplySchemaWithOutput(Keyspace, SQL, VtctlClientParams{DDLStrategy: "direct -allow-zero-in-date"}) - - return vterrors.Wrap(err, message) -} - -// ApplyVSchema applies vitess schema (JSON format) to the keyspace -func (vtctlclient *VtctlClientProcess) ApplyVSchema(Keyspace string, JSON string) (err error) { - return vtctlclient.ExecuteCommand( - "ApplyVSchema", "--", - "--vschema", JSON, - Keyspace, - ) -} - -// ApplyRoutingRules does it -func (vtctlclient *VtctlClientProcess) ApplyRoutingRules(JSON string) (err error) { - return vtctlclient.ExecuteCommand("ApplyRoutingRules", "--", "--rules", JSON) -} - -// ApplyRoutingRules does it -func (vtctlclient *VtctlClientProcess) ApplyShardRoutingRules(JSON string) (err error) { - return vtctlclient.ExecuteCommand("ApplyShardRoutingRules", "--", "--rules", JSON) -} - -// OnlineDDLShowRecent responds with recent schema migration list -func (vtctlclient *VtctlClientProcess) OnlineDDLShowRecent(Keyspace string) (result string, err error) { - return vtctlclient.ExecuteCommandWithOutput( - "OnlineDDL", - Keyspace, - "show", - "recent", - ) -} - -// OnlineDDLCancelMigration cancels a given migration uuid -func (vtctlclient *VtctlClientProcess) OnlineDDLCancelMigration(Keyspace, uuid string) (result string, err error) { - return vtctlclient.ExecuteCommandWithOutput( - "OnlineDDL", - Keyspace, - "cancel", - uuid, - ) -} - -// OnlineDDLCancelAllMigrations cancels all migrations for a keyspace -func (vtctlclient *VtctlClientProcess) OnlineDDLCancelAllMigrations(Keyspace string) (result string, err error) { - return vtctlclient.ExecuteCommandWithOutput( - "OnlineDDL", - Keyspace, - "cancel-all", - ) -} - -// OnlineDDLRetryMigration retries a given migration uuid -func (vtctlclient *VtctlClientProcess) OnlineDDLRetryMigration(Keyspace, uuid string) (result string, err error) { - return vtctlclient.ExecuteCommandWithOutput( - "OnlineDDL", - Keyspace, - "retry", - uuid, - ) -} - -// OnlineDDLRevertMigration reverts a given migration uuid -func (vtctlclient *VtctlClientProcess) OnlineDDLRevertMigration(Keyspace, uuid string) (result string, err error) { - return vtctlclient.ExecuteCommandWithOutput( - "OnlineDDL", - Keyspace, - "revert", - uuid, - ) -} - -// VExec runs a VExec query -func (vtctlclient *VtctlClientProcess) VExec(Keyspace, workflow, query string) (result string, err error) { - return vtctlclient.ExecuteCommandWithOutput( - "VExec", - fmt.Sprintf("%s.%s", Keyspace, workflow), - query, - ) -} - -// ExecuteCommand executes any vtctlclient command -func (vtctlclient *VtctlClientProcess) ExecuteCommand(args ...string) (err error) { - output, err := vtctlclient.ExecuteCommandWithOutput(args...) - if output != "" { - if err != nil { - log.Errorf("Output:\n%v", output) - } - } - return err -} - -// ExecuteCommandWithOutput executes any vtctlclient command and returns output -func (vtctlclient *VtctlClientProcess) ExecuteCommandWithOutput(args ...string) (string, error) { - var resultByte []byte - var resultStr string - var err error - retries := 10 - retryDelay := 1 * time.Second - pArgs := []string{"--server", vtctlclient.Server} - if *isCoverage { - pArgs = append(pArgs, "--test.coverprofile="+getCoveragePath("vtctlclient-"+args[0]+".out"), "--test.v") - } - pArgs = append(pArgs, args...) - for i := 1; i <= retries; i++ { - tmpProcess := exec.Command( - vtctlclient.Binary, - filterDoubleDashArgs(pArgs, vtctlclient.VtctlClientMajorVersion)..., - ) - log.Infof("Executing vtctlclient with command: %v (attempt %d of %d)", strings.Join(tmpProcess.Args, " "), i, retries) - resultByte, err = tmpProcess.CombinedOutput() - resultStr = string(resultByte) - if err == nil || !shouldRetry(resultStr) { - break - } - time.Sleep(retryDelay) - } - return filterResultForWarning(filterResultWhenRunsForCoverage(resultStr)), err -} - -// VtctlClientProcessInstance returns a VtctlProcess handle for vtctlclient process -// configured with the given Config. -func VtctlClientProcessInstance(hostname string, grpcPort int, tmpDirectory string) *VtctlClientProcess { - version, err := GetMajorVersion("vtctl") // `vtctlclient` does not have a --version flag, so we assume both vtctl/vtctlclient have the same version - if err != nil { - log.Warningf("failed to get major vtctlclient version; interop with CLI changes for VEP-4 may not work: %s", err) - } - - vtctlclient := &VtctlClientProcess{ - Name: "vtctlclient", - Binary: "vtctlclient", - Server: fmt.Sprintf("%s:%d", hostname, grpcPort), - TempDirectory: tmpDirectory, - VtctlClientMajorVersion: version, - } - return vtctlclient -} - -// InitTablet initializes a tablet -func (vtctlclient *VtctlClientProcess) InitTablet(tablet *Vttablet, cell string, keyspaceName string, hostname string, shardName string) error { - tabletType := "replica" - if tablet.Type == "rdonly" { - tabletType = "rdonly" - } - args := []string{"InitTablet", "--", "--hostname", hostname, - "--port", fmt.Sprintf("%d", tablet.HTTPPort), "--allow_update", "--parent", - "--keyspace", keyspaceName, - "--shard", shardName} - if tablet.MySQLPort > 0 { - args = append(args, "--mysql_port", fmt.Sprintf("%d", tablet.MySQLPort)) - } - if tablet.GrpcPort > 0 { - args = append(args, "--grpc_port", fmt.Sprintf("%d", tablet.GrpcPort)) - } - args = append(args, fmt.Sprintf("%s-%010d", cell, tablet.TabletUID), tabletType) - return vtctlclient.ExecuteCommand(args...) -} - -// shouldRetry tells us if the command should be retried based on the results/output -- meaning that it -// is likely an ephemeral or recoverable issue that is likely to succeed when retried. -func shouldRetry(cmdResults string) bool { - return strings.Contains(cmdResults, "Deadlock found when trying to get lock; try restarting transaction") -} diff --git a/go/test/endtoend/cluster/vtctld_process.go b/go/test/endtoend/cluster/vtctld_process.go index 6ac6ed5d2b0..831f5a23af7 100644 --- a/go/test/endtoend/cluster/vtctld_process.go +++ b/go/test/endtoend/cluster/vtctld_process.go @@ -32,9 +32,7 @@ import ( // VtctldProcess is a generic handle for a running vtctld . // It can be spawned manually type VtctldProcess struct { - Name string - Binary string - CommonArg VtctlProcess + VtProcess ServiceMap string BackupStorageImplementation string FileBackupStorageRoot string @@ -55,9 +53,9 @@ func (vtctld *VtctldProcess) Setup(cell string, extraArgs ...string) (err error) _ = createDirectory(path.Join(vtctld.Directory, "backups"), 0700) vtctld.proc = exec.Command( vtctld.Binary, - "--topo_implementation", vtctld.CommonArg.TopoImplementation, - "--topo_global_server_address", vtctld.CommonArg.TopoGlobalAddress, - "--topo_global_root", vtctld.CommonArg.TopoGlobalRoot, + "--topo_implementation", vtctld.TopoImplementation, + "--topo_global_server_address", vtctld.TopoGlobalAddress, + "--topo_global_root", vtctld.TopoGlobalRoot, "--cell", cell, "--service_map", vtctld.ServiceMap, "--backup_storage_implementation", vtctld.BackupStorageImplementation, @@ -164,15 +162,13 @@ func (vtctld *VtctldProcess) TearDown() error { } } -// VtctldProcessInstance returns a VtctlProcess handle for vtctl process +// VtctldProcessInstance returns a VtctldProcess handle // configured with the given Config. // The process must be manually started by calling setup() func VtctldProcessInstance(httpPort int, grpcPort int, topoPort int, hostname string, tmpDirectory string) *VtctldProcess { - vtctl := VtctlProcessInstance(topoPort, hostname) + base := VtProcessInstance("vtctld", "vtctld", topoPort, hostname) vtctld := &VtctldProcess{ - Name: "vtctld", - Binary: "vtctld", - CommonArg: *vtctl, + VtProcess: base, ServiceMap: "grpc-vtctl,grpc-vtctld", BackupStorageImplementation: "file", FileBackupStorageRoot: path.Join(os.Getenv("VTDATAROOT"), "/backups"), diff --git a/go/test/endtoend/cluster/vtctldclient_process.go b/go/test/endtoend/cluster/vtctldclient_process.go index 8b401f59070..3dc1a811930 100644 --- a/go/test/endtoend/cluster/vtctldclient_process.go +++ b/go/test/endtoend/cluster/vtctldclient_process.go @@ -19,6 +19,7 @@ package cluster import ( "fmt" "os/exec" + "slices" "strings" "time" @@ -35,8 +36,7 @@ import ( // VtctldClientProcess is a generic handle for a running vtctldclient command . // It can be spawned manually type VtctldClientProcess struct { - Name string - Binary string + VtProcess Server string TempDirectory string ZoneName string @@ -44,6 +44,25 @@ type VtctldClientProcess struct { Quiet bool } +// VtctldClientProcessInstance returns a VtctldClientProcess handle +// configured with the given Config. +// The process must be manually started by calling setup() +func VtctldClientProcessInstance(grpcPort int, topoPort int, hostname string, tmpDirectory string) *VtctldClientProcess { + version, err := GetMajorVersion("vtctld") // `vtctldclient` does not have a --version flag, so we assume both vtctl/vtctldclient have the same version + if err != nil { + log.Warningf("failed to get major vtctldclient version; interop with CLI changes for VEP-4 may not work: %s", err) + } + + base := VtProcessInstance("vtctldclient", "vtctldclient", topoPort, hostname) + vtctldclient := &VtctldClientProcess{ + VtProcess: base, + Server: fmt.Sprintf("%s:%d", hostname, grpcPort), + TempDirectory: tmpDirectory, + VtctldClientMajorVersion: version, + } + return vtctldclient +} + // ExecuteCommand executes any vtctldclient command func (vtctldclient *VtctldClientProcess) ExecuteCommand(args ...string) (err error) { output, err := vtctldclient.ExecuteCommandWithOutput(args...) @@ -55,14 +74,24 @@ func (vtctldclient *VtctldClientProcess) ExecuteCommand(args ...string) (err err return err } -// ExecuteCommandWithOutput executes any vtctldclient command and returns output +// ExecuteCommandWithOutput executes any vtctldclient command and returns output. func (vtctldclient *VtctldClientProcess) ExecuteCommandWithOutput(args ...string) (string, error) { var resultByte []byte var resultStr string var err error retries := 10 retryDelay := 1 * time.Second - pArgs := []string{"--server", vtctldclient.Server} + pArgs := []string{ + // These are needed to support --server=internal and are otherwise + // ignored/unused. + "--topo-implementation", vtctldclient.TopoImplementation, + "--topo-global-server-address", vtctldclient.TopoGlobalAddress, + "--topo-global-root", vtctldclient.TopoGlobalRoot, + } + if !slices.Contains(args, "--server") { + // Only add the default server if one was not already specified. + pArgs = append(pArgs, "--server", vtctldclient.Server) + } if *isCoverage { pArgs = append(pArgs, "--test.coverprofile="+getCoveragePath("vtctldclient-"+args[0]+".out"), "--test.v") } @@ -70,7 +99,7 @@ func (vtctldclient *VtctldClientProcess) ExecuteCommandWithOutput(args ...string for i := range retries { tmpProcess := exec.Command( vtctldclient.Binary, - filterDoubleDashArgs(pArgs, vtctldclient.VtctldClientMajorVersion)..., + pArgs..., ) msg := binlogplayer.LimitString(strings.Join(tmpProcess.Args, " "), 256) // limit log line length if !vtctldclient.Quiet { @@ -86,22 +115,19 @@ func (vtctldclient *VtctldClientProcess) ExecuteCommandWithOutput(args ...string return filterResultWhenRunsForCoverage(resultStr), err } -// VtctldClientProcessInstance returns a VtctldProcess handle for vtctldclient process -// configured with the given Config. -func VtctldClientProcessInstance(hostname string, grpcPort int, tmpDirectory string) *VtctldClientProcess { - version, err := GetMajorVersion("vtctld") // `vtctldclient` does not have a --version flag, so we assume both vtctl/vtctldclient have the same version - if err != nil { - log.Warningf("failed to get major vtctldclient version; interop with CLI changes for VEP-4 may not work: %s", err) - } - - vtctldclient := &VtctldClientProcess{ - Name: "vtctldclient", - Binary: "vtctldclient", - Server: fmt.Sprintf("%s:%d", hostname, grpcPort), - TempDirectory: tmpDirectory, - VtctldClientMajorVersion: version, +// AddCellInfo executes the vtctldclient command to add cell info. +// It uses --server=internal as there may not yet be a vtctld running +// as we need to create a cell for vtctld to use first. +func (vtctldclient *VtctldClientProcess) AddCellInfo(Cell string) error { + args := []string{ + "--server", "internal", + "AddCellInfo", + "--root", vtctldclient.TopoRootPath + Cell, + "--server-address", vtctldclient.TopoServerAddress, + Cell, } - return vtctldclient + _, err := vtctldclient.ExecuteCommandWithOutput(args...) + return err } // ApplyRoutingRules applies the given routing rules. @@ -233,16 +259,17 @@ func (vtctldclient *VtctldClientProcess) InitShardPrimary(keyspace string, shard return err } -// CreateKeyspace executes the vtctl command to create a keyspace -func (vtctldclient *VtctldClientProcess) CreateKeyspace(keyspaceName string, sidecarDBName string) (err error) { +// CreateKeyspace executes the vtctldclient command to create a keyspace +func (vtctldclient *VtctldClientProcess) CreateKeyspace(keyspaceName string, sidecarDBName string, durabilityPolicy string) (err error) { var output string - // For upgrade/downgrade tests where an older version is also used. - if vtctldclient.VtctldClientMajorVersion < 17 { - log.Errorf("CreateKeyspace does not support the --sidecar-db-name flag in vtctl version %d; ignoring...", vtctldclient.VtctldClientMajorVersion) - output, err = vtctldclient.ExecuteCommandWithOutput("CreateKeyspace", keyspaceName) - } else { - output, err = vtctldclient.ExecuteCommandWithOutput("CreateKeyspace", keyspaceName, "--sidecar-db-name", sidecarDBName) + args := []string{ + "CreateKeyspace", keyspaceName, + "--sidecar-db-name", sidecarDBName, + } + if durabilityPolicy != "" { + args = append(args, "--durability-policy", durabilityPolicy) } + output, err = vtctldclient.ExecuteCommandWithOutput(args...) if err != nil { log.Errorf("CreateKeyspace returned err: %s, output: %s", err, output) } @@ -314,3 +341,10 @@ func (vtctldclient *VtctldClientProcess) OnlineDDLShow(keyspace, workflow string workflow, ) } + +// shouldRetry tells us if the command should be retried based on the results/output +// -- meaning that it is likely an ephemeral or recoverable issue that is likely to +// succeed when retried. +func shouldRetry(cmdResults string) bool { + return strings.Contains(cmdResults, "Deadlock found when trying to get lock; try restarting transaction") +} diff --git a/go/test/endtoend/cluster/vtgate_process.go b/go/test/endtoend/cluster/vtgate_process.go index 2adbdf13250..53b8b6152e8 100644 --- a/go/test/endtoend/cluster/vtgate_process.go +++ b/go/test/endtoend/cluster/vtgate_process.go @@ -40,9 +40,7 @@ import ( // VtgateProcess is a generic handle for a running vtgate . // It can be spawned manually type VtgateProcess struct { - Name string - Binary string - CommonArg VtctlProcess + VtProcess LogDir string ErrorLog string FileToLogQueries string @@ -149,9 +147,9 @@ const defaultVtGatePlannerVersion = planbuilder.Gen4 // Setup starts Vtgate process with required arguements func (vtgate *VtgateProcess) Setup() (err error) { args := []string{ - "--topo_implementation", vtgate.CommonArg.TopoImplementation, - "--topo_global_server_address", vtgate.CommonArg.TopoGlobalAddress, - "--topo_global_root", vtgate.CommonArg.TopoGlobalRoot, + "--topo_implementation", vtgate.TopoImplementation, + "--topo_global_server_address", vtgate.TopoGlobalAddress, + "--topo_global_root", vtgate.TopoGlobalRoot, "--config-file", vtgate.ConfigFile, "--log_dir", vtgate.LogDir, "--log_queries_to_file", vtgate.FileToLogQueries, @@ -374,10 +372,9 @@ func VtgateProcessInstance( extraArgs []string, plannerVersion plancontext.PlannerVersion, ) *VtgateProcess { - vtctl := VtctlProcessInstance(topoPort, hostname) + base := VtProcessInstance("vtgate", "vtgate", topoPort, hostname) vtgate := &VtgateProcess{ - Name: "vtgate", - Binary: "vtgate", + VtProcess: base, FileToLogQueries: path.Join(tmpDirectory, "/vtgate_querylog.txt"), ConfigFile: path.Join(tmpDirectory, fmt.Sprintf("vtgate-config-%d.json", port)), Directory: os.Getenv("VTDATAROOT"), @@ -390,7 +387,6 @@ func VtgateProcessInstance( Cell: cell, CellsToWatch: cellsToWatch, TabletTypesToWait: tabletTypesToWait, - CommonArg: *vtctl, MySQLAuthServerImpl: "none", ExtraArgs: extraArgs, PlannerVersion: plannerVersion, diff --git a/go/test/endtoend/cluster/vtorc_process.go b/go/test/endtoend/cluster/vtorc_process.go index af101a8bebd..4d726241756 100644 --- a/go/test/endtoend/cluster/vtorc_process.go +++ b/go/test/endtoend/cluster/vtorc_process.go @@ -36,7 +36,7 @@ import ( // VTOrcProcess is a test struct for running // vtorc as a separate process for testing type VTOrcProcess struct { - VtctlProcess + VtProcess Port int LogDir string LogFileName string @@ -83,7 +83,6 @@ func (orc *VTOrcProcess) RewriteConfiguration() error { // Setup starts orc process with required arguements func (orc *VTOrcProcess) Setup() (err error) { - // create the configuration file timeNow := time.Now().UnixNano() err = os.MkdirAll(orc.LogDir, 0755) diff --git a/go/test/endtoend/cluster/vttablet_process.go b/go/test/endtoend/cluster/vttablet_process.go index 6bc6e6b8d7f..65c6fbeec26 100644 --- a/go/test/endtoend/cluster/vttablet_process.go +++ b/go/test/endtoend/cluster/vttablet_process.go @@ -47,8 +47,7 @@ const vttabletStateTimeout = 60 * time.Second // VttabletProcess is a generic handle for a running vttablet . // It can be spawned manually type VttabletProcess struct { - Name string - Binary string + VtProcess FileToLogQueries string TabletUID int TabletPath string @@ -56,7 +55,6 @@ type VttabletProcess struct { Port int GrpcPort int Shard string - CommonArg VtctlProcess LogDir string ErrorLog string TabletHostname string @@ -93,9 +91,9 @@ type VttabletProcess struct { func (vttablet *VttabletProcess) Setup() (err error) { vttablet.proc = exec.Command( vttablet.Binary, - "--topo_implementation", vttablet.CommonArg.TopoImplementation, - "--topo_global_server_address", vttablet.CommonArg.TopoGlobalAddress, - "--topo_global_root", vttablet.CommonArg.TopoGlobalRoot, + "--topo_implementation", vttablet.TopoImplementation, + "--topo_global_server_address", vttablet.TopoGlobalAddress, + "--topo_global_root", vttablet.TopoGlobalRoot, "--log_queries_to_file", vttablet.FileToLogQueries, "--tablet-path", vttablet.TabletPath, "--port", fmt.Sprintf("%d", vttablet.Port), @@ -717,10 +715,9 @@ func (vttablet *VttabletProcess) IsShutdown() bool { // configured with the given Config. // The process must be manually started by calling setup() func VttabletProcessInstance(port, grpcPort, tabletUID int, cell, shard, keyspace string, vtctldPort int, tabletType string, topoPort int, hostname, tmpDirectory string, extraArgs []string, charset string) *VttabletProcess { - vtctl := VtctlProcessInstance(topoPort, hostname) + base := VtProcessInstance("vttablet", "vttablet", topoPort, hostname) vttablet := &VttabletProcess{ - Name: "vttablet", - Binary: "vttablet", + VtProcess: base, FileToLogQueries: path.Join(tmpDirectory, fmt.Sprintf("/vt_%010d_querylog.txt", tabletUID)), Directory: path.Join(os.Getenv("VTDATAROOT"), fmt.Sprintf("/vt_%010d", tabletUID)), Cell: cell, @@ -731,7 +728,6 @@ func VttabletProcessInstance(port, grpcPort, tabletUID int, cell, shard, keyspac TabletHostname: hostname, Keyspace: keyspace, TabletType: "replica", - CommonArg: *vtctl, HealthCheckInterval: 5, Port: port, GrpcPort: grpcPort, diff --git a/go/test/endtoend/docker/vttestserver_test.go b/go/test/endtoend/docker/vttestserver_test.go index e34be52accf..4cbe5cdf0fc 100644 --- a/go/test/endtoend/docker/vttestserver_test.go +++ b/go/test/endtoend/docker/vttestserver_test.go @@ -140,8 +140,8 @@ func TestVtctldCommands(t *testing.T) { err = vtest.waitUntilDockerHealthy(10) require.NoError(t, err) - vtctldClient := cluster.VtctldClientProcessInstance("localhost", vtest.basePort+1, os.TempDir()) - res, err := vtctldClient.ExecuteCommandWithOutput("GetKeyspaces") + vtctldClient := cluster.VtctldClientProcessInstance(vtest.basePort+1, 0, "localhost", os.TempDir()) + res, err := vtctldClient.ExecuteCommandWithOutput("--server", "internal", "GetKeyspaces") require.NoError(t, err) // We verify that the command succeeds, and the keyspace name is present in the output. require.Contains(t, res, "long_ks_name") diff --git a/go/test/endtoend/encryption/encryptedreplication/encrypted_replication_test.go b/go/test/endtoend/encryption/encryptedreplication/encrypted_replication_test.go index 460ae310d7f..0d47f8fad4d 100644 --- a/go/test/endtoend/encryption/encryptedreplication/encrypted_replication_test.go +++ b/go/test/endtoend/encryption/encryptedreplication/encrypted_replication_test.go @@ -130,7 +130,7 @@ func initializeCluster(t *testing.T) (int, error) { for _, keyspaceStr := range []string{keyspace} { KeyspacePtr := &cluster.Keyspace{Name: keyspaceStr} keyspace := *KeyspacePtr - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspace.Name, sidecar.DefaultName, ""); err != nil { + if err := clusterInstance.VtctldClientProcess.CreateKeyspace(keyspace.Name, sidecar.DefaultName, ""); err != nil { return 1, err } shard := &cluster.Shard{ diff --git a/go/test/endtoend/encryption/encryptedtransport/encrypted_transport_test.go b/go/test/endtoend/encryption/encryptedtransport/encrypted_transport_test.go index 86c847125a7..95411536905 100644 --- a/go/test/endtoend/encryption/encryptedtransport/encrypted_transport_test.go +++ b/go/test/endtoend/encryption/encryptedtransport/encrypted_transport_test.go @@ -138,33 +138,30 @@ func TestSecureTransport(t *testing.T) { require.NoError(t, err) } - // setup replication - var vtctlClientArgs []string + // Shared flags. + vtctldClientArgs := []string{"--server", "internal"} + vtctldClientArgs = append(vtctldClientArgs, tmclientExtraArgs("vttablet-client-1")...) - vtctlClientTmArgs := append(vtctlClientArgs, tmclientExtraArgs("vttablet-client-1")...) - - // Reparenting - vtctlClientArgs = append(vtctlClientTmArgs, "InitShardPrimary", "--", "--force", "test_keyspace/0", primaryTablet.Alias) - err = clusterInstance.VtctlProcess.ExecuteCommand(vtctlClientArgs...) + // Reparenting. + vtctlInitArgs := append(vtctldClientArgs, "InitShardPrimary", "--force", "test_keyspace/0", primaryTablet.Alias) + err = clusterInstance.VtctldClientProcess.ExecuteCommand(vtctlInitArgs...) require.NoError(t, err) err = clusterInstance.StartVTOrc("test_keyspace") require.NoError(t, err) - // Apply schema - var vtctlApplySchemaArgs = append(vtctlClientTmArgs, "ApplySchema", "--", "--sql", createVtInsertTest, "test_keyspace") - err = clusterInstance.VtctlProcess.ExecuteCommand(vtctlApplySchemaArgs...) + // Apply schema. + var vtctlApplySchemaArgs = append(vtctldClientArgs, "ApplySchema", "--sql", createVtInsertTest, "test_keyspace") + err = clusterInstance.VtctldClientProcess.ExecuteCommand(vtctlApplySchemaArgs...) require.NoError(t, err) for _, tablet := range []cluster.Vttablet{primaryTablet, replicaTablet} { - var vtctlTabletArgs []string - vtctlTabletArgs = append(vtctlTabletArgs, tmclientExtraArgs("vttablet-client-1")...) - vtctlTabletArgs = append(vtctlTabletArgs, "RunHealthCheck", tablet.Alias) - _, err = clusterInstance.VtctlProcess.ExecuteCommandWithOutput(vtctlTabletArgs...) + vtctlTabletArgs := append(vtctldClientArgs, "RunHealthCheck", tablet.Alias) + _, err = clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput(vtctlTabletArgs...) require.NoError(t, err) } - // start vtgate + // Start vtgate. clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, tabletConnExtraArgs("vttablet-client-1")...) clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, serverExtraArguments("vtgate-server-instance", "vtgate-client")...) err = clusterInstance.StartVtgate() @@ -349,7 +346,7 @@ func clusterSetUp(t *testing.T) (int, error) { for _, keyspaceStr := range []string{keyspace} { KeyspacePtr := &cluster.Keyspace{Name: keyspaceStr} keyspace := *KeyspacePtr - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspace.Name, sidecar.DefaultName, ""); err != nil { + if err := clusterInstance.VtctldClientProcess.CreateKeyspace(keyspace.Name, sidecar.DefaultName, ""); err != nil { return 1, err } shard := &cluster.Shard{ diff --git a/go/test/endtoend/keyspace/keyspace_test.go b/go/test/endtoend/keyspace/keyspace_test.go index e8a11ceed07..dbabfc82d16 100644 --- a/go/test/endtoend/keyspace/keyspace_test.go +++ b/go/test/endtoend/keyspace/keyspace_test.go @@ -97,7 +97,7 @@ func TestMain(m *testing.M) { return 1 } - if err := clusterForKSTest.VtctlProcess.AddCellInfo(cell2); err != nil { + if err := clusterForKSTest.VtctldClientProcess.AddCellInfo(cell2); err != nil { return 1 } @@ -139,7 +139,7 @@ func TestMain(m *testing.M) { // TestDurabilityPolicyField tests that the DurabilityPolicy field of a keyspace can be set during creation, read and updated later // from vtctld server and the vtctl binary func TestDurabilityPolicyField(t *testing.T) { - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", clusterForKSTest.VtctldProcess.GrpcPort, clusterForKSTest.TmpDirectory) + vtctldClientProcess := clusterForKSTest.NewVtctldClientProcessInstance("localhost", clusterForKSTest.VtctldProcess.GrpcPort, clusterForKSTest.TmpDirectory) out, err := vtctldClientProcess.ExecuteCommandWithOutput("CreateKeyspace", "ks_durability", "--durability-policy=semi_sync") require.NoError(t, err, out) @@ -218,7 +218,7 @@ func TestGetKeyspace(t *testing.T) { } func TestDeleteKeyspace(t *testing.T) { - _ = clusterForKSTest.VtctldClientProcess.CreateKeyspace("test_delete_keyspace", sidecar.DefaultName) + _ = clusterForKSTest.VtctldClientProcess.CreateKeyspace("test_delete_keyspace", sidecar.DefaultName, "") _ = clusterForKSTest.VtctldClientProcess.ExecuteCommand("CreateShard", "test_delete_keyspace/0") _ = clusterForKSTest.InitTablet(&cluster.Vttablet{ Type: "primary", @@ -240,7 +240,7 @@ func TestDeleteKeyspace(t *testing.T) { _ = clusterForKSTest.VtctldClientProcess.ExecuteCommand("DeleteKeyspace", "test_delete_keyspace") // Start over and this time use recursive DeleteKeyspace to do everything. - _ = clusterForKSTest.VtctldClientProcess.CreateKeyspace("test_delete_keyspace", sidecar.DefaultName) + _ = clusterForKSTest.VtctldClientProcess.CreateKeyspace("test_delete_keyspace", sidecar.DefaultName, "") _ = clusterForKSTest.VtctldClientProcess.ExecuteCommand("CreateShard", "test_delete_keyspace/0") _ = clusterForKSTest.InitTablet(&cluster.Vttablet{ Type: "primary", diff --git a/go/test/endtoend/messaging/message_test.go b/go/test/endtoend/messaging/message_test.go index e91a8dcc335..7dbef603417 100644 --- a/go/test/endtoend/messaging/message_test.go +++ b/go/test/endtoend/messaging/message_test.go @@ -84,7 +84,7 @@ func TestMessage(t *testing.T) { utils.Exec(t, conn, fmt.Sprintf("use %s", lookupKeyspace)) utils.Exec(t, conn, createMessage) - clusterInstance.VtctlProcess.ExecuteCommand(fmt.Sprintf("ReloadSchemaKeyspace %s", lookupKeyspace)) + clusterInstance.VtctldClientProcess.ExecuteCommand(fmt.Sprintf("ReloadSchemaKeyspace %s", lookupKeyspace)) defer utils.Exec(t, conn, "drop table vitess_message") diff --git a/go/test/endtoend/mysqlctl/mysqlctl_test.go b/go/test/endtoend/mysqlctl/mysqlctl_test.go index 070114da420..f5f08bf98e9 100644 --- a/go/test/endtoend/mysqlctl/mysqlctl_test.go +++ b/go/test/endtoend/mysqlctl/mysqlctl_test.go @@ -52,7 +52,7 @@ func TestMain(m *testing.M) { return 1 } - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { + if err := clusterInstance.VtctldClientProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { return 1 } diff --git a/go/test/endtoend/mysqlctld/mysqlctld_test.go b/go/test/endtoend/mysqlctld/mysqlctld_test.go index 432beb0c6d5..3d4b8e70a76 100644 --- a/go/test/endtoend/mysqlctld/mysqlctld_test.go +++ b/go/test/endtoend/mysqlctld/mysqlctld_test.go @@ -56,7 +56,7 @@ func TestMain(m *testing.M) { return 1 } - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { + if err := clusterInstance.VtctldClientProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { return 1 } diff --git a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go index 5f6423b2556..8547431ddd3 100644 --- a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go +++ b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go @@ -714,6 +714,89 @@ func testScheduler(t *testing.T) { } }) }) + t.Run("force_cutover mdl", func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), extendedWaitTime*5) + defer cancel() + + t1uuid = testOnlineDDLStatement(t, createParams(trivialAlterT1Statement, ddlStrategy+" --postpone-completion", "vtgate", "", "", true)) // skip wait + + t.Run("wait for t1 running", func(t *testing.T) { + status := onlineddl.WaitForMigrationStatus(t, &vtParams, shards, t1uuid, normalWaitTime, schema.OnlineDDLStatusRunning) + fmt.Printf("# Migration status (for debug purposes): <%s>\n", status) + }) + t.Run("wait for t1 ready to complete", func(t *testing.T) { + // Waiting for 'running', above, is not enough. We want to let vreplication a chance to start running, or else + // we attempt the cut-over too early. Specifically in this test, we're going to lock rows FOR UPDATE, which, + // if vreplication does not get the chance to start, will prevent it from doing anything at all. + // ready_to_complete is a great signal for us that vreplication is healthy and up to date. + waitForReadyToComplete(t, t1uuid, true) + }) + + conn, err := primaryTablet.VttabletProcess.TabletConn(keyspaceName, true) + require.NoError(t, err) + defer conn.Close() + + unlockTables := func() error { + _, err := conn.ExecuteFetch("unlock tables", 0, false) + return err + } + t.Run("locking table", func(t *testing.T) { + _, err := conn.ExecuteFetch("lock tables t1_test write", 0, false) + require.NoError(t, err) + }) + defer unlockTables() + t.Run("injecting heartbeats asynchronously", func(t *testing.T) { + go func() { + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + for { + throttler.CheckThrottler(clusterInstance, primaryTablet, throttlerapp.OnlineDDLName, nil) + select { + case <-ticker.C: + case <-ctx.Done(): + return + } + } + }() + }) + t.Run("check no force_cutover", func(t *testing.T) { + rs := onlineddl.ReadMigrations(t, &vtParams, t1uuid) + require.NotNil(t, rs) + for _, row := range rs.Named().Rows { + forceCutOver := row.AsInt64("force_cutover", 0) + assert.Equal(t, int64(0), forceCutOver) // disabled + } + }) + t.Run("attempt to complete", func(t *testing.T) { + onlineddl.CheckCompleteMigration(t, &vtParams, shards, t1uuid, true) + }) + t.Run("cut-over fail due to timeout", func(t *testing.T) { + waitForMessage(t, t1uuid, "(errno 3024) (sqlstate HY000): Query execution was interrupted, maximum statement execution time exceeded") + status := onlineddl.WaitForMigrationStatus(t, &vtParams, shards, t1uuid, normalWaitTime, schema.OnlineDDLStatusComplete, schema.OnlineDDLStatusFailed, schema.OnlineDDLStatusRunning) + fmt.Printf("# Migration status (for debug purposes): <%s>\n", status) + onlineddl.CheckMigrationStatus(t, &vtParams, shards, t1uuid, schema.OnlineDDLStatusRunning) + }) + t.Run("force_cutover", func(t *testing.T) { + onlineddl.CheckForceMigrationCutOver(t, &vtParams, shards, t1uuid, true) + }) + t.Run("check force_cutover", func(t *testing.T) { + rs := onlineddl.ReadMigrations(t, &vtParams, t1uuid) + require.NotNil(t, rs) + for _, row := range rs.Named().Rows { + forceCutOver := row.AsInt64("force_cutover", 0) + assert.Equal(t, int64(1), forceCutOver) // enabled + } + }) + t.Run("expect completion", func(t *testing.T) { + status := onlineddl.WaitForMigrationStatus(t, &vtParams, shards, t1uuid, normalWaitTime, schema.OnlineDDLStatusComplete, schema.OnlineDDLStatusFailed) + fmt.Printf("# Migration status (for debug purposes): <%s>\n", status) + onlineddl.CheckMigrationStatus(t, &vtParams, shards, t1uuid, schema.OnlineDDLStatusComplete) + }) + t.Run("expect unlock failure", func(t *testing.T) { + err := unlockTables() + assert.ErrorContains(t, err, "broken pipe") + }) + }) } t.Run("ALTER both tables non-concurrent", func(t *testing.T) { t1uuid = testOnlineDDLStatement(t, createParams(trivialAlterT1Statement, ddlStrategy, "vtgate", "", "", true)) // skip wait diff --git a/go/test/endtoend/recovery/recovery_util.go b/go/test/endtoend/recovery/recovery_util.go index cffae6a5005..f862b30a9b3 100644 --- a/go/test/endtoend/recovery/recovery_util.go +++ b/go/test/endtoend/recovery/recovery_util.go @@ -55,16 +55,16 @@ func RestoreTablet(t *testing.T, localCluster *cluster.LocalProcessCluster, tabl tablet.ValidateTabletRestart(t) replicaTabletArgs := commonTabletArg - _, err := localCluster.VtctlProcess.ExecuteCommandWithOutput("GetKeyspace", restoreKSName) + _, err := localCluster.VtctldClientProcess.ExecuteCommandWithOutput("GetKeyspace", restoreKSName) if restoreTime.IsZero() { restoreTime = time.Now().UTC() } if err != nil { - _, err := localCluster.VtctlProcess.ExecuteCommandWithOutput("CreateKeyspace", "--", - "--keyspace_type=SNAPSHOT", "--base_keyspace="+keyspaceName, - "--snapshot_time", restoreTime.Format(time.RFC3339), restoreKSName) + _, err := localCluster.VtctldClientProcess.ExecuteCommandWithOutput("CreateKeyspace", restoreKSName, + "--type=SNAPSHOT", "--base-keyspace="+keyspaceName, + "--snapshot-timestamp", restoreTime.Format(time.RFC3339)) require.Nil(t, err) } diff --git a/go/test/endtoend/recovery/unshardedrecovery/recovery.go b/go/test/endtoend/recovery/unshardedrecovery/recovery.go index ae6b152271b..0d3c38a50f7 100644 --- a/go/test/endtoend/recovery/unshardedrecovery/recovery.go +++ b/go/test/endtoend/recovery/unshardedrecovery/recovery.go @@ -158,7 +158,7 @@ func TestMainImpl(m *testing.M) { } } - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", localCluster.VtctldProcess.GrpcPort, localCluster.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(localCluster.VtctldProcess.GrpcPort, localCluster.TopoPort, "localhost", localCluster.TmpDirectory) _, err = vtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspaceName, "--durability-policy=semi_sync") if err != nil { return 1, err diff --git a/go/test/endtoend/reparent/emergencyreparent/ers_test.go b/go/test/endtoend/reparent/emergencyreparent/ers_test.go index 37855a47df6..f2febf9e27f 100644 --- a/go/test/endtoend/reparent/emergencyreparent/ers_test.go +++ b/go/test/endtoend/reparent/emergencyreparent/ers_test.go @@ -48,8 +48,8 @@ func TestTrivialERS(t *testing.T) { } // We should do the same for vtctl binary for i := 1; i <= 4; i++ { - out, err := utils.ErsWithVtctl(clusterInstance) - log.Infof("ERS-vtctl loop %d. EmergencyReparentShard Output: %v", i, out) + out, err := utils.ErsWithVtctldClient(clusterInstance) + log.Infof("ERS-vtctldclient loop %d. EmergencyReparentShard Output: %v", i, out) require.NoError(t, err) time.Sleep(5 * time.Second) } @@ -396,7 +396,7 @@ func TestERSForInitialization(t *testing.T) { err = clusterInstance.SetupCluster(keyspace, []cluster.Shard{*shard}) require.NoError(t, err) if clusterInstance.VtctlMajorVersion >= 14 { - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TopoPort, "localhost", clusterInstance.TmpDirectory) out, err := vtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspace.Name, "--durability-policy=semi_sync") require.NoError(t, err, out) } diff --git a/go/test/endtoend/reparent/utils/utils.go b/go/test/endtoend/reparent/utils/utils.go index 5fa06c9be4c..521e17606ce 100644 --- a/go/test/endtoend/reparent/utils/utils.go +++ b/go/test/endtoend/reparent/utils/utils.go @@ -155,7 +155,7 @@ func setupCluster(ctx context.Context, t *testing.T, shardName string, cells []s require.NoError(t, err, "Error managing topo") numCell := 1 for numCell < len(cells) { - err = clusterInstance.VtctlProcess.AddCellInfo(cells[numCell]) + err = clusterInstance.VtctldClientProcess.AddCellInfo(cells[numCell]) require.NoError(t, err, "Error managing topo") numCell++ } @@ -209,7 +209,7 @@ func setupCluster(ctx context.Context, t *testing.T, shardName string, cells []s } } if clusterInstance.VtctlMajorVersion >= 14 { - clusterInstance.VtctldClientProcess = *cluster.VtctldClientProcessInstance("localhost", clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TmpDirectory) + clusterInstance.VtctldClientProcess = *cluster.VtctldClientProcessInstance(clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TopoPort, "localhost", clusterInstance.TmpDirectory) out, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", KeyspaceName, fmt.Sprintf("--durability-policy=%s", durability)) require.NoError(t, err, out) } @@ -407,10 +407,10 @@ func ErsIgnoreTablet(clusterInstance *cluster.LocalProcessCluster, tab *cluster. return clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput(args...) } -// ErsWithVtctl runs ERS via vtctl binary -func ErsWithVtctl(clusterInstance *cluster.LocalProcessCluster) (string, error) { - args := []string{"EmergencyReparentShard", "--", "--keyspace_shard", fmt.Sprintf("%s/%s", KeyspaceName, ShardName)} - return clusterInstance.VtctlProcess.ExecuteCommandWithOutput(args...) +// ErsWithVtctldClient runs ERS via a vtctldclient binary. +func ErsWithVtctldClient(clusterInstance *cluster.LocalProcessCluster) (string, error) { + args := []string{"EmergencyReparentShard", fmt.Sprintf("%s/%s", KeyspaceName, ShardName)} + return clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput(args...) } // endregion diff --git a/go/test/endtoend/sharded/sharded_keyspace_test.go b/go/test/endtoend/sharded/sharded_keyspace_test.go index ba7884de40f..1170609f62e 100644 --- a/go/test/endtoend/sharded/sharded_keyspace_test.go +++ b/go/test/endtoend/sharded/sharded_keyspace_test.go @@ -83,7 +83,7 @@ func TestMain(m *testing.M) { if err := clusterInstance.StartTopo(); err != nil { return 1, err } - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { + if err := clusterInstance.VtctldClientProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { return 1, err } @@ -147,10 +147,10 @@ func TestShardedKeyspace(t *testing.T) { require.Nil(t, err) assert.Equal(t, `[[INT64(1) VARCHAR("test 1")]]`, fmt.Sprintf("%v", rows.Rows)) - err = clusterInstance.VtctlclientProcess.ExecuteCommand("ValidateSchemaShard", fmt.Sprintf("%s/%s", keyspaceName, shard1.Name)) + err = clusterInstance.VtctldClientProcess.ExecuteCommand("ValidateSchemaShard", fmt.Sprintf("%s/%s", keyspaceName, shard1.Name)) require.Nil(t, err) - err = clusterInstance.VtctlclientProcess.ExecuteCommand("ValidateSchemaShard", fmt.Sprintf("%s/%s", keyspaceName, shard1.Name)) + err = clusterInstance.VtctldClientProcess.ExecuteCommand("ValidateSchemaShard", fmt.Sprintf("%s/%s", keyspaceName, shard1.Name)) require.Nil(t, err) output, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("ValidateSchemaKeyspace", keyspaceName) @@ -166,9 +166,9 @@ func TestShardedKeyspace(t *testing.T) { require.Nil(t, err) err = clusterInstance.VtctldClientProcess.ExecuteCommand("GetPermissions", shard1.Vttablets[1].Alias) require.Nil(t, err) - err = clusterInstance.VtctlclientProcess.ExecuteCommand("ValidatePermissionsShard", fmt.Sprintf("%s/%s", keyspaceName, shard1.Name)) + err = clusterInstance.VtctldClientProcess.ExecuteCommand("ValidatePermissionsShard", fmt.Sprintf("%s/%s", keyspaceName, shard1.Name)) require.Nil(t, err) - err = clusterInstance.VtctlclientProcess.ExecuteCommand("ValidatePermissionsKeyspace", keyspaceName) + err = clusterInstance.VtctldClientProcess.ExecuteCommand("ValidatePermissionsKeyspace", keyspaceName) require.Nil(t, err) rows, err = shard1Primary.VttabletProcess.QueryTablet("select id, msg from vt_select_test order by id", keyspaceName, true) diff --git a/go/test/endtoend/tabletmanager/custom_rule_topo_test.go b/go/test/endtoend/tabletmanager/custom_rule_topo_test.go index e692bf94de4..c393e7c4646 100644 --- a/go/test/endtoend/tabletmanager/custom_rule_topo_test.go +++ b/go/test/endtoend/tabletmanager/custom_rule_topo_test.go @@ -54,7 +54,7 @@ func TestTopoCustomRule(t *testing.T) { require.NoError(t, err) // Copy config file into topo. - err = clusterInstance.VtctlclientProcess.ExecuteCommand("TopoCp", "--", "--to_topo", topoCustomRuleFile, topoCustomRulePath) + err = clusterInstance.VtctldClientProcess.ExecuteCommand("--server", "internal", "WriteTopologyPath", topoCustomRuleFile, topoCustomRulePath) require.Nil(t, err, "error should be Nil") // Set extra tablet args for topo custom rule @@ -100,7 +100,7 @@ func TestTopoCustomRule(t *testing.T) { err = os.WriteFile(topoCustomRuleFile, data, 0777) require.NoError(t, err) - err = clusterInstance.VtctlclientProcess.ExecuteCommand("TopoCp", "--", "--to_topo", topoCustomRuleFile, topoCustomRulePath) + err = clusterInstance.VtctldClientProcess.ExecuteCommand("--server", "internal", "WriteTopologyPath", topoCustomRuleFile, topoCustomRulePath) require.Nil(t, err, "error should be Nil") // And wait until the query fails with the right error. diff --git a/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go b/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go index 226238a46c6..48b341bf449 100644 --- a/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go +++ b/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go @@ -154,7 +154,7 @@ func TestMain(m *testing.M) { Host: clusterInstance.Hostname, Port: clusterInstance.VtgateMySQLPort, } - clusterInstance.VtctldClientProcess = *cluster.VtctldClientProcessInstance("localhost", clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TmpDirectory) + clusterInstance.VtctldClientProcess = *cluster.VtctldClientProcessInstance(clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TopoPort, "localhost", clusterInstance.TmpDirectory) return m.Run() }() diff --git a/go/test/endtoend/topoconncache/main_test.go b/go/test/endtoend/topoconncache/main_test.go index 074bf875165..512998a3769 100644 --- a/go/test/endtoend/topoconncache/main_test.go +++ b/go/test/endtoend/topoconncache/main_test.go @@ -116,12 +116,12 @@ func TestMain(m *testing.M) { if err != nil { return 1, err } - err = clusterInstance.VtctlProcess.AddCellInfo(cell2) + err = clusterInstance.VtctldClientProcess.AddCellInfo(cell2) if err != nil { return 1, err } - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TopoPort, "localhost", clusterInstance.TmpDirectory) _, err = vtctldClientProcess.ExecuteCommandWithOutput("CreateKeyspace", keyspaceName, "--durability-policy=semi_sync") if err != nil { return 1, err diff --git a/go/test/endtoend/topoconncache/topo_conn_cache_test.go b/go/test/endtoend/topoconncache/topo_conn_cache_test.go index f676af318cd..edd40226ed8 100644 --- a/go/test/endtoend/topoconncache/topo_conn_cache_test.go +++ b/go/test/endtoend/topoconncache/topo_conn_cache_test.go @@ -116,9 +116,9 @@ func deleteTablet(t *testing.T, tablet *cluster.Vttablet) { func addCellback(t *testing.T) { // creating new cell , with same name as previously deleted one but at a different root path. - clusterInstance.VtctlProcess.TopoRootPath = "/org1/obj1/" + clusterInstance.VtctldClientProcess.TopoRootPath = "/org1/obj1/" - err := clusterInstance.VtctlProcess.AddCellInfo(cell2) + err := clusterInstance.VtctldClientProcess.AddCellInfo(cell2) require.NoError(t, err) // create new vttablets diff --git a/go/test/endtoend/topotest/consul/main_test.go b/go/test/endtoend/topotest/consul/main_test.go index c6d48f44930..b71551dc6b7 100644 --- a/go/test/endtoend/topotest/consul/main_test.go +++ b/go/test/endtoend/topotest/consul/main_test.go @@ -143,7 +143,7 @@ func TestTopoRestart(t *testing.T) { // TestShardLocking tests that shard locking works as intended. func TestShardLocking(t *testing.T) { // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) // Acquire a shard lock. @@ -185,7 +185,7 @@ func TestShardLocking(t *testing.T) { // TestKeyspaceLocking tests that keyspace locking works as intended. func TestKeyspaceLocking(t *testing.T) { // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) // Acquire a keyspace lock. diff --git a/go/test/endtoend/topotest/etcd2/main_test.go b/go/test/endtoend/topotest/etcd2/main_test.go index ee2b542109b..b274219b41a 100644 --- a/go/test/endtoend/topotest/etcd2/main_test.go +++ b/go/test/endtoend/topotest/etcd2/main_test.go @@ -122,7 +122,7 @@ func TestTopoDownServingQuery(t *testing.T) { // TestShardLocking tests that shard locking works as intended. func TestShardLocking(t *testing.T) { // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) // Acquire a shard lock. @@ -164,7 +164,7 @@ func TestShardLocking(t *testing.T) { // TestKeyspaceLocking tests that keyspace locking works as intended. func TestKeyspaceLocking(t *testing.T) { // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) // Acquire a keyspace lock. @@ -203,7 +203,7 @@ func TestKeyspaceLocking(t *testing.T) { // TestLockingWithTTL tests that locking with the TTL override works as intended. func TestLockingWithTTL(t *testing.T) { // Create the topo server connection. - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) ctx := context.Background() @@ -224,7 +224,7 @@ func TestLockingWithTTL(t *testing.T) { // TestNamedLocking tests that named locking works as intended. func TestNamedLocking(t *testing.T) { // Create topo server connection. - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) ctx := context.Background() diff --git a/go/test/endtoend/topotest/zk2/main_test.go b/go/test/endtoend/topotest/zk2/main_test.go index c6569519a3d..95a2fc13894 100644 --- a/go/test/endtoend/topotest/zk2/main_test.go +++ b/go/test/endtoend/topotest/zk2/main_test.go @@ -119,7 +119,7 @@ func TestTopoDownServingQuery(t *testing.T) { // TestShardLocking tests that shard locking works as intended. func TestShardLocking(t *testing.T) { // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) // Acquire a shard lock. @@ -161,7 +161,7 @@ func TestShardLocking(t *testing.T) { // TestKeyspaceLocking tests that keyspace locking works as intended. func TestKeyspaceLocking(t *testing.T) { // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) // Acquire a keyspace lock. diff --git a/go/test/endtoend/vault/vault_test.go b/go/test/endtoend/vault/vault_test.go index aab68159ca3..f1ffbf75357 100644 --- a/go/test/endtoend/vault/vault_test.go +++ b/go/test/endtoend/vault/vault_test.go @@ -243,7 +243,7 @@ func initializeClusterLate(t *testing.T) { err := clusterInstance.SetupCluster(keyspace, []cluster.Shard{*shard}) require.NoError(t, err) - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TopoPort, "localhost", clusterInstance.TmpDirectory) out, err := vtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspaceName, "--durability-policy=semi_sync") require.NoError(t, err, out) diff --git a/go/test/endtoend/vreplication/cluster_test.go b/go/test/endtoend/vreplication/cluster_test.go index dc5a72e5e88..bcf50d43702 100644 --- a/go/test/endtoend/vreplication/cluster_test.go +++ b/go/test/endtoend/vreplication/cluster_test.go @@ -109,8 +109,6 @@ type VitessCluster struct { Cells map[string]*Cell Topo *cluster.TopoProcess Vtctld *cluster.VtctldProcess - Vtctl *cluster.VtctlProcess - VtctlClient *cluster.VtctlClientProcess VtctldClient *cluster.VtctldClientProcess VTOrcProcess *cluster.VTOrcProcess } @@ -166,13 +164,12 @@ func (vc *VitessCluster) StartVTOrc() error { if vc.VTOrcProcess != nil { return nil } - base := cluster.VtctlProcessInstance(vc.ClusterConfig.topoPort, vc.ClusterConfig.hostname) - base.Binary = "vtorc" + base := cluster.VtProcessInstance("vtorc", "vtorc", vc.ClusterConfig.topoPort, vc.ClusterConfig.hostname) vtorcProcess := &cluster.VTOrcProcess{ - VtctlProcess: *base, - LogDir: vc.ClusterConfig.tmpDir, - Config: cluster.VTOrcConfiguration{}, - Port: vc.ClusterConfig.vtorcPort, + VtProcess: base, + LogDir: vc.ClusterConfig.tmpDir, + Config: cluster.VTOrcConfiguration{}, + Port: vc.ClusterConfig.vtorcPort, } err := vtorcProcess.Setup() if err != nil { @@ -385,8 +382,6 @@ func NewVitessCluster(t *testing.T, opts *clusterOptions) *VitessCluster { } vc.setupVtctld() - vc.setupVtctl() - vc.setupVtctlClient() vc.setupVtctldClient() return vc @@ -400,27 +395,17 @@ func (vc *VitessCluster) setupVtctld() { vc.Vtctld.Setup(vc.CellNames[0], extraVtctldArgs...) } -func (vc *VitessCluster) setupVtctl() { - vc.Vtctl = cluster.VtctlProcessInstance(vc.ClusterConfig.topoPort, vc.ClusterConfig.hostname) - require.NotNil(vc.t, vc.Vtctl) +func (vc *VitessCluster) setupVtctldClient() { + vc.VtctldClient = cluster.VtctldClientProcessInstance(vc.ClusterConfig.vtctldGrpcPort, vc.ClusterConfig.topoPort, vc.ClusterConfig.hostname, vc.ClusterConfig.tmpDir) + require.NotNil(vc.t, vc.VtctldClient) for _, cellName := range vc.CellNames { - vc.Vtctl.AddCellInfo(cellName) + vc.VtctldClient.AddCellInfo(cellName) cell, err := vc.AddCell(vc.t, cellName) require.NoError(vc.t, err) require.NotNil(vc.t, cell) } } -func (vc *VitessCluster) setupVtctlClient() { - vc.VtctlClient = cluster.VtctlClientProcessInstance(vc.ClusterConfig.hostname, vc.Vtctld.GrpcPort, vc.ClusterConfig.tmpDir) - require.NotNil(vc.t, vc.VtctlClient) -} - -func (vc *VitessCluster) setupVtctldClient() { - vc.VtctldClient = cluster.VtctldClientProcessInstance(vc.ClusterConfig.hostname, vc.Vtctld.GrpcPort, vc.ClusterConfig.tmpDir) - require.NotNil(vc.t, vc.VtctldClient) -} - // CleanupDataroot deletes the vtdataroot directory. Since we run multiple tests sequentially in a single CI test shard, // we can run out of disk space due to all the leftover artifacts from previous tests. func (vc *VitessCluster) CleanupDataroot(t *testing.T, recreate bool) { @@ -461,7 +446,7 @@ func (vc *VitessCluster) AddKeyspace(t *testing.T, cells []*Cell, ksName string, SidecarDBName: sidecarDBName, } - err := vc.VtctldClient.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName) + err := vc.VtctldClient.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, "") require.NoError(t, err) log.Infof("Applying throttler config for keyspace %s", keyspace.Name) @@ -486,17 +471,17 @@ func (vc *VitessCluster) AddKeyspace(t *testing.T, cells []*Cell, ksName string, require.NoError(t, vc.AddShards(t, cells, keyspace, shards, numReplicas, numRdonly, tabletIDBase, opts)) if schema != "" { - err := vc.VtctlClient.ApplySchema(ksName, schema) + err := vc.VtctldClient.ApplySchema(ksName, schema) require.NoError(t, err) } keyspace.Schema = schema if vschema != "" { - err := vc.VtctlClient.ApplyVSchema(ksName, vschema) + err := vc.VtctldClient.ApplyVSchema(ksName, vschema) require.NoError(t, err) } keyspace.VSchema = vschema - err = vc.VtctlClient.ExecuteCommand("RebuildKeyspaceGraph", ksName) + err = vc.VtctldClient.ExecuteCommand("RebuildKeyspaceGraph", ksName) require.NoError(t, err) return keyspace, nil } @@ -585,7 +570,7 @@ func (vc *VitessCluster) AddShards(t *testing.T, cells []*Cell, keyspace *Keyspa log.Infof("Shard %s already exists, not adding", shardName) } else { log.Infof("Adding Shard %s", shardName) - if err := vc.VtctlClient.ExecuteCommand("CreateShard", keyspace.Name+"/"+shardName); err != nil { + if err := vc.VtctldClient.ExecuteCommand("CreateShard", keyspace.Name+"/"+shardName); err != nil { t.Fatalf("CreateShard command failed with %+v\n", err) } keyspace.Shards[shardName] = shard @@ -684,7 +669,7 @@ func (vc *VitessCluster) AddShards(t *testing.T, cells []*Cell, keyspace *Keyspa } require.NotEqual(t, 0, primaryTabletUID, "Should have created a primary tablet") log.Infof("InitializeShard and make %d primary", primaryTabletUID) - require.NoError(t, vc.VtctlClient.InitializeShard(keyspace.Name, shardName, cells[0].Name, primaryTabletUID)) + require.NoError(t, vc.VtctldClient.InitializeShard(keyspace.Name, shardName, cells[0].Name, primaryTabletUID)) log.Infof("Finished creating shard %s", shard.Name) } @@ -721,7 +706,7 @@ func (vc *VitessCluster) AddShards(t *testing.T, cells []*Cell, keyspace *Keyspa } } - err := vc.VtctlClient.ExecuteCommand("RebuildKeyspaceGraph", keyspace.Name) + err := vc.VtctldClient.ExecuteCommand("RebuildKeyspaceGraph", keyspace.Name) require.NoError(t, err) log.Infof("Waiting for throttler config to be applied on all shards") @@ -750,7 +735,7 @@ func (vc *VitessCluster) DeleteShard(t testing.TB, cellName string, ksName strin } log.Infof("Deleting Shard %s", shardName) // TODO how can we avoid the use of even_if_serving? - if output, err := vc.VtctlClient.ExecuteCommandWithOutput("DeleteShard", "--", "--recursive", "--even_if_serving", ksName+"/"+shardName); err != nil { + if output, err := vc.VtctldClient.ExecuteCommandWithOutput("DeleteShard", "--recursive", "--even-if-serving", ksName+"/"+shardName); err != nil { t.Fatalf("DeleteShard command failed with error %+v and output %s\n", err, output) } diff --git a/go/test/endtoend/vreplication/config_test.go b/go/test/endtoend/vreplication/config_test.go index 3e7dd08f31c..b856572ab7b 100644 --- a/go/test/endtoend/vreplication/config_test.go +++ b/go/test/endtoend/vreplication/config_test.go @@ -45,12 +45,18 @@ import ( // default collation as it has to work across versions and the 8.0 default does not exist in 5.7. var ( // All standard user tables should have a primary key and at least one secondary key. - customerTypes = []string{"'individual'", "'soho'", "'enterprise'"} + customerTypes = []string{"'individual'", "'soho'", "'enterprise'"} + customerTableTemplate = `create table customer(cid int auto_increment, name varchar(128) collate utf8mb4_bin, meta json default null, + industryCategory varchar(100) generated always as (json_extract(meta, _utf8mb4'$.industry')) virtual, typ enum(%s), + sport set('football','cricket','baseball'), ts timestamp not null default current_timestamp, bits bit(2) default b'11', date1 datetime not null default '0000-00-00 00:00:00', + date2 datetime not null default '2021-00-01 00:00:00', dec80 decimal(8,0), blb blob, primary key(%s), key(name)) CHARSET=utf8mb4` + customerTable = fmt.Sprintf(customerTableTemplate, strings.Join(customerTypes, ","), "cid,typ" /* PK columns */) + // customerTableModifiedPK has a PK on (cid) vs (cid,typ). + customerTableModifiedPK = fmt.Sprintf(customerTableTemplate, strings.Join(customerTypes, ","), "cid" /* PK columns */) + initialProductSchema = fmt.Sprintf(` create table product(pid int, description varbinary(128), date1 datetime not null default '0000-00-00 00:00:00', date2 datetime not null default '2021-00-01 00:00:00', primary key(pid), key(date1,date2)) CHARSET=utf8mb4; -create table customer(cid int auto_increment, name varchar(128) collate utf8mb4_bin, meta json default null, industryCategory varchar(100) generated always as (json_extract(meta, _utf8mb4'$.industry')) virtual, - typ enum(%s), sport set('football','cricket','baseball'), ts timestamp not null default current_timestamp, bits bit(2) default b'11', date1 datetime not null default '0000-00-00 00:00:00', - date2 datetime not null default '2021-00-01 00:00:00', dec80 decimal(8,0), blb blob, primary key(cid,typ), key(name)) CHARSET=utf8mb4; +%s; create table customer_seq(id int, next_id bigint, cache bigint, primary key(id)) comment 'vitess_sequence'; create table merchant(mname varchar(128), category varchar(128), primary key(mname), key(category)) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; create table orders(oid int, cid int, pid int, mname varchar(128), price int, qty int, total int as (qty * price), total2 int as (qty * price) stored, primary key(oid), key(pid), key(cid)) CHARSET=utf8; @@ -69,7 +75,8 @@ create table `+"`blüb_tbl`"+` (id int, val1 varchar(20), `+"`blöb1`"+` blob, create table reftable (id int, val1 varchar(20), primary key(id), key(val1)); create table loadtest (id int, name varchar(256), primary key(id), key(name)); create table nopk (name varchar(128), age int unsigned); -`, strings.Join(customerTypes, ",")) +`, customerTable) + // These should always be ignored in vreplication internalSchema = ` create table _1e275eef_3b20_11eb_a38f_04ed332e05c2_20201210204529_gho(id int, val varbinary(128), primary key(id)); diff --git a/go/test/endtoend/vreplication/migrate_test.go b/go/test/endtoend/vreplication/migrate_test.go index 86b912738bc..ef20d953781 100644 --- a/go/test/endtoend/vreplication/migrate_test.go +++ b/go/test/endtoend/vreplication/migrate_test.go @@ -41,14 +41,17 @@ func insertInitialDataIntoExternalCluster(t *testing.T, conn *mysql.Conn) { }) } -// TestMigrate runs an e2e test for importing from an external cluster using the vtctldclient Mount and Migrate commands. -// We have an anti-pattern in Vitess: vt executables look for an environment variable VTDATAROOT for certain cluster parameters -// like the log directory when they are created. Until this test we just needed a single cluster for e2e tests. -// However now we need to create an external Vitess cluster. For this we need a different VTDATAROOT and -// hence the VTDATAROOT env variable gets overwritten. -// Each time we need to create vt processes in the "other" cluster we need to set the appropriate VTDATAROOT +// TestMigrateUnsharded runs an e2e test for importing from an external cluster using the +// vtctldclient Mount and Migrate commands.We have an anti-pattern in Vitess: vt executables +// look for an environment variable VTDATAROOT for certain cluster parameters like the log +// directory when they are created. Until this test we just needed a single cluster for e2e +// tests. However now we need to create an external Vitess cluster. For this we need a +// different VTDATAROOT and hence the VTDATAROOT env variable gets overwritten. Each time +// we need to create vt processes in the "other" cluster we need to set the appropriate +// VTDATAROOT. func TestMigrateUnsharded(t *testing.T) { vc = NewVitessCluster(t, nil) + defer vc.TearDown() oldDefaultReplicas := defaultReplicas oldDefaultRdonly := defaultRdonly @@ -59,8 +62,6 @@ func TestMigrateUnsharded(t *testing.T) { defaultRdonly = oldDefaultRdonly }() - defer vc.TearDown() - defaultCell := vc.Cells[vc.CellNames[0]] _, err := vc.AddKeyspace(t, []*Cell{defaultCell}, "product", "0", initialProductVSchema, initialProductSchema, defaultReplicas, defaultRdonly, 100, nil) @@ -189,10 +190,10 @@ func TestMigrateUnsharded(t *testing.T) { }) } -// TestVtctldMigrate adds a test for a sharded cluster to validate a fix for a bug where the target keyspace name -// doesn't match that of the source cluster. The test migrates from a cluster with keyspace customer to an "external" -// cluster with keyspace rating. -func TestVtctldMigrateSharded(t *testing.T) { +// TestMigrateSharded adds a test for a sharded cluster to validate a fix for a bug where +// the target keyspace name doesn't match that of the source cluster. The test migrates +// from a cluster with keyspace customer to an "external" cluster with keyspace rating. +func TestMigrateSharded(t *testing.T) { setSidecarDBName("_vt") currentWorkflowType = binlogdatapb.VReplicationWorkflowType_MoveTables oldDefaultReplicas := defaultReplicas diff --git a/go/test/endtoend/vreplication/multi_tenant_test.go b/go/test/endtoend/vreplication/multi_tenant_test.go index 6e73303be8a..2cd908b449f 100644 --- a/go/test/endtoend/vreplication/multi_tenant_test.go +++ b/go/test/endtoend/vreplication/multi_tenant_test.go @@ -91,7 +91,15 @@ type multiTenantMigration struct { } const ( - mtSchema = "create table t1(id int, tenant_id int, primary key(id, tenant_id)) Engine=InnoDB" + // The source/mt schema does not have the tenant_id column in the PK as adding a + // column to a table can be done as an INSTANT operation whereas modifying a table's + // PK requires a full table rebuild. So as a practical matter in production the + // source schema will likely have the tenant_id column, but NOT have it be part of + // the PK. + mtSchema = "create table t1(id int, tenant_id int, primary key(id)) Engine=InnoDB" + // The target/st schema must have the tenant_id column in the PK and the primary + // vindex. + stSchema = "create table t1(id int, tenant_id int, primary key(id, tenant_id)) Engine=InnoDB" mtVSchema = ` { "multi_tenant_spec": { @@ -127,7 +135,6 @@ const ( } } ` - stSchema = mtSchema stVSchema = ` { "tables": { @@ -429,8 +436,11 @@ func (mtm *multiTenantMigration) insertSomeData(t *testing.T, tenantId int64, ke defer closeConn() idx := mtm.getLastID(tenantId) for i := idx + 1; i <= idx+numRows; i++ { + // The source table has a PK on id only, so we have to make the id value + // unique rather than relying on the combination of (id, tenant_id) for + // our uniqueness. execQueryWithRetry(t, vtgateConn, - fmt.Sprintf("insert into %s.t1(id, tenant_id) values(%d, %d)", keyspace, i, tenantId), queryTimeout) + fmt.Sprintf("insert into %s.t1(id, tenant_id) values(%d, %d)", keyspace, i+(tenantId*1e4), tenantId), queryTimeout) } mtm.setLastID(tenantId, idx+numRows) } diff --git a/go/test/endtoend/vreplication/sidecardb_test.go b/go/test/endtoend/vreplication/sidecardb_test.go index 704742d305b..f908d66a2ec 100644 --- a/go/test/endtoend/vreplication/sidecardb_test.go +++ b/go/test/endtoend/vreplication/sidecardb_test.go @@ -51,7 +51,7 @@ func init() { } func prs(t *testing.T, keyspace, shard string) { - _, err := vc.VtctldClient.ExecuteCommandWithOutput("PlannedReparentShard", "--", fmt.Sprintf("%s/%s", keyspace, shard)) + _, err := vc.VtctldClient.ExecuteCommandWithOutput("PlannedReparentShard", fmt.Sprintf("%s/%s", keyspace, shard)) require.NoError(t, err) } diff --git a/go/test/endtoend/vreplication/vdiff2_test.go b/go/test/endtoend/vreplication/vdiff2_test.go index 6116e26eef5..c4bb2efc73a 100644 --- a/go/test/endtoend/vreplication/vdiff2_test.go +++ b/go/test/endtoend/vreplication/vdiff2_test.go @@ -175,6 +175,15 @@ func TestVDiff2(t *testing.T) { require.NoError(t, err) verifyClusterHealth(t, vc) + // Pre-create the customer table on the target keyspace, with the primary key on + // (cid) vs (cid,typ) on the source. This confirms that we are able to properly + // diff the table when the source and target have a different PK definition. + // Remove the 0 date restrictions as the customer table uses them in its DEFAULTs. + execVtgateQuery(t, vtgateConn, targetKs, "set @@session.sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'") + execVtgateQuery(t, vtgateConn, targetKs, customerTableModifiedPK) + // Set the sql_mode back to the default. + execVtgateQuery(t, vtgateConn, targetKs, "set @@session.sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'") + for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { // Primary tablets for any new shards are added in the first cell. diff --git a/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go b/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go index 7a7247b39bf..39b23be8815 100644 --- a/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go +++ b/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go @@ -57,7 +57,7 @@ func TestVtctldclientCLI(t *testing.T) { vc = setupMinimalCluster(t) vttablet.InitVReplicationConfigDefaults() - err = vc.Vtctl.AddCellInfo("zone2") + err = vc.VtctldClient.AddCellInfo("zone2") require.NoError(t, err) zone2, err := vc.AddCell(t, "zone2") require.NoError(t, err) diff --git a/go/test/endtoend/vreplication/vstream_test.go b/go/test/endtoend/vreplication/vstream_test.go index 8079c968ebb..7009bade562 100644 --- a/go/test/endtoend/vreplication/vstream_test.go +++ b/go/test/endtoend/vreplication/vstream_test.go @@ -654,6 +654,8 @@ func TestMultiVStreamsKeyspaceReshard(t *testing.T) { // Confirm that we have shard GTIDs for the global shard and the old/original shards. require.Len(t, newVGTID.GetShardGtids(), 3) + waitForWorkflowState(t, vc, fmt.Sprintf("%s.%s", ks, wf), binlogdatapb.VReplicationWorkflowState_Running.String()) + // Switch the traffic to the new shards. reshardAction(t, "SwitchTraffic", wf, ks, oldShards, newShards, defaultCellName, tabletType) diff --git a/go/test/endtoend/vtgate/misc_test.go b/go/test/endtoend/vtgate/misc_test.go index 55fa139b290..b350002a05b 100644 --- a/go/test/endtoend/vtgate/misc_test.go +++ b/go/test/endtoend/vtgate/misc_test.go @@ -753,9 +753,9 @@ func TestDescribeVindex(t *testing.T) { _, err := conn.ExecuteFetch("describe hash", 1000, false) require.Error(t, err) mysqlErr := err.(*sqlerror.SQLError) - assert.Equal(t, sqlerror.ERNoSuchTable, mysqlErr.Num) + assert.Equal(t, sqlerror.ERUnknownTable, mysqlErr.Num) assert.Equal(t, "42S02", mysqlErr.State) - assert.ErrorContains(t, mysqlErr, "NotFound desc") + assert.ErrorContains(t, mysqlErr, "VT05004: table 'hash' does not exist") } func TestEmptyQuery(t *testing.T) { diff --git a/go/test/endtoend/vtgate/queries/random/query_gen.go b/go/test/endtoend/vtgate/queries/random/query_gen.go index ba7c83aaa91..69bf66903f3 100644 --- a/go/test/endtoend/vtgate/queries/random/query_gen.go +++ b/go/test/endtoend/vtgate/queries/random/query_gen.go @@ -46,7 +46,7 @@ type ( // queryGenerator generates queries, which can either be unions or select statements queryGenerator struct { - stmt sqlparser.SelectStatement + stmt sqlparser.TableStatement selGen *selectGenerator } diff --git a/go/test/endtoend/vtgate/queries/random/simplifier_test.go b/go/test/endtoend/vtgate/queries/random/simplifier_test.go index c93c0e679c1..4305124e23c 100644 --- a/go/test/endtoend/vtgate/queries/random/simplifier_test.go +++ b/go/test/endtoend/vtgate/queries/random/simplifier_test.go @@ -100,10 +100,10 @@ func simplifyResultsMismatchedQuery(t *testing.T, query string) string { require.NoError(t, err) simplified := simplifier.SimplifyStatement( - stmt.(sqlparser.SelectStatement), + stmt.(sqlparser.TableStatement), vSchemaWrapper.CurrentDb(), vSchemaWrapper, - func(statement sqlparser.SelectStatement) bool { + func(statement sqlparser.TableStatement) bool { q := sqlparser.String(statement) _, newErr := mcmp.ExecAllowAndCompareError(q, utils.CompareOptions{}) if newErr == nil { diff --git a/go/test/endtoend/vtgate/queries/reference/main_test.go b/go/test/endtoend/vtgate/queries/reference/main_test.go index 03ee429e4c0..95e19ef596a 100644 --- a/go/test/endtoend/vtgate/queries/reference/main_test.go +++ b/go/test/endtoend/vtgate/queries/reference/main_test.go @@ -155,24 +155,14 @@ func TestMain(m *testing.M) { }() // Materialize zip_detail to sharded keyspace. - output, err := clusterInstance.VtctlProcess.ExecuteCommandWithOutput( + output, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput( "Materialize", - "--", - "--tablet_types", - "PRIMARY", - `{ - "workflow": "copy_zip_detail", - "source_keyspace": "`+unshardedKeyspaceName+`", - "target_keyspace": "`+shardedKeyspaceName+`", - "tablet_types": "PRIMARY", - "table_settings": [ - { - "target_table": "zip_detail", - "source_expression": "select * from zip_detail", - "create_ddl": "copy" - } - ] - }`, + "--workflow", "copy_zip_detail", + "--target-keyspace", shardedKeyspaceName, + "create", + "--source-keyspace", unshardedKeyspaceName, + "--table-settings", `[{"target_table": "zip_detail", "source_expression": "select * from zip_detail", "create_ddl": "copy" }]`, + "--tablet-types", "PRIMARY", ) fmt.Fprintf(os.Stderr, "Output from materialize: %s\n", output) if err != nil { @@ -214,11 +204,12 @@ func TestMain(m *testing.M) { } // Stop materialize zip_detail to sharded keyspace. - err = clusterInstance.VtctlProcess.ExecuteCommand( + err = clusterInstance.VtctldClientProcess.ExecuteCommand( "Workflow", - "--", - shardedKeyspaceName+".copy_zip_detail", + "--keyspace", shardedKeyspaceName, "delete", + "--workflow", "copy_zip_detail", + "--keep-data", ) if err != nil { fmt.Fprintf(os.Stderr, "Failed to stop materialization workflow: %v", err) diff --git a/go/test/endtoend/vtgate/schema/schema_test.go b/go/test/endtoend/vtgate/schema/schema_test.go index 4c28e29ca0d..fd84b5b2793 100644 --- a/go/test/endtoend/vtgate/schema/schema_test.go +++ b/go/test/endtoend/vtgate/schema/schema_test.go @@ -294,7 +294,7 @@ func testCopySchemaShards(t *testing.T, source string, shard int) { checkTablesCount(t, clusterInstance.Keyspaces[0].Shards[shard].Vttablets[1], 0) // Run the command twice to make sure it's idempotent. for i := 0; i < 2; i++ { - err := clusterInstance.VtctlclientProcess.ExecuteCommand("CopySchemaShard", source, fmt.Sprintf("%s/%d", keyspaceName, shard)) + err := clusterInstance.VtctldClientProcess.ExecuteCommand("CopySchemaShard", source, fmt.Sprintf("%s/%d", keyspaceName, shard)) require.Nil(t, err) } // shard2 primary should look the same as the replica we copied from @@ -329,7 +329,7 @@ func testCopySchemaShardWithDifferentDB(t *testing.T, shard int) { err = clusterInstance.VtctldClientProcess.ExecuteCommand("ExecuteFetchAsDBA", "--json", tabletAlias, "ALTER DATABASE vt_ks CHARACTER SET latin1") require.Nil(t, err) - output, err := clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput("CopySchemaShard", source, fmt.Sprintf("%s/%d", keyspaceName, shard)) + output, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("CopySchemaShard", source, fmt.Sprintf("%s/%d", keyspaceName, shard)) require.Error(t, err) assert.True(t, strings.Contains(output, "schemas are different")) diff --git a/go/test/endtoend/vtorc/readtopologyinstance/main_test.go b/go/test/endtoend/vtorc/readtopologyinstance/main_test.go index c58e8e9bb45..6a565ac046f 100644 --- a/go/test/endtoend/vtorc/readtopologyinstance/main_test.go +++ b/go/test/endtoend/vtorc/readtopologyinstance/main_test.go @@ -50,9 +50,9 @@ func TestReadTopologyInstanceBufferable(t *testing.T) { // Change the args such that they match how we would invoke VTOrc os.Args = []string{"vtorc", - "--topo_global_server_address", clusterInfo.ClusterInstance.VtctlProcess.TopoGlobalAddress, - "--topo_implementation", clusterInfo.ClusterInstance.VtctlProcess.TopoImplementation, - "--topo_global_root", clusterInfo.ClusterInstance.VtctlProcess.TopoGlobalRoot, + "--topo_global_server_address", clusterInfo.ClusterInstance.VtctldClientProcess.TopoGlobalAddress, + "--topo_implementation", clusterInfo.ClusterInstance.VtctldClientProcess.TopoImplementation, + "--topo_global_root", clusterInfo.ClusterInstance.VtctldClientProcess.TopoGlobalRoot, } servenv.ParseFlags("vtorc") config.SetInstancePollTime(1 * time.Second) diff --git a/go/test/endtoend/vtorc/utils/utils.go b/go/test/endtoend/vtorc/utils/utils.go index 0a2d516fe63..b00e3897a61 100644 --- a/go/test/endtoend/vtorc/utils/utils.go +++ b/go/test/endtoend/vtorc/utils/utils.go @@ -90,7 +90,7 @@ func CreateClusterAndStartTopo(cellInfos []*CellInfo) (*VTOrcClusterInfo, error) if err != nil { return nil, err } - err = clusterInstance.VtctlProcess.AddCellInfo(Cell2) + err = clusterInstance.VtctldClientProcess.AddCellInfo(Cell2) if err != nil { return nil, err } @@ -102,7 +102,7 @@ func CreateClusterAndStartTopo(cellInfos []*CellInfo) (*VTOrcClusterInfo, error) } // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) return &VTOrcClusterInfo{ ClusterInstance: clusterInstance, Ts: ts, @@ -856,7 +856,7 @@ func SetupNewClusterSemiSync(t *testing.T) *VTOrcClusterInfo { require.NoError(t, err, out) // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) clusterInfo := &VTOrcClusterInfo{ ClusterInstance: clusterInstance, @@ -927,7 +927,7 @@ func AddSemiSyncKeyspace(t *testing.T, clusterInfo *VTOrcClusterInfo) { require.NoError(t, err) } - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", clusterInfo.ClusterInstance.VtctldProcess.GrpcPort, clusterInfo.ClusterInstance.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(clusterInfo.ClusterInstance.VtctldProcess.GrpcPort, clusterInfo.ClusterInstance.TopoPort, "localhost", clusterInfo.ClusterInstance.TmpDirectory) out, err := vtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspaceSemiSyncName, "--durability-policy=semi_sync") require.NoError(t, err, out) } diff --git a/go/test/vschemawrapper/vschema_wrapper.go b/go/test/vschemawrapper/vschema_wrapper.go index 27219c6a255..5b1c6b033e6 100644 --- a/go/test/vschemawrapper/vschema_wrapper.go +++ b/go/test/vschemawrapper/vschema_wrapper.go @@ -265,7 +265,7 @@ func (vw *VSchemaWrapper) FindTable(tab sqlparser.TableName) (*vindexes.Table, s return table, destKeyspace, destTabletType, destTarget, nil } -func (vw *VSchemaWrapper) FindView(tab sqlparser.TableName) sqlparser.SelectStatement { +func (vw *VSchemaWrapper) FindView(tab sqlparser.TableName) sqlparser.TableStatement { destKeyspace, _, _, err := topoproto.ParseDestination(tab.Qualifier.String(), topodatapb.TabletType_PRIMARY) if err != nil { return nil @@ -273,6 +273,17 @@ func (vw *VSchemaWrapper) FindView(tab sqlparser.TableName) sqlparser.SelectStat return vw.V.FindView(destKeyspace, tab.Name.String()) } +func (vw *VSchemaWrapper) FindViewTarget(name sqlparser.TableName) (*vindexes.Keyspace, error) { + destKeyspace, _, _, err := topoproto.ParseDestination(name.Qualifier.String(), topodatapb.TabletType_PRIMARY) + if err != nil { + return nil, err + } + if ks, ok := vw.V.Keyspaces[destKeyspace]; ok { + return ks.Keyspace, nil + } + return nil, nil +} + func (vw *VSchemaWrapper) FindTableOrVindex(tab sqlparser.TableName) (*vindexes.Table, vindexes.Vindex, string, topodatapb.TabletType, key.Destination, error) { return vw.Vcursor.FindTableOrVindex(tab) } diff --git a/go/tools/go-upgrade/go-upgrade.go b/go/tools/go-upgrade/go-upgrade.go index 3ca5f4aeb8b..7b36fd14c02 100644 --- a/go/tools/go-upgrade/go-upgrade.go +++ b/go/tools/go-upgrade/go-upgrade.go @@ -343,8 +343,10 @@ func replaceGoVersionInCodebase(old, new *version.Version) error { "./build.env", "./docker/bootstrap/Dockerfile.common", "./docker/lite/Dockerfile", + "./docker/lite/Dockerfile.mysql84", "./docker/lite/Dockerfile.percona80", "./docker/vttestserver/Dockerfile.mysql80", + "./docker/vttestserver/Dockerfile.mysql84", } filesToChange, err := getListOfFilesInPaths(explore) if err != nil { diff --git a/go/tools/sizegen/sizegen.go b/go/tools/sizegen/sizegen.go index 7ecd50e3d8c..17b155ad3f4 100644 --- a/go/tools/sizegen/sizegen.go +++ b/go/tools/sizegen/sizegen.go @@ -163,6 +163,8 @@ func (sizegen *sizegen) generateTyp(tt types.Type) { sizegen.generateKnownType(tt) case *types.Alias: sizegen.generateTyp(types.Unalias(tt)) + default: + panic(fmt.Sprintf("unhandled type: %v (%T)", tt, tt)) } } @@ -490,9 +492,11 @@ func (sizegen *sizegen) sizeStmtForType(fieldName *jen.Statement, field types.Ty // assume that function pointers do not allocate (although they might, if they're closures) return nil, 0 + case *types.Alias: + return sizegen.sizeStmtForType(fieldName, types.Unalias(node), alloc) + default: - log.Printf("unhandled type: %T", node) - return nil, 0 + panic(fmt.Sprintf("unhandled type: %v (%T)", node, node)) } } diff --git a/go/viperutil/config.go b/go/viperutil/config.go index 49e3f960875..33cc112b4af 100644 --- a/go/viperutil/config.go +++ b/go/viperutil/config.go @@ -18,6 +18,7 @@ package viperutil import ( "context" + "errors" "fmt" "os" "reflect" @@ -162,19 +163,19 @@ func LoadConfig() (context.CancelFunc, error) { } if err != nil { - if nferr, ok := err.(viper.ConfigFileNotFoundError); ok { + if isConfigFileNotFoundError(err) { msg := "Failed to read in config %s: %s" switch configFileNotFoundHandling.Get() { case WarnOnConfigFileNotFound: msg += ". This is optional, and can be ignored if you are not using config files. For a detailed explanation, see https://github.com/vitessio/vitess/blob/main/doc/viper/viper.md#config-files." - log.WARN(msg, registry.Static.ConfigFileUsed(), nferr.Error()) + log.WARN(msg, registry.Static.ConfigFileUsed(), err.Error()) fallthrough // after warning, ignore the error case IgnoreConfigFileNotFound: - err = nil + return func() {}, nil case ErrorOnConfigFileNotFound: - log.ERROR(msg, registry.Static.ConfigFileUsed(), nferr.Error()) + log.ERROR(msg, registry.Static.ConfigFileUsed(), err.Error()) case ExitOnConfigFileNotFound: - log.CRITICAL(msg, registry.Static.ConfigFileUsed(), nferr.Error()) + log.CRITICAL(msg, registry.Static.ConfigFileUsed(), err.Error()) } } } @@ -186,6 +187,14 @@ func LoadConfig() (context.CancelFunc, error) { return registry.Dynamic.Watch(context.Background(), registry.Static, configPersistenceMinInterval.Get()) } +// isConfigFileNotFoundError checks if the error is caused because the file wasn't found. +func isConfigFileNotFoundError(err error) bool { + if errors.As(err, &viper.ConfigFileNotFoundError{}) { + return true + } + return errors.Is(err, os.ErrNotExist) +} + // NotifyConfigReload adds a subscription that the dynamic registry will attempt // to notify on config changes. The notification fires after the updated config // has been loaded from disk into the live config. diff --git a/go/viperutil/config_test.go b/go/viperutil/config_test.go index 8e00a4700ac..4b67f0791f5 100644 --- a/go/viperutil/config_test.go +++ b/go/viperutil/config_test.go @@ -47,3 +47,60 @@ duration: 10h assert.Equal(t, IgnoreConfigFileNotFound, getHandlingValueFunc("duration"), "failed to get value on duration key") assert.Equal(t, ExitOnConfigFileNotFound, getHandlingValueFunc("default"), "failed to get value on default key") } + +// TestLoadConfig tests that LoadConfig behaves in the way expected when the config file doesn't exist. +func TestLoadConfig(t *testing.T) { + origConfigFile := configFile.Get() + origConfigName := configName.Get() + origConfigFileNotFoundHandling := configFileNotFoundHandling.Get() + defer func() { + configFile.Set(origConfigFile) + configName.Set(origConfigName) + configFileNotFoundHandling.Set(origConfigFileNotFoundHandling) + }() + + t.Run("Ignore file not found error", func(t *testing.T) { + configFile.Set("notfound.yaml") + configFileNotFoundHandling.Set(IgnoreConfigFileNotFound) + _, err := LoadConfig() + require.NoError(t, err) + }) + + t.Run("Ignore file not found error from config name", func(t *testing.T) { + configFile.Set("") + configName.Set("notfound") + configFileNotFoundHandling.Set(IgnoreConfigFileNotFound) + _, err := LoadConfig() + require.NoError(t, err) + }) + + t.Run("Warn file not found error", func(t *testing.T) { + configFile.Set("notfound.yaml") + configFileNotFoundHandling.Set(WarnOnConfigFileNotFound) + _, err := LoadConfig() + require.NoError(t, err) + }) + + t.Run("Ignore file not found error from config name", func(t *testing.T) { + configFile.Set("") + configName.Set("notfound") + configFileNotFoundHandling.Set(WarnOnConfigFileNotFound) + _, err := LoadConfig() + require.NoError(t, err) + }) + + t.Run("Error file not found error", func(t *testing.T) { + configFile.Set("notfound.yaml") + configFileNotFoundHandling.Set(ErrorOnConfigFileNotFound) + _, err := LoadConfig() + require.Error(t, err) + }) + + t.Run("Ignore file not found error from config name", func(t *testing.T) { + configFile.Set("") + configName.Set("notfound") + configFileNotFoundHandling.Set(ErrorOnConfigFileNotFound) + _, err := LoadConfig() + require.Error(t, err) + }) +} diff --git a/go/vt/discovery/tablet_picker.go b/go/vt/discovery/tablet_picker.go index c48905be948..cfe1ba2e964 100644 --- a/go/vt/discovery/tablet_picker.go +++ b/go/vt/discovery/tablet_picker.go @@ -387,8 +387,13 @@ func (tp *TabletPicker) GetMatchingTablets(ctx context.Context) []*topo.TabletIn log.Errorf("Error getting shard %s/%s: %v", tp.keyspace, tp.shard, err) return nil } - if _, ignore := tp.ignoreTablets[si.PrimaryAlias.String()]; !ignore { - aliases = append(aliases, si.PrimaryAlias) + + // It is possible that there is a cluster event (ERS/PRS, for example) due to which + // there is no primary elected for the shard at the moment. + if si.PrimaryAlias != nil { + if _, ignore := tp.ignoreTablets[si.PrimaryAlias.String()]; !ignore { + aliases = append(aliases, si.PrimaryAlias) + } } } else { actualCells := make([]string, 0) @@ -425,6 +430,9 @@ func (tp *TabletPicker) GetMatchingTablets(ctx context.Context) []*topo.TabletIn continue } for _, node := range sri.Nodes { + if node.TabletAlias == nil { + continue + } if _, ignore := tp.ignoreTablets[node.TabletAlias.String()]; !ignore { aliases = append(aliases, node.TabletAlias) } diff --git a/go/vt/discovery/tablet_picker_test.go b/go/vt/discovery/tablet_picker_test.go index 76a8828afec..27c4d8bf7b1 100644 --- a/go/vt/discovery/tablet_picker_test.go +++ b/go/vt/discovery/tablet_picker_test.go @@ -62,6 +62,29 @@ func TestPickPrimary(t *testing.T) { assert.True(t, proto.Equal(want, tablet), "Pick: %v, want %v", tablet, want) } +// TestPickNoPrimary confirms that if the picker was setup only for primary tablets but +// there is no primary setup for the shard we correctly return an error. +func TestPickNoPrimary(t *testing.T) { + defer utils.EnsureNoLeaks(t) + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + te := newPickerTestEnv(t, ctx, []string{"cell", "otherCell"}) + want := addTablet(ctx, te, 100, topodatapb.TabletType_PRIMARY, "cell", true, true) + defer deleteTablet(t, te, want) + _, err := te.topoServ.UpdateShardFields(ctx, te.keyspace, te.shard, func(si *topo.ShardInfo) error { + si.PrimaryAlias = nil // force a missing primary + return nil + }) + require.NoError(t, err) + + tp, err := NewTabletPicker(ctx, te.topoServ, []string{"otherCell"}, "cell", te.keyspace, te.shard, "primary", TabletPickerOptions{}) + require.NoError(t, err) + + _, err = tp.PickForStreaming(ctx) + require.Errorf(t, err, "No healthy serving tablet") +} + func TestPickLocalPreferences(t *testing.T) { defer utils.EnsureNoLeaks(t) type tablet struct { diff --git a/go/vt/proto/query/cached_size.go b/go/vt/proto/query/cached_size.go index 5b613317294..4436594681a 100644 --- a/go/vt/proto/query/cached_size.go +++ b/go/vt/proto/query/cached_size.go @@ -27,6 +27,10 @@ func (cached *BindVariable) CachedSize(alloc bool) int64 { if alloc { size += int64(96) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } // field Value []byte { size += hack.RuntimeAllocSize(int64(cap(cached.Value))) @@ -48,6 +52,10 @@ func (cached *Field) CachedSize(alloc bool) int64 { if alloc { size += int64(160) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } // field Name string size += hack.RuntimeAllocSize(int64(len(cached.Name))) // field Table string @@ -70,6 +78,10 @@ func (cached *QueryWarning) CachedSize(alloc bool) int64 { if alloc { size += int64(64) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } // field Message string size += hack.RuntimeAllocSize(int64(len(cached.Message))) return size @@ -82,6 +94,10 @@ func (cached *Target) CachedSize(alloc bool) int64 { if alloc { size += int64(96) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } // field Keyspace string size += hack.RuntimeAllocSize(int64(len(cached.Keyspace))) // field Shard string @@ -98,6 +114,10 @@ func (cached *Value) CachedSize(alloc bool) int64 { if alloc { size += int64(80) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } // field Value []byte { size += hack.RuntimeAllocSize(int64(cap(cached.Value))) diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go index 67eae2395ad..36ad09547f1 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go @@ -6766,6 +6766,61 @@ func (x *VDiffOptions) GetReportOptions() *VDiffReportOptions { return nil } +type VDiffTableLastPK struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Target *query.QueryResult `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` + // If the source value is nil then it's the same as the target + // and the target value should be used for both. + Source *query.QueryResult `protobuf:"bytes,2,opt,name=source,proto3,oneof" json:"source,omitempty"` +} + +func (x *VDiffTableLastPK) Reset() { + *x = VDiffTableLastPK{} + mi := &file_tabletmanagerdata_proto_msgTypes[132] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *VDiffTableLastPK) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VDiffTableLastPK) ProtoMessage() {} + +func (x *VDiffTableLastPK) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[132] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VDiffTableLastPK.ProtoReflect.Descriptor instead. +func (*VDiffTableLastPK) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{132} +} + +func (x *VDiffTableLastPK) GetTarget() *query.QueryResult { + if x != nil { + return x.Target + } + return nil +} + +func (x *VDiffTableLastPK) GetSource() *query.QueryResult { + if x != nil { + return x.Source + } + return nil +} + // UpdateVReplicationWorkflowRequest is used to update an existing VReplication // workflow. Note that the following fields MUST have an explicit value provided // if you do NOT wish to update the existing value to the given type's ZeroValue: @@ -6788,7 +6843,7 @@ type UpdateVReplicationWorkflowRequest struct { func (x *UpdateVReplicationWorkflowRequest) Reset() { *x = UpdateVReplicationWorkflowRequest{} - mi := &file_tabletmanagerdata_proto_msgTypes[132] + mi := &file_tabletmanagerdata_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6800,7 +6855,7 @@ func (x *UpdateVReplicationWorkflowRequest) String() string { func (*UpdateVReplicationWorkflowRequest) ProtoMessage() {} func (x *UpdateVReplicationWorkflowRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[132] + mi := &file_tabletmanagerdata_proto_msgTypes[133] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6813,7 +6868,7 @@ func (x *UpdateVReplicationWorkflowRequest) ProtoReflect() protoreflect.Message // Deprecated: Use UpdateVReplicationWorkflowRequest.ProtoReflect.Descriptor instead. func (*UpdateVReplicationWorkflowRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{132} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{133} } func (x *UpdateVReplicationWorkflowRequest) GetWorkflow() string { @@ -6875,7 +6930,7 @@ type UpdateVReplicationWorkflowResponse struct { func (x *UpdateVReplicationWorkflowResponse) Reset() { *x = UpdateVReplicationWorkflowResponse{} - mi := &file_tabletmanagerdata_proto_msgTypes[133] + mi := &file_tabletmanagerdata_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6887,7 +6942,7 @@ func (x *UpdateVReplicationWorkflowResponse) String() string { func (*UpdateVReplicationWorkflowResponse) ProtoMessage() {} func (x *UpdateVReplicationWorkflowResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[133] + mi := &file_tabletmanagerdata_proto_msgTypes[134] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6900,7 +6955,7 @@ func (x *UpdateVReplicationWorkflowResponse) ProtoReflect() protoreflect.Message // Deprecated: Use UpdateVReplicationWorkflowResponse.ProtoReflect.Descriptor instead. func (*UpdateVReplicationWorkflowResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{133} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{134} } func (x *UpdateVReplicationWorkflowResponse) GetResult() *query.QueryResult { @@ -6931,7 +6986,7 @@ type UpdateVReplicationWorkflowsRequest struct { func (x *UpdateVReplicationWorkflowsRequest) Reset() { *x = UpdateVReplicationWorkflowsRequest{} - mi := &file_tabletmanagerdata_proto_msgTypes[134] + mi := &file_tabletmanagerdata_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6943,7 +6998,7 @@ func (x *UpdateVReplicationWorkflowsRequest) String() string { func (*UpdateVReplicationWorkflowsRequest) ProtoMessage() {} func (x *UpdateVReplicationWorkflowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[134] + mi := &file_tabletmanagerdata_proto_msgTypes[135] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6956,7 +7011,7 @@ func (x *UpdateVReplicationWorkflowsRequest) ProtoReflect() protoreflect.Message // Deprecated: Use UpdateVReplicationWorkflowsRequest.ProtoReflect.Descriptor instead. func (*UpdateVReplicationWorkflowsRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{134} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{135} } func (x *UpdateVReplicationWorkflowsRequest) GetAllWorkflows() bool { @@ -7011,7 +7066,7 @@ type UpdateVReplicationWorkflowsResponse struct { func (x *UpdateVReplicationWorkflowsResponse) Reset() { *x = UpdateVReplicationWorkflowsResponse{} - mi := &file_tabletmanagerdata_proto_msgTypes[135] + mi := &file_tabletmanagerdata_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7023,7 +7078,7 @@ func (x *UpdateVReplicationWorkflowsResponse) String() string { func (*UpdateVReplicationWorkflowsResponse) ProtoMessage() {} func (x *UpdateVReplicationWorkflowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[135] + mi := &file_tabletmanagerdata_proto_msgTypes[136] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7036,7 +7091,7 @@ func (x *UpdateVReplicationWorkflowsResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use UpdateVReplicationWorkflowsResponse.ProtoReflect.Descriptor instead. func (*UpdateVReplicationWorkflowsResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{135} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{136} } func (x *UpdateVReplicationWorkflowsResponse) GetResult() *query.QueryResult { @@ -7056,7 +7111,7 @@ type ResetSequencesRequest struct { func (x *ResetSequencesRequest) Reset() { *x = ResetSequencesRequest{} - mi := &file_tabletmanagerdata_proto_msgTypes[136] + mi := &file_tabletmanagerdata_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7068,7 +7123,7 @@ func (x *ResetSequencesRequest) String() string { func (*ResetSequencesRequest) ProtoMessage() {} func (x *ResetSequencesRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[136] + mi := &file_tabletmanagerdata_proto_msgTypes[137] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7081,7 +7136,7 @@ func (x *ResetSequencesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetSequencesRequest.ProtoReflect.Descriptor instead. func (*ResetSequencesRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{136} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{137} } func (x *ResetSequencesRequest) GetTables() []string { @@ -7099,7 +7154,7 @@ type ResetSequencesResponse struct { func (x *ResetSequencesResponse) Reset() { *x = ResetSequencesResponse{} - mi := &file_tabletmanagerdata_proto_msgTypes[137] + mi := &file_tabletmanagerdata_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7111,7 +7166,7 @@ func (x *ResetSequencesResponse) String() string { func (*ResetSequencesResponse) ProtoMessage() {} func (x *ResetSequencesResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[137] + mi := &file_tabletmanagerdata_proto_msgTypes[138] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7124,7 +7179,7 @@ func (x *ResetSequencesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetSequencesResponse.ProtoReflect.Descriptor instead. func (*ResetSequencesResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{137} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{138} } type CheckThrottlerRequest struct { @@ -7145,7 +7200,7 @@ type CheckThrottlerRequest struct { func (x *CheckThrottlerRequest) Reset() { *x = CheckThrottlerRequest{} - mi := &file_tabletmanagerdata_proto_msgTypes[138] + mi := &file_tabletmanagerdata_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7157,7 +7212,7 @@ func (x *CheckThrottlerRequest) String() string { func (*CheckThrottlerRequest) ProtoMessage() {} func (x *CheckThrottlerRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[138] + mi := &file_tabletmanagerdata_proto_msgTypes[139] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7170,7 +7225,7 @@ func (x *CheckThrottlerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckThrottlerRequest.ProtoReflect.Descriptor instead. func (*CheckThrottlerRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{138} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{139} } func (x *CheckThrottlerRequest) GetAppName() string { @@ -7239,7 +7294,7 @@ type CheckThrottlerResponse struct { func (x *CheckThrottlerResponse) Reset() { *x = CheckThrottlerResponse{} - mi := &file_tabletmanagerdata_proto_msgTypes[139] + mi := &file_tabletmanagerdata_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7251,7 +7306,7 @@ func (x *CheckThrottlerResponse) String() string { func (*CheckThrottlerResponse) ProtoMessage() {} func (x *CheckThrottlerResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[139] + mi := &file_tabletmanagerdata_proto_msgTypes[140] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7264,7 +7319,7 @@ func (x *CheckThrottlerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckThrottlerResponse.ProtoReflect.Descriptor instead. func (*CheckThrottlerResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{139} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{140} } func (x *CheckThrottlerResponse) GetStatusCode() int32 { @@ -7345,7 +7400,7 @@ type GetThrottlerStatusRequest struct { func (x *GetThrottlerStatusRequest) Reset() { *x = GetThrottlerStatusRequest{} - mi := &file_tabletmanagerdata_proto_msgTypes[140] + mi := &file_tabletmanagerdata_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7357,7 +7412,7 @@ func (x *GetThrottlerStatusRequest) String() string { func (*GetThrottlerStatusRequest) ProtoMessage() {} func (x *GetThrottlerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[140] + mi := &file_tabletmanagerdata_proto_msgTypes[141] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7370,7 +7425,7 @@ func (x *GetThrottlerStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetThrottlerStatusRequest.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{140} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{141} } type GetThrottlerStatusResponse struct { @@ -7418,7 +7473,7 @@ type GetThrottlerStatusResponse struct { func (x *GetThrottlerStatusResponse) Reset() { *x = GetThrottlerStatusResponse{} - mi := &file_tabletmanagerdata_proto_msgTypes[141] + mi := &file_tabletmanagerdata_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7430,7 +7485,7 @@ func (x *GetThrottlerStatusResponse) String() string { func (*GetThrottlerStatusResponse) ProtoMessage() {} func (x *GetThrottlerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[141] + mi := &file_tabletmanagerdata_proto_msgTypes[142] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7443,7 +7498,7 @@ func (x *GetThrottlerStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetThrottlerStatusResponse.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{141} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{142} } func (x *GetThrottlerStatusResponse) GetTabletAlias() string { @@ -7583,7 +7638,7 @@ type ChangeTagsRequest struct { func (x *ChangeTagsRequest) Reset() { *x = ChangeTagsRequest{} - mi := &file_tabletmanagerdata_proto_msgTypes[142] + mi := &file_tabletmanagerdata_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7595,7 +7650,7 @@ func (x *ChangeTagsRequest) String() string { func (*ChangeTagsRequest) ProtoMessage() {} func (x *ChangeTagsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[142] + mi := &file_tabletmanagerdata_proto_msgTypes[143] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7608,7 +7663,7 @@ func (x *ChangeTagsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeTagsRequest.ProtoReflect.Descriptor instead. func (*ChangeTagsRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{142} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{143} } func (x *ChangeTagsRequest) GetTags() map[string]string { @@ -7635,7 +7690,7 @@ type ChangeTagsResponse struct { func (x *ChangeTagsResponse) Reset() { *x = ChangeTagsResponse{} - mi := &file_tabletmanagerdata_proto_msgTypes[143] + mi := &file_tabletmanagerdata_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7647,7 +7702,7 @@ func (x *ChangeTagsResponse) String() string { func (*ChangeTagsResponse) ProtoMessage() {} func (x *ChangeTagsResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[143] + mi := &file_tabletmanagerdata_proto_msgTypes[144] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7660,7 +7715,7 @@ func (x *ChangeTagsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeTagsResponse.ProtoReflect.Descriptor instead. func (*ChangeTagsResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{143} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{144} } func (x *ChangeTagsResponse) GetTags() map[string]string { @@ -7693,7 +7748,7 @@ type ReadVReplicationWorkflowResponse_Stream struct { func (x *ReadVReplicationWorkflowResponse_Stream) Reset() { *x = ReadVReplicationWorkflowResponse_Stream{} - mi := &file_tabletmanagerdata_proto_msgTypes[149] + mi := &file_tabletmanagerdata_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7705,7 +7760,7 @@ func (x *ReadVReplicationWorkflowResponse_Stream) String() string { func (*ReadVReplicationWorkflowResponse_Stream) ProtoMessage() {} func (x *ReadVReplicationWorkflowResponse_Stream) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[149] + mi := &file_tabletmanagerdata_proto_msgTypes[150] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7844,7 +7899,7 @@ type CheckThrottlerResponse_Metric struct { func (x *CheckThrottlerResponse_Metric) Reset() { *x = CheckThrottlerResponse_Metric{} - mi := &file_tabletmanagerdata_proto_msgTypes[152] + mi := &file_tabletmanagerdata_proto_msgTypes[153] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7856,7 +7911,7 @@ func (x *CheckThrottlerResponse_Metric) String() string { func (*CheckThrottlerResponse_Metric) ProtoMessage() {} func (x *CheckThrottlerResponse_Metric) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[152] + mi := &file_tabletmanagerdata_proto_msgTypes[153] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7869,7 +7924,7 @@ func (x *CheckThrottlerResponse_Metric) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckThrottlerResponse_Metric.ProtoReflect.Descriptor instead. func (*CheckThrottlerResponse_Metric) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{139, 0} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{140, 0} } func (x *CheckThrottlerResponse_Metric) GetName() string { @@ -7939,7 +7994,7 @@ type GetThrottlerStatusResponse_MetricResult struct { func (x *GetThrottlerStatusResponse_MetricResult) Reset() { *x = GetThrottlerStatusResponse_MetricResult{} - mi := &file_tabletmanagerdata_proto_msgTypes[154] + mi := &file_tabletmanagerdata_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7951,7 +8006,7 @@ func (x *GetThrottlerStatusResponse_MetricResult) String() string { func (*GetThrottlerStatusResponse_MetricResult) ProtoMessage() {} func (x *GetThrottlerStatusResponse_MetricResult) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[154] + mi := &file_tabletmanagerdata_proto_msgTypes[155] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7964,7 +8019,7 @@ func (x *GetThrottlerStatusResponse_MetricResult) ProtoReflect() protoreflect.Me // Deprecated: Use GetThrottlerStatusResponse_MetricResult.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse_MetricResult) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{141, 0} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{142, 0} } func (x *GetThrottlerStatusResponse_MetricResult) GetValue() float64 { @@ -7992,7 +8047,7 @@ type GetThrottlerStatusResponse_MetricHealth struct { func (x *GetThrottlerStatusResponse_MetricHealth) Reset() { *x = GetThrottlerStatusResponse_MetricHealth{} - mi := &file_tabletmanagerdata_proto_msgTypes[157] + mi := &file_tabletmanagerdata_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8004,7 +8059,7 @@ func (x *GetThrottlerStatusResponse_MetricHealth) String() string { func (*GetThrottlerStatusResponse_MetricHealth) ProtoMessage() {} func (x *GetThrottlerStatusResponse_MetricHealth) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[157] + mi := &file_tabletmanagerdata_proto_msgTypes[158] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8017,7 +8072,7 @@ func (x *GetThrottlerStatusResponse_MetricHealth) ProtoReflect() protoreflect.Me // Deprecated: Use GetThrottlerStatusResponse_MetricHealth.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse_MetricHealth) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{141, 3} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{142, 3} } func (x *GetThrottlerStatusResponse_MetricHealth) GetLastHealthyAt() *vttime.Time { @@ -8047,7 +8102,7 @@ type GetThrottlerStatusResponse_RecentApp struct { func (x *GetThrottlerStatusResponse_RecentApp) Reset() { *x = GetThrottlerStatusResponse_RecentApp{} - mi := &file_tabletmanagerdata_proto_msgTypes[161] + mi := &file_tabletmanagerdata_proto_msgTypes[162] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8059,7 +8114,7 @@ func (x *GetThrottlerStatusResponse_RecentApp) String() string { func (*GetThrottlerStatusResponse_RecentApp) ProtoMessage() {} func (x *GetThrottlerStatusResponse_RecentApp) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[161] + mi := &file_tabletmanagerdata_proto_msgTypes[162] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8072,7 +8127,7 @@ func (x *GetThrottlerStatusResponse_RecentApp) ProtoReflect() protoreflect.Messa // Deprecated: Use GetThrottlerStatusResponse_RecentApp.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse_RecentApp) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{141, 7} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{142, 7} } func (x *GetThrottlerStatusResponse_RecentApp) GetCheckedAt() *vttime.Time { @@ -8961,317 +9016,324 @@ var file_tabletmanagerdata_proto_rawDesc = []byte{ 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, - 0x04, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, - 0x71, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x48, 0x00, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x33, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4f, 0x6e, 0x44, 0x44, 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x05, 0x6f, - 0x6e, 0x44, 0x64, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x02, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x74, 0x0a, 0x10, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x1a, - 0x42, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, - 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, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x42, 0x08, - 0x0a, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x50, - 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0xd6, 0x02, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x5f, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, - 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, - 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x6f, 0x70, - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x23, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7a, + 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, + 0x50, 0x4b, 0x12, 0x2a, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2f, + 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x48, 0x00, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, + 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xed, 0x04, 0x0a, 0x21, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x1b, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, + 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, + 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, + 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4f, 0x6e, 0x44, 0x44, + 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, + 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x02, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x74, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, + 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x49, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x1a, 0x42, 0x0a, 0x14, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 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, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, + 0x1e, 0x0a, 0x1c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, + 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x50, 0x0a, 0x22, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2f, 0x0a, 0x15, - 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x18, 0x0a, - 0x16, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x01, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x6f, 0x6b, - 0x5f, 0x69, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6f, 0x6b, 0x49, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, - 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x13, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x9f, 0x06, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, - 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, - 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x65, 0x64, 0x12, 0x50, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, - 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x8b, 0x02, - 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, - 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x6c, 0x0a, 0x0c, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x46, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, + 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd6, 0x02, 0x0a, + 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x73, 0x74, + 0x6f, 0x70, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, + 0x06, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2f, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x65, + 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x65, 0x73, + 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x01, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x36, + 0x0a, 0x17, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, + 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, + 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x6f, 0x6b, 0x5f, 0x69, 0x66, 0x5f, + 0x6e, 0x6f, 0x74, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0d, 0x6f, 0x6b, 0x49, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, + 0x32, 0x0a, 0x15, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x22, 0x9f, 0x06, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, + 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x50, + 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1b, 0x0a, 0x19, 0x47, 0x65, 0x74, - 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb6, 0x10, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, - 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, - 0x5f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, - 0x73, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6f, 0x70, - 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x4f, 0x70, 0x65, 0x6e, - 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x12, 0x28, - 0x0a, 0x10, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x67, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x1b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x55, 0x73, 0x65, 0x64, 0x41, 0x73, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x12, 0x73, 0x0a, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, - 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x70, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x18, 0x0d, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, - 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x12, 0x67, 0x0a, 0x0e, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x0e, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x12, 0x67, 0x0a, 0x0e, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, - 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, - 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x74, - 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x12, 0x74, 0x0a, 0x13, - 0x61, 0x70, 0x70, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x11, 0x61, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, - 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x5e, 0x0a, - 0x0b, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x12, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x73, 0x1a, 0x3a, 0x0a, - 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x80, 0x01, 0x0a, 0x16, 0x41, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 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, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x81, 0x01, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x12, 0x34, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x79, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x41, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x79, 0x1a, 0x7c, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x50, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x12, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, - 0x41, 0x70, 0x70, 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, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, - 0x70, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0xad, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x65, - 0x6e, 0x74, 0x41, 0x70, 0x70, 0x12, 0x2b, 0x0a, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, - 0x6f, 0x64, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x8b, 0x02, 0x0a, 0x06, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x76, 0x0a, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x6e, - 0x74, 0x41, 0x70, 0x70, 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, 0x4d, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x61, + 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x6c, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 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, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0xb6, 0x10, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, + 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, + 0x73, 0x5f, 0x64, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x69, 0x73, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, + 0x67, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x67, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, + 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x12, 0x3c, 0x0a, 0x1b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x61, + 0x6d, 0x65, 0x55, 0x73, 0x65, 0x64, 0x41, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, + 0x73, 0x0a, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, - 0x74, 0x41, 0x70, 0x70, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xaa, 0x01, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x12, 0x70, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x74, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x43, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x12, 0x67, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, + 0x67, 0x0a, 0x0e, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, + 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, + 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x12, 0x74, 0x0a, 0x13, 0x61, 0x70, 0x70, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, + 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x70, 0x70, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x29, + 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, + 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x5e, 0x0a, 0x0b, 0x72, 0x65, 0x63, + 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, + 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x72, + 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x80, 0x01, 0x0a, 0x16, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x92, 0x01, 0x0a, - 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, - 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, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, + 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 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, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x81, 0x01, + 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x34, + 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x61, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x79, 0x41, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, + 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x79, 0x1a, 0x7c, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x5c, 0x0a, 0x12, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 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, 0x2a, 0x3e, 0x0a, 0x19, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x07, - 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x4f, 0x52, 0x44, - 0x45, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, - 0x03, 0x2a, 0x83, 0x01, 0x0a, 0x1a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, - 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x06, 0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x48, 0x52, 0x45, 0x53, - 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x02, 0x12, - 0x0e, 0x0a, 0x0a, 0x41, 0x50, 0x50, 0x5f, 0x44, 0x45, 0x4e, 0x49, 0x45, 0x44, 0x10, 0x03, 0x12, - 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, - 0x43, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x42, 0x30, 0x5a, 0x2e, 0x76, 0x69, 0x74, 0x65, 0x73, - 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, - 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 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, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x52, 0x75, + 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, + 0x16, 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 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, 0xad, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, + 0x70, 0x12, 0x2b, 0x0a, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, + 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, + 0x6f, 0x64, 0x65, 0x1a, 0x76, 0x0a, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, + 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, 0x4d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x01, 0x0a, 0x11, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 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, 0x92, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x43, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 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, 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, 0x2a, 0x3e, 0x0a, + 0x19, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, + 0x59, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x01, + 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x2a, 0x83, 0x01, + 0x0a, 0x1a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0d, 0x0a, 0x09, + 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4f, + 0x4b, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, + 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x41, + 0x50, 0x50, 0x5f, 0x44, 0x45, 0x4e, 0x49, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x10, 0x04, 0x12, + 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x10, 0x05, 0x42, 0x30, 0x5a, 0x2e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, + 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -9287,7 +9349,7 @@ func file_tabletmanagerdata_proto_rawDescGZIP() []byte { } var file_tabletmanagerdata_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_tabletmanagerdata_proto_msgTypes = make([]protoimpl.MessageInfo, 165) +var file_tabletmanagerdata_proto_msgTypes = make([]protoimpl.MessageInfo, 166) var file_tabletmanagerdata_proto_goTypes = []any{ (TabletSelectionPreference)(0), // 0: tabletmanagerdata.TabletSelectionPreference (CheckThrottlerResponseCode)(0), // 1: tabletmanagerdata.CheckThrottlerResponseCode @@ -9423,163 +9485,166 @@ var file_tabletmanagerdata_proto_goTypes = []any{ (*VDiffReportOptions)(nil), // 131: tabletmanagerdata.VDiffReportOptions (*VDiffCoreOptions)(nil), // 132: tabletmanagerdata.VDiffCoreOptions (*VDiffOptions)(nil), // 133: tabletmanagerdata.VDiffOptions - (*UpdateVReplicationWorkflowRequest)(nil), // 134: tabletmanagerdata.UpdateVReplicationWorkflowRequest - (*UpdateVReplicationWorkflowResponse)(nil), // 135: tabletmanagerdata.UpdateVReplicationWorkflowResponse - (*UpdateVReplicationWorkflowsRequest)(nil), // 136: tabletmanagerdata.UpdateVReplicationWorkflowsRequest - (*UpdateVReplicationWorkflowsResponse)(nil), // 137: tabletmanagerdata.UpdateVReplicationWorkflowsResponse - (*ResetSequencesRequest)(nil), // 138: tabletmanagerdata.ResetSequencesRequest - (*ResetSequencesResponse)(nil), // 139: tabletmanagerdata.ResetSequencesResponse - (*CheckThrottlerRequest)(nil), // 140: tabletmanagerdata.CheckThrottlerRequest - (*CheckThrottlerResponse)(nil), // 141: tabletmanagerdata.CheckThrottlerResponse - (*GetThrottlerStatusRequest)(nil), // 142: tabletmanagerdata.GetThrottlerStatusRequest - (*GetThrottlerStatusResponse)(nil), // 143: tabletmanagerdata.GetThrottlerStatusResponse - (*ChangeTagsRequest)(nil), // 144: tabletmanagerdata.ChangeTagsRequest - (*ChangeTagsResponse)(nil), // 145: tabletmanagerdata.ChangeTagsResponse - nil, // 146: tabletmanagerdata.UserPermission.PrivilegesEntry - nil, // 147: tabletmanagerdata.DbPermission.PrivilegesEntry - nil, // 148: tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry - nil, // 149: tabletmanagerdata.GetGlobalStatusVarsResponse.StatusValuesEntry - nil, // 150: tabletmanagerdata.DeleteTableDataRequest.TableFiltersEntry - (*ReadVReplicationWorkflowResponse_Stream)(nil), // 151: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream - nil, // 152: tabletmanagerdata.ReadVReplicationWorkflowResponse.ConfigOverridesEntry - nil, // 153: tabletmanagerdata.UpdateVReplicationWorkflowRequest.ConfigOverridesEntry - (*CheckThrottlerResponse_Metric)(nil), // 154: tabletmanagerdata.CheckThrottlerResponse.Metric - nil, // 155: tabletmanagerdata.CheckThrottlerResponse.MetricsEntry - (*GetThrottlerStatusResponse_MetricResult)(nil), // 156: tabletmanagerdata.GetThrottlerStatusResponse.MetricResult - nil, // 157: tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry - nil, // 158: tabletmanagerdata.GetThrottlerStatusResponse.MetricThresholdsEntry - (*GetThrottlerStatusResponse_MetricHealth)(nil), // 159: tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth - nil, // 160: tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry - nil, // 161: tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry - nil, // 162: tabletmanagerdata.GetThrottlerStatusResponse.AppCheckedMetricsEntry - (*GetThrottlerStatusResponse_RecentApp)(nil), // 163: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp - nil, // 164: tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry - nil, // 165: tabletmanagerdata.ChangeTagsRequest.TagsEntry - nil, // 166: tabletmanagerdata.ChangeTagsResponse.TagsEntry - (*query.Field)(nil), // 167: query.Field - (topodata.TabletType)(0), // 168: topodata.TabletType - (*vtrpc.CallerID)(nil), // 169: vtrpc.CallerID - (*query.QueryResult)(nil), // 170: query.QueryResult - (*query.TransactionMetadata)(nil), // 171: query.TransactionMetadata - (*mysqlctl.HostMetricsResponse)(nil), // 172: mysqlctl.HostMetricsResponse - (*replicationdata.Status)(nil), // 173: replicationdata.Status - (*replicationdata.PrimaryStatus)(nil), // 174: replicationdata.PrimaryStatus - (*topodata.TabletAlias)(nil), // 175: topodata.TabletAlias - (*replicationdata.FullStatus)(nil), // 176: replicationdata.FullStatus - (replicationdata.StopReplicationMode)(0), // 177: replicationdata.StopReplicationMode - (*replicationdata.StopReplicationStatus)(nil), // 178: replicationdata.StopReplicationStatus - (*logutil.Event)(nil), // 179: logutil.Event - (*vttime.Time)(nil), // 180: vttime.Time - (*binlogdata.BinlogSource)(nil), // 181: binlogdata.BinlogSource - (binlogdata.VReplicationWorkflowType)(0), // 182: binlogdata.VReplicationWorkflowType - (binlogdata.VReplicationWorkflowSubType)(0), // 183: binlogdata.VReplicationWorkflowSubType - (binlogdata.VReplicationWorkflowState)(0), // 184: binlogdata.VReplicationWorkflowState - (binlogdata.OnDDLAction)(0), // 185: binlogdata.OnDDLAction - (*topodata.ThrottledAppRule)(nil), // 186: topodata.ThrottledAppRule + (*VDiffTableLastPK)(nil), // 134: tabletmanagerdata.VDiffTableLastPK + (*UpdateVReplicationWorkflowRequest)(nil), // 135: tabletmanagerdata.UpdateVReplicationWorkflowRequest + (*UpdateVReplicationWorkflowResponse)(nil), // 136: tabletmanagerdata.UpdateVReplicationWorkflowResponse + (*UpdateVReplicationWorkflowsRequest)(nil), // 137: tabletmanagerdata.UpdateVReplicationWorkflowsRequest + (*UpdateVReplicationWorkflowsResponse)(nil), // 138: tabletmanagerdata.UpdateVReplicationWorkflowsResponse + (*ResetSequencesRequest)(nil), // 139: tabletmanagerdata.ResetSequencesRequest + (*ResetSequencesResponse)(nil), // 140: tabletmanagerdata.ResetSequencesResponse + (*CheckThrottlerRequest)(nil), // 141: tabletmanagerdata.CheckThrottlerRequest + (*CheckThrottlerResponse)(nil), // 142: tabletmanagerdata.CheckThrottlerResponse + (*GetThrottlerStatusRequest)(nil), // 143: tabletmanagerdata.GetThrottlerStatusRequest + (*GetThrottlerStatusResponse)(nil), // 144: tabletmanagerdata.GetThrottlerStatusResponse + (*ChangeTagsRequest)(nil), // 145: tabletmanagerdata.ChangeTagsRequest + (*ChangeTagsResponse)(nil), // 146: tabletmanagerdata.ChangeTagsResponse + nil, // 147: tabletmanagerdata.UserPermission.PrivilegesEntry + nil, // 148: tabletmanagerdata.DbPermission.PrivilegesEntry + nil, // 149: tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry + nil, // 150: tabletmanagerdata.GetGlobalStatusVarsResponse.StatusValuesEntry + nil, // 151: tabletmanagerdata.DeleteTableDataRequest.TableFiltersEntry + (*ReadVReplicationWorkflowResponse_Stream)(nil), // 152: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream + nil, // 153: tabletmanagerdata.ReadVReplicationWorkflowResponse.ConfigOverridesEntry + nil, // 154: tabletmanagerdata.UpdateVReplicationWorkflowRequest.ConfigOverridesEntry + (*CheckThrottlerResponse_Metric)(nil), // 155: tabletmanagerdata.CheckThrottlerResponse.Metric + nil, // 156: tabletmanagerdata.CheckThrottlerResponse.MetricsEntry + (*GetThrottlerStatusResponse_MetricResult)(nil), // 157: tabletmanagerdata.GetThrottlerStatusResponse.MetricResult + nil, // 158: tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry + nil, // 159: tabletmanagerdata.GetThrottlerStatusResponse.MetricThresholdsEntry + (*GetThrottlerStatusResponse_MetricHealth)(nil), // 160: tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth + nil, // 161: tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry + nil, // 162: tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry + nil, // 163: tabletmanagerdata.GetThrottlerStatusResponse.AppCheckedMetricsEntry + (*GetThrottlerStatusResponse_RecentApp)(nil), // 164: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp + nil, // 165: tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry + nil, // 166: tabletmanagerdata.ChangeTagsRequest.TagsEntry + nil, // 167: tabletmanagerdata.ChangeTagsResponse.TagsEntry + (*query.Field)(nil), // 168: query.Field + (topodata.TabletType)(0), // 169: topodata.TabletType + (*vtrpc.CallerID)(nil), // 170: vtrpc.CallerID + (*query.QueryResult)(nil), // 171: query.QueryResult + (*query.TransactionMetadata)(nil), // 172: query.TransactionMetadata + (*mysqlctl.HostMetricsResponse)(nil), // 173: mysqlctl.HostMetricsResponse + (*replicationdata.Status)(nil), // 174: replicationdata.Status + (*replicationdata.PrimaryStatus)(nil), // 175: replicationdata.PrimaryStatus + (*topodata.TabletAlias)(nil), // 176: topodata.TabletAlias + (*replicationdata.FullStatus)(nil), // 177: replicationdata.FullStatus + (replicationdata.StopReplicationMode)(0), // 178: replicationdata.StopReplicationMode + (*replicationdata.StopReplicationStatus)(nil), // 179: replicationdata.StopReplicationStatus + (*logutil.Event)(nil), // 180: logutil.Event + (*vttime.Time)(nil), // 181: vttime.Time + (*binlogdata.BinlogSource)(nil), // 182: binlogdata.BinlogSource + (binlogdata.VReplicationWorkflowType)(0), // 183: binlogdata.VReplicationWorkflowType + (binlogdata.VReplicationWorkflowSubType)(0), // 184: binlogdata.VReplicationWorkflowSubType + (binlogdata.VReplicationWorkflowState)(0), // 185: binlogdata.VReplicationWorkflowState + (binlogdata.OnDDLAction)(0), // 186: binlogdata.OnDDLAction + (*topodata.ThrottledAppRule)(nil), // 187: topodata.ThrottledAppRule } var file_tabletmanagerdata_proto_depIdxs = []int32{ - 167, // 0: tabletmanagerdata.TableDefinition.fields:type_name -> query.Field + 168, // 0: tabletmanagerdata.TableDefinition.fields:type_name -> query.Field 2, // 1: tabletmanagerdata.SchemaDefinition.table_definitions:type_name -> tabletmanagerdata.TableDefinition 3, // 2: tabletmanagerdata.SchemaChangeResult.before_schema:type_name -> tabletmanagerdata.SchemaDefinition 3, // 3: tabletmanagerdata.SchemaChangeResult.after_schema:type_name -> tabletmanagerdata.SchemaDefinition - 146, // 4: tabletmanagerdata.UserPermission.privileges:type_name -> tabletmanagerdata.UserPermission.PrivilegesEntry - 147, // 5: tabletmanagerdata.DbPermission.privileges:type_name -> tabletmanagerdata.DbPermission.PrivilegesEntry + 147, // 4: tabletmanagerdata.UserPermission.privileges:type_name -> tabletmanagerdata.UserPermission.PrivilegesEntry + 148, // 5: tabletmanagerdata.DbPermission.privileges:type_name -> tabletmanagerdata.DbPermission.PrivilegesEntry 5, // 6: tabletmanagerdata.Permissions.user_permissions:type_name -> tabletmanagerdata.UserPermission 6, // 7: tabletmanagerdata.Permissions.db_permissions:type_name -> tabletmanagerdata.DbPermission - 148, // 8: tabletmanagerdata.ExecuteHookRequest.extra_env:type_name -> tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry + 149, // 8: tabletmanagerdata.ExecuteHookRequest.extra_env:type_name -> tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry 3, // 9: tabletmanagerdata.GetSchemaResponse.schema_definition:type_name -> tabletmanagerdata.SchemaDefinition 7, // 10: tabletmanagerdata.GetPermissionsResponse.permissions:type_name -> tabletmanagerdata.Permissions - 149, // 11: tabletmanagerdata.GetGlobalStatusVarsResponse.status_values:type_name -> tabletmanagerdata.GetGlobalStatusVarsResponse.StatusValuesEntry - 168, // 12: tabletmanagerdata.ChangeTypeRequest.tablet_type:type_name -> topodata.TabletType + 150, // 11: tabletmanagerdata.GetGlobalStatusVarsResponse.status_values:type_name -> tabletmanagerdata.GetGlobalStatusVarsResponse.StatusValuesEntry + 169, // 12: tabletmanagerdata.ChangeTypeRequest.tablet_type:type_name -> topodata.TabletType 4, // 13: tabletmanagerdata.PreflightSchemaResponse.change_results:type_name -> tabletmanagerdata.SchemaChangeResult 3, // 14: tabletmanagerdata.ApplySchemaRequest.before_schema:type_name -> tabletmanagerdata.SchemaDefinition 3, // 15: tabletmanagerdata.ApplySchemaRequest.after_schema:type_name -> tabletmanagerdata.SchemaDefinition 3, // 16: tabletmanagerdata.ApplySchemaResponse.before_schema:type_name -> tabletmanagerdata.SchemaDefinition 3, // 17: tabletmanagerdata.ApplySchemaResponse.after_schema:type_name -> tabletmanagerdata.SchemaDefinition - 169, // 18: tabletmanagerdata.ExecuteQueryRequest.caller_id:type_name -> vtrpc.CallerID - 170, // 19: tabletmanagerdata.ExecuteQueryResponse.result:type_name -> query.QueryResult - 170, // 20: tabletmanagerdata.ExecuteFetchAsDbaResponse.result:type_name -> query.QueryResult - 170, // 21: tabletmanagerdata.ExecuteMultiFetchAsDbaResponse.results:type_name -> query.QueryResult - 170, // 22: tabletmanagerdata.ExecuteFetchAsAllPrivsResponse.result:type_name -> query.QueryResult - 170, // 23: tabletmanagerdata.ExecuteFetchAsAppResponse.result:type_name -> query.QueryResult - 171, // 24: tabletmanagerdata.GetUnresolvedTransactionsResponse.transactions:type_name -> query.TransactionMetadata - 171, // 25: tabletmanagerdata.ReadTransactionResponse.transaction:type_name -> query.TransactionMetadata - 172, // 26: tabletmanagerdata.MysqlHostMetricsResponse.HostMetrics:type_name -> mysqlctl.HostMetricsResponse - 173, // 27: tabletmanagerdata.ReplicationStatusResponse.status:type_name -> replicationdata.Status - 174, // 28: tabletmanagerdata.PrimaryStatusResponse.status:type_name -> replicationdata.PrimaryStatus - 170, // 29: tabletmanagerdata.VReplicationExecResponse.result:type_name -> query.QueryResult - 175, // 30: tabletmanagerdata.PopulateReparentJournalRequest.primary_alias:type_name -> topodata.TabletAlias - 175, // 31: tabletmanagerdata.InitReplicaRequest.parent:type_name -> topodata.TabletAlias - 174, // 32: tabletmanagerdata.DemotePrimaryResponse.primary_status:type_name -> replicationdata.PrimaryStatus - 176, // 33: tabletmanagerdata.FullStatusResponse.status:type_name -> replicationdata.FullStatus - 175, // 34: tabletmanagerdata.SetReplicationSourceRequest.parent:type_name -> topodata.TabletAlias - 175, // 35: tabletmanagerdata.ReplicaWasRestartedRequest.parent:type_name -> topodata.TabletAlias - 177, // 36: tabletmanagerdata.StopReplicationAndGetStatusRequest.stop_replication_mode:type_name -> replicationdata.StopReplicationMode - 178, // 37: tabletmanagerdata.StopReplicationAndGetStatusResponse.status:type_name -> replicationdata.StopReplicationStatus - 179, // 38: tabletmanagerdata.BackupResponse.event:type_name -> logutil.Event - 180, // 39: tabletmanagerdata.RestoreFromBackupRequest.backup_time:type_name -> vttime.Time - 180, // 40: tabletmanagerdata.RestoreFromBackupRequest.restore_to_timestamp:type_name -> vttime.Time - 179, // 41: tabletmanagerdata.RestoreFromBackupResponse.event:type_name -> logutil.Event - 181, // 42: tabletmanagerdata.CreateVReplicationWorkflowRequest.binlog_source:type_name -> binlogdata.BinlogSource - 168, // 43: tabletmanagerdata.CreateVReplicationWorkflowRequest.tablet_types:type_name -> topodata.TabletType + 170, // 18: tabletmanagerdata.ExecuteQueryRequest.caller_id:type_name -> vtrpc.CallerID + 171, // 19: tabletmanagerdata.ExecuteQueryResponse.result:type_name -> query.QueryResult + 171, // 20: tabletmanagerdata.ExecuteFetchAsDbaResponse.result:type_name -> query.QueryResult + 171, // 21: tabletmanagerdata.ExecuteMultiFetchAsDbaResponse.results:type_name -> query.QueryResult + 171, // 22: tabletmanagerdata.ExecuteFetchAsAllPrivsResponse.result:type_name -> query.QueryResult + 171, // 23: tabletmanagerdata.ExecuteFetchAsAppResponse.result:type_name -> query.QueryResult + 172, // 24: tabletmanagerdata.GetUnresolvedTransactionsResponse.transactions:type_name -> query.TransactionMetadata + 172, // 25: tabletmanagerdata.ReadTransactionResponse.transaction:type_name -> query.TransactionMetadata + 173, // 26: tabletmanagerdata.MysqlHostMetricsResponse.HostMetrics:type_name -> mysqlctl.HostMetricsResponse + 174, // 27: tabletmanagerdata.ReplicationStatusResponse.status:type_name -> replicationdata.Status + 175, // 28: tabletmanagerdata.PrimaryStatusResponse.status:type_name -> replicationdata.PrimaryStatus + 171, // 29: tabletmanagerdata.VReplicationExecResponse.result:type_name -> query.QueryResult + 176, // 30: tabletmanagerdata.PopulateReparentJournalRequest.primary_alias:type_name -> topodata.TabletAlias + 176, // 31: tabletmanagerdata.InitReplicaRequest.parent:type_name -> topodata.TabletAlias + 175, // 32: tabletmanagerdata.DemotePrimaryResponse.primary_status:type_name -> replicationdata.PrimaryStatus + 177, // 33: tabletmanagerdata.FullStatusResponse.status:type_name -> replicationdata.FullStatus + 176, // 34: tabletmanagerdata.SetReplicationSourceRequest.parent:type_name -> topodata.TabletAlias + 176, // 35: tabletmanagerdata.ReplicaWasRestartedRequest.parent:type_name -> topodata.TabletAlias + 178, // 36: tabletmanagerdata.StopReplicationAndGetStatusRequest.stop_replication_mode:type_name -> replicationdata.StopReplicationMode + 179, // 37: tabletmanagerdata.StopReplicationAndGetStatusResponse.status:type_name -> replicationdata.StopReplicationStatus + 180, // 38: tabletmanagerdata.BackupResponse.event:type_name -> logutil.Event + 181, // 39: tabletmanagerdata.RestoreFromBackupRequest.backup_time:type_name -> vttime.Time + 181, // 40: tabletmanagerdata.RestoreFromBackupRequest.restore_to_timestamp:type_name -> vttime.Time + 180, // 41: tabletmanagerdata.RestoreFromBackupResponse.event:type_name -> logutil.Event + 182, // 42: tabletmanagerdata.CreateVReplicationWorkflowRequest.binlog_source:type_name -> binlogdata.BinlogSource + 169, // 43: tabletmanagerdata.CreateVReplicationWorkflowRequest.tablet_types:type_name -> topodata.TabletType 0, // 44: tabletmanagerdata.CreateVReplicationWorkflowRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 182, // 45: tabletmanagerdata.CreateVReplicationWorkflowRequest.workflow_type:type_name -> binlogdata.VReplicationWorkflowType - 183, // 46: tabletmanagerdata.CreateVReplicationWorkflowRequest.workflow_sub_type:type_name -> binlogdata.VReplicationWorkflowSubType - 170, // 47: tabletmanagerdata.CreateVReplicationWorkflowResponse.result:type_name -> query.QueryResult - 150, // 48: tabletmanagerdata.DeleteTableDataRequest.table_filters:type_name -> tabletmanagerdata.DeleteTableDataRequest.TableFiltersEntry - 170, // 49: tabletmanagerdata.DeleteVReplicationWorkflowResponse.result:type_name -> query.QueryResult - 184, // 50: tabletmanagerdata.ReadVReplicationWorkflowsRequest.include_states:type_name -> binlogdata.VReplicationWorkflowState - 184, // 51: tabletmanagerdata.ReadVReplicationWorkflowsRequest.exclude_states:type_name -> binlogdata.VReplicationWorkflowState + 183, // 45: tabletmanagerdata.CreateVReplicationWorkflowRequest.workflow_type:type_name -> binlogdata.VReplicationWorkflowType + 184, // 46: tabletmanagerdata.CreateVReplicationWorkflowRequest.workflow_sub_type:type_name -> binlogdata.VReplicationWorkflowSubType + 171, // 47: tabletmanagerdata.CreateVReplicationWorkflowResponse.result:type_name -> query.QueryResult + 151, // 48: tabletmanagerdata.DeleteTableDataRequest.table_filters:type_name -> tabletmanagerdata.DeleteTableDataRequest.TableFiltersEntry + 171, // 49: tabletmanagerdata.DeleteVReplicationWorkflowResponse.result:type_name -> query.QueryResult + 185, // 50: tabletmanagerdata.ReadVReplicationWorkflowsRequest.include_states:type_name -> binlogdata.VReplicationWorkflowState + 185, // 51: tabletmanagerdata.ReadVReplicationWorkflowsRequest.exclude_states:type_name -> binlogdata.VReplicationWorkflowState 125, // 52: tabletmanagerdata.ReadVReplicationWorkflowsResponse.workflows:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse - 168, // 53: tabletmanagerdata.ReadVReplicationWorkflowResponse.tablet_types:type_name -> topodata.TabletType + 169, // 53: tabletmanagerdata.ReadVReplicationWorkflowResponse.tablet_types:type_name -> topodata.TabletType 0, // 54: tabletmanagerdata.ReadVReplicationWorkflowResponse.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 182, // 55: tabletmanagerdata.ReadVReplicationWorkflowResponse.workflow_type:type_name -> binlogdata.VReplicationWorkflowType - 183, // 56: tabletmanagerdata.ReadVReplicationWorkflowResponse.workflow_sub_type:type_name -> binlogdata.VReplicationWorkflowSubType - 151, // 57: tabletmanagerdata.ReadVReplicationWorkflowResponse.streams:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream - 152, // 58: tabletmanagerdata.ReadVReplicationWorkflowResponse.config_overrides:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse.ConfigOverridesEntry + 183, // 55: tabletmanagerdata.ReadVReplicationWorkflowResponse.workflow_type:type_name -> binlogdata.VReplicationWorkflowType + 184, // 56: tabletmanagerdata.ReadVReplicationWorkflowResponse.workflow_sub_type:type_name -> binlogdata.VReplicationWorkflowSubType + 152, // 57: tabletmanagerdata.ReadVReplicationWorkflowResponse.streams:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream + 153, // 58: tabletmanagerdata.ReadVReplicationWorkflowResponse.config_overrides:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse.ConfigOverridesEntry 133, // 59: tabletmanagerdata.VDiffRequest.options:type_name -> tabletmanagerdata.VDiffOptions - 170, // 60: tabletmanagerdata.VDiffResponse.output:type_name -> query.QueryResult + 171, // 60: tabletmanagerdata.VDiffResponse.output:type_name -> query.QueryResult 130, // 61: tabletmanagerdata.VDiffOptions.picker_options:type_name -> tabletmanagerdata.VDiffPickerOptions 132, // 62: tabletmanagerdata.VDiffOptions.core_options:type_name -> tabletmanagerdata.VDiffCoreOptions 131, // 63: tabletmanagerdata.VDiffOptions.report_options:type_name -> tabletmanagerdata.VDiffReportOptions - 168, // 64: tabletmanagerdata.UpdateVReplicationWorkflowRequest.tablet_types:type_name -> topodata.TabletType - 0, // 65: tabletmanagerdata.UpdateVReplicationWorkflowRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 185, // 66: tabletmanagerdata.UpdateVReplicationWorkflowRequest.on_ddl:type_name -> binlogdata.OnDDLAction - 184, // 67: tabletmanagerdata.UpdateVReplicationWorkflowRequest.state:type_name -> binlogdata.VReplicationWorkflowState - 153, // 68: tabletmanagerdata.UpdateVReplicationWorkflowRequest.config_overrides:type_name -> tabletmanagerdata.UpdateVReplicationWorkflowRequest.ConfigOverridesEntry - 170, // 69: tabletmanagerdata.UpdateVReplicationWorkflowResponse.result:type_name -> query.QueryResult - 184, // 70: tabletmanagerdata.UpdateVReplicationWorkflowsRequest.state:type_name -> binlogdata.VReplicationWorkflowState - 170, // 71: tabletmanagerdata.UpdateVReplicationWorkflowsResponse.result:type_name -> query.QueryResult - 155, // 72: tabletmanagerdata.CheckThrottlerResponse.metrics:type_name -> tabletmanagerdata.CheckThrottlerResponse.MetricsEntry - 1, // 73: tabletmanagerdata.CheckThrottlerResponse.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode - 157, // 74: tabletmanagerdata.GetThrottlerStatusResponse.aggregated_metrics:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry - 158, // 75: tabletmanagerdata.GetThrottlerStatusResponse.metric_thresholds:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricThresholdsEntry - 160, // 76: tabletmanagerdata.GetThrottlerStatusResponse.metrics_health:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry - 161, // 77: tabletmanagerdata.GetThrottlerStatusResponse.throttled_apps:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry - 162, // 78: tabletmanagerdata.GetThrottlerStatusResponse.app_checked_metrics:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.AppCheckedMetricsEntry - 164, // 79: tabletmanagerdata.GetThrottlerStatusResponse.recent_apps:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry - 165, // 80: tabletmanagerdata.ChangeTagsRequest.tags:type_name -> tabletmanagerdata.ChangeTagsRequest.TagsEntry - 166, // 81: tabletmanagerdata.ChangeTagsResponse.tags:type_name -> tabletmanagerdata.ChangeTagsResponse.TagsEntry - 181, // 82: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.bls:type_name -> binlogdata.BinlogSource - 180, // 83: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_updated:type_name -> vttime.Time - 180, // 84: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.transaction_timestamp:type_name -> vttime.Time - 184, // 85: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.state:type_name -> binlogdata.VReplicationWorkflowState - 180, // 86: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_heartbeat:type_name -> vttime.Time - 180, // 87: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_throttled:type_name -> vttime.Time - 1, // 88: tabletmanagerdata.CheckThrottlerResponse.Metric.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode - 154, // 89: tabletmanagerdata.CheckThrottlerResponse.MetricsEntry.value:type_name -> tabletmanagerdata.CheckThrottlerResponse.Metric - 156, // 90: tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricResult - 180, // 91: tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth.last_healthy_at:type_name -> vttime.Time - 159, // 92: tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth - 186, // 93: tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry.value:type_name -> topodata.ThrottledAppRule - 180, // 94: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp.checked_at:type_name -> vttime.Time - 1, // 95: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode - 163, // 96: tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.RecentApp - 97, // [97:97] is the sub-list for method output_type - 97, // [97:97] is the sub-list for method input_type - 97, // [97:97] is the sub-list for extension type_name - 97, // [97:97] is the sub-list for extension extendee - 0, // [0:97] is the sub-list for field type_name + 171, // 64: tabletmanagerdata.VDiffTableLastPK.target:type_name -> query.QueryResult + 171, // 65: tabletmanagerdata.VDiffTableLastPK.source:type_name -> query.QueryResult + 169, // 66: tabletmanagerdata.UpdateVReplicationWorkflowRequest.tablet_types:type_name -> topodata.TabletType + 0, // 67: tabletmanagerdata.UpdateVReplicationWorkflowRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 186, // 68: tabletmanagerdata.UpdateVReplicationWorkflowRequest.on_ddl:type_name -> binlogdata.OnDDLAction + 185, // 69: tabletmanagerdata.UpdateVReplicationWorkflowRequest.state:type_name -> binlogdata.VReplicationWorkflowState + 154, // 70: tabletmanagerdata.UpdateVReplicationWorkflowRequest.config_overrides:type_name -> tabletmanagerdata.UpdateVReplicationWorkflowRequest.ConfigOverridesEntry + 171, // 71: tabletmanagerdata.UpdateVReplicationWorkflowResponse.result:type_name -> query.QueryResult + 185, // 72: tabletmanagerdata.UpdateVReplicationWorkflowsRequest.state:type_name -> binlogdata.VReplicationWorkflowState + 171, // 73: tabletmanagerdata.UpdateVReplicationWorkflowsResponse.result:type_name -> query.QueryResult + 156, // 74: tabletmanagerdata.CheckThrottlerResponse.metrics:type_name -> tabletmanagerdata.CheckThrottlerResponse.MetricsEntry + 1, // 75: tabletmanagerdata.CheckThrottlerResponse.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode + 158, // 76: tabletmanagerdata.GetThrottlerStatusResponse.aggregated_metrics:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry + 159, // 77: tabletmanagerdata.GetThrottlerStatusResponse.metric_thresholds:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricThresholdsEntry + 161, // 78: tabletmanagerdata.GetThrottlerStatusResponse.metrics_health:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry + 162, // 79: tabletmanagerdata.GetThrottlerStatusResponse.throttled_apps:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry + 163, // 80: tabletmanagerdata.GetThrottlerStatusResponse.app_checked_metrics:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.AppCheckedMetricsEntry + 165, // 81: tabletmanagerdata.GetThrottlerStatusResponse.recent_apps:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry + 166, // 82: tabletmanagerdata.ChangeTagsRequest.tags:type_name -> tabletmanagerdata.ChangeTagsRequest.TagsEntry + 167, // 83: tabletmanagerdata.ChangeTagsResponse.tags:type_name -> tabletmanagerdata.ChangeTagsResponse.TagsEntry + 182, // 84: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.bls:type_name -> binlogdata.BinlogSource + 181, // 85: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_updated:type_name -> vttime.Time + 181, // 86: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.transaction_timestamp:type_name -> vttime.Time + 185, // 87: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.state:type_name -> binlogdata.VReplicationWorkflowState + 181, // 88: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_heartbeat:type_name -> vttime.Time + 181, // 89: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_throttled:type_name -> vttime.Time + 1, // 90: tabletmanagerdata.CheckThrottlerResponse.Metric.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode + 155, // 91: tabletmanagerdata.CheckThrottlerResponse.MetricsEntry.value:type_name -> tabletmanagerdata.CheckThrottlerResponse.Metric + 157, // 92: tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricResult + 181, // 93: tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth.last_healthy_at:type_name -> vttime.Time + 160, // 94: tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth + 187, // 95: tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry.value:type_name -> topodata.ThrottledAppRule + 181, // 96: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp.checked_at:type_name -> vttime.Time + 1, // 97: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode + 164, // 98: tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.RecentApp + 99, // [99:99] is the sub-list for method output_type + 99, // [99:99] is the sub-list for method input_type + 99, // [99:99] is the sub-list for extension type_name + 99, // [99:99] is the sub-list for extension extendee + 0, // [0:99] is the sub-list for field type_name } func init() { file_tabletmanagerdata_proto_init() } @@ -9590,14 +9655,15 @@ func file_tabletmanagerdata_proto_init() { file_tabletmanagerdata_proto_msgTypes[108].OneofWrappers = []any{} file_tabletmanagerdata_proto_msgTypes[130].OneofWrappers = []any{} file_tabletmanagerdata_proto_msgTypes[132].OneofWrappers = []any{} - file_tabletmanagerdata_proto_msgTypes[134].OneofWrappers = []any{} + file_tabletmanagerdata_proto_msgTypes[133].OneofWrappers = []any{} + file_tabletmanagerdata_proto_msgTypes[135].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_tabletmanagerdata_proto_rawDesc, NumEnums: 2, - NumMessages: 165, + NumMessages: 166, NumExtensions: 0, NumServices: 0, }, diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go index 9f6b0df851b..eaedd9c4bc7 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go @@ -2579,6 +2579,24 @@ func (m *VDiffOptions) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *VDiffTableLastPK) CloneVT() *VDiffTableLastPK { + if m == nil { + return (*VDiffTableLastPK)(nil) + } + r := new(VDiffTableLastPK) + r.Target = m.Target.CloneVT() + r.Source = m.Source.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *VDiffTableLastPK) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *UpdateVReplicationWorkflowRequest) CloneVT() *UpdateVReplicationWorkflowRequest { if m == nil { return (*UpdateVReplicationWorkflowRequest)(nil) @@ -9350,6 +9368,59 @@ func (m *VDiffOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *VDiffTableLastPK) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VDiffTableLastPK) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *VDiffTableLastPK) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Source != nil { + size, err := m.Source.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if m.Target != nil { + size, err := m.Target.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *UpdateVReplicationWorkflowRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -12772,6 +12843,24 @@ func (m *VDiffOptions) SizeVT() (n int) { return n } +func (m *VDiffTableLastPK) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Target != nil { + l = m.Target.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Source != nil { + l = m.Source.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + func (m *UpdateVReplicationWorkflowRequest) SizeVT() (n int) { if m == nil { return 0 @@ -27261,6 +27350,129 @@ func (m *VDiffOptions) UnmarshalVT(dAtA []byte) error { } return nil } +func (m *VDiffTableLastPK) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VDiffTableLastPK: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VDiffTableLastPK: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Target == nil { + m.Target = &query.QueryResult{} + } + if err := m.Target.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Source == nil { + m.Source = &query.QueryResult{} + } + if err := m.Source.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *UpdateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/go/vt/proto/topodata/cached_size.go b/go/vt/proto/topodata/cached_size.go index 94b7fc6818c..3feead01bae 100644 --- a/go/vt/proto/topodata/cached_size.go +++ b/go/vt/proto/topodata/cached_size.go @@ -27,6 +27,10 @@ func (cached *KeyRange) CachedSize(alloc bool) int64 { if alloc { size += int64(96) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } // field Start []byte { size += hack.RuntimeAllocSize(int64(cap(cached.Start))) @@ -45,6 +49,10 @@ func (cached *ThrottledAppRule) CachedSize(alloc bool) int64 { if alloc { size += int64(80) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } // field Name string size += hack.RuntimeAllocSize(int64(len(cached.Name))) // field ExpiresAt *vitess.io/vitess/go/vt/proto/vttime.Time diff --git a/go/vt/proto/vtctldata/vtctldata.pb.go b/go/vt/proto/vtctldata/vtctldata.pb.go index f675a190faa..98a791e9534 100644 --- a/go/vt/proto/vtctldata/vtctldata.pb.go +++ b/go/vt/proto/vtctldata/vtctldata.pb.go @@ -3222,6 +3222,143 @@ func (x *CompleteSchemaMigrationResponse) GetRowsAffectedByShard() map[string]ui return nil } +type CopySchemaShardRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SourceTabletAlias *topodata.TabletAlias `protobuf:"bytes,1,opt,name=source_tablet_alias,json=sourceTabletAlias,proto3" json:"source_tablet_alias,omitempty"` + Tables []string `protobuf:"bytes,2,rep,name=tables,proto3" json:"tables,omitempty"` + ExcludeTables []string `protobuf:"bytes,3,rep,name=exclude_tables,json=excludeTables,proto3" json:"exclude_tables,omitempty"` + IncludeViews bool `protobuf:"varint,4,opt,name=include_views,json=includeViews,proto3" json:"include_views,omitempty"` + SkipVerify bool `protobuf:"varint,5,opt,name=skip_verify,json=skipVerify,proto3" json:"skip_verify,omitempty"` + WaitReplicasTimeout *vttime.Duration `protobuf:"bytes,6,opt,name=wait_replicas_timeout,json=waitReplicasTimeout,proto3" json:"wait_replicas_timeout,omitempty"` + DestinationKeyspace string `protobuf:"bytes,7,opt,name=destination_keyspace,json=destinationKeyspace,proto3" json:"destination_keyspace,omitempty"` + DestinationShard string `protobuf:"bytes,8,opt,name=destination_shard,json=destinationShard,proto3" json:"destination_shard,omitempty"` +} + +func (x *CopySchemaShardRequest) Reset() { + *x = CopySchemaShardRequest{} + mi := &file_vtctldata_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CopySchemaShardRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CopySchemaShardRequest) ProtoMessage() {} + +func (x *CopySchemaShardRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[38] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CopySchemaShardRequest.ProtoReflect.Descriptor instead. +func (*CopySchemaShardRequest) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{38} +} + +func (x *CopySchemaShardRequest) GetSourceTabletAlias() *topodata.TabletAlias { + if x != nil { + return x.SourceTabletAlias + } + return nil +} + +func (x *CopySchemaShardRequest) GetTables() []string { + if x != nil { + return x.Tables + } + return nil +} + +func (x *CopySchemaShardRequest) GetExcludeTables() []string { + if x != nil { + return x.ExcludeTables + } + return nil +} + +func (x *CopySchemaShardRequest) GetIncludeViews() bool { + if x != nil { + return x.IncludeViews + } + return false +} + +func (x *CopySchemaShardRequest) GetSkipVerify() bool { + if x != nil { + return x.SkipVerify + } + return false +} + +func (x *CopySchemaShardRequest) GetWaitReplicasTimeout() *vttime.Duration { + if x != nil { + return x.WaitReplicasTimeout + } + return nil +} + +func (x *CopySchemaShardRequest) GetDestinationKeyspace() string { + if x != nil { + return x.DestinationKeyspace + } + return "" +} + +func (x *CopySchemaShardRequest) GetDestinationShard() string { + if x != nil { + return x.DestinationShard + } + return "" +} + +type CopySchemaShardResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CopySchemaShardResponse) Reset() { + *x = CopySchemaShardResponse{} + mi := &file_vtctldata_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CopySchemaShardResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CopySchemaShardResponse) ProtoMessage() {} + +func (x *CopySchemaShardResponse) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[39] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CopySchemaShardResponse.ProtoReflect.Descriptor instead. +func (*CopySchemaShardResponse) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{39} +} + type CreateKeyspaceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3251,7 +3388,7 @@ type CreateKeyspaceRequest struct { func (x *CreateKeyspaceRequest) Reset() { *x = CreateKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[38] + mi := &file_vtctldata_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3263,7 +3400,7 @@ func (x *CreateKeyspaceRequest) String() string { func (*CreateKeyspaceRequest) ProtoMessage() {} func (x *CreateKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[38] + mi := &file_vtctldata_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3276,7 +3413,7 @@ func (x *CreateKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateKeyspaceRequest.ProtoReflect.Descriptor instead. func (*CreateKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{38} + return file_vtctldata_proto_rawDescGZIP(), []int{40} } func (x *CreateKeyspaceRequest) GetName() string { @@ -3346,7 +3483,7 @@ type CreateKeyspaceResponse struct { func (x *CreateKeyspaceResponse) Reset() { *x = CreateKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[39] + mi := &file_vtctldata_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3358,7 +3495,7 @@ func (x *CreateKeyspaceResponse) String() string { func (*CreateKeyspaceResponse) ProtoMessage() {} func (x *CreateKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[39] + mi := &file_vtctldata_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3371,7 +3508,7 @@ func (x *CreateKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateKeyspaceResponse.ProtoReflect.Descriptor instead. func (*CreateKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{39} + return file_vtctldata_proto_rawDescGZIP(), []int{41} } func (x *CreateKeyspaceResponse) GetKeyspace() *Keyspace { @@ -3400,7 +3537,7 @@ type CreateShardRequest struct { func (x *CreateShardRequest) Reset() { *x = CreateShardRequest{} - mi := &file_vtctldata_proto_msgTypes[40] + mi := &file_vtctldata_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3412,7 +3549,7 @@ func (x *CreateShardRequest) String() string { func (*CreateShardRequest) ProtoMessage() {} func (x *CreateShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[40] + mi := &file_vtctldata_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3425,7 +3562,7 @@ func (x *CreateShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateShardRequest.ProtoReflect.Descriptor instead. func (*CreateShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{40} + return file_vtctldata_proto_rawDescGZIP(), []int{42} } func (x *CreateShardRequest) GetKeyspace() string { @@ -3473,7 +3610,7 @@ type CreateShardResponse struct { func (x *CreateShardResponse) Reset() { *x = CreateShardResponse{} - mi := &file_vtctldata_proto_msgTypes[41] + mi := &file_vtctldata_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3485,7 +3622,7 @@ func (x *CreateShardResponse) String() string { func (*CreateShardResponse) ProtoMessage() {} func (x *CreateShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[41] + mi := &file_vtctldata_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3498,7 +3635,7 @@ func (x *CreateShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateShardResponse.ProtoReflect.Descriptor instead. func (*CreateShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{41} + return file_vtctldata_proto_rawDescGZIP(), []int{43} } func (x *CreateShardResponse) GetKeyspace() *Keyspace { @@ -3533,7 +3670,7 @@ type DeleteCellInfoRequest struct { func (x *DeleteCellInfoRequest) Reset() { *x = DeleteCellInfoRequest{} - mi := &file_vtctldata_proto_msgTypes[42] + mi := &file_vtctldata_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3545,7 +3682,7 @@ func (x *DeleteCellInfoRequest) String() string { func (*DeleteCellInfoRequest) ProtoMessage() {} func (x *DeleteCellInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[42] + mi := &file_vtctldata_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3558,7 +3695,7 @@ func (x *DeleteCellInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCellInfoRequest.ProtoReflect.Descriptor instead. func (*DeleteCellInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{42} + return file_vtctldata_proto_rawDescGZIP(), []int{44} } func (x *DeleteCellInfoRequest) GetName() string { @@ -3583,7 +3720,7 @@ type DeleteCellInfoResponse struct { func (x *DeleteCellInfoResponse) Reset() { *x = DeleteCellInfoResponse{} - mi := &file_vtctldata_proto_msgTypes[43] + mi := &file_vtctldata_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3595,7 +3732,7 @@ func (x *DeleteCellInfoResponse) String() string { func (*DeleteCellInfoResponse) ProtoMessage() {} func (x *DeleteCellInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[43] + mi := &file_vtctldata_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3608,7 +3745,7 @@ func (x *DeleteCellInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCellInfoResponse.ProtoReflect.Descriptor instead. func (*DeleteCellInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{43} + return file_vtctldata_proto_rawDescGZIP(), []int{45} } type DeleteCellsAliasRequest struct { @@ -3621,7 +3758,7 @@ type DeleteCellsAliasRequest struct { func (x *DeleteCellsAliasRequest) Reset() { *x = DeleteCellsAliasRequest{} - mi := &file_vtctldata_proto_msgTypes[44] + mi := &file_vtctldata_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3633,7 +3770,7 @@ func (x *DeleteCellsAliasRequest) String() string { func (*DeleteCellsAliasRequest) ProtoMessage() {} func (x *DeleteCellsAliasRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[44] + mi := &file_vtctldata_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3646,7 +3783,7 @@ func (x *DeleteCellsAliasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCellsAliasRequest.ProtoReflect.Descriptor instead. func (*DeleteCellsAliasRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{44} + return file_vtctldata_proto_rawDescGZIP(), []int{46} } func (x *DeleteCellsAliasRequest) GetName() string { @@ -3664,7 +3801,7 @@ type DeleteCellsAliasResponse struct { func (x *DeleteCellsAliasResponse) Reset() { *x = DeleteCellsAliasResponse{} - mi := &file_vtctldata_proto_msgTypes[45] + mi := &file_vtctldata_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3676,7 +3813,7 @@ func (x *DeleteCellsAliasResponse) String() string { func (*DeleteCellsAliasResponse) ProtoMessage() {} func (x *DeleteCellsAliasResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[45] + mi := &file_vtctldata_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3689,7 +3826,7 @@ func (x *DeleteCellsAliasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCellsAliasResponse.ProtoReflect.Descriptor instead. func (*DeleteCellsAliasResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{45} + return file_vtctldata_proto_rawDescGZIP(), []int{47} } type DeleteKeyspaceRequest struct { @@ -3710,7 +3847,7 @@ type DeleteKeyspaceRequest struct { func (x *DeleteKeyspaceRequest) Reset() { *x = DeleteKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[46] + mi := &file_vtctldata_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3722,7 +3859,7 @@ func (x *DeleteKeyspaceRequest) String() string { func (*DeleteKeyspaceRequest) ProtoMessage() {} func (x *DeleteKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[46] + mi := &file_vtctldata_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3735,7 +3872,7 @@ func (x *DeleteKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteKeyspaceRequest.ProtoReflect.Descriptor instead. func (*DeleteKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{46} + return file_vtctldata_proto_rawDescGZIP(), []int{48} } func (x *DeleteKeyspaceRequest) GetKeyspace() string { @@ -3767,7 +3904,7 @@ type DeleteKeyspaceResponse struct { func (x *DeleteKeyspaceResponse) Reset() { *x = DeleteKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[47] + mi := &file_vtctldata_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3779,7 +3916,7 @@ func (x *DeleteKeyspaceResponse) String() string { func (*DeleteKeyspaceResponse) ProtoMessage() {} func (x *DeleteKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[47] + mi := &file_vtctldata_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3792,7 +3929,7 @@ func (x *DeleteKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteKeyspaceResponse.ProtoReflect.Descriptor instead. func (*DeleteKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{47} + return file_vtctldata_proto_rawDescGZIP(), []int{49} } type DeleteShardsRequest struct { @@ -3817,7 +3954,7 @@ type DeleteShardsRequest struct { func (x *DeleteShardsRequest) Reset() { *x = DeleteShardsRequest{} - mi := &file_vtctldata_proto_msgTypes[48] + mi := &file_vtctldata_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3829,7 +3966,7 @@ func (x *DeleteShardsRequest) String() string { func (*DeleteShardsRequest) ProtoMessage() {} func (x *DeleteShardsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[48] + mi := &file_vtctldata_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3842,7 +3979,7 @@ func (x *DeleteShardsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteShardsRequest.ProtoReflect.Descriptor instead. func (*DeleteShardsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{48} + return file_vtctldata_proto_rawDescGZIP(), []int{50} } func (x *DeleteShardsRequest) GetShards() []*Shard { @@ -3881,7 +4018,7 @@ type DeleteShardsResponse struct { func (x *DeleteShardsResponse) Reset() { *x = DeleteShardsResponse{} - mi := &file_vtctldata_proto_msgTypes[49] + mi := &file_vtctldata_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3893,7 +4030,7 @@ func (x *DeleteShardsResponse) String() string { func (*DeleteShardsResponse) ProtoMessage() {} func (x *DeleteShardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[49] + mi := &file_vtctldata_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3906,7 +4043,7 @@ func (x *DeleteShardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteShardsResponse.ProtoReflect.Descriptor instead. func (*DeleteShardsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{49} + return file_vtctldata_proto_rawDescGZIP(), []int{51} } type DeleteSrvVSchemaRequest struct { @@ -3919,7 +4056,7 @@ type DeleteSrvVSchemaRequest struct { func (x *DeleteSrvVSchemaRequest) Reset() { *x = DeleteSrvVSchemaRequest{} - mi := &file_vtctldata_proto_msgTypes[50] + mi := &file_vtctldata_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3931,7 +4068,7 @@ func (x *DeleteSrvVSchemaRequest) String() string { func (*DeleteSrvVSchemaRequest) ProtoMessage() {} func (x *DeleteSrvVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[50] + mi := &file_vtctldata_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3944,7 +4081,7 @@ func (x *DeleteSrvVSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteSrvVSchemaRequest.ProtoReflect.Descriptor instead. func (*DeleteSrvVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{50} + return file_vtctldata_proto_rawDescGZIP(), []int{52} } func (x *DeleteSrvVSchemaRequest) GetCell() string { @@ -3962,7 +4099,7 @@ type DeleteSrvVSchemaResponse struct { func (x *DeleteSrvVSchemaResponse) Reset() { *x = DeleteSrvVSchemaResponse{} - mi := &file_vtctldata_proto_msgTypes[51] + mi := &file_vtctldata_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3974,7 +4111,7 @@ func (x *DeleteSrvVSchemaResponse) String() string { func (*DeleteSrvVSchemaResponse) ProtoMessage() {} func (x *DeleteSrvVSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[51] + mi := &file_vtctldata_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3987,7 +4124,7 @@ func (x *DeleteSrvVSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteSrvVSchemaResponse.ProtoReflect.Descriptor instead. func (*DeleteSrvVSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{51} + return file_vtctldata_proto_rawDescGZIP(), []int{53} } type DeleteTabletsRequest struct { @@ -4004,7 +4141,7 @@ type DeleteTabletsRequest struct { func (x *DeleteTabletsRequest) Reset() { *x = DeleteTabletsRequest{} - mi := &file_vtctldata_proto_msgTypes[52] + mi := &file_vtctldata_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4016,7 +4153,7 @@ func (x *DeleteTabletsRequest) String() string { func (*DeleteTabletsRequest) ProtoMessage() {} func (x *DeleteTabletsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[52] + mi := &file_vtctldata_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4029,7 +4166,7 @@ func (x *DeleteTabletsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTabletsRequest.ProtoReflect.Descriptor instead. func (*DeleteTabletsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{52} + return file_vtctldata_proto_rawDescGZIP(), []int{54} } func (x *DeleteTabletsRequest) GetTabletAliases() []*topodata.TabletAlias { @@ -4054,7 +4191,7 @@ type DeleteTabletsResponse struct { func (x *DeleteTabletsResponse) Reset() { *x = DeleteTabletsResponse{} - mi := &file_vtctldata_proto_msgTypes[53] + mi := &file_vtctldata_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4066,7 +4203,7 @@ func (x *DeleteTabletsResponse) String() string { func (*DeleteTabletsResponse) ProtoMessage() {} func (x *DeleteTabletsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[53] + mi := &file_vtctldata_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4079,7 +4216,7 @@ func (x *DeleteTabletsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTabletsResponse.ProtoReflect.Descriptor instead. func (*DeleteTabletsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{53} + return file_vtctldata_proto_rawDescGZIP(), []int{55} } type EmergencyReparentShardRequest struct { @@ -4115,7 +4252,7 @@ type EmergencyReparentShardRequest struct { func (x *EmergencyReparentShardRequest) Reset() { *x = EmergencyReparentShardRequest{} - mi := &file_vtctldata_proto_msgTypes[54] + mi := &file_vtctldata_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4127,7 +4264,7 @@ func (x *EmergencyReparentShardRequest) String() string { func (*EmergencyReparentShardRequest) ProtoMessage() {} func (x *EmergencyReparentShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[54] + mi := &file_vtctldata_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4140,7 +4277,7 @@ func (x *EmergencyReparentShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EmergencyReparentShardRequest.ProtoReflect.Descriptor instead. func (*EmergencyReparentShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{54} + return file_vtctldata_proto_rawDescGZIP(), []int{56} } func (x *EmergencyReparentShardRequest) GetKeyspace() string { @@ -4218,7 +4355,7 @@ type EmergencyReparentShardResponse struct { func (x *EmergencyReparentShardResponse) Reset() { *x = EmergencyReparentShardResponse{} - mi := &file_vtctldata_proto_msgTypes[55] + mi := &file_vtctldata_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4230,7 +4367,7 @@ func (x *EmergencyReparentShardResponse) String() string { func (*EmergencyReparentShardResponse) ProtoMessage() {} func (x *EmergencyReparentShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[55] + mi := &file_vtctldata_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4243,7 +4380,7 @@ func (x *EmergencyReparentShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EmergencyReparentShardResponse.ProtoReflect.Descriptor instead. func (*EmergencyReparentShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{55} + return file_vtctldata_proto_rawDescGZIP(), []int{57} } func (x *EmergencyReparentShardResponse) GetKeyspace() string { @@ -4294,7 +4431,7 @@ type ExecuteFetchAsAppRequest struct { func (x *ExecuteFetchAsAppRequest) Reset() { *x = ExecuteFetchAsAppRequest{} - mi := &file_vtctldata_proto_msgTypes[56] + mi := &file_vtctldata_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4306,7 +4443,7 @@ func (x *ExecuteFetchAsAppRequest) String() string { func (*ExecuteFetchAsAppRequest) ProtoMessage() {} func (x *ExecuteFetchAsAppRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[56] + mi := &file_vtctldata_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4319,7 +4456,7 @@ func (x *ExecuteFetchAsAppRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteFetchAsAppRequest.ProtoReflect.Descriptor instead. func (*ExecuteFetchAsAppRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{56} + return file_vtctldata_proto_rawDescGZIP(), []int{58} } func (x *ExecuteFetchAsAppRequest) GetTabletAlias() *topodata.TabletAlias { @@ -4360,7 +4497,7 @@ type ExecuteFetchAsAppResponse struct { func (x *ExecuteFetchAsAppResponse) Reset() { *x = ExecuteFetchAsAppResponse{} - mi := &file_vtctldata_proto_msgTypes[57] + mi := &file_vtctldata_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4372,7 +4509,7 @@ func (x *ExecuteFetchAsAppResponse) String() string { func (*ExecuteFetchAsAppResponse) ProtoMessage() {} func (x *ExecuteFetchAsAppResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[57] + mi := &file_vtctldata_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4385,7 +4522,7 @@ func (x *ExecuteFetchAsAppResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteFetchAsAppResponse.ProtoReflect.Descriptor instead. func (*ExecuteFetchAsAppResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{57} + return file_vtctldata_proto_rawDescGZIP(), []int{59} } func (x *ExecuteFetchAsAppResponse) GetResult() *query.QueryResult { @@ -4419,7 +4556,7 @@ type ExecuteFetchAsDBARequest struct { func (x *ExecuteFetchAsDBARequest) Reset() { *x = ExecuteFetchAsDBARequest{} - mi := &file_vtctldata_proto_msgTypes[58] + mi := &file_vtctldata_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4431,7 +4568,7 @@ func (x *ExecuteFetchAsDBARequest) String() string { func (*ExecuteFetchAsDBARequest) ProtoMessage() {} func (x *ExecuteFetchAsDBARequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[58] + mi := &file_vtctldata_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4444,7 +4581,7 @@ func (x *ExecuteFetchAsDBARequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteFetchAsDBARequest.ProtoReflect.Descriptor instead. func (*ExecuteFetchAsDBARequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{58} + return file_vtctldata_proto_rawDescGZIP(), []int{60} } func (x *ExecuteFetchAsDBARequest) GetTabletAlias() *topodata.TabletAlias { @@ -4492,7 +4629,7 @@ type ExecuteFetchAsDBAResponse struct { func (x *ExecuteFetchAsDBAResponse) Reset() { *x = ExecuteFetchAsDBAResponse{} - mi := &file_vtctldata_proto_msgTypes[59] + mi := &file_vtctldata_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4504,7 +4641,7 @@ func (x *ExecuteFetchAsDBAResponse) String() string { func (*ExecuteFetchAsDBAResponse) ProtoMessage() {} func (x *ExecuteFetchAsDBAResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[59] + mi := &file_vtctldata_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4517,7 +4654,7 @@ func (x *ExecuteFetchAsDBAResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteFetchAsDBAResponse.ProtoReflect.Descriptor instead. func (*ExecuteFetchAsDBAResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{59} + return file_vtctldata_proto_rawDescGZIP(), []int{61} } func (x *ExecuteFetchAsDBAResponse) GetResult() *query.QueryResult { @@ -4538,7 +4675,7 @@ type ExecuteHookRequest struct { func (x *ExecuteHookRequest) Reset() { *x = ExecuteHookRequest{} - mi := &file_vtctldata_proto_msgTypes[60] + mi := &file_vtctldata_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4550,7 +4687,7 @@ func (x *ExecuteHookRequest) String() string { func (*ExecuteHookRequest) ProtoMessage() {} func (x *ExecuteHookRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[60] + mi := &file_vtctldata_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4563,7 +4700,7 @@ func (x *ExecuteHookRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteHookRequest.ProtoReflect.Descriptor instead. func (*ExecuteHookRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{60} + return file_vtctldata_proto_rawDescGZIP(), []int{62} } func (x *ExecuteHookRequest) GetTabletAlias() *topodata.TabletAlias { @@ -4590,7 +4727,7 @@ type ExecuteHookResponse struct { func (x *ExecuteHookResponse) Reset() { *x = ExecuteHookResponse{} - mi := &file_vtctldata_proto_msgTypes[61] + mi := &file_vtctldata_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4602,7 +4739,7 @@ func (x *ExecuteHookResponse) String() string { func (*ExecuteHookResponse) ProtoMessage() {} func (x *ExecuteHookResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[61] + mi := &file_vtctldata_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4615,7 +4752,7 @@ func (x *ExecuteHookResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteHookResponse.ProtoReflect.Descriptor instead. func (*ExecuteHookResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{61} + return file_vtctldata_proto_rawDescGZIP(), []int{63} } func (x *ExecuteHookResponse) GetHookResult() *tabletmanagerdata.ExecuteHookResponse { @@ -4650,7 +4787,7 @@ type ExecuteMultiFetchAsDBARequest struct { func (x *ExecuteMultiFetchAsDBARequest) Reset() { *x = ExecuteMultiFetchAsDBARequest{} - mi := &file_vtctldata_proto_msgTypes[62] + mi := &file_vtctldata_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4662,7 +4799,7 @@ func (x *ExecuteMultiFetchAsDBARequest) String() string { func (*ExecuteMultiFetchAsDBARequest) ProtoMessage() {} func (x *ExecuteMultiFetchAsDBARequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[62] + mi := &file_vtctldata_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4675,7 +4812,7 @@ func (x *ExecuteMultiFetchAsDBARequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteMultiFetchAsDBARequest.ProtoReflect.Descriptor instead. func (*ExecuteMultiFetchAsDBARequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{62} + return file_vtctldata_proto_rawDescGZIP(), []int{64} } func (x *ExecuteMultiFetchAsDBARequest) GetTabletAlias() *topodata.TabletAlias { @@ -4723,7 +4860,7 @@ type ExecuteMultiFetchAsDBAResponse struct { func (x *ExecuteMultiFetchAsDBAResponse) Reset() { *x = ExecuteMultiFetchAsDBAResponse{} - mi := &file_vtctldata_proto_msgTypes[63] + mi := &file_vtctldata_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4735,7 +4872,7 @@ func (x *ExecuteMultiFetchAsDBAResponse) String() string { func (*ExecuteMultiFetchAsDBAResponse) ProtoMessage() {} func (x *ExecuteMultiFetchAsDBAResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[63] + mi := &file_vtctldata_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4748,7 +4885,7 @@ func (x *ExecuteMultiFetchAsDBAResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteMultiFetchAsDBAResponse.ProtoReflect.Descriptor instead. func (*ExecuteMultiFetchAsDBAResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{63} + return file_vtctldata_proto_rawDescGZIP(), []int{65} } func (x *ExecuteMultiFetchAsDBAResponse) GetResults() []*query.QueryResult { @@ -4768,7 +4905,7 @@ type FindAllShardsInKeyspaceRequest struct { func (x *FindAllShardsInKeyspaceRequest) Reset() { *x = FindAllShardsInKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[64] + mi := &file_vtctldata_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4780,7 +4917,7 @@ func (x *FindAllShardsInKeyspaceRequest) String() string { func (*FindAllShardsInKeyspaceRequest) ProtoMessage() {} func (x *FindAllShardsInKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[64] + mi := &file_vtctldata_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4793,7 +4930,7 @@ func (x *FindAllShardsInKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FindAllShardsInKeyspaceRequest.ProtoReflect.Descriptor instead. func (*FindAllShardsInKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{64} + return file_vtctldata_proto_rawDescGZIP(), []int{66} } func (x *FindAllShardsInKeyspaceRequest) GetKeyspace() string { @@ -4813,7 +4950,7 @@ type FindAllShardsInKeyspaceResponse struct { func (x *FindAllShardsInKeyspaceResponse) Reset() { *x = FindAllShardsInKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[65] + mi := &file_vtctldata_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4825,7 +4962,7 @@ func (x *FindAllShardsInKeyspaceResponse) String() string { func (*FindAllShardsInKeyspaceResponse) ProtoMessage() {} func (x *FindAllShardsInKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[65] + mi := &file_vtctldata_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4838,7 +4975,7 @@ func (x *FindAllShardsInKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FindAllShardsInKeyspaceResponse.ProtoReflect.Descriptor instead. func (*FindAllShardsInKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{65} + return file_vtctldata_proto_rawDescGZIP(), []int{67} } func (x *FindAllShardsInKeyspaceResponse) GetShards() map[string]*Shard { @@ -4859,7 +4996,7 @@ type ForceCutOverSchemaMigrationRequest struct { func (x *ForceCutOverSchemaMigrationRequest) Reset() { *x = ForceCutOverSchemaMigrationRequest{} - mi := &file_vtctldata_proto_msgTypes[66] + mi := &file_vtctldata_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4871,7 +5008,7 @@ func (x *ForceCutOverSchemaMigrationRequest) String() string { func (*ForceCutOverSchemaMigrationRequest) ProtoMessage() {} func (x *ForceCutOverSchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[66] + mi := &file_vtctldata_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4884,7 +5021,7 @@ func (x *ForceCutOverSchemaMigrationRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ForceCutOverSchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*ForceCutOverSchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{66} + return file_vtctldata_proto_rawDescGZIP(), []int{68} } func (x *ForceCutOverSchemaMigrationRequest) GetKeyspace() string { @@ -4911,7 +5048,7 @@ type ForceCutOverSchemaMigrationResponse struct { func (x *ForceCutOverSchemaMigrationResponse) Reset() { *x = ForceCutOverSchemaMigrationResponse{} - mi := &file_vtctldata_proto_msgTypes[67] + mi := &file_vtctldata_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4923,7 +5060,7 @@ func (x *ForceCutOverSchemaMigrationResponse) String() string { func (*ForceCutOverSchemaMigrationResponse) ProtoMessage() {} func (x *ForceCutOverSchemaMigrationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[67] + mi := &file_vtctldata_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4936,7 +5073,7 @@ func (x *ForceCutOverSchemaMigrationResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use ForceCutOverSchemaMigrationResponse.ProtoReflect.Descriptor instead. func (*ForceCutOverSchemaMigrationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{67} + return file_vtctldata_proto_rawDescGZIP(), []int{69} } func (x *ForceCutOverSchemaMigrationResponse) GetRowsAffectedByShard() map[string]uint64 { @@ -4971,7 +5108,7 @@ type GetBackupsRequest struct { func (x *GetBackupsRequest) Reset() { *x = GetBackupsRequest{} - mi := &file_vtctldata_proto_msgTypes[68] + mi := &file_vtctldata_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4983,7 +5120,7 @@ func (x *GetBackupsRequest) String() string { func (*GetBackupsRequest) ProtoMessage() {} func (x *GetBackupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[68] + mi := &file_vtctldata_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4996,7 +5133,7 @@ func (x *GetBackupsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBackupsRequest.ProtoReflect.Descriptor instead. func (*GetBackupsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{68} + return file_vtctldata_proto_rawDescGZIP(), []int{70} } func (x *GetBackupsRequest) GetKeyspace() string { @@ -5044,7 +5181,7 @@ type GetBackupsResponse struct { func (x *GetBackupsResponse) Reset() { *x = GetBackupsResponse{} - mi := &file_vtctldata_proto_msgTypes[69] + mi := &file_vtctldata_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5056,7 +5193,7 @@ func (x *GetBackupsResponse) String() string { func (*GetBackupsResponse) ProtoMessage() {} func (x *GetBackupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[69] + mi := &file_vtctldata_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5069,7 +5206,7 @@ func (x *GetBackupsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBackupsResponse.ProtoReflect.Descriptor instead. func (*GetBackupsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{69} + return file_vtctldata_proto_rawDescGZIP(), []int{71} } func (x *GetBackupsResponse) GetBackups() []*mysqlctl.BackupInfo { @@ -5089,7 +5226,7 @@ type GetCellInfoRequest struct { func (x *GetCellInfoRequest) Reset() { *x = GetCellInfoRequest{} - mi := &file_vtctldata_proto_msgTypes[70] + mi := &file_vtctldata_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5101,7 +5238,7 @@ func (x *GetCellInfoRequest) String() string { func (*GetCellInfoRequest) ProtoMessage() {} func (x *GetCellInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[70] + mi := &file_vtctldata_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5114,7 +5251,7 @@ func (x *GetCellInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellInfoRequest.ProtoReflect.Descriptor instead. func (*GetCellInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{70} + return file_vtctldata_proto_rawDescGZIP(), []int{72} } func (x *GetCellInfoRequest) GetCell() string { @@ -5134,7 +5271,7 @@ type GetCellInfoResponse struct { func (x *GetCellInfoResponse) Reset() { *x = GetCellInfoResponse{} - mi := &file_vtctldata_proto_msgTypes[71] + mi := &file_vtctldata_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5146,7 +5283,7 @@ func (x *GetCellInfoResponse) String() string { func (*GetCellInfoResponse) ProtoMessage() {} func (x *GetCellInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[71] + mi := &file_vtctldata_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5159,7 +5296,7 @@ func (x *GetCellInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellInfoResponse.ProtoReflect.Descriptor instead. func (*GetCellInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{71} + return file_vtctldata_proto_rawDescGZIP(), []int{73} } func (x *GetCellInfoResponse) GetCellInfo() *topodata.CellInfo { @@ -5177,7 +5314,7 @@ type GetCellInfoNamesRequest struct { func (x *GetCellInfoNamesRequest) Reset() { *x = GetCellInfoNamesRequest{} - mi := &file_vtctldata_proto_msgTypes[72] + mi := &file_vtctldata_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5189,7 +5326,7 @@ func (x *GetCellInfoNamesRequest) String() string { func (*GetCellInfoNamesRequest) ProtoMessage() {} func (x *GetCellInfoNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[72] + mi := &file_vtctldata_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5202,7 +5339,7 @@ func (x *GetCellInfoNamesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellInfoNamesRequest.ProtoReflect.Descriptor instead. func (*GetCellInfoNamesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{72} + return file_vtctldata_proto_rawDescGZIP(), []int{74} } type GetCellInfoNamesResponse struct { @@ -5215,7 +5352,7 @@ type GetCellInfoNamesResponse struct { func (x *GetCellInfoNamesResponse) Reset() { *x = GetCellInfoNamesResponse{} - mi := &file_vtctldata_proto_msgTypes[73] + mi := &file_vtctldata_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5227,7 +5364,7 @@ func (x *GetCellInfoNamesResponse) String() string { func (*GetCellInfoNamesResponse) ProtoMessage() {} func (x *GetCellInfoNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[73] + mi := &file_vtctldata_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5240,7 +5377,7 @@ func (x *GetCellInfoNamesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellInfoNamesResponse.ProtoReflect.Descriptor instead. func (*GetCellInfoNamesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{73} + return file_vtctldata_proto_rawDescGZIP(), []int{75} } func (x *GetCellInfoNamesResponse) GetNames() []string { @@ -5258,7 +5395,7 @@ type GetCellsAliasesRequest struct { func (x *GetCellsAliasesRequest) Reset() { *x = GetCellsAliasesRequest{} - mi := &file_vtctldata_proto_msgTypes[74] + mi := &file_vtctldata_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5270,7 +5407,7 @@ func (x *GetCellsAliasesRequest) String() string { func (*GetCellsAliasesRequest) ProtoMessage() {} func (x *GetCellsAliasesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[74] + mi := &file_vtctldata_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5283,7 +5420,7 @@ func (x *GetCellsAliasesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellsAliasesRequest.ProtoReflect.Descriptor instead. func (*GetCellsAliasesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{74} + return file_vtctldata_proto_rawDescGZIP(), []int{76} } type GetCellsAliasesResponse struct { @@ -5296,7 +5433,7 @@ type GetCellsAliasesResponse struct { func (x *GetCellsAliasesResponse) Reset() { *x = GetCellsAliasesResponse{} - mi := &file_vtctldata_proto_msgTypes[75] + mi := &file_vtctldata_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5308,7 +5445,7 @@ func (x *GetCellsAliasesResponse) String() string { func (*GetCellsAliasesResponse) ProtoMessage() {} func (x *GetCellsAliasesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[75] + mi := &file_vtctldata_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5321,7 +5458,7 @@ func (x *GetCellsAliasesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellsAliasesResponse.ProtoReflect.Descriptor instead. func (*GetCellsAliasesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{75} + return file_vtctldata_proto_rawDescGZIP(), []int{77} } func (x *GetCellsAliasesResponse) GetAliases() map[string]*topodata.CellsAlias { @@ -5341,7 +5478,7 @@ type GetFullStatusRequest struct { func (x *GetFullStatusRequest) Reset() { *x = GetFullStatusRequest{} - mi := &file_vtctldata_proto_msgTypes[76] + mi := &file_vtctldata_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5353,7 +5490,7 @@ func (x *GetFullStatusRequest) String() string { func (*GetFullStatusRequest) ProtoMessage() {} func (x *GetFullStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[76] + mi := &file_vtctldata_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5366,7 +5503,7 @@ func (x *GetFullStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFullStatusRequest.ProtoReflect.Descriptor instead. func (*GetFullStatusRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{76} + return file_vtctldata_proto_rawDescGZIP(), []int{78} } func (x *GetFullStatusRequest) GetTabletAlias() *topodata.TabletAlias { @@ -5386,7 +5523,7 @@ type GetFullStatusResponse struct { func (x *GetFullStatusResponse) Reset() { *x = GetFullStatusResponse{} - mi := &file_vtctldata_proto_msgTypes[77] + mi := &file_vtctldata_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5398,7 +5535,7 @@ func (x *GetFullStatusResponse) String() string { func (*GetFullStatusResponse) ProtoMessage() {} func (x *GetFullStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[77] + mi := &file_vtctldata_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5411,7 +5548,7 @@ func (x *GetFullStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFullStatusResponse.ProtoReflect.Descriptor instead. func (*GetFullStatusResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{77} + return file_vtctldata_proto_rawDescGZIP(), []int{79} } func (x *GetFullStatusResponse) GetStatus() *replicationdata.FullStatus { @@ -5429,7 +5566,7 @@ type GetKeyspacesRequest struct { func (x *GetKeyspacesRequest) Reset() { *x = GetKeyspacesRequest{} - mi := &file_vtctldata_proto_msgTypes[78] + mi := &file_vtctldata_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5441,7 +5578,7 @@ func (x *GetKeyspacesRequest) String() string { func (*GetKeyspacesRequest) ProtoMessage() {} func (x *GetKeyspacesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[78] + mi := &file_vtctldata_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5454,7 +5591,7 @@ func (x *GetKeyspacesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspacesRequest.ProtoReflect.Descriptor instead. func (*GetKeyspacesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{78} + return file_vtctldata_proto_rawDescGZIP(), []int{80} } type GetKeyspacesResponse struct { @@ -5467,7 +5604,7 @@ type GetKeyspacesResponse struct { func (x *GetKeyspacesResponse) Reset() { *x = GetKeyspacesResponse{} - mi := &file_vtctldata_proto_msgTypes[79] + mi := &file_vtctldata_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5479,7 +5616,7 @@ func (x *GetKeyspacesResponse) String() string { func (*GetKeyspacesResponse) ProtoMessage() {} func (x *GetKeyspacesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[79] + mi := &file_vtctldata_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5492,7 +5629,7 @@ func (x *GetKeyspacesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspacesResponse.ProtoReflect.Descriptor instead. func (*GetKeyspacesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{79} + return file_vtctldata_proto_rawDescGZIP(), []int{81} } func (x *GetKeyspacesResponse) GetKeyspaces() []*Keyspace { @@ -5512,7 +5649,7 @@ type GetKeyspaceRequest struct { func (x *GetKeyspaceRequest) Reset() { *x = GetKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[80] + mi := &file_vtctldata_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5524,7 +5661,7 @@ func (x *GetKeyspaceRequest) String() string { func (*GetKeyspaceRequest) ProtoMessage() {} func (x *GetKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[80] + mi := &file_vtctldata_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5537,7 +5674,7 @@ func (x *GetKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspaceRequest.ProtoReflect.Descriptor instead. func (*GetKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{80} + return file_vtctldata_proto_rawDescGZIP(), []int{82} } func (x *GetKeyspaceRequest) GetKeyspace() string { @@ -5557,7 +5694,7 @@ type GetKeyspaceResponse struct { func (x *GetKeyspaceResponse) Reset() { *x = GetKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[81] + mi := &file_vtctldata_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5569,7 +5706,7 @@ func (x *GetKeyspaceResponse) String() string { func (*GetKeyspaceResponse) ProtoMessage() {} func (x *GetKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[81] + mi := &file_vtctldata_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5582,7 +5719,7 @@ func (x *GetKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspaceResponse.ProtoReflect.Descriptor instead. func (*GetKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{81} + return file_vtctldata_proto_rawDescGZIP(), []int{83} } func (x *GetKeyspaceResponse) GetKeyspace() *Keyspace { @@ -5602,7 +5739,7 @@ type GetPermissionsRequest struct { func (x *GetPermissionsRequest) Reset() { *x = GetPermissionsRequest{} - mi := &file_vtctldata_proto_msgTypes[82] + mi := &file_vtctldata_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5614,7 +5751,7 @@ func (x *GetPermissionsRequest) String() string { func (*GetPermissionsRequest) ProtoMessage() {} func (x *GetPermissionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[82] + mi := &file_vtctldata_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5627,7 +5764,7 @@ func (x *GetPermissionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPermissionsRequest.ProtoReflect.Descriptor instead. func (*GetPermissionsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{82} + return file_vtctldata_proto_rawDescGZIP(), []int{84} } func (x *GetPermissionsRequest) GetTabletAlias() *topodata.TabletAlias { @@ -5647,7 +5784,7 @@ type GetPermissionsResponse struct { func (x *GetPermissionsResponse) Reset() { *x = GetPermissionsResponse{} - mi := &file_vtctldata_proto_msgTypes[83] + mi := &file_vtctldata_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5659,7 +5796,7 @@ func (x *GetPermissionsResponse) String() string { func (*GetPermissionsResponse) ProtoMessage() {} func (x *GetPermissionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[83] + mi := &file_vtctldata_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5672,7 +5809,7 @@ func (x *GetPermissionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPermissionsResponse.ProtoReflect.Descriptor instead. func (*GetPermissionsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{83} + return file_vtctldata_proto_rawDescGZIP(), []int{85} } func (x *GetPermissionsResponse) GetPermissions() *tabletmanagerdata.Permissions { @@ -5690,7 +5827,7 @@ type GetKeyspaceRoutingRulesRequest struct { func (x *GetKeyspaceRoutingRulesRequest) Reset() { *x = GetKeyspaceRoutingRulesRequest{} - mi := &file_vtctldata_proto_msgTypes[84] + mi := &file_vtctldata_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5702,7 +5839,7 @@ func (x *GetKeyspaceRoutingRulesRequest) String() string { func (*GetKeyspaceRoutingRulesRequest) ProtoMessage() {} func (x *GetKeyspaceRoutingRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[84] + mi := &file_vtctldata_proto_msgTypes[86] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5715,7 +5852,7 @@ func (x *GetKeyspaceRoutingRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspaceRoutingRulesRequest.ProtoReflect.Descriptor instead. func (*GetKeyspaceRoutingRulesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{84} + return file_vtctldata_proto_rawDescGZIP(), []int{86} } type GetKeyspaceRoutingRulesResponse struct { @@ -5728,7 +5865,7 @@ type GetKeyspaceRoutingRulesResponse struct { func (x *GetKeyspaceRoutingRulesResponse) Reset() { *x = GetKeyspaceRoutingRulesResponse{} - mi := &file_vtctldata_proto_msgTypes[85] + mi := &file_vtctldata_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5740,7 +5877,7 @@ func (x *GetKeyspaceRoutingRulesResponse) String() string { func (*GetKeyspaceRoutingRulesResponse) ProtoMessage() {} func (x *GetKeyspaceRoutingRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[85] + mi := &file_vtctldata_proto_msgTypes[87] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5753,7 +5890,7 @@ func (x *GetKeyspaceRoutingRulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspaceRoutingRulesResponse.ProtoReflect.Descriptor instead. func (*GetKeyspaceRoutingRulesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{85} + return file_vtctldata_proto_rawDescGZIP(), []int{87} } func (x *GetKeyspaceRoutingRulesResponse) GetKeyspaceRoutingRules() *vschema.KeyspaceRoutingRules { @@ -5771,7 +5908,7 @@ type GetRoutingRulesRequest struct { func (x *GetRoutingRulesRequest) Reset() { *x = GetRoutingRulesRequest{} - mi := &file_vtctldata_proto_msgTypes[86] + mi := &file_vtctldata_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5783,7 +5920,7 @@ func (x *GetRoutingRulesRequest) String() string { func (*GetRoutingRulesRequest) ProtoMessage() {} func (x *GetRoutingRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[86] + mi := &file_vtctldata_proto_msgTypes[88] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5796,7 +5933,7 @@ func (x *GetRoutingRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoutingRulesRequest.ProtoReflect.Descriptor instead. func (*GetRoutingRulesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{86} + return file_vtctldata_proto_rawDescGZIP(), []int{88} } type GetRoutingRulesResponse struct { @@ -5809,7 +5946,7 @@ type GetRoutingRulesResponse struct { func (x *GetRoutingRulesResponse) Reset() { *x = GetRoutingRulesResponse{} - mi := &file_vtctldata_proto_msgTypes[87] + mi := &file_vtctldata_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5821,7 +5958,7 @@ func (x *GetRoutingRulesResponse) String() string { func (*GetRoutingRulesResponse) ProtoMessage() {} func (x *GetRoutingRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[87] + mi := &file_vtctldata_proto_msgTypes[89] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5834,7 +5971,7 @@ func (x *GetRoutingRulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoutingRulesResponse.ProtoReflect.Descriptor instead. func (*GetRoutingRulesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{87} + return file_vtctldata_proto_rawDescGZIP(), []int{89} } func (x *GetRoutingRulesResponse) GetRoutingRules() *vschema.RoutingRules { @@ -5872,7 +6009,7 @@ type GetSchemaRequest struct { func (x *GetSchemaRequest) Reset() { *x = GetSchemaRequest{} - mi := &file_vtctldata_proto_msgTypes[88] + mi := &file_vtctldata_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5884,7 +6021,7 @@ func (x *GetSchemaRequest) String() string { func (*GetSchemaRequest) ProtoMessage() {} func (x *GetSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[88] + mi := &file_vtctldata_proto_msgTypes[90] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5897,7 +6034,7 @@ func (x *GetSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaRequest.ProtoReflect.Descriptor instead. func (*GetSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{88} + return file_vtctldata_proto_rawDescGZIP(), []int{90} } func (x *GetSchemaRequest) GetTabletAlias() *topodata.TabletAlias { @@ -5959,7 +6096,7 @@ type GetSchemaResponse struct { func (x *GetSchemaResponse) Reset() { *x = GetSchemaResponse{} - mi := &file_vtctldata_proto_msgTypes[89] + mi := &file_vtctldata_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5971,7 +6108,7 @@ func (x *GetSchemaResponse) String() string { func (*GetSchemaResponse) ProtoMessage() {} func (x *GetSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[89] + mi := &file_vtctldata_proto_msgTypes[91] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5984,7 +6121,7 @@ func (x *GetSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaResponse.ProtoReflect.Descriptor instead. func (*GetSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{89} + return file_vtctldata_proto_rawDescGZIP(), []int{91} } func (x *GetSchemaResponse) GetSchema() *tabletmanagerdata.SchemaDefinition { @@ -6029,7 +6166,7 @@ type GetSchemaMigrationsRequest struct { func (x *GetSchemaMigrationsRequest) Reset() { *x = GetSchemaMigrationsRequest{} - mi := &file_vtctldata_proto_msgTypes[90] + mi := &file_vtctldata_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6041,7 +6178,7 @@ func (x *GetSchemaMigrationsRequest) String() string { func (*GetSchemaMigrationsRequest) ProtoMessage() {} func (x *GetSchemaMigrationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[90] + mi := &file_vtctldata_proto_msgTypes[92] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6054,7 +6191,7 @@ func (x *GetSchemaMigrationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaMigrationsRequest.ProtoReflect.Descriptor instead. func (*GetSchemaMigrationsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{90} + return file_vtctldata_proto_rawDescGZIP(), []int{92} } func (x *GetSchemaMigrationsRequest) GetKeyspace() string { @@ -6123,7 +6260,7 @@ type GetSchemaMigrationsResponse struct { func (x *GetSchemaMigrationsResponse) Reset() { *x = GetSchemaMigrationsResponse{} - mi := &file_vtctldata_proto_msgTypes[91] + mi := &file_vtctldata_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6135,7 +6272,7 @@ func (x *GetSchemaMigrationsResponse) String() string { func (*GetSchemaMigrationsResponse) ProtoMessage() {} func (x *GetSchemaMigrationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[91] + mi := &file_vtctldata_proto_msgTypes[93] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6148,7 +6285,7 @@ func (x *GetSchemaMigrationsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaMigrationsResponse.ProtoReflect.Descriptor instead. func (*GetSchemaMigrationsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{91} + return file_vtctldata_proto_rawDescGZIP(), []int{93} } func (x *GetSchemaMigrationsResponse) GetMigrations() []*SchemaMigration { @@ -6172,7 +6309,7 @@ type GetShardReplicationRequest struct { func (x *GetShardReplicationRequest) Reset() { *x = GetShardReplicationRequest{} - mi := &file_vtctldata_proto_msgTypes[92] + mi := &file_vtctldata_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6184,7 +6321,7 @@ func (x *GetShardReplicationRequest) String() string { func (*GetShardReplicationRequest) ProtoMessage() {} func (x *GetShardReplicationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[92] + mi := &file_vtctldata_proto_msgTypes[94] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6197,7 +6334,7 @@ func (x *GetShardReplicationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardReplicationRequest.ProtoReflect.Descriptor instead. func (*GetShardReplicationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{92} + return file_vtctldata_proto_rawDescGZIP(), []int{94} } func (x *GetShardReplicationRequest) GetKeyspace() string { @@ -6231,7 +6368,7 @@ type GetShardReplicationResponse struct { func (x *GetShardReplicationResponse) Reset() { *x = GetShardReplicationResponse{} - mi := &file_vtctldata_proto_msgTypes[93] + mi := &file_vtctldata_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6243,7 +6380,7 @@ func (x *GetShardReplicationResponse) String() string { func (*GetShardReplicationResponse) ProtoMessage() {} func (x *GetShardReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[93] + mi := &file_vtctldata_proto_msgTypes[95] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6256,7 +6393,7 @@ func (x *GetShardReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardReplicationResponse.ProtoReflect.Descriptor instead. func (*GetShardReplicationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{93} + return file_vtctldata_proto_rawDescGZIP(), []int{95} } func (x *GetShardReplicationResponse) GetShardReplicationByCell() map[string]*topodata.ShardReplication { @@ -6277,7 +6414,7 @@ type GetShardRequest struct { func (x *GetShardRequest) Reset() { *x = GetShardRequest{} - mi := &file_vtctldata_proto_msgTypes[94] + mi := &file_vtctldata_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6289,7 +6426,7 @@ func (x *GetShardRequest) String() string { func (*GetShardRequest) ProtoMessage() {} func (x *GetShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[94] + mi := &file_vtctldata_proto_msgTypes[96] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6302,7 +6439,7 @@ func (x *GetShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardRequest.ProtoReflect.Descriptor instead. func (*GetShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{94} + return file_vtctldata_proto_rawDescGZIP(), []int{96} } func (x *GetShardRequest) GetKeyspace() string { @@ -6329,7 +6466,7 @@ type GetShardResponse struct { func (x *GetShardResponse) Reset() { *x = GetShardResponse{} - mi := &file_vtctldata_proto_msgTypes[95] + mi := &file_vtctldata_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6341,7 +6478,7 @@ func (x *GetShardResponse) String() string { func (*GetShardResponse) ProtoMessage() {} func (x *GetShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[95] + mi := &file_vtctldata_proto_msgTypes[97] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6354,7 +6491,7 @@ func (x *GetShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardResponse.ProtoReflect.Descriptor instead. func (*GetShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{95} + return file_vtctldata_proto_rawDescGZIP(), []int{97} } func (x *GetShardResponse) GetShard() *Shard { @@ -6372,7 +6509,7 @@ type GetShardRoutingRulesRequest struct { func (x *GetShardRoutingRulesRequest) Reset() { *x = GetShardRoutingRulesRequest{} - mi := &file_vtctldata_proto_msgTypes[96] + mi := &file_vtctldata_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6384,7 +6521,7 @@ func (x *GetShardRoutingRulesRequest) String() string { func (*GetShardRoutingRulesRequest) ProtoMessage() {} func (x *GetShardRoutingRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[96] + mi := &file_vtctldata_proto_msgTypes[98] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6397,7 +6534,7 @@ func (x *GetShardRoutingRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardRoutingRulesRequest.ProtoReflect.Descriptor instead. func (*GetShardRoutingRulesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{96} + return file_vtctldata_proto_rawDescGZIP(), []int{98} } type GetShardRoutingRulesResponse struct { @@ -6410,7 +6547,7 @@ type GetShardRoutingRulesResponse struct { func (x *GetShardRoutingRulesResponse) Reset() { *x = GetShardRoutingRulesResponse{} - mi := &file_vtctldata_proto_msgTypes[97] + mi := &file_vtctldata_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6422,7 +6559,7 @@ func (x *GetShardRoutingRulesResponse) String() string { func (*GetShardRoutingRulesResponse) ProtoMessage() {} func (x *GetShardRoutingRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[97] + mi := &file_vtctldata_proto_msgTypes[99] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6435,7 +6572,7 @@ func (x *GetShardRoutingRulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardRoutingRulesResponse.ProtoReflect.Descriptor instead. func (*GetShardRoutingRulesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{97} + return file_vtctldata_proto_rawDescGZIP(), []int{99} } func (x *GetShardRoutingRulesResponse) GetShardRoutingRules() *vschema.ShardRoutingRules { @@ -6455,7 +6592,7 @@ type GetSrvKeyspaceNamesRequest struct { func (x *GetSrvKeyspaceNamesRequest) Reset() { *x = GetSrvKeyspaceNamesRequest{} - mi := &file_vtctldata_proto_msgTypes[98] + mi := &file_vtctldata_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6467,7 +6604,7 @@ func (x *GetSrvKeyspaceNamesRequest) String() string { func (*GetSrvKeyspaceNamesRequest) ProtoMessage() {} func (x *GetSrvKeyspaceNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[98] + mi := &file_vtctldata_proto_msgTypes[100] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6480,7 +6617,7 @@ func (x *GetSrvKeyspaceNamesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspaceNamesRequest.ProtoReflect.Descriptor instead. func (*GetSrvKeyspaceNamesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{98} + return file_vtctldata_proto_rawDescGZIP(), []int{100} } func (x *GetSrvKeyspaceNamesRequest) GetCells() []string { @@ -6501,7 +6638,7 @@ type GetSrvKeyspaceNamesResponse struct { func (x *GetSrvKeyspaceNamesResponse) Reset() { *x = GetSrvKeyspaceNamesResponse{} - mi := &file_vtctldata_proto_msgTypes[99] + mi := &file_vtctldata_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6513,7 +6650,7 @@ func (x *GetSrvKeyspaceNamesResponse) String() string { func (*GetSrvKeyspaceNamesResponse) ProtoMessage() {} func (x *GetSrvKeyspaceNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[99] + mi := &file_vtctldata_proto_msgTypes[101] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6526,7 +6663,7 @@ func (x *GetSrvKeyspaceNamesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspaceNamesResponse.ProtoReflect.Descriptor instead. func (*GetSrvKeyspaceNamesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{99} + return file_vtctldata_proto_rawDescGZIP(), []int{101} } func (x *GetSrvKeyspaceNamesResponse) GetNames() map[string]*GetSrvKeyspaceNamesResponse_NameList { @@ -6549,7 +6686,7 @@ type GetSrvKeyspacesRequest struct { func (x *GetSrvKeyspacesRequest) Reset() { *x = GetSrvKeyspacesRequest{} - mi := &file_vtctldata_proto_msgTypes[100] + mi := &file_vtctldata_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6561,7 +6698,7 @@ func (x *GetSrvKeyspacesRequest) String() string { func (*GetSrvKeyspacesRequest) ProtoMessage() {} func (x *GetSrvKeyspacesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[100] + mi := &file_vtctldata_proto_msgTypes[102] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6574,7 +6711,7 @@ func (x *GetSrvKeyspacesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspacesRequest.ProtoReflect.Descriptor instead. func (*GetSrvKeyspacesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{100} + return file_vtctldata_proto_rawDescGZIP(), []int{102} } func (x *GetSrvKeyspacesRequest) GetKeyspace() string { @@ -6602,7 +6739,7 @@ type GetSrvKeyspacesResponse struct { func (x *GetSrvKeyspacesResponse) Reset() { *x = GetSrvKeyspacesResponse{} - mi := &file_vtctldata_proto_msgTypes[101] + mi := &file_vtctldata_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6614,7 +6751,7 @@ func (x *GetSrvKeyspacesResponse) String() string { func (*GetSrvKeyspacesResponse) ProtoMessage() {} func (x *GetSrvKeyspacesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[101] + mi := &file_vtctldata_proto_msgTypes[103] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6627,7 +6764,7 @@ func (x *GetSrvKeyspacesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspacesResponse.ProtoReflect.Descriptor instead. func (*GetSrvKeyspacesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{101} + return file_vtctldata_proto_rawDescGZIP(), []int{103} } func (x *GetSrvKeyspacesResponse) GetSrvKeyspaces() map[string]*topodata.SrvKeyspace { @@ -6670,7 +6807,7 @@ type UpdateThrottlerConfigRequest struct { func (x *UpdateThrottlerConfigRequest) Reset() { *x = UpdateThrottlerConfigRequest{} - mi := &file_vtctldata_proto_msgTypes[102] + mi := &file_vtctldata_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6682,7 +6819,7 @@ func (x *UpdateThrottlerConfigRequest) String() string { func (*UpdateThrottlerConfigRequest) ProtoMessage() {} func (x *UpdateThrottlerConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[102] + mi := &file_vtctldata_proto_msgTypes[104] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6695,7 +6832,7 @@ func (x *UpdateThrottlerConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateThrottlerConfigRequest.ProtoReflect.Descriptor instead. func (*UpdateThrottlerConfigRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{102} + return file_vtctldata_proto_rawDescGZIP(), []int{104} } func (x *UpdateThrottlerConfigRequest) GetKeyspace() string { @@ -6790,7 +6927,7 @@ type UpdateThrottlerConfigResponse struct { func (x *UpdateThrottlerConfigResponse) Reset() { *x = UpdateThrottlerConfigResponse{} - mi := &file_vtctldata_proto_msgTypes[103] + mi := &file_vtctldata_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6802,7 +6939,7 @@ func (x *UpdateThrottlerConfigResponse) String() string { func (*UpdateThrottlerConfigResponse) ProtoMessage() {} func (x *UpdateThrottlerConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[103] + mi := &file_vtctldata_proto_msgTypes[105] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6815,7 +6952,7 @@ func (x *UpdateThrottlerConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateThrottlerConfigResponse.ProtoReflect.Descriptor instead. func (*UpdateThrottlerConfigResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{103} + return file_vtctldata_proto_rawDescGZIP(), []int{105} } type GetSrvVSchemaRequest struct { @@ -6828,7 +6965,7 @@ type GetSrvVSchemaRequest struct { func (x *GetSrvVSchemaRequest) Reset() { *x = GetSrvVSchemaRequest{} - mi := &file_vtctldata_proto_msgTypes[104] + mi := &file_vtctldata_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6840,7 +6977,7 @@ func (x *GetSrvVSchemaRequest) String() string { func (*GetSrvVSchemaRequest) ProtoMessage() {} func (x *GetSrvVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[104] + mi := &file_vtctldata_proto_msgTypes[106] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6853,7 +6990,7 @@ func (x *GetSrvVSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemaRequest.ProtoReflect.Descriptor instead. func (*GetSrvVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{104} + return file_vtctldata_proto_rawDescGZIP(), []int{106} } func (x *GetSrvVSchemaRequest) GetCell() string { @@ -6873,7 +7010,7 @@ type GetSrvVSchemaResponse struct { func (x *GetSrvVSchemaResponse) Reset() { *x = GetSrvVSchemaResponse{} - mi := &file_vtctldata_proto_msgTypes[105] + mi := &file_vtctldata_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6885,7 +7022,7 @@ func (x *GetSrvVSchemaResponse) String() string { func (*GetSrvVSchemaResponse) ProtoMessage() {} func (x *GetSrvVSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[105] + mi := &file_vtctldata_proto_msgTypes[107] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6898,7 +7035,7 @@ func (x *GetSrvVSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemaResponse.ProtoReflect.Descriptor instead. func (*GetSrvVSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{105} + return file_vtctldata_proto_rawDescGZIP(), []int{107} } func (x *GetSrvVSchemaResponse) GetSrvVSchema() *vschema.SrvVSchema { @@ -6918,7 +7055,7 @@ type GetSrvVSchemasRequest struct { func (x *GetSrvVSchemasRequest) Reset() { *x = GetSrvVSchemasRequest{} - mi := &file_vtctldata_proto_msgTypes[106] + mi := &file_vtctldata_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6930,7 +7067,7 @@ func (x *GetSrvVSchemasRequest) String() string { func (*GetSrvVSchemasRequest) ProtoMessage() {} func (x *GetSrvVSchemasRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[106] + mi := &file_vtctldata_proto_msgTypes[108] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6943,7 +7080,7 @@ func (x *GetSrvVSchemasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemasRequest.ProtoReflect.Descriptor instead. func (*GetSrvVSchemasRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{106} + return file_vtctldata_proto_rawDescGZIP(), []int{108} } func (x *GetSrvVSchemasRequest) GetCells() []string { @@ -6964,7 +7101,7 @@ type GetSrvVSchemasResponse struct { func (x *GetSrvVSchemasResponse) Reset() { *x = GetSrvVSchemasResponse{} - mi := &file_vtctldata_proto_msgTypes[107] + mi := &file_vtctldata_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6976,7 +7113,7 @@ func (x *GetSrvVSchemasResponse) String() string { func (*GetSrvVSchemasResponse) ProtoMessage() {} func (x *GetSrvVSchemasResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[107] + mi := &file_vtctldata_proto_msgTypes[109] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6989,7 +7126,7 @@ func (x *GetSrvVSchemasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemasResponse.ProtoReflect.Descriptor instead. func (*GetSrvVSchemasResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{107} + return file_vtctldata_proto_rawDescGZIP(), []int{109} } func (x *GetSrvVSchemasResponse) GetSrvVSchemas() map[string]*vschema.SrvVSchema { @@ -7009,7 +7146,7 @@ type GetTabletRequest struct { func (x *GetTabletRequest) Reset() { *x = GetTabletRequest{} - mi := &file_vtctldata_proto_msgTypes[108] + mi := &file_vtctldata_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7021,7 +7158,7 @@ func (x *GetTabletRequest) String() string { func (*GetTabletRequest) ProtoMessage() {} func (x *GetTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[108] + mi := &file_vtctldata_proto_msgTypes[110] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7034,7 +7171,7 @@ func (x *GetTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletRequest.ProtoReflect.Descriptor instead. func (*GetTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{108} + return file_vtctldata_proto_rawDescGZIP(), []int{110} } func (x *GetTabletRequest) GetTabletAlias() *topodata.TabletAlias { @@ -7054,7 +7191,7 @@ type GetTabletResponse struct { func (x *GetTabletResponse) Reset() { *x = GetTabletResponse{} - mi := &file_vtctldata_proto_msgTypes[109] + mi := &file_vtctldata_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7066,7 +7203,7 @@ func (x *GetTabletResponse) String() string { func (*GetTabletResponse) ProtoMessage() {} func (x *GetTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[109] + mi := &file_vtctldata_proto_msgTypes[111] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7079,7 +7216,7 @@ func (x *GetTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletResponse.ProtoReflect.Descriptor instead. func (*GetTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{109} + return file_vtctldata_proto_rawDescGZIP(), []int{111} } func (x *GetTabletResponse) GetTablet() *topodata.Tablet { @@ -7120,7 +7257,7 @@ type GetTabletsRequest struct { func (x *GetTabletsRequest) Reset() { *x = GetTabletsRequest{} - mi := &file_vtctldata_proto_msgTypes[110] + mi := &file_vtctldata_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7132,7 +7269,7 @@ func (x *GetTabletsRequest) String() string { func (*GetTabletsRequest) ProtoMessage() {} func (x *GetTabletsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[110] + mi := &file_vtctldata_proto_msgTypes[112] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7145,7 +7282,7 @@ func (x *GetTabletsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletsRequest.ProtoReflect.Descriptor instead. func (*GetTabletsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{110} + return file_vtctldata_proto_rawDescGZIP(), []int{112} } func (x *GetTabletsRequest) GetKeyspace() string { @@ -7200,7 +7337,7 @@ type GetTabletsResponse struct { func (x *GetTabletsResponse) Reset() { *x = GetTabletsResponse{} - mi := &file_vtctldata_proto_msgTypes[111] + mi := &file_vtctldata_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7212,7 +7349,7 @@ func (x *GetTabletsResponse) String() string { func (*GetTabletsResponse) ProtoMessage() {} func (x *GetTabletsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[111] + mi := &file_vtctldata_proto_msgTypes[113] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7225,7 +7362,7 @@ func (x *GetTabletsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletsResponse.ProtoReflect.Descriptor instead. func (*GetTabletsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{111} + return file_vtctldata_proto_rawDescGZIP(), []int{113} } func (x *GetTabletsResponse) GetTablets() []*topodata.Tablet { @@ -7246,7 +7383,7 @@ type GetThrottlerStatusRequest struct { func (x *GetThrottlerStatusRequest) Reset() { *x = GetThrottlerStatusRequest{} - mi := &file_vtctldata_proto_msgTypes[112] + mi := &file_vtctldata_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7258,7 +7395,7 @@ func (x *GetThrottlerStatusRequest) String() string { func (*GetThrottlerStatusRequest) ProtoMessage() {} func (x *GetThrottlerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[112] + mi := &file_vtctldata_proto_msgTypes[114] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7271,7 +7408,7 @@ func (x *GetThrottlerStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetThrottlerStatusRequest.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{112} + return file_vtctldata_proto_rawDescGZIP(), []int{114} } func (x *GetThrottlerStatusRequest) GetTabletAlias() *topodata.TabletAlias { @@ -7291,7 +7428,7 @@ type GetThrottlerStatusResponse struct { func (x *GetThrottlerStatusResponse) Reset() { *x = GetThrottlerStatusResponse{} - mi := &file_vtctldata_proto_msgTypes[113] + mi := &file_vtctldata_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7303,7 +7440,7 @@ func (x *GetThrottlerStatusResponse) String() string { func (*GetThrottlerStatusResponse) ProtoMessage() {} func (x *GetThrottlerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[113] + mi := &file_vtctldata_proto_msgTypes[115] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7316,7 +7453,7 @@ func (x *GetThrottlerStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetThrottlerStatusResponse.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{113} + return file_vtctldata_proto_rawDescGZIP(), []int{115} } func (x *GetThrottlerStatusResponse) GetStatus() *tabletmanagerdata.GetThrottlerStatusResponse { @@ -7338,7 +7475,7 @@ type GetTopologyPathRequest struct { func (x *GetTopologyPathRequest) Reset() { *x = GetTopologyPathRequest{} - mi := &file_vtctldata_proto_msgTypes[114] + mi := &file_vtctldata_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7350,7 +7487,7 @@ func (x *GetTopologyPathRequest) String() string { func (*GetTopologyPathRequest) ProtoMessage() {} func (x *GetTopologyPathRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[114] + mi := &file_vtctldata_proto_msgTypes[116] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7363,7 +7500,7 @@ func (x *GetTopologyPathRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTopologyPathRequest.ProtoReflect.Descriptor instead. func (*GetTopologyPathRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{114} + return file_vtctldata_proto_rawDescGZIP(), []int{116} } func (x *GetTopologyPathRequest) GetPath() string { @@ -7397,7 +7534,7 @@ type GetTopologyPathResponse struct { func (x *GetTopologyPathResponse) Reset() { *x = GetTopologyPathResponse{} - mi := &file_vtctldata_proto_msgTypes[115] + mi := &file_vtctldata_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7409,7 +7546,7 @@ func (x *GetTopologyPathResponse) String() string { func (*GetTopologyPathResponse) ProtoMessage() {} func (x *GetTopologyPathResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[115] + mi := &file_vtctldata_proto_msgTypes[117] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7422,7 +7559,7 @@ func (x *GetTopologyPathResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTopologyPathResponse.ProtoReflect.Descriptor instead. func (*GetTopologyPathResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{115} + return file_vtctldata_proto_rawDescGZIP(), []int{117} } func (x *GetTopologyPathResponse) GetCell() *TopologyCell { @@ -7448,7 +7585,7 @@ type TopologyCell struct { func (x *TopologyCell) Reset() { *x = TopologyCell{} - mi := &file_vtctldata_proto_msgTypes[116] + mi := &file_vtctldata_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7460,7 +7597,7 @@ func (x *TopologyCell) String() string { func (*TopologyCell) ProtoMessage() {} func (x *TopologyCell) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[116] + mi := &file_vtctldata_proto_msgTypes[118] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7473,7 +7610,7 @@ func (x *TopologyCell) ProtoReflect() protoreflect.Message { // Deprecated: Use TopologyCell.ProtoReflect.Descriptor instead. func (*TopologyCell) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{116} + return file_vtctldata_proto_rawDescGZIP(), []int{118} } func (x *TopologyCell) GetName() string { @@ -7522,7 +7659,7 @@ type GetUnresolvedTransactionsRequest struct { func (x *GetUnresolvedTransactionsRequest) Reset() { *x = GetUnresolvedTransactionsRequest{} - mi := &file_vtctldata_proto_msgTypes[117] + mi := &file_vtctldata_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7534,7 +7671,7 @@ func (x *GetUnresolvedTransactionsRequest) String() string { func (*GetUnresolvedTransactionsRequest) ProtoMessage() {} func (x *GetUnresolvedTransactionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[117] + mi := &file_vtctldata_proto_msgTypes[119] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7547,7 +7684,7 @@ func (x *GetUnresolvedTransactionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUnresolvedTransactionsRequest.ProtoReflect.Descriptor instead. func (*GetUnresolvedTransactionsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{117} + return file_vtctldata_proto_rawDescGZIP(), []int{119} } func (x *GetUnresolvedTransactionsRequest) GetKeyspace() string { @@ -7574,7 +7711,7 @@ type GetUnresolvedTransactionsResponse struct { func (x *GetUnresolvedTransactionsResponse) Reset() { *x = GetUnresolvedTransactionsResponse{} - mi := &file_vtctldata_proto_msgTypes[118] + mi := &file_vtctldata_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7586,7 +7723,7 @@ func (x *GetUnresolvedTransactionsResponse) String() string { func (*GetUnresolvedTransactionsResponse) ProtoMessage() {} func (x *GetUnresolvedTransactionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[118] + mi := &file_vtctldata_proto_msgTypes[120] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7599,7 +7736,7 @@ func (x *GetUnresolvedTransactionsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use GetUnresolvedTransactionsResponse.ProtoReflect.Descriptor instead. func (*GetUnresolvedTransactionsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{118} + return file_vtctldata_proto_rawDescGZIP(), []int{120} } func (x *GetUnresolvedTransactionsResponse) GetTransactions() []*query.TransactionMetadata { @@ -7619,7 +7756,7 @@ type GetTransactionInfoRequest struct { func (x *GetTransactionInfoRequest) Reset() { *x = GetTransactionInfoRequest{} - mi := &file_vtctldata_proto_msgTypes[119] + mi := &file_vtctldata_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7631,7 +7768,7 @@ func (x *GetTransactionInfoRequest) String() string { func (*GetTransactionInfoRequest) ProtoMessage() {} func (x *GetTransactionInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[119] + mi := &file_vtctldata_proto_msgTypes[121] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7644,7 +7781,7 @@ func (x *GetTransactionInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTransactionInfoRequest.ProtoReflect.Descriptor instead. func (*GetTransactionInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{119} + return file_vtctldata_proto_rawDescGZIP(), []int{121} } func (x *GetTransactionInfoRequest) GetDtid() string { @@ -7668,7 +7805,7 @@ type ShardTransactionState struct { func (x *ShardTransactionState) Reset() { *x = ShardTransactionState{} - mi := &file_vtctldata_proto_msgTypes[120] + mi := &file_vtctldata_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7680,7 +7817,7 @@ func (x *ShardTransactionState) String() string { func (*ShardTransactionState) ProtoMessage() {} func (x *ShardTransactionState) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[120] + mi := &file_vtctldata_proto_msgTypes[122] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7693,7 +7830,7 @@ func (x *ShardTransactionState) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardTransactionState.ProtoReflect.Descriptor instead. func (*ShardTransactionState) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{120} + return file_vtctldata_proto_rawDescGZIP(), []int{122} } func (x *ShardTransactionState) GetShard() string { @@ -7742,7 +7879,7 @@ type GetTransactionInfoResponse struct { func (x *GetTransactionInfoResponse) Reset() { *x = GetTransactionInfoResponse{} - mi := &file_vtctldata_proto_msgTypes[121] + mi := &file_vtctldata_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7754,7 +7891,7 @@ func (x *GetTransactionInfoResponse) String() string { func (*GetTransactionInfoResponse) ProtoMessage() {} func (x *GetTransactionInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[121] + mi := &file_vtctldata_proto_msgTypes[123] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7767,7 +7904,7 @@ func (x *GetTransactionInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTransactionInfoResponse.ProtoReflect.Descriptor instead. func (*GetTransactionInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{121} + return file_vtctldata_proto_rawDescGZIP(), []int{123} } func (x *GetTransactionInfoResponse) GetMetadata() *query.TransactionMetadata { @@ -7795,7 +7932,7 @@ type ConcludeTransactionRequest struct { func (x *ConcludeTransactionRequest) Reset() { *x = ConcludeTransactionRequest{} - mi := &file_vtctldata_proto_msgTypes[122] + mi := &file_vtctldata_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7807,7 +7944,7 @@ func (x *ConcludeTransactionRequest) String() string { func (*ConcludeTransactionRequest) ProtoMessage() {} func (x *ConcludeTransactionRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[122] + mi := &file_vtctldata_proto_msgTypes[124] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7820,7 +7957,7 @@ func (x *ConcludeTransactionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ConcludeTransactionRequest.ProtoReflect.Descriptor instead. func (*ConcludeTransactionRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{122} + return file_vtctldata_proto_rawDescGZIP(), []int{124} } func (x *ConcludeTransactionRequest) GetDtid() string { @@ -7845,7 +7982,7 @@ type ConcludeTransactionResponse struct { func (x *ConcludeTransactionResponse) Reset() { *x = ConcludeTransactionResponse{} - mi := &file_vtctldata_proto_msgTypes[123] + mi := &file_vtctldata_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7857,7 +7994,7 @@ func (x *ConcludeTransactionResponse) String() string { func (*ConcludeTransactionResponse) ProtoMessage() {} func (x *ConcludeTransactionResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[123] + mi := &file_vtctldata_proto_msgTypes[125] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7870,7 +8007,7 @@ func (x *ConcludeTransactionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ConcludeTransactionResponse.ProtoReflect.Descriptor instead. func (*ConcludeTransactionResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{123} + return file_vtctldata_proto_rawDescGZIP(), []int{125} } type GetVSchemaRequest struct { @@ -7883,7 +8020,7 @@ type GetVSchemaRequest struct { func (x *GetVSchemaRequest) Reset() { *x = GetVSchemaRequest{} - mi := &file_vtctldata_proto_msgTypes[124] + mi := &file_vtctldata_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7895,7 +8032,7 @@ func (x *GetVSchemaRequest) String() string { func (*GetVSchemaRequest) ProtoMessage() {} func (x *GetVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[124] + mi := &file_vtctldata_proto_msgTypes[126] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7908,7 +8045,7 @@ func (x *GetVSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVSchemaRequest.ProtoReflect.Descriptor instead. func (*GetVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{124} + return file_vtctldata_proto_rawDescGZIP(), []int{126} } func (x *GetVSchemaRequest) GetKeyspace() string { @@ -7928,7 +8065,7 @@ type GetVersionRequest struct { func (x *GetVersionRequest) Reset() { *x = GetVersionRequest{} - mi := &file_vtctldata_proto_msgTypes[125] + mi := &file_vtctldata_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7940,7 +8077,7 @@ func (x *GetVersionRequest) String() string { func (*GetVersionRequest) ProtoMessage() {} func (x *GetVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[125] + mi := &file_vtctldata_proto_msgTypes[127] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7953,7 +8090,7 @@ func (x *GetVersionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionRequest.ProtoReflect.Descriptor instead. func (*GetVersionRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{125} + return file_vtctldata_proto_rawDescGZIP(), []int{127} } func (x *GetVersionRequest) GetTabletAlias() *topodata.TabletAlias { @@ -7973,7 +8110,7 @@ type GetVersionResponse struct { func (x *GetVersionResponse) Reset() { *x = GetVersionResponse{} - mi := &file_vtctldata_proto_msgTypes[126] + mi := &file_vtctldata_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7985,7 +8122,7 @@ func (x *GetVersionResponse) String() string { func (*GetVersionResponse) ProtoMessage() {} func (x *GetVersionResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[126] + mi := &file_vtctldata_proto_msgTypes[128] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7998,7 +8135,7 @@ func (x *GetVersionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionResponse.ProtoReflect.Descriptor instead. func (*GetVersionResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{126} + return file_vtctldata_proto_rawDescGZIP(), []int{128} } func (x *GetVersionResponse) GetVersion() string { @@ -8018,7 +8155,7 @@ type GetVSchemaResponse struct { func (x *GetVSchemaResponse) Reset() { *x = GetVSchemaResponse{} - mi := &file_vtctldata_proto_msgTypes[127] + mi := &file_vtctldata_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8030,7 +8167,7 @@ func (x *GetVSchemaResponse) String() string { func (*GetVSchemaResponse) ProtoMessage() {} func (x *GetVSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[127] + mi := &file_vtctldata_proto_msgTypes[129] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8043,7 +8180,7 @@ func (x *GetVSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVSchemaResponse.ProtoReflect.Descriptor instead. func (*GetVSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{127} + return file_vtctldata_proto_rawDescGZIP(), []int{129} } func (x *GetVSchemaResponse) GetVSchema() *vschema.Keyspace { @@ -8069,7 +8206,7 @@ type GetWorkflowsRequest struct { func (x *GetWorkflowsRequest) Reset() { *x = GetWorkflowsRequest{} - mi := &file_vtctldata_proto_msgTypes[128] + mi := &file_vtctldata_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8081,7 +8218,7 @@ func (x *GetWorkflowsRequest) String() string { func (*GetWorkflowsRequest) ProtoMessage() {} func (x *GetWorkflowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[128] + mi := &file_vtctldata_proto_msgTypes[130] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8094,7 +8231,7 @@ func (x *GetWorkflowsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowsRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{128} + return file_vtctldata_proto_rawDescGZIP(), []int{130} } func (x *GetWorkflowsRequest) GetKeyspace() string { @@ -8149,7 +8286,7 @@ type GetWorkflowsResponse struct { func (x *GetWorkflowsResponse) Reset() { *x = GetWorkflowsResponse{} - mi := &file_vtctldata_proto_msgTypes[129] + mi := &file_vtctldata_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8161,7 +8298,7 @@ func (x *GetWorkflowsResponse) String() string { func (*GetWorkflowsResponse) ProtoMessage() {} func (x *GetWorkflowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[129] + mi := &file_vtctldata_proto_msgTypes[131] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8174,7 +8311,7 @@ func (x *GetWorkflowsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowsResponse.ProtoReflect.Descriptor instead. func (*GetWorkflowsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{129} + return file_vtctldata_proto_rawDescGZIP(), []int{131} } func (x *GetWorkflowsResponse) GetWorkflows() []*Workflow { @@ -8198,7 +8335,7 @@ type InitShardPrimaryRequest struct { func (x *InitShardPrimaryRequest) Reset() { *x = InitShardPrimaryRequest{} - mi := &file_vtctldata_proto_msgTypes[130] + mi := &file_vtctldata_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8210,7 +8347,7 @@ func (x *InitShardPrimaryRequest) String() string { func (*InitShardPrimaryRequest) ProtoMessage() {} func (x *InitShardPrimaryRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[130] + mi := &file_vtctldata_proto_msgTypes[132] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8223,7 +8360,7 @@ func (x *InitShardPrimaryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InitShardPrimaryRequest.ProtoReflect.Descriptor instead. func (*InitShardPrimaryRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{130} + return file_vtctldata_proto_rawDescGZIP(), []int{132} } func (x *InitShardPrimaryRequest) GetKeyspace() string { @@ -8271,7 +8408,7 @@ type InitShardPrimaryResponse struct { func (x *InitShardPrimaryResponse) Reset() { *x = InitShardPrimaryResponse{} - mi := &file_vtctldata_proto_msgTypes[131] + mi := &file_vtctldata_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8283,7 +8420,7 @@ func (x *InitShardPrimaryResponse) String() string { func (*InitShardPrimaryResponse) ProtoMessage() {} func (x *InitShardPrimaryResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[131] + mi := &file_vtctldata_proto_msgTypes[133] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8296,7 +8433,7 @@ func (x *InitShardPrimaryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InitShardPrimaryResponse.ProtoReflect.Descriptor instead. func (*InitShardPrimaryResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{131} + return file_vtctldata_proto_rawDescGZIP(), []int{133} } func (x *InitShardPrimaryResponse) GetEvents() []*logutil.Event { @@ -8317,7 +8454,7 @@ type LaunchSchemaMigrationRequest struct { func (x *LaunchSchemaMigrationRequest) Reset() { *x = LaunchSchemaMigrationRequest{} - mi := &file_vtctldata_proto_msgTypes[132] + mi := &file_vtctldata_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8329,7 +8466,7 @@ func (x *LaunchSchemaMigrationRequest) String() string { func (*LaunchSchemaMigrationRequest) ProtoMessage() {} func (x *LaunchSchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[132] + mi := &file_vtctldata_proto_msgTypes[134] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8342,7 +8479,7 @@ func (x *LaunchSchemaMigrationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LaunchSchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*LaunchSchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{132} + return file_vtctldata_proto_rawDescGZIP(), []int{134} } func (x *LaunchSchemaMigrationRequest) GetKeyspace() string { @@ -8369,7 +8506,7 @@ type LaunchSchemaMigrationResponse struct { func (x *LaunchSchemaMigrationResponse) Reset() { *x = LaunchSchemaMigrationResponse{} - mi := &file_vtctldata_proto_msgTypes[133] + mi := &file_vtctldata_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8381,7 +8518,7 @@ func (x *LaunchSchemaMigrationResponse) String() string { func (*LaunchSchemaMigrationResponse) ProtoMessage() {} func (x *LaunchSchemaMigrationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[133] + mi := &file_vtctldata_proto_msgTypes[135] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8394,7 +8531,7 @@ func (x *LaunchSchemaMigrationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LaunchSchemaMigrationResponse.ProtoReflect.Descriptor instead. func (*LaunchSchemaMigrationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{133} + return file_vtctldata_proto_rawDescGZIP(), []int{135} } func (x *LaunchSchemaMigrationResponse) GetRowsAffectedByShard() map[string]uint64 { @@ -8420,7 +8557,7 @@ type LookupVindexCreateRequest struct { func (x *LookupVindexCreateRequest) Reset() { *x = LookupVindexCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[134] + mi := &file_vtctldata_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8432,7 +8569,7 @@ func (x *LookupVindexCreateRequest) String() string { func (*LookupVindexCreateRequest) ProtoMessage() {} func (x *LookupVindexCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[134] + mi := &file_vtctldata_proto_msgTypes[136] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8445,7 +8582,7 @@ func (x *LookupVindexCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexCreateRequest.ProtoReflect.Descriptor instead. func (*LookupVindexCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{134} + return file_vtctldata_proto_rawDescGZIP(), []int{136} } func (x *LookupVindexCreateRequest) GetKeyspace() string { @@ -8505,7 +8642,7 @@ type LookupVindexCreateResponse struct { func (x *LookupVindexCreateResponse) Reset() { *x = LookupVindexCreateResponse{} - mi := &file_vtctldata_proto_msgTypes[135] + mi := &file_vtctldata_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8517,7 +8654,7 @@ func (x *LookupVindexCreateResponse) String() string { func (*LookupVindexCreateResponse) ProtoMessage() {} func (x *LookupVindexCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[135] + mi := &file_vtctldata_proto_msgTypes[137] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8530,7 +8667,7 @@ func (x *LookupVindexCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexCreateResponse.ProtoReflect.Descriptor instead. func (*LookupVindexCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{135} + return file_vtctldata_proto_rawDescGZIP(), []int{137} } type LookupVindexExternalizeRequest struct { @@ -8548,7 +8685,7 @@ type LookupVindexExternalizeRequest struct { func (x *LookupVindexExternalizeRequest) Reset() { *x = LookupVindexExternalizeRequest{} - mi := &file_vtctldata_proto_msgTypes[136] + mi := &file_vtctldata_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8560,7 +8697,7 @@ func (x *LookupVindexExternalizeRequest) String() string { func (*LookupVindexExternalizeRequest) ProtoMessage() {} func (x *LookupVindexExternalizeRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[136] + mi := &file_vtctldata_proto_msgTypes[138] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8573,7 +8710,7 @@ func (x *LookupVindexExternalizeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexExternalizeRequest.ProtoReflect.Descriptor instead. func (*LookupVindexExternalizeRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{136} + return file_vtctldata_proto_rawDescGZIP(), []int{138} } func (x *LookupVindexExternalizeRequest) GetKeyspace() string { @@ -8608,7 +8745,7 @@ type LookupVindexExternalizeResponse struct { func (x *LookupVindexExternalizeResponse) Reset() { *x = LookupVindexExternalizeResponse{} - mi := &file_vtctldata_proto_msgTypes[137] + mi := &file_vtctldata_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8620,7 +8757,7 @@ func (x *LookupVindexExternalizeResponse) String() string { func (*LookupVindexExternalizeResponse) ProtoMessage() {} func (x *LookupVindexExternalizeResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[137] + mi := &file_vtctldata_proto_msgTypes[139] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8633,7 +8770,7 @@ func (x *LookupVindexExternalizeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexExternalizeResponse.ProtoReflect.Descriptor instead. func (*LookupVindexExternalizeResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{137} + return file_vtctldata_proto_rawDescGZIP(), []int{139} } func (x *LookupVindexExternalizeResponse) GetWorkflowDeleted() bool { @@ -8653,7 +8790,7 @@ type MaterializeCreateRequest struct { func (x *MaterializeCreateRequest) Reset() { *x = MaterializeCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[138] + mi := &file_vtctldata_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8665,7 +8802,7 @@ func (x *MaterializeCreateRequest) String() string { func (*MaterializeCreateRequest) ProtoMessage() {} func (x *MaterializeCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[138] + mi := &file_vtctldata_proto_msgTypes[140] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8678,7 +8815,7 @@ func (x *MaterializeCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MaterializeCreateRequest.ProtoReflect.Descriptor instead. func (*MaterializeCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{138} + return file_vtctldata_proto_rawDescGZIP(), []int{140} } func (x *MaterializeCreateRequest) GetSettings() *MaterializeSettings { @@ -8696,7 +8833,7 @@ type MaterializeCreateResponse struct { func (x *MaterializeCreateResponse) Reset() { *x = MaterializeCreateResponse{} - mi := &file_vtctldata_proto_msgTypes[139] + mi := &file_vtctldata_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8708,7 +8845,7 @@ func (x *MaterializeCreateResponse) String() string { func (*MaterializeCreateResponse) ProtoMessage() {} func (x *MaterializeCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[139] + mi := &file_vtctldata_proto_msgTypes[141] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8721,7 +8858,7 @@ func (x *MaterializeCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MaterializeCreateResponse.ProtoReflect.Descriptor instead. func (*MaterializeCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{139} + return file_vtctldata_proto_rawDescGZIP(), []int{141} } type MigrateCreateRequest struct { @@ -8759,7 +8896,7 @@ type MigrateCreateRequest struct { func (x *MigrateCreateRequest) Reset() { *x = MigrateCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[140] + mi := &file_vtctldata_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8771,7 +8908,7 @@ func (x *MigrateCreateRequest) String() string { func (*MigrateCreateRequest) ProtoMessage() {} func (x *MigrateCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[140] + mi := &file_vtctldata_proto_msgTypes[142] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8784,7 +8921,7 @@ func (x *MigrateCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateCreateRequest.ProtoReflect.Descriptor instead. func (*MigrateCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{140} + return file_vtctldata_proto_rawDescGZIP(), []int{142} } func (x *MigrateCreateRequest) GetWorkflow() string { @@ -8921,7 +9058,7 @@ type MigrateCompleteRequest struct { func (x *MigrateCompleteRequest) Reset() { *x = MigrateCompleteRequest{} - mi := &file_vtctldata_proto_msgTypes[141] + mi := &file_vtctldata_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8933,7 +9070,7 @@ func (x *MigrateCompleteRequest) String() string { func (*MigrateCompleteRequest) ProtoMessage() {} func (x *MigrateCompleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[141] + mi := &file_vtctldata_proto_msgTypes[143] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8946,7 +9083,7 @@ func (x *MigrateCompleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateCompleteRequest.ProtoReflect.Descriptor instead. func (*MigrateCompleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{141} + return file_vtctldata_proto_rawDescGZIP(), []int{143} } func (x *MigrateCompleteRequest) GetWorkflow() string { @@ -9002,7 +9139,7 @@ type MigrateCompleteResponse struct { func (x *MigrateCompleteResponse) Reset() { *x = MigrateCompleteResponse{} - mi := &file_vtctldata_proto_msgTypes[142] + mi := &file_vtctldata_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9014,7 +9151,7 @@ func (x *MigrateCompleteResponse) String() string { func (*MigrateCompleteResponse) ProtoMessage() {} func (x *MigrateCompleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[142] + mi := &file_vtctldata_proto_msgTypes[144] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9027,7 +9164,7 @@ func (x *MigrateCompleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateCompleteResponse.ProtoReflect.Descriptor instead. func (*MigrateCompleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{142} + return file_vtctldata_proto_rawDescGZIP(), []int{144} } func (x *MigrateCompleteResponse) GetSummary() string { @@ -9057,7 +9194,7 @@ type MountRegisterRequest struct { func (x *MountRegisterRequest) Reset() { *x = MountRegisterRequest{} - mi := &file_vtctldata_proto_msgTypes[143] + mi := &file_vtctldata_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9069,7 +9206,7 @@ func (x *MountRegisterRequest) String() string { func (*MountRegisterRequest) ProtoMessage() {} func (x *MountRegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[143] + mi := &file_vtctldata_proto_msgTypes[145] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9082,7 +9219,7 @@ func (x *MountRegisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountRegisterRequest.ProtoReflect.Descriptor instead. func (*MountRegisterRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{143} + return file_vtctldata_proto_rawDescGZIP(), []int{145} } func (x *MountRegisterRequest) GetTopoType() string { @@ -9121,7 +9258,7 @@ type MountRegisterResponse struct { func (x *MountRegisterResponse) Reset() { *x = MountRegisterResponse{} - mi := &file_vtctldata_proto_msgTypes[144] + mi := &file_vtctldata_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9133,7 +9270,7 @@ func (x *MountRegisterResponse) String() string { func (*MountRegisterResponse) ProtoMessage() {} func (x *MountRegisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[144] + mi := &file_vtctldata_proto_msgTypes[146] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9146,7 +9283,7 @@ func (x *MountRegisterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountRegisterResponse.ProtoReflect.Descriptor instead. func (*MountRegisterResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{144} + return file_vtctldata_proto_rawDescGZIP(), []int{146} } type MountUnregisterRequest struct { @@ -9159,7 +9296,7 @@ type MountUnregisterRequest struct { func (x *MountUnregisterRequest) Reset() { *x = MountUnregisterRequest{} - mi := &file_vtctldata_proto_msgTypes[145] + mi := &file_vtctldata_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9171,7 +9308,7 @@ func (x *MountUnregisterRequest) String() string { func (*MountUnregisterRequest) ProtoMessage() {} func (x *MountUnregisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[145] + mi := &file_vtctldata_proto_msgTypes[147] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9184,7 +9321,7 @@ func (x *MountUnregisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountUnregisterRequest.ProtoReflect.Descriptor instead. func (*MountUnregisterRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{145} + return file_vtctldata_proto_rawDescGZIP(), []int{147} } func (x *MountUnregisterRequest) GetName() string { @@ -9202,7 +9339,7 @@ type MountUnregisterResponse struct { func (x *MountUnregisterResponse) Reset() { *x = MountUnregisterResponse{} - mi := &file_vtctldata_proto_msgTypes[146] + mi := &file_vtctldata_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9214,7 +9351,7 @@ func (x *MountUnregisterResponse) String() string { func (*MountUnregisterResponse) ProtoMessage() {} func (x *MountUnregisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[146] + mi := &file_vtctldata_proto_msgTypes[148] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9227,7 +9364,7 @@ func (x *MountUnregisterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountUnregisterResponse.ProtoReflect.Descriptor instead. func (*MountUnregisterResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{146} + return file_vtctldata_proto_rawDescGZIP(), []int{148} } type MountShowRequest struct { @@ -9240,7 +9377,7 @@ type MountShowRequest struct { func (x *MountShowRequest) Reset() { *x = MountShowRequest{} - mi := &file_vtctldata_proto_msgTypes[147] + mi := &file_vtctldata_proto_msgTypes[149] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9252,7 +9389,7 @@ func (x *MountShowRequest) String() string { func (*MountShowRequest) ProtoMessage() {} func (x *MountShowRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[147] + mi := &file_vtctldata_proto_msgTypes[149] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9265,7 +9402,7 @@ func (x *MountShowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountShowRequest.ProtoReflect.Descriptor instead. func (*MountShowRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{147} + return file_vtctldata_proto_rawDescGZIP(), []int{149} } func (x *MountShowRequest) GetName() string { @@ -9288,7 +9425,7 @@ type MountShowResponse struct { func (x *MountShowResponse) Reset() { *x = MountShowResponse{} - mi := &file_vtctldata_proto_msgTypes[148] + mi := &file_vtctldata_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9300,7 +9437,7 @@ func (x *MountShowResponse) String() string { func (*MountShowResponse) ProtoMessage() {} func (x *MountShowResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[148] + mi := &file_vtctldata_proto_msgTypes[150] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9313,7 +9450,7 @@ func (x *MountShowResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountShowResponse.ProtoReflect.Descriptor instead. func (*MountShowResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{148} + return file_vtctldata_proto_rawDescGZIP(), []int{150} } func (x *MountShowResponse) GetTopoType() string { @@ -9352,7 +9489,7 @@ type MountListRequest struct { func (x *MountListRequest) Reset() { *x = MountListRequest{} - mi := &file_vtctldata_proto_msgTypes[149] + mi := &file_vtctldata_proto_msgTypes[151] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9364,7 +9501,7 @@ func (x *MountListRequest) String() string { func (*MountListRequest) ProtoMessage() {} func (x *MountListRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[149] + mi := &file_vtctldata_proto_msgTypes[151] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9377,7 +9514,7 @@ func (x *MountListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountListRequest.ProtoReflect.Descriptor instead. func (*MountListRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{149} + return file_vtctldata_proto_rawDescGZIP(), []int{151} } type MountListResponse struct { @@ -9390,7 +9527,7 @@ type MountListResponse struct { func (x *MountListResponse) Reset() { *x = MountListResponse{} - mi := &file_vtctldata_proto_msgTypes[150] + mi := &file_vtctldata_proto_msgTypes[152] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9402,7 +9539,7 @@ func (x *MountListResponse) String() string { func (*MountListResponse) ProtoMessage() {} func (x *MountListResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[150] + mi := &file_vtctldata_proto_msgTypes[152] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9415,7 +9552,7 @@ func (x *MountListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountListResponse.ProtoReflect.Descriptor instead. func (*MountListResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{150} + return file_vtctldata_proto_rawDescGZIP(), []int{152} } func (x *MountListResponse) GetNames() []string { @@ -9465,7 +9602,7 @@ type MoveTablesCreateRequest struct { func (x *MoveTablesCreateRequest) Reset() { *x = MoveTablesCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[151] + mi := &file_vtctldata_proto_msgTypes[153] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9477,7 +9614,7 @@ func (x *MoveTablesCreateRequest) String() string { func (*MoveTablesCreateRequest) ProtoMessage() {} func (x *MoveTablesCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[151] + mi := &file_vtctldata_proto_msgTypes[153] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9490,7 +9627,7 @@ func (x *MoveTablesCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCreateRequest.ProtoReflect.Descriptor instead. func (*MoveTablesCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{151} + return file_vtctldata_proto_rawDescGZIP(), []int{153} } func (x *MoveTablesCreateRequest) GetWorkflow() string { @@ -9644,7 +9781,7 @@ type MoveTablesCreateResponse struct { func (x *MoveTablesCreateResponse) Reset() { *x = MoveTablesCreateResponse{} - mi := &file_vtctldata_proto_msgTypes[152] + mi := &file_vtctldata_proto_msgTypes[154] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9656,7 +9793,7 @@ func (x *MoveTablesCreateResponse) String() string { func (*MoveTablesCreateResponse) ProtoMessage() {} func (x *MoveTablesCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[152] + mi := &file_vtctldata_proto_msgTypes[154] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9669,7 +9806,7 @@ func (x *MoveTablesCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCreateResponse.ProtoReflect.Descriptor instead. func (*MoveTablesCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{152} + return file_vtctldata_proto_rawDescGZIP(), []int{154} } func (x *MoveTablesCreateResponse) GetSummary() string { @@ -9702,7 +9839,7 @@ type MoveTablesCompleteRequest struct { func (x *MoveTablesCompleteRequest) Reset() { *x = MoveTablesCompleteRequest{} - mi := &file_vtctldata_proto_msgTypes[153] + mi := &file_vtctldata_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9714,7 +9851,7 @@ func (x *MoveTablesCompleteRequest) String() string { func (*MoveTablesCompleteRequest) ProtoMessage() {} func (x *MoveTablesCompleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[153] + mi := &file_vtctldata_proto_msgTypes[155] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9727,7 +9864,7 @@ func (x *MoveTablesCompleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCompleteRequest.ProtoReflect.Descriptor instead. func (*MoveTablesCompleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{153} + return file_vtctldata_proto_rawDescGZIP(), []int{155} } func (x *MoveTablesCompleteRequest) GetWorkflow() string { @@ -9790,7 +9927,7 @@ type MoveTablesCompleteResponse struct { func (x *MoveTablesCompleteResponse) Reset() { *x = MoveTablesCompleteResponse{} - mi := &file_vtctldata_proto_msgTypes[154] + mi := &file_vtctldata_proto_msgTypes[156] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9802,7 +9939,7 @@ func (x *MoveTablesCompleteResponse) String() string { func (*MoveTablesCompleteResponse) ProtoMessage() {} func (x *MoveTablesCompleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[154] + mi := &file_vtctldata_proto_msgTypes[156] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9815,7 +9952,7 @@ func (x *MoveTablesCompleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCompleteResponse.ProtoReflect.Descriptor instead. func (*MoveTablesCompleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{154} + return file_vtctldata_proto_rawDescGZIP(), []int{156} } func (x *MoveTablesCompleteResponse) GetSummary() string { @@ -9842,7 +9979,7 @@ type PingTabletRequest struct { func (x *PingTabletRequest) Reset() { *x = PingTabletRequest{} - mi := &file_vtctldata_proto_msgTypes[155] + mi := &file_vtctldata_proto_msgTypes[157] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9854,7 +9991,7 @@ func (x *PingTabletRequest) String() string { func (*PingTabletRequest) ProtoMessage() {} func (x *PingTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[155] + mi := &file_vtctldata_proto_msgTypes[157] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9867,7 +10004,7 @@ func (x *PingTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PingTabletRequest.ProtoReflect.Descriptor instead. func (*PingTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{155} + return file_vtctldata_proto_rawDescGZIP(), []int{157} } func (x *PingTabletRequest) GetTabletAlias() *topodata.TabletAlias { @@ -9885,7 +10022,7 @@ type PingTabletResponse struct { func (x *PingTabletResponse) Reset() { *x = PingTabletResponse{} - mi := &file_vtctldata_proto_msgTypes[156] + mi := &file_vtctldata_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9897,7 +10034,7 @@ func (x *PingTabletResponse) String() string { func (*PingTabletResponse) ProtoMessage() {} func (x *PingTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[156] + mi := &file_vtctldata_proto_msgTypes[158] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9910,7 +10047,7 @@ func (x *PingTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PingTabletResponse.ProtoReflect.Descriptor instead. func (*PingTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{156} + return file_vtctldata_proto_rawDescGZIP(), []int{158} } type PlannedReparentShardRequest struct { @@ -9953,7 +10090,7 @@ type PlannedReparentShardRequest struct { func (x *PlannedReparentShardRequest) Reset() { *x = PlannedReparentShardRequest{} - mi := &file_vtctldata_proto_msgTypes[157] + mi := &file_vtctldata_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9965,7 +10102,7 @@ func (x *PlannedReparentShardRequest) String() string { func (*PlannedReparentShardRequest) ProtoMessage() {} func (x *PlannedReparentShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[157] + mi := &file_vtctldata_proto_msgTypes[159] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9978,7 +10115,7 @@ func (x *PlannedReparentShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedReparentShardRequest.ProtoReflect.Descriptor instead. func (*PlannedReparentShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{157} + return file_vtctldata_proto_rawDescGZIP(), []int{159} } func (x *PlannedReparentShardRequest) GetKeyspace() string { @@ -10056,7 +10193,7 @@ type PlannedReparentShardResponse struct { func (x *PlannedReparentShardResponse) Reset() { *x = PlannedReparentShardResponse{} - mi := &file_vtctldata_proto_msgTypes[158] + mi := &file_vtctldata_proto_msgTypes[160] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10068,7 +10205,7 @@ func (x *PlannedReparentShardResponse) String() string { func (*PlannedReparentShardResponse) ProtoMessage() {} func (x *PlannedReparentShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[158] + mi := &file_vtctldata_proto_msgTypes[160] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10081,7 +10218,7 @@ func (x *PlannedReparentShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedReparentShardResponse.ProtoReflect.Descriptor instead. func (*PlannedReparentShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{158} + return file_vtctldata_proto_rawDescGZIP(), []int{160} } func (x *PlannedReparentShardResponse) GetKeyspace() string { @@ -10126,7 +10263,7 @@ type RebuildKeyspaceGraphRequest struct { func (x *RebuildKeyspaceGraphRequest) Reset() { *x = RebuildKeyspaceGraphRequest{} - mi := &file_vtctldata_proto_msgTypes[159] + mi := &file_vtctldata_proto_msgTypes[161] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10138,7 +10275,7 @@ func (x *RebuildKeyspaceGraphRequest) String() string { func (*RebuildKeyspaceGraphRequest) ProtoMessage() {} func (x *RebuildKeyspaceGraphRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[159] + mi := &file_vtctldata_proto_msgTypes[161] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10151,7 +10288,7 @@ func (x *RebuildKeyspaceGraphRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildKeyspaceGraphRequest.ProtoReflect.Descriptor instead. func (*RebuildKeyspaceGraphRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{159} + return file_vtctldata_proto_rawDescGZIP(), []int{161} } func (x *RebuildKeyspaceGraphRequest) GetKeyspace() string { @@ -10183,7 +10320,7 @@ type RebuildKeyspaceGraphResponse struct { func (x *RebuildKeyspaceGraphResponse) Reset() { *x = RebuildKeyspaceGraphResponse{} - mi := &file_vtctldata_proto_msgTypes[160] + mi := &file_vtctldata_proto_msgTypes[162] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10195,7 +10332,7 @@ func (x *RebuildKeyspaceGraphResponse) String() string { func (*RebuildKeyspaceGraphResponse) ProtoMessage() {} func (x *RebuildKeyspaceGraphResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[160] + mi := &file_vtctldata_proto_msgTypes[162] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10208,7 +10345,7 @@ func (x *RebuildKeyspaceGraphResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildKeyspaceGraphResponse.ProtoReflect.Descriptor instead. func (*RebuildKeyspaceGraphResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{160} + return file_vtctldata_proto_rawDescGZIP(), []int{162} } type RebuildVSchemaGraphRequest struct { @@ -10223,7 +10360,7 @@ type RebuildVSchemaGraphRequest struct { func (x *RebuildVSchemaGraphRequest) Reset() { *x = RebuildVSchemaGraphRequest{} - mi := &file_vtctldata_proto_msgTypes[161] + mi := &file_vtctldata_proto_msgTypes[163] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10235,7 +10372,7 @@ func (x *RebuildVSchemaGraphRequest) String() string { func (*RebuildVSchemaGraphRequest) ProtoMessage() {} func (x *RebuildVSchemaGraphRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[161] + mi := &file_vtctldata_proto_msgTypes[163] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10248,7 +10385,7 @@ func (x *RebuildVSchemaGraphRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildVSchemaGraphRequest.ProtoReflect.Descriptor instead. func (*RebuildVSchemaGraphRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{161} + return file_vtctldata_proto_rawDescGZIP(), []int{163} } func (x *RebuildVSchemaGraphRequest) GetCells() []string { @@ -10266,7 +10403,7 @@ type RebuildVSchemaGraphResponse struct { func (x *RebuildVSchemaGraphResponse) Reset() { *x = RebuildVSchemaGraphResponse{} - mi := &file_vtctldata_proto_msgTypes[162] + mi := &file_vtctldata_proto_msgTypes[164] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10278,7 +10415,7 @@ func (x *RebuildVSchemaGraphResponse) String() string { func (*RebuildVSchemaGraphResponse) ProtoMessage() {} func (x *RebuildVSchemaGraphResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[162] + mi := &file_vtctldata_proto_msgTypes[164] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10291,7 +10428,7 @@ func (x *RebuildVSchemaGraphResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildVSchemaGraphResponse.ProtoReflect.Descriptor instead. func (*RebuildVSchemaGraphResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{162} + return file_vtctldata_proto_rawDescGZIP(), []int{164} } type RefreshStateRequest struct { @@ -10304,7 +10441,7 @@ type RefreshStateRequest struct { func (x *RefreshStateRequest) Reset() { *x = RefreshStateRequest{} - mi := &file_vtctldata_proto_msgTypes[163] + mi := &file_vtctldata_proto_msgTypes[165] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10316,7 +10453,7 @@ func (x *RefreshStateRequest) String() string { func (*RefreshStateRequest) ProtoMessage() {} func (x *RefreshStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[163] + mi := &file_vtctldata_proto_msgTypes[165] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10329,7 +10466,7 @@ func (x *RefreshStateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateRequest.ProtoReflect.Descriptor instead. func (*RefreshStateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{163} + return file_vtctldata_proto_rawDescGZIP(), []int{165} } func (x *RefreshStateRequest) GetTabletAlias() *topodata.TabletAlias { @@ -10347,7 +10484,7 @@ type RefreshStateResponse struct { func (x *RefreshStateResponse) Reset() { *x = RefreshStateResponse{} - mi := &file_vtctldata_proto_msgTypes[164] + mi := &file_vtctldata_proto_msgTypes[166] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10359,7 +10496,7 @@ func (x *RefreshStateResponse) String() string { func (*RefreshStateResponse) ProtoMessage() {} func (x *RefreshStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[164] + mi := &file_vtctldata_proto_msgTypes[166] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10372,7 +10509,7 @@ func (x *RefreshStateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateResponse.ProtoReflect.Descriptor instead. func (*RefreshStateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{164} + return file_vtctldata_proto_rawDescGZIP(), []int{166} } type RefreshStateByShardRequest struct { @@ -10387,7 +10524,7 @@ type RefreshStateByShardRequest struct { func (x *RefreshStateByShardRequest) Reset() { *x = RefreshStateByShardRequest{} - mi := &file_vtctldata_proto_msgTypes[165] + mi := &file_vtctldata_proto_msgTypes[167] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10399,7 +10536,7 @@ func (x *RefreshStateByShardRequest) String() string { func (*RefreshStateByShardRequest) ProtoMessage() {} func (x *RefreshStateByShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[165] + mi := &file_vtctldata_proto_msgTypes[167] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10412,7 +10549,7 @@ func (x *RefreshStateByShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateByShardRequest.ProtoReflect.Descriptor instead. func (*RefreshStateByShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{165} + return file_vtctldata_proto_rawDescGZIP(), []int{167} } func (x *RefreshStateByShardRequest) GetKeyspace() string { @@ -10448,7 +10585,7 @@ type RefreshStateByShardResponse struct { func (x *RefreshStateByShardResponse) Reset() { *x = RefreshStateByShardResponse{} - mi := &file_vtctldata_proto_msgTypes[166] + mi := &file_vtctldata_proto_msgTypes[168] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10460,7 +10597,7 @@ func (x *RefreshStateByShardResponse) String() string { func (*RefreshStateByShardResponse) ProtoMessage() {} func (x *RefreshStateByShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[166] + mi := &file_vtctldata_proto_msgTypes[168] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10473,7 +10610,7 @@ func (x *RefreshStateByShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateByShardResponse.ProtoReflect.Descriptor instead. func (*RefreshStateByShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{166} + return file_vtctldata_proto_rawDescGZIP(), []int{168} } func (x *RefreshStateByShardResponse) GetIsPartialRefresh() bool { @@ -10500,7 +10637,7 @@ type ReloadSchemaRequest struct { func (x *ReloadSchemaRequest) Reset() { *x = ReloadSchemaRequest{} - mi := &file_vtctldata_proto_msgTypes[167] + mi := &file_vtctldata_proto_msgTypes[169] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10512,7 +10649,7 @@ func (x *ReloadSchemaRequest) String() string { func (*ReloadSchemaRequest) ProtoMessage() {} func (x *ReloadSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[167] + mi := &file_vtctldata_proto_msgTypes[169] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10525,7 +10662,7 @@ func (x *ReloadSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaRequest.ProtoReflect.Descriptor instead. func (*ReloadSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{167} + return file_vtctldata_proto_rawDescGZIP(), []int{169} } func (x *ReloadSchemaRequest) GetTabletAlias() *topodata.TabletAlias { @@ -10543,7 +10680,7 @@ type ReloadSchemaResponse struct { func (x *ReloadSchemaResponse) Reset() { *x = ReloadSchemaResponse{} - mi := &file_vtctldata_proto_msgTypes[168] + mi := &file_vtctldata_proto_msgTypes[170] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10555,7 +10692,7 @@ func (x *ReloadSchemaResponse) String() string { func (*ReloadSchemaResponse) ProtoMessage() {} func (x *ReloadSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[168] + mi := &file_vtctldata_proto_msgTypes[170] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10568,7 +10705,7 @@ func (x *ReloadSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaResponse.ProtoReflect.Descriptor instead. func (*ReloadSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{168} + return file_vtctldata_proto_rawDescGZIP(), []int{170} } type ReloadSchemaKeyspaceRequest struct { @@ -10587,7 +10724,7 @@ type ReloadSchemaKeyspaceRequest struct { func (x *ReloadSchemaKeyspaceRequest) Reset() { *x = ReloadSchemaKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[169] + mi := &file_vtctldata_proto_msgTypes[171] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10599,7 +10736,7 @@ func (x *ReloadSchemaKeyspaceRequest) String() string { func (*ReloadSchemaKeyspaceRequest) ProtoMessage() {} func (x *ReloadSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[169] + mi := &file_vtctldata_proto_msgTypes[171] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10612,7 +10749,7 @@ func (x *ReloadSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ReloadSchemaKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{169} + return file_vtctldata_proto_rawDescGZIP(), []int{171} } func (x *ReloadSchemaKeyspaceRequest) GetKeyspace() string { @@ -10653,7 +10790,7 @@ type ReloadSchemaKeyspaceResponse struct { func (x *ReloadSchemaKeyspaceResponse) Reset() { *x = ReloadSchemaKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[170] + mi := &file_vtctldata_proto_msgTypes[172] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10665,7 +10802,7 @@ func (x *ReloadSchemaKeyspaceResponse) String() string { func (*ReloadSchemaKeyspaceResponse) ProtoMessage() {} func (x *ReloadSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[170] + mi := &file_vtctldata_proto_msgTypes[172] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10678,7 +10815,7 @@ func (x *ReloadSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ReloadSchemaKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{170} + return file_vtctldata_proto_rawDescGZIP(), []int{172} } func (x *ReloadSchemaKeyspaceResponse) GetEvents() []*logutil.Event { @@ -10703,7 +10840,7 @@ type ReloadSchemaShardRequest struct { func (x *ReloadSchemaShardRequest) Reset() { *x = ReloadSchemaShardRequest{} - mi := &file_vtctldata_proto_msgTypes[171] + mi := &file_vtctldata_proto_msgTypes[173] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10715,7 +10852,7 @@ func (x *ReloadSchemaShardRequest) String() string { func (*ReloadSchemaShardRequest) ProtoMessage() {} func (x *ReloadSchemaShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[171] + mi := &file_vtctldata_proto_msgTypes[173] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10728,7 +10865,7 @@ func (x *ReloadSchemaShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaShardRequest.ProtoReflect.Descriptor instead. func (*ReloadSchemaShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{171} + return file_vtctldata_proto_rawDescGZIP(), []int{173} } func (x *ReloadSchemaShardRequest) GetKeyspace() string { @@ -10776,7 +10913,7 @@ type ReloadSchemaShardResponse struct { func (x *ReloadSchemaShardResponse) Reset() { *x = ReloadSchemaShardResponse{} - mi := &file_vtctldata_proto_msgTypes[172] + mi := &file_vtctldata_proto_msgTypes[174] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10788,7 +10925,7 @@ func (x *ReloadSchemaShardResponse) String() string { func (*ReloadSchemaShardResponse) ProtoMessage() {} func (x *ReloadSchemaShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[172] + mi := &file_vtctldata_proto_msgTypes[174] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10801,7 +10938,7 @@ func (x *ReloadSchemaShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaShardResponse.ProtoReflect.Descriptor instead. func (*ReloadSchemaShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{172} + return file_vtctldata_proto_rawDescGZIP(), []int{174} } func (x *ReloadSchemaShardResponse) GetEvents() []*logutil.Event { @@ -10823,7 +10960,7 @@ type RemoveBackupRequest struct { func (x *RemoveBackupRequest) Reset() { *x = RemoveBackupRequest{} - mi := &file_vtctldata_proto_msgTypes[173] + mi := &file_vtctldata_proto_msgTypes[175] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10835,7 +10972,7 @@ func (x *RemoveBackupRequest) String() string { func (*RemoveBackupRequest) ProtoMessage() {} func (x *RemoveBackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[173] + mi := &file_vtctldata_proto_msgTypes[175] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10848,7 +10985,7 @@ func (x *RemoveBackupRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveBackupRequest.ProtoReflect.Descriptor instead. func (*RemoveBackupRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{173} + return file_vtctldata_proto_rawDescGZIP(), []int{175} } func (x *RemoveBackupRequest) GetKeyspace() string { @@ -10880,7 +11017,7 @@ type RemoveBackupResponse struct { func (x *RemoveBackupResponse) Reset() { *x = RemoveBackupResponse{} - mi := &file_vtctldata_proto_msgTypes[174] + mi := &file_vtctldata_proto_msgTypes[176] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10892,7 +11029,7 @@ func (x *RemoveBackupResponse) String() string { func (*RemoveBackupResponse) ProtoMessage() {} func (x *RemoveBackupResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[174] + mi := &file_vtctldata_proto_msgTypes[176] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10905,7 +11042,7 @@ func (x *RemoveBackupResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveBackupResponse.ProtoReflect.Descriptor instead. func (*RemoveBackupResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{174} + return file_vtctldata_proto_rawDescGZIP(), []int{176} } type RemoveKeyspaceCellRequest struct { @@ -10926,7 +11063,7 @@ type RemoveKeyspaceCellRequest struct { func (x *RemoveKeyspaceCellRequest) Reset() { *x = RemoveKeyspaceCellRequest{} - mi := &file_vtctldata_proto_msgTypes[175] + mi := &file_vtctldata_proto_msgTypes[177] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10938,7 +11075,7 @@ func (x *RemoveKeyspaceCellRequest) String() string { func (*RemoveKeyspaceCellRequest) ProtoMessage() {} func (x *RemoveKeyspaceCellRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[175] + mi := &file_vtctldata_proto_msgTypes[177] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10951,7 +11088,7 @@ func (x *RemoveKeyspaceCellRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveKeyspaceCellRequest.ProtoReflect.Descriptor instead. func (*RemoveKeyspaceCellRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{175} + return file_vtctldata_proto_rawDescGZIP(), []int{177} } func (x *RemoveKeyspaceCellRequest) GetKeyspace() string { @@ -10990,7 +11127,7 @@ type RemoveKeyspaceCellResponse struct { func (x *RemoveKeyspaceCellResponse) Reset() { *x = RemoveKeyspaceCellResponse{} - mi := &file_vtctldata_proto_msgTypes[176] + mi := &file_vtctldata_proto_msgTypes[178] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11002,7 +11139,7 @@ func (x *RemoveKeyspaceCellResponse) String() string { func (*RemoveKeyspaceCellResponse) ProtoMessage() {} func (x *RemoveKeyspaceCellResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[176] + mi := &file_vtctldata_proto_msgTypes[178] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11015,7 +11152,7 @@ func (x *RemoveKeyspaceCellResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveKeyspaceCellResponse.ProtoReflect.Descriptor instead. func (*RemoveKeyspaceCellResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{176} + return file_vtctldata_proto_rawDescGZIP(), []int{178} } type RemoveShardCellRequest struct { @@ -11037,7 +11174,7 @@ type RemoveShardCellRequest struct { func (x *RemoveShardCellRequest) Reset() { *x = RemoveShardCellRequest{} - mi := &file_vtctldata_proto_msgTypes[177] + mi := &file_vtctldata_proto_msgTypes[179] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11049,7 +11186,7 @@ func (x *RemoveShardCellRequest) String() string { func (*RemoveShardCellRequest) ProtoMessage() {} func (x *RemoveShardCellRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[177] + mi := &file_vtctldata_proto_msgTypes[179] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11062,7 +11199,7 @@ func (x *RemoveShardCellRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveShardCellRequest.ProtoReflect.Descriptor instead. func (*RemoveShardCellRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{177} + return file_vtctldata_proto_rawDescGZIP(), []int{179} } func (x *RemoveShardCellRequest) GetKeyspace() string { @@ -11108,7 +11245,7 @@ type RemoveShardCellResponse struct { func (x *RemoveShardCellResponse) Reset() { *x = RemoveShardCellResponse{} - mi := &file_vtctldata_proto_msgTypes[178] + mi := &file_vtctldata_proto_msgTypes[180] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11120,7 +11257,7 @@ func (x *RemoveShardCellResponse) String() string { func (*RemoveShardCellResponse) ProtoMessage() {} func (x *RemoveShardCellResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[178] + mi := &file_vtctldata_proto_msgTypes[180] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11133,7 +11270,7 @@ func (x *RemoveShardCellResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveShardCellResponse.ProtoReflect.Descriptor instead. func (*RemoveShardCellResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{178} + return file_vtctldata_proto_rawDescGZIP(), []int{180} } type ReparentTabletRequest struct { @@ -11148,7 +11285,7 @@ type ReparentTabletRequest struct { func (x *ReparentTabletRequest) Reset() { *x = ReparentTabletRequest{} - mi := &file_vtctldata_proto_msgTypes[179] + mi := &file_vtctldata_proto_msgTypes[181] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11160,7 +11297,7 @@ func (x *ReparentTabletRequest) String() string { func (*ReparentTabletRequest) ProtoMessage() {} func (x *ReparentTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[179] + mi := &file_vtctldata_proto_msgTypes[181] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11173,7 +11310,7 @@ func (x *ReparentTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReparentTabletRequest.ProtoReflect.Descriptor instead. func (*ReparentTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{179} + return file_vtctldata_proto_rawDescGZIP(), []int{181} } func (x *ReparentTabletRequest) GetTablet() *topodata.TabletAlias { @@ -11198,7 +11335,7 @@ type ReparentTabletResponse struct { func (x *ReparentTabletResponse) Reset() { *x = ReparentTabletResponse{} - mi := &file_vtctldata_proto_msgTypes[180] + mi := &file_vtctldata_proto_msgTypes[182] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11210,7 +11347,7 @@ func (x *ReparentTabletResponse) String() string { func (*ReparentTabletResponse) ProtoMessage() {} func (x *ReparentTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[180] + mi := &file_vtctldata_proto_msgTypes[182] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11223,7 +11360,7 @@ func (x *ReparentTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReparentTabletResponse.ProtoReflect.Descriptor instead. func (*ReparentTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{180} + return file_vtctldata_proto_rawDescGZIP(), []int{182} } func (x *ReparentTabletResponse) GetKeyspace() string { @@ -11275,7 +11412,7 @@ type ReshardCreateRequest struct { func (x *ReshardCreateRequest) Reset() { *x = ReshardCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[181] + mi := &file_vtctldata_proto_msgTypes[183] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11287,7 +11424,7 @@ func (x *ReshardCreateRequest) String() string { func (*ReshardCreateRequest) ProtoMessage() {} func (x *ReshardCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[181] + mi := &file_vtctldata_proto_msgTypes[183] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11300,7 +11437,7 @@ func (x *ReshardCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReshardCreateRequest.ProtoReflect.Descriptor instead. func (*ReshardCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{181} + return file_vtctldata_proto_rawDescGZIP(), []int{183} } func (x *ReshardCreateRequest) GetWorkflow() string { @@ -11418,7 +11555,7 @@ type RestoreFromBackupRequest struct { func (x *RestoreFromBackupRequest) Reset() { *x = RestoreFromBackupRequest{} - mi := &file_vtctldata_proto_msgTypes[182] + mi := &file_vtctldata_proto_msgTypes[184] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11430,7 +11567,7 @@ func (x *RestoreFromBackupRequest) String() string { func (*RestoreFromBackupRequest) ProtoMessage() {} func (x *RestoreFromBackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[182] + mi := &file_vtctldata_proto_msgTypes[184] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11443,7 +11580,7 @@ func (x *RestoreFromBackupRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreFromBackupRequest.ProtoReflect.Descriptor instead. func (*RestoreFromBackupRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{182} + return file_vtctldata_proto_rawDescGZIP(), []int{184} } func (x *RestoreFromBackupRequest) GetTabletAlias() *topodata.TabletAlias { @@ -11502,7 +11639,7 @@ type RestoreFromBackupResponse struct { func (x *RestoreFromBackupResponse) Reset() { *x = RestoreFromBackupResponse{} - mi := &file_vtctldata_proto_msgTypes[183] + mi := &file_vtctldata_proto_msgTypes[185] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11514,7 +11651,7 @@ func (x *RestoreFromBackupResponse) String() string { func (*RestoreFromBackupResponse) ProtoMessage() {} func (x *RestoreFromBackupResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[183] + mi := &file_vtctldata_proto_msgTypes[185] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11527,7 +11664,7 @@ func (x *RestoreFromBackupResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreFromBackupResponse.ProtoReflect.Descriptor instead. func (*RestoreFromBackupResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{183} + return file_vtctldata_proto_rawDescGZIP(), []int{185} } func (x *RestoreFromBackupResponse) GetTabletAlias() *topodata.TabletAlias { @@ -11569,7 +11706,7 @@ type RetrySchemaMigrationRequest struct { func (x *RetrySchemaMigrationRequest) Reset() { *x = RetrySchemaMigrationRequest{} - mi := &file_vtctldata_proto_msgTypes[184] + mi := &file_vtctldata_proto_msgTypes[186] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11581,7 +11718,7 @@ func (x *RetrySchemaMigrationRequest) String() string { func (*RetrySchemaMigrationRequest) ProtoMessage() {} func (x *RetrySchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[184] + mi := &file_vtctldata_proto_msgTypes[186] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11594,7 +11731,7 @@ func (x *RetrySchemaMigrationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RetrySchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*RetrySchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{184} + return file_vtctldata_proto_rawDescGZIP(), []int{186} } func (x *RetrySchemaMigrationRequest) GetKeyspace() string { @@ -11621,7 +11758,7 @@ type RetrySchemaMigrationResponse struct { func (x *RetrySchemaMigrationResponse) Reset() { *x = RetrySchemaMigrationResponse{} - mi := &file_vtctldata_proto_msgTypes[185] + mi := &file_vtctldata_proto_msgTypes[187] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11633,7 +11770,7 @@ func (x *RetrySchemaMigrationResponse) String() string { func (*RetrySchemaMigrationResponse) ProtoMessage() {} func (x *RetrySchemaMigrationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[185] + mi := &file_vtctldata_proto_msgTypes[187] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11646,7 +11783,7 @@ func (x *RetrySchemaMigrationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RetrySchemaMigrationResponse.ProtoReflect.Descriptor instead. func (*RetrySchemaMigrationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{185} + return file_vtctldata_proto_rawDescGZIP(), []int{187} } func (x *RetrySchemaMigrationResponse) GetRowsAffectedByShard() map[string]uint64 { @@ -11666,7 +11803,7 @@ type RunHealthCheckRequest struct { func (x *RunHealthCheckRequest) Reset() { *x = RunHealthCheckRequest{} - mi := &file_vtctldata_proto_msgTypes[186] + mi := &file_vtctldata_proto_msgTypes[188] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11678,7 +11815,7 @@ func (x *RunHealthCheckRequest) String() string { func (*RunHealthCheckRequest) ProtoMessage() {} func (x *RunHealthCheckRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[186] + mi := &file_vtctldata_proto_msgTypes[188] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11691,7 +11828,7 @@ func (x *RunHealthCheckRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunHealthCheckRequest.ProtoReflect.Descriptor instead. func (*RunHealthCheckRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{186} + return file_vtctldata_proto_rawDescGZIP(), []int{188} } func (x *RunHealthCheckRequest) GetTabletAlias() *topodata.TabletAlias { @@ -11709,7 +11846,7 @@ type RunHealthCheckResponse struct { func (x *RunHealthCheckResponse) Reset() { *x = RunHealthCheckResponse{} - mi := &file_vtctldata_proto_msgTypes[187] + mi := &file_vtctldata_proto_msgTypes[189] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11721,7 +11858,7 @@ func (x *RunHealthCheckResponse) String() string { func (*RunHealthCheckResponse) ProtoMessage() {} func (x *RunHealthCheckResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[187] + mi := &file_vtctldata_proto_msgTypes[189] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11734,7 +11871,7 @@ func (x *RunHealthCheckResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RunHealthCheckResponse.ProtoReflect.Descriptor instead. func (*RunHealthCheckResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{187} + return file_vtctldata_proto_rawDescGZIP(), []int{189} } type SetKeyspaceDurabilityPolicyRequest struct { @@ -11748,7 +11885,7 @@ type SetKeyspaceDurabilityPolicyRequest struct { func (x *SetKeyspaceDurabilityPolicyRequest) Reset() { *x = SetKeyspaceDurabilityPolicyRequest{} - mi := &file_vtctldata_proto_msgTypes[188] + mi := &file_vtctldata_proto_msgTypes[190] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11760,7 +11897,7 @@ func (x *SetKeyspaceDurabilityPolicyRequest) String() string { func (*SetKeyspaceDurabilityPolicyRequest) ProtoMessage() {} func (x *SetKeyspaceDurabilityPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[188] + mi := &file_vtctldata_proto_msgTypes[190] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11773,7 +11910,7 @@ func (x *SetKeyspaceDurabilityPolicyRequest) ProtoReflect() protoreflect.Message // Deprecated: Use SetKeyspaceDurabilityPolicyRequest.ProtoReflect.Descriptor instead. func (*SetKeyspaceDurabilityPolicyRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{188} + return file_vtctldata_proto_rawDescGZIP(), []int{190} } func (x *SetKeyspaceDurabilityPolicyRequest) GetKeyspace() string { @@ -11801,7 +11938,7 @@ type SetKeyspaceDurabilityPolicyResponse struct { func (x *SetKeyspaceDurabilityPolicyResponse) Reset() { *x = SetKeyspaceDurabilityPolicyResponse{} - mi := &file_vtctldata_proto_msgTypes[189] + mi := &file_vtctldata_proto_msgTypes[191] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11813,7 +11950,7 @@ func (x *SetKeyspaceDurabilityPolicyResponse) String() string { func (*SetKeyspaceDurabilityPolicyResponse) ProtoMessage() {} func (x *SetKeyspaceDurabilityPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[189] + mi := &file_vtctldata_proto_msgTypes[191] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11826,7 +11963,7 @@ func (x *SetKeyspaceDurabilityPolicyResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use SetKeyspaceDurabilityPolicyResponse.ProtoReflect.Descriptor instead. func (*SetKeyspaceDurabilityPolicyResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{189} + return file_vtctldata_proto_rawDescGZIP(), []int{191} } func (x *SetKeyspaceDurabilityPolicyResponse) GetKeyspace() *topodata.Keyspace { @@ -11847,7 +11984,7 @@ type SetKeyspaceShardingInfoRequest struct { func (x *SetKeyspaceShardingInfoRequest) Reset() { *x = SetKeyspaceShardingInfoRequest{} - mi := &file_vtctldata_proto_msgTypes[190] + mi := &file_vtctldata_proto_msgTypes[192] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11859,7 +11996,7 @@ func (x *SetKeyspaceShardingInfoRequest) String() string { func (*SetKeyspaceShardingInfoRequest) ProtoMessage() {} func (x *SetKeyspaceShardingInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[190] + mi := &file_vtctldata_proto_msgTypes[192] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11872,7 +12009,7 @@ func (x *SetKeyspaceShardingInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetKeyspaceShardingInfoRequest.ProtoReflect.Descriptor instead. func (*SetKeyspaceShardingInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{190} + return file_vtctldata_proto_rawDescGZIP(), []int{192} } func (x *SetKeyspaceShardingInfoRequest) GetKeyspace() string { @@ -11900,7 +12037,7 @@ type SetKeyspaceShardingInfoResponse struct { func (x *SetKeyspaceShardingInfoResponse) Reset() { *x = SetKeyspaceShardingInfoResponse{} - mi := &file_vtctldata_proto_msgTypes[191] + mi := &file_vtctldata_proto_msgTypes[193] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11912,7 +12049,7 @@ func (x *SetKeyspaceShardingInfoResponse) String() string { func (*SetKeyspaceShardingInfoResponse) ProtoMessage() {} func (x *SetKeyspaceShardingInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[191] + mi := &file_vtctldata_proto_msgTypes[193] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11925,7 +12062,7 @@ func (x *SetKeyspaceShardingInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetKeyspaceShardingInfoResponse.ProtoReflect.Descriptor instead. func (*SetKeyspaceShardingInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{191} + return file_vtctldata_proto_rawDescGZIP(), []int{193} } func (x *SetKeyspaceShardingInfoResponse) GetKeyspace() *topodata.Keyspace { @@ -11947,7 +12084,7 @@ type SetShardIsPrimaryServingRequest struct { func (x *SetShardIsPrimaryServingRequest) Reset() { *x = SetShardIsPrimaryServingRequest{} - mi := &file_vtctldata_proto_msgTypes[192] + mi := &file_vtctldata_proto_msgTypes[194] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11959,7 +12096,7 @@ func (x *SetShardIsPrimaryServingRequest) String() string { func (*SetShardIsPrimaryServingRequest) ProtoMessage() {} func (x *SetShardIsPrimaryServingRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[192] + mi := &file_vtctldata_proto_msgTypes[194] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11972,7 +12109,7 @@ func (x *SetShardIsPrimaryServingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardIsPrimaryServingRequest.ProtoReflect.Descriptor instead. func (*SetShardIsPrimaryServingRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{192} + return file_vtctldata_proto_rawDescGZIP(), []int{194} } func (x *SetShardIsPrimaryServingRequest) GetKeyspace() string { @@ -12007,7 +12144,7 @@ type SetShardIsPrimaryServingResponse struct { func (x *SetShardIsPrimaryServingResponse) Reset() { *x = SetShardIsPrimaryServingResponse{} - mi := &file_vtctldata_proto_msgTypes[193] + mi := &file_vtctldata_proto_msgTypes[195] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12019,7 +12156,7 @@ func (x *SetShardIsPrimaryServingResponse) String() string { func (*SetShardIsPrimaryServingResponse) ProtoMessage() {} func (x *SetShardIsPrimaryServingResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[193] + mi := &file_vtctldata_proto_msgTypes[195] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12032,7 +12169,7 @@ func (x *SetShardIsPrimaryServingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardIsPrimaryServingResponse.ProtoReflect.Descriptor instead. func (*SetShardIsPrimaryServingResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{193} + return file_vtctldata_proto_rawDescGZIP(), []int{195} } func (x *SetShardIsPrimaryServingResponse) GetShard() *topodata.Shard { @@ -12072,7 +12209,7 @@ type SetShardTabletControlRequest struct { func (x *SetShardTabletControlRequest) Reset() { *x = SetShardTabletControlRequest{} - mi := &file_vtctldata_proto_msgTypes[194] + mi := &file_vtctldata_proto_msgTypes[196] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12084,7 +12221,7 @@ func (x *SetShardTabletControlRequest) String() string { func (*SetShardTabletControlRequest) ProtoMessage() {} func (x *SetShardTabletControlRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[194] + mi := &file_vtctldata_proto_msgTypes[196] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12097,7 +12234,7 @@ func (x *SetShardTabletControlRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardTabletControlRequest.ProtoReflect.Descriptor instead. func (*SetShardTabletControlRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{194} + return file_vtctldata_proto_rawDescGZIP(), []int{196} } func (x *SetShardTabletControlRequest) GetKeyspace() string { @@ -12160,7 +12297,7 @@ type SetShardTabletControlResponse struct { func (x *SetShardTabletControlResponse) Reset() { *x = SetShardTabletControlResponse{} - mi := &file_vtctldata_proto_msgTypes[195] + mi := &file_vtctldata_proto_msgTypes[197] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12172,7 +12309,7 @@ func (x *SetShardTabletControlResponse) String() string { func (*SetShardTabletControlResponse) ProtoMessage() {} func (x *SetShardTabletControlResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[195] + mi := &file_vtctldata_proto_msgTypes[197] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12185,7 +12322,7 @@ func (x *SetShardTabletControlResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardTabletControlResponse.ProtoReflect.Descriptor instead. func (*SetShardTabletControlResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{195} + return file_vtctldata_proto_rawDescGZIP(), []int{197} } func (x *SetShardTabletControlResponse) GetShard() *topodata.Shard { @@ -12206,7 +12343,7 @@ type SetWritableRequest struct { func (x *SetWritableRequest) Reset() { *x = SetWritableRequest{} - mi := &file_vtctldata_proto_msgTypes[196] + mi := &file_vtctldata_proto_msgTypes[198] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12218,7 +12355,7 @@ func (x *SetWritableRequest) String() string { func (*SetWritableRequest) ProtoMessage() {} func (x *SetWritableRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[196] + mi := &file_vtctldata_proto_msgTypes[198] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12231,7 +12368,7 @@ func (x *SetWritableRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetWritableRequest.ProtoReflect.Descriptor instead. func (*SetWritableRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{196} + return file_vtctldata_proto_rawDescGZIP(), []int{198} } func (x *SetWritableRequest) GetTabletAlias() *topodata.TabletAlias { @@ -12256,7 +12393,7 @@ type SetWritableResponse struct { func (x *SetWritableResponse) Reset() { *x = SetWritableResponse{} - mi := &file_vtctldata_proto_msgTypes[197] + mi := &file_vtctldata_proto_msgTypes[199] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12268,7 +12405,7 @@ func (x *SetWritableResponse) String() string { func (*SetWritableResponse) ProtoMessage() {} func (x *SetWritableResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[197] + mi := &file_vtctldata_proto_msgTypes[199] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12281,7 +12418,7 @@ func (x *SetWritableResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetWritableResponse.ProtoReflect.Descriptor instead. func (*SetWritableResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{197} + return file_vtctldata_proto_rawDescGZIP(), []int{199} } type ShardReplicationAddRequest struct { @@ -12296,7 +12433,7 @@ type ShardReplicationAddRequest struct { func (x *ShardReplicationAddRequest) Reset() { *x = ShardReplicationAddRequest{} - mi := &file_vtctldata_proto_msgTypes[198] + mi := &file_vtctldata_proto_msgTypes[200] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12308,7 +12445,7 @@ func (x *ShardReplicationAddRequest) String() string { func (*ShardReplicationAddRequest) ProtoMessage() {} func (x *ShardReplicationAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[198] + mi := &file_vtctldata_proto_msgTypes[200] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12321,7 +12458,7 @@ func (x *ShardReplicationAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationAddRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationAddRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{198} + return file_vtctldata_proto_rawDescGZIP(), []int{200} } func (x *ShardReplicationAddRequest) GetKeyspace() string { @@ -12353,7 +12490,7 @@ type ShardReplicationAddResponse struct { func (x *ShardReplicationAddResponse) Reset() { *x = ShardReplicationAddResponse{} - mi := &file_vtctldata_proto_msgTypes[199] + mi := &file_vtctldata_proto_msgTypes[201] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12365,7 +12502,7 @@ func (x *ShardReplicationAddResponse) String() string { func (*ShardReplicationAddResponse) ProtoMessage() {} func (x *ShardReplicationAddResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[199] + mi := &file_vtctldata_proto_msgTypes[201] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12378,7 +12515,7 @@ func (x *ShardReplicationAddResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationAddResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationAddResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{199} + return file_vtctldata_proto_rawDescGZIP(), []int{201} } type ShardReplicationFixRequest struct { @@ -12393,7 +12530,7 @@ type ShardReplicationFixRequest struct { func (x *ShardReplicationFixRequest) Reset() { *x = ShardReplicationFixRequest{} - mi := &file_vtctldata_proto_msgTypes[200] + mi := &file_vtctldata_proto_msgTypes[202] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12405,7 +12542,7 @@ func (x *ShardReplicationFixRequest) String() string { func (*ShardReplicationFixRequest) ProtoMessage() {} func (x *ShardReplicationFixRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[200] + mi := &file_vtctldata_proto_msgTypes[202] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12418,7 +12555,7 @@ func (x *ShardReplicationFixRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationFixRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationFixRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{200} + return file_vtctldata_proto_rawDescGZIP(), []int{202} } func (x *ShardReplicationFixRequest) GetKeyspace() string { @@ -12455,7 +12592,7 @@ type ShardReplicationFixResponse struct { func (x *ShardReplicationFixResponse) Reset() { *x = ShardReplicationFixResponse{} - mi := &file_vtctldata_proto_msgTypes[201] + mi := &file_vtctldata_proto_msgTypes[203] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12467,7 +12604,7 @@ func (x *ShardReplicationFixResponse) String() string { func (*ShardReplicationFixResponse) ProtoMessage() {} func (x *ShardReplicationFixResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[201] + mi := &file_vtctldata_proto_msgTypes[203] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12480,7 +12617,7 @@ func (x *ShardReplicationFixResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationFixResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationFixResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{201} + return file_vtctldata_proto_rawDescGZIP(), []int{203} } func (x *ShardReplicationFixResponse) GetError() *topodata.ShardReplicationError { @@ -12501,7 +12638,7 @@ type ShardReplicationPositionsRequest struct { func (x *ShardReplicationPositionsRequest) Reset() { *x = ShardReplicationPositionsRequest{} - mi := &file_vtctldata_proto_msgTypes[202] + mi := &file_vtctldata_proto_msgTypes[204] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12513,7 +12650,7 @@ func (x *ShardReplicationPositionsRequest) String() string { func (*ShardReplicationPositionsRequest) ProtoMessage() {} func (x *ShardReplicationPositionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[202] + mi := &file_vtctldata_proto_msgTypes[204] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12526,7 +12663,7 @@ func (x *ShardReplicationPositionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationPositionsRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationPositionsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{202} + return file_vtctldata_proto_rawDescGZIP(), []int{204} } func (x *ShardReplicationPositionsRequest) GetKeyspace() string { @@ -12558,7 +12695,7 @@ type ShardReplicationPositionsResponse struct { func (x *ShardReplicationPositionsResponse) Reset() { *x = ShardReplicationPositionsResponse{} - mi := &file_vtctldata_proto_msgTypes[203] + mi := &file_vtctldata_proto_msgTypes[205] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12570,7 +12707,7 @@ func (x *ShardReplicationPositionsResponse) String() string { func (*ShardReplicationPositionsResponse) ProtoMessage() {} func (x *ShardReplicationPositionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[203] + mi := &file_vtctldata_proto_msgTypes[205] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12583,7 +12720,7 @@ func (x *ShardReplicationPositionsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ShardReplicationPositionsResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationPositionsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{203} + return file_vtctldata_proto_rawDescGZIP(), []int{205} } func (x *ShardReplicationPositionsResponse) GetReplicationStatuses() map[string]*replicationdata.Status { @@ -12612,7 +12749,7 @@ type ShardReplicationRemoveRequest struct { func (x *ShardReplicationRemoveRequest) Reset() { *x = ShardReplicationRemoveRequest{} - mi := &file_vtctldata_proto_msgTypes[204] + mi := &file_vtctldata_proto_msgTypes[206] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12624,7 +12761,7 @@ func (x *ShardReplicationRemoveRequest) String() string { func (*ShardReplicationRemoveRequest) ProtoMessage() {} func (x *ShardReplicationRemoveRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[204] + mi := &file_vtctldata_proto_msgTypes[206] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12637,7 +12774,7 @@ func (x *ShardReplicationRemoveRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationRemoveRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationRemoveRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{204} + return file_vtctldata_proto_rawDescGZIP(), []int{206} } func (x *ShardReplicationRemoveRequest) GetKeyspace() string { @@ -12669,7 +12806,7 @@ type ShardReplicationRemoveResponse struct { func (x *ShardReplicationRemoveResponse) Reset() { *x = ShardReplicationRemoveResponse{} - mi := &file_vtctldata_proto_msgTypes[205] + mi := &file_vtctldata_proto_msgTypes[207] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12681,7 +12818,7 @@ func (x *ShardReplicationRemoveResponse) String() string { func (*ShardReplicationRemoveResponse) ProtoMessage() {} func (x *ShardReplicationRemoveResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[205] + mi := &file_vtctldata_proto_msgTypes[207] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12694,7 +12831,7 @@ func (x *ShardReplicationRemoveResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationRemoveResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationRemoveResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{205} + return file_vtctldata_proto_rawDescGZIP(), []int{207} } type SleepTabletRequest struct { @@ -12708,7 +12845,7 @@ type SleepTabletRequest struct { func (x *SleepTabletRequest) Reset() { *x = SleepTabletRequest{} - mi := &file_vtctldata_proto_msgTypes[206] + mi := &file_vtctldata_proto_msgTypes[208] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12720,7 +12857,7 @@ func (x *SleepTabletRequest) String() string { func (*SleepTabletRequest) ProtoMessage() {} func (x *SleepTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[206] + mi := &file_vtctldata_proto_msgTypes[208] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12733,7 +12870,7 @@ func (x *SleepTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SleepTabletRequest.ProtoReflect.Descriptor instead. func (*SleepTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{206} + return file_vtctldata_proto_rawDescGZIP(), []int{208} } func (x *SleepTabletRequest) GetTabletAlias() *topodata.TabletAlias { @@ -12758,7 +12895,7 @@ type SleepTabletResponse struct { func (x *SleepTabletResponse) Reset() { *x = SleepTabletResponse{} - mi := &file_vtctldata_proto_msgTypes[207] + mi := &file_vtctldata_proto_msgTypes[209] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12770,7 +12907,7 @@ func (x *SleepTabletResponse) String() string { func (*SleepTabletResponse) ProtoMessage() {} func (x *SleepTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[207] + mi := &file_vtctldata_proto_msgTypes[209] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12783,7 +12920,7 @@ func (x *SleepTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SleepTabletResponse.ProtoReflect.Descriptor instead. func (*SleepTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{207} + return file_vtctldata_proto_rawDescGZIP(), []int{209} } type SourceShardAddRequest struct { @@ -12806,7 +12943,7 @@ type SourceShardAddRequest struct { func (x *SourceShardAddRequest) Reset() { *x = SourceShardAddRequest{} - mi := &file_vtctldata_proto_msgTypes[208] + mi := &file_vtctldata_proto_msgTypes[210] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12818,7 +12955,7 @@ func (x *SourceShardAddRequest) String() string { func (*SourceShardAddRequest) ProtoMessage() {} func (x *SourceShardAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[208] + mi := &file_vtctldata_proto_msgTypes[210] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12831,7 +12968,7 @@ func (x *SourceShardAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardAddRequest.ProtoReflect.Descriptor instead. func (*SourceShardAddRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{208} + return file_vtctldata_proto_rawDescGZIP(), []int{210} } func (x *SourceShardAddRequest) GetKeyspace() string { @@ -12894,7 +13031,7 @@ type SourceShardAddResponse struct { func (x *SourceShardAddResponse) Reset() { *x = SourceShardAddResponse{} - mi := &file_vtctldata_proto_msgTypes[209] + mi := &file_vtctldata_proto_msgTypes[211] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12906,7 +13043,7 @@ func (x *SourceShardAddResponse) String() string { func (*SourceShardAddResponse) ProtoMessage() {} func (x *SourceShardAddResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[209] + mi := &file_vtctldata_proto_msgTypes[211] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12919,7 +13056,7 @@ func (x *SourceShardAddResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardAddResponse.ProtoReflect.Descriptor instead. func (*SourceShardAddResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{209} + return file_vtctldata_proto_rawDescGZIP(), []int{211} } func (x *SourceShardAddResponse) GetShard() *topodata.Shard { @@ -12941,7 +13078,7 @@ type SourceShardDeleteRequest struct { func (x *SourceShardDeleteRequest) Reset() { *x = SourceShardDeleteRequest{} - mi := &file_vtctldata_proto_msgTypes[210] + mi := &file_vtctldata_proto_msgTypes[212] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12953,7 +13090,7 @@ func (x *SourceShardDeleteRequest) String() string { func (*SourceShardDeleteRequest) ProtoMessage() {} func (x *SourceShardDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[210] + mi := &file_vtctldata_proto_msgTypes[212] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12966,7 +13103,7 @@ func (x *SourceShardDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardDeleteRequest.ProtoReflect.Descriptor instead. func (*SourceShardDeleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{210} + return file_vtctldata_proto_rawDescGZIP(), []int{212} } func (x *SourceShardDeleteRequest) GetKeyspace() string { @@ -13001,7 +13138,7 @@ type SourceShardDeleteResponse struct { func (x *SourceShardDeleteResponse) Reset() { *x = SourceShardDeleteResponse{} - mi := &file_vtctldata_proto_msgTypes[211] + mi := &file_vtctldata_proto_msgTypes[213] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13013,7 +13150,7 @@ func (x *SourceShardDeleteResponse) String() string { func (*SourceShardDeleteResponse) ProtoMessage() {} func (x *SourceShardDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[211] + mi := &file_vtctldata_proto_msgTypes[213] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13026,7 +13163,7 @@ func (x *SourceShardDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardDeleteResponse.ProtoReflect.Descriptor instead. func (*SourceShardDeleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{211} + return file_vtctldata_proto_rawDescGZIP(), []int{213} } func (x *SourceShardDeleteResponse) GetShard() *topodata.Shard { @@ -13046,7 +13183,7 @@ type StartReplicationRequest struct { func (x *StartReplicationRequest) Reset() { *x = StartReplicationRequest{} - mi := &file_vtctldata_proto_msgTypes[212] + mi := &file_vtctldata_proto_msgTypes[214] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13058,7 +13195,7 @@ func (x *StartReplicationRequest) String() string { func (*StartReplicationRequest) ProtoMessage() {} func (x *StartReplicationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[212] + mi := &file_vtctldata_proto_msgTypes[214] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13071,7 +13208,7 @@ func (x *StartReplicationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StartReplicationRequest.ProtoReflect.Descriptor instead. func (*StartReplicationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{212} + return file_vtctldata_proto_rawDescGZIP(), []int{214} } func (x *StartReplicationRequest) GetTabletAlias() *topodata.TabletAlias { @@ -13089,7 +13226,7 @@ type StartReplicationResponse struct { func (x *StartReplicationResponse) Reset() { *x = StartReplicationResponse{} - mi := &file_vtctldata_proto_msgTypes[213] + mi := &file_vtctldata_proto_msgTypes[215] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13101,7 +13238,7 @@ func (x *StartReplicationResponse) String() string { func (*StartReplicationResponse) ProtoMessage() {} func (x *StartReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[213] + mi := &file_vtctldata_proto_msgTypes[215] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13114,7 +13251,7 @@ func (x *StartReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StartReplicationResponse.ProtoReflect.Descriptor instead. func (*StartReplicationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{213} + return file_vtctldata_proto_rawDescGZIP(), []int{215} } type StopReplicationRequest struct { @@ -13127,7 +13264,7 @@ type StopReplicationRequest struct { func (x *StopReplicationRequest) Reset() { *x = StopReplicationRequest{} - mi := &file_vtctldata_proto_msgTypes[214] + mi := &file_vtctldata_proto_msgTypes[216] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13139,7 +13276,7 @@ func (x *StopReplicationRequest) String() string { func (*StopReplicationRequest) ProtoMessage() {} func (x *StopReplicationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[214] + mi := &file_vtctldata_proto_msgTypes[216] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13152,7 +13289,7 @@ func (x *StopReplicationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StopReplicationRequest.ProtoReflect.Descriptor instead. func (*StopReplicationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{214} + return file_vtctldata_proto_rawDescGZIP(), []int{216} } func (x *StopReplicationRequest) GetTabletAlias() *topodata.TabletAlias { @@ -13170,7 +13307,7 @@ type StopReplicationResponse struct { func (x *StopReplicationResponse) Reset() { *x = StopReplicationResponse{} - mi := &file_vtctldata_proto_msgTypes[215] + mi := &file_vtctldata_proto_msgTypes[217] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13182,7 +13319,7 @@ func (x *StopReplicationResponse) String() string { func (*StopReplicationResponse) ProtoMessage() {} func (x *StopReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[215] + mi := &file_vtctldata_proto_msgTypes[217] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13195,7 +13332,7 @@ func (x *StopReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StopReplicationResponse.ProtoReflect.Descriptor instead. func (*StopReplicationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{215} + return file_vtctldata_proto_rawDescGZIP(), []int{217} } type TabletExternallyReparentedRequest struct { @@ -13210,7 +13347,7 @@ type TabletExternallyReparentedRequest struct { func (x *TabletExternallyReparentedRequest) Reset() { *x = TabletExternallyReparentedRequest{} - mi := &file_vtctldata_proto_msgTypes[216] + mi := &file_vtctldata_proto_msgTypes[218] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13222,7 +13359,7 @@ func (x *TabletExternallyReparentedRequest) String() string { func (*TabletExternallyReparentedRequest) ProtoMessage() {} func (x *TabletExternallyReparentedRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[216] + mi := &file_vtctldata_proto_msgTypes[218] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13235,7 +13372,7 @@ func (x *TabletExternallyReparentedRequest) ProtoReflect() protoreflect.Message // Deprecated: Use TabletExternallyReparentedRequest.ProtoReflect.Descriptor instead. func (*TabletExternallyReparentedRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{216} + return file_vtctldata_proto_rawDescGZIP(), []int{218} } func (x *TabletExternallyReparentedRequest) GetTablet() *topodata.TabletAlias { @@ -13258,7 +13395,7 @@ type TabletExternallyReparentedResponse struct { func (x *TabletExternallyReparentedResponse) Reset() { *x = TabletExternallyReparentedResponse{} - mi := &file_vtctldata_proto_msgTypes[217] + mi := &file_vtctldata_proto_msgTypes[219] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13270,7 +13407,7 @@ func (x *TabletExternallyReparentedResponse) String() string { func (*TabletExternallyReparentedResponse) ProtoMessage() {} func (x *TabletExternallyReparentedResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[217] + mi := &file_vtctldata_proto_msgTypes[219] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13283,7 +13420,7 @@ func (x *TabletExternallyReparentedResponse) ProtoReflect() protoreflect.Message // Deprecated: Use TabletExternallyReparentedResponse.ProtoReflect.Descriptor instead. func (*TabletExternallyReparentedResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{217} + return file_vtctldata_proto_rawDescGZIP(), []int{219} } func (x *TabletExternallyReparentedResponse) GetKeyspace() string { @@ -13325,7 +13462,7 @@ type UpdateCellInfoRequest struct { func (x *UpdateCellInfoRequest) Reset() { *x = UpdateCellInfoRequest{} - mi := &file_vtctldata_proto_msgTypes[218] + mi := &file_vtctldata_proto_msgTypes[220] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13337,7 +13474,7 @@ func (x *UpdateCellInfoRequest) String() string { func (*UpdateCellInfoRequest) ProtoMessage() {} func (x *UpdateCellInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[218] + mi := &file_vtctldata_proto_msgTypes[220] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13350,7 +13487,7 @@ func (x *UpdateCellInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellInfoRequest.ProtoReflect.Descriptor instead. func (*UpdateCellInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{218} + return file_vtctldata_proto_rawDescGZIP(), []int{220} } func (x *UpdateCellInfoRequest) GetName() string { @@ -13378,7 +13515,7 @@ type UpdateCellInfoResponse struct { func (x *UpdateCellInfoResponse) Reset() { *x = UpdateCellInfoResponse{} - mi := &file_vtctldata_proto_msgTypes[219] + mi := &file_vtctldata_proto_msgTypes[221] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13390,7 +13527,7 @@ func (x *UpdateCellInfoResponse) String() string { func (*UpdateCellInfoResponse) ProtoMessage() {} func (x *UpdateCellInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[219] + mi := &file_vtctldata_proto_msgTypes[221] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13403,7 +13540,7 @@ func (x *UpdateCellInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellInfoResponse.ProtoReflect.Descriptor instead. func (*UpdateCellInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{219} + return file_vtctldata_proto_rawDescGZIP(), []int{221} } func (x *UpdateCellInfoResponse) GetName() string { @@ -13431,7 +13568,7 @@ type UpdateCellsAliasRequest struct { func (x *UpdateCellsAliasRequest) Reset() { *x = UpdateCellsAliasRequest{} - mi := &file_vtctldata_proto_msgTypes[220] + mi := &file_vtctldata_proto_msgTypes[222] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13443,7 +13580,7 @@ func (x *UpdateCellsAliasRequest) String() string { func (*UpdateCellsAliasRequest) ProtoMessage() {} func (x *UpdateCellsAliasRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[220] + mi := &file_vtctldata_proto_msgTypes[222] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13456,7 +13593,7 @@ func (x *UpdateCellsAliasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellsAliasRequest.ProtoReflect.Descriptor instead. func (*UpdateCellsAliasRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{220} + return file_vtctldata_proto_rawDescGZIP(), []int{222} } func (x *UpdateCellsAliasRequest) GetName() string { @@ -13484,7 +13621,7 @@ type UpdateCellsAliasResponse struct { func (x *UpdateCellsAliasResponse) Reset() { *x = UpdateCellsAliasResponse{} - mi := &file_vtctldata_proto_msgTypes[221] + mi := &file_vtctldata_proto_msgTypes[223] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13496,7 +13633,7 @@ func (x *UpdateCellsAliasResponse) String() string { func (*UpdateCellsAliasResponse) ProtoMessage() {} func (x *UpdateCellsAliasResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[221] + mi := &file_vtctldata_proto_msgTypes[223] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13509,7 +13646,7 @@ func (x *UpdateCellsAliasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellsAliasResponse.ProtoReflect.Descriptor instead. func (*UpdateCellsAliasResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{221} + return file_vtctldata_proto_rawDescGZIP(), []int{223} } func (x *UpdateCellsAliasResponse) GetName() string { @@ -13536,7 +13673,7 @@ type ValidateRequest struct { func (x *ValidateRequest) Reset() { *x = ValidateRequest{} - mi := &file_vtctldata_proto_msgTypes[222] + mi := &file_vtctldata_proto_msgTypes[224] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13548,7 +13685,7 @@ func (x *ValidateRequest) String() string { func (*ValidateRequest) ProtoMessage() {} func (x *ValidateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[222] + mi := &file_vtctldata_proto_msgTypes[224] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13561,7 +13698,7 @@ func (x *ValidateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateRequest.ProtoReflect.Descriptor instead. func (*ValidateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{222} + return file_vtctldata_proto_rawDescGZIP(), []int{224} } func (x *ValidateRequest) GetPingTablets() bool { @@ -13582,7 +13719,7 @@ type ValidateResponse struct { func (x *ValidateResponse) Reset() { *x = ValidateResponse{} - mi := &file_vtctldata_proto_msgTypes[223] + mi := &file_vtctldata_proto_msgTypes[225] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13594,7 +13731,7 @@ func (x *ValidateResponse) String() string { func (*ValidateResponse) ProtoMessage() {} func (x *ValidateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[223] + mi := &file_vtctldata_proto_msgTypes[225] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13607,7 +13744,7 @@ func (x *ValidateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateResponse.ProtoReflect.Descriptor instead. func (*ValidateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{223} + return file_vtctldata_proto_rawDescGZIP(), []int{225} } func (x *ValidateResponse) GetResults() []string { @@ -13635,7 +13772,7 @@ type ValidateKeyspaceRequest struct { func (x *ValidateKeyspaceRequest) Reset() { *x = ValidateKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[224] + mi := &file_vtctldata_proto_msgTypes[226] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13647,7 +13784,7 @@ func (x *ValidateKeyspaceRequest) String() string { func (*ValidateKeyspaceRequest) ProtoMessage() {} func (x *ValidateKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[224] + mi := &file_vtctldata_proto_msgTypes[226] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13660,7 +13797,7 @@ func (x *ValidateKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ValidateKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{224} + return file_vtctldata_proto_rawDescGZIP(), []int{226} } func (x *ValidateKeyspaceRequest) GetKeyspace() string { @@ -13688,7 +13825,7 @@ type ValidateKeyspaceResponse struct { func (x *ValidateKeyspaceResponse) Reset() { *x = ValidateKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[225] + mi := &file_vtctldata_proto_msgTypes[227] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13700,7 +13837,7 @@ func (x *ValidateKeyspaceResponse) String() string { func (*ValidateKeyspaceResponse) ProtoMessage() {} func (x *ValidateKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[225] + mi := &file_vtctldata_proto_msgTypes[227] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13713,7 +13850,7 @@ func (x *ValidateKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ValidateKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{225} + return file_vtctldata_proto_rawDescGZIP(), []int{227} } func (x *ValidateKeyspaceResponse) GetResults() []string { @@ -13730,33 +13867,32 @@ func (x *ValidateKeyspaceResponse) GetResultsByShard() map[string]*ValidateShard return nil } -type ValidateSchemaKeyspaceRequest struct { +type ValidatePermissionsKeyspaceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Keyspace string `protobuf:"bytes,1,opt,name=keyspace,proto3" json:"keyspace,omitempty"` - ExcludeTables []string `protobuf:"bytes,2,rep,name=exclude_tables,json=excludeTables,proto3" json:"exclude_tables,omitempty"` - IncludeViews bool `protobuf:"varint,3,opt,name=include_views,json=includeViews,proto3" json:"include_views,omitempty"` - SkipNoPrimary bool `protobuf:"varint,4,opt,name=skip_no_primary,json=skipNoPrimary,proto3" json:"skip_no_primary,omitempty"` - IncludeVschema bool `protobuf:"varint,5,opt,name=include_vschema,json=includeVschema,proto3" json:"include_vschema,omitempty"` + Keyspace string `protobuf:"bytes,1,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + // If you only want to validate a subset of the shards in the + // keyspace, then specify a list of shard names. + Shards []string `protobuf:"bytes,2,rep,name=shards,proto3" json:"shards,omitempty"` } -func (x *ValidateSchemaKeyspaceRequest) Reset() { - *x = ValidateSchemaKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[226] +func (x *ValidatePermissionsKeyspaceRequest) Reset() { + *x = ValidatePermissionsKeyspaceRequest{} + mi := &file_vtctldata_proto_msgTypes[228] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ValidateSchemaKeyspaceRequest) String() string { +func (x *ValidatePermissionsKeyspaceRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ValidateSchemaKeyspaceRequest) ProtoMessage() {} +func (*ValidatePermissionsKeyspaceRequest) ProtoMessage() {} -func (x *ValidateSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[226] +func (x *ValidatePermissionsKeyspaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[228] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13767,58 +13903,160 @@ func (x *ValidateSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ValidateSchemaKeyspaceRequest.ProtoReflect.Descriptor instead. -func (*ValidateSchemaKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{226} +// Deprecated: Use ValidatePermissionsKeyspaceRequest.ProtoReflect.Descriptor instead. +func (*ValidatePermissionsKeyspaceRequest) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{228} } -func (x *ValidateSchemaKeyspaceRequest) GetKeyspace() string { +func (x *ValidatePermissionsKeyspaceRequest) GetKeyspace() string { if x != nil { return x.Keyspace } return "" } -func (x *ValidateSchemaKeyspaceRequest) GetExcludeTables() []string { +func (x *ValidatePermissionsKeyspaceRequest) GetShards() []string { if x != nil { - return x.ExcludeTables + return x.Shards } return nil } -func (x *ValidateSchemaKeyspaceRequest) GetIncludeViews() bool { - if x != nil { - return x.IncludeViews - } - return false +type ValidatePermissionsKeyspaceResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (x *ValidateSchemaKeyspaceRequest) GetSkipNoPrimary() bool { - if x != nil { - return x.SkipNoPrimary - } - return false +func (x *ValidatePermissionsKeyspaceResponse) Reset() { + *x = ValidatePermissionsKeyspaceResponse{} + mi := &file_vtctldata_proto_msgTypes[229] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *ValidateSchemaKeyspaceRequest) GetIncludeVschema() bool { - if x != nil { - return x.IncludeVschema - } - return false +func (x *ValidatePermissionsKeyspaceResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -type ValidateSchemaKeyspaceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (*ValidatePermissionsKeyspaceResponse) ProtoMessage() {} - Results []string `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` +func (x *ValidatePermissionsKeyspaceResponse) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[229] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePermissionsKeyspaceResponse.ProtoReflect.Descriptor instead. +func (*ValidatePermissionsKeyspaceResponse) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{229} +} + +type ValidateSchemaKeyspaceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Keyspace string `protobuf:"bytes,1,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + ExcludeTables []string `protobuf:"bytes,2,rep,name=exclude_tables,json=excludeTables,proto3" json:"exclude_tables,omitempty"` + IncludeViews bool `protobuf:"varint,3,opt,name=include_views,json=includeViews,proto3" json:"include_views,omitempty"` + SkipNoPrimary bool `protobuf:"varint,4,opt,name=skip_no_primary,json=skipNoPrimary,proto3" json:"skip_no_primary,omitempty"` + IncludeVschema bool `protobuf:"varint,5,opt,name=include_vschema,json=includeVschema,proto3" json:"include_vschema,omitempty"` + // If you only want to validate a subset of the shards in the + // keyspace, then specify a list of shard names. + Shards []string `protobuf:"bytes,6,rep,name=shards,proto3" json:"shards,omitempty"` +} + +func (x *ValidateSchemaKeyspaceRequest) Reset() { + *x = ValidateSchemaKeyspaceRequest{} + mi := &file_vtctldata_proto_msgTypes[230] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidateSchemaKeyspaceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateSchemaKeyspaceRequest) ProtoMessage() {} + +func (x *ValidateSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[230] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateSchemaKeyspaceRequest.ProtoReflect.Descriptor instead. +func (*ValidateSchemaKeyspaceRequest) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{230} +} + +func (x *ValidateSchemaKeyspaceRequest) GetKeyspace() string { + if x != nil { + return x.Keyspace + } + return "" +} + +func (x *ValidateSchemaKeyspaceRequest) GetExcludeTables() []string { + if x != nil { + return x.ExcludeTables + } + return nil +} + +func (x *ValidateSchemaKeyspaceRequest) GetIncludeViews() bool { + if x != nil { + return x.IncludeViews + } + return false +} + +func (x *ValidateSchemaKeyspaceRequest) GetSkipNoPrimary() bool { + if x != nil { + return x.SkipNoPrimary + } + return false +} + +func (x *ValidateSchemaKeyspaceRequest) GetIncludeVschema() bool { + if x != nil { + return x.IncludeVschema + } + return false +} + +func (x *ValidateSchemaKeyspaceRequest) GetShards() []string { + if x != nil { + return x.Shards + } + return nil +} + +type ValidateSchemaKeyspaceResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Results []string `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` ResultsByShard map[string]*ValidateShardResponse `protobuf:"bytes,2,rep,name=results_by_shard,json=resultsByShard,proto3" json:"results_by_shard,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *ValidateSchemaKeyspaceResponse) Reset() { *x = ValidateSchemaKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[227] + mi := &file_vtctldata_proto_msgTypes[231] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13830,7 +14068,7 @@ func (x *ValidateSchemaKeyspaceResponse) String() string { func (*ValidateSchemaKeyspaceResponse) ProtoMessage() {} func (x *ValidateSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[227] + mi := &file_vtctldata_proto_msgTypes[231] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13843,7 +14081,7 @@ func (x *ValidateSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSchemaKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ValidateSchemaKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{227} + return file_vtctldata_proto_rawDescGZIP(), []int{231} } func (x *ValidateSchemaKeyspaceResponse) GetResults() []string { @@ -13872,7 +14110,7 @@ type ValidateShardRequest struct { func (x *ValidateShardRequest) Reset() { *x = ValidateShardRequest{} - mi := &file_vtctldata_proto_msgTypes[228] + mi := &file_vtctldata_proto_msgTypes[232] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13884,7 +14122,7 @@ func (x *ValidateShardRequest) String() string { func (*ValidateShardRequest) ProtoMessage() {} func (x *ValidateShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[228] + mi := &file_vtctldata_proto_msgTypes[232] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13897,7 +14135,7 @@ func (x *ValidateShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateShardRequest.ProtoReflect.Descriptor instead. func (*ValidateShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{228} + return file_vtctldata_proto_rawDescGZIP(), []int{232} } func (x *ValidateShardRequest) GetKeyspace() string { @@ -13931,7 +14169,7 @@ type ValidateShardResponse struct { func (x *ValidateShardResponse) Reset() { *x = ValidateShardResponse{} - mi := &file_vtctldata_proto_msgTypes[229] + mi := &file_vtctldata_proto_msgTypes[233] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13943,7 +14181,7 @@ func (x *ValidateShardResponse) String() string { func (*ValidateShardResponse) ProtoMessage() {} func (x *ValidateShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[229] + mi := &file_vtctldata_proto_msgTypes[233] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13956,7 +14194,7 @@ func (x *ValidateShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateShardResponse.ProtoReflect.Descriptor instead. func (*ValidateShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{229} + return file_vtctldata_proto_rawDescGZIP(), []int{233} } func (x *ValidateShardResponse) GetResults() []string { @@ -13976,7 +14214,7 @@ type ValidateVersionKeyspaceRequest struct { func (x *ValidateVersionKeyspaceRequest) Reset() { *x = ValidateVersionKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[230] + mi := &file_vtctldata_proto_msgTypes[234] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13988,7 +14226,7 @@ func (x *ValidateVersionKeyspaceRequest) String() string { func (*ValidateVersionKeyspaceRequest) ProtoMessage() {} func (x *ValidateVersionKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[230] + mi := &file_vtctldata_proto_msgTypes[234] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14001,7 +14239,7 @@ func (x *ValidateVersionKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ValidateVersionKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{230} + return file_vtctldata_proto_rawDescGZIP(), []int{234} } func (x *ValidateVersionKeyspaceRequest) GetKeyspace() string { @@ -14022,7 +14260,7 @@ type ValidateVersionKeyspaceResponse struct { func (x *ValidateVersionKeyspaceResponse) Reset() { *x = ValidateVersionKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[231] + mi := &file_vtctldata_proto_msgTypes[235] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14034,7 +14272,7 @@ func (x *ValidateVersionKeyspaceResponse) String() string { func (*ValidateVersionKeyspaceResponse) ProtoMessage() {} func (x *ValidateVersionKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[231] + mi := &file_vtctldata_proto_msgTypes[235] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14047,7 +14285,7 @@ func (x *ValidateVersionKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ValidateVersionKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{231} + return file_vtctldata_proto_rawDescGZIP(), []int{235} } func (x *ValidateVersionKeyspaceResponse) GetResults() []string { @@ -14075,7 +14313,7 @@ type ValidateVersionShardRequest struct { func (x *ValidateVersionShardRequest) Reset() { *x = ValidateVersionShardRequest{} - mi := &file_vtctldata_proto_msgTypes[232] + mi := &file_vtctldata_proto_msgTypes[236] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14087,7 +14325,7 @@ func (x *ValidateVersionShardRequest) String() string { func (*ValidateVersionShardRequest) ProtoMessage() {} func (x *ValidateVersionShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[232] + mi := &file_vtctldata_proto_msgTypes[236] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14100,7 +14338,7 @@ func (x *ValidateVersionShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionShardRequest.ProtoReflect.Descriptor instead. func (*ValidateVersionShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{232} + return file_vtctldata_proto_rawDescGZIP(), []int{236} } func (x *ValidateVersionShardRequest) GetKeyspace() string { @@ -14127,7 +14365,7 @@ type ValidateVersionShardResponse struct { func (x *ValidateVersionShardResponse) Reset() { *x = ValidateVersionShardResponse{} - mi := &file_vtctldata_proto_msgTypes[233] + mi := &file_vtctldata_proto_msgTypes[237] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14139,7 +14377,7 @@ func (x *ValidateVersionShardResponse) String() string { func (*ValidateVersionShardResponse) ProtoMessage() {} func (x *ValidateVersionShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[233] + mi := &file_vtctldata_proto_msgTypes[237] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14152,7 +14390,7 @@ func (x *ValidateVersionShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionShardResponse.ProtoReflect.Descriptor instead. func (*ValidateVersionShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{233} + return file_vtctldata_proto_rawDescGZIP(), []int{237} } func (x *ValidateVersionShardResponse) GetResults() []string { @@ -14175,7 +14413,7 @@ type ValidateVSchemaRequest struct { func (x *ValidateVSchemaRequest) Reset() { *x = ValidateVSchemaRequest{} - mi := &file_vtctldata_proto_msgTypes[234] + mi := &file_vtctldata_proto_msgTypes[238] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14187,7 +14425,7 @@ func (x *ValidateVSchemaRequest) String() string { func (*ValidateVSchemaRequest) ProtoMessage() {} func (x *ValidateVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[234] + mi := &file_vtctldata_proto_msgTypes[238] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14200,7 +14438,7 @@ func (x *ValidateVSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVSchemaRequest.ProtoReflect.Descriptor instead. func (*ValidateVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{234} + return file_vtctldata_proto_rawDescGZIP(), []int{238} } func (x *ValidateVSchemaRequest) GetKeyspace() string { @@ -14242,7 +14480,7 @@ type ValidateVSchemaResponse struct { func (x *ValidateVSchemaResponse) Reset() { *x = ValidateVSchemaResponse{} - mi := &file_vtctldata_proto_msgTypes[235] + mi := &file_vtctldata_proto_msgTypes[239] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14254,7 +14492,7 @@ func (x *ValidateVSchemaResponse) String() string { func (*ValidateVSchemaResponse) ProtoMessage() {} func (x *ValidateVSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[235] + mi := &file_vtctldata_proto_msgTypes[239] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14267,7 +14505,7 @@ func (x *ValidateVSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVSchemaResponse.ProtoReflect.Descriptor instead. func (*ValidateVSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{235} + return file_vtctldata_proto_rawDescGZIP(), []int{239} } func (x *ValidateVSchemaResponse) GetResults() []string { @@ -14373,7 +14611,7 @@ type VDiffCreateRequest struct { func (x *VDiffCreateRequest) Reset() { *x = VDiffCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[236] + mi := &file_vtctldata_proto_msgTypes[240] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14385,7 +14623,7 @@ func (x *VDiffCreateRequest) String() string { func (*VDiffCreateRequest) ProtoMessage() {} func (x *VDiffCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[236] + mi := &file_vtctldata_proto_msgTypes[240] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14398,7 +14636,7 @@ func (x *VDiffCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffCreateRequest.ProtoReflect.Descriptor instead. func (*VDiffCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{236} + return file_vtctldata_proto_rawDescGZIP(), []int{240} } func (x *VDiffCreateRequest) GetWorkflow() string { @@ -14567,7 +14805,7 @@ type VDiffCreateResponse struct { func (x *VDiffCreateResponse) Reset() { *x = VDiffCreateResponse{} - mi := &file_vtctldata_proto_msgTypes[237] + mi := &file_vtctldata_proto_msgTypes[241] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14579,7 +14817,7 @@ func (x *VDiffCreateResponse) String() string { func (*VDiffCreateResponse) ProtoMessage() {} func (x *VDiffCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[237] + mi := &file_vtctldata_proto_msgTypes[241] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14592,7 +14830,7 @@ func (x *VDiffCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffCreateResponse.ProtoReflect.Descriptor instead. func (*VDiffCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{237} + return file_vtctldata_proto_rawDescGZIP(), []int{241} } func (x *VDiffCreateResponse) GetUUID() string { @@ -14615,7 +14853,7 @@ type VDiffDeleteRequest struct { func (x *VDiffDeleteRequest) Reset() { *x = VDiffDeleteRequest{} - mi := &file_vtctldata_proto_msgTypes[238] + mi := &file_vtctldata_proto_msgTypes[242] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14627,7 +14865,7 @@ func (x *VDiffDeleteRequest) String() string { func (*VDiffDeleteRequest) ProtoMessage() {} func (x *VDiffDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[238] + mi := &file_vtctldata_proto_msgTypes[242] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14640,7 +14878,7 @@ func (x *VDiffDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffDeleteRequest.ProtoReflect.Descriptor instead. func (*VDiffDeleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{238} + return file_vtctldata_proto_rawDescGZIP(), []int{242} } func (x *VDiffDeleteRequest) GetWorkflow() string { @@ -14672,7 +14910,7 @@ type VDiffDeleteResponse struct { func (x *VDiffDeleteResponse) Reset() { *x = VDiffDeleteResponse{} - mi := &file_vtctldata_proto_msgTypes[239] + mi := &file_vtctldata_proto_msgTypes[243] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14684,7 +14922,7 @@ func (x *VDiffDeleteResponse) String() string { func (*VDiffDeleteResponse) ProtoMessage() {} func (x *VDiffDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[239] + mi := &file_vtctldata_proto_msgTypes[243] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14697,7 +14935,7 @@ func (x *VDiffDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffDeleteResponse.ProtoReflect.Descriptor instead. func (*VDiffDeleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{239} + return file_vtctldata_proto_rawDescGZIP(), []int{243} } type VDiffResumeRequest struct { @@ -14713,7 +14951,7 @@ type VDiffResumeRequest struct { func (x *VDiffResumeRequest) Reset() { *x = VDiffResumeRequest{} - mi := &file_vtctldata_proto_msgTypes[240] + mi := &file_vtctldata_proto_msgTypes[244] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14725,7 +14963,7 @@ func (x *VDiffResumeRequest) String() string { func (*VDiffResumeRequest) ProtoMessage() {} func (x *VDiffResumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[240] + mi := &file_vtctldata_proto_msgTypes[244] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14738,7 +14976,7 @@ func (x *VDiffResumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffResumeRequest.ProtoReflect.Descriptor instead. func (*VDiffResumeRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{240} + return file_vtctldata_proto_rawDescGZIP(), []int{244} } func (x *VDiffResumeRequest) GetWorkflow() string { @@ -14777,7 +15015,7 @@ type VDiffResumeResponse struct { func (x *VDiffResumeResponse) Reset() { *x = VDiffResumeResponse{} - mi := &file_vtctldata_proto_msgTypes[241] + mi := &file_vtctldata_proto_msgTypes[245] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14789,7 +15027,7 @@ func (x *VDiffResumeResponse) String() string { func (*VDiffResumeResponse) ProtoMessage() {} func (x *VDiffResumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[241] + mi := &file_vtctldata_proto_msgTypes[245] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14802,7 +15040,7 @@ func (x *VDiffResumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffResumeResponse.ProtoReflect.Descriptor instead. func (*VDiffResumeResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{241} + return file_vtctldata_proto_rawDescGZIP(), []int{245} } type VDiffShowRequest struct { @@ -14818,7 +15056,7 @@ type VDiffShowRequest struct { func (x *VDiffShowRequest) Reset() { *x = VDiffShowRequest{} - mi := &file_vtctldata_proto_msgTypes[242] + mi := &file_vtctldata_proto_msgTypes[246] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14830,7 +15068,7 @@ func (x *VDiffShowRequest) String() string { func (*VDiffShowRequest) ProtoMessage() {} func (x *VDiffShowRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[242] + mi := &file_vtctldata_proto_msgTypes[246] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14843,7 +15081,7 @@ func (x *VDiffShowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffShowRequest.ProtoReflect.Descriptor instead. func (*VDiffShowRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{242} + return file_vtctldata_proto_rawDescGZIP(), []int{246} } func (x *VDiffShowRequest) GetWorkflow() string { @@ -14878,7 +15116,7 @@ type VDiffShowResponse struct { func (x *VDiffShowResponse) Reset() { *x = VDiffShowResponse{} - mi := &file_vtctldata_proto_msgTypes[243] + mi := &file_vtctldata_proto_msgTypes[247] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14890,7 +15128,7 @@ func (x *VDiffShowResponse) String() string { func (*VDiffShowResponse) ProtoMessage() {} func (x *VDiffShowResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[243] + mi := &file_vtctldata_proto_msgTypes[247] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14903,7 +15141,7 @@ func (x *VDiffShowResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffShowResponse.ProtoReflect.Descriptor instead. func (*VDiffShowResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{243} + return file_vtctldata_proto_rawDescGZIP(), []int{247} } func (x *VDiffShowResponse) GetTabletResponses() map[string]*tabletmanagerdata.VDiffResponse { @@ -14926,7 +15164,7 @@ type VDiffStopRequest struct { func (x *VDiffStopRequest) Reset() { *x = VDiffStopRequest{} - mi := &file_vtctldata_proto_msgTypes[244] + mi := &file_vtctldata_proto_msgTypes[248] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14938,7 +15176,7 @@ func (x *VDiffStopRequest) String() string { func (*VDiffStopRequest) ProtoMessage() {} func (x *VDiffStopRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[244] + mi := &file_vtctldata_proto_msgTypes[248] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14951,7 +15189,7 @@ func (x *VDiffStopRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffStopRequest.ProtoReflect.Descriptor instead. func (*VDiffStopRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{244} + return file_vtctldata_proto_rawDescGZIP(), []int{248} } func (x *VDiffStopRequest) GetWorkflow() string { @@ -14990,7 +15228,7 @@ type VDiffStopResponse struct { func (x *VDiffStopResponse) Reset() { *x = VDiffStopResponse{} - mi := &file_vtctldata_proto_msgTypes[245] + mi := &file_vtctldata_proto_msgTypes[249] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15002,7 +15240,7 @@ func (x *VDiffStopResponse) String() string { func (*VDiffStopResponse) ProtoMessage() {} func (x *VDiffStopResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[245] + mi := &file_vtctldata_proto_msgTypes[249] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15015,7 +15253,7 @@ func (x *VDiffStopResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffStopResponse.ProtoReflect.Descriptor instead. func (*VDiffStopResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{245} + return file_vtctldata_proto_rawDescGZIP(), []int{249} } type WorkflowDeleteRequest struct { @@ -15036,7 +15274,7 @@ type WorkflowDeleteRequest struct { func (x *WorkflowDeleteRequest) Reset() { *x = WorkflowDeleteRequest{} - mi := &file_vtctldata_proto_msgTypes[246] + mi := &file_vtctldata_proto_msgTypes[250] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15048,7 +15286,7 @@ func (x *WorkflowDeleteRequest) String() string { func (*WorkflowDeleteRequest) ProtoMessage() {} func (x *WorkflowDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[246] + mi := &file_vtctldata_proto_msgTypes[250] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15061,7 +15299,7 @@ func (x *WorkflowDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowDeleteRequest.ProtoReflect.Descriptor instead. func (*WorkflowDeleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{246} + return file_vtctldata_proto_rawDescGZIP(), []int{250} } func (x *WorkflowDeleteRequest) GetKeyspace() string { @@ -15117,7 +15355,7 @@ type WorkflowDeleteResponse struct { func (x *WorkflowDeleteResponse) Reset() { *x = WorkflowDeleteResponse{} - mi := &file_vtctldata_proto_msgTypes[247] + mi := &file_vtctldata_proto_msgTypes[251] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15129,7 +15367,7 @@ func (x *WorkflowDeleteResponse) String() string { func (*WorkflowDeleteResponse) ProtoMessage() {} func (x *WorkflowDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[247] + mi := &file_vtctldata_proto_msgTypes[251] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15142,7 +15380,7 @@ func (x *WorkflowDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowDeleteResponse.ProtoReflect.Descriptor instead. func (*WorkflowDeleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{247} + return file_vtctldata_proto_rawDescGZIP(), []int{251} } func (x *WorkflowDeleteResponse) GetSummary() string { @@ -15171,7 +15409,7 @@ type WorkflowStatusRequest struct { func (x *WorkflowStatusRequest) Reset() { *x = WorkflowStatusRequest{} - mi := &file_vtctldata_proto_msgTypes[248] + mi := &file_vtctldata_proto_msgTypes[252] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15183,7 +15421,7 @@ func (x *WorkflowStatusRequest) String() string { func (*WorkflowStatusRequest) ProtoMessage() {} func (x *WorkflowStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[248] + mi := &file_vtctldata_proto_msgTypes[252] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15196,7 +15434,7 @@ func (x *WorkflowStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowStatusRequest.ProtoReflect.Descriptor instead. func (*WorkflowStatusRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{248} + return file_vtctldata_proto_rawDescGZIP(), []int{252} } func (x *WorkflowStatusRequest) GetKeyspace() string { @@ -15233,7 +15471,7 @@ type WorkflowStatusResponse struct { func (x *WorkflowStatusResponse) Reset() { *x = WorkflowStatusResponse{} - mi := &file_vtctldata_proto_msgTypes[249] + mi := &file_vtctldata_proto_msgTypes[253] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15245,7 +15483,7 @@ func (x *WorkflowStatusResponse) String() string { func (*WorkflowStatusResponse) ProtoMessage() {} func (x *WorkflowStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[249] + mi := &file_vtctldata_proto_msgTypes[253] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15258,7 +15496,7 @@ func (x *WorkflowStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowStatusResponse.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{249} + return file_vtctldata_proto_rawDescGZIP(), []int{253} } func (x *WorkflowStatusResponse) GetTableCopyState() map[string]*WorkflowStatusResponse_TableCopyState { @@ -15303,7 +15541,7 @@ type WorkflowSwitchTrafficRequest struct { func (x *WorkflowSwitchTrafficRequest) Reset() { *x = WorkflowSwitchTrafficRequest{} - mi := &file_vtctldata_proto_msgTypes[250] + mi := &file_vtctldata_proto_msgTypes[254] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15315,7 +15553,7 @@ func (x *WorkflowSwitchTrafficRequest) String() string { func (*WorkflowSwitchTrafficRequest) ProtoMessage() {} func (x *WorkflowSwitchTrafficRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[250] + mi := &file_vtctldata_proto_msgTypes[254] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15328,7 +15566,7 @@ func (x *WorkflowSwitchTrafficRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowSwitchTrafficRequest.ProtoReflect.Descriptor instead. func (*WorkflowSwitchTrafficRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{250} + return file_vtctldata_proto_rawDescGZIP(), []int{254} } func (x *WorkflowSwitchTrafficRequest) GetKeyspace() string { @@ -15428,7 +15666,7 @@ type WorkflowSwitchTrafficResponse struct { func (x *WorkflowSwitchTrafficResponse) Reset() { *x = WorkflowSwitchTrafficResponse{} - mi := &file_vtctldata_proto_msgTypes[251] + mi := &file_vtctldata_proto_msgTypes[255] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15440,7 +15678,7 @@ func (x *WorkflowSwitchTrafficResponse) String() string { func (*WorkflowSwitchTrafficResponse) ProtoMessage() {} func (x *WorkflowSwitchTrafficResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[251] + mi := &file_vtctldata_proto_msgTypes[255] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15453,7 +15691,7 @@ func (x *WorkflowSwitchTrafficResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowSwitchTrafficResponse.ProtoReflect.Descriptor instead. func (*WorkflowSwitchTrafficResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{251} + return file_vtctldata_proto_rawDescGZIP(), []int{255} } func (x *WorkflowSwitchTrafficResponse) GetSummary() string { @@ -15497,7 +15735,7 @@ type WorkflowUpdateRequest struct { func (x *WorkflowUpdateRequest) Reset() { *x = WorkflowUpdateRequest{} - mi := &file_vtctldata_proto_msgTypes[252] + mi := &file_vtctldata_proto_msgTypes[256] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15509,7 +15747,7 @@ func (x *WorkflowUpdateRequest) String() string { func (*WorkflowUpdateRequest) ProtoMessage() {} func (x *WorkflowUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[252] + mi := &file_vtctldata_proto_msgTypes[256] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15522,7 +15760,7 @@ func (x *WorkflowUpdateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowUpdateRequest.ProtoReflect.Descriptor instead. func (*WorkflowUpdateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{252} + return file_vtctldata_proto_rawDescGZIP(), []int{256} } func (x *WorkflowUpdateRequest) GetKeyspace() string { @@ -15550,7 +15788,7 @@ type WorkflowUpdateResponse struct { func (x *WorkflowUpdateResponse) Reset() { *x = WorkflowUpdateResponse{} - mi := &file_vtctldata_proto_msgTypes[253] + mi := &file_vtctldata_proto_msgTypes[257] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15562,7 +15800,7 @@ func (x *WorkflowUpdateResponse) String() string { func (*WorkflowUpdateResponse) ProtoMessage() {} func (x *WorkflowUpdateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[253] + mi := &file_vtctldata_proto_msgTypes[257] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15575,7 +15813,7 @@ func (x *WorkflowUpdateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowUpdateResponse.ProtoReflect.Descriptor instead. func (*WorkflowUpdateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{253} + return file_vtctldata_proto_rawDescGZIP(), []int{257} } func (x *WorkflowUpdateResponse) GetSummary() string { @@ -15600,7 +15838,7 @@ type GetMirrorRulesRequest struct { func (x *GetMirrorRulesRequest) Reset() { *x = GetMirrorRulesRequest{} - mi := &file_vtctldata_proto_msgTypes[254] + mi := &file_vtctldata_proto_msgTypes[258] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15612,7 +15850,7 @@ func (x *GetMirrorRulesRequest) String() string { func (*GetMirrorRulesRequest) ProtoMessage() {} func (x *GetMirrorRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[254] + mi := &file_vtctldata_proto_msgTypes[258] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15625,7 +15863,7 @@ func (x *GetMirrorRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMirrorRulesRequest.ProtoReflect.Descriptor instead. func (*GetMirrorRulesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{254} + return file_vtctldata_proto_rawDescGZIP(), []int{258} } type GetMirrorRulesResponse struct { @@ -15638,7 +15876,7 @@ type GetMirrorRulesResponse struct { func (x *GetMirrorRulesResponse) Reset() { *x = GetMirrorRulesResponse{} - mi := &file_vtctldata_proto_msgTypes[255] + mi := &file_vtctldata_proto_msgTypes[259] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15650,7 +15888,7 @@ func (x *GetMirrorRulesResponse) String() string { func (*GetMirrorRulesResponse) ProtoMessage() {} func (x *GetMirrorRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[255] + mi := &file_vtctldata_proto_msgTypes[259] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15663,7 +15901,7 @@ func (x *GetMirrorRulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMirrorRulesResponse.ProtoReflect.Descriptor instead. func (*GetMirrorRulesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{255} + return file_vtctldata_proto_rawDescGZIP(), []int{259} } func (x *GetMirrorRulesResponse) GetMirrorRules() *vschema.MirrorRules { @@ -15686,7 +15924,7 @@ type WorkflowMirrorTrafficRequest struct { func (x *WorkflowMirrorTrafficRequest) Reset() { *x = WorkflowMirrorTrafficRequest{} - mi := &file_vtctldata_proto_msgTypes[256] + mi := &file_vtctldata_proto_msgTypes[260] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15698,7 +15936,7 @@ func (x *WorkflowMirrorTrafficRequest) String() string { func (*WorkflowMirrorTrafficRequest) ProtoMessage() {} func (x *WorkflowMirrorTrafficRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[256] + mi := &file_vtctldata_proto_msgTypes[260] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15711,7 +15949,7 @@ func (x *WorkflowMirrorTrafficRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowMirrorTrafficRequest.ProtoReflect.Descriptor instead. func (*WorkflowMirrorTrafficRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{256} + return file_vtctldata_proto_rawDescGZIP(), []int{260} } func (x *WorkflowMirrorTrafficRequest) GetKeyspace() string { @@ -15754,7 +15992,7 @@ type WorkflowMirrorTrafficResponse struct { func (x *WorkflowMirrorTrafficResponse) Reset() { *x = WorkflowMirrorTrafficResponse{} - mi := &file_vtctldata_proto_msgTypes[257] + mi := &file_vtctldata_proto_msgTypes[261] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15766,7 +16004,7 @@ func (x *WorkflowMirrorTrafficResponse) String() string { func (*WorkflowMirrorTrafficResponse) ProtoMessage() {} func (x *WorkflowMirrorTrafficResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[257] + mi := &file_vtctldata_proto_msgTypes[261] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15779,7 +16017,7 @@ func (x *WorkflowMirrorTrafficResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowMirrorTrafficResponse.ProtoReflect.Descriptor instead. func (*WorkflowMirrorTrafficResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{257} + return file_vtctldata_proto_rawDescGZIP(), []int{261} } func (x *WorkflowMirrorTrafficResponse) GetSummary() string { @@ -15814,7 +16052,7 @@ type Workflow_ReplicationLocation struct { func (x *Workflow_ReplicationLocation) Reset() { *x = Workflow_ReplicationLocation{} - mi := &file_vtctldata_proto_msgTypes[260] + mi := &file_vtctldata_proto_msgTypes[264] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15826,7 +16064,7 @@ func (x *Workflow_ReplicationLocation) String() string { func (*Workflow_ReplicationLocation) ProtoMessage() {} func (x *Workflow_ReplicationLocation) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[260] + mi := &file_vtctldata_proto_msgTypes[264] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15868,7 +16106,7 @@ type Workflow_ShardStream struct { func (x *Workflow_ShardStream) Reset() { *x = Workflow_ShardStream{} - mi := &file_vtctldata_proto_msgTypes[261] + mi := &file_vtctldata_proto_msgTypes[265] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15880,7 +16118,7 @@ func (x *Workflow_ShardStream) String() string { func (*Workflow_ShardStream) ProtoMessage() {} func (x *Workflow_ShardStream) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[261] + mi := &file_vtctldata_proto_msgTypes[265] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15954,7 +16192,7 @@ type Workflow_Stream struct { func (x *Workflow_Stream) Reset() { *x = Workflow_Stream{} - mi := &file_vtctldata_proto_msgTypes[262] + mi := &file_vtctldata_proto_msgTypes[266] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15966,7 +16204,7 @@ func (x *Workflow_Stream) String() string { func (*Workflow_Stream) ProtoMessage() {} func (x *Workflow_Stream) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[262] + mi := &file_vtctldata_proto_msgTypes[266] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16134,7 +16372,7 @@ type Workflow_Stream_CopyState struct { func (x *Workflow_Stream_CopyState) Reset() { *x = Workflow_Stream_CopyState{} - mi := &file_vtctldata_proto_msgTypes[263] + mi := &file_vtctldata_proto_msgTypes[267] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16146,7 +16384,7 @@ func (x *Workflow_Stream_CopyState) String() string { func (*Workflow_Stream_CopyState) ProtoMessage() {} func (x *Workflow_Stream_CopyState) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[263] + mi := &file_vtctldata_proto_msgTypes[267] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16200,7 +16438,7 @@ type Workflow_Stream_Log struct { func (x *Workflow_Stream_Log) Reset() { *x = Workflow_Stream_Log{} - mi := &file_vtctldata_proto_msgTypes[264] + mi := &file_vtctldata_proto_msgTypes[268] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16212,7 +16450,7 @@ func (x *Workflow_Stream_Log) String() string { func (*Workflow_Stream_Log) ProtoMessage() {} func (x *Workflow_Stream_Log) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[264] + mi := &file_vtctldata_proto_msgTypes[268] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16295,7 +16533,7 @@ type Workflow_Stream_ThrottlerStatus struct { func (x *Workflow_Stream_ThrottlerStatus) Reset() { *x = Workflow_Stream_ThrottlerStatus{} - mi := &file_vtctldata_proto_msgTypes[265] + mi := &file_vtctldata_proto_msgTypes[269] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16307,7 +16545,7 @@ func (x *Workflow_Stream_ThrottlerStatus) String() string { func (*Workflow_Stream_ThrottlerStatus) ProtoMessage() {} func (x *Workflow_Stream_ThrottlerStatus) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[265] + mi := &file_vtctldata_proto_msgTypes[269] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16347,7 +16585,7 @@ type ApplyVSchemaResponse_ParamList struct { func (x *ApplyVSchemaResponse_ParamList) Reset() { *x = ApplyVSchemaResponse_ParamList{} - mi := &file_vtctldata_proto_msgTypes[268] + mi := &file_vtctldata_proto_msgTypes[272] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16359,7 +16597,7 @@ func (x *ApplyVSchemaResponse_ParamList) String() string { func (*ApplyVSchemaResponse_ParamList) ProtoMessage() {} func (x *ApplyVSchemaResponse_ParamList) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[268] + mi := &file_vtctldata_proto_msgTypes[272] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16392,7 +16630,7 @@ type GetSrvKeyspaceNamesResponse_NameList struct { func (x *GetSrvKeyspaceNamesResponse_NameList) Reset() { *x = GetSrvKeyspaceNamesResponse_NameList{} - mi := &file_vtctldata_proto_msgTypes[280] + mi := &file_vtctldata_proto_msgTypes[284] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16404,7 +16642,7 @@ func (x *GetSrvKeyspaceNamesResponse_NameList) String() string { func (*GetSrvKeyspaceNamesResponse_NameList) ProtoMessage() {} func (x *GetSrvKeyspaceNamesResponse_NameList) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[280] + mi := &file_vtctldata_proto_msgTypes[284] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16417,7 +16655,7 @@ func (x *GetSrvKeyspaceNamesResponse_NameList) ProtoReflect() protoreflect.Messa // Deprecated: Use GetSrvKeyspaceNamesResponse_NameList.ProtoReflect.Descriptor instead. func (*GetSrvKeyspaceNamesResponse_NameList) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{99, 1} + return file_vtctldata_proto_rawDescGZIP(), []int{101, 1} } func (x *GetSrvKeyspaceNamesResponse_NameList) GetNames() []string { @@ -16439,7 +16677,7 @@ type MoveTablesCreateResponse_TabletInfo struct { func (x *MoveTablesCreateResponse_TabletInfo) Reset() { *x = MoveTablesCreateResponse_TabletInfo{} - mi := &file_vtctldata_proto_msgTypes[284] + mi := &file_vtctldata_proto_msgTypes[288] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16451,7 +16689,7 @@ func (x *MoveTablesCreateResponse_TabletInfo) String() string { func (*MoveTablesCreateResponse_TabletInfo) ProtoMessage() {} func (x *MoveTablesCreateResponse_TabletInfo) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[284] + mi := &file_vtctldata_proto_msgTypes[288] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16464,7 +16702,7 @@ func (x *MoveTablesCreateResponse_TabletInfo) ProtoReflect() protoreflect.Messag // Deprecated: Use MoveTablesCreateResponse_TabletInfo.ProtoReflect.Descriptor instead. func (*MoveTablesCreateResponse_TabletInfo) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{152, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{154, 0} } func (x *MoveTablesCreateResponse_TabletInfo) GetTablet() *topodata.TabletAlias { @@ -16493,7 +16731,7 @@ type WorkflowDeleteResponse_TabletInfo struct { func (x *WorkflowDeleteResponse_TabletInfo) Reset() { *x = WorkflowDeleteResponse_TabletInfo{} - mi := &file_vtctldata_proto_msgTypes[294] + mi := &file_vtctldata_proto_msgTypes[298] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16505,7 +16743,7 @@ func (x *WorkflowDeleteResponse_TabletInfo) String() string { func (*WorkflowDeleteResponse_TabletInfo) ProtoMessage() {} func (x *WorkflowDeleteResponse_TabletInfo) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[294] + mi := &file_vtctldata_proto_msgTypes[298] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16518,7 +16756,7 @@ func (x *WorkflowDeleteResponse_TabletInfo) ProtoReflect() protoreflect.Message // Deprecated: Use WorkflowDeleteResponse_TabletInfo.ProtoReflect.Descriptor instead. func (*WorkflowDeleteResponse_TabletInfo) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{247, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{251, 0} } func (x *WorkflowDeleteResponse_TabletInfo) GetTablet() *topodata.TabletAlias { @@ -16550,7 +16788,7 @@ type WorkflowStatusResponse_TableCopyState struct { func (x *WorkflowStatusResponse_TableCopyState) Reset() { *x = WorkflowStatusResponse_TableCopyState{} - mi := &file_vtctldata_proto_msgTypes[295] + mi := &file_vtctldata_proto_msgTypes[299] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16562,7 +16800,7 @@ func (x *WorkflowStatusResponse_TableCopyState) String() string { func (*WorkflowStatusResponse_TableCopyState) ProtoMessage() {} func (x *WorkflowStatusResponse_TableCopyState) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[295] + mi := &file_vtctldata_proto_msgTypes[299] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16575,7 +16813,7 @@ func (x *WorkflowStatusResponse_TableCopyState) ProtoReflect() protoreflect.Mess // Deprecated: Use WorkflowStatusResponse_TableCopyState.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse_TableCopyState) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{249, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{253, 0} } func (x *WorkflowStatusResponse_TableCopyState) GetRowsCopied() int64 { @@ -16635,7 +16873,7 @@ type WorkflowStatusResponse_ShardStreamState struct { func (x *WorkflowStatusResponse_ShardStreamState) Reset() { *x = WorkflowStatusResponse_ShardStreamState{} - mi := &file_vtctldata_proto_msgTypes[296] + mi := &file_vtctldata_proto_msgTypes[300] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16647,7 +16885,7 @@ func (x *WorkflowStatusResponse_ShardStreamState) String() string { func (*WorkflowStatusResponse_ShardStreamState) ProtoMessage() {} func (x *WorkflowStatusResponse_ShardStreamState) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[296] + mi := &file_vtctldata_proto_msgTypes[300] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16660,7 +16898,7 @@ func (x *WorkflowStatusResponse_ShardStreamState) ProtoReflect() protoreflect.Me // Deprecated: Use WorkflowStatusResponse_ShardStreamState.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse_ShardStreamState) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{249, 1} + return file_vtctldata_proto_rawDescGZIP(), []int{253, 1} } func (x *WorkflowStatusResponse_ShardStreamState) GetId() int32 { @@ -16715,7 +16953,7 @@ type WorkflowStatusResponse_ShardStreams struct { func (x *WorkflowStatusResponse_ShardStreams) Reset() { *x = WorkflowStatusResponse_ShardStreams{} - mi := &file_vtctldata_proto_msgTypes[297] + mi := &file_vtctldata_proto_msgTypes[301] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16727,7 +16965,7 @@ func (x *WorkflowStatusResponse_ShardStreams) String() string { func (*WorkflowStatusResponse_ShardStreams) ProtoMessage() {} func (x *WorkflowStatusResponse_ShardStreams) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[297] + mi := &file_vtctldata_proto_msgTypes[301] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16740,7 +16978,7 @@ func (x *WorkflowStatusResponse_ShardStreams) ProtoReflect() protoreflect.Messag // Deprecated: Use WorkflowStatusResponse_ShardStreams.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse_ShardStreams) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{249, 2} + return file_vtctldata_proto_rawDescGZIP(), []int{253, 2} } func (x *WorkflowStatusResponse_ShardStreams) GetStreams() []*WorkflowStatusResponse_ShardStreamState { @@ -16763,7 +17001,7 @@ type WorkflowUpdateResponse_TabletInfo struct { func (x *WorkflowUpdateResponse_TabletInfo) Reset() { *x = WorkflowUpdateResponse_TabletInfo{} - mi := &file_vtctldata_proto_msgTypes[300] + mi := &file_vtctldata_proto_msgTypes[304] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16775,7 +17013,7 @@ func (x *WorkflowUpdateResponse_TabletInfo) String() string { func (*WorkflowUpdateResponse_TabletInfo) ProtoMessage() {} func (x *WorkflowUpdateResponse_TabletInfo) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[300] + mi := &file_vtctldata_proto_msgTypes[304] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16788,7 +17026,7 @@ func (x *WorkflowUpdateResponse_TabletInfo) ProtoReflect() protoreflect.Message // Deprecated: Use WorkflowUpdateResponse_TabletInfo.ProtoReflect.Descriptor instead. func (*WorkflowUpdateResponse_TabletInfo) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{253, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{257, 0} } func (x *WorkflowUpdateResponse_TabletInfo) GetTablet() *topodata.TabletAlias { @@ -17532,1162 +17770,705 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 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, - 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdd, 0x02, 0x0a, - 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, - 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x16, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x31, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x5f, 0x64, 0x62, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x69, 0x64, - 0x65, 0x63, 0x61, 0x72, 0x44, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, - 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x49, 0x0a, 0x16, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8a, 0x03, 0x0a, + 0x16, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x13, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x11, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, + 0x77, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x31, 0x0a, 0x14, 0x64, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x11, + 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x43, 0x6f, 0x70, + 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x61, + 0x73, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x31, 0x0a, 0x0d, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, + 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, + 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x69, + 0x64, 0x65, 0x63, 0x61, 0x72, 0x5f, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x44, 0x62, 0x4e, 0x61, + 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, + 0x08, 0x06, 0x10, 0x07, 0x22, 0x49, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, + 0x8c, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0xa0, + 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, - 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0xa0, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x26, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x5f, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x68, 0x61, 0x72, 0x64, 0x41, 0x6c, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x41, 0x0a, 0x15, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, - 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x67, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, + 0x30, 0x0a, 0x14, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x41, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, + 0x73, 0x22, 0x41, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, + 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, + 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, + 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x67, 0x0a, 0x15, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, + 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1c, + 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x26, 0x0a, 0x0f, + 0x65, 0x76, 0x65, 0x6e, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, 0x76, 0x65, 0x6e, 0x49, 0x66, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, + 0x6c, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x79, 0x0a, + 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0xc3, 0x03, 0x0a, 0x1d, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, + 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3e, 0x0a, + 0x0f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0e, 0x69, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x44, 0x0a, + 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, + 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, + 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x12, 0x3f, 0x0a, 0x1c, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, + 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x70, 0x72, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x6f, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x14, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, + 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x11, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x41, 0x6c, 0x6c, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xbc, 0x01, 0x0a, 0x1e, 0x45, 0x6d, 0x65, 0x72, + 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, - 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, - 0x73, 0x69, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x06, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x06, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, - 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, - 0x73, 0x69, 0x76, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x76, 0x65, 0x6e, 0x5f, 0x69, 0x66, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, - 0x76, 0x65, 0x6e, 0x49, 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x79, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, - 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc3, 0x03, 0x0a, 0x1d, 0x45, 0x6d, - 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, - 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3e, 0x0a, 0x0f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0e, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3f, 0x0a, 0x1c, 0x70, - 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, 0x6c, - 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x19, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, - 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x14, - 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x77, 0x61, 0x69, 0x74, - 0x46, 0x6f, 0x72, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x40, 0x0a, - 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, - 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, - 0xbc, 0x01, 0x0a, 0x1e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, - 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, + 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, + 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, + 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, + 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x18, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x19, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x75, 0x73, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x47, 0x0a, 0x19, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x22, 0xd3, 0x01, 0x0a, 0x18, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x6c, + 0x6f, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x47, 0x0a, 0x19, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x22, 0xa5, 0x01, 0x0a, 0x12, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xa0, - 0x01, 0x0a, 0x18, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, - 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x68, 0x6f, 0x6f, + 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x11, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x48, 0x6f, + 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5e, 0x0a, 0x13, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x47, 0x0a, 0x0b, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x68, + 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x1d, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, + 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, - 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, - 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x6f, - 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x75, 0x73, 0x65, 0x50, 0x6f, 0x6f, - 0x6c, 0x22, 0x47, 0x0a, 0x19, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, - 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, - 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd3, 0x01, 0x0a, 0x18, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x22, 0x47, 0x0a, 0x19, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, - 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, - 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa5, 0x01, 0x0a, 0x12, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x11, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x5e, 0x0a, 0x13, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0b, 0x68, 0x6f, 0x6f, 0x6b, - 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x1d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x10, 0x0a, - 0x03, 0x73, 0x71, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, - 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x6c, - 0x6f, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x4e, 0x0a, 0x1e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, - 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, - 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3c, 0x0a, 0x1e, 0x46, 0x69, 0x6e, 0x64, - 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xbe, 0x01, 0x0a, 0x1f, 0x46, 0x69, 0x6e, 0x64, 0x41, - 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x06, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x1a, 0x4b, 0x0a, 0x0b, 0x53, 0x68, - 0x61, 0x72, 0x64, 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, 0x26, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x54, 0x0a, 0x22, 0x46, 0x6f, 0x72, 0x63, 0x65, - 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xeb, 0x01, - 0x0a, 0x23, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, - 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 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, 0x04, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x01, 0x0a, 0x11, - 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x44, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x73, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x46, 0x0a, 0x13, - 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x30, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb6, 0x01, 0x0a, 0x17, - 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x65, 0x73, 0x1a, 0x50, 0x0a, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 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, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, - 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x4c, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, - 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x30, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x46, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2f, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x22, 0x51, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x22, 0x5a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, - 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x20, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x76, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x16, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, - 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x72, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xb0, 0x02, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x28, 0x0a, - 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, - 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x4f, 0x6e, 0x6c, - 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x50, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x44, 0x65, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, - 0xb8, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x2b, - 0x0a, 0x11, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, - 0x12, 0x2e, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x18, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x22, 0x59, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x6d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x64, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x1b, - 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x19, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x62, 0x79, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x16, 0x73, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x1a, 0x65, 0x0a, 0x1b, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, - 0x43, 0x65, 0x6c, 0x6c, 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, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x4c, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x3a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x47, - 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x6a, 0x0a, 0x1c, 0x47, 0x65, - 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x52, 0x11, 0x73, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x32, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x1b, 0x47, - 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x1a, 0x69, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x22, 0x4e, 0x0a, 0x1e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x22, 0x3c, 0x0a, 0x1e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xbe, + 0x01, 0x0a, 0x1f, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, + 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, + 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x1a, 0x4b, 0x0a, 0x0b, 0x53, 0x68, 0x61, 0x72, 0x64, 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, 0x45, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, - 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x20, - 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x22, 0x4a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xcc, 0x01, 0x0a, - 0x17, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x11, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 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, 0x2b, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe4, 0x03, 0x0a, 0x1c, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x53, 0x65, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, - 0x73, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x53, 0x65, 0x6c, 0x66, 0x12, 0x2f, 0x0a, 0x14, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, - 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x11, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x3f, 0x0a, 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, - 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x64, 0x41, 0x70, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0c, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, - 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x11, 0x61, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x22, 0x1f, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, - 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, - 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, - 0x4e, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x73, 0x72, 0x76, 0x5f, - 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x52, 0x0a, 0x73, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, - 0x2d, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xc5, - 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0d, 0x73, 0x72, 0x76, - 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x73, 0x1a, 0x53, 0x0a, 0x10, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4c, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x06, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x22, 0xe8, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, + 0x6b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x54, 0x0a, 0x22, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xeb, 0x01, 0x0a, 0x23, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, + 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, + 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, + 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, + 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, + 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, + 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, + 0x72, 0x64, 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, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x9e, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x40, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, - 0x22, 0x55, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, - 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x63, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x5f, 0x0a, 0x16, - 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x73, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x73, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x46, 0x0a, - 0x17, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x52, - 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x80, 0x01, 0x0a, 0x0c, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 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, 0x22, 0x5f, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x55, - 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x62, 0x61, 0x6e, - 0x64, 0x6f, 0x6e, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, - 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x22, 0x63, 0x0a, 0x21, 0x47, 0x65, 0x74, - 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, - 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, - 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x74, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, - 0xa0, 0x01, 0x0a, 0x15, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x43, 0x0a, 0x0c, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x0b, 0x73, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x22, 0x63, - 0x0a, 0x1a, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x64, 0x74, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, - 0x12, 0x31, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2f, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x22, 0x4d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x22, 0x2e, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x76, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, 0x76, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0xc6, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6e, - 0x61, 0x6d, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x6e, 0x61, 0x6d, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, - 0x49, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, - 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x17, 0x49, - 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x25, 0x0a, + 0x0e, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x22, 0x44, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x46, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, + 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x19, 0x0a, 0x17, + 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x30, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x65, + 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0xb6, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x49, 0x0a, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x1a, 0x50, 0x0a, 0x0c, 0x41, 0x6c, + 0x69, 0x61, 0x73, 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, 0x2a, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x14, + 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, + 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x4c, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x15, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x30, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x22, 0x46, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x51, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x5a, 0x0a, 0x16, 0x47, + 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x76, 0x0a, 0x1f, 0x47, 0x65, 0x74, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x16, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, + 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x17, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x22, 0xb0, 0x02, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, + 0x28, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x6f, + 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x50, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0xb8, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x52, 0x0a, 0x1a, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x52, 0x17, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6c, 0x65, 0x63, - 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x42, 0x0a, 0x18, 0x49, 0x6e, 0x69, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x4e, 0x0a, 0x1c, - 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdf, 0x01, 0x0a, - 0x1d, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, - 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, - 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, - 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, - 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 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, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, - 0x02, 0x0a, 0x19, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x76, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, 0x76, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x42, 0x0a, 0x1e, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, - 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x77, 0x69, 0x74, - 0x68, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x63, - 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, - 0x57, 0x69, 0x74, 0x68, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, - 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x22, 0x1c, 0x0a, 0x1a, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x77, - 0x0a, 0x1e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x4c, 0x0a, 0x1f, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, 0x18, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1b, 0x0a, - 0x19, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x05, 0x0a, 0x14, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, - 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, - 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, - 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, - 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x65, - 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, - 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, - 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, - 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, - 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, - 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, - 0x75, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x16, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, - 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, - 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, - 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, - 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, - 0x52, 0x75, 0x6e, 0x22, 0x5b, 0x0a, 0x17, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, - 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x22, 0x85, 0x01, 0x0a, 0x14, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, - 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, - 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, - 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, - 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, - 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x4d, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x19, 0x0a, 0x17, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x0a, 0x10, 0x4d, 0x6f, - 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x11, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, - 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, - 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, - 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x4d, - 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x82, 0x07, 0x0a, 0x17, 0x4d, 0x6f, 0x76, 0x65, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, - 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, - 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, - 0x32, 0x0a, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, - 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, - 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, - 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, - 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, - 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, - 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, - 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, - 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, - 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, - 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, - 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x63, 0x6f, - 0x70, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, - 0x43, 0x6f, 0x70, 0x79, 0x12, 0x45, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x18, - 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x48, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x22, 0x81, 0x02, 0x0a, 0x19, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, - 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, - 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x5e, 0x0a, 0x1a, 0x4d, 0x6f, 0x76, 0x65, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, - 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x4d, 0x0a, 0x11, 0x50, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd6, 0x03, 0x0a, - 0x1b, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, + 0x0a, 0x06, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x06, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6b, + 0x69, 0x70, 0x22, 0x59, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x64, 0x0a, + 0x1a, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x19, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x63, 0x65, 0x6c, 0x6c, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x43, 0x65, + 0x6c, 0x6c, 0x1a, 0x65, 0x0a, 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x43, 0x65, 0x6c, 0x6c, 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, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4c, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, - 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x0d, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x5f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0c, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4c, 0x0a, 0x19, 0x74, 0x6f, 0x6c, 0x65, - 0x72, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x74, - 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x12, 0x3b, 0x0a, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, - 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xba, 0x01, 0x0a, 0x1c, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, - 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, - 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, - 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, - 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x74, 0x0a, 0x1b, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, - 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x22, 0x1e, 0x0a, 0x1c, 0x52, 0x65, 0x62, 0x75, - 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x1a, 0x52, 0x65, 0x62, 0x75, - 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x1d, 0x0a, 0x1b, - 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x13, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x6a, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, + 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x11, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x32, + 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x1a, 0x69, 0x0a, 0x0a, 0x4e, + 0x61, 0x6d, 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, 0x45, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x20, 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x4a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, + 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, + 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x59, 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, + 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x11, 0x53, + 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 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, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x72, 0x76, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xe4, 0x03, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x74, 0x12, 0x2d, 0x0a, + 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, + 0x73, 0x65, 0x6c, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x2f, 0x0a, 0x14, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x3f, 0x0a, + 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x52, 0x75, 0x6c, 0x65, + 0x52, 0x0c, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x12, 0x1f, + 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x70, + 0x70, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x61, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x1f, 0x0a, 0x1d, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x4e, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, + 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x35, 0x0a, 0x0c, 0x73, 0x72, 0x76, 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0a, 0x73, 0x72, 0x76, + 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2d, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, + 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, + 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x56, 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x72, + 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x1a, 0x53, 0x0a, 0x10, 0x53, 0x72, 0x76, + 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 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, + 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4c, + 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, 0x0a, 0x1a, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x1b, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, - 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, - 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x61, 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x1b, 0x52, 0x65, - 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, - 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x46, 0x0a, 0x1c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbc, 0x01, - 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d, - 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x19, - 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, - 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x16, - 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7f, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, - 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, - 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, - 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, - 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, - 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, - 0x69, 0x76, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, - 0x0a, 0x15, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0x7b, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x22, 0xd6, 0x04, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, - 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, - 0x6b, 0x69, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x6b, 0x69, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, - 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, - 0x43, 0x6f, 0x70, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, - 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x45, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb8, 0x02, 0x0a, - 0x18, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x12, 0x2d, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, - 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x50, 0x6f, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, - 0x72, 0x75, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, - 0x6e, 0x12, 0x3e, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x12, 0x72, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3d, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x28, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0xe8, 0x01, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, + 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, + 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x40, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, + 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x55, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, + 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x12, 0x24, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x4d, 0x0a, 0x1b, 0x52, 0x65, 0x74, 0x72, 0x79, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, + 0x63, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0x5f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, + 0x61, 0x73, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, + 0x73, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x46, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2b, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x80, 0x01, + 0x0a, 0x0c, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 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, + 0x22, 0x5f, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x5f, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x41, 0x67, + 0x65, 0x22, 0x63, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0xa0, 0x01, 0x0a, 0x15, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, + 0x69, 0x6d, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x1a, 0x47, + 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x43, 0x0a, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x22, 0x63, 0x0a, 0x1a, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x12, 0x31, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0c, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x43, + 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x0a, 0x11, 0x47, 0x65, + 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x4d, 0x0a, 0x11, 0x47, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x2e, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2c, 0x0a, 0x08, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, 0x76, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0xc6, + 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdd, 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x74, 0x72, 0x79, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, - 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, + 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4f, + 0x6e, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x4f, 0x6e, 0x6c, 0x79, + 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x21, 0x0a, 0x0c, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x6f, 0x67, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x31, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x52, 0x0a, 0x1a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x17, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, + 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x22, 0x42, 0x0a, 0x18, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, + 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0x4e, 0x0a, 0x1c, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x22, 0xdf, 0x01, 0x0a, 0x1d, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, @@ -18696,451 +18477,975 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x53, 0x68, 0x61, 0x72, 0x64, 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, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x51, 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x75, 0x6e, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x6d, 0x0a, 0x22, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, 0x02, 0x0a, 0x19, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x76, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, 0x76, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x42, 0x0a, + 0x1e, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, + 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x41, + 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x57, 0x69, 0x74, 0x68, 0x4f, 0x77, 0x6e, 0x65, + 0x72, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x77, 0x0a, 0x1e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, + 0x4c, 0x0a, 0x1f, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, + 0x18, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0xdd, 0x05, 0x0a, 0x14, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, + 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x06, + 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, + 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, + 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, + 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, + 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, + 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, + 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, + 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x16, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, + 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, + 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x22, 0x5b, 0x0a, 0x17, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, + 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x85, 0x01, 0x0a, 0x14, 0x4d, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, + 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x17, 0x0a, 0x15, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x4d, 0x6f, 0x75, + 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x4d, 0x6f, 0x75, 0x6e, 0x74, + 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x26, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x11, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, + 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x12, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x82, + 0x07, 0x0a, 0x17, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, + 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, + 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, + 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, + 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, + 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, + 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, + 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, + 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, + 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, + 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x45, 0x0a, 0x10, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x48, 0x0a, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x81, 0x02, 0x0a, 0x19, + 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, + 0x65, 0x65, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x17, + 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, + 0x5e, 0x0a, 0x1a, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, + 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, + 0x4d, 0x0a, 0x11, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, + 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x14, + 0x0a, 0x12, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd6, 0x03, 0x0a, 0x1b, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3a, + 0x0a, 0x0d, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0c, 0x61, 0x76, + 0x6f, 0x69, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, + 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x12, 0x4c, 0x0a, 0x19, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x12, 0x3b, + 0x0a, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, + 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x65, + 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x10, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xba, 0x01, + 0x0a, 0x1c, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x74, 0x0a, 0x1b, 0x52, 0x65, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x22, 0x55, 0x0a, 0x23, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x5e, 0x0a, 0x1e, 0x53, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, - 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x51, 0x0a, 0x1f, 0x53, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x72, 0x0a, 0x1f, - 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, - 0x22, 0x49, 0x0a, 0x20, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x8e, 0x02, 0x0a, 0x1c, - 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x35, - 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x64, - 0x65, 0x6e, 0x69, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x12, 0x32, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x46, 0x0a, 0x1d, - 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, - 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x22, 0x6a, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, + 0x22, 0x1e, 0x0a, 0x1c, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x32, 0x0a, 0x1a, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, + 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x77, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x1a, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x62, 0x0a, 0x1a, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x54, 0x0a, 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x54, 0x0a, 0x20, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x22, 0xaa, 0x03, 0x0a, 0x21, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, - 0x73, 0x12, 0x5a, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x1a, 0x5f, 0x0a, - 0x18, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 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, 0x2d, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4e, - 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8b, - 0x01, 0x0a, 0x1d, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, 0x0a, 0x1a, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, + 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x69, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, + 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x46, 0x0a, + 0x1c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, + 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, + 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x20, 0x0a, 0x1e, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7c, - 0x0a, 0x12, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2c, - 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, 0x13, - 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x0a, 0x15, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, - 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, - 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x16, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x5e, 0x0a, 0x18, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7f, + 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, + 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, + 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0x7b, + 0x0a, 0x16, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xd6, 0x04, 0x0a, 0x14, + 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, + 0x6b, 0x69, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x15, 0x0a, + 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, + 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, + 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x30, 0x0a, 0x14, + 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, + 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x45, 0x0a, + 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb8, 0x02, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2d, 0x0a, 0x0b, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0a, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x50, 0x6f, 0x73, + 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x14, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x12, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x65, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x22, + 0xad, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, + 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x24, 0x0a, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, + 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, + 0x4d, 0x0a, 0x1b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdd, + 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x75, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x40, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, + 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, + 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 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, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x51, + 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6d, 0x0a, 0x22, 0x53, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2b, 0x0a, + 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x55, 0x0a, 0x23, 0x53, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x22, 0x5e, 0x0a, 0x1e, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x42, 0x0a, 0x19, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x53, 0x0a, 0x17, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x22, 0x1a, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x16, - 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x22, 0x19, 0x0a, 0x17, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x21, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, - 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, + 0x04, 0x22, 0x51, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x22, 0x72, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, + 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x22, 0x49, 0x0a, 0x20, 0x53, 0x65, 0x74, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x22, 0x8e, 0x02, 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x5f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x6e, 0x69, + 0x65, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x46, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x6a, 0x0a, 0x12, + 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, + 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, + 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x77, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x77, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x57, + 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x88, 0x01, 0x0a, 0x1a, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x62, 0x0a, 0x1a, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x54, 0x0a, + 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x54, 0x0a, 0x20, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0xaa, 0x03, 0x0a, 0x21, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x78, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x5a, 0x0a, 0x0a, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x4d, 0x61, 0x70, 0x1a, 0x5f, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4e, 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8b, 0x01, 0x0a, 0x1d, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, - 0xc6, 0x01, 0x0a, 0x22, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7c, 0x0a, 0x12, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2c, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x0a, 0x15, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x3f, + 0x0a, 0x16, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, + 0x5e, 0x0a, 0x18, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, + 0x42, 0x0a, 0x19, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x22, 0x53, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, + 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, + 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x21, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, + 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0xc6, 0x01, 0x0a, 0x22, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, + 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x36, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x5f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x12, 0x36, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6f, 0x6c, - 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x5c, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, - 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5d, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x64, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0b, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x5f, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x0a, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x65, 0x0a, 0x18, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0b, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, - 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x22, 0x34, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x62, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x1a, 0x69, 0x0a, 0x16, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6f, 0x6c, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x22, 0x5c, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, + 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5d, + 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, + 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x64, 0x0a, + 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0b, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, + 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x22, 0x65, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, + 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0b, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x5f, 0x61, 0x6c, 0x69, + 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x34, 0x0a, 0x0f, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, + 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, - 0x22, 0xfc, 0x01, 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x61, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x37, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xd8, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x25, 0x0a, - 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6b, 0x69, - 0x70, 0x5f, 0x6e, 0x6f, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x73, 0x6b, 0x69, 0x70, 0x4e, 0x6f, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x56, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x88, 0x02, 0x0a, 0x1e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x67, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x22, 0xfb, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, + 0x62, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x11, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x1a, 0x69, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, + 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xfc, 0x01, 0x0a, 0x18, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, + 0x61, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, 0x0a, 0x22, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, - 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x73, 0x22, 0x31, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3c, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x22, 0x25, 0x0a, 0x23, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, + 0x77, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x6e, 0x6f, 0x5f, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x6b, 0x69, + 0x70, 0x4e, 0x6f, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x88, 0x02, 0x0a, 0x1e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x67, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x73, 0x22, 0x31, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3c, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x68, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, + 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x4f, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x22, 0x38, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x98, 0x01, 0x0a, + 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x12, 0x68, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, - 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, + 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, + 0x65, 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x22, 0xfa, 0x01, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x60, 0x0a, + 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, + 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf9, 0x07, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, + 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x55, 0x0a, 0x1e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1b, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, + 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x09, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, + 0x70, 0x5f, 0x6b, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6f, 0x6e, 0x6c, 0x79, + 0x50, 0x4b, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x72, + 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x52, 0x6f, + 0x77, 0x73, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x77, + 0x61, 0x69, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x77, 0x61, 0x69, 0x74, 0x12, + 0x42, 0x0a, 0x14, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x12, 0x77, 0x61, 0x69, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x74, 0x72, + 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x74, + 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x16, + 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6d, 0x61, + 0x78, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x6f, 0x77, + 0x73, 0x12, 0x3c, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x64, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, + 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, + 0x6d, 0x61, 0x78, 0x44, 0x69, 0x66, 0x66, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x3c, 0x0a, 0x1b, 0x72, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x15, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x72, 0x6f, 0x77, 0x44, 0x69, 0x66, 0x66, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x41, 0x74, 0x12, 0x22, 0x0a, + 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, + 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x22, 0x29, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x22, 0x6b, 0x0a, 0x12, 0x56, + 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, + 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, + 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x92, 0x01, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, + 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, + 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x0a, 0x10, 0x56, + 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0xd7, 0x01, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, + 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x10, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x1a, 0x64, 0x0a, 0x14, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 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, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x4f, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x22, 0x38, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x16, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, - 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x22, 0xfa, 0x01, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x60, 0x0a, 0x10, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, - 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xf9, 0x07, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, - 0x75, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x65, - 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, - 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x55, - 0x0a, 0x1e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, 0x69, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x62, 0x75, - 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x09, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x70, - 0x5f, 0x6b, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6f, 0x6e, 0x6c, 0x79, 0x50, - 0x4b, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x72, 0x6f, - 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x52, 0x6f, 0x77, - 0x73, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x77, 0x61, - 0x69, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x77, 0x61, 0x69, 0x74, 0x12, 0x42, - 0x0a, 0x14, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, - 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, - 0x77, 0x61, 0x69, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x74, 0x72, - 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6d, - 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6d, 0x61, 0x78, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, - 0x12, 0x3c, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x64, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, - 0x61, 0x78, 0x44, 0x69, 0x66, 0x66, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, - 0x0a, 0x1b, 0x72, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x15, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x17, 0x72, 0x6f, 0x77, 0x44, 0x69, 0x66, 0x66, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0a, - 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, - 0x29, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x22, 0x6b, 0x0a, 0x12, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x92, - 0x01, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x22, 0x90, 0x01, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, @@ -19149,242 +19454,211 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x0a, 0x10, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0xd7, 0x01, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, - 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x10, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x1a, 0x64, 0x0a, 0x14, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 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, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x90, 0x01, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x23, 0x0a, - 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x22, 0x13, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xde, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x65, - 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, - 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, - 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x11, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x67, 0x0a, 0x15, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x72, 0x64, 0x73, 0x22, 0x13, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xde, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, + 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x2a, 0x0a, + 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, + 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x67, 0x0a, + 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0xe6, 0x07, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x5f, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x0d, + 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x1a, 0xe8, 0x01, 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x70, + 0x69, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x43, + 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x6f, 0x77, 0x73, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x72, + 0x6f, 0x77, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, + 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x1a, 0xbc, 0x01, 0x0a, + 0x10, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x1a, 0x5c, 0x0a, 0x0c, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x4c, 0x0a, 0x07, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x1a, 0x73, 0x0a, 0x13, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x30, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6f, + 0x0a, 0x11, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 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, 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x85, 0x04, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, + 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, + 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x5f, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, + 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, + 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, + 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, + 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x22, 0x90, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, + 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x6d, + 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x69, 0x72, 0x72, + 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0xe6, 0x07, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x5f, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, - 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x1a, 0xe8, 0x01, 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x43, 0x6f, - 0x70, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x6f, 0x77, 0x73, 0x54, 0x6f, - 0x74, 0x61, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x72, 0x6f, - 0x77, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, - 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, - 0x12, 0x29, 0x0a, 0x10, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x1a, 0xbc, 0x01, 0x0a, 0x10, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x1a, 0x5c, 0x0a, 0x0c, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x4c, 0x0a, 0x07, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x1a, 0x73, 0x0a, 0x13, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x30, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6f, 0x0a, - 0x11, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 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, 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x85, - 0x04, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, - 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, - 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x37, 0x0a, + 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x6d, - 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, - 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, - 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, - 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x22, 0x90, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, - 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, - 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x69, - 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x6d, 0x69, - 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x69, 0x72, 0x72, 0x6f, - 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x37, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x22, - 0x7f, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, - 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x2a, 0x4a, 0x0a, 0x15, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, 0x53, - 0x54, 0x4f, 0x4d, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x4f, 0x56, 0x45, 0x54, 0x41, 0x42, - 0x4c, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x4c, - 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x10, 0x02, 0x2a, 0x38, 0x0a, 0x0d, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x08, 0x0a, - 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x53, 0x43, 0x45, 0x4e, - 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x45, 0x53, 0x43, 0x45, 0x4e, - 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x42, 0x0a, 0x1c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x65, - 0x64, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, - 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x45, 0x41, 0x56, 0x45, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, - 0x07, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x42, 0x28, 0x5a, 0x26, 0x76, 0x69, - 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, - 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x22, 0x7f, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, + 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2a, 0x4a, 0x0a, 0x15, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, + 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x4f, 0x56, 0x45, 0x54, 0x41, + 0x42, 0x4c, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, + 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x10, 0x02, 0x2a, 0x38, 0x0a, + 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x08, + 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x53, 0x43, 0x45, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x45, 0x53, 0x43, 0x45, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x42, 0x0a, 0x1c, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x65, 0x64, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, + 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x45, 0x41, 0x56, 0x45, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x01, 0x12, 0x0b, + 0x0a, 0x07, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x42, 0x28, 0x5a, 0x26, 0x76, + 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, + 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -19400,7 +19674,7 @@ func file_vtctldata_proto_rawDescGZIP() []byte { } var file_vtctldata_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_vtctldata_proto_msgTypes = make([]protoimpl.MessageInfo, 301) +var file_vtctldata_proto_msgTypes = make([]protoimpl.MessageInfo, 305) var file_vtctldata_proto_goTypes = []any{ (MaterializationIntent)(0), // 0: vtctldata.MaterializationIntent (QueryOrdering)(0), // 1: vtctldata.QueryOrdering @@ -19445,557 +19719,563 @@ var file_vtctldata_proto_goTypes = []any{ (*CleanupSchemaMigrationResponse)(nil), // 40: vtctldata.CleanupSchemaMigrationResponse (*CompleteSchemaMigrationRequest)(nil), // 41: vtctldata.CompleteSchemaMigrationRequest (*CompleteSchemaMigrationResponse)(nil), // 42: vtctldata.CompleteSchemaMigrationResponse - (*CreateKeyspaceRequest)(nil), // 43: vtctldata.CreateKeyspaceRequest - (*CreateKeyspaceResponse)(nil), // 44: vtctldata.CreateKeyspaceResponse - (*CreateShardRequest)(nil), // 45: vtctldata.CreateShardRequest - (*CreateShardResponse)(nil), // 46: vtctldata.CreateShardResponse - (*DeleteCellInfoRequest)(nil), // 47: vtctldata.DeleteCellInfoRequest - (*DeleteCellInfoResponse)(nil), // 48: vtctldata.DeleteCellInfoResponse - (*DeleteCellsAliasRequest)(nil), // 49: vtctldata.DeleteCellsAliasRequest - (*DeleteCellsAliasResponse)(nil), // 50: vtctldata.DeleteCellsAliasResponse - (*DeleteKeyspaceRequest)(nil), // 51: vtctldata.DeleteKeyspaceRequest - (*DeleteKeyspaceResponse)(nil), // 52: vtctldata.DeleteKeyspaceResponse - (*DeleteShardsRequest)(nil), // 53: vtctldata.DeleteShardsRequest - (*DeleteShardsResponse)(nil), // 54: vtctldata.DeleteShardsResponse - (*DeleteSrvVSchemaRequest)(nil), // 55: vtctldata.DeleteSrvVSchemaRequest - (*DeleteSrvVSchemaResponse)(nil), // 56: vtctldata.DeleteSrvVSchemaResponse - (*DeleteTabletsRequest)(nil), // 57: vtctldata.DeleteTabletsRequest - (*DeleteTabletsResponse)(nil), // 58: vtctldata.DeleteTabletsResponse - (*EmergencyReparentShardRequest)(nil), // 59: vtctldata.EmergencyReparentShardRequest - (*EmergencyReparentShardResponse)(nil), // 60: vtctldata.EmergencyReparentShardResponse - (*ExecuteFetchAsAppRequest)(nil), // 61: vtctldata.ExecuteFetchAsAppRequest - (*ExecuteFetchAsAppResponse)(nil), // 62: vtctldata.ExecuteFetchAsAppResponse - (*ExecuteFetchAsDBARequest)(nil), // 63: vtctldata.ExecuteFetchAsDBARequest - (*ExecuteFetchAsDBAResponse)(nil), // 64: vtctldata.ExecuteFetchAsDBAResponse - (*ExecuteHookRequest)(nil), // 65: vtctldata.ExecuteHookRequest - (*ExecuteHookResponse)(nil), // 66: vtctldata.ExecuteHookResponse - (*ExecuteMultiFetchAsDBARequest)(nil), // 67: vtctldata.ExecuteMultiFetchAsDBARequest - (*ExecuteMultiFetchAsDBAResponse)(nil), // 68: vtctldata.ExecuteMultiFetchAsDBAResponse - (*FindAllShardsInKeyspaceRequest)(nil), // 69: vtctldata.FindAllShardsInKeyspaceRequest - (*FindAllShardsInKeyspaceResponse)(nil), // 70: vtctldata.FindAllShardsInKeyspaceResponse - (*ForceCutOverSchemaMigrationRequest)(nil), // 71: vtctldata.ForceCutOverSchemaMigrationRequest - (*ForceCutOverSchemaMigrationResponse)(nil), // 72: vtctldata.ForceCutOverSchemaMigrationResponse - (*GetBackupsRequest)(nil), // 73: vtctldata.GetBackupsRequest - (*GetBackupsResponse)(nil), // 74: vtctldata.GetBackupsResponse - (*GetCellInfoRequest)(nil), // 75: vtctldata.GetCellInfoRequest - (*GetCellInfoResponse)(nil), // 76: vtctldata.GetCellInfoResponse - (*GetCellInfoNamesRequest)(nil), // 77: vtctldata.GetCellInfoNamesRequest - (*GetCellInfoNamesResponse)(nil), // 78: vtctldata.GetCellInfoNamesResponse - (*GetCellsAliasesRequest)(nil), // 79: vtctldata.GetCellsAliasesRequest - (*GetCellsAliasesResponse)(nil), // 80: vtctldata.GetCellsAliasesResponse - (*GetFullStatusRequest)(nil), // 81: vtctldata.GetFullStatusRequest - (*GetFullStatusResponse)(nil), // 82: vtctldata.GetFullStatusResponse - (*GetKeyspacesRequest)(nil), // 83: vtctldata.GetKeyspacesRequest - (*GetKeyspacesResponse)(nil), // 84: vtctldata.GetKeyspacesResponse - (*GetKeyspaceRequest)(nil), // 85: vtctldata.GetKeyspaceRequest - (*GetKeyspaceResponse)(nil), // 86: vtctldata.GetKeyspaceResponse - (*GetPermissionsRequest)(nil), // 87: vtctldata.GetPermissionsRequest - (*GetPermissionsResponse)(nil), // 88: vtctldata.GetPermissionsResponse - (*GetKeyspaceRoutingRulesRequest)(nil), // 89: vtctldata.GetKeyspaceRoutingRulesRequest - (*GetKeyspaceRoutingRulesResponse)(nil), // 90: vtctldata.GetKeyspaceRoutingRulesResponse - (*GetRoutingRulesRequest)(nil), // 91: vtctldata.GetRoutingRulesRequest - (*GetRoutingRulesResponse)(nil), // 92: vtctldata.GetRoutingRulesResponse - (*GetSchemaRequest)(nil), // 93: vtctldata.GetSchemaRequest - (*GetSchemaResponse)(nil), // 94: vtctldata.GetSchemaResponse - (*GetSchemaMigrationsRequest)(nil), // 95: vtctldata.GetSchemaMigrationsRequest - (*GetSchemaMigrationsResponse)(nil), // 96: vtctldata.GetSchemaMigrationsResponse - (*GetShardReplicationRequest)(nil), // 97: vtctldata.GetShardReplicationRequest - (*GetShardReplicationResponse)(nil), // 98: vtctldata.GetShardReplicationResponse - (*GetShardRequest)(nil), // 99: vtctldata.GetShardRequest - (*GetShardResponse)(nil), // 100: vtctldata.GetShardResponse - (*GetShardRoutingRulesRequest)(nil), // 101: vtctldata.GetShardRoutingRulesRequest - (*GetShardRoutingRulesResponse)(nil), // 102: vtctldata.GetShardRoutingRulesResponse - (*GetSrvKeyspaceNamesRequest)(nil), // 103: vtctldata.GetSrvKeyspaceNamesRequest - (*GetSrvKeyspaceNamesResponse)(nil), // 104: vtctldata.GetSrvKeyspaceNamesResponse - (*GetSrvKeyspacesRequest)(nil), // 105: vtctldata.GetSrvKeyspacesRequest - (*GetSrvKeyspacesResponse)(nil), // 106: vtctldata.GetSrvKeyspacesResponse - (*UpdateThrottlerConfigRequest)(nil), // 107: vtctldata.UpdateThrottlerConfigRequest - (*UpdateThrottlerConfigResponse)(nil), // 108: vtctldata.UpdateThrottlerConfigResponse - (*GetSrvVSchemaRequest)(nil), // 109: vtctldata.GetSrvVSchemaRequest - (*GetSrvVSchemaResponse)(nil), // 110: vtctldata.GetSrvVSchemaResponse - (*GetSrvVSchemasRequest)(nil), // 111: vtctldata.GetSrvVSchemasRequest - (*GetSrvVSchemasResponse)(nil), // 112: vtctldata.GetSrvVSchemasResponse - (*GetTabletRequest)(nil), // 113: vtctldata.GetTabletRequest - (*GetTabletResponse)(nil), // 114: vtctldata.GetTabletResponse - (*GetTabletsRequest)(nil), // 115: vtctldata.GetTabletsRequest - (*GetTabletsResponse)(nil), // 116: vtctldata.GetTabletsResponse - (*GetThrottlerStatusRequest)(nil), // 117: vtctldata.GetThrottlerStatusRequest - (*GetThrottlerStatusResponse)(nil), // 118: vtctldata.GetThrottlerStatusResponse - (*GetTopologyPathRequest)(nil), // 119: vtctldata.GetTopologyPathRequest - (*GetTopologyPathResponse)(nil), // 120: vtctldata.GetTopologyPathResponse - (*TopologyCell)(nil), // 121: vtctldata.TopologyCell - (*GetUnresolvedTransactionsRequest)(nil), // 122: vtctldata.GetUnresolvedTransactionsRequest - (*GetUnresolvedTransactionsResponse)(nil), // 123: vtctldata.GetUnresolvedTransactionsResponse - (*GetTransactionInfoRequest)(nil), // 124: vtctldata.GetTransactionInfoRequest - (*ShardTransactionState)(nil), // 125: vtctldata.ShardTransactionState - (*GetTransactionInfoResponse)(nil), // 126: vtctldata.GetTransactionInfoResponse - (*ConcludeTransactionRequest)(nil), // 127: vtctldata.ConcludeTransactionRequest - (*ConcludeTransactionResponse)(nil), // 128: vtctldata.ConcludeTransactionResponse - (*GetVSchemaRequest)(nil), // 129: vtctldata.GetVSchemaRequest - (*GetVersionRequest)(nil), // 130: vtctldata.GetVersionRequest - (*GetVersionResponse)(nil), // 131: vtctldata.GetVersionResponse - (*GetVSchemaResponse)(nil), // 132: vtctldata.GetVSchemaResponse - (*GetWorkflowsRequest)(nil), // 133: vtctldata.GetWorkflowsRequest - (*GetWorkflowsResponse)(nil), // 134: vtctldata.GetWorkflowsResponse - (*InitShardPrimaryRequest)(nil), // 135: vtctldata.InitShardPrimaryRequest - (*InitShardPrimaryResponse)(nil), // 136: vtctldata.InitShardPrimaryResponse - (*LaunchSchemaMigrationRequest)(nil), // 137: vtctldata.LaunchSchemaMigrationRequest - (*LaunchSchemaMigrationResponse)(nil), // 138: vtctldata.LaunchSchemaMigrationResponse - (*LookupVindexCreateRequest)(nil), // 139: vtctldata.LookupVindexCreateRequest - (*LookupVindexCreateResponse)(nil), // 140: vtctldata.LookupVindexCreateResponse - (*LookupVindexExternalizeRequest)(nil), // 141: vtctldata.LookupVindexExternalizeRequest - (*LookupVindexExternalizeResponse)(nil), // 142: vtctldata.LookupVindexExternalizeResponse - (*MaterializeCreateRequest)(nil), // 143: vtctldata.MaterializeCreateRequest - (*MaterializeCreateResponse)(nil), // 144: vtctldata.MaterializeCreateResponse - (*MigrateCreateRequest)(nil), // 145: vtctldata.MigrateCreateRequest - (*MigrateCompleteRequest)(nil), // 146: vtctldata.MigrateCompleteRequest - (*MigrateCompleteResponse)(nil), // 147: vtctldata.MigrateCompleteResponse - (*MountRegisterRequest)(nil), // 148: vtctldata.MountRegisterRequest - (*MountRegisterResponse)(nil), // 149: vtctldata.MountRegisterResponse - (*MountUnregisterRequest)(nil), // 150: vtctldata.MountUnregisterRequest - (*MountUnregisterResponse)(nil), // 151: vtctldata.MountUnregisterResponse - (*MountShowRequest)(nil), // 152: vtctldata.MountShowRequest - (*MountShowResponse)(nil), // 153: vtctldata.MountShowResponse - (*MountListRequest)(nil), // 154: vtctldata.MountListRequest - (*MountListResponse)(nil), // 155: vtctldata.MountListResponse - (*MoveTablesCreateRequest)(nil), // 156: vtctldata.MoveTablesCreateRequest - (*MoveTablesCreateResponse)(nil), // 157: vtctldata.MoveTablesCreateResponse - (*MoveTablesCompleteRequest)(nil), // 158: vtctldata.MoveTablesCompleteRequest - (*MoveTablesCompleteResponse)(nil), // 159: vtctldata.MoveTablesCompleteResponse - (*PingTabletRequest)(nil), // 160: vtctldata.PingTabletRequest - (*PingTabletResponse)(nil), // 161: vtctldata.PingTabletResponse - (*PlannedReparentShardRequest)(nil), // 162: vtctldata.PlannedReparentShardRequest - (*PlannedReparentShardResponse)(nil), // 163: vtctldata.PlannedReparentShardResponse - (*RebuildKeyspaceGraphRequest)(nil), // 164: vtctldata.RebuildKeyspaceGraphRequest - (*RebuildKeyspaceGraphResponse)(nil), // 165: vtctldata.RebuildKeyspaceGraphResponse - (*RebuildVSchemaGraphRequest)(nil), // 166: vtctldata.RebuildVSchemaGraphRequest - (*RebuildVSchemaGraphResponse)(nil), // 167: vtctldata.RebuildVSchemaGraphResponse - (*RefreshStateRequest)(nil), // 168: vtctldata.RefreshStateRequest - (*RefreshStateResponse)(nil), // 169: vtctldata.RefreshStateResponse - (*RefreshStateByShardRequest)(nil), // 170: vtctldata.RefreshStateByShardRequest - (*RefreshStateByShardResponse)(nil), // 171: vtctldata.RefreshStateByShardResponse - (*ReloadSchemaRequest)(nil), // 172: vtctldata.ReloadSchemaRequest - (*ReloadSchemaResponse)(nil), // 173: vtctldata.ReloadSchemaResponse - (*ReloadSchemaKeyspaceRequest)(nil), // 174: vtctldata.ReloadSchemaKeyspaceRequest - (*ReloadSchemaKeyspaceResponse)(nil), // 175: vtctldata.ReloadSchemaKeyspaceResponse - (*ReloadSchemaShardRequest)(nil), // 176: vtctldata.ReloadSchemaShardRequest - (*ReloadSchemaShardResponse)(nil), // 177: vtctldata.ReloadSchemaShardResponse - (*RemoveBackupRequest)(nil), // 178: vtctldata.RemoveBackupRequest - (*RemoveBackupResponse)(nil), // 179: vtctldata.RemoveBackupResponse - (*RemoveKeyspaceCellRequest)(nil), // 180: vtctldata.RemoveKeyspaceCellRequest - (*RemoveKeyspaceCellResponse)(nil), // 181: vtctldata.RemoveKeyspaceCellResponse - (*RemoveShardCellRequest)(nil), // 182: vtctldata.RemoveShardCellRequest - (*RemoveShardCellResponse)(nil), // 183: vtctldata.RemoveShardCellResponse - (*ReparentTabletRequest)(nil), // 184: vtctldata.ReparentTabletRequest - (*ReparentTabletResponse)(nil), // 185: vtctldata.ReparentTabletResponse - (*ReshardCreateRequest)(nil), // 186: vtctldata.ReshardCreateRequest - (*RestoreFromBackupRequest)(nil), // 187: vtctldata.RestoreFromBackupRequest - (*RestoreFromBackupResponse)(nil), // 188: vtctldata.RestoreFromBackupResponse - (*RetrySchemaMigrationRequest)(nil), // 189: vtctldata.RetrySchemaMigrationRequest - (*RetrySchemaMigrationResponse)(nil), // 190: vtctldata.RetrySchemaMigrationResponse - (*RunHealthCheckRequest)(nil), // 191: vtctldata.RunHealthCheckRequest - (*RunHealthCheckResponse)(nil), // 192: vtctldata.RunHealthCheckResponse - (*SetKeyspaceDurabilityPolicyRequest)(nil), // 193: vtctldata.SetKeyspaceDurabilityPolicyRequest - (*SetKeyspaceDurabilityPolicyResponse)(nil), // 194: vtctldata.SetKeyspaceDurabilityPolicyResponse - (*SetKeyspaceShardingInfoRequest)(nil), // 195: vtctldata.SetKeyspaceShardingInfoRequest - (*SetKeyspaceShardingInfoResponse)(nil), // 196: vtctldata.SetKeyspaceShardingInfoResponse - (*SetShardIsPrimaryServingRequest)(nil), // 197: vtctldata.SetShardIsPrimaryServingRequest - (*SetShardIsPrimaryServingResponse)(nil), // 198: vtctldata.SetShardIsPrimaryServingResponse - (*SetShardTabletControlRequest)(nil), // 199: vtctldata.SetShardTabletControlRequest - (*SetShardTabletControlResponse)(nil), // 200: vtctldata.SetShardTabletControlResponse - (*SetWritableRequest)(nil), // 201: vtctldata.SetWritableRequest - (*SetWritableResponse)(nil), // 202: vtctldata.SetWritableResponse - (*ShardReplicationAddRequest)(nil), // 203: vtctldata.ShardReplicationAddRequest - (*ShardReplicationAddResponse)(nil), // 204: vtctldata.ShardReplicationAddResponse - (*ShardReplicationFixRequest)(nil), // 205: vtctldata.ShardReplicationFixRequest - (*ShardReplicationFixResponse)(nil), // 206: vtctldata.ShardReplicationFixResponse - (*ShardReplicationPositionsRequest)(nil), // 207: vtctldata.ShardReplicationPositionsRequest - (*ShardReplicationPositionsResponse)(nil), // 208: vtctldata.ShardReplicationPositionsResponse - (*ShardReplicationRemoveRequest)(nil), // 209: vtctldata.ShardReplicationRemoveRequest - (*ShardReplicationRemoveResponse)(nil), // 210: vtctldata.ShardReplicationRemoveResponse - (*SleepTabletRequest)(nil), // 211: vtctldata.SleepTabletRequest - (*SleepTabletResponse)(nil), // 212: vtctldata.SleepTabletResponse - (*SourceShardAddRequest)(nil), // 213: vtctldata.SourceShardAddRequest - (*SourceShardAddResponse)(nil), // 214: vtctldata.SourceShardAddResponse - (*SourceShardDeleteRequest)(nil), // 215: vtctldata.SourceShardDeleteRequest - (*SourceShardDeleteResponse)(nil), // 216: vtctldata.SourceShardDeleteResponse - (*StartReplicationRequest)(nil), // 217: vtctldata.StartReplicationRequest - (*StartReplicationResponse)(nil), // 218: vtctldata.StartReplicationResponse - (*StopReplicationRequest)(nil), // 219: vtctldata.StopReplicationRequest - (*StopReplicationResponse)(nil), // 220: vtctldata.StopReplicationResponse - (*TabletExternallyReparentedRequest)(nil), // 221: vtctldata.TabletExternallyReparentedRequest - (*TabletExternallyReparentedResponse)(nil), // 222: vtctldata.TabletExternallyReparentedResponse - (*UpdateCellInfoRequest)(nil), // 223: vtctldata.UpdateCellInfoRequest - (*UpdateCellInfoResponse)(nil), // 224: vtctldata.UpdateCellInfoResponse - (*UpdateCellsAliasRequest)(nil), // 225: vtctldata.UpdateCellsAliasRequest - (*UpdateCellsAliasResponse)(nil), // 226: vtctldata.UpdateCellsAliasResponse - (*ValidateRequest)(nil), // 227: vtctldata.ValidateRequest - (*ValidateResponse)(nil), // 228: vtctldata.ValidateResponse - (*ValidateKeyspaceRequest)(nil), // 229: vtctldata.ValidateKeyspaceRequest - (*ValidateKeyspaceResponse)(nil), // 230: vtctldata.ValidateKeyspaceResponse - (*ValidateSchemaKeyspaceRequest)(nil), // 231: vtctldata.ValidateSchemaKeyspaceRequest - (*ValidateSchemaKeyspaceResponse)(nil), // 232: vtctldata.ValidateSchemaKeyspaceResponse - (*ValidateShardRequest)(nil), // 233: vtctldata.ValidateShardRequest - (*ValidateShardResponse)(nil), // 234: vtctldata.ValidateShardResponse - (*ValidateVersionKeyspaceRequest)(nil), // 235: vtctldata.ValidateVersionKeyspaceRequest - (*ValidateVersionKeyspaceResponse)(nil), // 236: vtctldata.ValidateVersionKeyspaceResponse - (*ValidateVersionShardRequest)(nil), // 237: vtctldata.ValidateVersionShardRequest - (*ValidateVersionShardResponse)(nil), // 238: vtctldata.ValidateVersionShardResponse - (*ValidateVSchemaRequest)(nil), // 239: vtctldata.ValidateVSchemaRequest - (*ValidateVSchemaResponse)(nil), // 240: vtctldata.ValidateVSchemaResponse - (*VDiffCreateRequest)(nil), // 241: vtctldata.VDiffCreateRequest - (*VDiffCreateResponse)(nil), // 242: vtctldata.VDiffCreateResponse - (*VDiffDeleteRequest)(nil), // 243: vtctldata.VDiffDeleteRequest - (*VDiffDeleteResponse)(nil), // 244: vtctldata.VDiffDeleteResponse - (*VDiffResumeRequest)(nil), // 245: vtctldata.VDiffResumeRequest - (*VDiffResumeResponse)(nil), // 246: vtctldata.VDiffResumeResponse - (*VDiffShowRequest)(nil), // 247: vtctldata.VDiffShowRequest - (*VDiffShowResponse)(nil), // 248: vtctldata.VDiffShowResponse - (*VDiffStopRequest)(nil), // 249: vtctldata.VDiffStopRequest - (*VDiffStopResponse)(nil), // 250: vtctldata.VDiffStopResponse - (*WorkflowDeleteRequest)(nil), // 251: vtctldata.WorkflowDeleteRequest - (*WorkflowDeleteResponse)(nil), // 252: vtctldata.WorkflowDeleteResponse - (*WorkflowStatusRequest)(nil), // 253: vtctldata.WorkflowStatusRequest - (*WorkflowStatusResponse)(nil), // 254: vtctldata.WorkflowStatusResponse - (*WorkflowSwitchTrafficRequest)(nil), // 255: vtctldata.WorkflowSwitchTrafficRequest - (*WorkflowSwitchTrafficResponse)(nil), // 256: vtctldata.WorkflowSwitchTrafficResponse - (*WorkflowUpdateRequest)(nil), // 257: vtctldata.WorkflowUpdateRequest - (*WorkflowUpdateResponse)(nil), // 258: vtctldata.WorkflowUpdateResponse - (*GetMirrorRulesRequest)(nil), // 259: vtctldata.GetMirrorRulesRequest - (*GetMirrorRulesResponse)(nil), // 260: vtctldata.GetMirrorRulesResponse - (*WorkflowMirrorTrafficRequest)(nil), // 261: vtctldata.WorkflowMirrorTrafficRequest - (*WorkflowMirrorTrafficResponse)(nil), // 262: vtctldata.WorkflowMirrorTrafficResponse - nil, // 263: vtctldata.WorkflowOptions.ConfigEntry - nil, // 264: vtctldata.Workflow.ShardStreamsEntry - (*Workflow_ReplicationLocation)(nil), // 265: vtctldata.Workflow.ReplicationLocation - (*Workflow_ShardStream)(nil), // 266: vtctldata.Workflow.ShardStream - (*Workflow_Stream)(nil), // 267: vtctldata.Workflow.Stream - (*Workflow_Stream_CopyState)(nil), // 268: vtctldata.Workflow.Stream.CopyState - (*Workflow_Stream_Log)(nil), // 269: vtctldata.Workflow.Stream.Log - (*Workflow_Stream_ThrottlerStatus)(nil), // 270: vtctldata.Workflow.Stream.ThrottlerStatus - nil, // 271: vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry - nil, // 272: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry - (*ApplyVSchemaResponse_ParamList)(nil), // 273: vtctldata.ApplyVSchemaResponse.ParamList - nil, // 274: vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 275: vtctldata.ChangeTabletTagsRequest.TagsEntry - nil, // 276: vtctldata.ChangeTabletTagsResponse.BeforeTagsEntry - nil, // 277: vtctldata.ChangeTabletTagsResponse.AfterTagsEntry - nil, // 278: vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 279: vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 280: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry - nil, // 281: vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 282: vtctldata.GetCellsAliasesResponse.AliasesEntry - nil, // 283: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry - nil, // 284: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry - (*GetSrvKeyspaceNamesResponse_NameList)(nil), // 285: vtctldata.GetSrvKeyspaceNamesResponse.NameList - nil, // 286: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry - nil, // 287: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry - nil, // 288: vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry - (*MoveTablesCreateResponse_TabletInfo)(nil), // 289: vtctldata.MoveTablesCreateResponse.TabletInfo - nil, // 290: vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 291: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry - nil, // 292: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry - nil, // 293: vtctldata.ValidateResponse.ResultsByKeyspaceEntry - nil, // 294: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry - nil, // 295: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry - nil, // 296: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry - nil, // 297: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry - nil, // 298: vtctldata.VDiffShowResponse.TabletResponsesEntry - (*WorkflowDeleteResponse_TabletInfo)(nil), // 299: vtctldata.WorkflowDeleteResponse.TabletInfo - (*WorkflowStatusResponse_TableCopyState)(nil), // 300: vtctldata.WorkflowStatusResponse.TableCopyState - (*WorkflowStatusResponse_ShardStreamState)(nil), // 301: vtctldata.WorkflowStatusResponse.ShardStreamState - (*WorkflowStatusResponse_ShardStreams)(nil), // 302: vtctldata.WorkflowStatusResponse.ShardStreams - nil, // 303: vtctldata.WorkflowStatusResponse.TableCopyStateEntry - nil, // 304: vtctldata.WorkflowStatusResponse.ShardStreamsEntry - (*WorkflowUpdateResponse_TabletInfo)(nil), // 305: vtctldata.WorkflowUpdateResponse.TabletInfo - (*logutil.Event)(nil), // 306: logutil.Event - (tabletmanagerdata.TabletSelectionPreference)(0), // 307: tabletmanagerdata.TabletSelectionPreference - (*topodata.Keyspace)(nil), // 308: topodata.Keyspace - (*vttime.Time)(nil), // 309: vttime.Time - (*topodata.TabletAlias)(nil), // 310: topodata.TabletAlias - (*vttime.Duration)(nil), // 311: vttime.Duration - (*topodata.Shard)(nil), // 312: topodata.Shard - (*topodata.CellInfo)(nil), // 313: topodata.CellInfo - (*vschema.KeyspaceRoutingRules)(nil), // 314: vschema.KeyspaceRoutingRules - (*vschema.RoutingRules)(nil), // 315: vschema.RoutingRules - (*vschema.ShardRoutingRules)(nil), // 316: vschema.ShardRoutingRules - (*vtrpc.CallerID)(nil), // 317: vtrpc.CallerID - (*vschema.Keyspace)(nil), // 318: vschema.Keyspace - (topodata.TabletType)(0), // 319: topodata.TabletType - (*topodata.Tablet)(nil), // 320: topodata.Tablet - (*tabletmanagerdata.CheckThrottlerResponse)(nil), // 321: tabletmanagerdata.CheckThrottlerResponse - (topodata.KeyspaceType)(0), // 322: topodata.KeyspaceType - (*query.QueryResult)(nil), // 323: query.QueryResult - (*tabletmanagerdata.ExecuteHookRequest)(nil), // 324: tabletmanagerdata.ExecuteHookRequest - (*tabletmanagerdata.ExecuteHookResponse)(nil), // 325: tabletmanagerdata.ExecuteHookResponse - (*mysqlctl.BackupInfo)(nil), // 326: mysqlctl.BackupInfo - (*replicationdata.FullStatus)(nil), // 327: replicationdata.FullStatus - (*tabletmanagerdata.Permissions)(nil), // 328: tabletmanagerdata.Permissions - (*tabletmanagerdata.SchemaDefinition)(nil), // 329: tabletmanagerdata.SchemaDefinition - (*topodata.ThrottledAppRule)(nil), // 330: topodata.ThrottledAppRule - (*vschema.SrvVSchema)(nil), // 331: vschema.SrvVSchema - (*tabletmanagerdata.GetThrottlerStatusResponse)(nil), // 332: tabletmanagerdata.GetThrottlerStatusResponse - (*query.TransactionMetadata)(nil), // 333: query.TransactionMetadata - (*query.Target)(nil), // 334: query.Target - (*topodata.ShardReplicationError)(nil), // 335: topodata.ShardReplicationError - (*topodata.KeyRange)(nil), // 336: topodata.KeyRange - (*topodata.CellsAlias)(nil), // 337: topodata.CellsAlias - (*tabletmanagerdata.UpdateVReplicationWorkflowRequest)(nil), // 338: tabletmanagerdata.UpdateVReplicationWorkflowRequest - (*vschema.MirrorRules)(nil), // 339: vschema.MirrorRules - (*topodata.Shard_TabletControl)(nil), // 340: topodata.Shard.TabletControl - (*binlogdata.BinlogSource)(nil), // 341: binlogdata.BinlogSource - (*topodata.ShardReplication)(nil), // 342: topodata.ShardReplication - (*topodata.SrvKeyspace)(nil), // 343: topodata.SrvKeyspace - (*replicationdata.Status)(nil), // 344: replicationdata.Status - (*tabletmanagerdata.VDiffResponse)(nil), // 345: tabletmanagerdata.VDiffResponse + (*CopySchemaShardRequest)(nil), // 43: vtctldata.CopySchemaShardRequest + (*CopySchemaShardResponse)(nil), // 44: vtctldata.CopySchemaShardResponse + (*CreateKeyspaceRequest)(nil), // 45: vtctldata.CreateKeyspaceRequest + (*CreateKeyspaceResponse)(nil), // 46: vtctldata.CreateKeyspaceResponse + (*CreateShardRequest)(nil), // 47: vtctldata.CreateShardRequest + (*CreateShardResponse)(nil), // 48: vtctldata.CreateShardResponse + (*DeleteCellInfoRequest)(nil), // 49: vtctldata.DeleteCellInfoRequest + (*DeleteCellInfoResponse)(nil), // 50: vtctldata.DeleteCellInfoResponse + (*DeleteCellsAliasRequest)(nil), // 51: vtctldata.DeleteCellsAliasRequest + (*DeleteCellsAliasResponse)(nil), // 52: vtctldata.DeleteCellsAliasResponse + (*DeleteKeyspaceRequest)(nil), // 53: vtctldata.DeleteKeyspaceRequest + (*DeleteKeyspaceResponse)(nil), // 54: vtctldata.DeleteKeyspaceResponse + (*DeleteShardsRequest)(nil), // 55: vtctldata.DeleteShardsRequest + (*DeleteShardsResponse)(nil), // 56: vtctldata.DeleteShardsResponse + (*DeleteSrvVSchemaRequest)(nil), // 57: vtctldata.DeleteSrvVSchemaRequest + (*DeleteSrvVSchemaResponse)(nil), // 58: vtctldata.DeleteSrvVSchemaResponse + (*DeleteTabletsRequest)(nil), // 59: vtctldata.DeleteTabletsRequest + (*DeleteTabletsResponse)(nil), // 60: vtctldata.DeleteTabletsResponse + (*EmergencyReparentShardRequest)(nil), // 61: vtctldata.EmergencyReparentShardRequest + (*EmergencyReparentShardResponse)(nil), // 62: vtctldata.EmergencyReparentShardResponse + (*ExecuteFetchAsAppRequest)(nil), // 63: vtctldata.ExecuteFetchAsAppRequest + (*ExecuteFetchAsAppResponse)(nil), // 64: vtctldata.ExecuteFetchAsAppResponse + (*ExecuteFetchAsDBARequest)(nil), // 65: vtctldata.ExecuteFetchAsDBARequest + (*ExecuteFetchAsDBAResponse)(nil), // 66: vtctldata.ExecuteFetchAsDBAResponse + (*ExecuteHookRequest)(nil), // 67: vtctldata.ExecuteHookRequest + (*ExecuteHookResponse)(nil), // 68: vtctldata.ExecuteHookResponse + (*ExecuteMultiFetchAsDBARequest)(nil), // 69: vtctldata.ExecuteMultiFetchAsDBARequest + (*ExecuteMultiFetchAsDBAResponse)(nil), // 70: vtctldata.ExecuteMultiFetchAsDBAResponse + (*FindAllShardsInKeyspaceRequest)(nil), // 71: vtctldata.FindAllShardsInKeyspaceRequest + (*FindAllShardsInKeyspaceResponse)(nil), // 72: vtctldata.FindAllShardsInKeyspaceResponse + (*ForceCutOverSchemaMigrationRequest)(nil), // 73: vtctldata.ForceCutOverSchemaMigrationRequest + (*ForceCutOverSchemaMigrationResponse)(nil), // 74: vtctldata.ForceCutOverSchemaMigrationResponse + (*GetBackupsRequest)(nil), // 75: vtctldata.GetBackupsRequest + (*GetBackupsResponse)(nil), // 76: vtctldata.GetBackupsResponse + (*GetCellInfoRequest)(nil), // 77: vtctldata.GetCellInfoRequest + (*GetCellInfoResponse)(nil), // 78: vtctldata.GetCellInfoResponse + (*GetCellInfoNamesRequest)(nil), // 79: vtctldata.GetCellInfoNamesRequest + (*GetCellInfoNamesResponse)(nil), // 80: vtctldata.GetCellInfoNamesResponse + (*GetCellsAliasesRequest)(nil), // 81: vtctldata.GetCellsAliasesRequest + (*GetCellsAliasesResponse)(nil), // 82: vtctldata.GetCellsAliasesResponse + (*GetFullStatusRequest)(nil), // 83: vtctldata.GetFullStatusRequest + (*GetFullStatusResponse)(nil), // 84: vtctldata.GetFullStatusResponse + (*GetKeyspacesRequest)(nil), // 85: vtctldata.GetKeyspacesRequest + (*GetKeyspacesResponse)(nil), // 86: vtctldata.GetKeyspacesResponse + (*GetKeyspaceRequest)(nil), // 87: vtctldata.GetKeyspaceRequest + (*GetKeyspaceResponse)(nil), // 88: vtctldata.GetKeyspaceResponse + (*GetPermissionsRequest)(nil), // 89: vtctldata.GetPermissionsRequest + (*GetPermissionsResponse)(nil), // 90: vtctldata.GetPermissionsResponse + (*GetKeyspaceRoutingRulesRequest)(nil), // 91: vtctldata.GetKeyspaceRoutingRulesRequest + (*GetKeyspaceRoutingRulesResponse)(nil), // 92: vtctldata.GetKeyspaceRoutingRulesResponse + (*GetRoutingRulesRequest)(nil), // 93: vtctldata.GetRoutingRulesRequest + (*GetRoutingRulesResponse)(nil), // 94: vtctldata.GetRoutingRulesResponse + (*GetSchemaRequest)(nil), // 95: vtctldata.GetSchemaRequest + (*GetSchemaResponse)(nil), // 96: vtctldata.GetSchemaResponse + (*GetSchemaMigrationsRequest)(nil), // 97: vtctldata.GetSchemaMigrationsRequest + (*GetSchemaMigrationsResponse)(nil), // 98: vtctldata.GetSchemaMigrationsResponse + (*GetShardReplicationRequest)(nil), // 99: vtctldata.GetShardReplicationRequest + (*GetShardReplicationResponse)(nil), // 100: vtctldata.GetShardReplicationResponse + (*GetShardRequest)(nil), // 101: vtctldata.GetShardRequest + (*GetShardResponse)(nil), // 102: vtctldata.GetShardResponse + (*GetShardRoutingRulesRequest)(nil), // 103: vtctldata.GetShardRoutingRulesRequest + (*GetShardRoutingRulesResponse)(nil), // 104: vtctldata.GetShardRoutingRulesResponse + (*GetSrvKeyspaceNamesRequest)(nil), // 105: vtctldata.GetSrvKeyspaceNamesRequest + (*GetSrvKeyspaceNamesResponse)(nil), // 106: vtctldata.GetSrvKeyspaceNamesResponse + (*GetSrvKeyspacesRequest)(nil), // 107: vtctldata.GetSrvKeyspacesRequest + (*GetSrvKeyspacesResponse)(nil), // 108: vtctldata.GetSrvKeyspacesResponse + (*UpdateThrottlerConfigRequest)(nil), // 109: vtctldata.UpdateThrottlerConfigRequest + (*UpdateThrottlerConfigResponse)(nil), // 110: vtctldata.UpdateThrottlerConfigResponse + (*GetSrvVSchemaRequest)(nil), // 111: vtctldata.GetSrvVSchemaRequest + (*GetSrvVSchemaResponse)(nil), // 112: vtctldata.GetSrvVSchemaResponse + (*GetSrvVSchemasRequest)(nil), // 113: vtctldata.GetSrvVSchemasRequest + (*GetSrvVSchemasResponse)(nil), // 114: vtctldata.GetSrvVSchemasResponse + (*GetTabletRequest)(nil), // 115: vtctldata.GetTabletRequest + (*GetTabletResponse)(nil), // 116: vtctldata.GetTabletResponse + (*GetTabletsRequest)(nil), // 117: vtctldata.GetTabletsRequest + (*GetTabletsResponse)(nil), // 118: vtctldata.GetTabletsResponse + (*GetThrottlerStatusRequest)(nil), // 119: vtctldata.GetThrottlerStatusRequest + (*GetThrottlerStatusResponse)(nil), // 120: vtctldata.GetThrottlerStatusResponse + (*GetTopologyPathRequest)(nil), // 121: vtctldata.GetTopologyPathRequest + (*GetTopologyPathResponse)(nil), // 122: vtctldata.GetTopologyPathResponse + (*TopologyCell)(nil), // 123: vtctldata.TopologyCell + (*GetUnresolvedTransactionsRequest)(nil), // 124: vtctldata.GetUnresolvedTransactionsRequest + (*GetUnresolvedTransactionsResponse)(nil), // 125: vtctldata.GetUnresolvedTransactionsResponse + (*GetTransactionInfoRequest)(nil), // 126: vtctldata.GetTransactionInfoRequest + (*ShardTransactionState)(nil), // 127: vtctldata.ShardTransactionState + (*GetTransactionInfoResponse)(nil), // 128: vtctldata.GetTransactionInfoResponse + (*ConcludeTransactionRequest)(nil), // 129: vtctldata.ConcludeTransactionRequest + (*ConcludeTransactionResponse)(nil), // 130: vtctldata.ConcludeTransactionResponse + (*GetVSchemaRequest)(nil), // 131: vtctldata.GetVSchemaRequest + (*GetVersionRequest)(nil), // 132: vtctldata.GetVersionRequest + (*GetVersionResponse)(nil), // 133: vtctldata.GetVersionResponse + (*GetVSchemaResponse)(nil), // 134: vtctldata.GetVSchemaResponse + (*GetWorkflowsRequest)(nil), // 135: vtctldata.GetWorkflowsRequest + (*GetWorkflowsResponse)(nil), // 136: vtctldata.GetWorkflowsResponse + (*InitShardPrimaryRequest)(nil), // 137: vtctldata.InitShardPrimaryRequest + (*InitShardPrimaryResponse)(nil), // 138: vtctldata.InitShardPrimaryResponse + (*LaunchSchemaMigrationRequest)(nil), // 139: vtctldata.LaunchSchemaMigrationRequest + (*LaunchSchemaMigrationResponse)(nil), // 140: vtctldata.LaunchSchemaMigrationResponse + (*LookupVindexCreateRequest)(nil), // 141: vtctldata.LookupVindexCreateRequest + (*LookupVindexCreateResponse)(nil), // 142: vtctldata.LookupVindexCreateResponse + (*LookupVindexExternalizeRequest)(nil), // 143: vtctldata.LookupVindexExternalizeRequest + (*LookupVindexExternalizeResponse)(nil), // 144: vtctldata.LookupVindexExternalizeResponse + (*MaterializeCreateRequest)(nil), // 145: vtctldata.MaterializeCreateRequest + (*MaterializeCreateResponse)(nil), // 146: vtctldata.MaterializeCreateResponse + (*MigrateCreateRequest)(nil), // 147: vtctldata.MigrateCreateRequest + (*MigrateCompleteRequest)(nil), // 148: vtctldata.MigrateCompleteRequest + (*MigrateCompleteResponse)(nil), // 149: vtctldata.MigrateCompleteResponse + (*MountRegisterRequest)(nil), // 150: vtctldata.MountRegisterRequest + (*MountRegisterResponse)(nil), // 151: vtctldata.MountRegisterResponse + (*MountUnregisterRequest)(nil), // 152: vtctldata.MountUnregisterRequest + (*MountUnregisterResponse)(nil), // 153: vtctldata.MountUnregisterResponse + (*MountShowRequest)(nil), // 154: vtctldata.MountShowRequest + (*MountShowResponse)(nil), // 155: vtctldata.MountShowResponse + (*MountListRequest)(nil), // 156: vtctldata.MountListRequest + (*MountListResponse)(nil), // 157: vtctldata.MountListResponse + (*MoveTablesCreateRequest)(nil), // 158: vtctldata.MoveTablesCreateRequest + (*MoveTablesCreateResponse)(nil), // 159: vtctldata.MoveTablesCreateResponse + (*MoveTablesCompleteRequest)(nil), // 160: vtctldata.MoveTablesCompleteRequest + (*MoveTablesCompleteResponse)(nil), // 161: vtctldata.MoveTablesCompleteResponse + (*PingTabletRequest)(nil), // 162: vtctldata.PingTabletRequest + (*PingTabletResponse)(nil), // 163: vtctldata.PingTabletResponse + (*PlannedReparentShardRequest)(nil), // 164: vtctldata.PlannedReparentShardRequest + (*PlannedReparentShardResponse)(nil), // 165: vtctldata.PlannedReparentShardResponse + (*RebuildKeyspaceGraphRequest)(nil), // 166: vtctldata.RebuildKeyspaceGraphRequest + (*RebuildKeyspaceGraphResponse)(nil), // 167: vtctldata.RebuildKeyspaceGraphResponse + (*RebuildVSchemaGraphRequest)(nil), // 168: vtctldata.RebuildVSchemaGraphRequest + (*RebuildVSchemaGraphResponse)(nil), // 169: vtctldata.RebuildVSchemaGraphResponse + (*RefreshStateRequest)(nil), // 170: vtctldata.RefreshStateRequest + (*RefreshStateResponse)(nil), // 171: vtctldata.RefreshStateResponse + (*RefreshStateByShardRequest)(nil), // 172: vtctldata.RefreshStateByShardRequest + (*RefreshStateByShardResponse)(nil), // 173: vtctldata.RefreshStateByShardResponse + (*ReloadSchemaRequest)(nil), // 174: vtctldata.ReloadSchemaRequest + (*ReloadSchemaResponse)(nil), // 175: vtctldata.ReloadSchemaResponse + (*ReloadSchemaKeyspaceRequest)(nil), // 176: vtctldata.ReloadSchemaKeyspaceRequest + (*ReloadSchemaKeyspaceResponse)(nil), // 177: vtctldata.ReloadSchemaKeyspaceResponse + (*ReloadSchemaShardRequest)(nil), // 178: vtctldata.ReloadSchemaShardRequest + (*ReloadSchemaShardResponse)(nil), // 179: vtctldata.ReloadSchemaShardResponse + (*RemoveBackupRequest)(nil), // 180: vtctldata.RemoveBackupRequest + (*RemoveBackupResponse)(nil), // 181: vtctldata.RemoveBackupResponse + (*RemoveKeyspaceCellRequest)(nil), // 182: vtctldata.RemoveKeyspaceCellRequest + (*RemoveKeyspaceCellResponse)(nil), // 183: vtctldata.RemoveKeyspaceCellResponse + (*RemoveShardCellRequest)(nil), // 184: vtctldata.RemoveShardCellRequest + (*RemoveShardCellResponse)(nil), // 185: vtctldata.RemoveShardCellResponse + (*ReparentTabletRequest)(nil), // 186: vtctldata.ReparentTabletRequest + (*ReparentTabletResponse)(nil), // 187: vtctldata.ReparentTabletResponse + (*ReshardCreateRequest)(nil), // 188: vtctldata.ReshardCreateRequest + (*RestoreFromBackupRequest)(nil), // 189: vtctldata.RestoreFromBackupRequest + (*RestoreFromBackupResponse)(nil), // 190: vtctldata.RestoreFromBackupResponse + (*RetrySchemaMigrationRequest)(nil), // 191: vtctldata.RetrySchemaMigrationRequest + (*RetrySchemaMigrationResponse)(nil), // 192: vtctldata.RetrySchemaMigrationResponse + (*RunHealthCheckRequest)(nil), // 193: vtctldata.RunHealthCheckRequest + (*RunHealthCheckResponse)(nil), // 194: vtctldata.RunHealthCheckResponse + (*SetKeyspaceDurabilityPolicyRequest)(nil), // 195: vtctldata.SetKeyspaceDurabilityPolicyRequest + (*SetKeyspaceDurabilityPolicyResponse)(nil), // 196: vtctldata.SetKeyspaceDurabilityPolicyResponse + (*SetKeyspaceShardingInfoRequest)(nil), // 197: vtctldata.SetKeyspaceShardingInfoRequest + (*SetKeyspaceShardingInfoResponse)(nil), // 198: vtctldata.SetKeyspaceShardingInfoResponse + (*SetShardIsPrimaryServingRequest)(nil), // 199: vtctldata.SetShardIsPrimaryServingRequest + (*SetShardIsPrimaryServingResponse)(nil), // 200: vtctldata.SetShardIsPrimaryServingResponse + (*SetShardTabletControlRequest)(nil), // 201: vtctldata.SetShardTabletControlRequest + (*SetShardTabletControlResponse)(nil), // 202: vtctldata.SetShardTabletControlResponse + (*SetWritableRequest)(nil), // 203: vtctldata.SetWritableRequest + (*SetWritableResponse)(nil), // 204: vtctldata.SetWritableResponse + (*ShardReplicationAddRequest)(nil), // 205: vtctldata.ShardReplicationAddRequest + (*ShardReplicationAddResponse)(nil), // 206: vtctldata.ShardReplicationAddResponse + (*ShardReplicationFixRequest)(nil), // 207: vtctldata.ShardReplicationFixRequest + (*ShardReplicationFixResponse)(nil), // 208: vtctldata.ShardReplicationFixResponse + (*ShardReplicationPositionsRequest)(nil), // 209: vtctldata.ShardReplicationPositionsRequest + (*ShardReplicationPositionsResponse)(nil), // 210: vtctldata.ShardReplicationPositionsResponse + (*ShardReplicationRemoveRequest)(nil), // 211: vtctldata.ShardReplicationRemoveRequest + (*ShardReplicationRemoveResponse)(nil), // 212: vtctldata.ShardReplicationRemoveResponse + (*SleepTabletRequest)(nil), // 213: vtctldata.SleepTabletRequest + (*SleepTabletResponse)(nil), // 214: vtctldata.SleepTabletResponse + (*SourceShardAddRequest)(nil), // 215: vtctldata.SourceShardAddRequest + (*SourceShardAddResponse)(nil), // 216: vtctldata.SourceShardAddResponse + (*SourceShardDeleteRequest)(nil), // 217: vtctldata.SourceShardDeleteRequest + (*SourceShardDeleteResponse)(nil), // 218: vtctldata.SourceShardDeleteResponse + (*StartReplicationRequest)(nil), // 219: vtctldata.StartReplicationRequest + (*StartReplicationResponse)(nil), // 220: vtctldata.StartReplicationResponse + (*StopReplicationRequest)(nil), // 221: vtctldata.StopReplicationRequest + (*StopReplicationResponse)(nil), // 222: vtctldata.StopReplicationResponse + (*TabletExternallyReparentedRequest)(nil), // 223: vtctldata.TabletExternallyReparentedRequest + (*TabletExternallyReparentedResponse)(nil), // 224: vtctldata.TabletExternallyReparentedResponse + (*UpdateCellInfoRequest)(nil), // 225: vtctldata.UpdateCellInfoRequest + (*UpdateCellInfoResponse)(nil), // 226: vtctldata.UpdateCellInfoResponse + (*UpdateCellsAliasRequest)(nil), // 227: vtctldata.UpdateCellsAliasRequest + (*UpdateCellsAliasResponse)(nil), // 228: vtctldata.UpdateCellsAliasResponse + (*ValidateRequest)(nil), // 229: vtctldata.ValidateRequest + (*ValidateResponse)(nil), // 230: vtctldata.ValidateResponse + (*ValidateKeyspaceRequest)(nil), // 231: vtctldata.ValidateKeyspaceRequest + (*ValidateKeyspaceResponse)(nil), // 232: vtctldata.ValidateKeyspaceResponse + (*ValidatePermissionsKeyspaceRequest)(nil), // 233: vtctldata.ValidatePermissionsKeyspaceRequest + (*ValidatePermissionsKeyspaceResponse)(nil), // 234: vtctldata.ValidatePermissionsKeyspaceResponse + (*ValidateSchemaKeyspaceRequest)(nil), // 235: vtctldata.ValidateSchemaKeyspaceRequest + (*ValidateSchemaKeyspaceResponse)(nil), // 236: vtctldata.ValidateSchemaKeyspaceResponse + (*ValidateShardRequest)(nil), // 237: vtctldata.ValidateShardRequest + (*ValidateShardResponse)(nil), // 238: vtctldata.ValidateShardResponse + (*ValidateVersionKeyspaceRequest)(nil), // 239: vtctldata.ValidateVersionKeyspaceRequest + (*ValidateVersionKeyspaceResponse)(nil), // 240: vtctldata.ValidateVersionKeyspaceResponse + (*ValidateVersionShardRequest)(nil), // 241: vtctldata.ValidateVersionShardRequest + (*ValidateVersionShardResponse)(nil), // 242: vtctldata.ValidateVersionShardResponse + (*ValidateVSchemaRequest)(nil), // 243: vtctldata.ValidateVSchemaRequest + (*ValidateVSchemaResponse)(nil), // 244: vtctldata.ValidateVSchemaResponse + (*VDiffCreateRequest)(nil), // 245: vtctldata.VDiffCreateRequest + (*VDiffCreateResponse)(nil), // 246: vtctldata.VDiffCreateResponse + (*VDiffDeleteRequest)(nil), // 247: vtctldata.VDiffDeleteRequest + (*VDiffDeleteResponse)(nil), // 248: vtctldata.VDiffDeleteResponse + (*VDiffResumeRequest)(nil), // 249: vtctldata.VDiffResumeRequest + (*VDiffResumeResponse)(nil), // 250: vtctldata.VDiffResumeResponse + (*VDiffShowRequest)(nil), // 251: vtctldata.VDiffShowRequest + (*VDiffShowResponse)(nil), // 252: vtctldata.VDiffShowResponse + (*VDiffStopRequest)(nil), // 253: vtctldata.VDiffStopRequest + (*VDiffStopResponse)(nil), // 254: vtctldata.VDiffStopResponse + (*WorkflowDeleteRequest)(nil), // 255: vtctldata.WorkflowDeleteRequest + (*WorkflowDeleteResponse)(nil), // 256: vtctldata.WorkflowDeleteResponse + (*WorkflowStatusRequest)(nil), // 257: vtctldata.WorkflowStatusRequest + (*WorkflowStatusResponse)(nil), // 258: vtctldata.WorkflowStatusResponse + (*WorkflowSwitchTrafficRequest)(nil), // 259: vtctldata.WorkflowSwitchTrafficRequest + (*WorkflowSwitchTrafficResponse)(nil), // 260: vtctldata.WorkflowSwitchTrafficResponse + (*WorkflowUpdateRequest)(nil), // 261: vtctldata.WorkflowUpdateRequest + (*WorkflowUpdateResponse)(nil), // 262: vtctldata.WorkflowUpdateResponse + (*GetMirrorRulesRequest)(nil), // 263: vtctldata.GetMirrorRulesRequest + (*GetMirrorRulesResponse)(nil), // 264: vtctldata.GetMirrorRulesResponse + (*WorkflowMirrorTrafficRequest)(nil), // 265: vtctldata.WorkflowMirrorTrafficRequest + (*WorkflowMirrorTrafficResponse)(nil), // 266: vtctldata.WorkflowMirrorTrafficResponse + nil, // 267: vtctldata.WorkflowOptions.ConfigEntry + nil, // 268: vtctldata.Workflow.ShardStreamsEntry + (*Workflow_ReplicationLocation)(nil), // 269: vtctldata.Workflow.ReplicationLocation + (*Workflow_ShardStream)(nil), // 270: vtctldata.Workflow.ShardStream + (*Workflow_Stream)(nil), // 271: vtctldata.Workflow.Stream + (*Workflow_Stream_CopyState)(nil), // 272: vtctldata.Workflow.Stream.CopyState + (*Workflow_Stream_Log)(nil), // 273: vtctldata.Workflow.Stream.Log + (*Workflow_Stream_ThrottlerStatus)(nil), // 274: vtctldata.Workflow.Stream.ThrottlerStatus + nil, // 275: vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry + nil, // 276: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry + (*ApplyVSchemaResponse_ParamList)(nil), // 277: vtctldata.ApplyVSchemaResponse.ParamList + nil, // 278: vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 279: vtctldata.ChangeTabletTagsRequest.TagsEntry + nil, // 280: vtctldata.ChangeTabletTagsResponse.BeforeTagsEntry + nil, // 281: vtctldata.ChangeTabletTagsResponse.AfterTagsEntry + nil, // 282: vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 283: vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 284: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry + nil, // 285: vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 286: vtctldata.GetCellsAliasesResponse.AliasesEntry + nil, // 287: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry + nil, // 288: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry + (*GetSrvKeyspaceNamesResponse_NameList)(nil), // 289: vtctldata.GetSrvKeyspaceNamesResponse.NameList + nil, // 290: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry + nil, // 291: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry + nil, // 292: vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry + (*MoveTablesCreateResponse_TabletInfo)(nil), // 293: vtctldata.MoveTablesCreateResponse.TabletInfo + nil, // 294: vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 295: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry + nil, // 296: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry + nil, // 297: vtctldata.ValidateResponse.ResultsByKeyspaceEntry + nil, // 298: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry + nil, // 299: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry + nil, // 300: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry + nil, // 301: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry + nil, // 302: vtctldata.VDiffShowResponse.TabletResponsesEntry + (*WorkflowDeleteResponse_TabletInfo)(nil), // 303: vtctldata.WorkflowDeleteResponse.TabletInfo + (*WorkflowStatusResponse_TableCopyState)(nil), // 304: vtctldata.WorkflowStatusResponse.TableCopyState + (*WorkflowStatusResponse_ShardStreamState)(nil), // 305: vtctldata.WorkflowStatusResponse.ShardStreamState + (*WorkflowStatusResponse_ShardStreams)(nil), // 306: vtctldata.WorkflowStatusResponse.ShardStreams + nil, // 307: vtctldata.WorkflowStatusResponse.TableCopyStateEntry + nil, // 308: vtctldata.WorkflowStatusResponse.ShardStreamsEntry + (*WorkflowUpdateResponse_TabletInfo)(nil), // 309: vtctldata.WorkflowUpdateResponse.TabletInfo + (*logutil.Event)(nil), // 310: logutil.Event + (tabletmanagerdata.TabletSelectionPreference)(0), // 311: tabletmanagerdata.TabletSelectionPreference + (*topodata.Keyspace)(nil), // 312: topodata.Keyspace + (*vttime.Time)(nil), // 313: vttime.Time + (*topodata.TabletAlias)(nil), // 314: topodata.TabletAlias + (*vttime.Duration)(nil), // 315: vttime.Duration + (*topodata.Shard)(nil), // 316: topodata.Shard + (*topodata.CellInfo)(nil), // 317: topodata.CellInfo + (*vschema.KeyspaceRoutingRules)(nil), // 318: vschema.KeyspaceRoutingRules + (*vschema.RoutingRules)(nil), // 319: vschema.RoutingRules + (*vschema.ShardRoutingRules)(nil), // 320: vschema.ShardRoutingRules + (*vtrpc.CallerID)(nil), // 321: vtrpc.CallerID + (*vschema.Keyspace)(nil), // 322: vschema.Keyspace + (topodata.TabletType)(0), // 323: topodata.TabletType + (*topodata.Tablet)(nil), // 324: topodata.Tablet + (*tabletmanagerdata.CheckThrottlerResponse)(nil), // 325: tabletmanagerdata.CheckThrottlerResponse + (topodata.KeyspaceType)(0), // 326: topodata.KeyspaceType + (*query.QueryResult)(nil), // 327: query.QueryResult + (*tabletmanagerdata.ExecuteHookRequest)(nil), // 328: tabletmanagerdata.ExecuteHookRequest + (*tabletmanagerdata.ExecuteHookResponse)(nil), // 329: tabletmanagerdata.ExecuteHookResponse + (*mysqlctl.BackupInfo)(nil), // 330: mysqlctl.BackupInfo + (*replicationdata.FullStatus)(nil), // 331: replicationdata.FullStatus + (*tabletmanagerdata.Permissions)(nil), // 332: tabletmanagerdata.Permissions + (*tabletmanagerdata.SchemaDefinition)(nil), // 333: tabletmanagerdata.SchemaDefinition + (*topodata.ThrottledAppRule)(nil), // 334: topodata.ThrottledAppRule + (*vschema.SrvVSchema)(nil), // 335: vschema.SrvVSchema + (*tabletmanagerdata.GetThrottlerStatusResponse)(nil), // 336: tabletmanagerdata.GetThrottlerStatusResponse + (*query.TransactionMetadata)(nil), // 337: query.TransactionMetadata + (*query.Target)(nil), // 338: query.Target + (*topodata.ShardReplicationError)(nil), // 339: topodata.ShardReplicationError + (*topodata.KeyRange)(nil), // 340: topodata.KeyRange + (*topodata.CellsAlias)(nil), // 341: topodata.CellsAlias + (*tabletmanagerdata.UpdateVReplicationWorkflowRequest)(nil), // 342: tabletmanagerdata.UpdateVReplicationWorkflowRequest + (*vschema.MirrorRules)(nil), // 343: vschema.MirrorRules + (*topodata.Shard_TabletControl)(nil), // 344: topodata.Shard.TabletControl + (*binlogdata.BinlogSource)(nil), // 345: binlogdata.BinlogSource + (*topodata.ShardReplication)(nil), // 346: topodata.ShardReplication + (*topodata.SrvKeyspace)(nil), // 347: topodata.SrvKeyspace + (*replicationdata.Status)(nil), // 348: replicationdata.Status + (*tabletmanagerdata.VDiffResponse)(nil), // 349: tabletmanagerdata.VDiffResponse } var file_vtctldata_proto_depIdxs = []int32{ - 306, // 0: vtctldata.ExecuteVtctlCommandResponse.event:type_name -> logutil.Event + 310, // 0: vtctldata.ExecuteVtctlCommandResponse.event:type_name -> logutil.Event 7, // 1: vtctldata.MaterializeSettings.table_settings:type_name -> vtctldata.TableMaterializeSettings 0, // 2: vtctldata.MaterializeSettings.materialization_intent:type_name -> vtctldata.MaterializationIntent - 307, // 3: vtctldata.MaterializeSettings.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 311, // 3: vtctldata.MaterializeSettings.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference 12, // 4: vtctldata.MaterializeSettings.workflow_options:type_name -> vtctldata.WorkflowOptions - 308, // 5: vtctldata.Keyspace.keyspace:type_name -> topodata.Keyspace + 312, // 5: vtctldata.Keyspace.keyspace:type_name -> topodata.Keyspace 3, // 6: vtctldata.SchemaMigration.strategy:type_name -> vtctldata.SchemaMigration.Strategy - 309, // 7: vtctldata.SchemaMigration.added_at:type_name -> vttime.Time - 309, // 8: vtctldata.SchemaMigration.requested_at:type_name -> vttime.Time - 309, // 9: vtctldata.SchemaMigration.ready_at:type_name -> vttime.Time - 309, // 10: vtctldata.SchemaMigration.started_at:type_name -> vttime.Time - 309, // 11: vtctldata.SchemaMigration.liveness_timestamp:type_name -> vttime.Time - 309, // 12: vtctldata.SchemaMigration.completed_at:type_name -> vttime.Time - 309, // 13: vtctldata.SchemaMigration.cleaned_up_at:type_name -> vttime.Time + 313, // 7: vtctldata.SchemaMigration.added_at:type_name -> vttime.Time + 313, // 8: vtctldata.SchemaMigration.requested_at:type_name -> vttime.Time + 313, // 9: vtctldata.SchemaMigration.ready_at:type_name -> vttime.Time + 313, // 10: vtctldata.SchemaMigration.started_at:type_name -> vttime.Time + 313, // 11: vtctldata.SchemaMigration.liveness_timestamp:type_name -> vttime.Time + 313, // 12: vtctldata.SchemaMigration.completed_at:type_name -> vttime.Time + 313, // 13: vtctldata.SchemaMigration.cleaned_up_at:type_name -> vttime.Time 4, // 14: vtctldata.SchemaMigration.status:type_name -> vtctldata.SchemaMigration.Status - 310, // 15: vtctldata.SchemaMigration.tablet:type_name -> topodata.TabletAlias - 311, // 16: vtctldata.SchemaMigration.artifact_retention:type_name -> vttime.Duration - 309, // 17: vtctldata.SchemaMigration.last_throttled_at:type_name -> vttime.Time - 309, // 18: vtctldata.SchemaMigration.cancelled_at:type_name -> vttime.Time - 309, // 19: vtctldata.SchemaMigration.reviewed_at:type_name -> vttime.Time - 309, // 20: vtctldata.SchemaMigration.ready_to_complete_at:type_name -> vttime.Time - 312, // 21: vtctldata.Shard.shard:type_name -> topodata.Shard + 314, // 15: vtctldata.SchemaMigration.tablet:type_name -> topodata.TabletAlias + 315, // 16: vtctldata.SchemaMigration.artifact_retention:type_name -> vttime.Duration + 313, // 17: vtctldata.SchemaMigration.last_throttled_at:type_name -> vttime.Time + 313, // 18: vtctldata.SchemaMigration.cancelled_at:type_name -> vttime.Time + 313, // 19: vtctldata.SchemaMigration.reviewed_at:type_name -> vttime.Time + 313, // 20: vtctldata.SchemaMigration.ready_to_complete_at:type_name -> vttime.Time + 316, // 21: vtctldata.Shard.shard:type_name -> topodata.Shard 2, // 22: vtctldata.WorkflowOptions.sharded_auto_increment_handling:type_name -> vtctldata.ShardedAutoIncrementHandling - 263, // 23: vtctldata.WorkflowOptions.config:type_name -> vtctldata.WorkflowOptions.ConfigEntry - 265, // 24: vtctldata.Workflow.source:type_name -> vtctldata.Workflow.ReplicationLocation - 265, // 25: vtctldata.Workflow.target:type_name -> vtctldata.Workflow.ReplicationLocation - 264, // 26: vtctldata.Workflow.shard_streams:type_name -> vtctldata.Workflow.ShardStreamsEntry + 267, // 23: vtctldata.WorkflowOptions.config:type_name -> vtctldata.WorkflowOptions.ConfigEntry + 269, // 24: vtctldata.Workflow.source:type_name -> vtctldata.Workflow.ReplicationLocation + 269, // 25: vtctldata.Workflow.target:type_name -> vtctldata.Workflow.ReplicationLocation + 268, // 26: vtctldata.Workflow.shard_streams:type_name -> vtctldata.Workflow.ShardStreamsEntry 12, // 27: vtctldata.Workflow.options:type_name -> vtctldata.WorkflowOptions - 313, // 28: vtctldata.AddCellInfoRequest.cell_info:type_name -> topodata.CellInfo - 314, // 29: vtctldata.ApplyKeyspaceRoutingRulesRequest.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules - 314, // 30: vtctldata.ApplyKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules - 315, // 31: vtctldata.ApplyRoutingRulesRequest.routing_rules:type_name -> vschema.RoutingRules - 316, // 32: vtctldata.ApplyShardRoutingRulesRequest.shard_routing_rules:type_name -> vschema.ShardRoutingRules - 311, // 33: vtctldata.ApplySchemaRequest.wait_replicas_timeout:type_name -> vttime.Duration - 317, // 34: vtctldata.ApplySchemaRequest.caller_id:type_name -> vtrpc.CallerID - 271, // 35: vtctldata.ApplySchemaResponse.rows_affected_by_shard:type_name -> vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry - 318, // 36: vtctldata.ApplyVSchemaRequest.v_schema:type_name -> vschema.Keyspace - 318, // 37: vtctldata.ApplyVSchemaResponse.v_schema:type_name -> vschema.Keyspace - 272, // 38: vtctldata.ApplyVSchemaResponse.unknown_vindex_params:type_name -> vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry - 310, // 39: vtctldata.BackupRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 40: vtctldata.BackupResponse.tablet_alias:type_name -> topodata.TabletAlias - 306, // 41: vtctldata.BackupResponse.event:type_name -> logutil.Event - 274, // 42: vtctldata.CancelSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry - 310, // 43: vtctldata.ChangeTabletTagsRequest.tablet_alias:type_name -> topodata.TabletAlias - 275, // 44: vtctldata.ChangeTabletTagsRequest.tags:type_name -> vtctldata.ChangeTabletTagsRequest.TagsEntry - 276, // 45: vtctldata.ChangeTabletTagsResponse.before_tags:type_name -> vtctldata.ChangeTabletTagsResponse.BeforeTagsEntry - 277, // 46: vtctldata.ChangeTabletTagsResponse.after_tags:type_name -> vtctldata.ChangeTabletTagsResponse.AfterTagsEntry - 310, // 47: vtctldata.ChangeTabletTypeRequest.tablet_alias:type_name -> topodata.TabletAlias - 319, // 48: vtctldata.ChangeTabletTypeRequest.db_type:type_name -> topodata.TabletType - 320, // 49: vtctldata.ChangeTabletTypeResponse.before_tablet:type_name -> topodata.Tablet - 320, // 50: vtctldata.ChangeTabletTypeResponse.after_tablet:type_name -> topodata.Tablet - 310, // 51: vtctldata.CheckThrottlerRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 52: vtctldata.CheckThrottlerResponse.tablet_alias:type_name -> topodata.TabletAlias - 321, // 53: vtctldata.CheckThrottlerResponse.Check:type_name -> tabletmanagerdata.CheckThrottlerResponse - 278, // 54: vtctldata.CleanupSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry - 279, // 55: vtctldata.CompleteSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry - 322, // 56: vtctldata.CreateKeyspaceRequest.type:type_name -> topodata.KeyspaceType - 309, // 57: vtctldata.CreateKeyspaceRequest.snapshot_time:type_name -> vttime.Time - 9, // 58: vtctldata.CreateKeyspaceResponse.keyspace:type_name -> vtctldata.Keyspace - 9, // 59: vtctldata.CreateShardResponse.keyspace:type_name -> vtctldata.Keyspace - 11, // 60: vtctldata.CreateShardResponse.shard:type_name -> vtctldata.Shard - 11, // 61: vtctldata.DeleteShardsRequest.shards:type_name -> vtctldata.Shard - 310, // 62: vtctldata.DeleteTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias - 310, // 63: vtctldata.EmergencyReparentShardRequest.new_primary:type_name -> topodata.TabletAlias - 310, // 64: vtctldata.EmergencyReparentShardRequest.ignore_replicas:type_name -> topodata.TabletAlias - 311, // 65: vtctldata.EmergencyReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration - 310, // 66: vtctldata.EmergencyReparentShardRequest.expected_primary:type_name -> topodata.TabletAlias - 310, // 67: vtctldata.EmergencyReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias - 306, // 68: vtctldata.EmergencyReparentShardResponse.events:type_name -> logutil.Event - 310, // 69: vtctldata.ExecuteFetchAsAppRequest.tablet_alias:type_name -> topodata.TabletAlias - 323, // 70: vtctldata.ExecuteFetchAsAppResponse.result:type_name -> query.QueryResult - 310, // 71: vtctldata.ExecuteFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias - 323, // 72: vtctldata.ExecuteFetchAsDBAResponse.result:type_name -> query.QueryResult - 310, // 73: vtctldata.ExecuteHookRequest.tablet_alias:type_name -> topodata.TabletAlias - 324, // 74: vtctldata.ExecuteHookRequest.tablet_hook_request:type_name -> tabletmanagerdata.ExecuteHookRequest - 325, // 75: vtctldata.ExecuteHookResponse.hook_result:type_name -> tabletmanagerdata.ExecuteHookResponse - 310, // 76: vtctldata.ExecuteMultiFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias - 323, // 77: vtctldata.ExecuteMultiFetchAsDBAResponse.results:type_name -> query.QueryResult - 280, // 78: vtctldata.FindAllShardsInKeyspaceResponse.shards:type_name -> vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry - 281, // 79: vtctldata.ForceCutOverSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry - 326, // 80: vtctldata.GetBackupsResponse.backups:type_name -> mysqlctl.BackupInfo - 313, // 81: vtctldata.GetCellInfoResponse.cell_info:type_name -> topodata.CellInfo - 282, // 82: vtctldata.GetCellsAliasesResponse.aliases:type_name -> vtctldata.GetCellsAliasesResponse.AliasesEntry - 310, // 83: vtctldata.GetFullStatusRequest.tablet_alias:type_name -> topodata.TabletAlias - 327, // 84: vtctldata.GetFullStatusResponse.status:type_name -> replicationdata.FullStatus - 9, // 85: vtctldata.GetKeyspacesResponse.keyspaces:type_name -> vtctldata.Keyspace - 9, // 86: vtctldata.GetKeyspaceResponse.keyspace:type_name -> vtctldata.Keyspace - 310, // 87: vtctldata.GetPermissionsRequest.tablet_alias:type_name -> topodata.TabletAlias - 328, // 88: vtctldata.GetPermissionsResponse.permissions:type_name -> tabletmanagerdata.Permissions - 314, // 89: vtctldata.GetKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules - 315, // 90: vtctldata.GetRoutingRulesResponse.routing_rules:type_name -> vschema.RoutingRules - 310, // 91: vtctldata.GetSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias - 329, // 92: vtctldata.GetSchemaResponse.schema:type_name -> tabletmanagerdata.SchemaDefinition - 4, // 93: vtctldata.GetSchemaMigrationsRequest.status:type_name -> vtctldata.SchemaMigration.Status - 311, // 94: vtctldata.GetSchemaMigrationsRequest.recent:type_name -> vttime.Duration - 1, // 95: vtctldata.GetSchemaMigrationsRequest.order:type_name -> vtctldata.QueryOrdering - 10, // 96: vtctldata.GetSchemaMigrationsResponse.migrations:type_name -> vtctldata.SchemaMigration - 283, // 97: vtctldata.GetShardReplicationResponse.shard_replication_by_cell:type_name -> vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry - 11, // 98: vtctldata.GetShardResponse.shard:type_name -> vtctldata.Shard - 316, // 99: vtctldata.GetShardRoutingRulesResponse.shard_routing_rules:type_name -> vschema.ShardRoutingRules - 284, // 100: vtctldata.GetSrvKeyspaceNamesResponse.names:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry - 286, // 101: vtctldata.GetSrvKeyspacesResponse.srv_keyspaces:type_name -> vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry - 330, // 102: vtctldata.UpdateThrottlerConfigRequest.throttled_app:type_name -> topodata.ThrottledAppRule - 331, // 103: vtctldata.GetSrvVSchemaResponse.srv_v_schema:type_name -> vschema.SrvVSchema - 287, // 104: vtctldata.GetSrvVSchemasResponse.srv_v_schemas:type_name -> vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry - 310, // 105: vtctldata.GetTabletRequest.tablet_alias:type_name -> topodata.TabletAlias - 320, // 106: vtctldata.GetTabletResponse.tablet:type_name -> topodata.Tablet - 310, // 107: vtctldata.GetTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias - 319, // 108: vtctldata.GetTabletsRequest.tablet_type:type_name -> topodata.TabletType - 320, // 109: vtctldata.GetTabletsResponse.tablets:type_name -> topodata.Tablet - 310, // 110: vtctldata.GetThrottlerStatusRequest.tablet_alias:type_name -> topodata.TabletAlias - 332, // 111: vtctldata.GetThrottlerStatusResponse.status:type_name -> tabletmanagerdata.GetThrottlerStatusResponse - 121, // 112: vtctldata.GetTopologyPathResponse.cell:type_name -> vtctldata.TopologyCell - 333, // 113: vtctldata.GetUnresolvedTransactionsResponse.transactions:type_name -> query.TransactionMetadata - 333, // 114: vtctldata.GetTransactionInfoResponse.metadata:type_name -> query.TransactionMetadata - 125, // 115: vtctldata.GetTransactionInfoResponse.shard_states:type_name -> vtctldata.ShardTransactionState - 334, // 116: vtctldata.ConcludeTransactionRequest.participants:type_name -> query.Target - 310, // 117: vtctldata.GetVersionRequest.tablet_alias:type_name -> topodata.TabletAlias - 318, // 118: vtctldata.GetVSchemaResponse.v_schema:type_name -> vschema.Keyspace - 13, // 119: vtctldata.GetWorkflowsResponse.workflows:type_name -> vtctldata.Workflow - 310, // 120: vtctldata.InitShardPrimaryRequest.primary_elect_tablet_alias:type_name -> topodata.TabletAlias - 311, // 121: vtctldata.InitShardPrimaryRequest.wait_replicas_timeout:type_name -> vttime.Duration - 306, // 122: vtctldata.InitShardPrimaryResponse.events:type_name -> logutil.Event - 288, // 123: vtctldata.LaunchSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry - 318, // 124: vtctldata.LookupVindexCreateRequest.vindex:type_name -> vschema.Keyspace - 319, // 125: vtctldata.LookupVindexCreateRequest.tablet_types:type_name -> topodata.TabletType - 307, // 126: vtctldata.LookupVindexCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 8, // 127: vtctldata.MaterializeCreateRequest.settings:type_name -> vtctldata.MaterializeSettings - 319, // 128: vtctldata.MigrateCreateRequest.tablet_types:type_name -> topodata.TabletType - 307, // 129: vtctldata.MigrateCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 319, // 130: vtctldata.MoveTablesCreateRequest.tablet_types:type_name -> topodata.TabletType - 307, // 131: vtctldata.MoveTablesCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 12, // 132: vtctldata.MoveTablesCreateRequest.workflow_options:type_name -> vtctldata.WorkflowOptions - 289, // 133: vtctldata.MoveTablesCreateResponse.details:type_name -> vtctldata.MoveTablesCreateResponse.TabletInfo - 310, // 134: vtctldata.PingTabletRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 135: vtctldata.PlannedReparentShardRequest.new_primary:type_name -> topodata.TabletAlias - 310, // 136: vtctldata.PlannedReparentShardRequest.avoid_primary:type_name -> topodata.TabletAlias - 311, // 137: vtctldata.PlannedReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration - 311, // 138: vtctldata.PlannedReparentShardRequest.tolerable_replication_lag:type_name -> vttime.Duration - 310, // 139: vtctldata.PlannedReparentShardRequest.expected_primary:type_name -> topodata.TabletAlias - 310, // 140: vtctldata.PlannedReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias - 306, // 141: vtctldata.PlannedReparentShardResponse.events:type_name -> logutil.Event - 310, // 142: vtctldata.RefreshStateRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 143: vtctldata.ReloadSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias - 306, // 144: vtctldata.ReloadSchemaKeyspaceResponse.events:type_name -> logutil.Event - 306, // 145: vtctldata.ReloadSchemaShardResponse.events:type_name -> logutil.Event - 310, // 146: vtctldata.ReparentTabletRequest.tablet:type_name -> topodata.TabletAlias - 310, // 147: vtctldata.ReparentTabletResponse.primary:type_name -> topodata.TabletAlias - 319, // 148: vtctldata.ReshardCreateRequest.tablet_types:type_name -> topodata.TabletType - 307, // 149: vtctldata.ReshardCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 12, // 150: vtctldata.ReshardCreateRequest.workflow_options:type_name -> vtctldata.WorkflowOptions - 310, // 151: vtctldata.RestoreFromBackupRequest.tablet_alias:type_name -> topodata.TabletAlias - 309, // 152: vtctldata.RestoreFromBackupRequest.backup_time:type_name -> vttime.Time - 309, // 153: vtctldata.RestoreFromBackupRequest.restore_to_timestamp:type_name -> vttime.Time - 310, // 154: vtctldata.RestoreFromBackupResponse.tablet_alias:type_name -> topodata.TabletAlias - 306, // 155: vtctldata.RestoreFromBackupResponse.event:type_name -> logutil.Event - 290, // 156: vtctldata.RetrySchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry - 310, // 157: vtctldata.RunHealthCheckRequest.tablet_alias:type_name -> topodata.TabletAlias - 308, // 158: vtctldata.SetKeyspaceDurabilityPolicyResponse.keyspace:type_name -> topodata.Keyspace - 308, // 159: vtctldata.SetKeyspaceShardingInfoResponse.keyspace:type_name -> topodata.Keyspace - 312, // 160: vtctldata.SetShardIsPrimaryServingResponse.shard:type_name -> topodata.Shard - 319, // 161: vtctldata.SetShardTabletControlRequest.tablet_type:type_name -> topodata.TabletType - 312, // 162: vtctldata.SetShardTabletControlResponse.shard:type_name -> topodata.Shard - 310, // 163: vtctldata.SetWritableRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 164: vtctldata.ShardReplicationAddRequest.tablet_alias:type_name -> topodata.TabletAlias - 335, // 165: vtctldata.ShardReplicationFixResponse.error:type_name -> topodata.ShardReplicationError - 291, // 166: vtctldata.ShardReplicationPositionsResponse.replication_statuses:type_name -> vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry - 292, // 167: vtctldata.ShardReplicationPositionsResponse.tablet_map:type_name -> vtctldata.ShardReplicationPositionsResponse.TabletMapEntry - 310, // 168: vtctldata.ShardReplicationRemoveRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 169: vtctldata.SleepTabletRequest.tablet_alias:type_name -> topodata.TabletAlias - 311, // 170: vtctldata.SleepTabletRequest.duration:type_name -> vttime.Duration - 336, // 171: vtctldata.SourceShardAddRequest.key_range:type_name -> topodata.KeyRange - 312, // 172: vtctldata.SourceShardAddResponse.shard:type_name -> topodata.Shard - 312, // 173: vtctldata.SourceShardDeleteResponse.shard:type_name -> topodata.Shard - 310, // 174: vtctldata.StartReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 175: vtctldata.StopReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 176: vtctldata.TabletExternallyReparentedRequest.tablet:type_name -> topodata.TabletAlias - 310, // 177: vtctldata.TabletExternallyReparentedResponse.new_primary:type_name -> topodata.TabletAlias - 310, // 178: vtctldata.TabletExternallyReparentedResponse.old_primary:type_name -> topodata.TabletAlias - 313, // 179: vtctldata.UpdateCellInfoRequest.cell_info:type_name -> topodata.CellInfo - 313, // 180: vtctldata.UpdateCellInfoResponse.cell_info:type_name -> topodata.CellInfo - 337, // 181: vtctldata.UpdateCellsAliasRequest.cells_alias:type_name -> topodata.CellsAlias - 337, // 182: vtctldata.UpdateCellsAliasResponse.cells_alias:type_name -> topodata.CellsAlias - 293, // 183: vtctldata.ValidateResponse.results_by_keyspace:type_name -> vtctldata.ValidateResponse.ResultsByKeyspaceEntry - 294, // 184: vtctldata.ValidateKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry - 295, // 185: vtctldata.ValidateSchemaKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry - 296, // 186: vtctldata.ValidateVersionKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry - 297, // 187: vtctldata.ValidateVSchemaResponse.results_by_shard:type_name -> vtctldata.ValidateVSchemaResponse.ResultsByShardEntry - 319, // 188: vtctldata.VDiffCreateRequest.tablet_types:type_name -> topodata.TabletType - 307, // 189: vtctldata.VDiffCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 311, // 190: vtctldata.VDiffCreateRequest.filtered_replication_wait_time:type_name -> vttime.Duration - 311, // 191: vtctldata.VDiffCreateRequest.wait_update_interval:type_name -> vttime.Duration - 311, // 192: vtctldata.VDiffCreateRequest.max_diff_duration:type_name -> vttime.Duration - 298, // 193: vtctldata.VDiffShowResponse.tablet_responses:type_name -> vtctldata.VDiffShowResponse.TabletResponsesEntry - 299, // 194: vtctldata.WorkflowDeleteResponse.details:type_name -> vtctldata.WorkflowDeleteResponse.TabletInfo - 303, // 195: vtctldata.WorkflowStatusResponse.table_copy_state:type_name -> vtctldata.WorkflowStatusResponse.TableCopyStateEntry - 304, // 196: vtctldata.WorkflowStatusResponse.shard_streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamsEntry - 319, // 197: vtctldata.WorkflowSwitchTrafficRequest.tablet_types:type_name -> topodata.TabletType - 311, // 198: vtctldata.WorkflowSwitchTrafficRequest.max_replication_lag_allowed:type_name -> vttime.Duration - 311, // 199: vtctldata.WorkflowSwitchTrafficRequest.timeout:type_name -> vttime.Duration - 338, // 200: vtctldata.WorkflowUpdateRequest.tablet_request:type_name -> tabletmanagerdata.UpdateVReplicationWorkflowRequest - 305, // 201: vtctldata.WorkflowUpdateResponse.details:type_name -> vtctldata.WorkflowUpdateResponse.TabletInfo - 339, // 202: vtctldata.GetMirrorRulesResponse.mirror_rules:type_name -> vschema.MirrorRules - 319, // 203: vtctldata.WorkflowMirrorTrafficRequest.tablet_types:type_name -> topodata.TabletType - 266, // 204: vtctldata.Workflow.ShardStreamsEntry.value:type_name -> vtctldata.Workflow.ShardStream - 267, // 205: vtctldata.Workflow.ShardStream.streams:type_name -> vtctldata.Workflow.Stream - 340, // 206: vtctldata.Workflow.ShardStream.tablet_controls:type_name -> topodata.Shard.TabletControl - 310, // 207: vtctldata.Workflow.Stream.tablet:type_name -> topodata.TabletAlias - 341, // 208: vtctldata.Workflow.Stream.binlog_source:type_name -> binlogdata.BinlogSource - 309, // 209: vtctldata.Workflow.Stream.transaction_timestamp:type_name -> vttime.Time - 309, // 210: vtctldata.Workflow.Stream.time_updated:type_name -> vttime.Time - 268, // 211: vtctldata.Workflow.Stream.copy_states:type_name -> vtctldata.Workflow.Stream.CopyState - 269, // 212: vtctldata.Workflow.Stream.logs:type_name -> vtctldata.Workflow.Stream.Log - 270, // 213: vtctldata.Workflow.Stream.throttler_status:type_name -> vtctldata.Workflow.Stream.ThrottlerStatus - 319, // 214: vtctldata.Workflow.Stream.tablet_types:type_name -> topodata.TabletType - 307, // 215: vtctldata.Workflow.Stream.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 309, // 216: vtctldata.Workflow.Stream.Log.created_at:type_name -> vttime.Time - 309, // 217: vtctldata.Workflow.Stream.Log.updated_at:type_name -> vttime.Time - 309, // 218: vtctldata.Workflow.Stream.ThrottlerStatus.time_throttled:type_name -> vttime.Time - 273, // 219: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry.value:type_name -> vtctldata.ApplyVSchemaResponse.ParamList - 11, // 220: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry.value:type_name -> vtctldata.Shard - 337, // 221: vtctldata.GetCellsAliasesResponse.AliasesEntry.value:type_name -> topodata.CellsAlias - 342, // 222: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry.value:type_name -> topodata.ShardReplication - 285, // 223: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry.value:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NameList - 343, // 224: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry.value:type_name -> topodata.SrvKeyspace - 331, // 225: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry.value:type_name -> vschema.SrvVSchema - 310, // 226: vtctldata.MoveTablesCreateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias - 344, // 227: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry.value:type_name -> replicationdata.Status - 320, // 228: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry.value:type_name -> topodata.Tablet - 230, // 229: vtctldata.ValidateResponse.ResultsByKeyspaceEntry.value:type_name -> vtctldata.ValidateKeyspaceResponse - 234, // 230: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 234, // 231: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 234, // 232: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 234, // 233: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 345, // 234: vtctldata.VDiffShowResponse.TabletResponsesEntry.value:type_name -> tabletmanagerdata.VDiffResponse - 310, // 235: vtctldata.WorkflowDeleteResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias - 310, // 236: vtctldata.WorkflowStatusResponse.ShardStreamState.tablet:type_name -> topodata.TabletAlias - 301, // 237: vtctldata.WorkflowStatusResponse.ShardStreams.streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamState - 300, // 238: vtctldata.WorkflowStatusResponse.TableCopyStateEntry.value:type_name -> vtctldata.WorkflowStatusResponse.TableCopyState - 302, // 239: vtctldata.WorkflowStatusResponse.ShardStreamsEntry.value:type_name -> vtctldata.WorkflowStatusResponse.ShardStreams - 310, // 240: vtctldata.WorkflowUpdateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias - 241, // [241:241] is the sub-list for method output_type - 241, // [241:241] is the sub-list for method input_type - 241, // [241:241] is the sub-list for extension type_name - 241, // [241:241] is the sub-list for extension extendee - 0, // [0:241] is the sub-list for field type_name + 317, // 28: vtctldata.AddCellInfoRequest.cell_info:type_name -> topodata.CellInfo + 318, // 29: vtctldata.ApplyKeyspaceRoutingRulesRequest.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules + 318, // 30: vtctldata.ApplyKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules + 319, // 31: vtctldata.ApplyRoutingRulesRequest.routing_rules:type_name -> vschema.RoutingRules + 320, // 32: vtctldata.ApplyShardRoutingRulesRequest.shard_routing_rules:type_name -> vschema.ShardRoutingRules + 315, // 33: vtctldata.ApplySchemaRequest.wait_replicas_timeout:type_name -> vttime.Duration + 321, // 34: vtctldata.ApplySchemaRequest.caller_id:type_name -> vtrpc.CallerID + 275, // 35: vtctldata.ApplySchemaResponse.rows_affected_by_shard:type_name -> vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry + 322, // 36: vtctldata.ApplyVSchemaRequest.v_schema:type_name -> vschema.Keyspace + 322, // 37: vtctldata.ApplyVSchemaResponse.v_schema:type_name -> vschema.Keyspace + 276, // 38: vtctldata.ApplyVSchemaResponse.unknown_vindex_params:type_name -> vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry + 314, // 39: vtctldata.BackupRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 40: vtctldata.BackupResponse.tablet_alias:type_name -> topodata.TabletAlias + 310, // 41: vtctldata.BackupResponse.event:type_name -> logutil.Event + 278, // 42: vtctldata.CancelSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry + 314, // 43: vtctldata.ChangeTabletTagsRequest.tablet_alias:type_name -> topodata.TabletAlias + 279, // 44: vtctldata.ChangeTabletTagsRequest.tags:type_name -> vtctldata.ChangeTabletTagsRequest.TagsEntry + 280, // 45: vtctldata.ChangeTabletTagsResponse.before_tags:type_name -> vtctldata.ChangeTabletTagsResponse.BeforeTagsEntry + 281, // 46: vtctldata.ChangeTabletTagsResponse.after_tags:type_name -> vtctldata.ChangeTabletTagsResponse.AfterTagsEntry + 314, // 47: vtctldata.ChangeTabletTypeRequest.tablet_alias:type_name -> topodata.TabletAlias + 323, // 48: vtctldata.ChangeTabletTypeRequest.db_type:type_name -> topodata.TabletType + 324, // 49: vtctldata.ChangeTabletTypeResponse.before_tablet:type_name -> topodata.Tablet + 324, // 50: vtctldata.ChangeTabletTypeResponse.after_tablet:type_name -> topodata.Tablet + 314, // 51: vtctldata.CheckThrottlerRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 52: vtctldata.CheckThrottlerResponse.tablet_alias:type_name -> topodata.TabletAlias + 325, // 53: vtctldata.CheckThrottlerResponse.Check:type_name -> tabletmanagerdata.CheckThrottlerResponse + 282, // 54: vtctldata.CleanupSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry + 283, // 55: vtctldata.CompleteSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry + 314, // 56: vtctldata.CopySchemaShardRequest.source_tablet_alias:type_name -> topodata.TabletAlias + 315, // 57: vtctldata.CopySchemaShardRequest.wait_replicas_timeout:type_name -> vttime.Duration + 326, // 58: vtctldata.CreateKeyspaceRequest.type:type_name -> topodata.KeyspaceType + 313, // 59: vtctldata.CreateKeyspaceRequest.snapshot_time:type_name -> vttime.Time + 9, // 60: vtctldata.CreateKeyspaceResponse.keyspace:type_name -> vtctldata.Keyspace + 9, // 61: vtctldata.CreateShardResponse.keyspace:type_name -> vtctldata.Keyspace + 11, // 62: vtctldata.CreateShardResponse.shard:type_name -> vtctldata.Shard + 11, // 63: vtctldata.DeleteShardsRequest.shards:type_name -> vtctldata.Shard + 314, // 64: vtctldata.DeleteTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias + 314, // 65: vtctldata.EmergencyReparentShardRequest.new_primary:type_name -> topodata.TabletAlias + 314, // 66: vtctldata.EmergencyReparentShardRequest.ignore_replicas:type_name -> topodata.TabletAlias + 315, // 67: vtctldata.EmergencyReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration + 314, // 68: vtctldata.EmergencyReparentShardRequest.expected_primary:type_name -> topodata.TabletAlias + 314, // 69: vtctldata.EmergencyReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias + 310, // 70: vtctldata.EmergencyReparentShardResponse.events:type_name -> logutil.Event + 314, // 71: vtctldata.ExecuteFetchAsAppRequest.tablet_alias:type_name -> topodata.TabletAlias + 327, // 72: vtctldata.ExecuteFetchAsAppResponse.result:type_name -> query.QueryResult + 314, // 73: vtctldata.ExecuteFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias + 327, // 74: vtctldata.ExecuteFetchAsDBAResponse.result:type_name -> query.QueryResult + 314, // 75: vtctldata.ExecuteHookRequest.tablet_alias:type_name -> topodata.TabletAlias + 328, // 76: vtctldata.ExecuteHookRequest.tablet_hook_request:type_name -> tabletmanagerdata.ExecuteHookRequest + 329, // 77: vtctldata.ExecuteHookResponse.hook_result:type_name -> tabletmanagerdata.ExecuteHookResponse + 314, // 78: vtctldata.ExecuteMultiFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias + 327, // 79: vtctldata.ExecuteMultiFetchAsDBAResponse.results:type_name -> query.QueryResult + 284, // 80: vtctldata.FindAllShardsInKeyspaceResponse.shards:type_name -> vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry + 285, // 81: vtctldata.ForceCutOverSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry + 330, // 82: vtctldata.GetBackupsResponse.backups:type_name -> mysqlctl.BackupInfo + 317, // 83: vtctldata.GetCellInfoResponse.cell_info:type_name -> topodata.CellInfo + 286, // 84: vtctldata.GetCellsAliasesResponse.aliases:type_name -> vtctldata.GetCellsAliasesResponse.AliasesEntry + 314, // 85: vtctldata.GetFullStatusRequest.tablet_alias:type_name -> topodata.TabletAlias + 331, // 86: vtctldata.GetFullStatusResponse.status:type_name -> replicationdata.FullStatus + 9, // 87: vtctldata.GetKeyspacesResponse.keyspaces:type_name -> vtctldata.Keyspace + 9, // 88: vtctldata.GetKeyspaceResponse.keyspace:type_name -> vtctldata.Keyspace + 314, // 89: vtctldata.GetPermissionsRequest.tablet_alias:type_name -> topodata.TabletAlias + 332, // 90: vtctldata.GetPermissionsResponse.permissions:type_name -> tabletmanagerdata.Permissions + 318, // 91: vtctldata.GetKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules + 319, // 92: vtctldata.GetRoutingRulesResponse.routing_rules:type_name -> vschema.RoutingRules + 314, // 93: vtctldata.GetSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias + 333, // 94: vtctldata.GetSchemaResponse.schema:type_name -> tabletmanagerdata.SchemaDefinition + 4, // 95: vtctldata.GetSchemaMigrationsRequest.status:type_name -> vtctldata.SchemaMigration.Status + 315, // 96: vtctldata.GetSchemaMigrationsRequest.recent:type_name -> vttime.Duration + 1, // 97: vtctldata.GetSchemaMigrationsRequest.order:type_name -> vtctldata.QueryOrdering + 10, // 98: vtctldata.GetSchemaMigrationsResponse.migrations:type_name -> vtctldata.SchemaMigration + 287, // 99: vtctldata.GetShardReplicationResponse.shard_replication_by_cell:type_name -> vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry + 11, // 100: vtctldata.GetShardResponse.shard:type_name -> vtctldata.Shard + 320, // 101: vtctldata.GetShardRoutingRulesResponse.shard_routing_rules:type_name -> vschema.ShardRoutingRules + 288, // 102: vtctldata.GetSrvKeyspaceNamesResponse.names:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry + 290, // 103: vtctldata.GetSrvKeyspacesResponse.srv_keyspaces:type_name -> vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry + 334, // 104: vtctldata.UpdateThrottlerConfigRequest.throttled_app:type_name -> topodata.ThrottledAppRule + 335, // 105: vtctldata.GetSrvVSchemaResponse.srv_v_schema:type_name -> vschema.SrvVSchema + 291, // 106: vtctldata.GetSrvVSchemasResponse.srv_v_schemas:type_name -> vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry + 314, // 107: vtctldata.GetTabletRequest.tablet_alias:type_name -> topodata.TabletAlias + 324, // 108: vtctldata.GetTabletResponse.tablet:type_name -> topodata.Tablet + 314, // 109: vtctldata.GetTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias + 323, // 110: vtctldata.GetTabletsRequest.tablet_type:type_name -> topodata.TabletType + 324, // 111: vtctldata.GetTabletsResponse.tablets:type_name -> topodata.Tablet + 314, // 112: vtctldata.GetThrottlerStatusRequest.tablet_alias:type_name -> topodata.TabletAlias + 336, // 113: vtctldata.GetThrottlerStatusResponse.status:type_name -> tabletmanagerdata.GetThrottlerStatusResponse + 123, // 114: vtctldata.GetTopologyPathResponse.cell:type_name -> vtctldata.TopologyCell + 337, // 115: vtctldata.GetUnresolvedTransactionsResponse.transactions:type_name -> query.TransactionMetadata + 337, // 116: vtctldata.GetTransactionInfoResponse.metadata:type_name -> query.TransactionMetadata + 127, // 117: vtctldata.GetTransactionInfoResponse.shard_states:type_name -> vtctldata.ShardTransactionState + 338, // 118: vtctldata.ConcludeTransactionRequest.participants:type_name -> query.Target + 314, // 119: vtctldata.GetVersionRequest.tablet_alias:type_name -> topodata.TabletAlias + 322, // 120: vtctldata.GetVSchemaResponse.v_schema:type_name -> vschema.Keyspace + 13, // 121: vtctldata.GetWorkflowsResponse.workflows:type_name -> vtctldata.Workflow + 314, // 122: vtctldata.InitShardPrimaryRequest.primary_elect_tablet_alias:type_name -> topodata.TabletAlias + 315, // 123: vtctldata.InitShardPrimaryRequest.wait_replicas_timeout:type_name -> vttime.Duration + 310, // 124: vtctldata.InitShardPrimaryResponse.events:type_name -> logutil.Event + 292, // 125: vtctldata.LaunchSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry + 322, // 126: vtctldata.LookupVindexCreateRequest.vindex:type_name -> vschema.Keyspace + 323, // 127: vtctldata.LookupVindexCreateRequest.tablet_types:type_name -> topodata.TabletType + 311, // 128: vtctldata.LookupVindexCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 8, // 129: vtctldata.MaterializeCreateRequest.settings:type_name -> vtctldata.MaterializeSettings + 323, // 130: vtctldata.MigrateCreateRequest.tablet_types:type_name -> topodata.TabletType + 311, // 131: vtctldata.MigrateCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 323, // 132: vtctldata.MoveTablesCreateRequest.tablet_types:type_name -> topodata.TabletType + 311, // 133: vtctldata.MoveTablesCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 12, // 134: vtctldata.MoveTablesCreateRequest.workflow_options:type_name -> vtctldata.WorkflowOptions + 293, // 135: vtctldata.MoveTablesCreateResponse.details:type_name -> vtctldata.MoveTablesCreateResponse.TabletInfo + 314, // 136: vtctldata.PingTabletRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 137: vtctldata.PlannedReparentShardRequest.new_primary:type_name -> topodata.TabletAlias + 314, // 138: vtctldata.PlannedReparentShardRequest.avoid_primary:type_name -> topodata.TabletAlias + 315, // 139: vtctldata.PlannedReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration + 315, // 140: vtctldata.PlannedReparentShardRequest.tolerable_replication_lag:type_name -> vttime.Duration + 314, // 141: vtctldata.PlannedReparentShardRequest.expected_primary:type_name -> topodata.TabletAlias + 314, // 142: vtctldata.PlannedReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias + 310, // 143: vtctldata.PlannedReparentShardResponse.events:type_name -> logutil.Event + 314, // 144: vtctldata.RefreshStateRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 145: vtctldata.ReloadSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias + 310, // 146: vtctldata.ReloadSchemaKeyspaceResponse.events:type_name -> logutil.Event + 310, // 147: vtctldata.ReloadSchemaShardResponse.events:type_name -> logutil.Event + 314, // 148: vtctldata.ReparentTabletRequest.tablet:type_name -> topodata.TabletAlias + 314, // 149: vtctldata.ReparentTabletResponse.primary:type_name -> topodata.TabletAlias + 323, // 150: vtctldata.ReshardCreateRequest.tablet_types:type_name -> topodata.TabletType + 311, // 151: vtctldata.ReshardCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 12, // 152: vtctldata.ReshardCreateRequest.workflow_options:type_name -> vtctldata.WorkflowOptions + 314, // 153: vtctldata.RestoreFromBackupRequest.tablet_alias:type_name -> topodata.TabletAlias + 313, // 154: vtctldata.RestoreFromBackupRequest.backup_time:type_name -> vttime.Time + 313, // 155: vtctldata.RestoreFromBackupRequest.restore_to_timestamp:type_name -> vttime.Time + 314, // 156: vtctldata.RestoreFromBackupResponse.tablet_alias:type_name -> topodata.TabletAlias + 310, // 157: vtctldata.RestoreFromBackupResponse.event:type_name -> logutil.Event + 294, // 158: vtctldata.RetrySchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry + 314, // 159: vtctldata.RunHealthCheckRequest.tablet_alias:type_name -> topodata.TabletAlias + 312, // 160: vtctldata.SetKeyspaceDurabilityPolicyResponse.keyspace:type_name -> topodata.Keyspace + 312, // 161: vtctldata.SetKeyspaceShardingInfoResponse.keyspace:type_name -> topodata.Keyspace + 316, // 162: vtctldata.SetShardIsPrimaryServingResponse.shard:type_name -> topodata.Shard + 323, // 163: vtctldata.SetShardTabletControlRequest.tablet_type:type_name -> topodata.TabletType + 316, // 164: vtctldata.SetShardTabletControlResponse.shard:type_name -> topodata.Shard + 314, // 165: vtctldata.SetWritableRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 166: vtctldata.ShardReplicationAddRequest.tablet_alias:type_name -> topodata.TabletAlias + 339, // 167: vtctldata.ShardReplicationFixResponse.error:type_name -> topodata.ShardReplicationError + 295, // 168: vtctldata.ShardReplicationPositionsResponse.replication_statuses:type_name -> vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry + 296, // 169: vtctldata.ShardReplicationPositionsResponse.tablet_map:type_name -> vtctldata.ShardReplicationPositionsResponse.TabletMapEntry + 314, // 170: vtctldata.ShardReplicationRemoveRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 171: vtctldata.SleepTabletRequest.tablet_alias:type_name -> topodata.TabletAlias + 315, // 172: vtctldata.SleepTabletRequest.duration:type_name -> vttime.Duration + 340, // 173: vtctldata.SourceShardAddRequest.key_range:type_name -> topodata.KeyRange + 316, // 174: vtctldata.SourceShardAddResponse.shard:type_name -> topodata.Shard + 316, // 175: vtctldata.SourceShardDeleteResponse.shard:type_name -> topodata.Shard + 314, // 176: vtctldata.StartReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 177: vtctldata.StopReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 178: vtctldata.TabletExternallyReparentedRequest.tablet:type_name -> topodata.TabletAlias + 314, // 179: vtctldata.TabletExternallyReparentedResponse.new_primary:type_name -> topodata.TabletAlias + 314, // 180: vtctldata.TabletExternallyReparentedResponse.old_primary:type_name -> topodata.TabletAlias + 317, // 181: vtctldata.UpdateCellInfoRequest.cell_info:type_name -> topodata.CellInfo + 317, // 182: vtctldata.UpdateCellInfoResponse.cell_info:type_name -> topodata.CellInfo + 341, // 183: vtctldata.UpdateCellsAliasRequest.cells_alias:type_name -> topodata.CellsAlias + 341, // 184: vtctldata.UpdateCellsAliasResponse.cells_alias:type_name -> topodata.CellsAlias + 297, // 185: vtctldata.ValidateResponse.results_by_keyspace:type_name -> vtctldata.ValidateResponse.ResultsByKeyspaceEntry + 298, // 186: vtctldata.ValidateKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry + 299, // 187: vtctldata.ValidateSchemaKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry + 300, // 188: vtctldata.ValidateVersionKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry + 301, // 189: vtctldata.ValidateVSchemaResponse.results_by_shard:type_name -> vtctldata.ValidateVSchemaResponse.ResultsByShardEntry + 323, // 190: vtctldata.VDiffCreateRequest.tablet_types:type_name -> topodata.TabletType + 311, // 191: vtctldata.VDiffCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 315, // 192: vtctldata.VDiffCreateRequest.filtered_replication_wait_time:type_name -> vttime.Duration + 315, // 193: vtctldata.VDiffCreateRequest.wait_update_interval:type_name -> vttime.Duration + 315, // 194: vtctldata.VDiffCreateRequest.max_diff_duration:type_name -> vttime.Duration + 302, // 195: vtctldata.VDiffShowResponse.tablet_responses:type_name -> vtctldata.VDiffShowResponse.TabletResponsesEntry + 303, // 196: vtctldata.WorkflowDeleteResponse.details:type_name -> vtctldata.WorkflowDeleteResponse.TabletInfo + 307, // 197: vtctldata.WorkflowStatusResponse.table_copy_state:type_name -> vtctldata.WorkflowStatusResponse.TableCopyStateEntry + 308, // 198: vtctldata.WorkflowStatusResponse.shard_streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamsEntry + 323, // 199: vtctldata.WorkflowSwitchTrafficRequest.tablet_types:type_name -> topodata.TabletType + 315, // 200: vtctldata.WorkflowSwitchTrafficRequest.max_replication_lag_allowed:type_name -> vttime.Duration + 315, // 201: vtctldata.WorkflowSwitchTrafficRequest.timeout:type_name -> vttime.Duration + 342, // 202: vtctldata.WorkflowUpdateRequest.tablet_request:type_name -> tabletmanagerdata.UpdateVReplicationWorkflowRequest + 309, // 203: vtctldata.WorkflowUpdateResponse.details:type_name -> vtctldata.WorkflowUpdateResponse.TabletInfo + 343, // 204: vtctldata.GetMirrorRulesResponse.mirror_rules:type_name -> vschema.MirrorRules + 323, // 205: vtctldata.WorkflowMirrorTrafficRequest.tablet_types:type_name -> topodata.TabletType + 270, // 206: vtctldata.Workflow.ShardStreamsEntry.value:type_name -> vtctldata.Workflow.ShardStream + 271, // 207: vtctldata.Workflow.ShardStream.streams:type_name -> vtctldata.Workflow.Stream + 344, // 208: vtctldata.Workflow.ShardStream.tablet_controls:type_name -> topodata.Shard.TabletControl + 314, // 209: vtctldata.Workflow.Stream.tablet:type_name -> topodata.TabletAlias + 345, // 210: vtctldata.Workflow.Stream.binlog_source:type_name -> binlogdata.BinlogSource + 313, // 211: vtctldata.Workflow.Stream.transaction_timestamp:type_name -> vttime.Time + 313, // 212: vtctldata.Workflow.Stream.time_updated:type_name -> vttime.Time + 272, // 213: vtctldata.Workflow.Stream.copy_states:type_name -> vtctldata.Workflow.Stream.CopyState + 273, // 214: vtctldata.Workflow.Stream.logs:type_name -> vtctldata.Workflow.Stream.Log + 274, // 215: vtctldata.Workflow.Stream.throttler_status:type_name -> vtctldata.Workflow.Stream.ThrottlerStatus + 323, // 216: vtctldata.Workflow.Stream.tablet_types:type_name -> topodata.TabletType + 311, // 217: vtctldata.Workflow.Stream.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 313, // 218: vtctldata.Workflow.Stream.Log.created_at:type_name -> vttime.Time + 313, // 219: vtctldata.Workflow.Stream.Log.updated_at:type_name -> vttime.Time + 313, // 220: vtctldata.Workflow.Stream.ThrottlerStatus.time_throttled:type_name -> vttime.Time + 277, // 221: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry.value:type_name -> vtctldata.ApplyVSchemaResponse.ParamList + 11, // 222: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry.value:type_name -> vtctldata.Shard + 341, // 223: vtctldata.GetCellsAliasesResponse.AliasesEntry.value:type_name -> topodata.CellsAlias + 346, // 224: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry.value:type_name -> topodata.ShardReplication + 289, // 225: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry.value:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NameList + 347, // 226: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry.value:type_name -> topodata.SrvKeyspace + 335, // 227: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry.value:type_name -> vschema.SrvVSchema + 314, // 228: vtctldata.MoveTablesCreateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias + 348, // 229: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry.value:type_name -> replicationdata.Status + 324, // 230: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry.value:type_name -> topodata.Tablet + 232, // 231: vtctldata.ValidateResponse.ResultsByKeyspaceEntry.value:type_name -> vtctldata.ValidateKeyspaceResponse + 238, // 232: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 238, // 233: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 238, // 234: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 238, // 235: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 349, // 236: vtctldata.VDiffShowResponse.TabletResponsesEntry.value:type_name -> tabletmanagerdata.VDiffResponse + 314, // 237: vtctldata.WorkflowDeleteResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias + 314, // 238: vtctldata.WorkflowStatusResponse.ShardStreamState.tablet:type_name -> topodata.TabletAlias + 305, // 239: vtctldata.WorkflowStatusResponse.ShardStreams.streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamState + 304, // 240: vtctldata.WorkflowStatusResponse.TableCopyStateEntry.value:type_name -> vtctldata.WorkflowStatusResponse.TableCopyState + 306, // 241: vtctldata.WorkflowStatusResponse.ShardStreamsEntry.value:type_name -> vtctldata.WorkflowStatusResponse.ShardStreams + 314, // 242: vtctldata.WorkflowUpdateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias + 243, // [243:243] is the sub-list for method output_type + 243, // [243:243] is the sub-list for method input_type + 243, // [243:243] is the sub-list for extension type_name + 243, // [243:243] is the sub-list for extension extendee + 0, // [0:243] is the sub-list for field type_name } func init() { file_vtctldata_proto_init() } @@ -20004,14 +20284,14 @@ func file_vtctldata_proto_init() { return } file_vtctldata_proto_msgTypes[23].OneofWrappers = []any{} - file_vtctldata_proto_msgTypes[236].OneofWrappers = []any{} + file_vtctldata_proto_msgTypes[240].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vtctldata_proto_rawDesc, NumEnums: 5, - NumMessages: 301, + NumMessages: 305, NumExtensions: 0, NumServices: 0, }, diff --git a/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go b/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go index 947b5ce9f43..f50e5e25614 100644 --- a/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go +++ b/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go @@ -1125,6 +1125,54 @@ func (m *CompleteSchemaMigrationResponse) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *CopySchemaShardRequest) CloneVT() *CopySchemaShardRequest { + if m == nil { + return (*CopySchemaShardRequest)(nil) + } + r := new(CopySchemaShardRequest) + r.SourceTabletAlias = m.SourceTabletAlias.CloneVT() + r.IncludeViews = m.IncludeViews + r.SkipVerify = m.SkipVerify + r.WaitReplicasTimeout = m.WaitReplicasTimeout.CloneVT() + r.DestinationKeyspace = m.DestinationKeyspace + r.DestinationShard = m.DestinationShard + if rhs := m.Tables; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Tables = tmpContainer + } + if rhs := m.ExcludeTables; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.ExcludeTables = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *CopySchemaShardRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *CopySchemaShardResponse) CloneVT() *CopySchemaShardResponse { + if m == nil { + return (*CopySchemaShardResponse)(nil) + } + r := new(CopySchemaShardResponse) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *CopySchemaShardResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *CreateKeyspaceRequest) CloneVT() *CreateKeyspaceRequest { if m == nil { return (*CreateKeyspaceRequest)(nil) @@ -4935,6 +4983,44 @@ func (m *ValidateKeyspaceResponse) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *ValidatePermissionsKeyspaceRequest) CloneVT() *ValidatePermissionsKeyspaceRequest { + if m == nil { + return (*ValidatePermissionsKeyspaceRequest)(nil) + } + r := new(ValidatePermissionsKeyspaceRequest) + r.Keyspace = m.Keyspace + if rhs := m.Shards; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Shards = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ValidatePermissionsKeyspaceRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ValidatePermissionsKeyspaceResponse) CloneVT() *ValidatePermissionsKeyspaceResponse { + if m == nil { + return (*ValidatePermissionsKeyspaceResponse)(nil) + } + r := new(ValidatePermissionsKeyspaceResponse) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ValidatePermissionsKeyspaceResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *ValidateSchemaKeyspaceRequest) CloneVT() *ValidateSchemaKeyspaceRequest { if m == nil { return (*ValidateSchemaKeyspaceRequest)(nil) @@ -4949,6 +5035,11 @@ func (m *ValidateSchemaKeyspaceRequest) CloneVT() *ValidateSchemaKeyspaceRequest copy(tmpContainer, rhs) r.ExcludeTables = tmpContainer } + if rhs := m.Shards; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Shards = tmpContainer + } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -9213,6 +9304,144 @@ func (m *CompleteSchemaMigrationResponse) MarshalToSizedBufferVT(dAtA []byte) (i return len(dAtA) - i, nil } +func (m *CopySchemaShardRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CopySchemaShardRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *CopySchemaShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.DestinationShard) > 0 { + i -= len(m.DestinationShard) + copy(dAtA[i:], m.DestinationShard) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DestinationShard))) + i-- + dAtA[i] = 0x42 + } + if len(m.DestinationKeyspace) > 0 { + i -= len(m.DestinationKeyspace) + copy(dAtA[i:], m.DestinationKeyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DestinationKeyspace))) + i-- + dAtA[i] = 0x3a + } + if m.WaitReplicasTimeout != nil { + size, err := m.WaitReplicasTimeout.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x32 + } + if m.SkipVerify { + i-- + if m.SkipVerify { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + if m.IncludeViews { + i-- + if m.IncludeViews { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if len(m.ExcludeTables) > 0 { + for iNdEx := len(m.ExcludeTables) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ExcludeTables[iNdEx]) + copy(dAtA[i:], m.ExcludeTables[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExcludeTables[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Tables) > 0 { + for iNdEx := len(m.Tables) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Tables[iNdEx]) + copy(dAtA[i:], m.Tables[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if m.SourceTabletAlias != nil { + size, err := m.SourceTabletAlias.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CopySchemaShardResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CopySchemaShardResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *CopySchemaShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + func (m *CreateKeyspaceRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -19246,6 +19475,88 @@ func (m *ValidateKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err return len(dAtA) - i, nil } +func (m *ValidatePermissionsKeyspaceRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ValidatePermissionsKeyspaceRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ValidatePermissionsKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Shards) > 0 { + for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Shards[iNdEx]) + copy(dAtA[i:], m.Shards[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Keyspace) > 0 { + i -= len(m.Keyspace) + copy(dAtA[i:], m.Keyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ValidatePermissionsKeyspaceResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ValidatePermissionsKeyspaceResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ValidatePermissionsKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + func (m *ValidateSchemaKeyspaceRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -19276,6 +19587,15 @@ func (m *ValidateSchemaKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.Shards) > 0 { + for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Shards[iNdEx]) + copy(dAtA[i:], m.Shards[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) + i-- + dAtA[i] = 0x32 + } + } if m.IncludeVschema { i-- if m.IncludeVschema { @@ -22908,6 +23228,60 @@ func (m *CompleteSchemaMigrationResponse) SizeVT() (n int) { return n } +func (m *CopySchemaShardRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SourceTabletAlias != nil { + l = m.SourceTabletAlias.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.Tables) > 0 { + for _, s := range m.Tables { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.ExcludeTables) > 0 { + for _, s := range m.ExcludeTables { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if m.IncludeViews { + n += 2 + } + if m.SkipVerify { + n += 2 + } + if m.WaitReplicasTimeout != nil { + l = m.WaitReplicasTimeout.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.DestinationKeyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.DestinationShard) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *CopySchemaShardResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + func (m *CreateKeyspaceRequest) SizeVT() (n int) { if m == nil { return 0 @@ -26585,6 +26959,36 @@ func (m *ValidateKeyspaceResponse) SizeVT() (n int) { return n } +func (m *ValidatePermissionsKeyspaceRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Keyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.Shards) > 0 { + for _, s := range m.Shards { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ValidatePermissionsKeyspaceResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + func (m *ValidateSchemaKeyspaceRequest) SizeVT() (n int) { if m == nil { return 0 @@ -26610,6 +27014,12 @@ func (m *ValidateSchemaKeyspaceRequest) SizeVT() (n int) { if m.IncludeVschema { n += 2 } + if len(m.Shards) > 0 { + for _, s := range m.Shards { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } n += len(m.unknownFields) return n } @@ -36892,125 +37302,467 @@ func (m *CompleteSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CompleteSchemaMigrationResponse: wiretype end group for non-group") + return fmt.Errorf("proto: CompleteSchemaMigrationResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CompleteSchemaMigrationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RowsAffectedByShard", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RowsAffectedByShard == nil { + m.RowsAffectedByShard = make(map[string]uint64) + } + var mapkey string + var mapvalue uint64 + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.RowsAffectedByShard[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CopySchemaShardRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CopySchemaShardRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CopySchemaShardRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SourceTabletAlias", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SourceTabletAlias == nil { + m.SourceTabletAlias = &topodata.TabletAlias{} + } + if err := m.SourceTabletAlias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tables", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tables = append(m.Tables, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExcludeTables", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExcludeTables = append(m.ExcludeTables, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IncludeViews", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IncludeViews = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SkipVerify", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SkipVerify = bool(v != 0) + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WaitReplicasTimeout", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.WaitReplicasTimeout == nil { + m.WaitReplicasTimeout = &vttime.Duration{} + } + if err := m.WaitReplicasTimeout.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DestinationKeyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DestinationKeyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DestinationShard", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DestinationShard = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CopySchemaShardResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CopySchemaShardResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CompleteSchemaMigrationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CopySchemaShardResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RowsAffectedByShard", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return protohelpers.ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return protohelpers.ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.RowsAffectedByShard == nil { - m.RowsAffectedByShard = make(map[string]uint64) - } - var mapkey string - var mapvalue uint64 - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return protohelpers.ErrInvalidLength - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return protohelpers.ErrInvalidLength - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - mapvalue |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - } else { - iNdEx = entryPreIndex - skippy, err := protohelpers.Skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return protohelpers.ErrInvalidLength - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.RowsAffectedByShard[mapkey] = mapvalue - iNdEx = postIndex default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) @@ -58706,7 +59458,181 @@ func (m *SourceShardDeleteRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SourceShardDeleteResponse) UnmarshalVT(dAtA []byte) error { +func (m *SourceShardDeleteResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SourceShardDeleteResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SourceShardDeleteResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Shard == nil { + m.Shard = &topodata.Shard{} + } + if err := m.Shard.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: StartReplicationRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StartReplicationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TabletAlias", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TabletAlias == nil { + m.TabletAlias = &topodata.TabletAlias{} + } + if err := m.TabletAlias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -58729,48 +59655,12 @@ func (m *SourceShardDeleteResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SourceShardDeleteResponse: wiretype end group for non-group") + return fmt.Errorf("proto: StartReplicationResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SourceShardDeleteResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StartReplicationResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return protohelpers.ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return protohelpers.ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Shard == nil { - m.Shard = &topodata.Shard{} - } - if err := m.Shard.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) @@ -58793,7 +59683,7 @@ func (m *SourceShardDeleteResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { +func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -58816,10 +59706,10 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StartReplicationRequest: wiretype end group for non-group") + return fmt.Errorf("proto: StopReplicationRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StartReplicationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StopReplicationRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -58880,7 +59770,7 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { +func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -58903,10 +59793,10 @@ func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StartReplicationResponse: wiretype end group for non-group") + return fmt.Errorf("proto: StopReplicationResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StartReplicationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StopReplicationResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: @@ -58931,7 +59821,7 @@ func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { +func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -58954,15 +59844,15 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StopReplicationRequest: wiretype end group for non-group") + return fmt.Errorf("proto: TabletExternallyReparentedRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StopReplicationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TabletExternallyReparentedRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TabletAlias", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Tablet", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -58989,10 +59879,10 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.TabletAlias == nil { - m.TabletAlias = &topodata.TabletAlias{} + if m.Tablet == nil { + m.Tablet = &topodata.TabletAlias{} } - if err := m.TabletAlias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Tablet.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -59018,7 +59908,7 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { +func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59041,66 +59931,115 @@ func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StopReplicationResponse: wiretype end group for non-group") + return fmt.Errorf("proto: TabletExternallyReparentedResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StopReplicationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TabletExternallyReparentedResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - default: - iNdEx = preIndex - skippy, err := protohelpers.Skip(dAtA[iNdEx:]) - if err != nil { - return err + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { return protohelpers.ErrInvalidLength } - if (iNdEx + skippy) > l { + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { return io.ErrUnexpectedEOF } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) } - if iNdEx >= l { + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.Shard = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewPrimary", wireType) } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: TabletExternallyReparentedRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TabletExternallyReparentedRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NewPrimary == nil { + m.NewPrimary = &topodata.TabletAlias{} + } + if err := m.NewPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tablet", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field OldPrimary", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -59127,10 +60066,10 @@ func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Tablet == nil { - m.Tablet = &topodata.TabletAlias{} + if m.OldPrimary == nil { + m.OldPrimary = &topodata.TabletAlias{} } - if err := m.Tablet.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.OldPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -59156,7 +60095,7 @@ func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { +func (m *UpdateCellInfoRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59179,47 +60118,15 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TabletExternallyReparentedResponse: wiretype end group for non-group") + return fmt.Errorf("proto: UpdateCellInfoRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TabletExternallyReparentedResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UpdateCellInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return protohelpers.ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return protohelpers.ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Keyspace = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -59247,47 +60154,11 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Shard = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewPrimary", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return protohelpers.ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return protohelpers.ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.NewPrimary == nil { - m.NewPrimary = &topodata.TabletAlias{} - } - if err := m.NewPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OldPrimary", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CellInfo", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -59314,10 +60185,10 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.OldPrimary == nil { - m.OldPrimary = &topodata.TabletAlias{} + if m.CellInfo == nil { + m.CellInfo = &topodata.CellInfo{} } - if err := m.OldPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.CellInfo.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -59343,7 +60214,7 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *UpdateCellInfoRequest) UnmarshalVT(dAtA []byte) error { +func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59366,10 +60237,10 @@ func (m *UpdateCellInfoRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UpdateCellInfoRequest: wiretype end group for non-group") + return fmt.Errorf("proto: UpdateCellInfoResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UpdateCellInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UpdateCellInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -59462,7 +60333,7 @@ func (m *UpdateCellInfoRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { +func (m *UpdateCellsAliasRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59485,10 +60356,10 @@ func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UpdateCellInfoResponse: wiretype end group for non-group") + return fmt.Errorf("proto: UpdateCellsAliasRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UpdateCellInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UpdateCellsAliasRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -59525,7 +60396,7 @@ func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CellInfo", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CellsAlias", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -59552,10 +60423,10 @@ func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.CellInfo == nil { - m.CellInfo = &topodata.CellInfo{} + if m.CellsAlias == nil { + m.CellsAlias = &topodata.CellsAlias{} } - if err := m.CellInfo.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.CellsAlias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -59581,7 +60452,7 @@ func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *UpdateCellsAliasRequest) UnmarshalVT(dAtA []byte) error { +func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59604,10 +60475,10 @@ func (m *UpdateCellsAliasRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UpdateCellsAliasRequest: wiretype end group for non-group") + return fmt.Errorf("proto: UpdateCellsAliasResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UpdateCellsAliasRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UpdateCellsAliasResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -59700,7 +60571,7 @@ func (m *UpdateCellsAliasRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { +func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59723,15 +60594,86 @@ func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UpdateCellsAliasResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ValidateRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UpdateCellsAliasResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PingTablets", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.PingTablets = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ValidateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValidateResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -59759,11 +60701,11 @@ func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.Results = append(m.Results, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CellsAlias", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResultsByKeyspace", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -59790,12 +60732,105 @@ func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.CellsAlias == nil { - m.CellsAlias = &topodata.CellsAlias{} + if m.ResultsByKeyspace == nil { + m.ResultsByKeyspace = make(map[string]*ValidateKeyspaceResponse) } - if err := m.CellsAlias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + var mapkey string + var mapvalue *ValidateKeyspaceResponse + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return protohelpers.ErrInvalidLength + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &ValidateKeyspaceResponse{} + if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } + m.ResultsByKeyspace[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex @@ -59819,7 +60854,7 @@ func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { +func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59842,13 +60877,45 @@ func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidateRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ValidateKeyspaceRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidateKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field PingTablets", wireType) } @@ -59890,7 +60957,7 @@ func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { +func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59913,10 +60980,10 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidateResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ValidateKeyspaceResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidateKeyspaceResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -59953,7 +61020,7 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResultsByKeyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResultsByShard", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -59980,11 +61047,11 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ResultsByKeyspace == nil { - m.ResultsByKeyspace = make(map[string]*ValidateKeyspaceResponse) + if m.ResultsByShard == nil { + m.ResultsByShard = make(map[string]*ValidateShardResponse) } var mapkey string - var mapvalue *ValidateKeyspaceResponse + var mapvalue *ValidateShardResponse for iNdEx < postIndex { entryPreIndex := iNdEx var wire uint64 @@ -60058,7 +61125,7 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { if postmsgIndex > l { return io.ErrUnexpectedEOF } - mapvalue = &ValidateKeyspaceResponse{} + mapvalue = &ValidateShardResponse{} if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { return err } @@ -60078,7 +61145,7 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { iNdEx += skippy } } - m.ResultsByKeyspace[mapkey] = mapvalue + m.ResultsByShard[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex @@ -60102,7 +61169,7 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { +func (m *ValidatePermissionsKeyspaceRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -60125,10 +61192,10 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidateKeyspaceRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ValidatePermissionsKeyspaceRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidateKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidatePermissionsKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -60164,10 +61231,10 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { m.Keyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PingTablets", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shards", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return protohelpers.ErrIntOverflow @@ -60177,12 +61244,24 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.PingTablets = bool(v != 0) + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Shards = append(m.Shards, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) @@ -60205,7 +61284,7 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { +func (m *ValidatePermissionsKeyspaceResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -60228,173 +61307,12 @@ func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidateKeyspaceResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ValidatePermissionsKeyspaceResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidateKeyspaceResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidatePermissionsKeyspaceResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return protohelpers.ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return protohelpers.ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Results = append(m.Results, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResultsByShard", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return protohelpers.ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return protohelpers.ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ResultsByShard == nil { - m.ResultsByShard = make(map[string]*ValidateShardResponse) - } - var mapkey string - var mapvalue *ValidateShardResponse - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return protohelpers.ErrInvalidLength - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return protohelpers.ErrInvalidLength - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var mapmsglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - mapmsglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if mapmsglen < 0 { - return protohelpers.ErrInvalidLength - } - postmsgIndex := iNdEx + mapmsglen - if postmsgIndex < 0 { - return protohelpers.ErrInvalidLength - } - if postmsgIndex > l { - return io.ErrUnexpectedEOF - } - mapvalue = &ValidateShardResponse{} - if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex - } else { - iNdEx = entryPreIndex - skippy, err := protohelpers.Skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return protohelpers.ErrInvalidLength - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.ResultsByShard[mapkey] = mapvalue - iNdEx = postIndex default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) @@ -60570,6 +61488,38 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } } m.IncludeVschema = bool(v != 0) + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shards", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Shards = append(m.Shards, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) diff --git a/go/vt/proto/vtctlservice/vtctlservice.pb.go b/go/vt/proto/vtctlservice/vtctlservice.pb.go index 9ffe2fa9aae..e645214b5dd 100644 --- a/go/vt/proto/vtctlservice/vtctlservice.pb.go +++ b/go/vt/proto/vtctlservice/vtctlservice.pb.go @@ -51,7 +51,7 @@ var file_vtctlservice_proto_rawDesc = []byte{ 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x56, 0x74, 0x63, 0x74, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x32, 0x85, 0x5b, 0x0a, 0x06, 0x56, 0x74, 0x63, 0x74, 0x6c, + 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x32, 0xe1, 0x5c, 0x0a, 0x06, 0x56, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x12, 0x4e, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, @@ -147,643 +147,656 @@ var file_vtctlservice_proto_rawDesc = []byte{ 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x43, 0x6f, 0x70, + 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x21, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x70, 0x79, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, + 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, - 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, + 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, + 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x51, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, + 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, - 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x45, - 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6d, 0x65, 0x72, - 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, - 0x70, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, - 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, - 0x44, 0x42, 0x41, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, - 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, - 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x4c, 0x0a, 0x0b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x12, - 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, + 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x45, 0x6d, 0x65, 0x72, 0x67, + 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6d, + 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, + 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x12, 0x23, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x12, + 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, + 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x1d, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, + 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, + 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x16, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, + 0x73, 0x44, 0x42, 0x41, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, - 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, - 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, - 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x72, 0x0a, 0x17, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, - 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, - 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, - 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, - 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x6f, - 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x73, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, - 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x5d, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, + 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x46, + 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, + 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, + 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x7e, 0x0a, 0x1b, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, + 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, + 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x12, 0x1c, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, + 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x65, 0x73, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x47, - 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, - 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x73, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, - 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, - 0x09, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x21, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, + 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x46, 0x75, + 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, + 0x0b, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, + 0x0c, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x1e, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x72, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x47, 0x65, 0x74, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, - 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, - 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x47, - 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, - 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x73, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x63, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, - 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, - 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, - 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x55, 0x6e, - 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, - 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1c, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x1e, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, - 0x0a, 0x10, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x47, + 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, + 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x72, + 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, + 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x1c, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, + 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, + 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, + 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, + 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x49, 0x6e, + 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x22, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, - 0x15, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, - 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x4c, 0x61, 0x75, + 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, + 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x72, 0x0a, 0x17, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, - 0x0d, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1f, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x11, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x4d, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x48, 0x0a, 0x09, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, - 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x4d, 0x6f, 0x75, - 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x63, 0x0a, 0x12, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, - 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, - 0x14, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x52, 0x65, 0x62, 0x75, - 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, - 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, - 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, - 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1e, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, - 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, - 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1e, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, - 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, - 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, - 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x57, 0x0a, 0x0e, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x62, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, - 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x69, 0x0a, 0x14, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, - 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, - 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, - 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x6e, 0x67, 0x12, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, + 0x5a, 0x0a, 0x0f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, + 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x5b, 0x0a, 0x10, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, + 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, + 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, + 0x0a, 0x14, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, + 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x52, 0x65, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x25, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, + 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x66, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, + 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, + 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x52, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, + 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x5a, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, + 0x6c, 0x6c, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x52, + 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x20, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x11, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x69, 0x0a, 0x14, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, + 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x52, 0x75, + 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x20, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, + 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, + 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, - 0x0a, 0x15, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, - 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x41, 0x64, 0x64, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x12, 0x25, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, - 0x69, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x53, 0x65, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x57, + 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x12, + 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x6c, 0x65, 0x65, 0x70, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x11, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x66, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x28, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6c, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x41, 0x64, 0x64, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, + 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, - 0x1a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, - 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x12, 0x2c, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, - 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, + 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, + 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x1a, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x12, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, + 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x5d, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, - 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1a, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x63, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, + 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x22, 0x2e, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x28, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x69, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x72, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, - 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, - 0x70, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, - 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, - 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x6c, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, - 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, - 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, - 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x69, - 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, - 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x6c, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, - 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, - 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2b, - 0x5a, 0x29, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, - 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, + 0x65, 0x73, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, + 0x68, 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, + 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x48, 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x1b, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, + 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2b, 0x5a, 0x29, 0x76, 0x69, + 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, + 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_vtctlservice_proto_goTypes = []any{ @@ -804,233 +817,237 @@ var file_vtctlservice_proto_goTypes = []any{ (*vtctldata.CleanupSchemaMigrationRequest)(nil), // 14: vtctldata.CleanupSchemaMigrationRequest (*vtctldata.CompleteSchemaMigrationRequest)(nil), // 15: vtctldata.CompleteSchemaMigrationRequest (*vtctldata.ConcludeTransactionRequest)(nil), // 16: vtctldata.ConcludeTransactionRequest - (*vtctldata.CreateKeyspaceRequest)(nil), // 17: vtctldata.CreateKeyspaceRequest - (*vtctldata.CreateShardRequest)(nil), // 18: vtctldata.CreateShardRequest - (*vtctldata.DeleteCellInfoRequest)(nil), // 19: vtctldata.DeleteCellInfoRequest - (*vtctldata.DeleteCellsAliasRequest)(nil), // 20: vtctldata.DeleteCellsAliasRequest - (*vtctldata.DeleteKeyspaceRequest)(nil), // 21: vtctldata.DeleteKeyspaceRequest - (*vtctldata.DeleteShardsRequest)(nil), // 22: vtctldata.DeleteShardsRequest - (*vtctldata.DeleteSrvVSchemaRequest)(nil), // 23: vtctldata.DeleteSrvVSchemaRequest - (*vtctldata.DeleteTabletsRequest)(nil), // 24: vtctldata.DeleteTabletsRequest - (*vtctldata.EmergencyReparentShardRequest)(nil), // 25: vtctldata.EmergencyReparentShardRequest - (*vtctldata.ExecuteFetchAsAppRequest)(nil), // 26: vtctldata.ExecuteFetchAsAppRequest - (*vtctldata.ExecuteFetchAsDBARequest)(nil), // 27: vtctldata.ExecuteFetchAsDBARequest - (*vtctldata.ExecuteHookRequest)(nil), // 28: vtctldata.ExecuteHookRequest - (*vtctldata.ExecuteMultiFetchAsDBARequest)(nil), // 29: vtctldata.ExecuteMultiFetchAsDBARequest - (*vtctldata.FindAllShardsInKeyspaceRequest)(nil), // 30: vtctldata.FindAllShardsInKeyspaceRequest - (*vtctldata.ForceCutOverSchemaMigrationRequest)(nil), // 31: vtctldata.ForceCutOverSchemaMigrationRequest - (*vtctldata.GetBackupsRequest)(nil), // 32: vtctldata.GetBackupsRequest - (*vtctldata.GetCellInfoRequest)(nil), // 33: vtctldata.GetCellInfoRequest - (*vtctldata.GetCellInfoNamesRequest)(nil), // 34: vtctldata.GetCellInfoNamesRequest - (*vtctldata.GetCellsAliasesRequest)(nil), // 35: vtctldata.GetCellsAliasesRequest - (*vtctldata.GetFullStatusRequest)(nil), // 36: vtctldata.GetFullStatusRequest - (*vtctldata.GetKeyspaceRequest)(nil), // 37: vtctldata.GetKeyspaceRequest - (*vtctldata.GetKeyspacesRequest)(nil), // 38: vtctldata.GetKeyspacesRequest - (*vtctldata.GetKeyspaceRoutingRulesRequest)(nil), // 39: vtctldata.GetKeyspaceRoutingRulesRequest - (*vtctldata.GetPermissionsRequest)(nil), // 40: vtctldata.GetPermissionsRequest - (*vtctldata.GetRoutingRulesRequest)(nil), // 41: vtctldata.GetRoutingRulesRequest - (*vtctldata.GetSchemaRequest)(nil), // 42: vtctldata.GetSchemaRequest - (*vtctldata.GetSchemaMigrationsRequest)(nil), // 43: vtctldata.GetSchemaMigrationsRequest - (*vtctldata.GetShardReplicationRequest)(nil), // 44: vtctldata.GetShardReplicationRequest - (*vtctldata.GetShardRequest)(nil), // 45: vtctldata.GetShardRequest - (*vtctldata.GetShardRoutingRulesRequest)(nil), // 46: vtctldata.GetShardRoutingRulesRequest - (*vtctldata.GetSrvKeyspaceNamesRequest)(nil), // 47: vtctldata.GetSrvKeyspaceNamesRequest - (*vtctldata.GetSrvKeyspacesRequest)(nil), // 48: vtctldata.GetSrvKeyspacesRequest - (*vtctldata.UpdateThrottlerConfigRequest)(nil), // 49: vtctldata.UpdateThrottlerConfigRequest - (*vtctldata.GetSrvVSchemaRequest)(nil), // 50: vtctldata.GetSrvVSchemaRequest - (*vtctldata.GetSrvVSchemasRequest)(nil), // 51: vtctldata.GetSrvVSchemasRequest - (*vtctldata.GetTabletRequest)(nil), // 52: vtctldata.GetTabletRequest - (*vtctldata.GetTabletsRequest)(nil), // 53: vtctldata.GetTabletsRequest - (*vtctldata.GetThrottlerStatusRequest)(nil), // 54: vtctldata.GetThrottlerStatusRequest - (*vtctldata.GetTopologyPathRequest)(nil), // 55: vtctldata.GetTopologyPathRequest - (*vtctldata.GetTransactionInfoRequest)(nil), // 56: vtctldata.GetTransactionInfoRequest - (*vtctldata.GetUnresolvedTransactionsRequest)(nil), // 57: vtctldata.GetUnresolvedTransactionsRequest - (*vtctldata.GetVersionRequest)(nil), // 58: vtctldata.GetVersionRequest - (*vtctldata.GetVSchemaRequest)(nil), // 59: vtctldata.GetVSchemaRequest - (*vtctldata.GetWorkflowsRequest)(nil), // 60: vtctldata.GetWorkflowsRequest - (*vtctldata.InitShardPrimaryRequest)(nil), // 61: vtctldata.InitShardPrimaryRequest - (*vtctldata.LaunchSchemaMigrationRequest)(nil), // 62: vtctldata.LaunchSchemaMigrationRequest - (*vtctldata.LookupVindexCreateRequest)(nil), // 63: vtctldata.LookupVindexCreateRequest - (*vtctldata.LookupVindexExternalizeRequest)(nil), // 64: vtctldata.LookupVindexExternalizeRequest - (*vtctldata.MaterializeCreateRequest)(nil), // 65: vtctldata.MaterializeCreateRequest - (*vtctldata.MigrateCreateRequest)(nil), // 66: vtctldata.MigrateCreateRequest - (*vtctldata.MountRegisterRequest)(nil), // 67: vtctldata.MountRegisterRequest - (*vtctldata.MountUnregisterRequest)(nil), // 68: vtctldata.MountUnregisterRequest - (*vtctldata.MountShowRequest)(nil), // 69: vtctldata.MountShowRequest - (*vtctldata.MountListRequest)(nil), // 70: vtctldata.MountListRequest - (*vtctldata.MoveTablesCreateRequest)(nil), // 71: vtctldata.MoveTablesCreateRequest - (*vtctldata.MoveTablesCompleteRequest)(nil), // 72: vtctldata.MoveTablesCompleteRequest - (*vtctldata.PingTabletRequest)(nil), // 73: vtctldata.PingTabletRequest - (*vtctldata.PlannedReparentShardRequest)(nil), // 74: vtctldata.PlannedReparentShardRequest - (*vtctldata.RebuildKeyspaceGraphRequest)(nil), // 75: vtctldata.RebuildKeyspaceGraphRequest - (*vtctldata.RebuildVSchemaGraphRequest)(nil), // 76: vtctldata.RebuildVSchemaGraphRequest - (*vtctldata.RefreshStateRequest)(nil), // 77: vtctldata.RefreshStateRequest - (*vtctldata.RefreshStateByShardRequest)(nil), // 78: vtctldata.RefreshStateByShardRequest - (*vtctldata.ReloadSchemaRequest)(nil), // 79: vtctldata.ReloadSchemaRequest - (*vtctldata.ReloadSchemaKeyspaceRequest)(nil), // 80: vtctldata.ReloadSchemaKeyspaceRequest - (*vtctldata.ReloadSchemaShardRequest)(nil), // 81: vtctldata.ReloadSchemaShardRequest - (*vtctldata.RemoveBackupRequest)(nil), // 82: vtctldata.RemoveBackupRequest - (*vtctldata.RemoveKeyspaceCellRequest)(nil), // 83: vtctldata.RemoveKeyspaceCellRequest - (*vtctldata.RemoveShardCellRequest)(nil), // 84: vtctldata.RemoveShardCellRequest - (*vtctldata.ReparentTabletRequest)(nil), // 85: vtctldata.ReparentTabletRequest - (*vtctldata.ReshardCreateRequest)(nil), // 86: vtctldata.ReshardCreateRequest - (*vtctldata.RestoreFromBackupRequest)(nil), // 87: vtctldata.RestoreFromBackupRequest - (*vtctldata.RetrySchemaMigrationRequest)(nil), // 88: vtctldata.RetrySchemaMigrationRequest - (*vtctldata.RunHealthCheckRequest)(nil), // 89: vtctldata.RunHealthCheckRequest - (*vtctldata.SetKeyspaceDurabilityPolicyRequest)(nil), // 90: vtctldata.SetKeyspaceDurabilityPolicyRequest - (*vtctldata.SetShardIsPrimaryServingRequest)(nil), // 91: vtctldata.SetShardIsPrimaryServingRequest - (*vtctldata.SetShardTabletControlRequest)(nil), // 92: vtctldata.SetShardTabletControlRequest - (*vtctldata.SetWritableRequest)(nil), // 93: vtctldata.SetWritableRequest - (*vtctldata.ShardReplicationAddRequest)(nil), // 94: vtctldata.ShardReplicationAddRequest - (*vtctldata.ShardReplicationFixRequest)(nil), // 95: vtctldata.ShardReplicationFixRequest - (*vtctldata.ShardReplicationPositionsRequest)(nil), // 96: vtctldata.ShardReplicationPositionsRequest - (*vtctldata.ShardReplicationRemoveRequest)(nil), // 97: vtctldata.ShardReplicationRemoveRequest - (*vtctldata.SleepTabletRequest)(nil), // 98: vtctldata.SleepTabletRequest - (*vtctldata.SourceShardAddRequest)(nil), // 99: vtctldata.SourceShardAddRequest - (*vtctldata.SourceShardDeleteRequest)(nil), // 100: vtctldata.SourceShardDeleteRequest - (*vtctldata.StartReplicationRequest)(nil), // 101: vtctldata.StartReplicationRequest - (*vtctldata.StopReplicationRequest)(nil), // 102: vtctldata.StopReplicationRequest - (*vtctldata.TabletExternallyReparentedRequest)(nil), // 103: vtctldata.TabletExternallyReparentedRequest - (*vtctldata.UpdateCellInfoRequest)(nil), // 104: vtctldata.UpdateCellInfoRequest - (*vtctldata.UpdateCellsAliasRequest)(nil), // 105: vtctldata.UpdateCellsAliasRequest - (*vtctldata.ValidateRequest)(nil), // 106: vtctldata.ValidateRequest - (*vtctldata.ValidateKeyspaceRequest)(nil), // 107: vtctldata.ValidateKeyspaceRequest - (*vtctldata.ValidateSchemaKeyspaceRequest)(nil), // 108: vtctldata.ValidateSchemaKeyspaceRequest - (*vtctldata.ValidateShardRequest)(nil), // 109: vtctldata.ValidateShardRequest - (*vtctldata.ValidateVersionKeyspaceRequest)(nil), // 110: vtctldata.ValidateVersionKeyspaceRequest - (*vtctldata.ValidateVersionShardRequest)(nil), // 111: vtctldata.ValidateVersionShardRequest - (*vtctldata.ValidateVSchemaRequest)(nil), // 112: vtctldata.ValidateVSchemaRequest - (*vtctldata.VDiffCreateRequest)(nil), // 113: vtctldata.VDiffCreateRequest - (*vtctldata.VDiffDeleteRequest)(nil), // 114: vtctldata.VDiffDeleteRequest - (*vtctldata.VDiffResumeRequest)(nil), // 115: vtctldata.VDiffResumeRequest - (*vtctldata.VDiffShowRequest)(nil), // 116: vtctldata.VDiffShowRequest - (*vtctldata.VDiffStopRequest)(nil), // 117: vtctldata.VDiffStopRequest - (*vtctldata.WorkflowDeleteRequest)(nil), // 118: vtctldata.WorkflowDeleteRequest - (*vtctldata.WorkflowStatusRequest)(nil), // 119: vtctldata.WorkflowStatusRequest - (*vtctldata.WorkflowSwitchTrafficRequest)(nil), // 120: vtctldata.WorkflowSwitchTrafficRequest - (*vtctldata.WorkflowUpdateRequest)(nil), // 121: vtctldata.WorkflowUpdateRequest - (*vtctldata.GetMirrorRulesRequest)(nil), // 122: vtctldata.GetMirrorRulesRequest - (*vtctldata.WorkflowMirrorTrafficRequest)(nil), // 123: vtctldata.WorkflowMirrorTrafficRequest - (*vtctldata.ExecuteVtctlCommandResponse)(nil), // 124: vtctldata.ExecuteVtctlCommandResponse - (*vtctldata.AddCellInfoResponse)(nil), // 125: vtctldata.AddCellInfoResponse - (*vtctldata.AddCellsAliasResponse)(nil), // 126: vtctldata.AddCellsAliasResponse - (*vtctldata.ApplyRoutingRulesResponse)(nil), // 127: vtctldata.ApplyRoutingRulesResponse - (*vtctldata.ApplySchemaResponse)(nil), // 128: vtctldata.ApplySchemaResponse - (*vtctldata.ApplyKeyspaceRoutingRulesResponse)(nil), // 129: vtctldata.ApplyKeyspaceRoutingRulesResponse - (*vtctldata.ApplyShardRoutingRulesResponse)(nil), // 130: vtctldata.ApplyShardRoutingRulesResponse - (*vtctldata.ApplyVSchemaResponse)(nil), // 131: vtctldata.ApplyVSchemaResponse - (*vtctldata.BackupResponse)(nil), // 132: vtctldata.BackupResponse - (*vtctldata.CancelSchemaMigrationResponse)(nil), // 133: vtctldata.CancelSchemaMigrationResponse - (*vtctldata.ChangeTabletTagsResponse)(nil), // 134: vtctldata.ChangeTabletTagsResponse - (*vtctldata.ChangeTabletTypeResponse)(nil), // 135: vtctldata.ChangeTabletTypeResponse - (*vtctldata.CheckThrottlerResponse)(nil), // 136: vtctldata.CheckThrottlerResponse - (*vtctldata.CleanupSchemaMigrationResponse)(nil), // 137: vtctldata.CleanupSchemaMigrationResponse - (*vtctldata.CompleteSchemaMigrationResponse)(nil), // 138: vtctldata.CompleteSchemaMigrationResponse - (*vtctldata.ConcludeTransactionResponse)(nil), // 139: vtctldata.ConcludeTransactionResponse - (*vtctldata.CreateKeyspaceResponse)(nil), // 140: vtctldata.CreateKeyspaceResponse - (*vtctldata.CreateShardResponse)(nil), // 141: vtctldata.CreateShardResponse - (*vtctldata.DeleteCellInfoResponse)(nil), // 142: vtctldata.DeleteCellInfoResponse - (*vtctldata.DeleteCellsAliasResponse)(nil), // 143: vtctldata.DeleteCellsAliasResponse - (*vtctldata.DeleteKeyspaceResponse)(nil), // 144: vtctldata.DeleteKeyspaceResponse - (*vtctldata.DeleteShardsResponse)(nil), // 145: vtctldata.DeleteShardsResponse - (*vtctldata.DeleteSrvVSchemaResponse)(nil), // 146: vtctldata.DeleteSrvVSchemaResponse - (*vtctldata.DeleteTabletsResponse)(nil), // 147: vtctldata.DeleteTabletsResponse - (*vtctldata.EmergencyReparentShardResponse)(nil), // 148: vtctldata.EmergencyReparentShardResponse - (*vtctldata.ExecuteFetchAsAppResponse)(nil), // 149: vtctldata.ExecuteFetchAsAppResponse - (*vtctldata.ExecuteFetchAsDBAResponse)(nil), // 150: vtctldata.ExecuteFetchAsDBAResponse - (*vtctldata.ExecuteHookResponse)(nil), // 151: vtctldata.ExecuteHookResponse - (*vtctldata.ExecuteMultiFetchAsDBAResponse)(nil), // 152: vtctldata.ExecuteMultiFetchAsDBAResponse - (*vtctldata.FindAllShardsInKeyspaceResponse)(nil), // 153: vtctldata.FindAllShardsInKeyspaceResponse - (*vtctldata.ForceCutOverSchemaMigrationResponse)(nil), // 154: vtctldata.ForceCutOverSchemaMigrationResponse - (*vtctldata.GetBackupsResponse)(nil), // 155: vtctldata.GetBackupsResponse - (*vtctldata.GetCellInfoResponse)(nil), // 156: vtctldata.GetCellInfoResponse - (*vtctldata.GetCellInfoNamesResponse)(nil), // 157: vtctldata.GetCellInfoNamesResponse - (*vtctldata.GetCellsAliasesResponse)(nil), // 158: vtctldata.GetCellsAliasesResponse - (*vtctldata.GetFullStatusResponse)(nil), // 159: vtctldata.GetFullStatusResponse - (*vtctldata.GetKeyspaceResponse)(nil), // 160: vtctldata.GetKeyspaceResponse - (*vtctldata.GetKeyspacesResponse)(nil), // 161: vtctldata.GetKeyspacesResponse - (*vtctldata.GetKeyspaceRoutingRulesResponse)(nil), // 162: vtctldata.GetKeyspaceRoutingRulesResponse - (*vtctldata.GetPermissionsResponse)(nil), // 163: vtctldata.GetPermissionsResponse - (*vtctldata.GetRoutingRulesResponse)(nil), // 164: vtctldata.GetRoutingRulesResponse - (*vtctldata.GetSchemaResponse)(nil), // 165: vtctldata.GetSchemaResponse - (*vtctldata.GetSchemaMigrationsResponse)(nil), // 166: vtctldata.GetSchemaMigrationsResponse - (*vtctldata.GetShardReplicationResponse)(nil), // 167: vtctldata.GetShardReplicationResponse - (*vtctldata.GetShardResponse)(nil), // 168: vtctldata.GetShardResponse - (*vtctldata.GetShardRoutingRulesResponse)(nil), // 169: vtctldata.GetShardRoutingRulesResponse - (*vtctldata.GetSrvKeyspaceNamesResponse)(nil), // 170: vtctldata.GetSrvKeyspaceNamesResponse - (*vtctldata.GetSrvKeyspacesResponse)(nil), // 171: vtctldata.GetSrvKeyspacesResponse - (*vtctldata.UpdateThrottlerConfigResponse)(nil), // 172: vtctldata.UpdateThrottlerConfigResponse - (*vtctldata.GetSrvVSchemaResponse)(nil), // 173: vtctldata.GetSrvVSchemaResponse - (*vtctldata.GetSrvVSchemasResponse)(nil), // 174: vtctldata.GetSrvVSchemasResponse - (*vtctldata.GetTabletResponse)(nil), // 175: vtctldata.GetTabletResponse - (*vtctldata.GetTabletsResponse)(nil), // 176: vtctldata.GetTabletsResponse - (*vtctldata.GetThrottlerStatusResponse)(nil), // 177: vtctldata.GetThrottlerStatusResponse - (*vtctldata.GetTopologyPathResponse)(nil), // 178: vtctldata.GetTopologyPathResponse - (*vtctldata.GetTransactionInfoResponse)(nil), // 179: vtctldata.GetTransactionInfoResponse - (*vtctldata.GetUnresolvedTransactionsResponse)(nil), // 180: vtctldata.GetUnresolvedTransactionsResponse - (*vtctldata.GetVersionResponse)(nil), // 181: vtctldata.GetVersionResponse - (*vtctldata.GetVSchemaResponse)(nil), // 182: vtctldata.GetVSchemaResponse - (*vtctldata.GetWorkflowsResponse)(nil), // 183: vtctldata.GetWorkflowsResponse - (*vtctldata.InitShardPrimaryResponse)(nil), // 184: vtctldata.InitShardPrimaryResponse - (*vtctldata.LaunchSchemaMigrationResponse)(nil), // 185: vtctldata.LaunchSchemaMigrationResponse - (*vtctldata.LookupVindexCreateResponse)(nil), // 186: vtctldata.LookupVindexCreateResponse - (*vtctldata.LookupVindexExternalizeResponse)(nil), // 187: vtctldata.LookupVindexExternalizeResponse - (*vtctldata.MaterializeCreateResponse)(nil), // 188: vtctldata.MaterializeCreateResponse - (*vtctldata.WorkflowStatusResponse)(nil), // 189: vtctldata.WorkflowStatusResponse - (*vtctldata.MountRegisterResponse)(nil), // 190: vtctldata.MountRegisterResponse - (*vtctldata.MountUnregisterResponse)(nil), // 191: vtctldata.MountUnregisterResponse - (*vtctldata.MountShowResponse)(nil), // 192: vtctldata.MountShowResponse - (*vtctldata.MountListResponse)(nil), // 193: vtctldata.MountListResponse - (*vtctldata.MoveTablesCompleteResponse)(nil), // 194: vtctldata.MoveTablesCompleteResponse - (*vtctldata.PingTabletResponse)(nil), // 195: vtctldata.PingTabletResponse - (*vtctldata.PlannedReparentShardResponse)(nil), // 196: vtctldata.PlannedReparentShardResponse - (*vtctldata.RebuildKeyspaceGraphResponse)(nil), // 197: vtctldata.RebuildKeyspaceGraphResponse - (*vtctldata.RebuildVSchemaGraphResponse)(nil), // 198: vtctldata.RebuildVSchemaGraphResponse - (*vtctldata.RefreshStateResponse)(nil), // 199: vtctldata.RefreshStateResponse - (*vtctldata.RefreshStateByShardResponse)(nil), // 200: vtctldata.RefreshStateByShardResponse - (*vtctldata.ReloadSchemaResponse)(nil), // 201: vtctldata.ReloadSchemaResponse - (*vtctldata.ReloadSchemaKeyspaceResponse)(nil), // 202: vtctldata.ReloadSchemaKeyspaceResponse - (*vtctldata.ReloadSchemaShardResponse)(nil), // 203: vtctldata.ReloadSchemaShardResponse - (*vtctldata.RemoveBackupResponse)(nil), // 204: vtctldata.RemoveBackupResponse - (*vtctldata.RemoveKeyspaceCellResponse)(nil), // 205: vtctldata.RemoveKeyspaceCellResponse - (*vtctldata.RemoveShardCellResponse)(nil), // 206: vtctldata.RemoveShardCellResponse - (*vtctldata.ReparentTabletResponse)(nil), // 207: vtctldata.ReparentTabletResponse - (*vtctldata.RestoreFromBackupResponse)(nil), // 208: vtctldata.RestoreFromBackupResponse - (*vtctldata.RetrySchemaMigrationResponse)(nil), // 209: vtctldata.RetrySchemaMigrationResponse - (*vtctldata.RunHealthCheckResponse)(nil), // 210: vtctldata.RunHealthCheckResponse - (*vtctldata.SetKeyspaceDurabilityPolicyResponse)(nil), // 211: vtctldata.SetKeyspaceDurabilityPolicyResponse - (*vtctldata.SetShardIsPrimaryServingResponse)(nil), // 212: vtctldata.SetShardIsPrimaryServingResponse - (*vtctldata.SetShardTabletControlResponse)(nil), // 213: vtctldata.SetShardTabletControlResponse - (*vtctldata.SetWritableResponse)(nil), // 214: vtctldata.SetWritableResponse - (*vtctldata.ShardReplicationAddResponse)(nil), // 215: vtctldata.ShardReplicationAddResponse - (*vtctldata.ShardReplicationFixResponse)(nil), // 216: vtctldata.ShardReplicationFixResponse - (*vtctldata.ShardReplicationPositionsResponse)(nil), // 217: vtctldata.ShardReplicationPositionsResponse - (*vtctldata.ShardReplicationRemoveResponse)(nil), // 218: vtctldata.ShardReplicationRemoveResponse - (*vtctldata.SleepTabletResponse)(nil), // 219: vtctldata.SleepTabletResponse - (*vtctldata.SourceShardAddResponse)(nil), // 220: vtctldata.SourceShardAddResponse - (*vtctldata.SourceShardDeleteResponse)(nil), // 221: vtctldata.SourceShardDeleteResponse - (*vtctldata.StartReplicationResponse)(nil), // 222: vtctldata.StartReplicationResponse - (*vtctldata.StopReplicationResponse)(nil), // 223: vtctldata.StopReplicationResponse - (*vtctldata.TabletExternallyReparentedResponse)(nil), // 224: vtctldata.TabletExternallyReparentedResponse - (*vtctldata.UpdateCellInfoResponse)(nil), // 225: vtctldata.UpdateCellInfoResponse - (*vtctldata.UpdateCellsAliasResponse)(nil), // 226: vtctldata.UpdateCellsAliasResponse - (*vtctldata.ValidateResponse)(nil), // 227: vtctldata.ValidateResponse - (*vtctldata.ValidateKeyspaceResponse)(nil), // 228: vtctldata.ValidateKeyspaceResponse - (*vtctldata.ValidateSchemaKeyspaceResponse)(nil), // 229: vtctldata.ValidateSchemaKeyspaceResponse - (*vtctldata.ValidateShardResponse)(nil), // 230: vtctldata.ValidateShardResponse - (*vtctldata.ValidateVersionKeyspaceResponse)(nil), // 231: vtctldata.ValidateVersionKeyspaceResponse - (*vtctldata.ValidateVersionShardResponse)(nil), // 232: vtctldata.ValidateVersionShardResponse - (*vtctldata.ValidateVSchemaResponse)(nil), // 233: vtctldata.ValidateVSchemaResponse - (*vtctldata.VDiffCreateResponse)(nil), // 234: vtctldata.VDiffCreateResponse - (*vtctldata.VDiffDeleteResponse)(nil), // 235: vtctldata.VDiffDeleteResponse - (*vtctldata.VDiffResumeResponse)(nil), // 236: vtctldata.VDiffResumeResponse - (*vtctldata.VDiffShowResponse)(nil), // 237: vtctldata.VDiffShowResponse - (*vtctldata.VDiffStopResponse)(nil), // 238: vtctldata.VDiffStopResponse - (*vtctldata.WorkflowDeleteResponse)(nil), // 239: vtctldata.WorkflowDeleteResponse - (*vtctldata.WorkflowSwitchTrafficResponse)(nil), // 240: vtctldata.WorkflowSwitchTrafficResponse - (*vtctldata.WorkflowUpdateResponse)(nil), // 241: vtctldata.WorkflowUpdateResponse - (*vtctldata.GetMirrorRulesResponse)(nil), // 242: vtctldata.GetMirrorRulesResponse - (*vtctldata.WorkflowMirrorTrafficResponse)(nil), // 243: vtctldata.WorkflowMirrorTrafficResponse + (*vtctldata.CopySchemaShardRequest)(nil), // 17: vtctldata.CopySchemaShardRequest + (*vtctldata.CreateKeyspaceRequest)(nil), // 18: vtctldata.CreateKeyspaceRequest + (*vtctldata.CreateShardRequest)(nil), // 19: vtctldata.CreateShardRequest + (*vtctldata.DeleteCellInfoRequest)(nil), // 20: vtctldata.DeleteCellInfoRequest + (*vtctldata.DeleteCellsAliasRequest)(nil), // 21: vtctldata.DeleteCellsAliasRequest + (*vtctldata.DeleteKeyspaceRequest)(nil), // 22: vtctldata.DeleteKeyspaceRequest + (*vtctldata.DeleteShardsRequest)(nil), // 23: vtctldata.DeleteShardsRequest + (*vtctldata.DeleteSrvVSchemaRequest)(nil), // 24: vtctldata.DeleteSrvVSchemaRequest + (*vtctldata.DeleteTabletsRequest)(nil), // 25: vtctldata.DeleteTabletsRequest + (*vtctldata.EmergencyReparentShardRequest)(nil), // 26: vtctldata.EmergencyReparentShardRequest + (*vtctldata.ExecuteFetchAsAppRequest)(nil), // 27: vtctldata.ExecuteFetchAsAppRequest + (*vtctldata.ExecuteFetchAsDBARequest)(nil), // 28: vtctldata.ExecuteFetchAsDBARequest + (*vtctldata.ExecuteHookRequest)(nil), // 29: vtctldata.ExecuteHookRequest + (*vtctldata.ExecuteMultiFetchAsDBARequest)(nil), // 30: vtctldata.ExecuteMultiFetchAsDBARequest + (*vtctldata.FindAllShardsInKeyspaceRequest)(nil), // 31: vtctldata.FindAllShardsInKeyspaceRequest + (*vtctldata.ForceCutOverSchemaMigrationRequest)(nil), // 32: vtctldata.ForceCutOverSchemaMigrationRequest + (*vtctldata.GetBackupsRequest)(nil), // 33: vtctldata.GetBackupsRequest + (*vtctldata.GetCellInfoRequest)(nil), // 34: vtctldata.GetCellInfoRequest + (*vtctldata.GetCellInfoNamesRequest)(nil), // 35: vtctldata.GetCellInfoNamesRequest + (*vtctldata.GetCellsAliasesRequest)(nil), // 36: vtctldata.GetCellsAliasesRequest + (*vtctldata.GetFullStatusRequest)(nil), // 37: vtctldata.GetFullStatusRequest + (*vtctldata.GetKeyspaceRequest)(nil), // 38: vtctldata.GetKeyspaceRequest + (*vtctldata.GetKeyspacesRequest)(nil), // 39: vtctldata.GetKeyspacesRequest + (*vtctldata.GetKeyspaceRoutingRulesRequest)(nil), // 40: vtctldata.GetKeyspaceRoutingRulesRequest + (*vtctldata.GetPermissionsRequest)(nil), // 41: vtctldata.GetPermissionsRequest + (*vtctldata.GetRoutingRulesRequest)(nil), // 42: vtctldata.GetRoutingRulesRequest + (*vtctldata.GetSchemaRequest)(nil), // 43: vtctldata.GetSchemaRequest + (*vtctldata.GetSchemaMigrationsRequest)(nil), // 44: vtctldata.GetSchemaMigrationsRequest + (*vtctldata.GetShardReplicationRequest)(nil), // 45: vtctldata.GetShardReplicationRequest + (*vtctldata.GetShardRequest)(nil), // 46: vtctldata.GetShardRequest + (*vtctldata.GetShardRoutingRulesRequest)(nil), // 47: vtctldata.GetShardRoutingRulesRequest + (*vtctldata.GetSrvKeyspaceNamesRequest)(nil), // 48: vtctldata.GetSrvKeyspaceNamesRequest + (*vtctldata.GetSrvKeyspacesRequest)(nil), // 49: vtctldata.GetSrvKeyspacesRequest + (*vtctldata.UpdateThrottlerConfigRequest)(nil), // 50: vtctldata.UpdateThrottlerConfigRequest + (*vtctldata.GetSrvVSchemaRequest)(nil), // 51: vtctldata.GetSrvVSchemaRequest + (*vtctldata.GetSrvVSchemasRequest)(nil), // 52: vtctldata.GetSrvVSchemasRequest + (*vtctldata.GetTabletRequest)(nil), // 53: vtctldata.GetTabletRequest + (*vtctldata.GetTabletsRequest)(nil), // 54: vtctldata.GetTabletsRequest + (*vtctldata.GetThrottlerStatusRequest)(nil), // 55: vtctldata.GetThrottlerStatusRequest + (*vtctldata.GetTopologyPathRequest)(nil), // 56: vtctldata.GetTopologyPathRequest + (*vtctldata.GetTransactionInfoRequest)(nil), // 57: vtctldata.GetTransactionInfoRequest + (*vtctldata.GetUnresolvedTransactionsRequest)(nil), // 58: vtctldata.GetUnresolvedTransactionsRequest + (*vtctldata.GetVersionRequest)(nil), // 59: vtctldata.GetVersionRequest + (*vtctldata.GetVSchemaRequest)(nil), // 60: vtctldata.GetVSchemaRequest + (*vtctldata.GetWorkflowsRequest)(nil), // 61: vtctldata.GetWorkflowsRequest + (*vtctldata.InitShardPrimaryRequest)(nil), // 62: vtctldata.InitShardPrimaryRequest + (*vtctldata.LaunchSchemaMigrationRequest)(nil), // 63: vtctldata.LaunchSchemaMigrationRequest + (*vtctldata.LookupVindexCreateRequest)(nil), // 64: vtctldata.LookupVindexCreateRequest + (*vtctldata.LookupVindexExternalizeRequest)(nil), // 65: vtctldata.LookupVindexExternalizeRequest + (*vtctldata.MaterializeCreateRequest)(nil), // 66: vtctldata.MaterializeCreateRequest + (*vtctldata.MigrateCreateRequest)(nil), // 67: vtctldata.MigrateCreateRequest + (*vtctldata.MountRegisterRequest)(nil), // 68: vtctldata.MountRegisterRequest + (*vtctldata.MountUnregisterRequest)(nil), // 69: vtctldata.MountUnregisterRequest + (*vtctldata.MountShowRequest)(nil), // 70: vtctldata.MountShowRequest + (*vtctldata.MountListRequest)(nil), // 71: vtctldata.MountListRequest + (*vtctldata.MoveTablesCreateRequest)(nil), // 72: vtctldata.MoveTablesCreateRequest + (*vtctldata.MoveTablesCompleteRequest)(nil), // 73: vtctldata.MoveTablesCompleteRequest + (*vtctldata.PingTabletRequest)(nil), // 74: vtctldata.PingTabletRequest + (*vtctldata.PlannedReparentShardRequest)(nil), // 75: vtctldata.PlannedReparentShardRequest + (*vtctldata.RebuildKeyspaceGraphRequest)(nil), // 76: vtctldata.RebuildKeyspaceGraphRequest + (*vtctldata.RebuildVSchemaGraphRequest)(nil), // 77: vtctldata.RebuildVSchemaGraphRequest + (*vtctldata.RefreshStateRequest)(nil), // 78: vtctldata.RefreshStateRequest + (*vtctldata.RefreshStateByShardRequest)(nil), // 79: vtctldata.RefreshStateByShardRequest + (*vtctldata.ReloadSchemaRequest)(nil), // 80: vtctldata.ReloadSchemaRequest + (*vtctldata.ReloadSchemaKeyspaceRequest)(nil), // 81: vtctldata.ReloadSchemaKeyspaceRequest + (*vtctldata.ReloadSchemaShardRequest)(nil), // 82: vtctldata.ReloadSchemaShardRequest + (*vtctldata.RemoveBackupRequest)(nil), // 83: vtctldata.RemoveBackupRequest + (*vtctldata.RemoveKeyspaceCellRequest)(nil), // 84: vtctldata.RemoveKeyspaceCellRequest + (*vtctldata.RemoveShardCellRequest)(nil), // 85: vtctldata.RemoveShardCellRequest + (*vtctldata.ReparentTabletRequest)(nil), // 86: vtctldata.ReparentTabletRequest + (*vtctldata.ReshardCreateRequest)(nil), // 87: vtctldata.ReshardCreateRequest + (*vtctldata.RestoreFromBackupRequest)(nil), // 88: vtctldata.RestoreFromBackupRequest + (*vtctldata.RetrySchemaMigrationRequest)(nil), // 89: vtctldata.RetrySchemaMigrationRequest + (*vtctldata.RunHealthCheckRequest)(nil), // 90: vtctldata.RunHealthCheckRequest + (*vtctldata.SetKeyspaceDurabilityPolicyRequest)(nil), // 91: vtctldata.SetKeyspaceDurabilityPolicyRequest + (*vtctldata.SetShardIsPrimaryServingRequest)(nil), // 92: vtctldata.SetShardIsPrimaryServingRequest + (*vtctldata.SetShardTabletControlRequest)(nil), // 93: vtctldata.SetShardTabletControlRequest + (*vtctldata.SetWritableRequest)(nil), // 94: vtctldata.SetWritableRequest + (*vtctldata.ShardReplicationAddRequest)(nil), // 95: vtctldata.ShardReplicationAddRequest + (*vtctldata.ShardReplicationFixRequest)(nil), // 96: vtctldata.ShardReplicationFixRequest + (*vtctldata.ShardReplicationPositionsRequest)(nil), // 97: vtctldata.ShardReplicationPositionsRequest + (*vtctldata.ShardReplicationRemoveRequest)(nil), // 98: vtctldata.ShardReplicationRemoveRequest + (*vtctldata.SleepTabletRequest)(nil), // 99: vtctldata.SleepTabletRequest + (*vtctldata.SourceShardAddRequest)(nil), // 100: vtctldata.SourceShardAddRequest + (*vtctldata.SourceShardDeleteRequest)(nil), // 101: vtctldata.SourceShardDeleteRequest + (*vtctldata.StartReplicationRequest)(nil), // 102: vtctldata.StartReplicationRequest + (*vtctldata.StopReplicationRequest)(nil), // 103: vtctldata.StopReplicationRequest + (*vtctldata.TabletExternallyReparentedRequest)(nil), // 104: vtctldata.TabletExternallyReparentedRequest + (*vtctldata.UpdateCellInfoRequest)(nil), // 105: vtctldata.UpdateCellInfoRequest + (*vtctldata.UpdateCellsAliasRequest)(nil), // 106: vtctldata.UpdateCellsAliasRequest + (*vtctldata.ValidateRequest)(nil), // 107: vtctldata.ValidateRequest + (*vtctldata.ValidateKeyspaceRequest)(nil), // 108: vtctldata.ValidateKeyspaceRequest + (*vtctldata.ValidatePermissionsKeyspaceRequest)(nil), // 109: vtctldata.ValidatePermissionsKeyspaceRequest + (*vtctldata.ValidateSchemaKeyspaceRequest)(nil), // 110: vtctldata.ValidateSchemaKeyspaceRequest + (*vtctldata.ValidateShardRequest)(nil), // 111: vtctldata.ValidateShardRequest + (*vtctldata.ValidateVersionKeyspaceRequest)(nil), // 112: vtctldata.ValidateVersionKeyspaceRequest + (*vtctldata.ValidateVersionShardRequest)(nil), // 113: vtctldata.ValidateVersionShardRequest + (*vtctldata.ValidateVSchemaRequest)(nil), // 114: vtctldata.ValidateVSchemaRequest + (*vtctldata.VDiffCreateRequest)(nil), // 115: vtctldata.VDiffCreateRequest + (*vtctldata.VDiffDeleteRequest)(nil), // 116: vtctldata.VDiffDeleteRequest + (*vtctldata.VDiffResumeRequest)(nil), // 117: vtctldata.VDiffResumeRequest + (*vtctldata.VDiffShowRequest)(nil), // 118: vtctldata.VDiffShowRequest + (*vtctldata.VDiffStopRequest)(nil), // 119: vtctldata.VDiffStopRequest + (*vtctldata.WorkflowDeleteRequest)(nil), // 120: vtctldata.WorkflowDeleteRequest + (*vtctldata.WorkflowStatusRequest)(nil), // 121: vtctldata.WorkflowStatusRequest + (*vtctldata.WorkflowSwitchTrafficRequest)(nil), // 122: vtctldata.WorkflowSwitchTrafficRequest + (*vtctldata.WorkflowUpdateRequest)(nil), // 123: vtctldata.WorkflowUpdateRequest + (*vtctldata.GetMirrorRulesRequest)(nil), // 124: vtctldata.GetMirrorRulesRequest + (*vtctldata.WorkflowMirrorTrafficRequest)(nil), // 125: vtctldata.WorkflowMirrorTrafficRequest + (*vtctldata.ExecuteVtctlCommandResponse)(nil), // 126: vtctldata.ExecuteVtctlCommandResponse + (*vtctldata.AddCellInfoResponse)(nil), // 127: vtctldata.AddCellInfoResponse + (*vtctldata.AddCellsAliasResponse)(nil), // 128: vtctldata.AddCellsAliasResponse + (*vtctldata.ApplyRoutingRulesResponse)(nil), // 129: vtctldata.ApplyRoutingRulesResponse + (*vtctldata.ApplySchemaResponse)(nil), // 130: vtctldata.ApplySchemaResponse + (*vtctldata.ApplyKeyspaceRoutingRulesResponse)(nil), // 131: vtctldata.ApplyKeyspaceRoutingRulesResponse + (*vtctldata.ApplyShardRoutingRulesResponse)(nil), // 132: vtctldata.ApplyShardRoutingRulesResponse + (*vtctldata.ApplyVSchemaResponse)(nil), // 133: vtctldata.ApplyVSchemaResponse + (*vtctldata.BackupResponse)(nil), // 134: vtctldata.BackupResponse + (*vtctldata.CancelSchemaMigrationResponse)(nil), // 135: vtctldata.CancelSchemaMigrationResponse + (*vtctldata.ChangeTabletTagsResponse)(nil), // 136: vtctldata.ChangeTabletTagsResponse + (*vtctldata.ChangeTabletTypeResponse)(nil), // 137: vtctldata.ChangeTabletTypeResponse + (*vtctldata.CheckThrottlerResponse)(nil), // 138: vtctldata.CheckThrottlerResponse + (*vtctldata.CleanupSchemaMigrationResponse)(nil), // 139: vtctldata.CleanupSchemaMigrationResponse + (*vtctldata.CompleteSchemaMigrationResponse)(nil), // 140: vtctldata.CompleteSchemaMigrationResponse + (*vtctldata.ConcludeTransactionResponse)(nil), // 141: vtctldata.ConcludeTransactionResponse + (*vtctldata.CopySchemaShardResponse)(nil), // 142: vtctldata.CopySchemaShardResponse + (*vtctldata.CreateKeyspaceResponse)(nil), // 143: vtctldata.CreateKeyspaceResponse + (*vtctldata.CreateShardResponse)(nil), // 144: vtctldata.CreateShardResponse + (*vtctldata.DeleteCellInfoResponse)(nil), // 145: vtctldata.DeleteCellInfoResponse + (*vtctldata.DeleteCellsAliasResponse)(nil), // 146: vtctldata.DeleteCellsAliasResponse + (*vtctldata.DeleteKeyspaceResponse)(nil), // 147: vtctldata.DeleteKeyspaceResponse + (*vtctldata.DeleteShardsResponse)(nil), // 148: vtctldata.DeleteShardsResponse + (*vtctldata.DeleteSrvVSchemaResponse)(nil), // 149: vtctldata.DeleteSrvVSchemaResponse + (*vtctldata.DeleteTabletsResponse)(nil), // 150: vtctldata.DeleteTabletsResponse + (*vtctldata.EmergencyReparentShardResponse)(nil), // 151: vtctldata.EmergencyReparentShardResponse + (*vtctldata.ExecuteFetchAsAppResponse)(nil), // 152: vtctldata.ExecuteFetchAsAppResponse + (*vtctldata.ExecuteFetchAsDBAResponse)(nil), // 153: vtctldata.ExecuteFetchAsDBAResponse + (*vtctldata.ExecuteHookResponse)(nil), // 154: vtctldata.ExecuteHookResponse + (*vtctldata.ExecuteMultiFetchAsDBAResponse)(nil), // 155: vtctldata.ExecuteMultiFetchAsDBAResponse + (*vtctldata.FindAllShardsInKeyspaceResponse)(nil), // 156: vtctldata.FindAllShardsInKeyspaceResponse + (*vtctldata.ForceCutOverSchemaMigrationResponse)(nil), // 157: vtctldata.ForceCutOverSchemaMigrationResponse + (*vtctldata.GetBackupsResponse)(nil), // 158: vtctldata.GetBackupsResponse + (*vtctldata.GetCellInfoResponse)(nil), // 159: vtctldata.GetCellInfoResponse + (*vtctldata.GetCellInfoNamesResponse)(nil), // 160: vtctldata.GetCellInfoNamesResponse + (*vtctldata.GetCellsAliasesResponse)(nil), // 161: vtctldata.GetCellsAliasesResponse + (*vtctldata.GetFullStatusResponse)(nil), // 162: vtctldata.GetFullStatusResponse + (*vtctldata.GetKeyspaceResponse)(nil), // 163: vtctldata.GetKeyspaceResponse + (*vtctldata.GetKeyspacesResponse)(nil), // 164: vtctldata.GetKeyspacesResponse + (*vtctldata.GetKeyspaceRoutingRulesResponse)(nil), // 165: vtctldata.GetKeyspaceRoutingRulesResponse + (*vtctldata.GetPermissionsResponse)(nil), // 166: vtctldata.GetPermissionsResponse + (*vtctldata.GetRoutingRulesResponse)(nil), // 167: vtctldata.GetRoutingRulesResponse + (*vtctldata.GetSchemaResponse)(nil), // 168: vtctldata.GetSchemaResponse + (*vtctldata.GetSchemaMigrationsResponse)(nil), // 169: vtctldata.GetSchemaMigrationsResponse + (*vtctldata.GetShardReplicationResponse)(nil), // 170: vtctldata.GetShardReplicationResponse + (*vtctldata.GetShardResponse)(nil), // 171: vtctldata.GetShardResponse + (*vtctldata.GetShardRoutingRulesResponse)(nil), // 172: vtctldata.GetShardRoutingRulesResponse + (*vtctldata.GetSrvKeyspaceNamesResponse)(nil), // 173: vtctldata.GetSrvKeyspaceNamesResponse + (*vtctldata.GetSrvKeyspacesResponse)(nil), // 174: vtctldata.GetSrvKeyspacesResponse + (*vtctldata.UpdateThrottlerConfigResponse)(nil), // 175: vtctldata.UpdateThrottlerConfigResponse + (*vtctldata.GetSrvVSchemaResponse)(nil), // 176: vtctldata.GetSrvVSchemaResponse + (*vtctldata.GetSrvVSchemasResponse)(nil), // 177: vtctldata.GetSrvVSchemasResponse + (*vtctldata.GetTabletResponse)(nil), // 178: vtctldata.GetTabletResponse + (*vtctldata.GetTabletsResponse)(nil), // 179: vtctldata.GetTabletsResponse + (*vtctldata.GetThrottlerStatusResponse)(nil), // 180: vtctldata.GetThrottlerStatusResponse + (*vtctldata.GetTopologyPathResponse)(nil), // 181: vtctldata.GetTopologyPathResponse + (*vtctldata.GetTransactionInfoResponse)(nil), // 182: vtctldata.GetTransactionInfoResponse + (*vtctldata.GetUnresolvedTransactionsResponse)(nil), // 183: vtctldata.GetUnresolvedTransactionsResponse + (*vtctldata.GetVersionResponse)(nil), // 184: vtctldata.GetVersionResponse + (*vtctldata.GetVSchemaResponse)(nil), // 185: vtctldata.GetVSchemaResponse + (*vtctldata.GetWorkflowsResponse)(nil), // 186: vtctldata.GetWorkflowsResponse + (*vtctldata.InitShardPrimaryResponse)(nil), // 187: vtctldata.InitShardPrimaryResponse + (*vtctldata.LaunchSchemaMigrationResponse)(nil), // 188: vtctldata.LaunchSchemaMigrationResponse + (*vtctldata.LookupVindexCreateResponse)(nil), // 189: vtctldata.LookupVindexCreateResponse + (*vtctldata.LookupVindexExternalizeResponse)(nil), // 190: vtctldata.LookupVindexExternalizeResponse + (*vtctldata.MaterializeCreateResponse)(nil), // 191: vtctldata.MaterializeCreateResponse + (*vtctldata.WorkflowStatusResponse)(nil), // 192: vtctldata.WorkflowStatusResponse + (*vtctldata.MountRegisterResponse)(nil), // 193: vtctldata.MountRegisterResponse + (*vtctldata.MountUnregisterResponse)(nil), // 194: vtctldata.MountUnregisterResponse + (*vtctldata.MountShowResponse)(nil), // 195: vtctldata.MountShowResponse + (*vtctldata.MountListResponse)(nil), // 196: vtctldata.MountListResponse + (*vtctldata.MoveTablesCompleteResponse)(nil), // 197: vtctldata.MoveTablesCompleteResponse + (*vtctldata.PingTabletResponse)(nil), // 198: vtctldata.PingTabletResponse + (*vtctldata.PlannedReparentShardResponse)(nil), // 199: vtctldata.PlannedReparentShardResponse + (*vtctldata.RebuildKeyspaceGraphResponse)(nil), // 200: vtctldata.RebuildKeyspaceGraphResponse + (*vtctldata.RebuildVSchemaGraphResponse)(nil), // 201: vtctldata.RebuildVSchemaGraphResponse + (*vtctldata.RefreshStateResponse)(nil), // 202: vtctldata.RefreshStateResponse + (*vtctldata.RefreshStateByShardResponse)(nil), // 203: vtctldata.RefreshStateByShardResponse + (*vtctldata.ReloadSchemaResponse)(nil), // 204: vtctldata.ReloadSchemaResponse + (*vtctldata.ReloadSchemaKeyspaceResponse)(nil), // 205: vtctldata.ReloadSchemaKeyspaceResponse + (*vtctldata.ReloadSchemaShardResponse)(nil), // 206: vtctldata.ReloadSchemaShardResponse + (*vtctldata.RemoveBackupResponse)(nil), // 207: vtctldata.RemoveBackupResponse + (*vtctldata.RemoveKeyspaceCellResponse)(nil), // 208: vtctldata.RemoveKeyspaceCellResponse + (*vtctldata.RemoveShardCellResponse)(nil), // 209: vtctldata.RemoveShardCellResponse + (*vtctldata.ReparentTabletResponse)(nil), // 210: vtctldata.ReparentTabletResponse + (*vtctldata.RestoreFromBackupResponse)(nil), // 211: vtctldata.RestoreFromBackupResponse + (*vtctldata.RetrySchemaMigrationResponse)(nil), // 212: vtctldata.RetrySchemaMigrationResponse + (*vtctldata.RunHealthCheckResponse)(nil), // 213: vtctldata.RunHealthCheckResponse + (*vtctldata.SetKeyspaceDurabilityPolicyResponse)(nil), // 214: vtctldata.SetKeyspaceDurabilityPolicyResponse + (*vtctldata.SetShardIsPrimaryServingResponse)(nil), // 215: vtctldata.SetShardIsPrimaryServingResponse + (*vtctldata.SetShardTabletControlResponse)(nil), // 216: vtctldata.SetShardTabletControlResponse + (*vtctldata.SetWritableResponse)(nil), // 217: vtctldata.SetWritableResponse + (*vtctldata.ShardReplicationAddResponse)(nil), // 218: vtctldata.ShardReplicationAddResponse + (*vtctldata.ShardReplicationFixResponse)(nil), // 219: vtctldata.ShardReplicationFixResponse + (*vtctldata.ShardReplicationPositionsResponse)(nil), // 220: vtctldata.ShardReplicationPositionsResponse + (*vtctldata.ShardReplicationRemoveResponse)(nil), // 221: vtctldata.ShardReplicationRemoveResponse + (*vtctldata.SleepTabletResponse)(nil), // 222: vtctldata.SleepTabletResponse + (*vtctldata.SourceShardAddResponse)(nil), // 223: vtctldata.SourceShardAddResponse + (*vtctldata.SourceShardDeleteResponse)(nil), // 224: vtctldata.SourceShardDeleteResponse + (*vtctldata.StartReplicationResponse)(nil), // 225: vtctldata.StartReplicationResponse + (*vtctldata.StopReplicationResponse)(nil), // 226: vtctldata.StopReplicationResponse + (*vtctldata.TabletExternallyReparentedResponse)(nil), // 227: vtctldata.TabletExternallyReparentedResponse + (*vtctldata.UpdateCellInfoResponse)(nil), // 228: vtctldata.UpdateCellInfoResponse + (*vtctldata.UpdateCellsAliasResponse)(nil), // 229: vtctldata.UpdateCellsAliasResponse + (*vtctldata.ValidateResponse)(nil), // 230: vtctldata.ValidateResponse + (*vtctldata.ValidateKeyspaceResponse)(nil), // 231: vtctldata.ValidateKeyspaceResponse + (*vtctldata.ValidatePermissionsKeyspaceResponse)(nil), // 232: vtctldata.ValidatePermissionsKeyspaceResponse + (*vtctldata.ValidateSchemaKeyspaceResponse)(nil), // 233: vtctldata.ValidateSchemaKeyspaceResponse + (*vtctldata.ValidateShardResponse)(nil), // 234: vtctldata.ValidateShardResponse + (*vtctldata.ValidateVersionKeyspaceResponse)(nil), // 235: vtctldata.ValidateVersionKeyspaceResponse + (*vtctldata.ValidateVersionShardResponse)(nil), // 236: vtctldata.ValidateVersionShardResponse + (*vtctldata.ValidateVSchemaResponse)(nil), // 237: vtctldata.ValidateVSchemaResponse + (*vtctldata.VDiffCreateResponse)(nil), // 238: vtctldata.VDiffCreateResponse + (*vtctldata.VDiffDeleteResponse)(nil), // 239: vtctldata.VDiffDeleteResponse + (*vtctldata.VDiffResumeResponse)(nil), // 240: vtctldata.VDiffResumeResponse + (*vtctldata.VDiffShowResponse)(nil), // 241: vtctldata.VDiffShowResponse + (*vtctldata.VDiffStopResponse)(nil), // 242: vtctldata.VDiffStopResponse + (*vtctldata.WorkflowDeleteResponse)(nil), // 243: vtctldata.WorkflowDeleteResponse + (*vtctldata.WorkflowSwitchTrafficResponse)(nil), // 244: vtctldata.WorkflowSwitchTrafficResponse + (*vtctldata.WorkflowUpdateResponse)(nil), // 245: vtctldata.WorkflowUpdateResponse + (*vtctldata.GetMirrorRulesResponse)(nil), // 246: vtctldata.GetMirrorRulesResponse + (*vtctldata.WorkflowMirrorTrafficResponse)(nil), // 247: vtctldata.WorkflowMirrorTrafficResponse } var file_vtctlservice_proto_depIdxs = []int32{ 0, // 0: vtctlservice.Vtctl.ExecuteVtctlCommand:input_type -> vtctldata.ExecuteVtctlCommandRequest @@ -1050,239 +1067,243 @@ var file_vtctlservice_proto_depIdxs = []int32{ 14, // 14: vtctlservice.Vtctld.CleanupSchemaMigration:input_type -> vtctldata.CleanupSchemaMigrationRequest 15, // 15: vtctlservice.Vtctld.CompleteSchemaMigration:input_type -> vtctldata.CompleteSchemaMigrationRequest 16, // 16: vtctlservice.Vtctld.ConcludeTransaction:input_type -> vtctldata.ConcludeTransactionRequest - 17, // 17: vtctlservice.Vtctld.CreateKeyspace:input_type -> vtctldata.CreateKeyspaceRequest - 18, // 18: vtctlservice.Vtctld.CreateShard:input_type -> vtctldata.CreateShardRequest - 19, // 19: vtctlservice.Vtctld.DeleteCellInfo:input_type -> vtctldata.DeleteCellInfoRequest - 20, // 20: vtctlservice.Vtctld.DeleteCellsAlias:input_type -> vtctldata.DeleteCellsAliasRequest - 21, // 21: vtctlservice.Vtctld.DeleteKeyspace:input_type -> vtctldata.DeleteKeyspaceRequest - 22, // 22: vtctlservice.Vtctld.DeleteShards:input_type -> vtctldata.DeleteShardsRequest - 23, // 23: vtctlservice.Vtctld.DeleteSrvVSchema:input_type -> vtctldata.DeleteSrvVSchemaRequest - 24, // 24: vtctlservice.Vtctld.DeleteTablets:input_type -> vtctldata.DeleteTabletsRequest - 25, // 25: vtctlservice.Vtctld.EmergencyReparentShard:input_type -> vtctldata.EmergencyReparentShardRequest - 26, // 26: vtctlservice.Vtctld.ExecuteFetchAsApp:input_type -> vtctldata.ExecuteFetchAsAppRequest - 27, // 27: vtctlservice.Vtctld.ExecuteFetchAsDBA:input_type -> vtctldata.ExecuteFetchAsDBARequest - 28, // 28: vtctlservice.Vtctld.ExecuteHook:input_type -> vtctldata.ExecuteHookRequest - 29, // 29: vtctlservice.Vtctld.ExecuteMultiFetchAsDBA:input_type -> vtctldata.ExecuteMultiFetchAsDBARequest - 30, // 30: vtctlservice.Vtctld.FindAllShardsInKeyspace:input_type -> vtctldata.FindAllShardsInKeyspaceRequest - 31, // 31: vtctlservice.Vtctld.ForceCutOverSchemaMigration:input_type -> vtctldata.ForceCutOverSchemaMigrationRequest - 32, // 32: vtctlservice.Vtctld.GetBackups:input_type -> vtctldata.GetBackupsRequest - 33, // 33: vtctlservice.Vtctld.GetCellInfo:input_type -> vtctldata.GetCellInfoRequest - 34, // 34: vtctlservice.Vtctld.GetCellInfoNames:input_type -> vtctldata.GetCellInfoNamesRequest - 35, // 35: vtctlservice.Vtctld.GetCellsAliases:input_type -> vtctldata.GetCellsAliasesRequest - 36, // 36: vtctlservice.Vtctld.GetFullStatus:input_type -> vtctldata.GetFullStatusRequest - 37, // 37: vtctlservice.Vtctld.GetKeyspace:input_type -> vtctldata.GetKeyspaceRequest - 38, // 38: vtctlservice.Vtctld.GetKeyspaces:input_type -> vtctldata.GetKeyspacesRequest - 39, // 39: vtctlservice.Vtctld.GetKeyspaceRoutingRules:input_type -> vtctldata.GetKeyspaceRoutingRulesRequest - 40, // 40: vtctlservice.Vtctld.GetPermissions:input_type -> vtctldata.GetPermissionsRequest - 41, // 41: vtctlservice.Vtctld.GetRoutingRules:input_type -> vtctldata.GetRoutingRulesRequest - 42, // 42: vtctlservice.Vtctld.GetSchema:input_type -> vtctldata.GetSchemaRequest - 43, // 43: vtctlservice.Vtctld.GetSchemaMigrations:input_type -> vtctldata.GetSchemaMigrationsRequest - 44, // 44: vtctlservice.Vtctld.GetShardReplication:input_type -> vtctldata.GetShardReplicationRequest - 45, // 45: vtctlservice.Vtctld.GetShard:input_type -> vtctldata.GetShardRequest - 46, // 46: vtctlservice.Vtctld.GetShardRoutingRules:input_type -> vtctldata.GetShardRoutingRulesRequest - 47, // 47: vtctlservice.Vtctld.GetSrvKeyspaceNames:input_type -> vtctldata.GetSrvKeyspaceNamesRequest - 48, // 48: vtctlservice.Vtctld.GetSrvKeyspaces:input_type -> vtctldata.GetSrvKeyspacesRequest - 49, // 49: vtctlservice.Vtctld.UpdateThrottlerConfig:input_type -> vtctldata.UpdateThrottlerConfigRequest - 50, // 50: vtctlservice.Vtctld.GetSrvVSchema:input_type -> vtctldata.GetSrvVSchemaRequest - 51, // 51: vtctlservice.Vtctld.GetSrvVSchemas:input_type -> vtctldata.GetSrvVSchemasRequest - 52, // 52: vtctlservice.Vtctld.GetTablet:input_type -> vtctldata.GetTabletRequest - 53, // 53: vtctlservice.Vtctld.GetTablets:input_type -> vtctldata.GetTabletsRequest - 54, // 54: vtctlservice.Vtctld.GetThrottlerStatus:input_type -> vtctldata.GetThrottlerStatusRequest - 55, // 55: vtctlservice.Vtctld.GetTopologyPath:input_type -> vtctldata.GetTopologyPathRequest - 56, // 56: vtctlservice.Vtctld.GetTransactionInfo:input_type -> vtctldata.GetTransactionInfoRequest - 57, // 57: vtctlservice.Vtctld.GetUnresolvedTransactions:input_type -> vtctldata.GetUnresolvedTransactionsRequest - 58, // 58: vtctlservice.Vtctld.GetVersion:input_type -> vtctldata.GetVersionRequest - 59, // 59: vtctlservice.Vtctld.GetVSchema:input_type -> vtctldata.GetVSchemaRequest - 60, // 60: vtctlservice.Vtctld.GetWorkflows:input_type -> vtctldata.GetWorkflowsRequest - 61, // 61: vtctlservice.Vtctld.InitShardPrimary:input_type -> vtctldata.InitShardPrimaryRequest - 62, // 62: vtctlservice.Vtctld.LaunchSchemaMigration:input_type -> vtctldata.LaunchSchemaMigrationRequest - 63, // 63: vtctlservice.Vtctld.LookupVindexCreate:input_type -> vtctldata.LookupVindexCreateRequest - 64, // 64: vtctlservice.Vtctld.LookupVindexExternalize:input_type -> vtctldata.LookupVindexExternalizeRequest - 65, // 65: vtctlservice.Vtctld.MaterializeCreate:input_type -> vtctldata.MaterializeCreateRequest - 66, // 66: vtctlservice.Vtctld.MigrateCreate:input_type -> vtctldata.MigrateCreateRequest - 67, // 67: vtctlservice.Vtctld.MountRegister:input_type -> vtctldata.MountRegisterRequest - 68, // 68: vtctlservice.Vtctld.MountUnregister:input_type -> vtctldata.MountUnregisterRequest - 69, // 69: vtctlservice.Vtctld.MountShow:input_type -> vtctldata.MountShowRequest - 70, // 70: vtctlservice.Vtctld.MountList:input_type -> vtctldata.MountListRequest - 71, // 71: vtctlservice.Vtctld.MoveTablesCreate:input_type -> vtctldata.MoveTablesCreateRequest - 72, // 72: vtctlservice.Vtctld.MoveTablesComplete:input_type -> vtctldata.MoveTablesCompleteRequest - 73, // 73: vtctlservice.Vtctld.PingTablet:input_type -> vtctldata.PingTabletRequest - 74, // 74: vtctlservice.Vtctld.PlannedReparentShard:input_type -> vtctldata.PlannedReparentShardRequest - 75, // 75: vtctlservice.Vtctld.RebuildKeyspaceGraph:input_type -> vtctldata.RebuildKeyspaceGraphRequest - 76, // 76: vtctlservice.Vtctld.RebuildVSchemaGraph:input_type -> vtctldata.RebuildVSchemaGraphRequest - 77, // 77: vtctlservice.Vtctld.RefreshState:input_type -> vtctldata.RefreshStateRequest - 78, // 78: vtctlservice.Vtctld.RefreshStateByShard:input_type -> vtctldata.RefreshStateByShardRequest - 79, // 79: vtctlservice.Vtctld.ReloadSchema:input_type -> vtctldata.ReloadSchemaRequest - 80, // 80: vtctlservice.Vtctld.ReloadSchemaKeyspace:input_type -> vtctldata.ReloadSchemaKeyspaceRequest - 81, // 81: vtctlservice.Vtctld.ReloadSchemaShard:input_type -> vtctldata.ReloadSchemaShardRequest - 82, // 82: vtctlservice.Vtctld.RemoveBackup:input_type -> vtctldata.RemoveBackupRequest - 83, // 83: vtctlservice.Vtctld.RemoveKeyspaceCell:input_type -> vtctldata.RemoveKeyspaceCellRequest - 84, // 84: vtctlservice.Vtctld.RemoveShardCell:input_type -> vtctldata.RemoveShardCellRequest - 85, // 85: vtctlservice.Vtctld.ReparentTablet:input_type -> vtctldata.ReparentTabletRequest - 86, // 86: vtctlservice.Vtctld.ReshardCreate:input_type -> vtctldata.ReshardCreateRequest - 87, // 87: vtctlservice.Vtctld.RestoreFromBackup:input_type -> vtctldata.RestoreFromBackupRequest - 88, // 88: vtctlservice.Vtctld.RetrySchemaMigration:input_type -> vtctldata.RetrySchemaMigrationRequest - 89, // 89: vtctlservice.Vtctld.RunHealthCheck:input_type -> vtctldata.RunHealthCheckRequest - 90, // 90: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:input_type -> vtctldata.SetKeyspaceDurabilityPolicyRequest - 91, // 91: vtctlservice.Vtctld.SetShardIsPrimaryServing:input_type -> vtctldata.SetShardIsPrimaryServingRequest - 92, // 92: vtctlservice.Vtctld.SetShardTabletControl:input_type -> vtctldata.SetShardTabletControlRequest - 93, // 93: vtctlservice.Vtctld.SetWritable:input_type -> vtctldata.SetWritableRequest - 94, // 94: vtctlservice.Vtctld.ShardReplicationAdd:input_type -> vtctldata.ShardReplicationAddRequest - 95, // 95: vtctlservice.Vtctld.ShardReplicationFix:input_type -> vtctldata.ShardReplicationFixRequest - 96, // 96: vtctlservice.Vtctld.ShardReplicationPositions:input_type -> vtctldata.ShardReplicationPositionsRequest - 97, // 97: vtctlservice.Vtctld.ShardReplicationRemove:input_type -> vtctldata.ShardReplicationRemoveRequest - 98, // 98: vtctlservice.Vtctld.SleepTablet:input_type -> vtctldata.SleepTabletRequest - 99, // 99: vtctlservice.Vtctld.SourceShardAdd:input_type -> vtctldata.SourceShardAddRequest - 100, // 100: vtctlservice.Vtctld.SourceShardDelete:input_type -> vtctldata.SourceShardDeleteRequest - 101, // 101: vtctlservice.Vtctld.StartReplication:input_type -> vtctldata.StartReplicationRequest - 102, // 102: vtctlservice.Vtctld.StopReplication:input_type -> vtctldata.StopReplicationRequest - 103, // 103: vtctlservice.Vtctld.TabletExternallyReparented:input_type -> vtctldata.TabletExternallyReparentedRequest - 104, // 104: vtctlservice.Vtctld.UpdateCellInfo:input_type -> vtctldata.UpdateCellInfoRequest - 105, // 105: vtctlservice.Vtctld.UpdateCellsAlias:input_type -> vtctldata.UpdateCellsAliasRequest - 106, // 106: vtctlservice.Vtctld.Validate:input_type -> vtctldata.ValidateRequest - 107, // 107: vtctlservice.Vtctld.ValidateKeyspace:input_type -> vtctldata.ValidateKeyspaceRequest - 108, // 108: vtctlservice.Vtctld.ValidateSchemaKeyspace:input_type -> vtctldata.ValidateSchemaKeyspaceRequest - 109, // 109: vtctlservice.Vtctld.ValidateShard:input_type -> vtctldata.ValidateShardRequest - 110, // 110: vtctlservice.Vtctld.ValidateVersionKeyspace:input_type -> vtctldata.ValidateVersionKeyspaceRequest - 111, // 111: vtctlservice.Vtctld.ValidateVersionShard:input_type -> vtctldata.ValidateVersionShardRequest - 112, // 112: vtctlservice.Vtctld.ValidateVSchema:input_type -> vtctldata.ValidateVSchemaRequest - 113, // 113: vtctlservice.Vtctld.VDiffCreate:input_type -> vtctldata.VDiffCreateRequest - 114, // 114: vtctlservice.Vtctld.VDiffDelete:input_type -> vtctldata.VDiffDeleteRequest - 115, // 115: vtctlservice.Vtctld.VDiffResume:input_type -> vtctldata.VDiffResumeRequest - 116, // 116: vtctlservice.Vtctld.VDiffShow:input_type -> vtctldata.VDiffShowRequest - 117, // 117: vtctlservice.Vtctld.VDiffStop:input_type -> vtctldata.VDiffStopRequest - 118, // 118: vtctlservice.Vtctld.WorkflowDelete:input_type -> vtctldata.WorkflowDeleteRequest - 119, // 119: vtctlservice.Vtctld.WorkflowStatus:input_type -> vtctldata.WorkflowStatusRequest - 120, // 120: vtctlservice.Vtctld.WorkflowSwitchTraffic:input_type -> vtctldata.WorkflowSwitchTrafficRequest - 121, // 121: vtctlservice.Vtctld.WorkflowUpdate:input_type -> vtctldata.WorkflowUpdateRequest - 122, // 122: vtctlservice.Vtctld.GetMirrorRules:input_type -> vtctldata.GetMirrorRulesRequest - 123, // 123: vtctlservice.Vtctld.WorkflowMirrorTraffic:input_type -> vtctldata.WorkflowMirrorTrafficRequest - 124, // 124: vtctlservice.Vtctl.ExecuteVtctlCommand:output_type -> vtctldata.ExecuteVtctlCommandResponse - 125, // 125: vtctlservice.Vtctld.AddCellInfo:output_type -> vtctldata.AddCellInfoResponse - 126, // 126: vtctlservice.Vtctld.AddCellsAlias:output_type -> vtctldata.AddCellsAliasResponse - 127, // 127: vtctlservice.Vtctld.ApplyRoutingRules:output_type -> vtctldata.ApplyRoutingRulesResponse - 128, // 128: vtctlservice.Vtctld.ApplySchema:output_type -> vtctldata.ApplySchemaResponse - 129, // 129: vtctlservice.Vtctld.ApplyKeyspaceRoutingRules:output_type -> vtctldata.ApplyKeyspaceRoutingRulesResponse - 130, // 130: vtctlservice.Vtctld.ApplyShardRoutingRules:output_type -> vtctldata.ApplyShardRoutingRulesResponse - 131, // 131: vtctlservice.Vtctld.ApplyVSchema:output_type -> vtctldata.ApplyVSchemaResponse - 132, // 132: vtctlservice.Vtctld.Backup:output_type -> vtctldata.BackupResponse - 132, // 133: vtctlservice.Vtctld.BackupShard:output_type -> vtctldata.BackupResponse - 133, // 134: vtctlservice.Vtctld.CancelSchemaMigration:output_type -> vtctldata.CancelSchemaMigrationResponse - 134, // 135: vtctlservice.Vtctld.ChangeTabletTags:output_type -> vtctldata.ChangeTabletTagsResponse - 135, // 136: vtctlservice.Vtctld.ChangeTabletType:output_type -> vtctldata.ChangeTabletTypeResponse - 136, // 137: vtctlservice.Vtctld.CheckThrottler:output_type -> vtctldata.CheckThrottlerResponse - 137, // 138: vtctlservice.Vtctld.CleanupSchemaMigration:output_type -> vtctldata.CleanupSchemaMigrationResponse - 138, // 139: vtctlservice.Vtctld.CompleteSchemaMigration:output_type -> vtctldata.CompleteSchemaMigrationResponse - 139, // 140: vtctlservice.Vtctld.ConcludeTransaction:output_type -> vtctldata.ConcludeTransactionResponse - 140, // 141: vtctlservice.Vtctld.CreateKeyspace:output_type -> vtctldata.CreateKeyspaceResponse - 141, // 142: vtctlservice.Vtctld.CreateShard:output_type -> vtctldata.CreateShardResponse - 142, // 143: vtctlservice.Vtctld.DeleteCellInfo:output_type -> vtctldata.DeleteCellInfoResponse - 143, // 144: vtctlservice.Vtctld.DeleteCellsAlias:output_type -> vtctldata.DeleteCellsAliasResponse - 144, // 145: vtctlservice.Vtctld.DeleteKeyspace:output_type -> vtctldata.DeleteKeyspaceResponse - 145, // 146: vtctlservice.Vtctld.DeleteShards:output_type -> vtctldata.DeleteShardsResponse - 146, // 147: vtctlservice.Vtctld.DeleteSrvVSchema:output_type -> vtctldata.DeleteSrvVSchemaResponse - 147, // 148: vtctlservice.Vtctld.DeleteTablets:output_type -> vtctldata.DeleteTabletsResponse - 148, // 149: vtctlservice.Vtctld.EmergencyReparentShard:output_type -> vtctldata.EmergencyReparentShardResponse - 149, // 150: vtctlservice.Vtctld.ExecuteFetchAsApp:output_type -> vtctldata.ExecuteFetchAsAppResponse - 150, // 151: vtctlservice.Vtctld.ExecuteFetchAsDBA:output_type -> vtctldata.ExecuteFetchAsDBAResponse - 151, // 152: vtctlservice.Vtctld.ExecuteHook:output_type -> vtctldata.ExecuteHookResponse - 152, // 153: vtctlservice.Vtctld.ExecuteMultiFetchAsDBA:output_type -> vtctldata.ExecuteMultiFetchAsDBAResponse - 153, // 154: vtctlservice.Vtctld.FindAllShardsInKeyspace:output_type -> vtctldata.FindAllShardsInKeyspaceResponse - 154, // 155: vtctlservice.Vtctld.ForceCutOverSchemaMigration:output_type -> vtctldata.ForceCutOverSchemaMigrationResponse - 155, // 156: vtctlservice.Vtctld.GetBackups:output_type -> vtctldata.GetBackupsResponse - 156, // 157: vtctlservice.Vtctld.GetCellInfo:output_type -> vtctldata.GetCellInfoResponse - 157, // 158: vtctlservice.Vtctld.GetCellInfoNames:output_type -> vtctldata.GetCellInfoNamesResponse - 158, // 159: vtctlservice.Vtctld.GetCellsAliases:output_type -> vtctldata.GetCellsAliasesResponse - 159, // 160: vtctlservice.Vtctld.GetFullStatus:output_type -> vtctldata.GetFullStatusResponse - 160, // 161: vtctlservice.Vtctld.GetKeyspace:output_type -> vtctldata.GetKeyspaceResponse - 161, // 162: vtctlservice.Vtctld.GetKeyspaces:output_type -> vtctldata.GetKeyspacesResponse - 162, // 163: vtctlservice.Vtctld.GetKeyspaceRoutingRules:output_type -> vtctldata.GetKeyspaceRoutingRulesResponse - 163, // 164: vtctlservice.Vtctld.GetPermissions:output_type -> vtctldata.GetPermissionsResponse - 164, // 165: vtctlservice.Vtctld.GetRoutingRules:output_type -> vtctldata.GetRoutingRulesResponse - 165, // 166: vtctlservice.Vtctld.GetSchema:output_type -> vtctldata.GetSchemaResponse - 166, // 167: vtctlservice.Vtctld.GetSchemaMigrations:output_type -> vtctldata.GetSchemaMigrationsResponse - 167, // 168: vtctlservice.Vtctld.GetShardReplication:output_type -> vtctldata.GetShardReplicationResponse - 168, // 169: vtctlservice.Vtctld.GetShard:output_type -> vtctldata.GetShardResponse - 169, // 170: vtctlservice.Vtctld.GetShardRoutingRules:output_type -> vtctldata.GetShardRoutingRulesResponse - 170, // 171: vtctlservice.Vtctld.GetSrvKeyspaceNames:output_type -> vtctldata.GetSrvKeyspaceNamesResponse - 171, // 172: vtctlservice.Vtctld.GetSrvKeyspaces:output_type -> vtctldata.GetSrvKeyspacesResponse - 172, // 173: vtctlservice.Vtctld.UpdateThrottlerConfig:output_type -> vtctldata.UpdateThrottlerConfigResponse - 173, // 174: vtctlservice.Vtctld.GetSrvVSchema:output_type -> vtctldata.GetSrvVSchemaResponse - 174, // 175: vtctlservice.Vtctld.GetSrvVSchemas:output_type -> vtctldata.GetSrvVSchemasResponse - 175, // 176: vtctlservice.Vtctld.GetTablet:output_type -> vtctldata.GetTabletResponse - 176, // 177: vtctlservice.Vtctld.GetTablets:output_type -> vtctldata.GetTabletsResponse - 177, // 178: vtctlservice.Vtctld.GetThrottlerStatus:output_type -> vtctldata.GetThrottlerStatusResponse - 178, // 179: vtctlservice.Vtctld.GetTopologyPath:output_type -> vtctldata.GetTopologyPathResponse - 179, // 180: vtctlservice.Vtctld.GetTransactionInfo:output_type -> vtctldata.GetTransactionInfoResponse - 180, // 181: vtctlservice.Vtctld.GetUnresolvedTransactions:output_type -> vtctldata.GetUnresolvedTransactionsResponse - 181, // 182: vtctlservice.Vtctld.GetVersion:output_type -> vtctldata.GetVersionResponse - 182, // 183: vtctlservice.Vtctld.GetVSchema:output_type -> vtctldata.GetVSchemaResponse - 183, // 184: vtctlservice.Vtctld.GetWorkflows:output_type -> vtctldata.GetWorkflowsResponse - 184, // 185: vtctlservice.Vtctld.InitShardPrimary:output_type -> vtctldata.InitShardPrimaryResponse - 185, // 186: vtctlservice.Vtctld.LaunchSchemaMigration:output_type -> vtctldata.LaunchSchemaMigrationResponse - 186, // 187: vtctlservice.Vtctld.LookupVindexCreate:output_type -> vtctldata.LookupVindexCreateResponse - 187, // 188: vtctlservice.Vtctld.LookupVindexExternalize:output_type -> vtctldata.LookupVindexExternalizeResponse - 188, // 189: vtctlservice.Vtctld.MaterializeCreate:output_type -> vtctldata.MaterializeCreateResponse - 189, // 190: vtctlservice.Vtctld.MigrateCreate:output_type -> vtctldata.WorkflowStatusResponse - 190, // 191: vtctlservice.Vtctld.MountRegister:output_type -> vtctldata.MountRegisterResponse - 191, // 192: vtctlservice.Vtctld.MountUnregister:output_type -> vtctldata.MountUnregisterResponse - 192, // 193: vtctlservice.Vtctld.MountShow:output_type -> vtctldata.MountShowResponse - 193, // 194: vtctlservice.Vtctld.MountList:output_type -> vtctldata.MountListResponse - 189, // 195: vtctlservice.Vtctld.MoveTablesCreate:output_type -> vtctldata.WorkflowStatusResponse - 194, // 196: vtctlservice.Vtctld.MoveTablesComplete:output_type -> vtctldata.MoveTablesCompleteResponse - 195, // 197: vtctlservice.Vtctld.PingTablet:output_type -> vtctldata.PingTabletResponse - 196, // 198: vtctlservice.Vtctld.PlannedReparentShard:output_type -> vtctldata.PlannedReparentShardResponse - 197, // 199: vtctlservice.Vtctld.RebuildKeyspaceGraph:output_type -> vtctldata.RebuildKeyspaceGraphResponse - 198, // 200: vtctlservice.Vtctld.RebuildVSchemaGraph:output_type -> vtctldata.RebuildVSchemaGraphResponse - 199, // 201: vtctlservice.Vtctld.RefreshState:output_type -> vtctldata.RefreshStateResponse - 200, // 202: vtctlservice.Vtctld.RefreshStateByShard:output_type -> vtctldata.RefreshStateByShardResponse - 201, // 203: vtctlservice.Vtctld.ReloadSchema:output_type -> vtctldata.ReloadSchemaResponse - 202, // 204: vtctlservice.Vtctld.ReloadSchemaKeyspace:output_type -> vtctldata.ReloadSchemaKeyspaceResponse - 203, // 205: vtctlservice.Vtctld.ReloadSchemaShard:output_type -> vtctldata.ReloadSchemaShardResponse - 204, // 206: vtctlservice.Vtctld.RemoveBackup:output_type -> vtctldata.RemoveBackupResponse - 205, // 207: vtctlservice.Vtctld.RemoveKeyspaceCell:output_type -> vtctldata.RemoveKeyspaceCellResponse - 206, // 208: vtctlservice.Vtctld.RemoveShardCell:output_type -> vtctldata.RemoveShardCellResponse - 207, // 209: vtctlservice.Vtctld.ReparentTablet:output_type -> vtctldata.ReparentTabletResponse - 189, // 210: vtctlservice.Vtctld.ReshardCreate:output_type -> vtctldata.WorkflowStatusResponse - 208, // 211: vtctlservice.Vtctld.RestoreFromBackup:output_type -> vtctldata.RestoreFromBackupResponse - 209, // 212: vtctlservice.Vtctld.RetrySchemaMigration:output_type -> vtctldata.RetrySchemaMigrationResponse - 210, // 213: vtctlservice.Vtctld.RunHealthCheck:output_type -> vtctldata.RunHealthCheckResponse - 211, // 214: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:output_type -> vtctldata.SetKeyspaceDurabilityPolicyResponse - 212, // 215: vtctlservice.Vtctld.SetShardIsPrimaryServing:output_type -> vtctldata.SetShardIsPrimaryServingResponse - 213, // 216: vtctlservice.Vtctld.SetShardTabletControl:output_type -> vtctldata.SetShardTabletControlResponse - 214, // 217: vtctlservice.Vtctld.SetWritable:output_type -> vtctldata.SetWritableResponse - 215, // 218: vtctlservice.Vtctld.ShardReplicationAdd:output_type -> vtctldata.ShardReplicationAddResponse - 216, // 219: vtctlservice.Vtctld.ShardReplicationFix:output_type -> vtctldata.ShardReplicationFixResponse - 217, // 220: vtctlservice.Vtctld.ShardReplicationPositions:output_type -> vtctldata.ShardReplicationPositionsResponse - 218, // 221: vtctlservice.Vtctld.ShardReplicationRemove:output_type -> vtctldata.ShardReplicationRemoveResponse - 219, // 222: vtctlservice.Vtctld.SleepTablet:output_type -> vtctldata.SleepTabletResponse - 220, // 223: vtctlservice.Vtctld.SourceShardAdd:output_type -> vtctldata.SourceShardAddResponse - 221, // 224: vtctlservice.Vtctld.SourceShardDelete:output_type -> vtctldata.SourceShardDeleteResponse - 222, // 225: vtctlservice.Vtctld.StartReplication:output_type -> vtctldata.StartReplicationResponse - 223, // 226: vtctlservice.Vtctld.StopReplication:output_type -> vtctldata.StopReplicationResponse - 224, // 227: vtctlservice.Vtctld.TabletExternallyReparented:output_type -> vtctldata.TabletExternallyReparentedResponse - 225, // 228: vtctlservice.Vtctld.UpdateCellInfo:output_type -> vtctldata.UpdateCellInfoResponse - 226, // 229: vtctlservice.Vtctld.UpdateCellsAlias:output_type -> vtctldata.UpdateCellsAliasResponse - 227, // 230: vtctlservice.Vtctld.Validate:output_type -> vtctldata.ValidateResponse - 228, // 231: vtctlservice.Vtctld.ValidateKeyspace:output_type -> vtctldata.ValidateKeyspaceResponse - 229, // 232: vtctlservice.Vtctld.ValidateSchemaKeyspace:output_type -> vtctldata.ValidateSchemaKeyspaceResponse - 230, // 233: vtctlservice.Vtctld.ValidateShard:output_type -> vtctldata.ValidateShardResponse - 231, // 234: vtctlservice.Vtctld.ValidateVersionKeyspace:output_type -> vtctldata.ValidateVersionKeyspaceResponse - 232, // 235: vtctlservice.Vtctld.ValidateVersionShard:output_type -> vtctldata.ValidateVersionShardResponse - 233, // 236: vtctlservice.Vtctld.ValidateVSchema:output_type -> vtctldata.ValidateVSchemaResponse - 234, // 237: vtctlservice.Vtctld.VDiffCreate:output_type -> vtctldata.VDiffCreateResponse - 235, // 238: vtctlservice.Vtctld.VDiffDelete:output_type -> vtctldata.VDiffDeleteResponse - 236, // 239: vtctlservice.Vtctld.VDiffResume:output_type -> vtctldata.VDiffResumeResponse - 237, // 240: vtctlservice.Vtctld.VDiffShow:output_type -> vtctldata.VDiffShowResponse - 238, // 241: vtctlservice.Vtctld.VDiffStop:output_type -> vtctldata.VDiffStopResponse - 239, // 242: vtctlservice.Vtctld.WorkflowDelete:output_type -> vtctldata.WorkflowDeleteResponse - 189, // 243: vtctlservice.Vtctld.WorkflowStatus:output_type -> vtctldata.WorkflowStatusResponse - 240, // 244: vtctlservice.Vtctld.WorkflowSwitchTraffic:output_type -> vtctldata.WorkflowSwitchTrafficResponse - 241, // 245: vtctlservice.Vtctld.WorkflowUpdate:output_type -> vtctldata.WorkflowUpdateResponse - 242, // 246: vtctlservice.Vtctld.GetMirrorRules:output_type -> vtctldata.GetMirrorRulesResponse - 243, // 247: vtctlservice.Vtctld.WorkflowMirrorTraffic:output_type -> vtctldata.WorkflowMirrorTrafficResponse - 124, // [124:248] is the sub-list for method output_type - 0, // [0:124] is the sub-list for method input_type + 17, // 17: vtctlservice.Vtctld.CopySchemaShard:input_type -> vtctldata.CopySchemaShardRequest + 18, // 18: vtctlservice.Vtctld.CreateKeyspace:input_type -> vtctldata.CreateKeyspaceRequest + 19, // 19: vtctlservice.Vtctld.CreateShard:input_type -> vtctldata.CreateShardRequest + 20, // 20: vtctlservice.Vtctld.DeleteCellInfo:input_type -> vtctldata.DeleteCellInfoRequest + 21, // 21: vtctlservice.Vtctld.DeleteCellsAlias:input_type -> vtctldata.DeleteCellsAliasRequest + 22, // 22: vtctlservice.Vtctld.DeleteKeyspace:input_type -> vtctldata.DeleteKeyspaceRequest + 23, // 23: vtctlservice.Vtctld.DeleteShards:input_type -> vtctldata.DeleteShardsRequest + 24, // 24: vtctlservice.Vtctld.DeleteSrvVSchema:input_type -> vtctldata.DeleteSrvVSchemaRequest + 25, // 25: vtctlservice.Vtctld.DeleteTablets:input_type -> vtctldata.DeleteTabletsRequest + 26, // 26: vtctlservice.Vtctld.EmergencyReparentShard:input_type -> vtctldata.EmergencyReparentShardRequest + 27, // 27: vtctlservice.Vtctld.ExecuteFetchAsApp:input_type -> vtctldata.ExecuteFetchAsAppRequest + 28, // 28: vtctlservice.Vtctld.ExecuteFetchAsDBA:input_type -> vtctldata.ExecuteFetchAsDBARequest + 29, // 29: vtctlservice.Vtctld.ExecuteHook:input_type -> vtctldata.ExecuteHookRequest + 30, // 30: vtctlservice.Vtctld.ExecuteMultiFetchAsDBA:input_type -> vtctldata.ExecuteMultiFetchAsDBARequest + 31, // 31: vtctlservice.Vtctld.FindAllShardsInKeyspace:input_type -> vtctldata.FindAllShardsInKeyspaceRequest + 32, // 32: vtctlservice.Vtctld.ForceCutOverSchemaMigration:input_type -> vtctldata.ForceCutOverSchemaMigrationRequest + 33, // 33: vtctlservice.Vtctld.GetBackups:input_type -> vtctldata.GetBackupsRequest + 34, // 34: vtctlservice.Vtctld.GetCellInfo:input_type -> vtctldata.GetCellInfoRequest + 35, // 35: vtctlservice.Vtctld.GetCellInfoNames:input_type -> vtctldata.GetCellInfoNamesRequest + 36, // 36: vtctlservice.Vtctld.GetCellsAliases:input_type -> vtctldata.GetCellsAliasesRequest + 37, // 37: vtctlservice.Vtctld.GetFullStatus:input_type -> vtctldata.GetFullStatusRequest + 38, // 38: vtctlservice.Vtctld.GetKeyspace:input_type -> vtctldata.GetKeyspaceRequest + 39, // 39: vtctlservice.Vtctld.GetKeyspaces:input_type -> vtctldata.GetKeyspacesRequest + 40, // 40: vtctlservice.Vtctld.GetKeyspaceRoutingRules:input_type -> vtctldata.GetKeyspaceRoutingRulesRequest + 41, // 41: vtctlservice.Vtctld.GetPermissions:input_type -> vtctldata.GetPermissionsRequest + 42, // 42: vtctlservice.Vtctld.GetRoutingRules:input_type -> vtctldata.GetRoutingRulesRequest + 43, // 43: vtctlservice.Vtctld.GetSchema:input_type -> vtctldata.GetSchemaRequest + 44, // 44: vtctlservice.Vtctld.GetSchemaMigrations:input_type -> vtctldata.GetSchemaMigrationsRequest + 45, // 45: vtctlservice.Vtctld.GetShardReplication:input_type -> vtctldata.GetShardReplicationRequest + 46, // 46: vtctlservice.Vtctld.GetShard:input_type -> vtctldata.GetShardRequest + 47, // 47: vtctlservice.Vtctld.GetShardRoutingRules:input_type -> vtctldata.GetShardRoutingRulesRequest + 48, // 48: vtctlservice.Vtctld.GetSrvKeyspaceNames:input_type -> vtctldata.GetSrvKeyspaceNamesRequest + 49, // 49: vtctlservice.Vtctld.GetSrvKeyspaces:input_type -> vtctldata.GetSrvKeyspacesRequest + 50, // 50: vtctlservice.Vtctld.UpdateThrottlerConfig:input_type -> vtctldata.UpdateThrottlerConfigRequest + 51, // 51: vtctlservice.Vtctld.GetSrvVSchema:input_type -> vtctldata.GetSrvVSchemaRequest + 52, // 52: vtctlservice.Vtctld.GetSrvVSchemas:input_type -> vtctldata.GetSrvVSchemasRequest + 53, // 53: vtctlservice.Vtctld.GetTablet:input_type -> vtctldata.GetTabletRequest + 54, // 54: vtctlservice.Vtctld.GetTablets:input_type -> vtctldata.GetTabletsRequest + 55, // 55: vtctlservice.Vtctld.GetThrottlerStatus:input_type -> vtctldata.GetThrottlerStatusRequest + 56, // 56: vtctlservice.Vtctld.GetTopologyPath:input_type -> vtctldata.GetTopologyPathRequest + 57, // 57: vtctlservice.Vtctld.GetTransactionInfo:input_type -> vtctldata.GetTransactionInfoRequest + 58, // 58: vtctlservice.Vtctld.GetUnresolvedTransactions:input_type -> vtctldata.GetUnresolvedTransactionsRequest + 59, // 59: vtctlservice.Vtctld.GetVersion:input_type -> vtctldata.GetVersionRequest + 60, // 60: vtctlservice.Vtctld.GetVSchema:input_type -> vtctldata.GetVSchemaRequest + 61, // 61: vtctlservice.Vtctld.GetWorkflows:input_type -> vtctldata.GetWorkflowsRequest + 62, // 62: vtctlservice.Vtctld.InitShardPrimary:input_type -> vtctldata.InitShardPrimaryRequest + 63, // 63: vtctlservice.Vtctld.LaunchSchemaMigration:input_type -> vtctldata.LaunchSchemaMigrationRequest + 64, // 64: vtctlservice.Vtctld.LookupVindexCreate:input_type -> vtctldata.LookupVindexCreateRequest + 65, // 65: vtctlservice.Vtctld.LookupVindexExternalize:input_type -> vtctldata.LookupVindexExternalizeRequest + 66, // 66: vtctlservice.Vtctld.MaterializeCreate:input_type -> vtctldata.MaterializeCreateRequest + 67, // 67: vtctlservice.Vtctld.MigrateCreate:input_type -> vtctldata.MigrateCreateRequest + 68, // 68: vtctlservice.Vtctld.MountRegister:input_type -> vtctldata.MountRegisterRequest + 69, // 69: vtctlservice.Vtctld.MountUnregister:input_type -> vtctldata.MountUnregisterRequest + 70, // 70: vtctlservice.Vtctld.MountShow:input_type -> vtctldata.MountShowRequest + 71, // 71: vtctlservice.Vtctld.MountList:input_type -> vtctldata.MountListRequest + 72, // 72: vtctlservice.Vtctld.MoveTablesCreate:input_type -> vtctldata.MoveTablesCreateRequest + 73, // 73: vtctlservice.Vtctld.MoveTablesComplete:input_type -> vtctldata.MoveTablesCompleteRequest + 74, // 74: vtctlservice.Vtctld.PingTablet:input_type -> vtctldata.PingTabletRequest + 75, // 75: vtctlservice.Vtctld.PlannedReparentShard:input_type -> vtctldata.PlannedReparentShardRequest + 76, // 76: vtctlservice.Vtctld.RebuildKeyspaceGraph:input_type -> vtctldata.RebuildKeyspaceGraphRequest + 77, // 77: vtctlservice.Vtctld.RebuildVSchemaGraph:input_type -> vtctldata.RebuildVSchemaGraphRequest + 78, // 78: vtctlservice.Vtctld.RefreshState:input_type -> vtctldata.RefreshStateRequest + 79, // 79: vtctlservice.Vtctld.RefreshStateByShard:input_type -> vtctldata.RefreshStateByShardRequest + 80, // 80: vtctlservice.Vtctld.ReloadSchema:input_type -> vtctldata.ReloadSchemaRequest + 81, // 81: vtctlservice.Vtctld.ReloadSchemaKeyspace:input_type -> vtctldata.ReloadSchemaKeyspaceRequest + 82, // 82: vtctlservice.Vtctld.ReloadSchemaShard:input_type -> vtctldata.ReloadSchemaShardRequest + 83, // 83: vtctlservice.Vtctld.RemoveBackup:input_type -> vtctldata.RemoveBackupRequest + 84, // 84: vtctlservice.Vtctld.RemoveKeyspaceCell:input_type -> vtctldata.RemoveKeyspaceCellRequest + 85, // 85: vtctlservice.Vtctld.RemoveShardCell:input_type -> vtctldata.RemoveShardCellRequest + 86, // 86: vtctlservice.Vtctld.ReparentTablet:input_type -> vtctldata.ReparentTabletRequest + 87, // 87: vtctlservice.Vtctld.ReshardCreate:input_type -> vtctldata.ReshardCreateRequest + 88, // 88: vtctlservice.Vtctld.RestoreFromBackup:input_type -> vtctldata.RestoreFromBackupRequest + 89, // 89: vtctlservice.Vtctld.RetrySchemaMigration:input_type -> vtctldata.RetrySchemaMigrationRequest + 90, // 90: vtctlservice.Vtctld.RunHealthCheck:input_type -> vtctldata.RunHealthCheckRequest + 91, // 91: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:input_type -> vtctldata.SetKeyspaceDurabilityPolicyRequest + 92, // 92: vtctlservice.Vtctld.SetShardIsPrimaryServing:input_type -> vtctldata.SetShardIsPrimaryServingRequest + 93, // 93: vtctlservice.Vtctld.SetShardTabletControl:input_type -> vtctldata.SetShardTabletControlRequest + 94, // 94: vtctlservice.Vtctld.SetWritable:input_type -> vtctldata.SetWritableRequest + 95, // 95: vtctlservice.Vtctld.ShardReplicationAdd:input_type -> vtctldata.ShardReplicationAddRequest + 96, // 96: vtctlservice.Vtctld.ShardReplicationFix:input_type -> vtctldata.ShardReplicationFixRequest + 97, // 97: vtctlservice.Vtctld.ShardReplicationPositions:input_type -> vtctldata.ShardReplicationPositionsRequest + 98, // 98: vtctlservice.Vtctld.ShardReplicationRemove:input_type -> vtctldata.ShardReplicationRemoveRequest + 99, // 99: vtctlservice.Vtctld.SleepTablet:input_type -> vtctldata.SleepTabletRequest + 100, // 100: vtctlservice.Vtctld.SourceShardAdd:input_type -> vtctldata.SourceShardAddRequest + 101, // 101: vtctlservice.Vtctld.SourceShardDelete:input_type -> vtctldata.SourceShardDeleteRequest + 102, // 102: vtctlservice.Vtctld.StartReplication:input_type -> vtctldata.StartReplicationRequest + 103, // 103: vtctlservice.Vtctld.StopReplication:input_type -> vtctldata.StopReplicationRequest + 104, // 104: vtctlservice.Vtctld.TabletExternallyReparented:input_type -> vtctldata.TabletExternallyReparentedRequest + 105, // 105: vtctlservice.Vtctld.UpdateCellInfo:input_type -> vtctldata.UpdateCellInfoRequest + 106, // 106: vtctlservice.Vtctld.UpdateCellsAlias:input_type -> vtctldata.UpdateCellsAliasRequest + 107, // 107: vtctlservice.Vtctld.Validate:input_type -> vtctldata.ValidateRequest + 108, // 108: vtctlservice.Vtctld.ValidateKeyspace:input_type -> vtctldata.ValidateKeyspaceRequest + 109, // 109: vtctlservice.Vtctld.ValidatePermissionsKeyspace:input_type -> vtctldata.ValidatePermissionsKeyspaceRequest + 110, // 110: vtctlservice.Vtctld.ValidateSchemaKeyspace:input_type -> vtctldata.ValidateSchemaKeyspaceRequest + 111, // 111: vtctlservice.Vtctld.ValidateShard:input_type -> vtctldata.ValidateShardRequest + 112, // 112: vtctlservice.Vtctld.ValidateVersionKeyspace:input_type -> vtctldata.ValidateVersionKeyspaceRequest + 113, // 113: vtctlservice.Vtctld.ValidateVersionShard:input_type -> vtctldata.ValidateVersionShardRequest + 114, // 114: vtctlservice.Vtctld.ValidateVSchema:input_type -> vtctldata.ValidateVSchemaRequest + 115, // 115: vtctlservice.Vtctld.VDiffCreate:input_type -> vtctldata.VDiffCreateRequest + 116, // 116: vtctlservice.Vtctld.VDiffDelete:input_type -> vtctldata.VDiffDeleteRequest + 117, // 117: vtctlservice.Vtctld.VDiffResume:input_type -> vtctldata.VDiffResumeRequest + 118, // 118: vtctlservice.Vtctld.VDiffShow:input_type -> vtctldata.VDiffShowRequest + 119, // 119: vtctlservice.Vtctld.VDiffStop:input_type -> vtctldata.VDiffStopRequest + 120, // 120: vtctlservice.Vtctld.WorkflowDelete:input_type -> vtctldata.WorkflowDeleteRequest + 121, // 121: vtctlservice.Vtctld.WorkflowStatus:input_type -> vtctldata.WorkflowStatusRequest + 122, // 122: vtctlservice.Vtctld.WorkflowSwitchTraffic:input_type -> vtctldata.WorkflowSwitchTrafficRequest + 123, // 123: vtctlservice.Vtctld.WorkflowUpdate:input_type -> vtctldata.WorkflowUpdateRequest + 124, // 124: vtctlservice.Vtctld.GetMirrorRules:input_type -> vtctldata.GetMirrorRulesRequest + 125, // 125: vtctlservice.Vtctld.WorkflowMirrorTraffic:input_type -> vtctldata.WorkflowMirrorTrafficRequest + 126, // 126: vtctlservice.Vtctl.ExecuteVtctlCommand:output_type -> vtctldata.ExecuteVtctlCommandResponse + 127, // 127: vtctlservice.Vtctld.AddCellInfo:output_type -> vtctldata.AddCellInfoResponse + 128, // 128: vtctlservice.Vtctld.AddCellsAlias:output_type -> vtctldata.AddCellsAliasResponse + 129, // 129: vtctlservice.Vtctld.ApplyRoutingRules:output_type -> vtctldata.ApplyRoutingRulesResponse + 130, // 130: vtctlservice.Vtctld.ApplySchema:output_type -> vtctldata.ApplySchemaResponse + 131, // 131: vtctlservice.Vtctld.ApplyKeyspaceRoutingRules:output_type -> vtctldata.ApplyKeyspaceRoutingRulesResponse + 132, // 132: vtctlservice.Vtctld.ApplyShardRoutingRules:output_type -> vtctldata.ApplyShardRoutingRulesResponse + 133, // 133: vtctlservice.Vtctld.ApplyVSchema:output_type -> vtctldata.ApplyVSchemaResponse + 134, // 134: vtctlservice.Vtctld.Backup:output_type -> vtctldata.BackupResponse + 134, // 135: vtctlservice.Vtctld.BackupShard:output_type -> vtctldata.BackupResponse + 135, // 136: vtctlservice.Vtctld.CancelSchemaMigration:output_type -> vtctldata.CancelSchemaMigrationResponse + 136, // 137: vtctlservice.Vtctld.ChangeTabletTags:output_type -> vtctldata.ChangeTabletTagsResponse + 137, // 138: vtctlservice.Vtctld.ChangeTabletType:output_type -> vtctldata.ChangeTabletTypeResponse + 138, // 139: vtctlservice.Vtctld.CheckThrottler:output_type -> vtctldata.CheckThrottlerResponse + 139, // 140: vtctlservice.Vtctld.CleanupSchemaMigration:output_type -> vtctldata.CleanupSchemaMigrationResponse + 140, // 141: vtctlservice.Vtctld.CompleteSchemaMigration:output_type -> vtctldata.CompleteSchemaMigrationResponse + 141, // 142: vtctlservice.Vtctld.ConcludeTransaction:output_type -> vtctldata.ConcludeTransactionResponse + 142, // 143: vtctlservice.Vtctld.CopySchemaShard:output_type -> vtctldata.CopySchemaShardResponse + 143, // 144: vtctlservice.Vtctld.CreateKeyspace:output_type -> vtctldata.CreateKeyspaceResponse + 144, // 145: vtctlservice.Vtctld.CreateShard:output_type -> vtctldata.CreateShardResponse + 145, // 146: vtctlservice.Vtctld.DeleteCellInfo:output_type -> vtctldata.DeleteCellInfoResponse + 146, // 147: vtctlservice.Vtctld.DeleteCellsAlias:output_type -> vtctldata.DeleteCellsAliasResponse + 147, // 148: vtctlservice.Vtctld.DeleteKeyspace:output_type -> vtctldata.DeleteKeyspaceResponse + 148, // 149: vtctlservice.Vtctld.DeleteShards:output_type -> vtctldata.DeleteShardsResponse + 149, // 150: vtctlservice.Vtctld.DeleteSrvVSchema:output_type -> vtctldata.DeleteSrvVSchemaResponse + 150, // 151: vtctlservice.Vtctld.DeleteTablets:output_type -> vtctldata.DeleteTabletsResponse + 151, // 152: vtctlservice.Vtctld.EmergencyReparentShard:output_type -> vtctldata.EmergencyReparentShardResponse + 152, // 153: vtctlservice.Vtctld.ExecuteFetchAsApp:output_type -> vtctldata.ExecuteFetchAsAppResponse + 153, // 154: vtctlservice.Vtctld.ExecuteFetchAsDBA:output_type -> vtctldata.ExecuteFetchAsDBAResponse + 154, // 155: vtctlservice.Vtctld.ExecuteHook:output_type -> vtctldata.ExecuteHookResponse + 155, // 156: vtctlservice.Vtctld.ExecuteMultiFetchAsDBA:output_type -> vtctldata.ExecuteMultiFetchAsDBAResponse + 156, // 157: vtctlservice.Vtctld.FindAllShardsInKeyspace:output_type -> vtctldata.FindAllShardsInKeyspaceResponse + 157, // 158: vtctlservice.Vtctld.ForceCutOverSchemaMigration:output_type -> vtctldata.ForceCutOverSchemaMigrationResponse + 158, // 159: vtctlservice.Vtctld.GetBackups:output_type -> vtctldata.GetBackupsResponse + 159, // 160: vtctlservice.Vtctld.GetCellInfo:output_type -> vtctldata.GetCellInfoResponse + 160, // 161: vtctlservice.Vtctld.GetCellInfoNames:output_type -> vtctldata.GetCellInfoNamesResponse + 161, // 162: vtctlservice.Vtctld.GetCellsAliases:output_type -> vtctldata.GetCellsAliasesResponse + 162, // 163: vtctlservice.Vtctld.GetFullStatus:output_type -> vtctldata.GetFullStatusResponse + 163, // 164: vtctlservice.Vtctld.GetKeyspace:output_type -> vtctldata.GetKeyspaceResponse + 164, // 165: vtctlservice.Vtctld.GetKeyspaces:output_type -> vtctldata.GetKeyspacesResponse + 165, // 166: vtctlservice.Vtctld.GetKeyspaceRoutingRules:output_type -> vtctldata.GetKeyspaceRoutingRulesResponse + 166, // 167: vtctlservice.Vtctld.GetPermissions:output_type -> vtctldata.GetPermissionsResponse + 167, // 168: vtctlservice.Vtctld.GetRoutingRules:output_type -> vtctldata.GetRoutingRulesResponse + 168, // 169: vtctlservice.Vtctld.GetSchema:output_type -> vtctldata.GetSchemaResponse + 169, // 170: vtctlservice.Vtctld.GetSchemaMigrations:output_type -> vtctldata.GetSchemaMigrationsResponse + 170, // 171: vtctlservice.Vtctld.GetShardReplication:output_type -> vtctldata.GetShardReplicationResponse + 171, // 172: vtctlservice.Vtctld.GetShard:output_type -> vtctldata.GetShardResponse + 172, // 173: vtctlservice.Vtctld.GetShardRoutingRules:output_type -> vtctldata.GetShardRoutingRulesResponse + 173, // 174: vtctlservice.Vtctld.GetSrvKeyspaceNames:output_type -> vtctldata.GetSrvKeyspaceNamesResponse + 174, // 175: vtctlservice.Vtctld.GetSrvKeyspaces:output_type -> vtctldata.GetSrvKeyspacesResponse + 175, // 176: vtctlservice.Vtctld.UpdateThrottlerConfig:output_type -> vtctldata.UpdateThrottlerConfigResponse + 176, // 177: vtctlservice.Vtctld.GetSrvVSchema:output_type -> vtctldata.GetSrvVSchemaResponse + 177, // 178: vtctlservice.Vtctld.GetSrvVSchemas:output_type -> vtctldata.GetSrvVSchemasResponse + 178, // 179: vtctlservice.Vtctld.GetTablet:output_type -> vtctldata.GetTabletResponse + 179, // 180: vtctlservice.Vtctld.GetTablets:output_type -> vtctldata.GetTabletsResponse + 180, // 181: vtctlservice.Vtctld.GetThrottlerStatus:output_type -> vtctldata.GetThrottlerStatusResponse + 181, // 182: vtctlservice.Vtctld.GetTopologyPath:output_type -> vtctldata.GetTopologyPathResponse + 182, // 183: vtctlservice.Vtctld.GetTransactionInfo:output_type -> vtctldata.GetTransactionInfoResponse + 183, // 184: vtctlservice.Vtctld.GetUnresolvedTransactions:output_type -> vtctldata.GetUnresolvedTransactionsResponse + 184, // 185: vtctlservice.Vtctld.GetVersion:output_type -> vtctldata.GetVersionResponse + 185, // 186: vtctlservice.Vtctld.GetVSchema:output_type -> vtctldata.GetVSchemaResponse + 186, // 187: vtctlservice.Vtctld.GetWorkflows:output_type -> vtctldata.GetWorkflowsResponse + 187, // 188: vtctlservice.Vtctld.InitShardPrimary:output_type -> vtctldata.InitShardPrimaryResponse + 188, // 189: vtctlservice.Vtctld.LaunchSchemaMigration:output_type -> vtctldata.LaunchSchemaMigrationResponse + 189, // 190: vtctlservice.Vtctld.LookupVindexCreate:output_type -> vtctldata.LookupVindexCreateResponse + 190, // 191: vtctlservice.Vtctld.LookupVindexExternalize:output_type -> vtctldata.LookupVindexExternalizeResponse + 191, // 192: vtctlservice.Vtctld.MaterializeCreate:output_type -> vtctldata.MaterializeCreateResponse + 192, // 193: vtctlservice.Vtctld.MigrateCreate:output_type -> vtctldata.WorkflowStatusResponse + 193, // 194: vtctlservice.Vtctld.MountRegister:output_type -> vtctldata.MountRegisterResponse + 194, // 195: vtctlservice.Vtctld.MountUnregister:output_type -> vtctldata.MountUnregisterResponse + 195, // 196: vtctlservice.Vtctld.MountShow:output_type -> vtctldata.MountShowResponse + 196, // 197: vtctlservice.Vtctld.MountList:output_type -> vtctldata.MountListResponse + 192, // 198: vtctlservice.Vtctld.MoveTablesCreate:output_type -> vtctldata.WorkflowStatusResponse + 197, // 199: vtctlservice.Vtctld.MoveTablesComplete:output_type -> vtctldata.MoveTablesCompleteResponse + 198, // 200: vtctlservice.Vtctld.PingTablet:output_type -> vtctldata.PingTabletResponse + 199, // 201: vtctlservice.Vtctld.PlannedReparentShard:output_type -> vtctldata.PlannedReparentShardResponse + 200, // 202: vtctlservice.Vtctld.RebuildKeyspaceGraph:output_type -> vtctldata.RebuildKeyspaceGraphResponse + 201, // 203: vtctlservice.Vtctld.RebuildVSchemaGraph:output_type -> vtctldata.RebuildVSchemaGraphResponse + 202, // 204: vtctlservice.Vtctld.RefreshState:output_type -> vtctldata.RefreshStateResponse + 203, // 205: vtctlservice.Vtctld.RefreshStateByShard:output_type -> vtctldata.RefreshStateByShardResponse + 204, // 206: vtctlservice.Vtctld.ReloadSchema:output_type -> vtctldata.ReloadSchemaResponse + 205, // 207: vtctlservice.Vtctld.ReloadSchemaKeyspace:output_type -> vtctldata.ReloadSchemaKeyspaceResponse + 206, // 208: vtctlservice.Vtctld.ReloadSchemaShard:output_type -> vtctldata.ReloadSchemaShardResponse + 207, // 209: vtctlservice.Vtctld.RemoveBackup:output_type -> vtctldata.RemoveBackupResponse + 208, // 210: vtctlservice.Vtctld.RemoveKeyspaceCell:output_type -> vtctldata.RemoveKeyspaceCellResponse + 209, // 211: vtctlservice.Vtctld.RemoveShardCell:output_type -> vtctldata.RemoveShardCellResponse + 210, // 212: vtctlservice.Vtctld.ReparentTablet:output_type -> vtctldata.ReparentTabletResponse + 192, // 213: vtctlservice.Vtctld.ReshardCreate:output_type -> vtctldata.WorkflowStatusResponse + 211, // 214: vtctlservice.Vtctld.RestoreFromBackup:output_type -> vtctldata.RestoreFromBackupResponse + 212, // 215: vtctlservice.Vtctld.RetrySchemaMigration:output_type -> vtctldata.RetrySchemaMigrationResponse + 213, // 216: vtctlservice.Vtctld.RunHealthCheck:output_type -> vtctldata.RunHealthCheckResponse + 214, // 217: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:output_type -> vtctldata.SetKeyspaceDurabilityPolicyResponse + 215, // 218: vtctlservice.Vtctld.SetShardIsPrimaryServing:output_type -> vtctldata.SetShardIsPrimaryServingResponse + 216, // 219: vtctlservice.Vtctld.SetShardTabletControl:output_type -> vtctldata.SetShardTabletControlResponse + 217, // 220: vtctlservice.Vtctld.SetWritable:output_type -> vtctldata.SetWritableResponse + 218, // 221: vtctlservice.Vtctld.ShardReplicationAdd:output_type -> vtctldata.ShardReplicationAddResponse + 219, // 222: vtctlservice.Vtctld.ShardReplicationFix:output_type -> vtctldata.ShardReplicationFixResponse + 220, // 223: vtctlservice.Vtctld.ShardReplicationPositions:output_type -> vtctldata.ShardReplicationPositionsResponse + 221, // 224: vtctlservice.Vtctld.ShardReplicationRemove:output_type -> vtctldata.ShardReplicationRemoveResponse + 222, // 225: vtctlservice.Vtctld.SleepTablet:output_type -> vtctldata.SleepTabletResponse + 223, // 226: vtctlservice.Vtctld.SourceShardAdd:output_type -> vtctldata.SourceShardAddResponse + 224, // 227: vtctlservice.Vtctld.SourceShardDelete:output_type -> vtctldata.SourceShardDeleteResponse + 225, // 228: vtctlservice.Vtctld.StartReplication:output_type -> vtctldata.StartReplicationResponse + 226, // 229: vtctlservice.Vtctld.StopReplication:output_type -> vtctldata.StopReplicationResponse + 227, // 230: vtctlservice.Vtctld.TabletExternallyReparented:output_type -> vtctldata.TabletExternallyReparentedResponse + 228, // 231: vtctlservice.Vtctld.UpdateCellInfo:output_type -> vtctldata.UpdateCellInfoResponse + 229, // 232: vtctlservice.Vtctld.UpdateCellsAlias:output_type -> vtctldata.UpdateCellsAliasResponse + 230, // 233: vtctlservice.Vtctld.Validate:output_type -> vtctldata.ValidateResponse + 231, // 234: vtctlservice.Vtctld.ValidateKeyspace:output_type -> vtctldata.ValidateKeyspaceResponse + 232, // 235: vtctlservice.Vtctld.ValidatePermissionsKeyspace:output_type -> vtctldata.ValidatePermissionsKeyspaceResponse + 233, // 236: vtctlservice.Vtctld.ValidateSchemaKeyspace:output_type -> vtctldata.ValidateSchemaKeyspaceResponse + 234, // 237: vtctlservice.Vtctld.ValidateShard:output_type -> vtctldata.ValidateShardResponse + 235, // 238: vtctlservice.Vtctld.ValidateVersionKeyspace:output_type -> vtctldata.ValidateVersionKeyspaceResponse + 236, // 239: vtctlservice.Vtctld.ValidateVersionShard:output_type -> vtctldata.ValidateVersionShardResponse + 237, // 240: vtctlservice.Vtctld.ValidateVSchema:output_type -> vtctldata.ValidateVSchemaResponse + 238, // 241: vtctlservice.Vtctld.VDiffCreate:output_type -> vtctldata.VDiffCreateResponse + 239, // 242: vtctlservice.Vtctld.VDiffDelete:output_type -> vtctldata.VDiffDeleteResponse + 240, // 243: vtctlservice.Vtctld.VDiffResume:output_type -> vtctldata.VDiffResumeResponse + 241, // 244: vtctlservice.Vtctld.VDiffShow:output_type -> vtctldata.VDiffShowResponse + 242, // 245: vtctlservice.Vtctld.VDiffStop:output_type -> vtctldata.VDiffStopResponse + 243, // 246: vtctlservice.Vtctld.WorkflowDelete:output_type -> vtctldata.WorkflowDeleteResponse + 192, // 247: vtctlservice.Vtctld.WorkflowStatus:output_type -> vtctldata.WorkflowStatusResponse + 244, // 248: vtctlservice.Vtctld.WorkflowSwitchTraffic:output_type -> vtctldata.WorkflowSwitchTrafficResponse + 245, // 249: vtctlservice.Vtctld.WorkflowUpdate:output_type -> vtctldata.WorkflowUpdateResponse + 246, // 250: vtctlservice.Vtctld.GetMirrorRules:output_type -> vtctldata.GetMirrorRulesResponse + 247, // 251: vtctlservice.Vtctld.WorkflowMirrorTraffic:output_type -> vtctldata.WorkflowMirrorTrafficResponse + 126, // [126:252] is the sub-list for method output_type + 0, // [0:126] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go b/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go index 0b2e5bae7dc..8447dbf10c7 100644 --- a/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go +++ b/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go @@ -179,6 +179,8 @@ type VtctldClient interface { CompleteSchemaMigration(ctx context.Context, in *vtctldata.CompleteSchemaMigrationRequest, opts ...grpc.CallOption) (*vtctldata.CompleteSchemaMigrationResponse, error) // CompleteSchemaMigration completes one or all migrations executed with --postpone-completion. ConcludeTransaction(ctx context.Context, in *vtctldata.ConcludeTransactionRequest, opts ...grpc.CallOption) (*vtctldata.ConcludeTransactionResponse, error) + // CopySchemaShard copies the schema from a source tablet to all tablets in a keyspace/shard. + CopySchemaShard(ctx context.Context, in *vtctldata.CopySchemaShardRequest, opts ...grpc.CallOption) (*vtctldata.CopySchemaShardResponse, error) // CreateKeyspace creates the specified keyspace in the topology. For a // SNAPSHOT keyspace, the request must specify the name of a base keyspace, // as well as a snapshot time. @@ -449,6 +451,8 @@ type VtctldClient interface { // ValidateKeyspace validates that all nodes reachable from the specified // keyspace are consistent. ValidateKeyspace(ctx context.Context, in *vtctldata.ValidateKeyspaceRequest, opts ...grpc.CallOption) (*vtctldata.ValidateKeyspaceResponse, error) + // ValidatePermissionsKeyspace validates that all the permissions are the same in a keyspace. + ValidatePermissionsKeyspace(ctx context.Context, in *vtctldata.ValidatePermissionsKeyspaceRequest, opts ...grpc.CallOption) (*vtctldata.ValidatePermissionsKeyspaceResponse, error) // ValidateSchemaKeyspace validates that the schema on the primary tablet for shard 0 matches the schema on all of the other tablets in the keyspace. ValidateSchemaKeyspace(ctx context.Context, in *vtctldata.ValidateSchemaKeyspaceRequest, opts ...grpc.CallOption) (*vtctldata.ValidateSchemaKeyspaceResponse, error) // ValidateShard validates that all nodes reachable from the specified shard @@ -675,6 +679,15 @@ func (c *vtctldClient) ConcludeTransaction(ctx context.Context, in *vtctldata.Co return out, nil } +func (c *vtctldClient) CopySchemaShard(ctx context.Context, in *vtctldata.CopySchemaShardRequest, opts ...grpc.CallOption) (*vtctldata.CopySchemaShardResponse, error) { + out := new(vtctldata.CopySchemaShardResponse) + err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/CopySchemaShard", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vtctldClient) CreateKeyspace(ctx context.Context, in *vtctldata.CreateKeyspaceRequest, opts ...grpc.CallOption) (*vtctldata.CreateKeyspaceResponse, error) { out := new(vtctldata.CreateKeyspaceResponse) err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/CreateKeyspace", in, out, opts...) @@ -1517,6 +1530,15 @@ func (c *vtctldClient) ValidateKeyspace(ctx context.Context, in *vtctldata.Valid return out, nil } +func (c *vtctldClient) ValidatePermissionsKeyspace(ctx context.Context, in *vtctldata.ValidatePermissionsKeyspaceRequest, opts ...grpc.CallOption) (*vtctldata.ValidatePermissionsKeyspaceResponse, error) { + out := new(vtctldata.ValidatePermissionsKeyspaceResponse) + err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/ValidatePermissionsKeyspace", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vtctldClient) ValidateSchemaKeyspace(ctx context.Context, in *vtctldata.ValidateSchemaKeyspaceRequest, opts ...grpc.CallOption) (*vtctldata.ValidateSchemaKeyspaceResponse, error) { out := new(vtctldata.ValidateSchemaKeyspaceResponse) err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/ValidateSchemaKeyspace", in, out, opts...) @@ -1708,6 +1730,8 @@ type VtctldServer interface { CompleteSchemaMigration(context.Context, *vtctldata.CompleteSchemaMigrationRequest) (*vtctldata.CompleteSchemaMigrationResponse, error) // CompleteSchemaMigration completes one or all migrations executed with --postpone-completion. ConcludeTransaction(context.Context, *vtctldata.ConcludeTransactionRequest) (*vtctldata.ConcludeTransactionResponse, error) + // CopySchemaShard copies the schema from a source tablet to all tablets in a keyspace/shard. + CopySchemaShard(context.Context, *vtctldata.CopySchemaShardRequest) (*vtctldata.CopySchemaShardResponse, error) // CreateKeyspace creates the specified keyspace in the topology. For a // SNAPSHOT keyspace, the request must specify the name of a base keyspace, // as well as a snapshot time. @@ -1978,6 +2002,8 @@ type VtctldServer interface { // ValidateKeyspace validates that all nodes reachable from the specified // keyspace are consistent. ValidateKeyspace(context.Context, *vtctldata.ValidateKeyspaceRequest) (*vtctldata.ValidateKeyspaceResponse, error) + // ValidatePermissionsKeyspace validates that all the permissions are the same in a keyspace. + ValidatePermissionsKeyspace(context.Context, *vtctldata.ValidatePermissionsKeyspaceRequest) (*vtctldata.ValidatePermissionsKeyspaceResponse, error) // ValidateSchemaKeyspace validates that the schema on the primary tablet for shard 0 matches the schema on all of the other tablets in the keyspace. ValidateSchemaKeyspace(context.Context, *vtctldata.ValidateSchemaKeyspaceRequest) (*vtctldata.ValidateSchemaKeyspaceResponse, error) // ValidateShard validates that all nodes reachable from the specified shard @@ -2059,6 +2085,9 @@ func (UnimplementedVtctldServer) CompleteSchemaMigration(context.Context, *vtctl func (UnimplementedVtctldServer) ConcludeTransaction(context.Context, *vtctldata.ConcludeTransactionRequest) (*vtctldata.ConcludeTransactionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ConcludeTransaction not implemented") } +func (UnimplementedVtctldServer) CopySchemaShard(context.Context, *vtctldata.CopySchemaShardRequest) (*vtctldata.CopySchemaShardResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CopySchemaShard not implemented") +} func (UnimplementedVtctldServer) CreateKeyspace(context.Context, *vtctldata.CreateKeyspaceRequest) (*vtctldata.CreateKeyspaceResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateKeyspace not implemented") } @@ -2332,6 +2361,9 @@ func (UnimplementedVtctldServer) Validate(context.Context, *vtctldata.ValidateRe func (UnimplementedVtctldServer) ValidateKeyspace(context.Context, *vtctldata.ValidateKeyspaceRequest) (*vtctldata.ValidateKeyspaceResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ValidateKeyspace not implemented") } +func (UnimplementedVtctldServer) ValidatePermissionsKeyspace(context.Context, *vtctldata.ValidatePermissionsKeyspaceRequest) (*vtctldata.ValidatePermissionsKeyspaceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ValidatePermissionsKeyspace not implemented") +} func (UnimplementedVtctldServer) ValidateSchemaKeyspace(context.Context, *vtctldata.ValidateSchemaKeyspaceRequest) (*vtctldata.ValidateSchemaKeyspaceResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ValidateSchemaKeyspace not implemented") } @@ -2687,6 +2719,24 @@ func _Vtctld_ConcludeTransaction_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _Vtctld_CopySchemaShard_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(vtctldata.CopySchemaShardRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VtctldServer).CopySchemaShard(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtctlservice.Vtctld/CopySchemaShard", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VtctldServer).CopySchemaShard(ctx, req.(*vtctldata.CopySchemaShardRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Vtctld_CreateKeyspace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(vtctldata.CreateKeyspaceRequest) if err := dec(in); err != nil { @@ -4328,6 +4378,24 @@ func _Vtctld_ValidateKeyspace_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Vtctld_ValidatePermissionsKeyspace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(vtctldata.ValidatePermissionsKeyspaceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VtctldServer).ValidatePermissionsKeyspace(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtctlservice.Vtctld/ValidatePermissionsKeyspace", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VtctldServer).ValidatePermissionsKeyspace(ctx, req.(*vtctldata.ValidatePermissionsKeyspaceRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Vtctld_ValidateSchemaKeyspace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(vtctldata.ValidateSchemaKeyspaceRequest) if err := dec(in); err != nil { @@ -4679,6 +4747,10 @@ var Vtctld_ServiceDesc = grpc.ServiceDesc{ MethodName: "ConcludeTransaction", Handler: _Vtctld_ConcludeTransaction_Handler, }, + { + MethodName: "CopySchemaShard", + Handler: _Vtctld_CopySchemaShard_Handler, + }, { MethodName: "CreateKeyspace", Handler: _Vtctld_CreateKeyspace_Handler, @@ -5039,6 +5111,10 @@ var Vtctld_ServiceDesc = grpc.ServiceDesc{ MethodName: "ValidateKeyspace", Handler: _Vtctld_ValidateKeyspace_Handler, }, + { + MethodName: "ValidatePermissionsKeyspace", + Handler: _Vtctld_ValidatePermissionsKeyspace_Handler, + }, { MethodName: "ValidateSchemaKeyspace", Handler: _Vtctld_ValidateSchemaKeyspace_Handler, diff --git a/go/vt/proto/vttime/cached_size.go b/go/vt/proto/vttime/cached_size.go index 62a6366ba3c..f2b69dbefae 100644 --- a/go/vt/proto/vttime/cached_size.go +++ b/go/vt/proto/vttime/cached_size.go @@ -17,6 +17,8 @@ limitations under the License. package vttime +import hack "vitess.io/vitess/go/hack" + func (cached *Time) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -25,5 +27,9 @@ func (cached *Time) CachedSize(alloc bool) int64 { if alloc { size += int64(64) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } return size } diff --git a/go/vt/schemadiff/view.go b/go/vt/schemadiff/view.go index 8783f1803bb..ff34d772dcf 100644 --- a/go/vt/schemadiff/view.go +++ b/go/vt/schemadiff/view.go @@ -427,6 +427,6 @@ func (c *CreateViewEntity) identicalOtherThanName(other *CreateViewEntity) bool c.IsReplace == other.IsReplace && sqlparser.Equals.RefOfDefiner(c.Definer, other.Definer) && sqlparser.Equals.Columns(c.Columns, other.Columns) && - sqlparser.Equals.SelectStatement(c.Select, other.Select) && + sqlparser.Equals.Statement(c.Select, other.Select) && sqlparser.Equals.RefOfParsedComments(c.Comments, other.Comments) } diff --git a/go/vt/servenv/buildinfo_test.go b/go/vt/servenv/buildinfo_test.go index bc972df03ea..a4a63cdb560 100644 --- a/go/vt/servenv/buildinfo_test.go +++ b/go/vt/servenv/buildinfo_test.go @@ -45,7 +45,7 @@ func TestVersionString(t *testing.T) { assert.Equal(t, "Version: v1.2.3-SNAPSHOT (Jenkins build 422) (Git revision d54b87ca0be09b678bb4490060e8f23f890ddb92 branch 'gitBranch') built on time is now by user@host using 1.20.2 amiga/amd64", v.String()) - assert.Equal(t, "8.0.30-Vitess", v.MySQLVersion()) + assert.Equal(t, "8.0.40-Vitess", v.MySQLVersion()) } func TestBuildVersionStats(t *testing.T) { diff --git a/go/vt/sqlparser/ast.go b/go/vt/sqlparser/ast.go index 92c67d55999..e673b1ebf74 100644 --- a/go/vt/sqlparser/ast.go +++ b/go/vt/sqlparser/ast.go @@ -57,6 +57,34 @@ type ( OrderAndLimit interface { AddOrder(*Order) SetLimit(*Limit) + GetOrderBy() OrderBy + SetOrderBy(OrderBy) + GetLimit() *Limit + } + + TableStatement interface { + iTableStatement() + + InsertRows + Statement + OrderAndLimit + Commented + ColumnResults + Withable + } + + ColumnResults interface { + GetColumnCount() int + GetColumns() SelectExprs + } + + Withable interface { + SetWith(with *With) + } + + Distinctable interface { + MakeDistinct() + IsDistinct() bool } // SelectStatement any SELECT statement. @@ -64,19 +92,14 @@ type ( Statement InsertRows OrderAndLimit + Commented + ColumnResults + Withable + Distinctable iSelectStatement() GetLock() Lock SetLock(lock Lock) SetInto(into *SelectInto) - SetWith(with *With) - MakeDistinct() - GetColumnCount() int - GetColumns() SelectExprs - Commented - IsDistinct() bool - GetOrderBy() OrderBy - SetOrderBy(OrderBy) - GetLimit() *Limit } // DDLStatement represents any DDL Statement @@ -161,7 +184,7 @@ type ( CommonTableExpr struct { ID IdentifierCS Columns Columns - Subquery SelectStatement + Subquery TableStatement } // ChangeColumn is used to change the column definition, can also rename the column in alter table command ChangeColumn struct { @@ -303,8 +326,8 @@ type ( // Union represents a UNION statement. Union struct { With *With - Left SelectStatement - Right SelectStatement + Left TableStatement + Right TableStatement Distinct bool OrderBy OrderBy Limit *Limit @@ -543,7 +566,7 @@ type ( Definer *Definer Security string Columns Columns - Select SelectStatement + Select TableStatement CheckOption string IsReplace bool Comments *ParsedComments @@ -556,7 +579,7 @@ type ( Definer *Definer Security string Columns Columns - Select SelectStatement + Select TableStatement CheckOption string Comments *ParsedComments } @@ -727,58 +750,63 @@ type ( var _ OrderAndLimit = (*Select)(nil) var _ OrderAndLimit = (*Update)(nil) var _ OrderAndLimit = (*Delete)(nil) - -func (*Union) iStatement() {} -func (*Select) iStatement() {} -func (*Stream) iStatement() {} -func (*VStream) iStatement() {} -func (*Insert) iStatement() {} -func (*Update) iStatement() {} -func (*Delete) iStatement() {} -func (*Set) iStatement() {} -func (*DropDatabase) iStatement() {} -func (*Flush) iStatement() {} -func (*Show) iStatement() {} -func (*Use) iStatement() {} -func (*Begin) iStatement() {} -func (*Commit) iStatement() {} -func (*Rollback) iStatement() {} -func (*SRollback) iStatement() {} -func (*Savepoint) iStatement() {} -func (*Release) iStatement() {} -func (*Analyze) iStatement() {} -func (*OtherAdmin) iStatement() {} -func (*CommentOnly) iStatement() {} -func (*Select) iSelectStatement() {} -func (*Union) iSelectStatement() {} -func (*Load) iStatement() {} -func (*CreateDatabase) iStatement() {} -func (*AlterDatabase) iStatement() {} -func (*CreateTable) iStatement() {} -func (*CreateView) iStatement() {} -func (*AlterView) iStatement() {} -func (*LockTables) iStatement() {} -func (*UnlockTables) iStatement() {} -func (*AlterTable) iStatement() {} -func (*AlterVschema) iStatement() {} -func (*AlterMigration) iStatement() {} -func (*RevertMigration) iStatement() {} -func (*ShowMigrationLogs) iStatement() {} -func (*ShowThrottledApps) iStatement() {} -func (*ShowThrottlerStatus) iStatement() {} -func (*DropTable) iStatement() {} -func (*DropView) iStatement() {} -func (*TruncateTable) iStatement() {} -func (*RenameTable) iStatement() {} -func (*CallProc) iStatement() {} -func (*ExplainStmt) iStatement() {} -func (*VExplainStmt) iStatement() {} -func (*ExplainTab) iStatement() {} -func (*PrepareStmt) iStatement() {} -func (*ExecuteStmt) iStatement() {} -func (*DeallocateStmt) iStatement() {} -func (*PurgeBinaryLogs) iStatement() {} -func (*Kill) iStatement() {} +var _ OrderAndLimit = (*ValuesStatement)(nil) + +func (*Union) iStatement() {} +func (*Select) iStatement() {} +func (*ValuesStatement) iStatement() {} +func (*Stream) iStatement() {} +func (*VStream) iStatement() {} +func (*Insert) iStatement() {} +func (*Update) iStatement() {} +func (*Delete) iStatement() {} +func (*Set) iStatement() {} +func (*DropDatabase) iStatement() {} +func (*Flush) iStatement() {} +func (*Show) iStatement() {} +func (*Use) iStatement() {} +func (*Begin) iStatement() {} +func (*Commit) iStatement() {} +func (*Rollback) iStatement() {} +func (*SRollback) iStatement() {} +func (*Savepoint) iStatement() {} +func (*Release) iStatement() {} +func (*Analyze) iStatement() {} +func (*OtherAdmin) iStatement() {} +func (*CommentOnly) iStatement() {} +func (*Select) iSelectStatement() {} +func (*Select) iTableStatement() {} +func (*ValuesStatement) iSelectStatement() {} +func (*Union) iSelectStatement() {} +func (*Union) iTableStatement() {} +func (*Load) iStatement() {} +func (*CreateDatabase) iStatement() {} +func (*AlterDatabase) iStatement() {} +func (*CreateTable) iStatement() {} +func (*CreateView) iStatement() {} +func (*AlterView) iStatement() {} +func (*LockTables) iStatement() {} +func (*UnlockTables) iStatement() {} +func (*AlterTable) iStatement() {} +func (*AlterVschema) iStatement() {} +func (*AlterMigration) iStatement() {} +func (*RevertMigration) iStatement() {} +func (*ShowMigrationLogs) iStatement() {} +func (*ShowThrottledApps) iStatement() {} +func (*ShowThrottlerStatus) iStatement() {} +func (*DropTable) iStatement() {} +func (*DropView) iStatement() {} +func (*TruncateTable) iStatement() {} +func (*RenameTable) iStatement() {} +func (*CallProc) iStatement() {} +func (*ExplainStmt) iStatement() {} +func (*VExplainStmt) iStatement() {} +func (*ExplainTab) iStatement() {} +func (*PrepareStmt) iStatement() {} +func (*ExecuteStmt) iStatement() {} +func (*DeallocateStmt) iStatement() {} +func (*PurgeBinaryLogs) iStatement() {} +func (*Kill) iStatement() {} func (*CreateView) iDDLStatement() {} func (*AlterView) iDDLStatement() {} @@ -1702,9 +1730,10 @@ type InsertRows interface { SQLNode } -func (*Select) iInsertRows() {} -func (*Union) iInsertRows() {} -func (Values) iInsertRows() {} +func (*Select) iInsertRows() {} +func (*Union) iInsertRows() {} +func (Values) iInsertRows() {} +func (*ValuesStatement) iInsertRows() {} // OptLike works for create table xxx like xxx type OptLike struct { @@ -2108,13 +2137,13 @@ type ( // Subquery represents a subquery used as an value expression. Subquery struct { - Select SelectStatement + Select TableStatement } // DerivedTable represents a subquery used as a table expression. DerivedTable struct { Lateral bool - Select SelectStatement + Select TableStatement } ) @@ -3575,6 +3604,18 @@ type Limit struct { // Values represents a VALUES clause. type Values []ValTuple +// ValuesStatement represents a VALUES statement, as in VALUES ROW(1, 2), ROW(3, 4) +type ValuesStatement struct { + With *With + // One but not both of these fields can be set. + Rows Values + ListArg ListArg + + Comments *ParsedComments + Order OrderBy + Limit *Limit +} + // UpdateExprs represents a list of update expressions. type UpdateExprs []*UpdateExpr diff --git a/go/vt/sqlparser/ast_clone.go b/go/vt/sqlparser/ast_clone.go index 03a5fabe552..3c7f4fe5e6a 100644 --- a/go/vt/sqlparser/ast_clone.go +++ b/go/vt/sqlparser/ast_clone.go @@ -535,6 +535,8 @@ func CloneSQLNode(in SQLNode) SQLNode { return CloneValues(in) case *ValuesFuncExpr: return CloneRefOfValuesFuncExpr(in) + case *ValuesStatement: + return CloneRefOfValuesStatement(in) case *VarPop: return CloneRefOfVarPop(in) case *VarSamp: @@ -711,7 +713,7 @@ func CloneRefOfAlterView(n *AlterView) *AlterView { out.ViewName = CloneTableName(n.ViewName) out.Definer = CloneRefOfDefiner(n.Definer) out.Columns = CloneColumns(n.Columns) - out.Select = CloneSelectStatement(n.Select) + out.Select = CloneTableStatement(n.Select) out.Comments = CloneRefOfParsedComments(n.Comments) return &out } @@ -1023,7 +1025,7 @@ func CloneRefOfCommonTableExpr(n *CommonTableExpr) *CommonTableExpr { out := *n out.ID = CloneIdentifierCS(n.ID) out.Columns = CloneColumns(n.Columns) - out.Subquery = CloneSelectStatement(n.Subquery) + out.Subquery = CloneTableStatement(n.Subquery) return &out } @@ -1138,7 +1140,7 @@ func CloneRefOfCreateView(n *CreateView) *CreateView { out.ViewName = CloneTableName(n.ViewName) out.Definer = CloneRefOfDefiner(n.Definer) out.Columns = CloneColumns(n.Columns) - out.Select = CloneSelectStatement(n.Select) + out.Select = CloneTableStatement(n.Select) out.Comments = CloneRefOfParsedComments(n.Comments) return &out } @@ -1205,7 +1207,7 @@ func CloneRefOfDerivedTable(n *DerivedTable) *DerivedTable { return nil } out := *n - out.Select = CloneSelectStatement(n.Select) + out.Select = CloneTableStatement(n.Select) return &out } @@ -3042,7 +3044,7 @@ func CloneRefOfSubquery(n *Subquery) *Subquery { return nil } out := *n - out.Select = CloneSelectStatement(n.Select) + out.Select = CloneTableStatement(n.Select) return &out } @@ -3182,8 +3184,8 @@ func CloneRefOfUnion(n *Union) *Union { } out := *n out.With = CloneRefOfWith(n.With) - out.Left = CloneSelectStatement(n.Left) - out.Right = CloneSelectStatement(n.Right) + out.Left = CloneTableStatement(n.Left) + out.Right = CloneTableStatement(n.Right) out.OrderBy = CloneOrderBy(n.OrderBy) out.Limit = CloneRefOfLimit(n.Limit) out.Into = CloneRefOfSelectInto(n.Into) @@ -3328,6 +3330,20 @@ func CloneRefOfValuesFuncExpr(n *ValuesFuncExpr) *ValuesFuncExpr { return &out } +// CloneRefOfValuesStatement creates a deep clone of the input. +func CloneRefOfValuesStatement(n *ValuesStatement) *ValuesStatement { + if n == nil { + return nil + } + out := *n + out.With = CloneRefOfWith(n.With) + out.Rows = CloneValues(n.Rows) + out.Comments = CloneRefOfParsedComments(n.Comments) + out.Order = CloneOrderBy(n.Order) + out.Limit = CloneRefOfLimit(n.Limit) + return &out +} + // CloneRefOfVarPop creates a deep clone of the input. func CloneRefOfVarPop(n *VarPop) *VarPop { if n == nil { @@ -4107,6 +4123,8 @@ func CloneInsertRows(in InsertRows) InsertRows { return CloneRefOfUnion(in) case Values: return CloneValues(in) + case *ValuesStatement: + return CloneRefOfValuesStatement(in) default: // this should never happen return nil @@ -4287,6 +4305,8 @@ func CloneStatement(in Statement) Statement { return CloneRefOfVExplainStmt(in) case *VStream: return CloneRefOfVStream(in) + case *ValuesStatement: + return CloneRefOfValuesStatement(in) default: // this should never happen return nil @@ -4313,6 +4333,24 @@ func CloneTableExpr(in TableExpr) TableExpr { } } +// CloneTableStatement creates a deep clone of the input. +func CloneTableStatement(in TableStatement) TableStatement { + if in == nil { + return nil + } + switch in := in.(type) { + case *Select: + return CloneRefOfSelect(in) + case *Union: + return CloneRefOfUnion(in) + case *ValuesStatement: + return CloneRefOfValuesStatement(in) + default: + // this should never happen + return nil + } +} + // CloneSliceOfRefOfColumnDefinition creates a deep clone of the input. func CloneSliceOfRefOfColumnDefinition(n []*ColumnDefinition) []*ColumnDefinition { if n == nil { diff --git a/go/vt/sqlparser/ast_copy_on_rewrite.go b/go/vt/sqlparser/ast_copy_on_rewrite.go index 9b952b36dc7..f725dfc6803 100644 --- a/go/vt/sqlparser/ast_copy_on_rewrite.go +++ b/go/vt/sqlparser/ast_copy_on_rewrite.go @@ -534,6 +534,8 @@ func (c *cow) copyOnRewriteSQLNode(n SQLNode, parent SQLNode) (out SQLNode, chan return c.copyOnRewriteValues(n, parent) case *ValuesFuncExpr: return c.copyOnRewriteRefOfValuesFuncExpr(n, parent) + case *ValuesStatement: + return c.copyOnRewriteRefOfValuesStatement(n, parent) case *VarPop: return c.copyOnRewriteRefOfVarPop(n, parent) case *VarSamp: @@ -870,14 +872,14 @@ func (c *cow) copyOnRewriteRefOfAlterView(n *AlterView, parent SQLNode) (out SQL _ViewName, changedViewName := c.copyOnRewriteTableName(n.ViewName, n) _Definer, changedDefiner := c.copyOnRewriteRefOfDefiner(n.Definer, n) _Columns, changedColumns := c.copyOnRewriteColumns(n.Columns, n) - _Select, changedSelect := c.copyOnRewriteSelectStatement(n.Select, n) + _Select, changedSelect := c.copyOnRewriteTableStatement(n.Select, n) _Comments, changedComments := c.copyOnRewriteRefOfParsedComments(n.Comments, n) if changedViewName || changedDefiner || changedColumns || changedSelect || changedComments { res := *n res.ViewName, _ = _ViewName.(TableName) res.Definer, _ = _Definer.(*Definer) res.Columns, _ = _Columns.(Columns) - res.Select, _ = _Select.(SelectStatement) + res.Select, _ = _Select.(TableStatement) res.Comments, _ = _Comments.(*ParsedComments) out = &res if c.cloned != nil { @@ -1524,12 +1526,12 @@ func (c *cow) copyOnRewriteRefOfCommonTableExpr(n *CommonTableExpr, parent SQLNo if c.pre == nil || c.pre(n, parent) { _ID, changedID := c.copyOnRewriteIdentifierCS(n.ID, n) _Columns, changedColumns := c.copyOnRewriteColumns(n.Columns, n) - _Subquery, changedSubquery := c.copyOnRewriteSelectStatement(n.Subquery, n) + _Subquery, changedSubquery := c.copyOnRewriteTableStatement(n.Subquery, n) if changedID || changedColumns || changedSubquery { res := *n res.ID, _ = _ID.(IdentifierCS) res.Columns, _ = _Columns.(Columns) - res.Subquery, _ = _Subquery.(SelectStatement) + res.Subquery, _ = _Subquery.(TableStatement) out = &res if c.cloned != nil { c.cloned(n, out) @@ -1757,14 +1759,14 @@ func (c *cow) copyOnRewriteRefOfCreateView(n *CreateView, parent SQLNode) (out S _ViewName, changedViewName := c.copyOnRewriteTableName(n.ViewName, n) _Definer, changedDefiner := c.copyOnRewriteRefOfDefiner(n.Definer, n) _Columns, changedColumns := c.copyOnRewriteColumns(n.Columns, n) - _Select, changedSelect := c.copyOnRewriteSelectStatement(n.Select, n) + _Select, changedSelect := c.copyOnRewriteTableStatement(n.Select, n) _Comments, changedComments := c.copyOnRewriteRefOfParsedComments(n.Comments, n) if changedViewName || changedDefiner || changedColumns || changedSelect || changedComments { res := *n res.ViewName, _ = _ViewName.(TableName) res.Definer, _ = _Definer.(*Definer) res.Columns, _ = _Columns.(Columns) - res.Select, _ = _Select.(SelectStatement) + res.Select, _ = _Select.(TableStatement) res.Comments, _ = _Comments.(*ParsedComments) out = &res if c.cloned != nil { @@ -1898,10 +1900,10 @@ func (c *cow) copyOnRewriteRefOfDerivedTable(n *DerivedTable, parent SQLNode) (o } out = n if c.pre == nil || c.pre(n, parent) { - _Select, changedSelect := c.copyOnRewriteSelectStatement(n.Select, n) + _Select, changedSelect := c.copyOnRewriteTableStatement(n.Select, n) if changedSelect { res := *n - res.Select, _ = _Select.(SelectStatement) + res.Select, _ = _Select.(TableStatement) out = &res if c.cloned != nil { c.cloned(n, out) @@ -5790,10 +5792,10 @@ func (c *cow) copyOnRewriteRefOfSubquery(n *Subquery, parent SQLNode) (out SQLNo } out = n if c.pre == nil || c.pre(n, parent) { - _Select, changedSelect := c.copyOnRewriteSelectStatement(n.Select, n) + _Select, changedSelect := c.copyOnRewriteTableStatement(n.Select, n) if changedSelect { res := *n - res.Select, _ = _Select.(SelectStatement) + res.Select, _ = _Select.(TableStatement) out = &res if c.cloned != nil { c.cloned(n, out) @@ -6101,16 +6103,16 @@ func (c *cow) copyOnRewriteRefOfUnion(n *Union, parent SQLNode) (out SQLNode, ch out = n if c.pre == nil || c.pre(n, parent) { _With, changedWith := c.copyOnRewriteRefOfWith(n.With, n) - _Left, changedLeft := c.copyOnRewriteSelectStatement(n.Left, n) - _Right, changedRight := c.copyOnRewriteSelectStatement(n.Right, n) + _Left, changedLeft := c.copyOnRewriteTableStatement(n.Left, n) + _Right, changedRight := c.copyOnRewriteTableStatement(n.Right, n) _OrderBy, changedOrderBy := c.copyOnRewriteOrderBy(n.OrderBy, n) _Limit, changedLimit := c.copyOnRewriteRefOfLimit(n.Limit, n) _Into, changedInto := c.copyOnRewriteRefOfSelectInto(n.Into, n) if changedWith || changedLeft || changedRight || changedOrderBy || changedLimit || changedInto { res := *n res.With, _ = _With.(*With) - res.Left, _ = _Left.(SelectStatement) - res.Right, _ = _Right.(SelectStatement) + res.Left, _ = _Left.(TableStatement) + res.Right, _ = _Right.(TableStatement) res.OrderBy, _ = _OrderBy.(OrderBy) res.Limit, _ = _Limit.(*Limit) res.Into, _ = _Into.(*SelectInto) @@ -6409,6 +6411,38 @@ func (c *cow) copyOnRewriteRefOfValuesFuncExpr(n *ValuesFuncExpr, parent SQLNode } return } +func (c *cow) copyOnRewriteRefOfValuesStatement(n *ValuesStatement, parent SQLNode) (out SQLNode, changed bool) { + if n == nil || c.cursor.stop { + return n, false + } + out = n + if c.pre == nil || c.pre(n, parent) { + _With, changedWith := c.copyOnRewriteRefOfWith(n.With, n) + _Rows, changedRows := c.copyOnRewriteValues(n.Rows, n) + _ListArg, changedListArg := c.copyOnRewriteListArg(n.ListArg, n) + _Comments, changedComments := c.copyOnRewriteRefOfParsedComments(n.Comments, n) + _Order, changedOrder := c.copyOnRewriteOrderBy(n.Order, n) + _Limit, changedLimit := c.copyOnRewriteRefOfLimit(n.Limit, n) + if changedWith || changedRows || changedListArg || changedComments || changedOrder || changedLimit { + res := *n + res.With, _ = _With.(*With) + res.Rows, _ = _Rows.(Values) + res.ListArg, _ = _ListArg.(ListArg) + res.Comments, _ = _Comments.(*ParsedComments) + res.Order, _ = _Order.(OrderBy) + res.Limit, _ = _Limit.(*Limit) + out = &res + if c.cloned != nil { + c.cloned(n, out) + } + changed = true + } + } + if c.post != nil { + out, changed = c.postVisit(out, parent, changed) + } + return +} func (c *cow) copyOnRewriteRefOfVarPop(n *VarPop, parent SQLNode) (out SQLNode, changed bool) { if n == nil || c.cursor.stop { return n, false @@ -7366,6 +7400,8 @@ func (c *cow) copyOnRewriteInsertRows(n InsertRows, parent SQLNode) (out SQLNode return c.copyOnRewriteRefOfUnion(n, parent) case Values: return c.copyOnRewriteValues(n, parent) + case *ValuesStatement: + return c.copyOnRewriteRefOfValuesStatement(n, parent) default: // this should never happen return nil, false @@ -7536,6 +7572,8 @@ func (c *cow) copyOnRewriteStatement(n Statement, parent SQLNode) (out SQLNode, return c.copyOnRewriteRefOfVExplainStmt(n, parent) case *VStream: return c.copyOnRewriteRefOfVStream(n, parent) + case *ValuesStatement: + return c.copyOnRewriteRefOfValuesStatement(n, parent) default: // this should never happen return nil, false @@ -7559,6 +7597,22 @@ func (c *cow) copyOnRewriteTableExpr(n TableExpr, parent SQLNode) (out SQLNode, return nil, false } } +func (c *cow) copyOnRewriteTableStatement(n TableStatement, parent SQLNode) (out SQLNode, changed bool) { + if n == nil || c.cursor.stop { + return n, false + } + switch n := n.(type) { + case *Select: + return c.copyOnRewriteRefOfSelect(n, parent) + case *Union: + return c.copyOnRewriteRefOfUnion(n, parent) + case *ValuesStatement: + return c.copyOnRewriteRefOfValuesStatement(n, parent) + default: + // this should never happen + return nil, false + } +} func (c *cow) copyOnRewriteAlgorithmValue(n AlgorithmValue, parent SQLNode) (out SQLNode, changed bool) { if c.cursor.stop { return n, false diff --git a/go/vt/sqlparser/ast_equals.go b/go/vt/sqlparser/ast_equals.go index c4c0b34c271..93f10376177 100644 --- a/go/vt/sqlparser/ast_equals.go +++ b/go/vt/sqlparser/ast_equals.go @@ -1562,6 +1562,12 @@ func (cmp *Comparator) SQLNode(inA, inB SQLNode) bool { return false } return cmp.RefOfValuesFuncExpr(a, b) + case *ValuesStatement: + b, ok := inB.(*ValuesStatement) + if !ok { + return false + } + return cmp.RefOfValuesStatement(a, b) case *VarPop: b, ok := inB.(*VarPop) if !ok { @@ -1826,7 +1832,7 @@ func (cmp *Comparator) RefOfAlterView(a, b *AlterView) bool { cmp.TableName(a.ViewName, b.ViewName) && cmp.RefOfDefiner(a.Definer, b.Definer) && cmp.Columns(a.Columns, b.Columns) && - cmp.SelectStatement(a.Select, b.Select) && + cmp.TableStatement(a.Select, b.Select) && cmp.RefOfParsedComments(a.Comments, b.Comments) } @@ -2195,7 +2201,7 @@ func (cmp *Comparator) RefOfCommonTableExpr(a, b *CommonTableExpr) bool { } return cmp.IdentifierCS(a.ID, b.ID) && cmp.Columns(a.Columns, b.Columns) && - cmp.SelectStatement(a.Subquery, b.Subquery) + cmp.TableStatement(a.Subquery, b.Subquery) } // RefOfComparisonExpr does deep equals between the two objects. @@ -2334,7 +2340,7 @@ func (cmp *Comparator) RefOfCreateView(a, b *CreateView) bool { cmp.TableName(a.ViewName, b.ViewName) && cmp.RefOfDefiner(a.Definer, b.Definer) && cmp.Columns(a.Columns, b.Columns) && - cmp.SelectStatement(a.Select, b.Select) && + cmp.TableStatement(a.Select, b.Select) && cmp.RefOfParsedComments(a.Comments, b.Comments) } @@ -2413,7 +2419,7 @@ func (cmp *Comparator) RefOfDerivedTable(a, b *DerivedTable) bool { return false } return a.Lateral == b.Lateral && - cmp.SelectStatement(a.Select, b.Select) + cmp.TableStatement(a.Select, b.Select) } // RefOfDropColumn does deep equals between the two objects. @@ -4525,7 +4531,7 @@ func (cmp *Comparator) RefOfSubquery(a, b *Subquery) bool { if a == nil || b == nil { return false } - return cmp.SelectStatement(a.Select, b.Select) + return cmp.TableStatement(a.Select, b.Select) } // RefOfSubstrExpr does deep equals between the two objects. @@ -4685,8 +4691,8 @@ func (cmp *Comparator) RefOfUnion(a, b *Union) bool { } return a.Distinct == b.Distinct && cmp.RefOfWith(a.With, b.With) && - cmp.SelectStatement(a.Left, b.Left) && - cmp.SelectStatement(a.Right, b.Right) && + cmp.TableStatement(a.Left, b.Left) && + cmp.TableStatement(a.Right, b.Right) && cmp.OrderBy(a.OrderBy, b.OrderBy) && cmp.RefOfLimit(a.Limit, b.Limit) && a.Lock == b.Lock && @@ -4847,6 +4853,22 @@ func (cmp *Comparator) RefOfValuesFuncExpr(a, b *ValuesFuncExpr) bool { return cmp.RefOfColName(a.Name, b.Name) } +// RefOfValuesStatement does deep equals between the two objects. +func (cmp *Comparator) RefOfValuesStatement(a, b *ValuesStatement) bool { + if a == b { + return true + } + if a == nil || b == nil { + return false + } + return cmp.RefOfWith(a.With, b.With) && + cmp.Values(a.Rows, b.Rows) && + a.ListArg == b.ListArg && + cmp.RefOfParsedComments(a.Comments, b.Comments) && + cmp.OrderBy(a.Order, b.Order) && + cmp.RefOfLimit(a.Limit, b.Limit) +} + // RefOfVarPop does deep equals between the two objects. func (cmp *Comparator) RefOfVarPop(a, b *VarPop) bool { if a == b { @@ -6705,6 +6727,12 @@ func (cmp *Comparator) InsertRows(inA, inB InsertRows) bool { return false } return cmp.Values(a, b) + case *ValuesStatement: + b, ok := inB.(*ValuesStatement) + if !ok { + return false + } + return cmp.RefOfValuesStatement(a, b) default: // this should never happen return false @@ -7140,6 +7168,12 @@ func (cmp *Comparator) Statement(inA, inB Statement) bool { return false } return cmp.RefOfVStream(a, b) + case *ValuesStatement: + b, ok := inB.(*ValuesStatement) + if !ok { + return false + } + return cmp.RefOfValuesStatement(a, b) default: // this should never happen return false @@ -7185,6 +7219,39 @@ func (cmp *Comparator) TableExpr(inA, inB TableExpr) bool { } } +// TableStatement does deep equals between the two objects. +func (cmp *Comparator) TableStatement(inA, inB TableStatement) bool { + if inA == nil && inB == nil { + return true + } + if inA == nil || inB == nil { + return false + } + switch a := inA.(type) { + case *Select: + b, ok := inB.(*Select) + if !ok { + return false + } + return cmp.RefOfSelect(a, b) + case *Union: + b, ok := inB.(*Union) + if !ok { + return false + } + return cmp.RefOfUnion(a, b) + case *ValuesStatement: + b, ok := inB.(*ValuesStatement) + if !ok { + return false + } + return cmp.RefOfValuesStatement(a, b) + default: + // this should never happen + return false + } +} + // SliceOfRefOfColumnDefinition does deep equals between the two objects. func (cmp *Comparator) SliceOfRefOfColumnDefinition(a, b []*ColumnDefinition) bool { if len(a) != len(b) { diff --git a/go/vt/sqlparser/ast_format.go b/go/vt/sqlparser/ast_format.go index dff17911d8e..37539c450b2 100644 --- a/go/vt/sqlparser/ast_format.go +++ b/go/vt/sqlparser/ast_format.go @@ -120,6 +120,26 @@ func (node *VStream) Format(buf *TrackedBuffer) { node.Comments, node.SelectExpr, node.Table) } +// Format formats the node. +func (node *ValuesStatement) Format(buf *TrackedBuffer) { + if node.With != nil { + buf.astPrintf(node, "%v", node.With) + } + buf.astPrintf(node, "values %v", node.Comments) + if node.ListArg != "" { + buf.astPrintf(node, "%v", node.ListArg) + } else { + for i, row := range node.Rows { + buf.astPrintf(node, "row%v", row) + if i < len(node.Rows)-1 { + buf.WriteString(", ") + } + } + } + buf.astPrintf(node, "%v%v", + node.Order, node.Limit) +} + // Format formats the node. func (node *Stream) Format(buf *TrackedBuffer) { buf.astPrintf(node, "stream %v%v from %v", diff --git a/go/vt/sqlparser/ast_format_fast.go b/go/vt/sqlparser/ast_format_fast.go index 9855c70a21d..7a818faf0c0 100644 --- a/go/vt/sqlparser/ast_format_fast.go +++ b/go/vt/sqlparser/ast_format_fast.go @@ -141,6 +141,30 @@ func (node *VStream) FormatFast(buf *TrackedBuffer) { } +// FormatFast formats the node. +func (node *ValuesStatement) FormatFast(buf *TrackedBuffer) { + if node.With != nil { + node.With.FormatFast(buf) + } + buf.WriteString("values ") + node.Comments.FormatFast(buf) + if node.ListArg != "" { + node.ListArg.FormatFast(buf) + } else { + for i, row := range node.Rows { + buf.WriteString("row") + row.FormatFast(buf) + if i < len(node.Rows)-1 { + buf.WriteString(", ") + } + } + } + + node.Order.FormatFast(buf) + node.Limit.FormatFast(buf) + +} + // FormatFast formats the node. func (node *Stream) FormatFast(buf *TrackedBuffer) { buf.WriteString("stream ") diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index 2891d532d16..e28c17a4745 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -640,6 +640,26 @@ func parseBindVariable(yylex yyLexer, bvar string) *Argument { return NewArgument(bvar) } +func setIntoIfPossible(lexer yyLexer, tblSubquery TableStatement, into *SelectInto) { + selStmt, ok := tblSubquery.(SelectStatement) + if !ok { + lexer.Error("VALUES does not support INTO") + return + } + + selStmt.SetInto(into) +} + +func setLockIfPossible(lexer yyLexer, tblSubquery TableStatement, lock Lock) { + selStmt, ok := tblSubquery.(SelectStatement) + if !ok { + lexer.Error("VALUES does not support LOCK") + return + } + + selStmt.SetLock(lock) +} + func NewTypedArgument(in string, t sqltypes.Type) *Argument { return &Argument{Name: in, Type: t} } @@ -755,12 +775,12 @@ func NewTableNameWithQualifier(name, qualifier string) TableName { } // NewSubquery makes a new Subquery -func NewSubquery(selectStatement SelectStatement) *Subquery { +func NewSubquery(selectStatement TableStatement) *Subquery { return &Subquery{Select: selectStatement} } // NewDerivedTable makes a new DerivedTable -func NewDerivedTable(lateral bool, selectStatement SelectStatement) *DerivedTable { +func NewDerivedTable(lateral bool, selectStatement TableStatement) *DerivedTable { return &DerivedTable{ Lateral: lateral, Select: selectStatement, @@ -1391,7 +1411,7 @@ func (node *Union) GetParsedComments() *ParsedComments { return node.Left.GetParsedComments() } -func requiresParen(stmt SelectStatement) bool { +func requiresParen(stmt TableStatement) bool { switch node := stmt.(type) { case *Union: return len(node.OrderBy) != 0 || node.Lock != 0 || node.Into != nil || node.Limit != nil @@ -1402,10 +1422,6 @@ func requiresParen(stmt SelectStatement) bool { return false } -func setLockInSelect(stmt SelectStatement, lock Lock) { - stmt.SetLock(lock) -} - // ToString returns the string associated with the DDLAction Enum func (action DDLAction) ToString() string { switch action { @@ -2345,26 +2361,30 @@ func setFuncArgs(aggr AggrFunc, exprs Exprs, name string) error { } // GetFirstSelect gets the first select statement -func GetFirstSelect(selStmt SelectStatement) *Select { +func GetFirstSelect(selStmt TableStatement) (*Select, error) { if selStmt == nil { - return nil + return nil, nil } switch node := selStmt.(type) { case *Select: - return node + return node, nil + case *ValuesStatement: + return nil, vterrors.VT12001("first table_reference as VALUES") case *Union: return GetFirstSelect(node.Left) } - panic("[BUG]: unknown type for SelectStatement") + return nil, vterrors.VT13001(fmt.Sprintf("unknown type for SelectStatement: %T", selStmt)) } // GetAllSelects gets all the select statement s -func GetAllSelects(selStmt SelectStatement) []*Select { +func GetAllSelects(selStmt TableStatement) []TableStatement { switch node := selStmt.(type) { case *Select: - return []*Select{node} + return []TableStatement{node} case *Union: return append(GetAllSelects(node.Left), GetAllSelects(node.Right)...) + case *ValuesStatement: + return []TableStatement{node} } panic("[BUG]: unknown type for SelectStatement") } @@ -2409,48 +2429,38 @@ func RemoveKeyspaceInCol(in SQLNode) { }, in) } -// RemoveKeyspaceInTables removes the Qualifier on all TableNames in the AST -func RemoveKeyspaceInTables(in SQLNode) { - // Walk will only return an error if we return an error from the inner func. safe to ignore here - Rewrite(in, nil, func(cursor *Cursor) bool { - if tbl, ok := cursor.Node().(TableName); ok && tbl.Qualifier.NotEmpty() { - tbl.Qualifier = NewIdentifierCS("") - cursor.Replace(tbl) - } - - return true +// RemoveKeyspace removes the keyspace qualifier from all ColName and TableName +func RemoveKeyspace(in SQLNode) { + removeKeyspace(in, func(_ string) bool { + return true // Always remove }) } -// RemoveKeyspace removes the Qualifier.Qualifier on all ColNames and Qualifier on all TableNames in the AST -func RemoveKeyspace(in SQLNode) { - Rewrite(in, nil, func(cursor *Cursor) bool { - switch expr := cursor.Node().(type) { - case *ColName: - if expr.Qualifier.Qualifier.NotEmpty() { - expr.Qualifier.Qualifier = NewIdentifierCS("") - } - case TableName: - if expr.Qualifier.NotEmpty() { - expr.Qualifier = NewIdentifierCS("") - cursor.Replace(expr) - } - } - return true +// RemoveSpecificKeyspace removes the keyspace qualifier from all ColName and TableName +// when it matches the keyspace provided +func RemoveSpecificKeyspace(in SQLNode, keyspace string) { + removeKeyspace(in, func(qualifier string) bool { + return qualifier == keyspace // Remove only if it matches the provided keyspace }) } -// RemoveKeyspaceIgnoreSysSchema removes the Qualifier.Qualifier on all ColNames and Qualifier on all TableNames in the AST -// except for the system schema. +// RemoveKeyspaceIgnoreSysSchema removes the keyspace qualifier from all ColName and TableName +// except for the system schema qualifier. func RemoveKeyspaceIgnoreSysSchema(in SQLNode) { + removeKeyspace(in, func(qualifier string) bool { + return qualifier != "" && !SystemSchema(qualifier) // Remove if it's not empty and not a system schema + }) +} + +func removeKeyspace(in SQLNode, shouldRemove func(qualifier string) bool) { Rewrite(in, nil, func(cursor *Cursor) bool { switch expr := cursor.Node().(type) { case *ColName: - if expr.Qualifier.Qualifier.NotEmpty() && !SystemSchema(expr.Qualifier.Qualifier.String()) { + if shouldRemove(expr.Qualifier.Qualifier.String()) { expr.Qualifier.Qualifier = NewIdentifierCS("") } case TableName: - if expr.Qualifier.NotEmpty() && !SystemSchema(expr.Qualifier.String()) { + if shouldRemove(expr.Qualifier.String()) { expr.Qualifier = NewIdentifierCS("") cursor.Replace(expr) } @@ -2772,7 +2782,7 @@ func MakeColumns(colNames ...string) Columns { return cols } -func VisitAllSelects(in SelectStatement, f func(p *Select, idx int) error) error { +func VisitAllSelects(in TableStatement, f func(p *Select, idx int) error) error { v := visitor{} return v.visitAllSelects(in, f) } @@ -2781,7 +2791,7 @@ type visitor struct { idx int } -func (v *visitor) visitAllSelects(in SelectStatement, f func(p *Select, idx int) error) error { +func (v *visitor) visitAllSelects(in TableStatement, f func(p *Select, idx int) error) error { switch sel := in.(type) { case *Select: err := f(sel, v.idx) @@ -2875,6 +2885,30 @@ func (node *Update) SetLimit(limit *Limit) { node.Limit = limit } +func (node *Update) GetOrderBy() OrderBy { + return node.OrderBy +} + +func (node *Update) SetOrderBy(by OrderBy) { + node.OrderBy = by +} + +func (node *Update) GetLimit() *Limit { + return node.Limit +} + +func (node *Delete) GetOrderBy() OrderBy { + return node.OrderBy +} + +func (node *Delete) SetOrderBy(by OrderBy) { + node.OrderBy = by +} + +func (node *Delete) GetLimit() *Limit { + return node.Limit +} + func (node *Delete) AddOrder(order *Order) { node.OrderBy = append(node.OrderBy, order) } @@ -2981,3 +3015,50 @@ func ExtractAllTables(stmt Statement) []string { }, stmt) return tables } + +var _ TableStatement = (*ValuesStatement)(nil) + +func (node *ValuesStatement) iTableStatement() {} + +func (node *ValuesStatement) SetWith(with *With) { + node.With = with +} + +func (node *ValuesStatement) GetOrderBy() OrderBy { + return node.Order +} + +func (node *ValuesStatement) SetOrderBy(by OrderBy) { + node.Order = by +} + +func (node *ValuesStatement) GetLimit() *Limit { + return node.Limit +} + +func (node *ValuesStatement) AddOrder(order *Order) { + node.Order = append(node.Order, order) +} + +func (node *ValuesStatement) SetLimit(limit *Limit) { + node.Limit = limit +} + +func (node *ValuesStatement) GetColumnCount() int { + if len(node.Rows) > 0 { + return len(node.Rows[0]) + } + panic("no columns available") // TODO: we need a better solution than a panic +} + +func (node *ValuesStatement) GetColumns() (result SelectExprs) { + columnCount := node.GetColumnCount() + for i := range columnCount { + result = append(result, &AliasedExpr{Expr: NewColName(fmt.Sprintf("column_%d", i))}) + } + panic("no columns available") // TODO: we need a better solution than a panic +} + +func (node *ValuesStatement) SetComments(comments Comments) {} + +func (node *ValuesStatement) GetParsedComments() *ParsedComments { return nil } diff --git a/go/vt/sqlparser/ast_funcs_test.go b/go/vt/sqlparser/ast_funcs_test.go index a3b744729f4..009f3e6cc15 100644 --- a/go/vt/sqlparser/ast_funcs_test.go +++ b/go/vt/sqlparser/ast_funcs_test.go @@ -219,3 +219,28 @@ func TestExtractTables(t *testing.T) { }) } } + +// TestRemoveKeyspace tests the RemoveKeyspaceIgnoreSysSchema function. +// It removes all the keyspace except system schema. +func TestRemoveKeyspaceIgnoreSysSchema(t *testing.T) { + stmt, err := NewTestParser().Parse("select 1 from uks.unsharded join information_schema.tables") + require.NoError(t, err) + RemoveKeyspaceIgnoreSysSchema(stmt) + + require.Equal(t, "select 1 from unsharded join information_schema.`tables`", String(stmt)) +} + +// TestRemoveSpecificKeyspace tests the RemoveSpecificKeyspace function. +// It removes the specific keyspace from the database qualifier. +func TestRemoveSpecificKeyspace(t *testing.T) { + stmt, err := NewTestParser().Parse("select 1 from uks.unsharded") + require.NoError(t, err) + + // does not match + RemoveSpecificKeyspace(stmt, "ks2") + require.Equal(t, "select 1 from uks.unsharded", String(stmt)) + + // match + RemoveSpecificKeyspace(stmt, "uks") + require.Equal(t, "select 1 from unsharded", String(stmt)) +} diff --git a/go/vt/sqlparser/ast_rewrite.go b/go/vt/sqlparser/ast_rewrite.go index e65b243d7e1..690b381b082 100644 --- a/go/vt/sqlparser/ast_rewrite.go +++ b/go/vt/sqlparser/ast_rewrite.go @@ -534,6 +534,8 @@ func (a *application) rewriteSQLNode(parent SQLNode, node SQLNode, replacer repl return a.rewriteValues(parent, node, replacer) case *ValuesFuncExpr: return a.rewriteRefOfValuesFuncExpr(parent, node, replacer) + case *ValuesStatement: + return a.rewriteRefOfValuesStatement(parent, node, replacer) case *VarPop: return a.rewriteRefOfVarPop(parent, node, replacer) case *VarSamp: @@ -983,8 +985,8 @@ func (a *application) rewriteRefOfAlterView(parent SQLNode, node *AlterView, rep }) { return false } - if !a.rewriteSelectStatement(node, node.Select, func(newNode, parent SQLNode) { - parent.(*AlterView).Select = newNode.(SelectStatement) + if !a.rewriteTableStatement(node, node.Select, func(newNode, parent SQLNode) { + parent.(*AlterView).Select = newNode.(TableStatement) }) { return false } @@ -1969,8 +1971,8 @@ func (a *application) rewriteRefOfCommonTableExpr(parent SQLNode, node *CommonTa }) { return false } - if !a.rewriteSelectStatement(node, node.Subquery, func(newNode, parent SQLNode) { - parent.(*CommonTableExpr).Subquery = newNode.(SelectStatement) + if !a.rewriteTableStatement(node, node.Subquery, func(newNode, parent SQLNode) { + parent.(*CommonTableExpr).Subquery = newNode.(TableStatement) }) { return false } @@ -2321,8 +2323,8 @@ func (a *application) rewriteRefOfCreateView(parent SQLNode, node *CreateView, r }) { return false } - if !a.rewriteSelectStatement(node, node.Select, func(newNode, parent SQLNode) { - parent.(*CreateView).Select = newNode.(SelectStatement) + if !a.rewriteTableStatement(node, node.Select, func(newNode, parent SQLNode) { + parent.(*CreateView).Select = newNode.(TableStatement) }) { return false } @@ -2536,8 +2538,8 @@ func (a *application) rewriteRefOfDerivedTable(parent SQLNode, node *DerivedTabl return true } } - if !a.rewriteSelectStatement(node, node.Select, func(newNode, parent SQLNode) { - parent.(*DerivedTable).Select = newNode.(SelectStatement) + if !a.rewriteTableStatement(node, node.Select, func(newNode, parent SQLNode) { + parent.(*DerivedTable).Select = newNode.(TableStatement) }) { return false } @@ -8337,8 +8339,8 @@ func (a *application) rewriteRefOfSubquery(parent SQLNode, node *Subquery, repla return true } } - if !a.rewriteSelectStatement(node, node.Select, func(newNode, parent SQLNode) { - parent.(*Subquery).Select = newNode.(SelectStatement) + if !a.rewriteTableStatement(node, node.Select, func(newNode, parent SQLNode) { + parent.(*Subquery).Select = newNode.(TableStatement) }) { return false } @@ -8797,13 +8799,13 @@ func (a *application) rewriteRefOfUnion(parent SQLNode, node *Union, replacer re }) { return false } - if !a.rewriteSelectStatement(node, node.Left, func(newNode, parent SQLNode) { - parent.(*Union).Left = newNode.(SelectStatement) + if !a.rewriteTableStatement(node, node.Left, func(newNode, parent SQLNode) { + parent.(*Union).Left = newNode.(TableStatement) }) { return false } - if !a.rewriteSelectStatement(node, node.Right, func(newNode, parent SQLNode) { - parent.(*Union).Right = newNode.(SelectStatement) + if !a.rewriteTableStatement(node, node.Right, func(newNode, parent SQLNode) { + parent.(*Union).Right = newNode.(TableStatement) }) { return false } @@ -9264,6 +9266,58 @@ func (a *application) rewriteRefOfValuesFuncExpr(parent SQLNode, node *ValuesFun } return true } +func (a *application) rewriteRefOfValuesStatement(parent SQLNode, node *ValuesStatement, replacer replacerFunc) bool { + if node == nil { + return true + } + if a.pre != nil { + a.cur.replacer = replacer + a.cur.parent = parent + a.cur.node = node + if !a.pre(&a.cur) { + return true + } + } + if !a.rewriteRefOfWith(node, node.With, func(newNode, parent SQLNode) { + parent.(*ValuesStatement).With = newNode.(*With) + }) { + return false + } + if !a.rewriteValues(node, node.Rows, func(newNode, parent SQLNode) { + parent.(*ValuesStatement).Rows = newNode.(Values) + }) { + return false + } + if !a.rewriteListArg(node, node.ListArg, func(newNode, parent SQLNode) { + parent.(*ValuesStatement).ListArg = newNode.(ListArg) + }) { + return false + } + if !a.rewriteRefOfParsedComments(node, node.Comments, func(newNode, parent SQLNode) { + parent.(*ValuesStatement).Comments = newNode.(*ParsedComments) + }) { + return false + } + if !a.rewriteOrderBy(node, node.Order, func(newNode, parent SQLNode) { + parent.(*ValuesStatement).Order = newNode.(OrderBy) + }) { + return false + } + if !a.rewriteRefOfLimit(node, node.Limit, func(newNode, parent SQLNode) { + parent.(*ValuesStatement).Limit = newNode.(*Limit) + }) { + return false + } + if a.post != nil { + a.cur.replacer = replacer + a.cur.parent = parent + a.cur.node = node + if !a.post(&a.cur) { + return false + } + } + return true +} func (a *application) rewriteRefOfVarPop(parent SQLNode, node *VarPop, replacer replacerFunc) bool { if node == nil { return true @@ -10358,6 +10412,8 @@ func (a *application) rewriteInsertRows(parent SQLNode, node InsertRows, replace return a.rewriteRefOfUnion(parent, node, replacer) case Values: return a.rewriteValues(parent, node, replacer) + case *ValuesStatement: + return a.rewriteRefOfValuesStatement(parent, node, replacer) default: // this should never happen return true @@ -10528,6 +10584,8 @@ func (a *application) rewriteStatement(parent SQLNode, node Statement, replacer return a.rewriteRefOfVExplainStmt(parent, node, replacer) case *VStream: return a.rewriteRefOfVStream(parent, node, replacer) + case *ValuesStatement: + return a.rewriteRefOfValuesStatement(parent, node, replacer) default: // this should never happen return true @@ -10551,6 +10609,22 @@ func (a *application) rewriteTableExpr(parent SQLNode, node TableExpr, replacer return true } } +func (a *application) rewriteTableStatement(parent SQLNode, node TableStatement, replacer replacerFunc) bool { + if node == nil { + return true + } + switch node := node.(type) { + case *Select: + return a.rewriteRefOfSelect(parent, node, replacer) + case *Union: + return a.rewriteRefOfUnion(parent, node, replacer) + case *ValuesStatement: + return a.rewriteRefOfValuesStatement(parent, node, replacer) + default: + // this should never happen + return true + } +} func (a *application) rewriteAlgorithmValue(parent SQLNode, node AlgorithmValue, replacer replacerFunc) bool { if a.pre != nil { a.cur.replacer = replacer diff --git a/go/vt/sqlparser/ast_rewriting.go b/go/vt/sqlparser/ast_rewriting.go index ef46b124875..05e7e290fc1 100644 --- a/go/vt/sqlparser/ast_rewriting.go +++ b/go/vt/sqlparser/ast_rewriting.go @@ -38,7 +38,7 @@ type RewriteASTResult struct { } type VSchemaViews interface { - FindView(name TableName) SelectStatement + FindView(name TableName) TableStatement } // PrepareAST will normalize the query @@ -257,7 +257,7 @@ func (er *astRewriter) rewriteAliasedTable(cursor *Cursor, node *AliasedTableExp } // Aha! It's a view. Let's replace it with a derived table - node.Expr = &DerivedTable{Select: CloneSelectStatement(view)} + node.Expr = &DerivedTable{Select: Clone(view)} // TODO: this is a bit hacky. We want to update the schema def so it contains new types if node.As.IsEmpty() { node.As = NewIdentifierCS(tblName) } diff --git a/go/vt/sqlparser/ast_rewriting_test.go b/go/vt/sqlparser/ast_rewriting_test.go index 3ad9a5298c4..8b3e3d44c54 100644 --- a/go/vt/sqlparser/ast_rewriting_test.go +++ b/go/vt/sqlparser/ast_rewriting_test.go @@ -388,7 +388,7 @@ func TestRewrites(in *testing.T) { type fakeViews struct{} -func (*fakeViews) FindView(name TableName) SelectStatement { +func (*fakeViews) FindView(name TableName) TableStatement { if name.Name.String() != "user_details" { return nil } @@ -397,7 +397,7 @@ func (*fakeViews) FindView(name TableName) SelectStatement { if err != nil { return nil } - return statement.(SelectStatement) + return statement.(TableStatement) } func TestRewritesWithSetVarComment(in *testing.T) { diff --git a/go/vt/sqlparser/ast_test.go b/go/vt/sqlparser/ast_test.go index c1484df7cc4..f01b47cbd7b 100644 --- a/go/vt/sqlparser/ast_test.go +++ b/go/vt/sqlparser/ast_test.go @@ -917,11 +917,3 @@ func TestCloneComments(t *testing.T) { assert.Equal(t, "b", val) } } - -func TestRemoveKeyspace(t *testing.T) { - stmt, err := NewTestParser().Parse("select 1 from uks.unsharded") - require.NoError(t, err) - RemoveKeyspaceIgnoreSysSchema(stmt) - - require.Equal(t, "select 1 from unsharded", String(stmt)) -} diff --git a/go/vt/sqlparser/ast_visit.go b/go/vt/sqlparser/ast_visit.go index 439d0bffeec..a7fbbe02118 100644 --- a/go/vt/sqlparser/ast_visit.go +++ b/go/vt/sqlparser/ast_visit.go @@ -534,6 +534,8 @@ func VisitSQLNode(in SQLNode, f Visit) error { return VisitValues(in, f) case *ValuesFuncExpr: return VisitRefOfValuesFuncExpr(in, f) + case *ValuesStatement: + return VisitRefOfValuesStatement(in, f) case *VarPop: return VisitRefOfVarPop(in, f) case *VarSamp: @@ -764,7 +766,7 @@ func VisitRefOfAlterView(in *AlterView, f Visit) error { if err := VisitColumns(in.Columns, f); err != nil { return err } - if err := VisitSelectStatement(in.Select, f); err != nil { + if err := VisitTableStatement(in.Select, f); err != nil { return err } if err := VisitRefOfParsedComments(in.Comments, f); err != nil { @@ -1175,7 +1177,7 @@ func VisitRefOfCommonTableExpr(in *CommonTableExpr, f Visit) error { if err := VisitColumns(in.Columns, f); err != nil { return err } - if err := VisitSelectStatement(in.Subquery, f); err != nil { + if err := VisitTableStatement(in.Subquery, f); err != nil { return err } return nil @@ -1328,7 +1330,7 @@ func VisitRefOfCreateView(in *CreateView, f Visit) error { if err := VisitColumns(in.Columns, f); err != nil { return err } - if err := VisitSelectStatement(in.Select, f); err != nil { + if err := VisitTableStatement(in.Select, f); err != nil { return err } if err := VisitRefOfParsedComments(in.Comments, f); err != nil { @@ -1423,7 +1425,7 @@ func VisitRefOfDerivedTable(in *DerivedTable, f Visit) error { if cont, err := f(in); err != nil || !cont { return err } - if err := VisitSelectStatement(in.Select, f); err != nil { + if err := VisitTableStatement(in.Select, f); err != nil { return err } return nil @@ -3890,7 +3892,7 @@ func VisitRefOfSubquery(in *Subquery, f Visit) error { if cont, err := f(in); err != nil || !cont { return err } - if err := VisitSelectStatement(in.Select, f); err != nil { + if err := VisitTableStatement(in.Select, f); err != nil { return err } return nil @@ -4075,10 +4077,10 @@ func VisitRefOfUnion(in *Union, f Visit) error { if err := VisitRefOfWith(in.With, f); err != nil { return err } - if err := VisitSelectStatement(in.Left, f); err != nil { + if err := VisitTableStatement(in.Left, f); err != nil { return err } - if err := VisitSelectStatement(in.Right, f); err != nil { + if err := VisitTableStatement(in.Right, f); err != nil { return err } if err := VisitOrderBy(in.OrderBy, f); err != nil { @@ -4280,6 +4282,33 @@ func VisitRefOfValuesFuncExpr(in *ValuesFuncExpr, f Visit) error { } return nil } +func VisitRefOfValuesStatement(in *ValuesStatement, f Visit) error { + if in == nil { + return nil + } + if cont, err := f(in); err != nil || !cont { + return err + } + if err := VisitRefOfWith(in.With, f); err != nil { + return err + } + if err := VisitValues(in.Rows, f); err != nil { + return err + } + if err := VisitListArg(in.ListArg, f); err != nil { + return err + } + if err := VisitRefOfParsedComments(in.Comments, f); err != nil { + return err + } + if err := VisitOrderBy(in.Order, f); err != nil { + return err + } + if err := VisitRefOfLimit(in.Limit, f); err != nil { + return err + } + return nil +} func VisitRefOfVarPop(in *VarPop, f Visit) error { if in == nil { return nil @@ -5098,6 +5127,8 @@ func VisitInsertRows(in InsertRows, f Visit) error { return VisitRefOfUnion(in, f) case Values: return VisitValues(in, f) + case *ValuesStatement: + return VisitRefOfValuesStatement(in, f) default: // this should never happen return nil @@ -5268,6 +5299,8 @@ func VisitStatement(in Statement, f Visit) error { return VisitRefOfVExplainStmt(in, f) case *VStream: return VisitRefOfVStream(in, f) + case *ValuesStatement: + return VisitRefOfValuesStatement(in, f) default: // this should never happen return nil @@ -5291,6 +5324,22 @@ func VisitTableExpr(in TableExpr, f Visit) error { return nil } } +func VisitTableStatement(in TableStatement, f Visit) error { + if in == nil { + return nil + } + switch in := in.(type) { + case *Select: + return VisitRefOfSelect(in, f) + case *Union: + return VisitRefOfUnion(in, f) + case *ValuesStatement: + return VisitRefOfValuesStatement(in, f) + default: + // this should never happen + return nil + } +} func VisitAlgorithmValue(in AlgorithmValue, f Visit) error { _, err := f(in) return err diff --git a/go/vt/sqlparser/cached_size.go b/go/vt/sqlparser/cached_size.go index 524291a03b4..3aac4ac1edd 100644 --- a/go/vt/sqlparser/cached_size.go +++ b/go/vt/sqlparser/cached_size.go @@ -272,7 +272,7 @@ func (cached *AlterView) CachedSize(alloc bool) int64 { size += elem.CachedSize(false) } } - // field Select vitess.io/vitess/go/vt/sqlparser.SelectStatement + // field Select vitess.io/vitess/go/vt/sqlparser.TableStatement if cc, ok := cached.Select.(cachedObject); ok { size += cc.CachedSize(true) } @@ -849,7 +849,7 @@ func (cached *CommonTableExpr) CachedSize(alloc bool) int64 { size += elem.CachedSize(false) } } - // field Subquery vitess.io/vitess/go/vt/sqlparser.SelectStatement + // field Subquery vitess.io/vitess/go/vt/sqlparser.TableStatement if cc, ok := cached.Subquery.(cachedObject); ok { size += cc.CachedSize(true) } @@ -1038,7 +1038,7 @@ func (cached *CreateView) CachedSize(alloc bool) int64 { size += elem.CachedSize(false) } } - // field Select vitess.io/vitess/go/vt/sqlparser.SelectStatement + // field Select vitess.io/vitess/go/vt/sqlparser.TableStatement if cc, ok := cached.Select.(cachedObject); ok { size += cc.CachedSize(true) } @@ -1168,7 +1168,7 @@ func (cached *DerivedTable) CachedSize(alloc bool) int64 { if alloc { size += int64(24) } - // field Select vitess.io/vitess/go/vt/sqlparser.SelectStatement + // field Select vitess.io/vitess/go/vt/sqlparser.TableStatement if cc, ok := cached.Select.(cachedObject); ok { size += cc.CachedSize(true) } @@ -4103,7 +4103,7 @@ func (cached *Subquery) CachedSize(alloc bool) int64 { if alloc { size += int64(16) } - // field Select vitess.io/vitess/go/vt/sqlparser.SelectStatement + // field Select vitess.io/vitess/go/vt/sqlparser.TableStatement if cc, ok := cached.Select.(cachedObject); ok { size += cc.CachedSize(true) } @@ -4320,11 +4320,11 @@ func (cached *Union) CachedSize(alloc bool) int64 { } // field With *vitess.io/vitess/go/vt/sqlparser.With size += cached.With.CachedSize(true) - // field Left vitess.io/vitess/go/vt/sqlparser.SelectStatement + // field Left vitess.io/vitess/go/vt/sqlparser.TableStatement if cc, ok := cached.Left.(cachedObject); ok { size += cc.CachedSize(true) } - // field Right vitess.io/vitess/go/vt/sqlparser.SelectStatement + // field Right vitess.io/vitess/go/vt/sqlparser.TableStatement if cc, ok := cached.Right.(cachedObject); ok { size += cc.CachedSize(true) } @@ -4492,6 +4492,45 @@ func (cached *ValuesFuncExpr) CachedSize(alloc bool) int64 { size += cached.Name.CachedSize(true) return size } +func (cached *ValuesStatement) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(96) + } + // field With *vitess.io/vitess/go/vt/sqlparser.With + size += cached.With.CachedSize(true) + // field Rows vitess.io/vitess/go/vt/sqlparser.Values + { + size += hack.RuntimeAllocSize(int64(cap(cached.Rows)) * int64(24)) + for _, elem := range cached.Rows { + { + size += hack.RuntimeAllocSize(int64(cap(elem)) * int64(16)) + for _, elem := range elem { + if cc, ok := elem.(cachedObject); ok { + size += cc.CachedSize(true) + } + } + } + } + } + // field ListArg vitess.io/vitess/go/vt/sqlparser.ListArg + size += hack.RuntimeAllocSize(int64(len(cached.ListArg))) + // field Comments *vitess.io/vitess/go/vt/sqlparser.ParsedComments + size += cached.Comments.CachedSize(true) + // field Order vitess.io/vitess/go/vt/sqlparser.OrderBy + { + size += hack.RuntimeAllocSize(int64(cap(cached.Order)) * int64(8)) + for _, elem := range cached.Order { + size += elem.CachedSize(true) + } + } + // field Limit *vitess.io/vitess/go/vt/sqlparser.Limit + size += cached.Limit.CachedSize(true) + return size +} func (cached *VarPop) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) diff --git a/go/vt/sqlparser/keywords.go b/go/vt/sqlparser/keywords.go index 5c1b881df30..2f1a220066d 100644 --- a/go/vt/sqlparser/keywords.go +++ b/go/vt/sqlparser/keywords.go @@ -430,6 +430,7 @@ var keywords = []keyword{ {"min", MIN}, {"manifest", MANIFEST}, {"master_bind", UNUSED}, + {"manual", MANUAL}, {"match", MATCH}, {"max", MAX}, {"max_rows", MAX_ROWS}, @@ -489,6 +490,7 @@ var keywords = []keyword{ {"outer", OUTER}, {"outfile", OUTFILE}, {"over", OVER}, + {"parallel", PARALLEL}, {"overwrite", OVERWRITE}, {"pack_keys", PACK_KEYS}, {"parser", PARSER}, @@ -515,6 +517,7 @@ var keywords = []keyword{ {"procedure", PROCEDURE}, {"ps_current_thread_id", PS_CURRENT_THREAD_ID}, {"ps_thread_id", PS_THREAD_ID}, + {"qualify", QUALIFY}, {"queries", QUERIES}, {"query", QUERY}, {"range", RANGE}, @@ -696,6 +699,7 @@ var keywords = []keyword{ {"system", UNUSED}, {"table", TABLE}, {"tables", TABLES}, + {"tablesample", TABLESAMPLE}, {"tablespace", TABLESPACE}, {"temporary", TEMPORARY}, {"temptable", TEMPTABLE}, diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index d3d5fd469e7..5e075d51baa 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -3868,7 +3868,22 @@ var ( }, { input: `select * from tbl where foo > any (select foo from tbl2)`, }, { - input: `select * from tbl where foo > all (select foo from tbl2)`}} + input: `select * from tbl where foo > all (select foo from tbl2)`, + }, { + input: "insert into t1(a1) values row('a'), row('b')", + }, { + input: "insert into t1(a1) values ('a'), ('b')", + }, { + input: "values row('a'), row('b')", + }, { + input: "values /*my comment*/ row('a'), row('b')", + }, { + input: `with x as (select * from t1 limit 1) values ROW('a1', (select x.a1 from x))`, + output: "with x as (select * from t1 limit 1) values row('a1', (select x.a1 from x))", + }, { + input: "SELECT 1,2 UNION SELECT * from (VALUES ROW(10,15)) t", + output: "select 1, 2 from dual union select * from (values row(10, 15)) as t", + }} ) func TestValid(t *testing.T) { @@ -3944,6 +3959,12 @@ func TestInvalid(t *testing.T) { }, { input: "/*!*/", err: "Query was empty", + }, { + input: "values row(1) into outfile s3 'out_file_name'", + err: "VALUES does not support INTO at position 46", + }, { + input: "values row(1) lock in share mode", + err: "VALUES does not support LOCK at position 33", }, { input: "select /* union with limit on lhs */ 1 from t limit 1 union select 1 from t", err: "syntax error at position 60 near 'union'", @@ -6204,6 +6225,12 @@ var ( }, { input: "create database test_db default encryption @a", output: "syntax error at position 46 near 'a'", + }, { + input: "select * from t1 where a1 in row('a')", + output: "syntax error at position 33 near 'row'", + }, { + input: "insert into t1 (a1) values row('a'), ('b')", + output: "syntax error at position 39", }} ) diff --git a/go/vt/sqlparser/parsed_query.go b/go/vt/sqlparser/parsed_query.go index 491e7400988..0e3f9801610 100644 --- a/go/vt/sqlparser/parsed_query.go +++ b/go/vt/sqlparser/parsed_query.go @@ -101,6 +101,14 @@ func EncodeValue(buf *strings.Builder, value *querypb.BindVariable) { sqltypes.ProtoToValue(bv).EncodeSQLStringBuilder(buf) } buf.WriteByte(')') + case querypb.Type_ROW_TUPLE: + for i, bv := range value.Values { + if i != 0 { + buf.WriteString(", ") + } + buf.WriteString("row") + sqltypes.ProtoToValue(bv).EncodeSQLStringBuilder(buf) + } case querypb.Type_RAW: v, _ := sqltypes.BindVariableToValue(value) buf.Write(v.Raw()) @@ -123,7 +131,9 @@ func FetchBindVar(name string, bindVariables map[string]*querypb.BindVariable) ( } if isList { - if supplied.Type != querypb.Type_TUPLE { + switch supplied.Type { + case querypb.Type_TUPLE, querypb.Type_ROW_TUPLE: + default: return nil, false, fmt.Errorf("unexpected list arg type (%v) for key %s", supplied.Type, name) } if len(supplied.Values) == 0 { diff --git a/go/vt/sqlparser/parsed_query_test.go b/go/vt/sqlparser/parsed_query_test.go index 1458a3e6527..26b9855b0f0 100644 --- a/go/vt/sqlparser/parsed_query_test.go +++ b/go/vt/sqlparser/parsed_query_test.go @@ -103,6 +103,13 @@ func TestGenerateQuery(t *testing.T) { "vals": sqltypes.Int64BindVariable(1), }, output: "unexpected list arg type (INT64) for key vals", + }, { + desc: "row tuple", + query: "select 1 from (values ::a) dt", + bindVars: map[string]*querypb.BindVariable{ + "a": createRowTupleBV(), + }, + output: "select 1 from (values row('a', 1), row('b', 2)) as dt", }, { desc: "list bind var for non-list", query: "select * from a where id = :vals", @@ -302,3 +309,12 @@ func TestCastBindVars(t *testing.T) { }) } } + +func createRowTupleBV() *querypb.BindVariable { + v1 := sqltypes.TestTuple(sqltypes.NewVarChar("a"), sqltypes.NewInt64(1)) + v2 := sqltypes.TestTuple(sqltypes.NewVarChar("b"), sqltypes.NewInt64(2)) + return &querypb.BindVariable{ + Type: querypb.Type_ROW_TUPLE, + Values: append([]*querypb.Value{sqltypes.ValueToProto(v1)}, sqltypes.ValueToProto(v2)), + } +} diff --git a/go/vt/sqlparser/parser.go b/go/vt/sqlparser/parser.go index d4948396ae5..8af0018db2a 100644 --- a/go/vt/sqlparser/parser.go +++ b/go/vt/sqlparser/parser.go @@ -77,7 +77,7 @@ func yyParsePooled(yylex yyLexer) int { // error is ignored and the DDL is returned anyway. func (p *Parser) Parse2(sql string) (Statement, BindVars, error) { tokenizer := p.NewStringTokenizer(sql) - if yyParsePooled(tokenizer) != 0 { + if yyParsePooled(tokenizer) != 0 || tokenizer.LastError != nil { if tokenizer.partialDDL != nil { if typ, val := tokenizer.Scan(); typ != 0 { return nil, nil, fmt.Errorf("extra characters encountered after end of DDL: '%s'", val) diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index befd9b44c3b..4569fbc7686 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -705,67 +705,71 @@ const UNBOUNDED = 58012 const VCPU = 58013 const VISIBLE = 58014 const RETURNING = 58015 -const FORMAT_BYTES = 58016 -const FORMAT_PICO_TIME = 58017 -const PS_CURRENT_THREAD_ID = 58018 -const PS_THREAD_ID = 58019 -const GTID_SUBSET = 58020 -const GTID_SUBTRACT = 58021 -const WAIT_FOR_EXECUTED_GTID_SET = 58022 -const WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS = 58023 -const FORMAT = 58024 -const TREE = 58025 -const VITESS = 58026 -const TRADITIONAL = 58027 -const VTEXPLAIN = 58028 -const VEXPLAIN = 58029 -const PLAN = 58030 -const LOCAL = 58031 -const LOW_PRIORITY = 58032 -const NO_WRITE_TO_BINLOG = 58033 -const LOGS = 58034 -const ERROR = 58035 -const GENERAL = 58036 -const HOSTS = 58037 -const OPTIMIZER_COSTS = 58038 -const USER_RESOURCES = 58039 -const SLOW = 58040 -const CHANNEL = 58041 -const RELAY = 58042 -const EXPORT = 58043 -const CURRENT = 58044 -const ROW = 58045 -const ROWS = 58046 -const AVG_ROW_LENGTH = 58047 -const CONNECTION = 58048 -const CHECKSUM = 58049 -const DELAY_KEY_WRITE = 58050 -const ENCRYPTION = 58051 -const ENGINE = 58052 -const INSERT_METHOD = 58053 -const MAX_ROWS = 58054 -const MIN_ROWS = 58055 -const PACK_KEYS = 58056 -const PASSWORD = 58057 -const FIXED = 58058 -const DYNAMIC = 58059 -const COMPRESSED = 58060 -const REDUNDANT = 58061 -const COMPACT = 58062 -const ROW_FORMAT = 58063 -const STATS_AUTO_RECALC = 58064 -const STATS_PERSISTENT = 58065 -const STATS_SAMPLE_PAGES = 58066 -const STORAGE = 58067 -const MEMORY = 58068 -const DISK = 58069 -const PARTITIONS = 58070 -const LINEAR = 58071 -const RANGE = 58072 -const LIST = 58073 -const SUBPARTITION = 58074 -const SUBPARTITIONS = 58075 -const HASH = 58076 +const MANUAL = 58016 +const PARALLEL = 58017 +const QUALIFY = 58018 +const TABLESAMPLE = 58019 +const FORMAT_BYTES = 58020 +const FORMAT_PICO_TIME = 58021 +const PS_CURRENT_THREAD_ID = 58022 +const PS_THREAD_ID = 58023 +const GTID_SUBSET = 58024 +const GTID_SUBTRACT = 58025 +const WAIT_FOR_EXECUTED_GTID_SET = 58026 +const WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS = 58027 +const FORMAT = 58028 +const TREE = 58029 +const VITESS = 58030 +const TRADITIONAL = 58031 +const VTEXPLAIN = 58032 +const VEXPLAIN = 58033 +const PLAN = 58034 +const LOCAL = 58035 +const LOW_PRIORITY = 58036 +const NO_WRITE_TO_BINLOG = 58037 +const LOGS = 58038 +const ERROR = 58039 +const GENERAL = 58040 +const HOSTS = 58041 +const OPTIMIZER_COSTS = 58042 +const USER_RESOURCES = 58043 +const SLOW = 58044 +const CHANNEL = 58045 +const RELAY = 58046 +const EXPORT = 58047 +const CURRENT = 58048 +const ROW = 58049 +const ROWS = 58050 +const AVG_ROW_LENGTH = 58051 +const CONNECTION = 58052 +const CHECKSUM = 58053 +const DELAY_KEY_WRITE = 58054 +const ENCRYPTION = 58055 +const ENGINE = 58056 +const INSERT_METHOD = 58057 +const MAX_ROWS = 58058 +const MIN_ROWS = 58059 +const PACK_KEYS = 58060 +const PASSWORD = 58061 +const FIXED = 58062 +const DYNAMIC = 58063 +const COMPRESSED = 58064 +const REDUNDANT = 58065 +const COMPACT = 58066 +const ROW_FORMAT = 58067 +const STATS_AUTO_RECALC = 58068 +const STATS_PERSISTENT = 58069 +const STATS_SAMPLE_PAGES = 58070 +const STORAGE = 58071 +const MEMORY = 58072 +const DISK = 58073 +const PARTITIONS = 58074 +const LINEAR = 58075 +const RANGE = 58076 +const LIST = 58077 +const SUBPARTITION = 58078 +const SUBPARTITIONS = 58079 +const HASH = 58080 var yyToknames = [...]string{ "$end", @@ -1458,6 +1462,10 @@ var yyToknames = [...]string{ "VCPU", "VISIBLE", "RETURNING", + "MANUAL", + "PARALLEL", + "QUALIFY", + "TABLESAMPLE", "FORMAT_BYTES", "FORMAT_PICO_TIME", "PS_CURRENT_THREAD_ID", @@ -1538,249 +1546,548 @@ var yyExca = [...]int{ 17, 49, -2, 40, -1, 52, - 1, 157, - 752, 157, - -2, 165, + 1, 160, + 756, 160, + -2, 168, -1, 53, - 149, 165, - 191, 165, - 364, 165, - -2, 523, + 149, 168, + 191, 168, + 364, 168, + -2, 526, -1, 61, - 38, 784, - 254, 784, - 265, 784, - 300, 798, - 301, 798, - -2, 786, + 38, 787, + 254, 787, + 265, 787, + 300, 801, + 301, 801, + -2, 789, -1, 66, - 256, 822, - -2, 820, - -1, 122, - 253, 1621, - -2, 131, + 256, 825, + -2, 823, -1, 124, - 1, 158, - 752, 158, - -2, 165, - -1, 135, - 150, 408, - 259, 408, - -2, 512, - -1, 154, - 149, 165, - 191, 165, - 364, 165, - -2, 532, - -1, 749, + 253, 1630, + -2, 134, + -1, 126, + 1, 161, + 756, 161, + -2, 168, + -1, 137, + 150, 411, + 259, 411, + -2, 515, + -1, 156, + 149, 168, + 191, 168, + 364, 168, + -2, 535, + -1, 755, 177, 41, -2, 43, - -1, 958, - 95, 1638, - -2, 1482, - -1, 959, - 95, 1639, - 236, 1643, - -2, 1483, - -1, 960, - 236, 1642, + -1, 964, + 95, 1647, + -2, 1485, + -1, 965, + 95, 1648, + 236, 1652, + -2, 1486, + -1, 966, + 236, 1651, -2, 42, - -1, 1044, - 65, 896, - -2, 909, - -1, 1132, - 264, 1109, - 269, 1109, - -2, 419, - -1, 1217, - 1, 580, - 752, 580, - -2, 165, - -1, 1528, - 236, 1643, - -2, 1483, - -1, 1740, - 65, 897, - -2, 913, - -1, 1741, - 65, 898, - -2, 914, - -1, 1801, - 149, 165, - 191, 165, - 364, 165, - -2, 458, - -1, 1884, - 150, 408, - 259, 408, - -2, 512, - -1, 1893, - 264, 1110, - 269, 1110, - -2, 420, - -1, 2342, - 236, 1647, - -2, 1641, - -1, 2343, - 236, 1643, - -2, 1639, - -1, 2446, - 149, 165, - 191, 165, - 364, 165, - -2, 459, - -1, 2453, - 28, 186, - -2, 188, - -1, 2917, - 86, 96, - 96, 96, - -2, 976, - -1, 2985, - 727, 702, - -2, 676, - -1, 3210, - 55, 1586, - -2, 1580, - -1, 4047, - 727, 702, - -2, 690, - -1, 4139, - 98, 634, - 104, 634, - 114, 634, - 193, 634, - 194, 634, - 195, 634, - 196, 634, - 197, 634, - 198, 634, - 199, 634, - 200, 634, - 201, 634, - 202, 634, - 203, 634, - 204, 634, - 205, 634, - 206, 634, - 207, 634, - 208, 634, - 209, 634, - 210, 634, - 211, 634, - 212, 634, - 213, 634, - 214, 634, - 215, 634, - 216, 634, - 217, 634, - 218, 634, - 219, 634, - 220, 634, - 221, 634, - 222, 634, - 223, 634, - 224, 634, - 225, 634, - 226, 634, - 227, 634, - 228, 634, - 229, 634, - 230, 634, - 231, 634, - 232, 634, - 233, 634, - 234, 634, - -2, 2019, + -1, 1052, + 65, 899, + -2, 912, + -1, 1141, + 264, 1112, + 269, 1112, + -2, 422, + -1, 1226, + 1, 583, + 756, 583, + -2, 168, + -1, 1537, + 236, 1652, + -2, 1486, + -1, 1750, + 65, 900, + -2, 916, + -1, 1751, + 65, 901, + -2, 917, + -1, 1816, + 149, 168, + 191, 168, + 364, 168, + -2, 461, + -1, 1899, + 150, 411, + 259, 411, + -2, 515, + -1, 1908, + 264, 1113, + 269, 1113, + -2, 423, + -1, 2357, + 236, 1656, + -2, 1650, + -1, 2358, + 236, 1652, + -2, 1648, + -1, 2463, + 149, 168, + 191, 168, + 364, 168, + -2, 462, + -1, 2470, + 28, 189, + -2, 191, + -1, 2936, + 86, 99, + 96, 99, + -2, 979, + -1, 3004, + 731, 705, + -2, 679, + -1, 3229, + 55, 1589, + -2, 1583, + -1, 4066, + 731, 705, + -2, 693, + -1, 4158, + 98, 637, + 104, 637, + 114, 637, + 193, 637, + 194, 637, + 195, 637, + 196, 637, + 197, 637, + 198, 637, + 199, 637, + 200, 637, + 201, 637, + 202, 637, + 203, 637, + 204, 637, + 205, 637, + 206, 637, + 207, 637, + 208, 637, + 209, 637, + 210, 637, + 211, 637, + 212, 637, + 213, 637, + 214, 637, + 215, 637, + 216, 637, + 217, 637, + 218, 637, + 219, 637, + 220, 637, + 221, 637, + 222, 637, + 223, 637, + 224, 637, + 225, 637, + 226, 637, + 227, 637, + 228, 637, + 229, 637, + 230, 637, + 231, 637, + 232, 637, + 233, 637, + 234, 637, + -2, 2029, } const yyPrivate = 57344 -const yyLast = 57002 +const yyLast = 56577 var yyAct = [...]int{ - 974, 3698, 3699, 87, 3697, 4137, 4214, 4028, 4118, 3361, - 4227, 4181, 4106, 3647, 4182, 969, 1285, 961, 3262, 2135, - 2014, 2443, 2170, 3269, 2371, 1283, 3497, 4010, 2147, 3933, - 3319, 3310, 3324, 3321, 3320, 3318, 3323, 3322, 2073, 3223, - 4008, 5, 3634, 2373, 3161, 3076, 3339, 3277, 2518, 753, - 3338, 3227, 3224, 3543, 962, 3221, 3740, 3050, 3537, 923, - 747, 3211, 2877, 3075, 1804, 2398, 2481, 781, 2414, 1760, - 748, 2951, 4079, 3032, 3368, 1861, 3527, 2417, 2982, 922, - 3341, 2505, 2486, 3565, 2952, 2549, 1042, 1164, 87, 163, - 1094, 927, 2953, 2431, 42, 1062, 1039, 743, 2883, 1069, - 1909, 2902, 2419, 2869, 41, 2418, 2853, 1042, 2327, 2294, - 2169, 2295, 2131, 3023, 2527, 149, 43, 1891, 2504, 2081, - 2406, 2488, 1104, 2944, 1122, 2566, 1127, 1793, 2919, 1773, - 2421, 1721, 2890, 1541, 2175, 100, 2106, 2095, 104, 105, - 1466, 1449, 1898, 2010, 1101, 1098, 3226, 763, 1133, 1870, - 1102, 2477, 1990, 1128, 1130, 1129, 2478, 1792, 1079, 1778, - 1081, 1051, 758, 1140, 750, 2399, 1743, 2183, 3735, 2202, - 1048, 2851, 1524, 85, 2072, 2022, 1061, 1041, 107, 1045, - 3727, 1500, 99, 1273, 167, 3554, 3498, 1883, 127, 125, - 126, 132, 1046, 1213, 1037, 133, 924, 1049, 1064, 751, - 1074, 84, 1545, 98, 1047, 106, 4215, 1281, 3635, 3307, - 1259, 740, 1073, 93, 2520, 2521, 2522, 4063, 1550, 2520, - 3005, 3004, 2564, 2973, 3627, 1036, 4164, 683, 3040, 3590, - 3041, 4059, 2368, 2369, 4058, 1054, 2088, 128, 2087, 1166, - 2086, 134, 2085, 4064, 1169, 2084, 1095, 3329, 2083, 2053, - 1229, 4158, 1183, 1184, 1185, 2849, 1188, 1189, 1190, 1191, - 3326, 2618, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, - 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1088, - 3207, 4185, 1089, 1055, 741, 2, 680, 1040, 681, 1764, - 1038, 1143, 95, 1975, 1119, 2553, 1762, 3702, 3702, 3329, - 1144, 2879, 4220, 725, 3165, 1111, 2392, 3327, 4237, 128, - 1170, 1173, 1174, 1118, 1117, 1116, 95, 4037, 95, 1765, - 1063, 1463, 1177, 1106, 1460, 2975, 1763, 4219, 4180, 1230, - 111, 112, 113, 1186, 116, 4059, 3333, 122, 725, 2552, - 191, 1483, 95, 675, 4205, 3501, 928, 3500, 4168, 4166, - 1035, 2395, 2394, 2995, 2998, 738, 739, 190, 4011, 3327, - 719, 1754, 2109, 2814, 2093, 1030, 1031, 1032, 1033, 1087, - 1091, 926, 1044, 4167, 4165, 3387, 4133, 128, 3929, 3928, - 129, 1168, 190, 1167, 977, 978, 979, 719, 3333, 977, - 978, 979, 3640, 3701, 3701, 3641, 172, 1451, 4195, 3939, - 1076, 1077, 1120, 4147, 86, 129, 1087, 1091, 926, 4162, - 3659, 3648, 4107, 4115, 2546, 86, 86, 3938, 719, 2625, - 2140, 172, 4142, 4145, 3413, 1872, 3012, 2850, 3013, 1462, - 714, 3259, 3260, 4151, 4152, 2551, 2438, 2439, 4119, 2893, - 3258, 1479, 2933, 3279, 3280, 1794, 1115, 1795, 1222, 1223, - 4146, 3330, 2065, 2066, 3039, 719, 169, 3658, 2928, 170, - 2622, 2927, 2437, 3022, 2929, 1278, 3754, 2894, 1254, 1255, - 1249, 1028, 1110, 1027, 1237, 1112, 4029, 2940, 699, 1238, - 1225, 169, 1250, 1243, 170, 189, 2018, 95, 719, 2623, - 1480, 697, 1481, 1482, 2456, 2455, 3365, 1212, 95, 95, - 719, 3395, 1237, 3330, 1113, 2370, 719, 1238, 3363, 4042, - 189, 2886, 2887, 1444, 4123, 1236, 2616, 1235, 3393, 4123, - 2068, 1790, 2064, 733, 737, 731, 3097, 3369, 2528, 3024, - 1187, 694, 1996, 1725, 1461, 4186, 3981, 3356, 3982, 2983, - 709, 3008, 2567, 2402, 2573, 3357, 1965, 86, 4217, 2592, - 88, 2593, 3278, 2594, 1991, 704, 4187, 1266, 1270, 1268, - 1450, 1252, 1253, 2569, 3281, 1443, 1275, 707, 2211, 1218, - 717, 1258, 2497, 3027, 1115, 720, 1107, 1256, 718, 1277, - 3913, 1251, 1244, 1109, 1108, 1276, 2619, 1257, 2620, 1501, - 1966, 3629, 1967, 3366, 3628, 2595, 2491, 1265, 1267, 2574, - 173, 1080, 720, 3625, 1142, 3364, 1142, 1193, 1192, 179, - 1153, 3384, 1151, 1502, 1503, 1504, 1505, 1506, 1507, 1508, - 1510, 1509, 1511, 1512, 2531, 173, 1728, 1123, 2019, 2571, - 95, 1124, 1113, 720, 179, 3281, 3706, 1114, 684, 2415, - 686, 700, 1124, 722, 1162, 721, 690, 1161, 688, 692, - 701, 693, 1160, 687, 4159, 698, 1159, 1158, 689, 702, - 703, 706, 710, 711, 712, 708, 705, 2203, 696, 723, - 720, 2570, 2205, 1157, 1156, 1155, 2210, 2206, 1150, 1876, - 2207, 2208, 2209, 1163, 2572, 2204, 2212, 2213, 2214, 2215, - 2216, 2217, 2218, 2219, 2220, 3098, 3540, 1099, 1090, 1084, - 1082, 1099, 1136, 720, 2976, 1097, 4238, 1141, 1263, 1141, - 4192, 1099, 1264, 1075, 1282, 720, 1282, 1282, 3624, 3164, - 1135, 720, 1269, 2580, 2576, 2578, 2579, 2577, 2581, 2582, - 2583, 2584, 2011, 1871, 3028, 1090, 1084, 1082, 164, 2400, - 2401, 2557, 3173, 2556, 2007, 1452, 1180, 1262, 3192, 2490, - 3190, 3301, 2000, 1791, 1998, 1999, 1997, 2001, 2002, 2003, - 1154, 3007, 1152, 164, 1869, 1114, 1042, 1525, 1530, 1531, - 1868, 1534, 1536, 1537, 1538, 1539, 1540, 1867, 1543, 1544, - 1546, 1546, 3010, 1546, 1546, 1551, 1551, 1551, 1554, 1555, - 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, - 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, - 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, + 980, 3716, 975, 87, 4246, 2162, 3717, 4233, 3718, 3380, + 4125, 968, 4137, 4200, 3281, 967, 4201, 2150, 4047, 3516, + 2460, 3288, 1292, 4156, 2386, 3952, 3242, 4029, 3338, 2185, + 3343, 3340, 3339, 3337, 3342, 1819, 3341, 4027, 3653, 2388, + 1294, 3666, 3095, 3358, 2029, 4098, 3296, 3329, 2088, 3180, + 2535, 5, 3357, 759, 3246, 3243, 3562, 3556, 3759, 3069, + 3094, 2896, 3230, 2498, 754, 2434, 3051, 1770, 929, 787, + 3546, 3387, 933, 753, 928, 42, 3360, 3001, 2970, 2522, + 2503, 2415, 3584, 2971, 2566, 1103, 1050, 2972, 87, 165, + 2448, 2431, 1876, 2921, 1071, 1924, 1047, 2436, 2902, 1078, + 2435, 1149, 3240, 2886, 749, 1173, 2870, 2310, 41, 1050, + 43, 2342, 2146, 2184, 2544, 3042, 151, 2309, 1906, 2096, + 2521, 2423, 2583, 2505, 1113, 2963, 1136, 1808, 1131, 2938, + 982, 1788, 1774, 102, 1550, 2190, 2438, 106, 1731, 107, + 2121, 2110, 1475, 1458, 2025, 1913, 3245, 1110, 1107, 769, + 1070, 1142, 1885, 2909, 1111, 2005, 756, 2494, 1049, 1137, + 1053, 1139, 1138, 1807, 1088, 1793, 1090, 101, 3754, 2198, + 2217, 2868, 2495, 1059, 1753, 1533, 109, 1509, 2087, 1282, + 3746, 1073, 2416, 3573, 1056, 764, 2037, 85, 169, 129, + 127, 128, 3517, 1898, 1045, 134, 1054, 135, 1055, 757, + 1222, 1083, 1057, 930, 1554, 100, 4234, 1290, 3654, 3326, + 1268, 4082, 2537, 84, 1082, 93, 1559, 2537, 2538, 2539, + 3024, 3023, 108, 2992, 2581, 1476, 3646, 4183, 1044, 3609, + 1776, 3059, 3060, 4078, 4077, 1063, 2103, 4083, 746, 1990, + 1153, 130, 2102, 2101, 689, 2100, 1178, 136, 1104, 2099, + 2098, 2383, 2384, 2068, 1238, 686, 2866, 687, 2635, 1175, + 3226, 2570, 1186, 4177, 4204, 3184, 4256, 3721, 4199, 3721, + 1064, 4224, 1192, 1193, 1194, 3520, 1197, 1198, 1199, 1200, + 2898, 3519, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, + 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1048, + 1152, 1098, 2407, 2412, 1097, 2569, 731, 1046, 1239, 1061, + 2, 747, 4239, 1128, 4056, 130, 1127, 1126, 1125, 1179, + 1182, 1183, 3348, 1779, 1072, 1115, 1772, 2994, 3348, 1472, + 1764, 2411, 1469, 1486, 1492, 1120, 3017, 4238, 731, 4078, + 4030, 3345, 725, 2831, 1777, 2108, 981, 4187, 3406, 4152, + 3948, 3947, 1195, 1780, 113, 114, 115, 1043, 118, 1177, + 1176, 124, 192, 3720, 193, 3720, 3014, 681, 984, 985, + 986, 4214, 4186, 95, 1778, 1096, 1100, 932, 3958, 744, + 745, 4185, 3346, 130, 1129, 131, 4181, 725, 3346, 1038, + 1039, 1040, 1041, 3678, 3667, 1460, 1052, 984, 985, 986, + 4126, 174, 4134, 1096, 1100, 932, 4184, 3659, 2563, 3957, + 3660, 3352, 86, 2155, 4161, 3432, 1887, 3352, 3278, 3279, + 2455, 2456, 4138, 2867, 725, 2947, 1085, 1086, 2946, 3277, + 720, 2948, 3031, 3058, 3032, 4166, 2639, 1471, 86, 2080, + 2081, 1809, 3041, 1810, 2454, 2642, 1482, 2952, 1258, 1474, + 86, 1036, 725, 1035, 1287, 4164, 4048, 1246, 3677, 2995, + 1259, 171, 1247, 97, 172, 4170, 4171, 1263, 1264, 2033, + 2514, 2959, 1252, 2912, 3414, 3298, 3299, 725, 705, 2473, + 2472, 3412, 4165, 1489, 3384, 1490, 1491, 1488, 1453, 3773, + 191, 703, 2633, 2568, 2508, 95, 739, 1246, 4142, 2905, + 2906, 2913, 1247, 3382, 1124, 86, 1231, 1232, 88, 725, + 1245, 2226, 1244, 2079, 2083, 2640, 743, 737, 4205, 1476, + 725, 95, 725, 1805, 3388, 3116, 3349, 4142, 2385, 1221, + 3043, 700, 3349, 95, 1735, 4000, 1980, 4001, 1234, 4206, + 715, 3002, 1470, 2545, 3027, 3375, 2609, 4236, 2610, 2588, + 2611, 1196, 1275, 3376, 1277, 710, 97, 726, 1459, 1260, + 2584, 2590, 1122, 2419, 2006, 2419, 1279, 713, 1286, 1452, + 723, 1253, 3046, 1284, 1285, 1227, 1265, 1267, 724, 3648, + 1981, 3385, 1982, 3647, 3297, 2612, 1266, 2636, 95, 2637, + 1202, 2587, 1274, 1276, 1261, 1262, 3300, 1151, 1201, 2586, + 3383, 3932, 726, 3644, 2589, 175, 1162, 1089, 1160, 1132, + 2218, 2034, 2548, 1133, 181, 2220, 2591, 1738, 3725, 2225, + 2221, 3300, 1151, 2222, 2223, 2224, 2432, 1486, 2219, 2227, + 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 690, 726, + 692, 706, 1133, 728, 1171, 727, 696, 2507, 694, 698, + 707, 699, 1170, 693, 1169, 704, 1168, 1510, 695, 708, + 709, 712, 716, 717, 718, 714, 711, 726, 702, 729, + 4178, 1167, 1166, 3559, 1165, 1164, 1159, 1891, 1172, 3403, + 3183, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1519, 1518, + 1520, 1521, 726, 1108, 3117, 1123, 4257, 1524, 1145, 4211, + 1150, 1108, 1144, 1272, 1099, 1093, 1091, 1273, 2597, 2593, + 2595, 2596, 2594, 2598, 2599, 2600, 2601, 1278, 3643, 2026, + 1291, 1886, 1291, 1291, 726, 1150, 1108, 1084, 3047, 2574, + 1106, 2573, 1099, 1093, 1091, 726, 2022, 726, 1461, 1189, + 1482, 3211, 1271, 166, 3320, 3026, 1481, 1478, 1479, 1480, + 1485, 1487, 1484, 1884, 1483, 1806, 1163, 3012, 1161, 2417, + 2418, 2417, 2418, 1883, 1477, 2996, 3209, 1882, 2023, 1880, + 1237, 680, 1050, 1534, 1539, 1540, 4179, 1543, 1545, 1546, + 1547, 1548, 1549, 3063, 1552, 1553, 1555, 1555, 3029, 1555, + 1555, 1560, 1560, 1560, 1563, 1564, 1565, 1566, 1567, 1568, + 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, + 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, + 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, + 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, + 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, + 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, + 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, + 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, + 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, + 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, + 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, + 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 4055, 1449, + 1280, 1531, 1687, 1130, 1689, 1690, 1691, 1692, 1693, 1450, + 1451, 2993, 3607, 3608, 1544, 1776, 1560, 1560, 1560, 1560, + 1560, 1560, 1992, 1991, 1993, 1994, 1995, 3719, 730, 3719, + 4140, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, + 1709, 1710, 1711, 1712, 1713, 1527, 1528, 1529, 1530, 721, + 4169, 3676, 1243, 2567, 1225, 1541, 1535, 3016, 2961, 4140, + 89, 2511, 167, 3560, 722, 1092, 4139, 95, 4101, 179, + 1524, 1556, 1912, 1557, 1558, 2871, 2873, 94, 2565, 1242, + 1468, 1248, 1249, 1250, 1251, 3350, 3351, 1230, 1561, 1562, + 1726, 3350, 3351, 1092, 4168, 4139, 2641, 1233, 3354, 2640, + 3504, 3015, 2512, 94, 3354, 1288, 1289, 3050, 1151, 2510, + 187, 4043, 1728, 3040, 1763, 94, 3039, 3598, 1734, 3580, + 1481, 1478, 1479, 1480, 1485, 1487, 1484, 1050, 1483, 4250, + 1181, 1050, 3192, 1724, 1525, 1526, 1144, 1050, 1477, 1119, + 1180, 2943, 1121, 2513, 1151, 2908, 1256, 2843, 2158, 1797, + 1688, 1236, 3191, 2509, 2903, 688, 2657, 168, 173, 170, + 176, 177, 178, 180, 182, 183, 184, 185, 126, 1725, + 94, 2010, 2461, 186, 188, 189, 190, 1524, 1521, 3276, + 3404, 1911, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1519, + 1518, 1520, 1521, 2011, 2668, 1151, 1764, 1269, 2199, 1742, + 2038, 1504, 1067, 1746, 1283, 4069, 1241, 1174, 121, 1049, + 3639, 1150, 3572, 2585, 2092, 2200, 1124, 1220, 1516, 1517, + 1519, 1518, 1520, 1521, 1744, 2019, 1745, 1811, 106, 3090, + 107, 2191, 1694, 1695, 1696, 1697, 1698, 1699, 2191, 1725, + 2677, 1124, 2527, 1116, 1490, 1491, 4215, 1150, 1188, 2872, + 1118, 1117, 1732, 1144, 1147, 1148, 1491, 1108, 3768, 4207, + 4061, 1141, 1145, 1510, 2557, 3614, 3613, 109, 3070, 2552, + 3053, 1921, 1775, 1492, 1920, 3052, 1740, 1910, 3053, 2557, + 2668, 1224, 1140, 3052, 2562, 2564, 122, 1511, 1512, 1513, + 1514, 1515, 1516, 1517, 1519, 1518, 1520, 1521, 1150, 1122, + 2560, 1162, 1766, 1154, 1144, 1904, 1160, 2561, 1156, 1062, + 3599, 4252, 1157, 1155, 1888, 1889, 1890, 3940, 2114, 2115, + 2647, 2648, 2559, 1743, 3939, 1975, 2007, 3284, 2008, 1914, + 1914, 2009, 1897, 1158, 4258, 1926, 1151, 1927, 3930, 1929, + 1931, 1769, 1741, 1935, 1937, 1939, 1941, 1943, 1916, 1957, + 1048, 1046, 3072, 1729, 2197, 1270, 4102, 2031, 2039, 1291, + 1240, 4248, 1255, 1226, 4249, 3962, 4247, 1802, 1803, 1151, + 95, 1151, 4035, 1257, 1915, 1492, 731, 1764, 3285, 1871, + 2347, 1965, 1966, 2126, 2344, 2196, 2000, 1971, 1972, 3690, + 2124, 1223, 1492, 2346, 3673, 1879, 3674, 2127, 1522, 1523, + 2125, 2182, 1998, 3287, 1987, 4103, 2714, 1123, 1894, 979, + 1895, 3689, 1893, 2015, 1907, 2013, 2014, 2012, 2016, 2017, + 2018, 4036, 1489, 3282, 1490, 1491, 3082, 3081, 3080, 3621, + 4259, 3074, 1123, 3078, 3620, 3073, 1918, 3071, 3610, 1150, + 3327, 1747, 3076, 3298, 3299, 1144, 1147, 1148, 3316, 1108, + 3283, 3075, 1961, 1141, 1145, 1492, 2968, 1999, 2027, 2967, + 192, 1492, 2966, 1953, 2517, 2001, 1956, 1492, 1958, 2182, + 3077, 3079, 1150, 1997, 1150, 1986, 1187, 1154, 1144, 1985, + 1184, 1984, 1156, 131, 3289, 1764, 1157, 1155, 1983, 3421, + 984, 985, 986, 1492, 1973, 130, 1127, 1126, 1125, 174, + 2174, 2163, 2164, 2165, 2166, 2176, 2167, 2168, 2169, 2181, + 2177, 2170, 2171, 2178, 2179, 2180, 2172, 2173, 2175, 2424, + 2425, 2044, 1967, 1964, 1489, 1963, 1490, 1491, 1962, 1291, + 1291, 1933, 1739, 3092, 2347, 2040, 2041, 2666, 3604, 2066, + 731, 1489, 3379, 1490, 1491, 87, 1455, 2665, 87, 2045, + 1805, 4208, 3297, 4220, 1764, 1764, 2052, 2053, 2054, 171, + 1764, 4057, 172, 4064, 3300, 1510, 2065, 3062, 2174, 2163, + 2164, 2165, 2166, 2176, 2167, 2168, 2169, 2181, 2177, 2170, + 2171, 2178, 2179, 2180, 2172, 2173, 2175, 3967, 191, 1511, + 1512, 1513, 1514, 1515, 1516, 1517, 1519, 1518, 1520, 1521, + 2950, 1510, 731, 2533, 1489, 2532, 1490, 1491, 2153, 2153, + 1489, 1492, 1490, 1491, 4063, 1782, 1489, 42, 1490, 1491, + 42, 2151, 2151, 2718, 2154, 1511, 1512, 1513, 1514, 1515, + 1516, 1517, 1519, 1518, 1520, 1521, 2114, 2115, 2112, 2113, + 2116, 2042, 1489, 4039, 1490, 1491, 1510, 2531, 2046, 2530, + 2048, 2049, 2050, 2051, 2529, 1726, 2528, 2055, 2892, 4235, + 4195, 1764, 1510, 2111, 1783, 1506, 4038, 1507, 2237, 2067, + 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1519, 1518, 1520, + 1521, 1508, 1522, 1523, 1505, 3286, 1511, 1512, 1513, 1514, + 1515, 1516, 1517, 1519, 1518, 1520, 1521, 4037, 1724, 3935, + 1492, 3919, 2251, 175, 1514, 1515, 1516, 1517, 1519, 1518, + 1520, 1521, 181, 1512, 1513, 1514, 1515, 1516, 1517, 1519, + 1518, 1520, 1521, 2892, 1764, 3966, 2093, 3918, 2716, 85, + 1488, 1764, 85, 3767, 1725, 2123, 2073, 2074, 1488, 1764, + 3923, 2186, 3765, 1510, 2129, 2656, 2131, 2132, 2133, 2134, + 2135, 2136, 2138, 2140, 2141, 2142, 2143, 2144, 2145, 3686, + 1489, 1492, 1490, 1491, 2128, 1492, 1723, 1511, 1512, 1513, + 1514, 1515, 1516, 1517, 1519, 1518, 1520, 1521, 2892, 4133, + 2892, 4112, 2334, 2335, 2336, 2337, 2338, 1722, 2130, 1721, + 2157, 2355, 4218, 1764, 1492, 3618, 2261, 3603, 1492, 2359, + 3389, 103, 2362, 2363, 2892, 4108, 3922, 105, 1552, 2357, + 1492, 104, 3386, 2356, 2201, 2202, 2203, 2204, 1535, 1498, + 1499, 1500, 1501, 1502, 1503, 1497, 1494, 103, 2215, 2343, + 1720, 2253, 2236, 3319, 2345, 1718, 2192, 104, 2380, 3318, + 1716, 166, 3044, 1717, 1715, 2977, 1719, 4020, 1764, 1489, + 112, 1490, 1491, 4148, 1764, 112, 2964, 2410, 1764, 1492, + 1720, 111, 1714, 110, 3657, 4054, 111, 2630, 110, 3943, + 1764, 105, 1764, 3665, 1492, 2892, 3931, 3657, 1764, 2892, + 3655, 2354, 2622, 2440, 2360, 2361, 4146, 1764, 2557, 1764, + 4144, 1764, 1492, 3578, 1764, 105, 1492, 2939, 1764, 106, + 2355, 107, 4013, 1764, 2798, 1764, 3309, 3308, 3306, 3307, + 1489, 2621, 1490, 1491, 1489, 2579, 1490, 1491, 2357, 2578, + 2470, 106, 2429, 107, 3304, 3305, 2889, 3290, 2390, 2402, + 2414, 3294, 2122, 2391, 1492, 2069, 1764, 2939, 3293, 1492, + 105, 1764, 3003, 1489, 1492, 1490, 1491, 1489, 2035, 1490, + 1491, 4011, 1764, 3304, 3303, 2442, 1113, 2918, 1764, 1489, + 1764, 1490, 1491, 2640, 3025, 2940, 4008, 1764, 1875, 3006, + 2999, 3000, 3295, 2378, 2396, 2942, 2397, 3291, 2892, 2891, + 1063, 1492, 3292, 2465, 3990, 1764, 2464, 1996, 3545, 1764, + 1113, 1988, 2479, 2480, 2481, 2482, 1978, 2474, 1974, 2475, + 2476, 2477, 2478, 2446, 2887, 2940, 2982, 2403, 1489, 1970, + 1490, 1491, 1492, 2484, 2500, 2640, 2486, 2487, 2488, 2489, + 2156, 1764, 2405, 1489, 2468, 1490, 1491, 4209, 111, 2546, + 1969, 3538, 1764, 3575, 2506, 1968, 3535, 1764, 1875, 1874, + 2427, 1489, 1784, 1490, 1491, 1489, 1281, 1490, 1491, 2451, + 2452, 2450, 3271, 1492, 1817, 1816, 2469, 2467, 1492, 2917, + 2466, 3241, 2640, 1492, 2910, 2910, 3571, 1098, 1488, 2543, + 1097, 2558, 3571, 3533, 1764, 1492, 4096, 4068, 2516, 1492, + 167, 2892, 2918, 1489, 1153, 1490, 1491, 179, 1489, 3524, + 1490, 1491, 1492, 1489, 1914, 1490, 1491, 3306, 3214, 2453, + 2501, 3574, 1488, 1492, 3496, 1764, 2497, 1492, 2798, 2551, + 2515, 2701, 2554, 2520, 2555, 2519, 2704, 2490, 2492, 2493, + 2918, 2700, 2571, 1051, 1492, 2557, 2540, 2422, 187, 1492, + 1489, 2664, 1490, 1491, 2409, 2557, 2501, 2550, 2553, 2549, + 1492, 2918, 3571, 1768, 1152, 3494, 1764, 1492, 2381, 2156, + 3490, 1764, 2572, 2094, 2575, 3487, 1764, 2078, 2576, 2577, + 2021, 1489, 1804, 1490, 1491, 1135, 1134, 3485, 1764, 1765, + 1767, 3483, 1764, 95, 97, 168, 173, 170, 176, 177, + 178, 180, 182, 183, 184, 185, 4174, 4115, 3954, 2645, + 1771, 186, 188, 189, 190, 3481, 1764, 3920, 1050, 1050, + 1050, 1492, 1489, 2582, 1490, 1491, 95, 1489, 1492, 1490, + 1491, 3780, 1489, 3622, 1490, 1491, 3479, 1764, 1545, 1492, + 1545, 3477, 1764, 3638, 1489, 3635, 1490, 1491, 1489, 1492, + 1490, 1491, 3475, 1764, 1492, 3616, 2660, 3437, 1492, 3473, + 1764, 1489, 1492, 1490, 1491, 3436, 1492, 1877, 2615, 2499, + 1492, 3377, 1489, 3332, 1490, 1491, 1489, 1949, 1490, 1491, + 3328, 2663, 3007, 2496, 2491, 1492, 2485, 2483, 2003, 1492, + 3623, 3624, 3625, 1489, 1492, 1490, 1491, 1909, 1489, 2357, + 1490, 1491, 1905, 2356, 1873, 123, 3330, 2973, 2974, 1489, + 1492, 1490, 1491, 3471, 1764, 1225, 1489, 3381, 1490, 1491, + 3469, 1764, 2632, 3955, 2673, 3585, 3586, 1492, 2683, 4072, + 2514, 3467, 1764, 2394, 1950, 1951, 1952, 2638, 1492, 3591, + 4230, 3465, 1764, 3590, 4228, 2698, 3463, 1764, 4202, 2071, + 3461, 1764, 4076, 2646, 3459, 1764, 3956, 3995, 3457, 1764, + 1492, 2974, 3443, 1764, 3588, 1492, 2652, 2649, 2650, 2651, + 1489, 3324, 1490, 1491, 1492, 2123, 3323, 1489, 4052, 1490, + 1491, 3419, 1764, 2653, 3322, 2655, 2863, 1764, 1489, 3241, + 1490, 1491, 2986, 2616, 2658, 3260, 2659, 3259, 1489, 1492, + 1490, 1491, 2672, 1489, 1492, 1490, 1491, 1489, 1492, 1490, + 1491, 1489, 1492, 1490, 1491, 1489, 2072, 1490, 1491, 1489, + 3927, 1490, 1491, 3263, 3261, 2676, 1492, 2654, 3264, 3262, + 2861, 1764, 685, 2413, 1489, 1492, 1490, 1491, 1489, 1781, + 1490, 1491, 1492, 1489, 2400, 1490, 1491, 3579, 1065, 2624, + 2625, 1492, 2836, 1764, 2627, 3219, 2842, 2813, 1764, 1489, + 2661, 1490, 1491, 2628, 3218, 4034, 2805, 1764, 3758, 3760, + 1492, 3265, 1786, 2927, 2928, 3567, 1489, 1492, 1490, 1491, + 3228, 2712, 1492, 2830, 3626, 2020, 1034, 1489, 2874, 1490, + 1491, 2796, 1764, 3231, 3233, 2153, 2794, 1764, 3302, 1066, + 2781, 1764, 3234, 2957, 2779, 1764, 748, 1050, 2151, 1489, + 2877, 1490, 1491, 3564, 1489, 1492, 1490, 1491, 2777, 1764, + 2978, 3563, 1492, 1489, 2608, 1490, 1491, 2775, 1764, 2875, + 2199, 1492, 2915, 2916, 2773, 1764, 2607, 3627, 3628, 3629, + 2380, 2440, 2606, 1785, 1050, 2935, 1068, 2200, 1489, 2605, + 1490, 1491, 1492, 1489, 1069, 1490, 1491, 1489, 1492, 1490, + 1491, 1489, 3593, 1490, 1491, 1077, 2878, 2604, 2880, 2771, + 1764, 2603, 2122, 2602, 3540, 1489, 3397, 1490, 1491, 1076, + 2914, 1191, 1190, 1492, 1489, 2973, 1490, 1491, 3745, 3056, + 3744, 1489, 1454, 1490, 1491, 103, 2895, 2119, 2117, 2118, + 1489, 105, 1490, 1491, 42, 104, 2933, 2769, 1764, 3013, + 131, 3569, 105, 2932, 2767, 1764, 2934, 2904, 1732, 1489, + 2865, 1490, 1491, 2765, 1764, 4244, 1489, 103, 1490, 1491, + 1492, 1489, 2990, 1490, 1491, 2885, 2619, 104, 1492, 4151, + 1775, 4053, 2893, 3743, 2763, 1764, 1492, 2424, 2425, 1725, + 2761, 1764, 3950, 2953, 2907, 1492, 2890, 2960, 2962, 3011, + 1492, 1945, 3547, 3301, 1489, 2937, 1490, 1491, 1492, 2931, + 3217, 1489, 2406, 1490, 1491, 2759, 1764, 2941, 3216, 2644, + 1489, 2944, 1490, 1491, 2506, 1492, 2077, 112, 2076, 110, + 2194, 2951, 2954, 1492, 4019, 2195, 3022, 4018, 111, 111, + 110, 1489, 3998, 1490, 1491, 3766, 3764, 1489, 105, 1490, + 1491, 2965, 3755, 2976, 1946, 1947, 1948, 3763, 2979, 2980, + 3756, 1492, 2757, 1764, 3636, 3568, 3566, 3333, 2975, 2541, + 2755, 1764, 1489, 2257, 1490, 1491, 1492, 1892, 2753, 1764, + 2983, 1492, 2984, 1075, 2987, 2988, 2989, 2751, 1764, 3557, + 3019, 112, 2749, 1764, 1492, 112, 3729, 1897, 2910, 2889, + 2747, 1764, 111, 3120, 3066, 3067, 111, 2702, 110, 2392, + 1492, 3008, 3009, 4232, 4231, 1492, 1798, 2742, 1764, 1489, + 1790, 1490, 1491, 116, 117, 3536, 3018, 1489, 4232, 1490, + 1491, 1492, 4231, 4040, 3602, 1489, 1492, 1490, 1491, 3086, + 2091, 3, 2089, 10, 1489, 9, 1490, 1491, 99, 1489, + 1492, 1490, 1491, 2340, 3640, 2090, 1492, 1489, 8, 1490, + 1491, 3064, 3045, 1492, 1, 3083, 1042, 1457, 2738, 1764, + 1456, 1492, 3606, 3502, 1489, 3048, 1490, 1491, 4163, 701, + 2382, 1730, 1489, 2372, 1490, 1491, 2736, 1764, 4203, 3101, + 3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 4159, + 1765, 2379, 2729, 1764, 4160, 1989, 1492, 2727, 1764, 3118, + 1489, 1979, 1490, 1491, 3668, 2308, 3951, 3020, 1492, 3084, + 3336, 2547, 3634, 3498, 2504, 1489, 1143, 1490, 1491, 2969, + 1489, 156, 1490, 1491, 2462, 2463, 4128, 120, 1101, 119, + 1492, 2404, 3434, 1489, 1146, 1490, 1491, 1254, 3433, 2542, + 3658, 2958, 2471, 1823, 1821, 3425, 1822, 3068, 1820, 1489, + 1492, 1490, 1491, 3423, 1489, 3085, 1490, 1491, 1825, 3122, + 1824, 3160, 3178, 3162, 3054, 4100, 3405, 3055, 2703, 3503, + 1489, 2082, 1490, 1491, 2998, 1489, 738, 1490, 1491, 3173, + 3174, 3175, 3176, 2930, 732, 194, 1812, 3065, 2859, 1489, + 1791, 1490, 1491, 2075, 1185, 1489, 3196, 1490, 1491, 691, + 2858, 3310, 1489, 2580, 1490, 1491, 3185, 697, 1542, 2070, + 1489, 3215, 1490, 1491, 2945, 3187, 1492, 1095, 1087, 2393, + 2440, 2879, 2854, 3111, 1492, 1094, 3928, 3249, 1492, 3561, + 3227, 3229, 2897, 2343, 3232, 2343, 3158, 3225, 2345, 4033, + 2345, 3757, 2853, 2518, 3248, 1489, 87, 1490, 1491, 2440, + 2440, 2440, 2440, 2440, 1492, 4113, 2955, 1489, 1787, 1490, + 1491, 3196, 3168, 3169, 3170, 3171, 3172, 3523, 2675, 2440, + 2189, 1532, 2440, 763, 3253, 2439, 3186, 934, 3188, 1489, + 1773, 1490, 1491, 3724, 2109, 3223, 3195, 761, 760, 1492, + 758, 3270, 2442, 2881, 2911, 1496, 1495, 969, 2869, 1489, + 3213, 1490, 1491, 3208, 3210, 3212, 3207, 1799, 2852, 2922, + 1492, 2920, 2919, 2617, 2031, 1492, 2851, 3222, 1053, 3220, + 2850, 2442, 2442, 2442, 2442, 2442, 1492, 2447, 3235, 3236, + 1492, 3587, 3583, 4155, 3272, 3353, 2441, 3273, 2437, 2888, + 920, 2442, 3252, 919, 2442, 3361, 2849, 3255, 3256, 3254, + 3258, 770, 3257, 3266, 1054, 762, 1055, 106, 1492, 107, + 752, 983, 1492, 3274, 918, 1489, 917, 1490, 1491, 3363, + 3221, 3364, 3280, 1489, 3028, 1490, 1491, 1489, 1492, 1490, + 1491, 2840, 1492, 3378, 3311, 3030, 3313, 2956, 3374, 3312, + 3238, 1473, 1492, 2923, 2926, 2927, 2928, 2924, 1749, 2925, + 2929, 1752, 2839, 1489, 2401, 1490, 1491, 2838, 1114, 3314, + 3315, 3402, 4059, 3365, 3362, 3334, 2506, 3355, 2837, 3366, + 2643, 3431, 2834, 1748, 4066, 3344, 3372, 3652, 3325, 3004, + 2534, 1492, 69, 46, 4028, 4097, 1492, 912, 1489, 909, + 1490, 1491, 3726, 1492, 3727, 3392, 3244, 3390, 3728, 3181, + 2829, 3244, 3182, 4079, 2822, 4080, 908, 3400, 3393, 1489, + 4081, 1490, 1491, 2246, 1489, 1467, 1490, 1491, 3410, 1464, + 2821, 4176, 2084, 98, 2820, 1489, 36, 1490, 1491, 1489, + 35, 1490, 1491, 34, 2819, 33, 32, 3426, 3427, 3428, + 3429, 3430, 26, 3407, 3408, 25, 3409, 24, 23, 3411, + 22, 3413, 29, 3415, 19, 21, 20, 1489, 18, 1490, + 1491, 1489, 3347, 1490, 1491, 4198, 4243, 125, 55, 52, + 1545, 50, 2662, 2818, 1545, 133, 2667, 1489, 2817, 1490, + 1491, 1489, 132, 1490, 1491, 2816, 3335, 53, 49, 1228, + 3548, 1489, 3550, 1490, 1491, 47, 96, 31, 30, 2670, + 17, 2671, 16, 3518, 15, 14, 13, 2679, 12, 11, + 3522, 2681, 2682, 7, 6, 39, 38, 37, 28, 27, + 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, + 1489, 2699, 1490, 1491, 40, 1489, 4, 1490, 1491, 2991, + 3247, 2536, 1489, 3401, 1490, 1491, 0, 0, 0, 0, + 0, 0, 2440, 0, 2705, 2706, 2707, 2708, 1726, 2710, + 2711, 3549, 2713, 3551, 0, 3600, 2715, 3558, 3553, 0, + 2720, 2721, 3565, 2722, 0, 0, 2725, 2726, 2728, 2730, + 2731, 2732, 2733, 2734, 2735, 2737, 2739, 2740, 2741, 2743, + 3356, 2745, 2746, 2748, 2750, 2752, 2754, 2756, 2758, 2760, + 2762, 2764, 2766, 2768, 2770, 2772, 2774, 2776, 2778, 2780, + 2782, 2783, 2784, 750, 2786, 3592, 2788, 3595, 2790, 2791, + 3589, 2793, 2795, 2797, 2442, 3570, 3525, 2800, 3527, 3528, + 3529, 2804, 0, 3365, 3362, 2809, 2810, 2811, 2812, 3366, + 1733, 3601, 3594, 3395, 3396, 0, 0, 1492, 2823, 2824, + 2825, 2826, 2827, 2828, 3555, 1492, 2832, 2833, 0, 3662, + 3663, 0, 0, 0, 2835, 3617, 0, 3619, 1492, 2841, + 0, 0, 1492, 0, 2844, 2845, 2846, 2847, 2848, 0, + 3611, 3612, 1492, 0, 0, 2855, 2856, 3582, 2857, 1492, + 0, 2860, 2862, 2404, 1492, 2864, 0, 0, 1492, 683, + 0, 0, 1492, 0, 0, 2876, 3596, 3597, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1492, 0, 1037, + 0, 3664, 0, 0, 1074, 2894, 1492, 1080, 1080, 0, + 1492, 0, 3645, 0, 1492, 0, 3649, 3650, 3651, 2815, + 0, 0, 0, 0, 0, 1492, 0, 2814, 2923, 2926, + 2927, 2928, 2924, 0, 2925, 2929, 0, 0, 3585, 3586, + 2808, 0, 0, 1109, 2807, 0, 0, 0, 0, 1492, + 3680, 0, 0, 0, 2806, 1492, 0, 0, 0, 3691, + 1492, 2803, 0, 0, 0, 0, 2802, 0, 1492, 0, + 2801, 0, 1492, 0, 2799, 0, 1489, 0, 1490, 1491, + 1492, 0, 0, 0, 1489, 0, 1490, 1491, 3713, 2792, + 1492, 3732, 0, 3733, 3734, 3735, 0, 1489, 2789, 1490, + 1491, 1489, 2787, 1490, 1491, 1492, 2785, 3742, 0, 0, + 3749, 1489, 3751, 1490, 1491, 0, 0, 2744, 1489, 0, + 1490, 1491, 0, 1489, 3722, 1490, 1491, 1489, 0, 1490, + 1491, 1489, 0, 1490, 1491, 3248, 0, 3752, 87, 0, + 3248, 2724, 3685, 0, 0, 0, 1489, 2723, 1490, 1491, + 0, 0, 2719, 0, 0, 1489, 2153, 1490, 1491, 1489, + 2717, 1490, 1491, 1489, 2709, 1490, 1491, 0, 0, 2151, + 0, 3782, 2680, 3753, 1489, 3772, 1490, 1491, 3762, 3761, + 0, 0, 2674, 0, 0, 0, 3774, 3769, 0, 3771, + 0, 0, 0, 0, 0, 3641, 3642, 2669, 1489, 0, + 1490, 1491, 0, 0, 1489, 3934, 1490, 1491, 0, 1489, + 42, 1490, 1491, 0, 0, 0, 3786, 1489, 0, 1490, + 1491, 1489, 0, 1490, 1491, 0, 0, 0, 0, 1489, + 0, 1490, 1491, 0, 0, 0, 0, 0, 0, 1489, + 0, 1490, 1491, 0, 0, 0, 0, 3926, 3925, 0, + 3953, 3941, 0, 0, 1489, 0, 1490, 1491, 3924, 0, + 0, 3946, 3945, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1754, 0, 0, 0, 0, 3096, 3097, + 3098, 3099, 3100, 3992, 2153, 3993, 3776, 1762, 0, 0, + 1755, 3750, 0, 0, 0, 0, 0, 2151, 3115, 3996, + 0, 0, 0, 0, 0, 0, 0, 0, 3783, 3784, + 0, 0, 3936, 3937, 3938, 2398, 2399, 1761, 1759, 1760, + 1756, 0, 1757, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4041, 3248, 3244, 3999, 3778, 0, 0, + 4002, 0, 0, 0, 0, 1758, 4032, 0, 1563, 1564, + 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, + 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, @@ -1788,1090 +2095,751 @@ var yyAct = [...]int{ 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, - 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, - 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, - 1676, 1677, 1440, 1522, 1271, 2550, 1678, 4036, 1680, 1681, - 1682, 1683, 1684, 1441, 1442, 2974, 3331, 3332, 3588, 3589, - 1551, 1551, 1551, 1551, 1551, 1551, 1535, 1121, 4150, 3335, - 1515, 975, 4082, 975, 724, 1691, 1692, 1693, 1694, 1695, - 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1518, - 1519, 1520, 1521, 1526, 2997, 715, 4121, 975, 1515, 1532, - 3657, 4121, 1467, 3700, 3700, 1083, 1718, 165, 3331, 3332, - 716, 1224, 4149, 1547, 177, 1548, 1549, 1234, 1459, 94, - 2624, 3335, 1977, 1976, 1978, 1979, 1980, 1717, 4120, 1221, - 94, 94, 165, 4120, 1552, 1553, 3541, 1216, 2996, 177, - 2977, 1897, 1083, 2993, 1233, 1142, 1239, 1240, 1241, 1242, - 2008, 1865, 89, 1172, 2623, 185, 3044, 3485, 1228, 1135, - 1724, 674, 3385, 1171, 1753, 4160, 2548, 2854, 2856, 1042, - 1279, 1280, 3021, 1042, 4024, 3020, 1467, 1516, 1517, 1042, - 185, 4231, 3579, 3561, 2640, 2924, 2889, 2826, 2143, 1782, - 3031, 719, 1679, 1179, 1227, 1142, 1715, 3172, 166, 171, - 168, 174, 175, 176, 178, 180, 181, 182, 183, 1716, - 1477, 1247, 2884, 2494, 184, 186, 187, 188, 1142, 682, - 2444, 1515, 124, 166, 171, 168, 174, 175, 176, 178, - 180, 181, 182, 183, 2402, 3257, 1512, 1142, 2184, 184, - 186, 187, 188, 2651, 1260, 1495, 3265, 1058, 1141, 1274, - 1896, 2176, 4050, 1165, 2495, 2185, 119, 3620, 3553, 1754, - 1732, 2493, 94, 1232, 1736, 2023, 2568, 1734, 1735, 2077, - 1041, 104, 105, 2004, 1796, 3071, 2510, 1716, 1685, 1686, - 1687, 1688, 1689, 1690, 1477, 1995, 4196, 3749, 1722, 1507, - 1508, 1510, 1509, 1511, 1512, 2496, 1482, 3266, 1141, 1115, - 1211, 3595, 4188, 1145, 1135, 2492, 1481, 1482, 1147, 3594, - 2535, 107, 1148, 1146, 1906, 1483, 1142, 2176, 1905, 2660, - 1895, 1141, 3268, 1473, 2540, 3034, 1465, 1135, 1138, 1139, - 3033, 1099, 2540, 1149, 120, 1132, 1136, 1873, 1874, 1875, - 1141, 2855, 3263, 2651, 1730, 1142, 1135, 1138, 1139, 2545, - 1099, 1889, 2543, 1153, 1132, 1136, 1131, 1151, 1053, 1756, - 3580, 3034, 3279, 3280, 1215, 1733, 3033, 2544, 1719, 3264, - 1960, 4233, 1882, 2547, 2016, 2542, 1038, 4083, 1759, 4016, - 1040, 1911, 1731, 1912, 1985, 1914, 1916, 3921, 1901, 1920, - 1922, 1924, 1926, 1928, 2182, 1942, 3920, 1473, 3051, 2332, - 1282, 1983, 1261, 3270, 1950, 1951, 720, 1787, 1788, 2167, - 1956, 1957, 1900, 4229, 1856, 1217, 4230, 1231, 4228, 1141, - 2111, 1178, 3654, 2024, 3655, 1175, 4084, 1246, 4017, 1864, - 2400, 2401, 1899, 1899, 2112, 1513, 1514, 2110, 1248, 4239, - 1992, 3911, 1993, 1879, 3671, 1994, 3670, 1880, 1141, 1892, - 3602, 1878, 2332, 1145, 1135, 1984, 2329, 1972, 1147, 1737, - 3601, 1754, 1148, 1146, 1480, 2331, 1481, 1482, 725, 2181, - 1903, 3278, 1982, 3073, 1214, 3591, 1946, 2099, 2100, 2097, - 2098, 973, 3053, 3281, 977, 978, 979, 1483, 3308, 3297, - 1114, 2949, 1483, 2099, 2100, 2630, 2631, 1938, 2012, 1483, - 1941, 2948, 1943, 2947, 2096, 2500, 2697, 1986, 2159, 2148, - 2149, 2150, 2151, 2161, 2152, 2153, 2154, 2166, 2162, 2155, - 2156, 2163, 2164, 2165, 2157, 2158, 2160, 1483, 1971, 1970, - 190, 1969, 128, 1483, 1968, 4240, 1118, 1117, 1116, 1483, - 1958, 2978, 1505, 1506, 1507, 1508, 1510, 1509, 1511, 1512, - 1790, 2029, 1952, 129, 1949, 151, 3063, 3062, 3061, 2407, - 2408, 3055, 1948, 3059, 1947, 3054, 1918, 3052, 1729, 172, - 1282, 1282, 3057, 1483, 3360, 1446, 2025, 2026, 1483, 4201, - 1754, 3056, 2875, 4216, 2051, 1754, 87, 4189, 4045, 87, - 2030, 4199, 1754, 3552, 3585, 3402, 725, 2037, 2038, 2039, - 3058, 3060, 4044, 162, 3267, 4020, 2931, 2050, 725, 150, - 1489, 1490, 1491, 1492, 1493, 1494, 1488, 1485, 4019, 1472, - 1469, 1470, 1471, 1476, 1478, 1475, 2516, 1474, 2515, 169, - 4018, 3943, 170, 1754, 1767, 2699, 1480, 1468, 1481, 1482, - 2514, 1480, 2513, 1481, 1482, 1479, 1754, 2942, 1480, 101, - 1481, 1482, 4176, 1754, 1885, 1886, 161, 160, 189, 102, - 3916, 1483, 2138, 2138, 2136, 2136, 1754, 2139, 2875, 1754, - 4129, 1754, 1483, 2512, 3900, 2511, 1480, 42, 1481, 1482, - 42, 3899, 1480, 1768, 1481, 1482, 3748, 2101, 1480, 1717, - 1481, 1482, 1483, 1472, 1469, 1470, 1471, 1476, 1478, 1475, - 3746, 1474, 4038, 2027, 1479, 1754, 2875, 4114, 2875, 4093, - 2031, 1468, 2033, 2034, 2035, 2036, 2687, 3667, 1501, 2040, - 1754, 1497, 1480, 1498, 1481, 1482, 1714, 1480, 1713, 1481, - 1482, 2052, 2222, 1483, 2875, 4089, 2236, 1499, 1513, 1514, - 1496, 1712, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1510, - 1509, 1511, 1512, 4127, 1754, 1483, 85, 3599, 1715, 85, - 155, 1887, 158, 2078, 1884, 1754, 156, 157, 4001, 1754, - 3948, 1716, 3584, 173, 2108, 3370, 1483, 2058, 2059, 2171, - 3638, 4035, 179, 1503, 1504, 1505, 1506, 1507, 1508, 1510, - 1509, 1511, 1512, 2114, 1483, 2116, 2117, 2118, 2119, 2120, - 2121, 2123, 2125, 2126, 2127, 2128, 2129, 2130, 1483, 2113, - 1480, 3367, 1481, 1482, 3300, 2649, 2319, 2320, 2321, 2322, - 2323, 1480, 2656, 1481, 1482, 2648, 2342, 110, 2142, 2115, - 2341, 3924, 1754, 2344, 2246, 2340, 2347, 2348, 109, 101, - 108, 1480, 3299, 1481, 1482, 103, 3271, 4125, 1754, 102, - 3275, 3025, 1526, 2186, 2187, 2188, 2189, 3274, 2875, 3912, - 3947, 2328, 2330, 3638, 1754, 2875, 3636, 2200, 3994, 1754, - 2177, 2365, 2221, 2540, 1754, 3559, 1754, 2781, 1754, 3904, - 2238, 1483, 1480, 2958, 1481, 1482, 3992, 1754, 3290, 3289, - 3903, 3276, 2945, 2920, 1483, 1711, 3272, 3287, 3288, 103, - 2655, 3273, 3285, 3286, 1480, 2647, 1481, 1482, 3285, 3284, - 1754, 164, 1483, 1754, 2899, 1754, 2623, 3006, 2423, 2339, - 1705, 1711, 2345, 2346, 1483, 1480, 1709, 1481, 1482, 2342, - 2613, 1707, 1483, 2412, 1708, 1706, 2605, 1710, 2340, 1860, - 2987, 104, 105, 1480, 2604, 1481, 1482, 2980, 2981, 3646, - 1501, 2562, 3043, 1771, 2561, 1483, 2453, 1480, 2397, 1481, - 1482, 2921, 104, 105, 1754, 2375, 1483, 2376, 1501, 2387, - 2054, 2923, 2020, 2107, 1502, 1503, 1504, 1505, 1506, 1507, - 1508, 1510, 1509, 1511, 1512, 1981, 3989, 1754, 2875, 2874, - 2701, 1104, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1510, - 1509, 1511, 1512, 1973, 3971, 1754, 2984, 159, 1963, 2425, - 2963, 2462, 2463, 2464, 2465, 2457, 3574, 2458, 2459, 2460, - 2461, 2447, 1054, 2448, 1770, 1104, 2891, 2872, 1959, 2363, - 1480, 2467, 1481, 1482, 2469, 2470, 2471, 2472, 2429, 2388, - 2381, 103, 2382, 1480, 1955, 1481, 1482, 3526, 1754, 2452, - 2390, 1954, 2483, 2141, 1754, 95, 1953, 1769, 3521, 2451, - 109, 1480, 1272, 1481, 1482, 3556, 1501, 2529, 2639, 2410, - 1483, 2489, 2891, 1480, 1483, 1481, 1482, 1479, 2434, 2435, - 2433, 1480, 1088, 1481, 1482, 1089, 2450, 2920, 2449, 2541, - 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1510, 1509, 1511, - 1512, 1860, 1859, 2899, 1480, 2870, 1481, 1482, 4077, 2526, - 1802, 1801, 2499, 2898, 4049, 1480, 152, 1481, 1482, 153, - 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1510, 1509, 1511, - 1512, 3222, 2484, 3555, 1479, 2480, 2473, 2475, 2476, 2875, - 2899, 2498, 3552, 2534, 1483, 2503, 2537, 2502, 2538, 3552, - 165, 3252, 3505, 2540, 3287, 2921, 3195, 177, 3603, 2436, - 2781, 2623, 2554, 4190, 2684, 2623, 3519, 1754, 2484, 2533, - 2536, 2532, 1143, 2683, 2899, 1501, 2540, 1483, 2523, 2405, - 1758, 1144, 1483, 2366, 2141, 2079, 2063, 2555, 1483, 2558, - 2006, 1899, 1483, 2559, 2560, 1789, 1483, 1126, 185, 1502, - 1503, 1504, 1505, 1506, 1507, 1508, 1510, 1509, 1511, 1512, - 1483, 1755, 1757, 1125, 1483, 3604, 3605, 3606, 1483, 1480, - 4155, 1481, 1482, 1480, 2628, 1481, 1482, 4096, 3935, 1043, - 1761, 3901, 3311, 1042, 1042, 1042, 3516, 1754, 2565, 3761, - 3619, 166, 171, 168, 174, 175, 176, 178, 180, 181, - 182, 183, 110, 1536, 3616, 1536, 3597, 184, 186, 187, - 188, 3418, 1483, 109, 3417, 108, 1862, 2482, 3572, 3514, - 1754, 2643, 3358, 103, 3477, 1754, 3313, 3309, 2988, 1483, - 3475, 1754, 2598, 1483, 3471, 1754, 2479, 2955, 3468, 1754, - 2342, 1501, 1483, 1480, 2341, 1481, 1482, 1483, 2474, 2646, - 2468, 1483, 3466, 1754, 2466, 1483, 3464, 1754, 1988, 1483, - 3462, 1754, 95, 1894, 1483, 1502, 1503, 1504, 1505, 1506, - 1507, 1508, 1510, 1509, 1511, 1512, 1480, 1890, 1481, 1482, - 1483, 1480, 1858, 1481, 1482, 2615, 2666, 1480, 1754, 1481, - 1482, 1480, 121, 1481, 1482, 1480, 1216, 1481, 1482, 2954, - 2621, 3566, 3567, 2681, 3460, 1754, 3362, 3936, 1483, 1480, - 2497, 1481, 1482, 1480, 2629, 1481, 1482, 1480, 1934, 1481, - 1482, 3458, 1754, 2379, 4211, 3456, 1754, 2635, 2056, 4209, - 2632, 2633, 2634, 1483, 3454, 1754, 4053, 1483, 2108, 3452, - 1754, 1483, 4183, 3450, 1754, 679, 4057, 3448, 1754, 3976, - 1483, 3446, 1754, 2955, 1483, 3569, 2636, 4033, 2638, 3305, - 3304, 1480, 1483, 1481, 1482, 3303, 3222, 2641, 2967, 2642, - 1483, 2599, 3444, 1754, 1483, 1935, 1936, 1937, 1480, 1766, - 1481, 1482, 1480, 3244, 1481, 1482, 3571, 1483, 3245, 2659, - 3241, 1480, 2637, 1481, 1482, 2057, 1480, 3240, 1481, 1482, - 1480, 3908, 1481, 1482, 1480, 1056, 1481, 1482, 1480, 3242, - 1481, 1482, 3937, 1480, 3243, 1481, 1482, 1483, 2644, 742, - 2396, 2825, 2385, 1483, 3560, 3442, 1754, 3200, 3199, 1480, - 3621, 1481, 1482, 3440, 1754, 2607, 2608, 4015, 1483, 3739, - 2610, 3548, 3438, 1754, 3545, 2695, 3517, 2167, 1483, 2611, - 3741, 2813, 3544, 2857, 3424, 1754, 1057, 1480, 3209, 1481, - 1482, 2005, 3400, 1754, 1026, 3283, 2846, 1754, 3246, 2938, - 2908, 2909, 1042, 2138, 3726, 2136, 3725, 2860, 1483, 2844, - 1754, 2959, 1480, 2184, 1481, 1482, 1480, 2591, 1481, 1482, - 1480, 1483, 1481, 1482, 2590, 2896, 2897, 1182, 2858, 1480, - 2185, 1481, 1482, 1480, 2423, 1481, 1482, 1042, 2916, 2819, - 1754, 1480, 2589, 1481, 1482, 2796, 1754, 2588, 2861, 1480, - 2863, 1481, 1482, 1480, 2587, 1481, 1482, 1059, 1483, 3724, - 2788, 1754, 1483, 2895, 2586, 1060, 1480, 2107, 1481, 1482, - 2779, 1754, 1483, 2876, 2585, 1181, 2159, 2148, 2149, 2150, - 2151, 2161, 2152, 2153, 2154, 2166, 2162, 2155, 2156, 2163, - 2164, 2165, 2157, 2158, 2160, 3378, 1480, 2954, 1481, 1482, - 2777, 1754, 1480, 3037, 1481, 1482, 1483, 1722, 2848, 1445, - 2885, 2914, 1068, 2764, 1754, 2994, 42, 1480, 129, 1481, - 1482, 101, 3550, 1483, 103, 2913, 1067, 1480, 2915, 1481, - 1482, 102, 2868, 4225, 2941, 2943, 2971, 1483, 1716, 3212, - 3214, 1483, 2104, 2102, 2103, 2888, 2934, 1483, 3215, 2873, - 2762, 1754, 2992, 1483, 2760, 1754, 101, 1480, 2918, 1481, - 1482, 2602, 103, 4132, 2758, 1754, 102, 4034, 3931, 2922, - 1480, 3528, 1481, 1482, 2925, 1483, 110, 2407, 2408, 2489, - 2932, 3282, 2912, 2391, 1483, 2935, 2627, 109, 2957, 108, - 3003, 2179, 3198, 2960, 2961, 2062, 2180, 103, 2756, 1754, - 3197, 2061, 2946, 108, 4000, 3999, 3607, 1480, 1483, 1481, - 1482, 1480, 3979, 1481, 1482, 2754, 1754, 1483, 3747, 2956, - 3745, 1480, 3744, 1481, 1482, 1483, 3737, 3736, 3617, 2752, - 1754, 3549, 2964, 3483, 2242, 2968, 2969, 2970, 2965, 2750, - 1754, 110, 1483, 3547, 3000, 2748, 1754, 1483, 3314, 1882, - 2524, 1483, 109, 1930, 108, 1480, 1877, 1481, 1482, 3608, - 3609, 3610, 110, 2989, 2990, 1066, 109, 2746, 1754, 3538, - 4212, 2891, 1480, 109, 1481, 1482, 2744, 1754, 3710, 2999, - 3047, 3048, 4213, 4212, 4213, 3067, 1480, 2872, 1481, 1482, - 1480, 1483, 1481, 1482, 3101, 1483, 1480, 2685, 1481, 1482, - 2742, 1754, 1480, 1483, 1481, 1482, 1931, 1932, 1933, 2740, - 1754, 2377, 1483, 3026, 2325, 1783, 3064, 2738, 1754, 1483, - 3045, 1775, 114, 115, 1480, 4021, 1481, 1482, 3029, 1483, - 3583, 3, 97, 1480, 3479, 1481, 1482, 1, 2076, 2736, - 1754, 10, 1034, 3415, 2357, 3082, 3083, 3084, 3085, 3086, - 3087, 3088, 3089, 3090, 3091, 2074, 1448, 1480, 9, 1481, - 1482, 1755, 2364, 3001, 2075, 3099, 1480, 8, 1481, 1482, - 1447, 3587, 3065, 4144, 1480, 695, 1481, 1482, 2367, 1720, - 4184, 4140, 4141, 2734, 1754, 1974, 1964, 2732, 1754, 3649, - 2293, 1480, 1483, 1481, 1482, 3414, 1480, 3932, 1481, 1482, - 1480, 2389, 1481, 1482, 2730, 1754, 1483, 3317, 2530, 3615, - 1483, 2725, 1754, 2487, 1483, 1134, 154, 3141, 3049, 3143, - 2445, 3406, 3103, 2446, 1483, 3159, 3066, 3035, 4109, 118, - 3036, 1092, 117, 1137, 1483, 3154, 3155, 3156, 3157, 1245, - 1480, 2979, 1481, 1482, 1480, 2525, 1481, 1482, 1483, 3639, - 3046, 2939, 1480, 2454, 1481, 1482, 1808, 1806, 1807, 1805, - 1810, 1480, 3177, 1481, 1482, 1809, 4081, 3386, 1480, 2686, - 1481, 1482, 3166, 3168, 3484, 2067, 732, 2911, 1480, 726, - 1481, 1482, 192, 2423, 2721, 1754, 3092, 2328, 2330, 2328, - 2330, 1483, 1797, 1776, 2060, 1176, 685, 3291, 2719, 1754, - 2563, 691, 3404, 3139, 1533, 3229, 2842, 87, 2501, 2055, - 2423, 2423, 2423, 2423, 2423, 3196, 2841, 3149, 3150, 3151, - 3152, 3153, 2926, 1086, 1078, 3177, 2712, 1754, 2378, 2862, - 2423, 1085, 3909, 2423, 3230, 3542, 3167, 3208, 3169, 3210, - 2837, 1480, 1483, 1481, 1482, 2878, 3176, 1483, 3234, 3213, - 3206, 2016, 3251, 4014, 3738, 1480, 4094, 1481, 1482, 1480, - 3204, 1481, 1482, 1480, 2936, 1481, 1482, 1483, 3194, 3188, - 1772, 1483, 3504, 1480, 2425, 1481, 1482, 1483, 2658, 2174, - 3203, 1523, 3201, 1480, 2950, 1481, 1482, 757, 2422, 3216, - 3217, 3705, 2094, 755, 754, 752, 3334, 1480, 1045, 1481, - 1482, 2425, 2425, 2425, 2425, 2425, 3342, 3253, 3233, 1483, - 3254, 1046, 3202, 3236, 3237, 3235, 3239, 1483, 3238, 104, - 105, 2425, 3247, 1047, 2425, 1483, 2864, 3255, 3189, 3191, - 3193, 2892, 1487, 3261, 2710, 1754, 1486, 963, 2852, 2836, - 1480, 1784, 1481, 1482, 1483, 2903, 3292, 2901, 3294, 2900, - 2600, 2430, 3295, 3296, 3568, 3293, 1483, 3564, 4136, 2835, - 2424, 2420, 2871, 2834, 914, 3346, 913, 764, 756, 2833, - 746, 976, 912, 3343, 911, 3344, 3345, 3219, 3009, 2489, - 3336, 3315, 3359, 3011, 2937, 3347, 3355, 1464, 3353, 1739, - 1742, 1480, 2386, 1481, 1482, 1105, 1480, 3383, 1481, 1482, - 3225, 2832, 4040, 2626, 3412, 3225, 1483, 1738, 4047, 2823, - 3325, 3371, 3374, 3373, 3633, 3306, 1480, 2822, 1481, 1482, - 1480, 2985, 1481, 1482, 3381, 2517, 1480, 69, 1481, 1482, - 46, 4009, 3391, 4078, 906, 903, 2821, 3388, 3389, 3707, - 3390, 3708, 3709, 3392, 3162, 3394, 3163, 3396, 2820, 4060, - 4061, 3407, 3408, 3409, 3410, 3411, 902, 4062, 1480, 2231, - 1481, 1482, 1458, 1455, 4157, 2069, 1480, 96, 1481, 1482, - 36, 35, 34, 33, 1480, 32, 1481, 1482, 26, 25, - 24, 1536, 23, 22, 29, 1536, 19, 2645, 21, 20, - 3316, 2650, 18, 1480, 3328, 1481, 1482, 4179, 2817, 4224, - 123, 3529, 55, 3531, 52, 1480, 50, 1481, 1482, 131, - 130, 53, 49, 1219, 2653, 47, 2654, 3499, 31, 30, - 17, 16, 2662, 15, 3503, 14, 2664, 2665, 13, 12, - 11, 7, 6, 39, 38, 2671, 2672, 2673, 2674, 2675, - 2676, 2677, 2678, 2679, 2680, 37, 2682, 28, 27, 40, - 4, 3228, 2972, 2519, 3382, 1480, 0, 1481, 1482, 0, - 0, 0, 1717, 2423, 0, 0, 3534, 1483, 0, 2688, - 2689, 2690, 2691, 744, 2693, 2694, 3581, 2696, 3530, 3539, - 3532, 2698, 3546, 0, 0, 2703, 2704, 0, 2705, 3551, - 0, 2708, 2709, 2711, 2713, 2714, 2715, 2716, 2717, 2718, - 2720, 2722, 2723, 2724, 2726, 3337, 2728, 2729, 2731, 2733, - 2735, 2737, 2739, 2741, 2743, 2745, 2747, 2749, 2751, 2753, - 2755, 2757, 2759, 2761, 2763, 2765, 2766, 2767, 3573, 2769, - 3575, 2771, 3570, 2773, 2774, 3346, 2776, 2778, 2780, 0, - 3576, 0, 2783, 3343, 3536, 3506, 2787, 3508, 3509, 3510, - 2792, 2793, 2794, 2795, 2425, 3347, 3582, 1483, 0, 2812, - 3598, 0, 3600, 2806, 2807, 2808, 2809, 2810, 2811, 1483, - 0, 2815, 2816, 3592, 3593, 3376, 3377, 3563, 1483, 2818, - 0, 0, 1065, 1483, 2824, 1071, 1071, 0, 1483, 2827, - 2828, 2829, 2830, 2831, 0, 0, 3577, 3578, 0, 0, - 2838, 2839, 0, 2840, 0, 1483, 2843, 2845, 2389, 1483, - 2847, 0, 0, 3643, 3644, 0, 1480, 0, 1481, 1482, - 2859, 1483, 0, 0, 0, 3626, 0, 1483, 0, 3630, - 3631, 3632, 1483, 0, 3645, 0, 1483, 0, 0, 0, - 0, 1483, 0, 0, 2904, 2907, 2908, 2909, 2905, 2805, - 2906, 2910, 0, 0, 3566, 3567, 0, 0, 0, 0, - 1483, 2804, 0, 0, 0, 3661, 0, 1483, 0, 0, - 2803, 1483, 0, 0, 0, 2802, 0, 0, 0, 0, - 2801, 0, 0, 1483, 0, 0, 0, 0, 1483, 0, - 0, 0, 0, 3672, 0, 0, 0, 2800, 0, 1483, - 0, 2799, 0, 1483, 0, 0, 1480, 0, 1481, 1482, - 0, 0, 3694, 2798, 0, 0, 0, 0, 1480, 2797, - 1481, 1482, 1483, 0, 2791, 0, 0, 1480, 2790, 1481, - 1482, 0, 1480, 2789, 1481, 1482, 1483, 1480, 3723, 1481, - 1482, 3730, 0, 3732, 0, 3713, 0, 3714, 3715, 3716, - 1483, 0, 2786, 3703, 1480, 1483, 1481, 1482, 1480, 2785, - 1481, 1482, 0, 2784, 0, 0, 3229, 0, 3733, 87, - 1480, 3229, 1481, 1482, 0, 2782, 1480, 0, 1481, 1482, - 2775, 1480, 0, 1481, 1482, 1480, 1483, 1481, 1482, 0, - 1480, 2772, 1481, 1482, 0, 2770, 0, 1483, 0, 3666, - 2138, 1483, 2136, 0, 3763, 3734, 3743, 3755, 3742, 1480, - 3753, 1481, 1482, 0, 2768, 3750, 1480, 3752, 1481, 1482, - 1480, 0, 1481, 1482, 1483, 0, 0, 0, 2727, 0, - 3622, 3623, 1480, 0, 1481, 1482, 3915, 1480, 0, 1481, - 1482, 0, 2707, 3767, 0, 0, 0, 2706, 1480, 0, - 1481, 1482, 1480, 0, 1481, 1482, 0, 0, 0, 0, - 42, 2904, 2907, 2908, 2909, 2905, 0, 2906, 2910, 0, - 0, 1480, 0, 1481, 1482, 0, 3907, 3906, 2702, 0, - 0, 0, 0, 0, 3934, 1480, 3922, 1481, 1482, 2700, - 0, 3905, 0, 2692, 3926, 3927, 0, 0, 0, 1480, - 0, 1481, 1482, 0, 1480, 0, 1481, 1482, 0, 3973, - 3974, 3077, 3078, 3079, 3080, 3081, 2663, 3757, 3764, 3765, - 0, 0, 3731, 0, 0, 3917, 3918, 3919, 2138, 0, - 2136, 3096, 3977, 0, 0, 1480, 0, 1481, 1482, 0, - 0, 0, 0, 0, 0, 0, 1480, 0, 1481, 1482, - 1480, 0, 1481, 1482, 0, 0, 0, 0, 0, 3225, - 0, 0, 3980, 0, 4022, 3229, 3983, 0, 3759, 0, - 4013, 0, 0, 1480, 0, 1481, 1482, 0, 0, 1554, - 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, - 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1574, 1575, - 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, - 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, - 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, - 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, - 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, - 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, - 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, - 1646, 1647, 1648, 1649, 1650, 1651, 1653, 1654, 1655, 1656, - 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, - 1667, 1668, 1674, 1675, 1676, 1677, 1691, 1692, 1693, 1694, - 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, - 3978, 4023, 3228, 4007, 3997, 4006, 1483, 3228, 1744, 0, - 0, 4003, 0, 4005, 4041, 0, 0, 0, 0, 0, - 0, 0, 1752, 0, 0, 1745, 3910, 0, 0, 0, - 0, 3231, 87, 0, 0, 0, 4026, 0, 1717, 1483, - 0, 0, 0, 4025, 0, 0, 1744, 0, 0, 3249, - 2383, 2384, 1751, 1749, 1750, 1746, 0, 1747, 0, 4030, - 1752, 4043, 0, 1745, 0, 0, 0, 4046, 0, 0, - 4048, 0, 3914, 0, 0, 0, 0, 0, 0, 0, - 1748, 0, 0, 0, 0, 0, 0, 0, 1740, 1741, - 1751, 1749, 1750, 1746, 4055, 1747, 0, 0, 2657, 0, - 0, 0, 4065, 0, 0, 0, 0, 0, 0, 1484, - 0, 0, 0, 0, 0, 0, 0, 0, 1748, 0, - 0, 0, 0, 42, 0, 0, 4066, 0, 0, 4067, - 4091, 2652, 0, 0, 0, 87, 0, 0, 0, 0, - 1542, 0, 0, 0, 0, 0, 0, 0, 4076, 0, - 0, 0, 0, 0, 0, 1480, 0, 1481, 1482, 0, - 0, 4085, 0, 0, 1717, 0, 0, 0, 4027, 4097, - 0, 0, 0, 4095, 0, 3934, 4111, 3380, 4100, 4108, - 4105, 4102, 4101, 4099, 4104, 4103, 0, 0, 1480, 0, - 1481, 1482, 0, 0, 0, 0, 0, 0, 0, 3397, - 3398, 3228, 3399, 3401, 3403, 4130, 0, 0, 4153, 0, - 0, 0, 0, 4143, 0, 4135, 0, 4122, 4148, 0, - 0, 0, 0, 0, 4161, 0, 42, 0, 4163, 0, - 3416, 0, 0, 4174, 0, 3419, 0, 3421, 3422, 3423, - 3425, 3426, 3427, 3428, 3429, 3430, 3431, 3432, 3433, 3434, - 3435, 3436, 3437, 3439, 3441, 3443, 3445, 3447, 3449, 3451, - 3453, 3455, 3457, 3459, 3461, 3463, 3465, 3467, 3469, 3470, - 3472, 3473, 3474, 3476, 4122, 4194, 3478, 2016, 3480, 3481, - 3482, 4193, 4204, 3486, 3487, 3488, 3489, 3490, 3491, 3492, - 3493, 3494, 3495, 3496, 4210, 2138, 4208, 2136, 4197, 4207, - 4206, 4203, 3502, 4178, 4173, 4218, 3507, 4092, 4032, 4087, - 3511, 3512, 0, 3513, 3515, 4226, 3518, 3520, 3225, 3522, - 3523, 3524, 3525, 4234, 4232, 0, 0, 0, 0, 3533, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4051, 4243, 4244, 3974, 4242, 0, 0, 0, - 0, 4122, 0, 2138, 0, 2136, 0, 4241, 0, 0, - 4039, 0, 0, 0, 3557, 3558, 0, 0, 3562, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4169, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4086, - 1774, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 86, 44, 45, 88, 0, 0, 1863, 0, - 0, 0, 0, 3637, 0, 0, 0, 0, 0, 0, - 0, 92, 0, 0, 0, 48, 76, 77, 0, 74, - 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 75, 0, 0, 0, 0, 0, 1723, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3656, 0, - 0, 3660, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 95, 0, 1024, 0, 0, - 2332, 0, 0, 1025, 0, 3673, 0, 0, 0, 0, - 0, 0, 4191, 2137, 0, 0, 677, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1029, 0, 0, 0, - 0, 0, 0, 0, 0, 83, 2021, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3696, - 0, 0, 0, 0, 0, 0, 0, 0, 1100, 0, - 0, 0, 3704, 0, 0, 0, 0, 0, 0, 3711, - 0, 0, 982, 983, 984, 985, 986, 987, 988, 989, - 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, - 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, - 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, - 1020, 1021, 1022, 1023, 0, 0, 0, 0, 0, 0, - 51, 54, 57, 56, 59, 0, 73, 0, 0, 82, - 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 61, 91, 90, 0, 0, 71, 72, - 58, 0, 0, 0, 0, 0, 80, 81, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3923, 0, - 0, 0, 0, 0, 0, 0, 0, 3930, 0, 0, - 63, 64, 0, 65, 66, 67, 68, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3940, 3941, 3942, - 0, 3944, 0, 3945, 3946, 0, 0, 0, 0, 3949, - 3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957, 3958, 3959, - 3960, 3961, 3962, 3963, 3964, 3965, 3966, 3967, 3968, 3969, - 3970, 0, 3972, 3975, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2089, 2090, 2091, 2092, 60, 3984, 3985, - 3986, 3987, 3988, 3990, 3991, 3993, 3995, 3996, 3998, 2105, - 0, 0, 4002, 0, 0, 0, 4004, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2144, 2145, 0, 0, 0, 0, - 2168, 4031, 0, 2172, 2173, 0, 0, 0, 2178, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2190, 2191, 2192, 2193, 2194, 2195, 2196, - 2197, 2198, 2199, 0, 2201, 0, 0, 89, 2223, 2224, - 2225, 2226, 2227, 2228, 2229, 2230, 2232, 0, 2237, 0, - 2239, 2240, 2241, 0, 2243, 2244, 2245, 0, 2247, 2248, - 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, - 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, - 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, - 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, - 2289, 2290, 2291, 2292, 2296, 2297, 2298, 2299, 2300, 2301, - 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, - 2312, 2313, 2314, 2315, 2316, 2317, 2318, 0, 0, 0, - 0, 0, 2324, 0, 2326, 0, 2333, 2334, 2335, 2336, - 2337, 2338, 0, 0, 0, 0, 0, 94, 0, 0, - 0, 0, 0, 0, 0, 2349, 2350, 2351, 2352, 2353, - 2354, 2355, 2356, 0, 2358, 2359, 2360, 2361, 2362, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 190, 0, 0, 1071, 4177, 0, 0, 0, 4056, 0, - 0, 0, 0, 1826, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 129, 0, 151, 0, 0, 0, 0, - 0, 0, 4071, 0, 2403, 2404, 0, 0, 4074, 172, - 4075, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, - 2442, 0, 0, 4090, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 162, 0, 190, 0, 0, 1826, 150, - 0, 0, 1220, 0, 1226, 0, 1881, 0, 0, 4116, - 4117, 0, 0, 0, 959, 0, 0, 0, 129, 169, - 151, 0, 170, 4124, 4126, 4128, 0, 0, 0, 0, - 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, - 0, 4134, 2485, 0, 138, 139, 161, 160, 189, 0, - 0, 0, 0, 4156, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1454, 0, 162, 0, - 195, 0, 0, 195, 150, 0, 0, 730, 0, 0, - 0, 0, 736, 0, 0, 0, 0, 0, 0, 0, - 1813, 4175, 0, 195, 169, 0, 0, 170, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1885, - 1886, 161, 160, 189, 0, 4198, 4200, 4202, 0, 0, - 0, 0, 0, 0, 736, 195, 736, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 155, 136, 158, 143, 135, 1813, 156, 157, 4223, 0, - 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, - 0, 0, 179, 144, 1827, 0, 4235, 4236, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 147, 145, 140, - 141, 142, 146, 0, 0, 0, 0, 0, 0, 137, - 0, 0, 0, 0, 0, 0, 0, 0, 148, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 155, 1887, 158, 0, 1884, - 0, 156, 157, 0, 0, 0, 0, 0, 173, 1827, - 1840, 1843, 1844, 1845, 1846, 1847, 1848, 179, 1849, 1850, - 1852, 1853, 1851, 1854, 1855, 1828, 1829, 1830, 1831, 1811, - 1812, 1841, 0, 1814, 0, 1815, 1816, 1817, 1818, 1819, - 1820, 1821, 1822, 1823, 0, 0, 1824, 1832, 1833, 1834, - 1835, 0, 1836, 1837, 1838, 1839, 0, 0, 1825, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 164, 0, 0, 0, 1840, 1843, 1844, 1845, 1846, - 1847, 1848, 0, 1849, 1850, 1852, 1853, 1851, 1854, 1855, - 1828, 1829, 1830, 1831, 1811, 1812, 1841, 0, 1814, 0, - 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 0, - 0, 1824, 1832, 1833, 1834, 1835, 0, 1836, 1837, 1838, - 1839, 0, 0, 1825, 0, 0, 0, 0, 0, 0, - 2661, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2667, 2668, 2669, 2670, 0, 0, 164, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 159, 0, 0, - 0, 0, 1786, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1542, 0, 0, 0, 0, - 0, 1803, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1842, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1944, 0, 152, 0, 0, 153, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1989, - 165, 0, 0, 0, 0, 0, 0, 177, 0, 0, - 0, 0, 0, 0, 0, 0, 2017, 0, 1842, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2028, 0, 0, 0, 0, 0, 0, 2032, - 0, 152, 0, 0, 153, 0, 0, 0, 185, 1774, - 2043, 2044, 2045, 2046, 2047, 2048, 2049, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, - 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, - 0, 166, 171, 168, 174, 175, 176, 178, 180, 181, - 182, 183, 0, 0, 0, 0, 0, 184, 186, 187, - 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, - 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 166, 171, 168, 174, - 175, 176, 178, 180, 181, 182, 183, 0, 0, 0, - 0, 0, 184, 186, 187, 188, 0, 0, 736, 0, - 736, 736, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 736, 195, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1528, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2082, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3042, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3068, - 3069, 3070, 0, 0, 3072, 0, 0, 3074, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3093, 3094, 3095, - 0, 0, 0, 0, 0, 0, 3100, 0, 0, 0, - 0, 3102, 0, 0, 3104, 3105, 3106, 0, 0, 0, - 3107, 3108, 0, 0, 3109, 0, 3110, 0, 0, 0, - 0, 0, 0, 3111, 0, 3112, 0, 0, 0, 3113, - 0, 3114, 0, 0, 3115, 0, 3116, 0, 3117, 0, - 3118, 0, 3119, 0, 3120, 0, 3121, 0, 3122, 0, - 3123, 0, 3124, 0, 3125, 0, 3126, 0, 3127, 0, - 3128, 0, 3129, 0, 3130, 0, 3131, 0, 3132, 0, - 0, 0, 3133, 0, 3134, 0, 3135, 0, 0, 3136, - 0, 3137, 0, 3138, 0, 2296, 3140, 0, 0, 3142, - 0, 0, 3144, 3145, 3146, 3147, 0, 0, 0, 0, - 3148, 2296, 2296, 2296, 2296, 2296, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3158, 0, 0, 0, - 0, 0, 0, 0, 3171, 0, 0, 3175, 0, 0, - 0, 0, 0, 0, 0, 0, 3178, 3179, 3180, 3181, - 3182, 3183, 0, 0, 0, 3184, 3185, 0, 3186, 0, - 3187, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 195, 0, 0, 0, 736, 736, 0, 0, - 0, 0, 0, 0, 1071, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3220, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 736, 0, 0, 195, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3250, 736, 0, 2409, 0, 0, 0, 0, 195, 0, - 0, 2413, 736, 2416, 0, 0, 2082, 0, 0, 0, - 0, 0, 736, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 736, 0, 736, 0, 0, - 0, 0, 0, 0, 0, 736, 0, 0, 1528, 736, - 3312, 0, 736, 736, 736, 736, 0, 736, 0, 736, - 736, 0, 736, 736, 736, 736, 736, 736, 0, 0, - 0, 0, 0, 0, 0, 1528, 736, 736, 1528, 736, - 1528, 195, 736, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 736, 0, 195, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 736, 0, 0, - 736, 0, 195, 195, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3405, 0, 195, - 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, - 0, 0, 0, 0, 0, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 736, 3420, 0, 0, 0, 1024, - 0, 0, 0, 0, 0, 1025, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2137, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2082, 0, 0, 0, - 0, 0, 0, 2575, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2596, 2597, 0, 0, 2601, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2606, 0, 0, 0, 0, 0, 0, 2609, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2612, 982, 983, 984, 985, 986, 987, - 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, - 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, - 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, - 1018, 1019, 1020, 1021, 1022, 1023, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 736, 736, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 736, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3618, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3642, 0, 0, 0, - 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1528, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1528, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3662, 0, 3663, 0, 3664, 0, - 3665, 0, 0, 0, 0, 0, 0, 0, 3668, 3669, - 0, 0, 0, 0, 0, 0, 0, 0, 3674, 0, - 0, 958, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3675, 0, 3676, 0, 3677, 0, 3678, 0, - 3679, 0, 3680, 0, 3681, 0, 3682, 0, 3683, 0, - 3684, 0, 3685, 0, 3686, 0, 3687, 0, 3688, 0, - 3689, 0, 3690, 0, 0, 3691, 0, 0, 0, 3692, - 0, 3693, 0, 0, 0, 0, 0, 3695, 0, 0, - 0, 0, 0, 713, 0, 0, 0, 0, 0, 735, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3712, - 0, 0, 0, 0, 2343, 0, 0, 0, 3717, 0, - 3718, 3719, 0, 3720, 0, 3721, 0, 0, 0, 0, - 3722, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 735, 0, 0, 0, 3751, 195, 0, - 0, 0, 0, 736, 0, 0, 0, 0, 0, 0, - 3760, 0, 0, 3762, 0, 0, 2917, 0, 0, 0, - 0, 0, 0, 0, 0, 3766, 0, 0, 0, 0, - 0, 0, 0, 195, 0, 0, 736, 0, 0, 0, - 0, 3902, 0, 0, 0, 0, 0, 0, 0, 0, - 195, 0, 0, 0, 736, 0, 0, 2343, 195, 0, - 195, 0, 195, 195, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 736, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2966, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 736, 0, 0, 0, 0, - 0, 0, 736, 736, 736, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3014, 3015, 3016, - 3017, 3018, 3019, 736, 0, 0, 0, 0, 0, 736, - 736, 0, 0, 736, 0, 736, 0, 0, 0, 0, - 4012, 736, 0, 0, 0, 0, 2082, 3030, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3038, 0, 0, 0, 0, 736, 0, 0, 0, - 0, 736, 0, 0, 0, 736, 736, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, - 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 195, 195, 0, 0, 195, 0, 195, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, - 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 195, 0, 0, 0, 0, 0, 0, 195, 0, 0, - 0, 0, 736, 95, 0, 0, 1024, 0, 0, 0, - 0, 964, 1025, 977, 978, 979, 965, 0, 0, 966, - 967, 0, 968, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 973, 0, - 980, 981, 0, 0, 0, 0, 0, 4054, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1528, 0, 2343, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3348, - 3349, 0, 0, 4068, 0, 0, 4069, 0, 4070, 0, - 0, 982, 983, 984, 985, 986, 987, 988, 989, 990, - 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, - 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, - 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, - 1021, 1022, 1023, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3350, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4154, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3302, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4170, - 0, 4171, 0, 4172, 0, 0, 0, 0, 0, 0, - 0, 3340, 0, 0, 0, 735, 1439, 735, 735, 0, - 0, 0, 0, 0, 0, 3354, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3351, 3352, 0, 0, 735, - 0, 0, 0, 0, 0, 0, 3372, 0, 0, 3375, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1527, 0, - 0, 195, 0, 4221, 0, 4222, 0, 0, 0, 195, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 736, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 929, 0, 0, 0, 0, 0, 933, 0, 195, 0, - 930, 931, 0, 195, 0, 932, 934, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 915, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 736, 0, 0, 0, 0, 0, 195, 0, - 0, 0, 0, 0, 3535, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 734, 736, - 0, 0, 0, 0, 0, 0, 736, 0, 0, 0, - 736, 736, 0, 0, 0, 736, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1528, 736, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 195, 195, 195, 195, 195, 195, - 1096, 0, 1103, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3596, - 0, 0, 0, 195, 195, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3611, - 0, 3612, 3613, 3614, 0, 0, 0, 0, 195, 0, - 0, 0, 0, 735, 735, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 736, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 735, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 735, - 0, 0, 0, 0, 736, 0, 0, 0, 0, 735, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 735, 0, 735, 0, 0, 0, 0, 0, - 0, 0, 735, 0, 0, 1527, 735, 0, 0, 735, - 735, 735, 735, 0, 735, 0, 735, 735, 0, 735, - 735, 735, 735, 735, 735, 0, 0, 0, 0, 0, - 0, 0, 1527, 735, 735, 1527, 735, 1527, 0, 735, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 0, 0, 0, 736, - 0, 0, 0, 0, 735, 0, 0, 735, 0, 0, - 0, 736, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 736, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 0, 195, 0, 0, - 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 736, 0, 0, 0, 1528, 0, - 0, 736, 736, 1528, 195, 195, 195, 195, 195, 0, - 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, - 0, 0, 195, 0, 195, 0, 0, 195, 195, 195, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 736, 0, 0, 1528, 0, - 0, 0, 0, 736, 0, 0, 0, 0, 195, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 195, 0, 0, 195, 0, 0, 0, - 0, 735, 735, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 735, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 735, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1527, 0, 0, - 0, 0, 0, 0, 0, 0, 2146, 0, 0, 0, - 0, 0, 0, 0, 0, 1527, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 736, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1284, 0, 1284, 1284, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1453, 0, - 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 916, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4052, 0, 0, 195, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 195, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 193, 0, 0, 678, 0, 0, 195, 0, 195, 195, - 195, 0, 0, 0, 0, 0, 0, 0, 736, 736, - 0, 0, 0, 678, 0, 0, 0, 0, 0, 0, - 735, 0, 0, 0, 0, 0, 0, 0, 0, 1052, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1072, 1072, 0, 0, - 0, 0, 0, 735, 0, 678, 0, 736, 736, 736, - 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 735, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 735, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 735, 0, 0, 0, 0, 0, 0, 735, - 735, 735, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 735, 0, 1726, 1727, 0, 0, 735, 735, 0, 0, - 735, 0, 735, 0, 0, 0, 0, 0, 735, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1780, 0, 736, 0, 736, 0, 195, 0, - 0, 0, 0, 735, 0, 0, 0, 1798, 735, 0, - 0, 0, 735, 735, 0, 0, 0, 1528, 1857, 0, - 0, 195, 0, 0, 736, 0, 736, 0, 1866, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1096, 0, 1893, 0, 0, 0, 0, 0, 0, - 0, 1902, 0, 0, 0, 1904, 0, 0, 1907, 1908, - 1910, 1910, 0, 1910, 0, 1910, 1910, 0, 1919, 1910, - 1910, 1910, 1910, 1910, 736, 0, 0, 0, 0, 0, - 0, 0, 1939, 1940, 0, 1096, 0, 195, 1945, 0, - 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 736, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 735, - 1987, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2009, 0, 0, 2013, 0, 0, 0, + 1656, 1657, 1658, 1659, 1660, 1662, 1663, 1664, 1665, 1666, + 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, + 1677, 1683, 1684, 1685, 1686, 1700, 1701, 1702, 1703, 1704, + 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 3997, + 4042, 3247, 4026, 4016, 4025, 0, 3247, 0, 1754, 4045, + 4022, 0, 4024, 4060, 0, 0, 0, 0, 0, 0, + 0, 3929, 1762, 0, 0, 1755, 0, 0, 0, 0, + 3250, 87, 0, 0, 0, 0, 0, 0, 0, 0, + 4044, 0, 0, 0, 1726, 0, 0, 0, 3268, 0, + 1750, 1751, 1761, 1759, 1760, 1756, 4062, 1757, 4049, 0, + 0, 0, 4065, 0, 0, 0, 0, 0, 0, 0, + 0, 3933, 0, 0, 0, 0, 0, 0, 0, 4067, + 1758, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4074, 0, 0, 42, 0, 0, 0, 0, 4084, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1229, 4085, 1235, 0, 4086, 0, 0, 0, 4110, + 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4095, 0, 0, 4104, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4046, 0, 1493, 0, 0, 0, 0, + 1726, 3953, 4130, 4141, 4127, 4119, 3399, 4124, 4121, 4120, + 4118, 4123, 4114, 4122, 4116, 1463, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1551, 0, 3416, 3417, + 3247, 3418, 3420, 3422, 4149, 4172, 42, 0, 4162, 0, + 0, 0, 0, 0, 4154, 4167, 0, 0, 0, 0, + 0, 0, 0, 4180, 0, 0, 0, 0, 0, 3435, + 4141, 4182, 4193, 0, 3438, 0, 3440, 3441, 3442, 3444, + 3445, 3446, 3447, 3448, 3449, 3450, 3451, 3452, 3453, 3454, + 3455, 3456, 3458, 3460, 3462, 3464, 3466, 3468, 3470, 3472, + 3474, 3476, 3478, 3480, 3482, 3484, 3486, 3488, 3489, 3491, + 3492, 3493, 3495, 4197, 4216, 3497, 4192, 3499, 3500, 3501, + 4111, 2153, 3505, 3506, 3507, 3508, 3509, 3510, 3511, 3512, + 3513, 3514, 3515, 4222, 2151, 4229, 4226, 4227, 4225, 4223, + 2031, 3521, 4213, 4051, 4212, 3526, 4106, 4141, 4237, 3530, + 3531, 0, 3532, 3534, 0, 3537, 3539, 4251, 3541, 3542, + 3543, 3544, 0, 4253, 3244, 4245, 0, 0, 3552, 0, + 1032, 0, 0, 2347, 0, 0, 1033, 4070, 0, 2153, + 0, 0, 4261, 0, 0, 0, 2152, 4262, 4263, 0, + 3993, 0, 2151, 0, 4260, 0, 0, 0, 0, 4058, + 0, 0, 0, 3576, 3577, 0, 0, 3581, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4188, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4196, 0, 0, 0, 0, 0, 0, 0, 0, 1841, + 0, 0, 0, 0, 4105, 989, 990, 991, 992, 993, + 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, + 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, + 1024, 1025, 1026, 1027, 1028, 1029, 1030, 0, 0, 0, + 0, 0, 3656, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1789, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3675, 0, 0, + 3679, 0, 0, 0, 1801, 0, 0, 1878, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1818, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3692, 0, 0, 4210, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1828, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 965, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3715, 0, + 0, 0, 0, 0, 0, 0, 1959, 0, 0, 0, + 0, 3723, 0, 0, 0, 0, 0, 0, 3730, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2036, 197, 0, 0, 197, + 1842, 2004, 0, 736, 0, 0, 0, 0, 742, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2032, 197, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2043, 197, 0, 0, 0, 0, + 0, 2047, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 0, + 0, 0, 742, 197, 742, 0, 1855, 1858, 1859, 1860, + 1861, 1862, 1863, 0, 1864, 1865, 1867, 1868, 1866, 1869, + 1870, 1843, 1844, 1845, 1846, 1826, 1827, 1856, 0, 1829, + 0, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, + 0, 0, 1839, 1847, 1848, 1849, 1850, 3942, 1851, 1852, + 1853, 1854, 0, 0, 1840, 0, 3949, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3959, 3960, 3961, 0, + 3963, 0, 3964, 3965, 0, 0, 0, 0, 3968, 3969, + 3970, 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978, 3979, + 3980, 3981, 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989, + 0, 3991, 3994, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4003, 4004, 4005, + 4006, 4007, 4009, 4010, 4012, 4014, 4015, 4017, 0, 0, + 0, 4021, 0, 0, 0, 4023, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4050, 0, 2104, 2105, 2106, 2107, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2097, 0, 0, 2120, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2159, 2160, 0, 0, 0, 0, 2183, + 0, 0, 2187, 2188, 0, 0, 0, 2193, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1857, + 0, 0, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, + 2213, 2214, 0, 2216, 0, 0, 0, 2238, 2239, 2240, + 2241, 2242, 2243, 2244, 2245, 2247, 0, 2252, 0, 2254, + 2255, 2256, 0, 2258, 2259, 2260, 0, 2262, 2263, 2264, + 2265, 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, + 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, + 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, + 2295, 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, + 2305, 2306, 2307, 2311, 2312, 2313, 2314, 2315, 2316, 2317, + 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, + 2328, 2329, 2330, 2331, 2332, 2333, 0, 0, 0, 0, + 0, 2339, 0, 2341, 0, 2348, 2349, 2350, 2351, 2352, + 2353, 0, 0, 0, 0, 0, 0, 4075, 0, 0, + 0, 0, 0, 0, 2364, 2365, 2366, 2367, 2368, 2369, + 2370, 2371, 0, 2373, 2374, 2375, 2376, 2377, 0, 0, + 0, 4090, 0, 0, 0, 0, 0, 4093, 0, 4094, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4109, 1080, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 192, 4135, 4136, + 0, 0, 0, 0, 0, 0, 0, 0, 2997, 2420, + 2421, 0, 4143, 4145, 4147, 0, 0, 0, 0, 0, + 131, 0, 153, 0, 0, 0, 0, 0, 0, 0, + 4153, 0, 192, 0, 0, 2459, 174, 0, 0, 0, + 0, 2426, 4175, 0, 0, 0, 0, 0, 0, 2430, + 0, 2433, 0, 0, 2097, 131, 0, 153, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 164, 174, 0, 0, 0, 0, 152, 0, 0, 0, + 4194, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 0, 197, 0, 0, 171, 2502, 0, 172, + 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, + 0, 152, 0, 0, 4217, 4219, 4221, 0, 0, 0, + 0, 1900, 1901, 163, 162, 191, 0, 0, 0, 0, + 742, 171, 742, 742, 172, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4242, 0, 0, + 0, 0, 0, 0, 742, 197, 140, 141, 163, 162, + 191, 0, 0, 0, 0, 4254, 4255, 0, 0, 0, + 0, 0, 0, 0, 86, 44, 45, 88, 0, 0, + 0, 0, 0, 1537, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 92, 0, 0, 0, 48, 76, 77, + 0, 74, 78, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 0, 157, 1902, 160, + 1032, 1899, 0, 158, 159, 0, 1033, 0, 0, 0, + 175, 0, 0, 0, 0, 62, 2152, 0, 0, 181, + 0, 0, 0, 0, 2097, 0, 0, 95, 0, 0, + 0, 2592, 157, 138, 160, 145, 137, 0, 158, 159, + 0, 0, 2613, 2614, 0, 175, 2618, 0, 0, 0, + 0, 0, 0, 0, 181, 146, 0, 0, 2623, 0, + 0, 0, 0, 0, 0, 2626, 0, 0, 0, 149, + 147, 142, 143, 144, 148, 0, 0, 83, 0, 0, + 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, + 150, 2629, 0, 0, 0, 989, 990, 991, 992, 993, + 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, + 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, + 1024, 1025, 1026, 1027, 1028, 1029, 1030, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 166, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 51, 54, 57, 56, 59, 0, 73, 0, + 0, 82, 79, 166, 0, 2678, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2684, 2685, 2686, 2687, 0, + 0, 0, 0, 0, 0, 61, 91, 90, 0, 0, + 71, 72, 58, 0, 0, 0, 197, 0, 80, 81, + 742, 742, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1841, 0, 0, 0, 197, + 1551, 0, 0, 0, 161, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 742, 63, 64, 197, 65, 66, 67, 68, 0, + 0, 0, 0, 0, 0, 0, 742, 0, 0, 161, + 0, 0, 0, 197, 0, 0, 0, 742, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 742, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 742, 0, 742, 0, 0, 0, 0, 0, 0, 60, + 742, 0, 0, 1537, 742, 0, 0, 742, 742, 742, + 742, 0, 742, 0, 742, 742, 0, 742, 742, 742, + 742, 742, 742, 154, 0, 0, 155, 0, 0, 0, + 1537, 742, 742, 1537, 742, 1537, 197, 742, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 197, 167, 154, 0, + 0, 155, 1828, 0, 179, 0, 0, 0, 0, 742, + 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 742, 0, 0, 742, 1789, 197, 197, 89, + 0, 0, 167, 0, 0, 0, 0, 0, 0, 179, + 0, 0, 0, 0, 197, 187, 0, 0, 0, 0, + 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, + 197, 197, 197, 197, 197, 197, 197, 197, 197, 742, + 0, 0, 0, 0, 0, 0, 2936, 0, 0, 0, + 187, 0, 0, 0, 0, 0, 1842, 0, 0, 0, + 0, 0, 168, 173, 170, 176, 177, 178, 180, 182, + 183, 184, 185, 0, 0, 0, 0, 0, 186, 188, + 189, 190, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 168, 173, 170, + 176, 177, 178, 180, 182, 183, 184, 185, 0, 94, + 0, 0, 0, 186, 188, 189, 190, 0, 0, 0, + 0, 2985, 1855, 1858, 1859, 1860, 1861, 1862, 1863, 0, + 1864, 1865, 1867, 1868, 1866, 1869, 1870, 1843, 1844, 1845, + 1846, 1826, 1827, 1856, 0, 1829, 0, 1830, 1831, 1832, + 1833, 1834, 1835, 1836, 1837, 1838, 0, 0, 1839, 1847, + 1848, 1849, 1850, 0, 1851, 1852, 1853, 1854, 0, 0, + 1840, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3033, 3034, 3035, + 3036, 3037, 3038, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 742, + 742, 0, 0, 0, 0, 0, 2097, 3049, 0, 3061, + 70, 0, 0, 0, 742, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, + 0, 3057, 0, 0, 0, 0, 3087, 3088, 3089, 0, + 0, 3091, 0, 0, 3093, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3112, 3113, 3114, 0, 0, 0, + 0, 0, 0, 3119, 0, 742, 0, 0, 3121, 0, + 0, 3123, 3124, 3125, 0, 1537, 0, 3126, 3127, 0, + 0, 3128, 0, 3129, 0, 0, 0, 0, 0, 0, + 3130, 0, 3131, 1537, 0, 0, 3132, 0, 3133, 0, + 0, 3134, 0, 3135, 0, 3136, 0, 3137, 0, 3138, + 0, 3139, 0, 3140, 0, 3141, 0, 3142, 0, 3143, + 0, 3144, 0, 3145, 0, 3146, 0, 3147, 0, 3148, + 0, 3149, 0, 3150, 0, 3151, 0, 0, 0, 3152, + 0, 3153, 0, 3154, 0, 0, 3155, 0, 3156, 0, + 3157, 0, 2311, 3159, 0, 1857, 3161, 0, 0, 3163, + 3164, 3165, 3166, 0, 0, 0, 0, 3167, 2311, 2311, + 2311, 2311, 2311, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3177, 0, 0, 0, 0, 0, 0, + 0, 3190, 0, 0, 3194, 0, 0, 0, 0, 0, + 0, 0, 0, 3197, 3198, 3199, 3200, 3201, 3202, 0, + 0, 0, 3203, 3204, 0, 3205, 0, 3206, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2358, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1080, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 964, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3239, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 197, 0, 0, 0, 0, 742, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3269, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, + 0, 0, 742, 0, 0, 0, 719, 0, 0, 0, + 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 0, 0, 0, 742, 0, 0, 2358, 197, + 0, 197, 0, 197, 197, 0, 0, 0, 0, 3331, + 0, 0, 0, 0, 0, 0, 0, 0, 742, 0, + 0, 0, 0, 0, 0, 0, 0, 3321, 0, 0, + 0, 0, 0, 0, 0, 0, 741, 0, 741, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3359, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3373, 0, 0, + 0, 0, 0, 0, 0, 0, 742, 0, 0, 0, + 0, 0, 0, 742, 742, 742, 197, 0, 3391, 0, + 0, 3394, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 742, 0, 3424, 0, 0, 0, + 742, 742, 0, 0, 742, 0, 742, 0, 0, 0, + 0, 0, 742, 0, 921, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3439, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 742, 0, 0, + 0, 0, 742, 0, 0, 0, 742, 742, 0, 0, + 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1896, 0, 0, 0, 0, + 0, 0, 740, 0, 0, 0, 0, 131, 0, 153, + 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, + 0, 197, 0, 174, 0, 0, 0, 0, 0, 0, + 0, 0, 197, 197, 0, 0, 197, 0, 197, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, + 0, 0, 0, 0, 0, 197, 1105, 164, 1112, 0, + 0, 0, 0, 152, 0, 0, 3554, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 0, 171, 0, 0, 172, 0, 197, 0, + 0, 0, 0, 742, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1900, 1901, + 163, 162, 191, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3615, 3637, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1537, 0, 2358, + 0, 3630, 0, 3631, 3632, 3633, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3661, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 157, 1902, 160, 0, 1899, 0, + 158, 159, 0, 0, 0, 0, 0, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 3681, 0, 3682, 0, 3683, 0, 3684, + 0, 0, 0, 0, 0, 0, 0, 3687, 3688, 0, + 0, 0, 0, 0, 0, 0, 0, 3693, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3694, 0, 3695, 0, 3696, 0, 3697, 0, 3698, + 0, 3699, 0, 3700, 0, 3701, 0, 3702, 0, 3703, + 0, 3704, 0, 3705, 0, 3706, 0, 3707, 0, 3708, + 0, 3709, 0, 0, 3710, 0, 0, 0, 3711, 0, + 3712, 0, 0, 0, 0, 0, 3714, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3731, 0, + 0, 0, 0, 0, 0, 0, 0, 3736, 0, 3737, + 3738, 0, 3739, 0, 3740, 166, 0, 0, 0, 3741, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 197, 0, 0, 0, 3770, 0, 0, 0, + 197, 0, 0, 0, 0, 0, 0, 0, 0, 3779, + 0, 742, 3781, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3785, 0, 0, 742, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3921, 0, 0, 0, 741, 1448, 741, 741, 0, 0, + 0, 197, 0, 0, 0, 0, 197, 0, 0, 0, + 0, 161, 0, 0, 0, 0, 0, 0, 741, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1536, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 742, 0, 0, 0, 0, + 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 742, 0, 0, 0, 0, 0, 0, 742, + 0, 0, 0, 742, 742, 0, 0, 0, 742, 0, + 154, 0, 0, 155, 0, 0, 0, 0, 0, 4031, + 0, 0, 0, 0, 1537, 742, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 197, 197, 197, + 197, 197, 197, 0, 167, 0, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 197, 197, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 187, 0, 1293, 0, 1293, 1293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 742, 1462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, + 173, 170, 176, 177, 178, 180, 182, 183, 184, 185, + 0, 0, 0, 0, 0, 186, 188, 189, 190, 0, + 0, 0, 0, 0, 0, 0, 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 736, 0, - 1284, 0, 0, 0, 0, 736, 0, 736, 0, 0, - 0, 0, 0, 1527, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 741, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 741, 4071, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 741, 4087, 0, 0, 4088, 0, 4089, 0, 0, + 0, 741, 742, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 742, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 741, 0, 741, 0, 0, 0, + 0, 0, 0, 0, 741, 0, 0, 1536, 741, 0, + 0, 741, 741, 741, 741, 742, 741, 0, 741, 741, + 0, 741, 741, 741, 741, 741, 741, 0, 0, 0, + 197, 0, 0, 742, 1536, 741, 741, 1536, 741, 1536, + 0, 741, 0, 0, 0, 0, 0, 0, 0, 742, + 0, 0, 0, 1537, 0, 0, 742, 742, 1537, 197, + 197, 197, 197, 197, 0, 0, 0, 0, 0, 4173, + 0, 197, 0, 741, 0, 0, 0, 197, 0, 197, + 0, 0, 197, 197, 197, 0, 741, 0, 0, 741, + 0, 0, 0, 0, 0, 0, 0, 0, 4189, 0, + 4190, 0, 4191, 0, 1736, 1737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, + 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, + 742, 0, 0, 1537, 0, 1795, 0, 0, 742, 0, + 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, + 1813, 0, 0, 0, 0, 0, 0, 197, 0, 0, + 0, 1872, 4240, 0, 4241, 0, 0, 0, 0, 0, + 0, 1881, 0, 0, 0, 0, 0, 0, 197, 0, + 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1105, 0, 1908, 0, 0, 0, + 0, 0, 0, 0, 1917, 0, 0, 0, 1919, 0, + 0, 1922, 1923, 1925, 1925, 0, 1925, 0, 1925, 1925, + 0, 1934, 1925, 1925, 1925, 1925, 1925, 0, 0, 0, + 0, 0, 0, 0, 0, 1954, 1955, 0, 1105, 0, + 0, 1960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 922, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2002, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2024, 0, 0, 2028, + 0, 0, 0, 741, 741, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 741, 742, + 0, 0, 0, 0, 0, 0, 195, 0, 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1293, 0, 0, 0, 0, 0, 684, + 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, + 0, 0, 0, 0, 0, 1060, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, + 0, 0, 0, 0, 1081, 1081, 0, 0, 0, 1536, + 0, 0, 0, 684, 0, 0, 0, 0, 2161, 0, + 0, 0, 0, 0, 0, 0, 0, 1536, 0, 0, + 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 0, 197, 197, 197, 0, 0, 0, 0, + 0, 0, 0, 742, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1284, 1284, 0, 0, 0, 0, 736, 0, 0, 0, - 0, 0, 0, 0, 0, 2070, 0, 0, 0, 678, - 0, 678, 195, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1293, 1293, 0, 0, 0, 0, 0, + 0, 0, 742, 742, 742, 742, 0, 0, 2085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 736, 195, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2132, 0, 0, 0, - 0, 0, 0, 678, 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 736, 0, 0, 0, - 0, 1529, 0, 0, 0, 0, 736, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1528, 736, 0, 736, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2147, + 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2930, 0, 0, 0, - 0, 0, 0, 0, 736, 2343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, + 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 195, 736, 0, 0, 735, + 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 742, + 0, 742, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1537, 0, 0, 0, 197, 0, 0, 742, + 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, + 741, 0, 0, 0, 0, 0, 0, 741, 741, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 735, 0, 0, 0, - 0, 0, 0, 735, 0, 0, 736, 735, 735, 0, - 1284, 0, 735, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1527, 735, - 736, 0, 0, 0, 0, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 736, - 0, 736, 0, 0, 0, 0, 0, 0, 0, 2380, + 0, 0, 0, 1293, 0, 0, 0, 0, 741, 0, + 0, 0, 0, 0, 741, 741, 0, 0, 741, 0, + 741, 0, 0, 0, 0, 0, 741, 0, 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 197, 0, 0, 742, 0, 0, 0, 0, + 0, 0, 0, 2395, 0, 0, 0, 0, 742, 0, + 0, 741, 0, 0, 0, 0, 741, 0, 0, 0, + 741, 741, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1795, + 0, 0, 1293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2393, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1105, 742, 0, 0, 0, 0, 0, 0, + 742, 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1780, 0, 0, 1284, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1096, 0, 0, 0, 0, 0, 0, - 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1052, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 678, - 0, 1103, 0, 0, 0, 0, 0, 0, 2506, 2507, - 2508, 0, 0, 0, 0, 0, 0, 0, 678, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1096, - 0, 0, 0, 0, 0, 1103, 1902, 0, 0, 1902, - 0, 1902, 0, 0, 0, 0, 0, 2539, 0, 0, + 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 741, 0, 0, + 1112, 0, 0, 0, 0, 0, 0, 2523, 2524, 2525, + 0, 684, 0, 684, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1105, 0, + 0, 0, 0, 0, 1112, 1917, 0, 0, 1917, 0, + 1917, 0, 0, 0, 0, 0, 2556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1096, 0, 0, 0, 0, 2132, 0, 0, - 0, 2132, 2132, 0, 0, 1529, 735, 0, 1529, 0, - 1529, 678, 0, 0, 0, 0, 0, 0, 735, 0, + 0, 1536, 0, 741, 0, 684, 0, 0, 0, 0, + 0, 1105, 0, 0, 0, 0, 2147, 0, 0, 0, + 2147, 2147, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1961, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 678, 0, 0, 735, + 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2015, 678, 0, 0, 0, 735, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 678, - 0, 735, 0, 0, 0, 1527, 678, 0, 735, 735, - 1527, 0, 0, 0, 0, 2041, 2042, 678, 678, 678, - 678, 678, 678, 678, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2617, 0, + 0, 0, 0, 0, 0, 742, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 735, 0, 0, 1527, 0, 0, 0, 0, - 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1284, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1537, 742, 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 742, + 2358, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 197, 742, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 684, 0, 0, 0, + 0, 0, 0, 0, 0, 742, 2949, 0, 0, 0, + 197, 0, 0, 0, 0, 0, 0, 0, 0, 1060, + 0, 0, 0, 0, 742, 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 684, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, + 0, 0, 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, + 0, 0, 0, 741, 0, 0, 0, 741, 741, 0, + 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1538, 0, 0, 0, 0, 1536, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1538, 0, 0, 1538, 0, 1538, 684, 0, 0, 0, + 0, 0, 0, 0, 0, 2882, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1976, 0, 0, 0, + 0, 2899, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2030, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 741, 0, 0, 684, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, + 2056, 2057, 684, 684, 684, 684, 684, 684, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, - 1529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1529, 0, + 0, 741, 0, 0, 0, 0, 0, 0, 0, 2981, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2408, 0, 0, 0, + 0, 0, 0, 3005, 0, 0, 0, 1917, 1917, 0, + 0, 0, 3010, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2865, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2880, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3586, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, + 0, 2147, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 684, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 735, 735, 0, 0, 0, - 0, 0, 0, 0, 2015, 0, 0, 0, 0, 0, + 0, 0, 0, 741, 0, 0, 0, 1536, 0, 0, + 741, 741, 1536, 0, 0, 0, 0, 0, 0, 0, + 0, 2147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2962, 0, - 0, 0, 0, 0, 735, 735, 735, 735, 1961, 0, + 0, 0, 0, 1538, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1072, 2393, 0, 0, 0, 0, - 0, 0, 2986, 0, 0, 0, 1902, 1902, 0, 0, - 0, 2991, 0, 1052, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3002, 0, - 678, 0, 0, 0, 0, 0, 0, 2015, 678, 0, - 678, 0, 678, 2432, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 741, 0, 0, 1536, 0, 0, + 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3179, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1293, 0, + 0, 0, 0, 0, 0, 3398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3224, 0, 2030, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1293, 0, 0, 0, 0, 0, 0, + 3251, 1925, 0, 0, 0, 0, 0, 0, 0, 95, + 0, 0, 1032, 0, 0, 0, 0, 970, 1033, 984, + 985, 986, 971, 0, 1976, 972, 973, 0, 974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1081, 0, 0, 0, 979, 0, 987, 988, 0, 0, + 0, 0, 0, 741, 0, 0, 0, 0, 0, 1060, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2132, 0, 0, 0, 0, 2509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 735, 0, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 1105, 0, 0, 0, 2030, 684, + 0, 684, 2408, 684, 2449, 3367, 3368, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 989, 990, 991, + 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, + 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, + 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1527, 0, 0, 0, 0, 0, - 2132, 735, 0, 735, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3605, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3369, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 741, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 678, 0, 0, 0, 735, 0, 0, - 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 735, 678, 678, 0, 0, 678, 0, 2603, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 678, 0, 0, - 0, 0, 0, 0, 678, 3160, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1284, 0, 0, + 0, 0, 0, 0, 0, 0, 741, 741, 741, 741, + 0, 0, 0, 1872, 0, 0, 0, 0, 0, 0, + 0, 3370, 3371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 678, 0, 0, 0, 0, 0, 0, 2614, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1910, 0, - 0, 0, 0, 0, 0, 735, 0, 0, 0, 0, - 0, 0, 735, 0, 735, 0, 3205, 0, 0, 0, + 0, 0, 0, 0, 684, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 684, 684, 0, 0, 684, 0, 2620, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 684, 0, + 0, 0, 0, 0, 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1284, 0, 0, 0, 0, 0, 0, 3232, 1910, 0, - 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 935, 0, 0, 0, + 0, 684, 939, 0, 0, 0, 936, 937, 2631, 0, + 0, 938, 940, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1529, 0, 2015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2408, 2408, 0, + 0, 0, 0, 741, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1536, 1538, 0, 2030, + 0, 0, 0, 741, 0, 741, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3669, 3670, 3671, 3672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1096, 0, 0, 0, 0, 0, 0, 0, 2393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 741, 0, 0, + 0, 0, 0, 0, 741, 0, 741, 0, 0, 0, + 0, 0, 0, 3747, 0, 3747, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, + 0, 0, 0, 3775, 0, 3777, 0, 0, 0, 0, + 0, 0, 684, 0, 0, 0, 0, 0, 0, 0, + 1976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, - 0, 678, 0, 735, 0, 0, 0, 0, 0, 1961, - 1857, 0, 0, 1527, 735, 0, 735, 0, 0, 0, + 0, 0, 0, 2408, 0, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 0, 0, 684, 0, 0, 3944, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 735, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 678, 0, - 0, 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3747, 0, 741, + 0, 0, 0, 0, 3747, 0, 3747, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 678, 0, - 0, 0, 0, 0, 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2393, 2393, 735, 0, 735, 0, + 0, 0, 0, 0, 1538, 2408, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 684, 684, 684, + 684, 684, 684, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 741, 684, 684, 0, 0, + 0, 0, 0, 0, 0, 1536, 741, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 741, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 678, 678, 678, 678, 678, 678, - 0, 0, 0, 3650, 3651, 3652, 3653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 678, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 678, 0, + 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2408, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 741, 0, + 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4091, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4099, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2408, 0, 4107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1293, 1293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1081, 0, + 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4157, 0, 0, 0, 0, + 0, 0, 0, 1538, 0, 0, 0, 0, 1538, 684, + 684, 684, 684, 684, 0, 0, 0, 0, 0, 0, + 0, 3267, 0, 0, 0, 0, 0, 1976, 0, 684, + 0, 0, 684, 3275, 2030, 4099, 0, 0, 0, 3807, + 3809, 3808, 3874, 3875, 3876, 3877, 3878, 3879, 3880, 3810, + 3811, 812, 0, 0, 0, 0, 0, 0, 0, 2408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 684, 1872, 0, + 4157, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1538, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 684, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 684, 0, + 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3728, 0, 3728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3756, 0, 3758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2393, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3925, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1284, - 0, 0, 0, 0, 0, 1072, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1529, 0, - 0, 0, 0, 1529, 678, 678, 678, 678, 678, 0, - 0, 0, 0, 0, 0, 0, 3248, 0, 0, 0, - 0, 0, 1961, 0, 678, 0, 0, 678, 3256, 2015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3728, 0, 0, 0, 0, 0, - 0, 3728, 0, 3728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2393, 0, 0, 0, 0, 0, 1529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3815, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3823, 3824, + 0, 0, 3899, 3898, 3897, 0, 684, 3895, 3896, 3894, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 678, 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 684, 3900, 935, 0, 788, 789, 3901, 3902, + 939, 3903, 791, 792, 936, 937, 0, 786, 790, 938, + 940, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 684, 0, 684, 684, 684, 3804, 3805, 3806, 3812, + 3813, 3814, 3825, 3872, 3873, 3881, 3883, 891, 3882, 3884, + 3885, 3886, 3889, 3890, 3891, 3892, 3887, 3888, 3893, 3787, + 3791, 3788, 3789, 3790, 3802, 3792, 3793, 3794, 3795, 3796, + 3797, 3798, 3799, 3800, 3801, 3803, 3904, 3905, 3906, 3907, + 3908, 3909, 3818, 3822, 3821, 3819, 3820, 3816, 3817, 3844, + 3843, 3845, 3846, 3847, 3848, 3849, 3850, 3852, 3851, 3853, + 3854, 3855, 3856, 3857, 3858, 3826, 3827, 3830, 3831, 3829, + 3828, 3832, 3841, 3842, 3833, 3834, 3835, 3836, 3837, 3838, + 3840, 3839, 3859, 3860, 3861, 3862, 3863, 3865, 3864, 3868, + 3869, 3867, 3866, 3871, 3870, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 941, 0, + 942, 0, 0, 946, 0, 0, 0, 948, 947, 0, + 949, 911, 910, 0, 0, 943, 944, 0, 945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3910, 3911, 3912, + 3913, 3914, 3915, 3916, 3917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1538, 0, 0, 0, 1976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4072, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4080, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2393, 0, 4088, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1284, 1284, 3788, 3790, 3789, 3855, 3856, 3857, 3858, 3859, - 3860, 3861, 3791, 3792, 806, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 678, 0, 678, 678, - 678, 0, 4138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4080, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1857, 0, 4138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2883,4546 +2851,4543 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3804, 3805, 0, 0, 3880, 3879, 3878, 1961, 0, - 3876, 3877, 3875, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1529, 0, 0, - 0, 1961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3881, 929, 0, 782, - 783, 3882, 3883, 933, 3884, 785, 786, 930, 931, 0, - 780, 784, 932, 934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1961, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3785, - 3786, 3787, 3793, 3794, 3795, 3806, 3853, 3854, 3862, 3864, - 885, 3863, 3865, 3866, 3867, 3870, 3871, 3872, 3873, 3868, - 3869, 3874, 3768, 3772, 3769, 3770, 3771, 3783, 3773, 3774, - 3775, 3776, 3777, 3778, 3779, 3780, 3781, 3782, 3784, 3885, - 3886, 3887, 3888, 3889, 3890, 3799, 3803, 3802, 3800, 3801, - 3797, 3798, 3825, 3824, 3826, 3827, 3828, 3829, 3830, 3831, - 3833, 3832, 3834, 3835, 3836, 3837, 3838, 3839, 3807, 3808, - 3811, 3812, 3810, 3809, 3813, 3822, 3823, 3814, 3815, 3816, - 3817, 3818, 3819, 3821, 3820, 3840, 3841, 3842, 3843, 3844, - 3846, 3845, 3849, 3850, 3848, 3847, 3852, 3851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 935, 0, 936, 0, 0, 940, 0, 0, 0, - 942, 941, 0, 943, 905, 904, 0, 0, 937, 938, - 0, 939, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3891, 3892, 3893, 3894, - 3895, 3896, 3897, 3898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1976, 0, 0, 400, 0, 0, 0, 0, 0, 0, + 1431, 1415, 534, 0, 1357, 1434, 1325, 1344, 1444, 1347, + 1350, 1394, 1303, 1372, 420, 1341, 1329, 1298, 1336, 1299, + 1327, 1359, 273, 1324, 1417, 1376, 1433, 369, 270, 1305, + 1296, 206, 511, 1330, 435, 1346, 205, 1396, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 1440, 373, 1382, 0, 503, 405, 0, 0, + 2030, 1421, 1420, 1351, 1361, 1423, 1370, 1408, 1356, 1395, + 1313, 1381, 1435, 1342, 1391, 1436, 326, 250, 328, 204, + 417, 504, 289, 0, 0, 0, 0, 4131, 513, 966, + 0, 0, 0, 0, 4132, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 1338, 1388, + 616, 1430, 1339, 1390, 268, 324, 275, 267, 587, 1441, + 1422, 1302, 1369, 1429, 1364, 603, 0, 0, 231, 1432, + 1363, 0, 1393, 0, 1447, 1297, 1384, 0, 1300, 1304, + 1443, 1427, 1333, 278, 0, 0, 0, 0, 0, 0, + 0, 1360, 1371, 1405, 1409, 1354, 0, 0, 0, 0, + 0, 0, 0, 0, 1331, 0, 1380, 0, 0, 0, + 1309, 1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1961, 0, 0, 397, 0, - 0, 0, 0, 0, 0, 1422, 1406, 529, 0, 1348, - 1425, 1316, 1335, 1435, 1338, 1341, 1385, 1294, 1363, 417, - 1332, 1320, 1289, 1327, 1290, 1318, 1350, 271, 1315, 1408, - 1367, 1424, 367, 268, 1296, 1287, 204, 506, 1321, 431, - 1337, 203, 1387, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 1431, 371, 1373, - 0, 498, 402, 0, 0, 2015, 1412, 1411, 1342, 1352, - 1414, 1361, 1399, 1347, 1386, 1304, 1372, 1426, 1333, 1382, - 1427, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 4112, 508, 960, 0, 0, 0, 0, 4113, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 1329, 1379, 610, 1421, 1330, 1381, 266, - 322, 273, 265, 581, 1432, 1413, 1293, 1360, 1420, 1355, - 597, 0, 0, 229, 1423, 1354, 0, 1384, 0, 1438, - 1288, 1375, 0, 1291, 1295, 1434, 1418, 1324, 276, 0, - 0, 0, 0, 0, 0, 0, 1351, 1362, 1396, 1400, - 1345, 0, 0, 0, 0, 0, 0, 0, 0, 1322, - 0, 1371, 0, 0, 0, 1300, 1292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1349, - 0, 0, 0, 0, 1303, 0, 1323, 1397, 0, 1286, - 298, 1297, 403, 258, 0, 454, 1404, 1417, 1346, 630, - 1419, 1344, 1343, 1391, 1301, 1410, 1336, 366, 1299, 331, - 197, 225, 0, 1334, 413, 462, 474, 1409, 1319, 1328, - 254, 1326, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 1370, 1389, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 1298, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 1314, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 1405, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 1394, 1437, - 426, 473, 240, 607, 497, 199, 1308, 1313, 1306, 0, - 255, 256, 1376, 576, 1309, 1307, 1365, 1366, 1310, 1428, - 1429, 1430, 1415, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 1398, 1302, 0, 1311, 1312, 399, 1407, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 1369, 196, 221, - 369, 1433, 455, 289, 651, 619, 485, 614, 206, 223, - 1305, 263, 1317, 1325, 0, 1331, 1339, 1340, 1353, 1356, - 1357, 1358, 1359, 1377, 1378, 1380, 1388, 1390, 1393, 1395, - 1402, 1416, 1436, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 1368, 1374, 382, 282, 306, 321, 1383, 618, 503, - 227, 467, 291, 251, 1401, 1403, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 1364, 1392, 377, 577, 578, 317, 397, 0, 0, 0, - 0, 0, 0, 1422, 1406, 529, 0, 1348, 1425, 1316, - 1335, 1435, 1338, 1341, 1385, 1294, 1363, 417, 1332, 1320, - 1289, 1327, 1290, 1318, 1350, 271, 1315, 1408, 1367, 1424, - 367, 268, 1296, 1287, 204, 506, 1321, 431, 1337, 203, - 1387, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 1431, 371, 1373, 0, 498, - 402, 0, 0, 0, 1412, 1411, 1342, 1352, 1414, 1361, - 1399, 1347, 1386, 1304, 1372, 1426, 1333, 1382, 1427, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 0, 508, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 1329, 1379, 610, 1421, 1330, 1381, 266, 322, 273, - 265, 581, 1432, 1413, 1293, 1360, 1420, 1355, 597, 0, - 0, 229, 1423, 1354, 0, 1384, 0, 1438, 1288, 1375, - 0, 1291, 1295, 1434, 1418, 1324, 276, 0, 0, 0, - 0, 0, 0, 0, 1351, 1362, 1396, 1400, 1345, 0, - 0, 0, 0, 0, 0, 3257, 0, 1322, 0, 1371, - 0, 0, 0, 1300, 1292, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1349, 0, 0, - 0, 0, 1303, 0, 1323, 1397, 0, 1286, 298, 1297, - 403, 258, 0, 454, 1404, 1417, 1346, 630, 1419, 1344, - 1343, 1391, 1301, 1410, 1336, 366, 1299, 331, 197, 225, - 0, 1334, 413, 462, 474, 1409, 1319, 1328, 254, 1326, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 1370, 1389, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 1298, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 1314, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 1405, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 1394, 1437, 426, 473, - 240, 607, 497, 199, 1308, 1313, 1306, 0, 255, 256, - 1376, 576, 1309, 1307, 1365, 1366, 1310, 1428, 1429, 1430, - 1415, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 1398, - 1302, 0, 1311, 1312, 399, 1407, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 1369, 196, 221, 369, 1433, - 455, 289, 651, 619, 485, 614, 206, 223, 1305, 263, - 1317, 1325, 0, 1331, 1339, 1340, 1353, 1356, 1357, 1358, - 1359, 1377, 1378, 1380, 1388, 1390, 1393, 1395, 1402, 1416, - 1436, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 1368, - 1374, 382, 282, 306, 321, 1383, 618, 503, 227, 467, - 291, 251, 1401, 1403, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 1364, 1392, - 377, 577, 578, 317, 397, 0, 0, 0, 0, 0, - 0, 1422, 1406, 529, 0, 1348, 1425, 1316, 1335, 1435, - 1338, 1341, 1385, 1294, 1363, 417, 1332, 1320, 1289, 1327, - 1290, 1318, 1350, 271, 1315, 1408, 1367, 1424, 367, 268, - 1296, 1287, 204, 506, 1321, 431, 1337, 203, 1387, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 1431, 371, 1373, 0, 498, 402, 0, - 0, 0, 1412, 1411, 1342, 1352, 1414, 1361, 1399, 1347, - 1386, 1304, 1372, 1426, 1333, 1382, 1427, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 0, 508, - 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 1329, - 1379, 610, 1421, 1330, 1381, 266, 322, 273, 265, 581, - 1432, 1413, 1293, 1360, 1420, 1355, 597, 0, 0, 229, - 1423, 1354, 0, 1384, 0, 1438, 1288, 1375, 0, 1291, - 1295, 1434, 1418, 1324, 276, 0, 0, 0, 0, 0, - 0, 0, 1351, 1362, 1396, 1400, 1345, 0, 0, 0, - 0, 0, 0, 3218, 0, 1322, 0, 1371, 0, 0, - 0, 1300, 1292, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1349, 0, 0, 0, 0, - 1303, 0, 1323, 1397, 0, 1286, 298, 1297, 403, 258, - 0, 454, 1404, 1417, 1346, 630, 1419, 1344, 1343, 1391, - 1301, 1410, 1336, 366, 1299, 331, 197, 225, 0, 1334, - 413, 462, 474, 1409, 1319, 1328, 254, 1326, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 1370, 1389, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 1298, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 1314, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 1405, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 1394, 1437, 426, 473, 240, 607, - 497, 199, 1308, 1313, 1306, 0, 255, 256, 1376, 576, - 1309, 1307, 1365, 1366, 1310, 1428, 1429, 1430, 1415, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 1398, 1302, 0, - 1311, 1312, 399, 1407, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 1369, 196, 221, 369, 1433, 455, 289, - 651, 619, 485, 614, 206, 223, 1305, 263, 1317, 1325, - 0, 1331, 1339, 1340, 1353, 1356, 1357, 1358, 1359, 1377, - 1378, 1380, 1388, 1390, 1393, 1395, 1402, 1416, 1436, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 1368, 1374, 382, - 282, 306, 321, 1383, 618, 503, 227, 467, 291, 251, - 1401, 1403, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 1364, 1392, 377, 577, - 578, 317, 397, 0, 0, 0, 0, 0, 0, 1422, - 1406, 529, 0, 1348, 1425, 1316, 1335, 1435, 1338, 1341, - 1385, 1294, 1363, 417, 1332, 1320, 1289, 1327, 1290, 1318, - 1350, 271, 1315, 1408, 1367, 1424, 367, 268, 1296, 1287, - 204, 506, 1321, 431, 1337, 203, 1387, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 1431, 371, 1373, 0, 498, 402, 0, 0, 0, - 1412, 1411, 1342, 1352, 1414, 1361, 1399, 1347, 1386, 1304, - 1372, 1426, 1333, 1382, 1427, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 0, 0, 508, 960, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 1329, 1379, 610, - 1421, 1330, 1381, 266, 322, 273, 265, 581, 1432, 1413, - 1293, 1360, 1420, 1355, 597, 0, 0, 229, 1423, 1354, - 0, 1384, 0, 1438, 1288, 1375, 0, 1291, 1295, 1434, - 1418, 1324, 276, 0, 0, 0, 0, 0, 0, 0, - 1351, 1362, 1396, 1400, 1345, 0, 0, 0, 0, 0, - 0, 2411, 0, 1322, 0, 1371, 0, 0, 0, 1300, - 1292, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1349, 0, 0, 0, 0, 1303, 0, - 1323, 1397, 0, 1286, 298, 1297, 403, 258, 0, 454, - 1404, 1417, 1346, 630, 1419, 1344, 1343, 1391, 1301, 1410, - 1336, 366, 1299, 331, 197, 225, 0, 1334, 413, 462, - 474, 1409, 1319, 1328, 254, 1326, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 1370, 1389, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 1298, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 1314, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 1405, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 1394, 1437, 426, 473, 240, 607, 497, 199, - 1308, 1313, 1306, 0, 255, 256, 1376, 576, 1309, 1307, - 1365, 1366, 1310, 1428, 1429, 1430, 1415, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 1398, 1302, 0, 1311, 1312, - 399, 1407, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 1369, 196, 221, 369, 1433, 455, 289, 651, 619, - 485, 614, 206, 223, 1305, 263, 1317, 1325, 0, 1331, - 1339, 1340, 1353, 1356, 1357, 1358, 1359, 1377, 1378, 1380, - 1388, 1390, 1393, 1395, 1402, 1416, 1436, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 1368, 1374, 382, 282, 306, - 321, 1383, 618, 503, 227, 467, 291, 251, 1401, 1403, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 1364, 1392, 377, 577, 578, 317, - 397, 0, 0, 0, 0, 0, 0, 1422, 1406, 529, - 0, 1348, 1425, 1316, 1335, 1435, 1338, 1341, 1385, 1294, - 1363, 417, 1332, 1320, 1289, 1327, 1290, 1318, 1350, 271, - 1315, 1408, 1367, 1424, 367, 268, 1296, 1287, 204, 506, - 1321, 431, 1337, 203, 1387, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 1431, - 371, 1373, 0, 498, 402, 0, 0, 0, 1412, 1411, - 1342, 1352, 1414, 1361, 1399, 1347, 1386, 1304, 1372, 1426, - 1333, 1382, 1427, 324, 248, 326, 202, 414, 499, 287, - 0, 95, 0, 0, 0, 508, 725, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 1329, 1379, 610, 1421, 1330, - 1381, 266, 322, 273, 265, 581, 1432, 1413, 1293, 1360, - 1420, 1355, 597, 0, 0, 229, 1423, 1354, 0, 1384, - 0, 1438, 1288, 1375, 0, 1291, 1295, 1434, 1418, 1324, - 276, 0, 0, 0, 0, 0, 0, 0, 1351, 1362, - 1396, 1400, 1345, 0, 0, 0, 0, 0, 0, 0, - 0, 1322, 0, 1371, 0, 0, 0, 1300, 1292, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1349, 0, 0, 0, 0, 1303, 0, 1323, 1397, - 0, 1286, 298, 1297, 403, 258, 0, 454, 1404, 1417, - 1346, 630, 1419, 1344, 1343, 1391, 1301, 1410, 1336, 366, - 1299, 331, 197, 225, 0, 1334, 413, 462, 474, 1409, - 1319, 1328, 254, 1326, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 1370, 1389, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 1298, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 1314, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 1405, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 1394, 1437, 426, 473, 240, 607, 497, 199, 1308, 1313, - 1306, 0, 255, 256, 1376, 576, 1309, 1307, 1365, 1366, - 1310, 1428, 1429, 1430, 1415, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 1398, 1302, 0, 1311, 1312, 399, 1407, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 1369, - 196, 221, 369, 1433, 455, 289, 651, 619, 485, 614, - 206, 223, 1305, 263, 1317, 1325, 0, 1331, 1339, 1340, - 1353, 1356, 1357, 1358, 1359, 1377, 1378, 1380, 1388, 1390, - 1393, 1395, 1402, 1416, 1436, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 1368, 1374, 382, 282, 306, 321, 1383, - 618, 503, 227, 467, 291, 251, 1401, 1403, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 1364, 1392, 377, 577, 578, 317, 397, 0, - 0, 0, 0, 0, 0, 1422, 1406, 529, 0, 1348, - 1425, 1316, 1335, 1435, 1338, 1341, 1385, 1294, 1363, 417, - 1332, 1320, 1289, 1327, 1290, 1318, 1350, 271, 1315, 1408, - 1367, 1424, 367, 268, 1296, 1287, 204, 506, 1321, 431, - 1337, 203, 1387, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 1431, 371, 1373, - 0, 498, 402, 0, 0, 0, 1412, 1411, 1342, 1352, - 1414, 1361, 1399, 1347, 1386, 1304, 1372, 1426, 1333, 1382, - 1427, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 0, 508, 194, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 1329, 1379, 610, 1421, 1330, 1381, 266, - 322, 273, 265, 581, 1432, 1413, 1293, 1360, 1420, 1355, - 597, 0, 0, 229, 1423, 1354, 0, 1384, 0, 1438, - 1288, 1375, 0, 1291, 1295, 1434, 1418, 1324, 276, 0, - 0, 0, 0, 0, 0, 0, 1351, 1362, 1396, 1400, - 1345, 0, 0, 0, 0, 0, 0, 0, 0, 1322, - 0, 1371, 0, 0, 0, 1300, 1292, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1349, - 0, 0, 0, 0, 1303, 0, 1323, 1397, 0, 1286, - 298, 1297, 403, 258, 0, 454, 1404, 1417, 1346, 630, - 1419, 1344, 1343, 1391, 1301, 1410, 1336, 366, 1299, 331, - 197, 225, 0, 1334, 413, 462, 474, 1409, 1319, 1328, - 254, 1326, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 1370, 1389, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 1298, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 1314, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 1405, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 1394, 1437, - 426, 473, 240, 607, 497, 199, 1308, 1313, 1306, 0, - 255, 256, 1376, 576, 1309, 1307, 1365, 1366, 1310, 1428, - 1429, 1430, 1415, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 1398, 1302, 0, 1311, 1312, 399, 1407, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 1369, 196, 221, - 369, 1433, 455, 289, 651, 619, 485, 614, 206, 223, - 1305, 263, 1317, 1325, 0, 1331, 1339, 1340, 1353, 1356, - 1357, 1358, 1359, 1377, 1378, 1380, 1388, 1390, 1393, 1395, - 1402, 1416, 1436, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 1368, 1374, 382, 282, 306, 321, 1383, 618, 503, - 227, 467, 291, 251, 1401, 1403, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 1364, 1392, 377, 577, 578, 317, 397, 0, 0, 0, - 0, 0, 0, 1422, 1406, 529, 0, 1348, 1425, 1316, - 1335, 1435, 1338, 1341, 1385, 1294, 1363, 417, 1332, 1320, - 1289, 1327, 1290, 1318, 1350, 271, 1315, 1408, 1367, 1424, - 367, 268, 1296, 1287, 204, 506, 1321, 431, 1337, 203, - 1387, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 1431, 371, 1373, 0, 498, - 402, 0, 0, 0, 1412, 1411, 1342, 1352, 1414, 1361, - 1399, 1347, 1386, 1304, 1372, 1426, 1333, 1382, 1427, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 0, 508, 725, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 1329, 1379, 610, 1421, 1330, 1381, 266, 322, 273, - 265, 581, 1432, 1413, 1293, 1360, 1420, 1355, 597, 0, - 0, 229, 1423, 1354, 0, 1384, 0, 1438, 1288, 1375, - 0, 1291, 1295, 1434, 1418, 1324, 276, 0, 0, 0, - 0, 0, 0, 0, 1351, 1362, 1396, 1400, 1345, 0, - 0, 0, 0, 0, 0, 0, 0, 1322, 0, 1371, - 0, 0, 0, 1300, 1292, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1349, 0, 0, - 0, 0, 1303, 0, 1323, 1397, 0, 1286, 298, 1297, - 403, 258, 0, 454, 1404, 1417, 1346, 630, 1419, 1344, - 1343, 1391, 1301, 1410, 1336, 366, 1299, 331, 197, 225, - 0, 1334, 413, 462, 474, 1409, 1319, 1328, 254, 1326, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 1370, 1389, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 1298, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 1314, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 1405, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 1394, 1437, 426, 473, - 240, 607, 497, 199, 1308, 1313, 1306, 0, 255, 256, - 1376, 576, 1309, 1307, 1365, 1366, 1310, 1428, 1429, 1430, - 1415, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 1398, - 1302, 0, 1311, 1312, 399, 1407, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 1369, 196, 221, 369, 1433, - 455, 289, 651, 619, 485, 614, 206, 223, 1305, 263, - 1317, 1325, 0, 1331, 1339, 1340, 1353, 1356, 1357, 1358, - 1359, 1377, 1378, 1380, 1388, 1390, 1393, 1395, 1402, 1416, - 1436, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 1368, - 1374, 382, 282, 306, 321, 1383, 618, 503, 227, 467, - 291, 251, 1401, 1403, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 1364, 1392, - 377, 577, 578, 317, 397, 0, 0, 0, 0, 0, - 0, 1422, 1406, 529, 0, 1348, 1425, 1316, 1335, 1435, - 1338, 1341, 1385, 1294, 1363, 417, 1332, 1320, 1289, 1327, - 1290, 1318, 1350, 271, 1315, 1408, 1367, 1424, 367, 268, - 1296, 1287, 204, 506, 1321, 431, 1337, 203, 1387, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 1431, 371, 1373, 0, 498, 402, 0, - 0, 0, 1412, 1411, 1342, 1352, 1414, 1361, 1399, 1347, - 1386, 1304, 1372, 1426, 1333, 1382, 1427, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 0, 508, - 960, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 1329, - 1379, 610, 1421, 1330, 1381, 266, 322, 273, 265, 581, - 1432, 1413, 1293, 1360, 1420, 1355, 597, 0, 0, 229, - 1423, 1354, 0, 1384, 0, 1438, 1288, 1375, 0, 1291, - 1295, 1434, 1418, 1324, 276, 0, 0, 0, 0, 0, - 0, 0, 1351, 1362, 1396, 1400, 1345, 0, 0, 0, - 0, 0, 0, 0, 0, 1322, 0, 1371, 0, 0, - 0, 1300, 1292, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1349, 0, 0, 0, 0, - 1303, 0, 1323, 1397, 0, 1286, 298, 1297, 403, 258, - 0, 454, 1404, 1417, 1346, 630, 1419, 1344, 1343, 1391, - 1301, 1410, 1336, 366, 1299, 331, 197, 225, 0, 1334, - 413, 462, 474, 1409, 1319, 1328, 254, 1326, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 1370, 1389, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 1298, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 1314, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 1405, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 1394, 1437, 426, 473, 240, 607, - 497, 199, 1308, 1313, 1306, 0, 255, 256, 1376, 576, - 1309, 1307, 1365, 1366, 1310, 1428, 1429, 1430, 1415, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 1398, 1302, 0, - 1311, 1312, 399, 1407, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 1369, 196, 221, 369, 1433, 455, 289, - 651, 619, 485, 614, 206, 223, 1305, 263, 1317, 1325, - 0, 1331, 1339, 1340, 1353, 1356, 1357, 1358, 1359, 1377, - 1378, 1380, 1388, 1390, 1393, 1395, 1402, 1416, 1436, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 1368, 1374, 382, - 282, 306, 321, 1383, 618, 503, 227, 467, 291, 251, - 1401, 1403, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 1364, 1392, 377, 577, - 578, 317, 397, 0, 0, 0, 0, 0, 0, 0, - 0, 529, 0, 778, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 765, 0, 0, - 0, 271, 770, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 777, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 772, 773, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 95, 0, 0, 1024, 508, 960, 749, - 926, 964, 1025, 977, 978, 979, 965, 0, 238, 966, - 967, 245, 968, 0, 925, 808, 810, 809, 875, 876, - 877, 878, 879, 880, 881, 811, 812, 806, 973, 610, - 980, 981, 0, 266, 322, 273, 265, 581, 0, 0, - 2233, 2234, 2235, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 745, 762, 0, 776, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 759, - 760, 0, 0, 0, 0, 920, 0, 761, 0, 0, - 769, 982, 983, 984, 985, 986, 987, 988, 989, 990, + 0, 0, 0, 0, 1358, 0, 0, 0, 0, 1312, + 0, 1332, 1406, 0, 1295, 300, 1306, 406, 260, 0, + 459, 1413, 1426, 1355, 636, 1428, 1353, 1352, 1400, 1310, + 1419, 1345, 368, 1308, 333, 199, 227, 0, 1343, 416, + 467, 479, 1418, 1328, 1337, 256, 1335, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 1379, 1398, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 1307, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 1323, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 1414, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 1403, 1446, 429, 478, 242, 613, 502, + 201, 1317, 1322, 1315, 0, 257, 258, 1385, 581, 1318, + 1316, 1374, 1375, 1319, 1437, 1438, 1439, 1424, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 1407, 1311, 0, 1320, + 1321, 402, 1416, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 1378, 198, 223, 371, 1442, 460, 291, 657, + 625, 490, 620, 208, 225, 1314, 265, 1326, 1334, 0, + 1340, 1348, 1349, 1362, 1365, 1366, 1367, 1368, 1386, 1387, + 1389, 1397, 1399, 1402, 1404, 1411, 1425, 1445, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 1377, 1383, 384, 284, 308, 323, 1392, 624, 508, 229, + 472, 293, 253, 1410, 1412, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 1373, + 1401, 379, 582, 583, 319, 400, 0, 0, 0, 0, + 0, 0, 1431, 1415, 534, 0, 1357, 1434, 1325, 1344, + 1444, 1347, 1350, 1394, 1303, 1372, 420, 1341, 1329, 1298, + 1336, 1299, 1327, 1359, 273, 1324, 1417, 1376, 1433, 369, + 270, 1305, 1296, 206, 511, 1330, 435, 1346, 205, 1396, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 1440, 373, 1382, 0, 503, 405, + 0, 0, 0, 1421, 1420, 1351, 1361, 1423, 1370, 1408, + 1356, 1395, 1313, 1381, 1435, 1342, 1391, 1436, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 0, + 513, 196, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 1338, 1388, 616, 1430, 1339, 1390, 268, 324, 275, 267, + 587, 1441, 1422, 1302, 1369, 1429, 1364, 603, 0, 0, + 231, 1432, 1363, 0, 1393, 0, 1447, 1297, 1384, 0, + 1300, 1304, 1443, 1427, 1333, 278, 0, 0, 0, 0, + 0, 0, 0, 1360, 1371, 1405, 1409, 1354, 0, 0, + 0, 0, 0, 0, 3276, 0, 1331, 0, 1380, 0, + 0, 0, 1309, 1301, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1358, 0, 0, 0, + 0, 1312, 0, 1332, 1406, 0, 1295, 300, 1306, 406, + 260, 0, 459, 1413, 1426, 1355, 636, 1428, 1353, 1352, + 1400, 1310, 1419, 1345, 368, 1308, 333, 199, 227, 0, + 1343, 416, 467, 479, 1418, 1328, 1337, 256, 1335, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 1379, + 1398, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 1307, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 1323, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 1414, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 1403, 1446, 429, 478, 242, + 613, 502, 201, 1317, 1322, 1315, 0, 257, 258, 1385, + 581, 1318, 1316, 1374, 1375, 1319, 1437, 1438, 1439, 1424, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 1407, 1311, + 0, 1320, 1321, 402, 1416, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 1378, 198, 223, 371, 1442, 460, + 291, 657, 625, 490, 620, 208, 225, 1314, 265, 1326, + 1334, 0, 1340, 1348, 1349, 1362, 1365, 1366, 1367, 1368, + 1386, 1387, 1389, 1397, 1399, 1402, 1404, 1411, 1425, 1445, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 1377, 1383, 384, 284, 308, 323, 1392, 624, + 508, 229, 472, 293, 253, 1410, 1412, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 1373, 1401, 379, 582, 583, 319, 400, 0, 0, + 0, 0, 0, 0, 1431, 1415, 534, 0, 1357, 1434, + 1325, 1344, 1444, 1347, 1350, 1394, 1303, 1372, 420, 1341, + 1329, 1298, 1336, 1299, 1327, 1359, 273, 1324, 1417, 1376, + 1433, 369, 270, 1305, 1296, 206, 511, 1330, 435, 1346, + 205, 1396, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 1440, 373, 1382, 0, + 503, 405, 0, 0, 0, 1421, 1420, 1351, 1361, 1423, + 1370, 1408, 1356, 1395, 1313, 1381, 1435, 1342, 1391, 1436, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 731, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 1338, 1388, 616, 1430, 1339, 1390, 268, 324, + 275, 267, 587, 1441, 1422, 1302, 1369, 1429, 1364, 603, + 0, 0, 231, 1432, 1363, 0, 1393, 0, 1447, 1297, + 1384, 0, 1300, 1304, 1443, 1427, 1333, 278, 0, 0, + 0, 0, 0, 0, 0, 1360, 1371, 1405, 1409, 1354, + 0, 0, 0, 0, 0, 0, 3237, 0, 1331, 0, + 1380, 0, 0, 0, 1309, 1301, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1358, 0, + 0, 0, 0, 1312, 0, 1332, 1406, 0, 1295, 300, + 1306, 406, 260, 0, 459, 1413, 1426, 1355, 636, 1428, + 1353, 1352, 1400, 1310, 1419, 1345, 368, 1308, 333, 199, + 227, 0, 1343, 416, 467, 479, 1418, 1328, 1337, 256, + 1335, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 1379, 1398, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 1307, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 1323, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 1414, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 1403, 1446, 429, + 478, 242, 613, 502, 201, 1317, 1322, 1315, 0, 257, + 258, 1385, 581, 1318, 1316, 1374, 1375, 1319, 1437, 1438, + 1439, 1424, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 1407, 1311, 0, 1320, 1321, 402, 1416, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 1378, 198, 223, 371, + 1442, 460, 291, 657, 625, 490, 620, 208, 225, 1314, + 265, 1326, 1334, 0, 1340, 1348, 1349, 1362, 1365, 1366, + 1367, 1368, 1386, 1387, 1389, 1397, 1399, 1402, 1404, 1411, + 1425, 1445, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 1377, 1383, 384, 284, 308, 323, + 1392, 624, 508, 229, 472, 293, 253, 1410, 1412, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 1373, 1401, 379, 582, 583, 319, 400, + 0, 0, 0, 0, 0, 0, 1431, 1415, 534, 0, + 1357, 1434, 1325, 1344, 1444, 1347, 1350, 1394, 1303, 1372, + 420, 1341, 1329, 1298, 1336, 1299, 1327, 1359, 273, 1324, + 1417, 1376, 1433, 369, 270, 1305, 1296, 206, 511, 1330, + 435, 1346, 205, 1396, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 1440, 373, + 1382, 0, 503, 405, 0, 0, 0, 1421, 1420, 1351, + 1361, 1423, 1370, 1408, 1356, 1395, 1313, 1381, 1435, 1342, + 1391, 1436, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 0, 513, 966, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 1338, 1388, 616, 1430, 1339, 1390, + 268, 324, 275, 267, 587, 1441, 1422, 1302, 1369, 1429, + 1364, 603, 0, 0, 231, 1432, 1363, 0, 1393, 0, + 1447, 1297, 1384, 0, 1300, 1304, 1443, 1427, 1333, 278, + 0, 0, 0, 0, 0, 0, 0, 1360, 1371, 1405, + 1409, 1354, 0, 0, 0, 0, 0, 0, 2428, 0, + 1331, 0, 1380, 0, 0, 0, 1309, 1301, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1358, 0, 0, 0, 0, 1312, 0, 1332, 1406, 0, + 1295, 300, 1306, 406, 260, 0, 459, 1413, 1426, 1355, + 636, 1428, 1353, 1352, 1400, 1310, 1419, 1345, 368, 1308, + 333, 199, 227, 0, 1343, 416, 467, 479, 1418, 1328, + 1337, 256, 1335, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 1379, 1398, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 1307, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 1323, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 1414, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 1403, + 1446, 429, 478, 242, 613, 502, 201, 1317, 1322, 1315, + 0, 257, 258, 1385, 581, 1318, 1316, 1374, 1375, 1319, + 1437, 1438, 1439, 1424, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 1407, 1311, 0, 1320, 1321, 402, 1416, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 1378, 198, + 223, 371, 1442, 460, 291, 657, 625, 490, 620, 208, + 225, 1314, 265, 1326, 1334, 0, 1340, 1348, 1349, 1362, + 1365, 1366, 1367, 1368, 1386, 1387, 1389, 1397, 1399, 1402, + 1404, 1411, 1425, 1445, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 1377, 1383, 384, 284, + 308, 323, 1392, 624, 508, 229, 472, 293, 253, 1410, + 1412, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 1373, 1401, 379, 582, 583, + 319, 400, 0, 0, 0, 0, 0, 0, 1431, 1415, + 534, 0, 1357, 1434, 1325, 1344, 1444, 1347, 1350, 1394, + 1303, 1372, 420, 1341, 1329, 1298, 1336, 1299, 1327, 1359, + 273, 1324, 1417, 1376, 1433, 369, 270, 1305, 1296, 206, + 511, 1330, 435, 1346, 205, 1396, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 1440, 373, 1382, 0, 503, 405, 0, 0, 0, 1421, + 1420, 1351, 1361, 1423, 1370, 1408, 1356, 1395, 1313, 1381, + 1435, 1342, 1391, 1436, 326, 250, 328, 204, 417, 504, + 289, 0, 95, 0, 0, 0, 513, 731, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 1338, 1388, 616, 1430, + 1339, 1390, 268, 324, 275, 267, 587, 1441, 1422, 1302, + 1369, 1429, 1364, 603, 0, 0, 231, 1432, 1363, 0, + 1393, 0, 1447, 1297, 1384, 0, 1300, 1304, 1443, 1427, + 1333, 278, 0, 0, 0, 0, 0, 0, 0, 1360, + 1371, 1405, 1409, 1354, 0, 0, 0, 0, 0, 0, + 0, 0, 1331, 0, 1380, 0, 0, 0, 1309, 1301, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1358, 0, 0, 0, 0, 1312, 0, 1332, + 1406, 0, 1295, 300, 1306, 406, 260, 0, 459, 1413, + 1426, 1355, 636, 1428, 1353, 1352, 1400, 1310, 1419, 1345, + 368, 1308, 333, 199, 227, 0, 1343, 416, 467, 479, + 1418, 1328, 1337, 256, 1335, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 1379, 1398, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 1307, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 1323, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 1414, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 1403, 1446, 429, 478, 242, 613, 502, 201, 1317, + 1322, 1315, 0, 257, 258, 1385, 581, 1318, 1316, 1374, + 1375, 1319, 1437, 1438, 1439, 1424, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 1407, 1311, 0, 1320, 1321, 402, + 1416, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 1378, 198, 223, 371, 1442, 460, 291, 657, 625, 490, + 620, 208, 225, 1314, 265, 1326, 1334, 0, 1340, 1348, + 1349, 1362, 1365, 1366, 1367, 1368, 1386, 1387, 1389, 1397, + 1399, 1402, 1404, 1411, 1425, 1445, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 1377, 1383, + 384, 284, 308, 323, 1392, 624, 508, 229, 472, 293, + 253, 1410, 1412, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 1373, 1401, 379, + 582, 583, 319, 400, 0, 0, 0, 0, 0, 0, + 1431, 1415, 534, 0, 1357, 1434, 1325, 1344, 1444, 1347, + 1350, 1394, 1303, 1372, 420, 1341, 1329, 1298, 1336, 1299, + 1327, 1359, 273, 1324, 1417, 1376, 1433, 369, 270, 1305, + 1296, 206, 511, 1330, 435, 1346, 205, 1396, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 1440, 373, 1382, 0, 503, 405, 0, 0, + 0, 1421, 1420, 1351, 1361, 1423, 1370, 1408, 1356, 1395, + 1313, 1381, 1435, 1342, 1391, 1436, 326, 250, 328, 204, + 417, 504, 289, 0, 0, 0, 0, 0, 513, 196, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 1338, 1388, + 616, 1430, 1339, 1390, 268, 324, 275, 267, 587, 1441, + 1422, 1302, 1369, 1429, 1364, 603, 0, 0, 231, 1432, + 1363, 0, 1393, 0, 1447, 1297, 1384, 0, 1300, 1304, + 1443, 1427, 1333, 278, 0, 0, 0, 0, 0, 0, + 0, 1360, 1371, 1405, 1409, 1354, 0, 0, 0, 0, + 0, 0, 0, 0, 1331, 0, 1380, 0, 0, 0, + 1309, 1301, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1358, 0, 0, 0, 0, 1312, + 0, 1332, 1406, 0, 1295, 300, 1306, 406, 260, 0, + 459, 1413, 1426, 1355, 636, 1428, 1353, 1352, 1400, 1310, + 1419, 1345, 368, 1308, 333, 199, 227, 0, 1343, 416, + 467, 479, 1418, 1328, 1337, 256, 1335, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 1379, 1398, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 1307, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 1323, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 1414, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 1403, 1446, 429, 478, 242, 613, 502, + 201, 1317, 1322, 1315, 0, 257, 258, 1385, 581, 1318, + 1316, 1374, 1375, 1319, 1437, 1438, 1439, 1424, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 1407, 1311, 0, 1320, + 1321, 402, 1416, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 1378, 198, 223, 371, 1442, 460, 291, 657, + 625, 490, 620, 208, 225, 1314, 265, 1326, 1334, 0, + 1340, 1348, 1349, 1362, 1365, 1366, 1367, 1368, 1386, 1387, + 1389, 1397, 1399, 1402, 1404, 1411, 1425, 1445, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 1377, 1383, 384, 284, 308, 323, 1392, 624, 508, 229, + 472, 293, 253, 1410, 1412, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 1373, + 1401, 379, 582, 583, 319, 400, 0, 0, 0, 0, + 0, 0, 1431, 1415, 534, 0, 1357, 1434, 1325, 1344, + 1444, 1347, 1350, 1394, 1303, 1372, 420, 1341, 1329, 1298, + 1336, 1299, 1327, 1359, 273, 1324, 1417, 1376, 1433, 369, + 270, 1305, 1296, 206, 511, 1330, 435, 1346, 205, 1396, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 1440, 373, 1382, 0, 503, 405, + 0, 0, 0, 1421, 1420, 1351, 1361, 1423, 1370, 1408, + 1356, 1395, 1313, 1381, 1435, 1342, 1391, 1436, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 0, + 513, 731, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 1338, 1388, 616, 1430, 1339, 1390, 268, 324, 275, 267, + 587, 1441, 1422, 1302, 1369, 1429, 1364, 603, 0, 0, + 231, 1432, 1363, 0, 1393, 0, 1447, 1297, 1384, 0, + 1300, 1304, 1443, 1427, 1333, 278, 0, 0, 0, 0, + 0, 0, 0, 1360, 1371, 1405, 1409, 1354, 0, 0, + 0, 0, 0, 0, 0, 0, 1331, 0, 1380, 0, + 0, 0, 1309, 1301, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1358, 0, 0, 0, + 0, 1312, 0, 1332, 1406, 0, 1295, 300, 1306, 406, + 260, 0, 459, 1413, 1426, 1355, 636, 1428, 1353, 1352, + 1400, 1310, 1419, 1345, 368, 1308, 333, 199, 227, 0, + 1343, 416, 467, 479, 1418, 1328, 1337, 256, 1335, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 1379, + 1398, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 1307, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 1323, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 1414, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 1403, 1446, 429, 478, 242, + 613, 502, 201, 1317, 1322, 1315, 0, 257, 258, 1385, + 581, 1318, 1316, 1374, 1375, 1319, 1437, 1438, 1439, 1424, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 1407, 1311, + 0, 1320, 1321, 402, 1416, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 1378, 198, 223, 371, 1442, 460, + 291, 657, 625, 490, 620, 208, 225, 1314, 265, 1326, + 1334, 0, 1340, 1348, 1349, 1362, 1365, 1366, 1367, 1368, + 1386, 1387, 1389, 1397, 1399, 1402, 1404, 1411, 1425, 1445, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 1377, 1383, 384, 284, 308, 323, 1392, 624, + 508, 229, 472, 293, 253, 1410, 1412, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 1373, 1401, 379, 582, 583, 319, 400, 0, 0, + 0, 0, 0, 0, 1431, 1415, 534, 0, 1357, 1434, + 1325, 1344, 1444, 1347, 1350, 1394, 1303, 1372, 420, 1341, + 1329, 1298, 1336, 1299, 1327, 1359, 273, 1324, 1417, 1376, + 1433, 369, 270, 1305, 1296, 206, 511, 1330, 435, 1346, + 205, 1396, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 1440, 373, 1382, 0, + 503, 405, 0, 0, 0, 1421, 1420, 1351, 1361, 1423, + 1370, 1408, 1356, 1395, 1313, 1381, 1435, 1342, 1391, 1436, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 966, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 1338, 1388, 616, 1430, 1339, 1390, 268, 324, + 275, 267, 587, 1441, 1422, 1302, 1369, 1429, 1364, 603, + 0, 0, 231, 1432, 1363, 0, 1393, 0, 1447, 1297, + 1384, 0, 1300, 1304, 1443, 1427, 1333, 278, 0, 0, + 0, 0, 0, 0, 0, 1360, 1371, 1405, 1409, 1354, + 0, 0, 0, 0, 0, 0, 0, 0, 1331, 0, + 1380, 0, 0, 0, 1309, 1301, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1358, 0, + 0, 0, 0, 1312, 0, 1332, 1406, 0, 1295, 300, + 1306, 406, 260, 0, 459, 1413, 1426, 1355, 636, 1428, + 1353, 1352, 1400, 1310, 1419, 1345, 368, 1308, 333, 199, + 227, 0, 1343, 416, 467, 479, 1418, 1328, 1337, 256, + 1335, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 1379, 1398, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 1307, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 1323, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 1414, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 1403, 1446, 429, + 478, 242, 613, 502, 201, 1317, 1322, 1315, 0, 257, + 258, 1385, 581, 1318, 1316, 1374, 1375, 1319, 1437, 1438, + 1439, 1424, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 1407, 1311, 0, 1320, 1321, 402, 1416, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 1378, 198, 223, 371, + 1442, 460, 291, 657, 625, 490, 620, 208, 225, 1314, + 265, 1326, 1334, 0, 1340, 1348, 1349, 1362, 1365, 1366, + 1367, 1368, 1386, 1387, 1389, 1397, 1399, 1402, 1404, 1411, + 1425, 1445, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 1377, 1383, 384, 284, 308, 323, + 1392, 624, 508, 229, 472, 293, 253, 1410, 1412, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 1373, 1401, 379, 582, 583, 319, 400, + 0, 0, 0, 0, 0, 0, 0, 0, 534, 0, + 784, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 771, 0, 0, 0, 273, 776, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 783, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 778, 779, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 95, 0, 0, 1032, 513, 966, 755, 932, 970, 1033, + 984, 985, 986, 971, 0, 240, 972, 973, 247, 974, + 0, 931, 814, 816, 815, 881, 882, 883, 884, 885, + 886, 887, 817, 818, 812, 979, 616, 987, 988, 0, + 268, 324, 275, 267, 587, 0, 0, 2248, 2249, 2250, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 751, 768, 0, 782, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 765, 766, 0, 0, + 0, 0, 926, 0, 767, 0, 0, 775, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, - 1021, 1022, 1023, 771, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 919, 0, 0, 630, 0, 0, 917, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 970, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 971, 972, 257, 653, 816, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 824, 825, 281, 308, 901, 900, - 899, 307, 309, 897, 898, 896, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 907, - 929, 918, 782, 783, 908, 909, 933, 910, 785, 786, - 930, 931, 779, 780, 784, 932, 934, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 921, 768, 767, 0, 774, - 775, 0, 804, 805, 807, 813, 814, 815, 826, 873, - 874, 882, 884, 885, 883, 886, 887, 888, 891, 892, - 893, 894, 889, 890, 895, 787, 791, 788, 789, 790, - 802, 792, 793, 794, 795, 796, 797, 798, 799, 800, - 801, 803, 944, 945, 946, 947, 948, 949, 819, 823, - 822, 820, 821, 817, 818, 845, 844, 846, 847, 848, - 849, 850, 851, 853, 852, 854, 855, 856, 857, 858, - 859, 827, 828, 831, 832, 830, 829, 833, 842, 843, - 834, 835, 836, 837, 838, 839, 841, 840, 860, 861, - 862, 863, 864, 866, 865, 869, 870, 868, 867, 872, - 871, 766, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 935, 263, 936, 0, 0, 940, - 0, 0, 0, 942, 941, 0, 943, 905, 904, 0, - 0, 937, 938, 0, 939, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 950, - 951, 952, 953, 954, 955, 956, 957, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 975, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 778, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 765, - 0, 0, 0, 271, 770, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 777, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 772, 773, 0, - 0, 0, 0, 0, 0, 2440, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 95, 0, 0, 1024, 508, - 960, 749, 926, 964, 1025, 977, 978, 979, 965, 0, - 238, 966, 967, 245, 968, 0, 925, 808, 810, 809, - 875, 876, 877, 878, 879, 880, 881, 811, 812, 806, - 973, 610, 980, 981, 2441, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 745, 762, 0, - 776, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 759, 760, 0, 0, 0, 0, 920, 0, 761, - 0, 0, 769, 982, 983, 984, 985, 986, 987, 988, + 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 925, 0, 0, + 636, 0, 0, 923, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 976, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 977, 978, 259, 659, 822, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 830, 831, 283, 310, 907, 906, 905, 309, 311, + 903, 904, 902, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 913, 935, 924, 788, + 789, 914, 915, 939, 916, 791, 792, 936, 937, 785, + 786, 790, 938, 940, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 927, 774, 773, 0, 780, 781, 0, 810, + 811, 813, 819, 820, 821, 832, 879, 880, 888, 890, + 891, 889, 892, 893, 894, 897, 898, 899, 900, 895, + 896, 901, 793, 797, 794, 795, 796, 808, 798, 799, + 800, 801, 802, 803, 804, 805, 806, 807, 809, 950, + 951, 952, 953, 954, 955, 825, 829, 828, 826, 827, + 823, 824, 851, 850, 852, 853, 854, 855, 856, 857, + 859, 858, 860, 861, 862, 863, 864, 865, 833, 834, + 837, 838, 836, 835, 839, 848, 849, 840, 841, 842, + 843, 844, 845, 847, 846, 866, 867, 868, 869, 870, + 872, 871, 875, 876, 874, 873, 878, 877, 772, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 941, 265, 942, 0, 0, 946, 0, 0, 0, + 948, 947, 0, 949, 911, 910, 0, 0, 943, 944, + 0, 945, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 956, 957, 958, 959, 960, 961, 962, 963, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 1031, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 784, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 771, 0, 0, 0, 273, 776, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 783, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 778, 779, + 0, 0, 0, 0, 0, 0, 2457, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 95, 0, 0, 1032, + 513, 966, 755, 932, 970, 1033, 984, 985, 986, 971, + 0, 240, 972, 973, 247, 974, 0, 931, 814, 816, + 815, 881, 882, 883, 884, 885, 886, 887, 817, 818, + 812, 979, 616, 987, 988, 2458, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 751, 768, + 0, 782, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 765, 766, 0, 0, 0, 0, 926, 0, + 767, 0, 0, 775, 989, 990, 991, 992, 993, 994, + 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, + 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, + 1025, 1026, 1027, 1028, 1029, 1030, 777, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 925, 0, 0, 636, 0, 0, 923, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 976, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 977, 978, + 259, 659, 822, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 830, 831, 283, + 310, 907, 906, 905, 309, 311, 903, 904, 902, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 913, 935, 924, 788, 789, 914, 915, 939, + 916, 791, 792, 936, 937, 785, 786, 790, 938, 940, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 927, 774, + 773, 0, 780, 781, 0, 810, 811, 813, 819, 820, + 821, 832, 879, 880, 888, 890, 891, 889, 892, 893, + 894, 897, 898, 899, 900, 895, 896, 901, 793, 797, + 794, 795, 796, 808, 798, 799, 800, 801, 802, 803, + 804, 805, 806, 807, 809, 950, 951, 952, 953, 954, + 955, 825, 829, 828, 826, 827, 823, 824, 851, 850, + 852, 853, 854, 855, 856, 857, 859, 858, 860, 861, + 862, 863, 864, 865, 833, 834, 837, 838, 836, 835, + 839, 848, 849, 840, 841, 842, 843, 844, 845, 847, + 846, 866, 867, 868, 869, 870, 872, 871, 875, 876, + 874, 873, 878, 877, 772, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 941, 265, 942, + 0, 0, 946, 0, 0, 0, 948, 947, 0, 949, + 911, 910, 0, 0, 943, 944, 0, 945, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 956, 957, 958, 959, + 960, 961, 962, 963, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 1031, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 86, + 534, 0, 784, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 771, 0, 0, 0, + 273, 776, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 1727, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 778, 779, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 95, 0, 0, 1032, 513, 966, 755, 932, + 970, 1033, 984, 985, 986, 971, 0, 240, 972, 973, + 247, 974, 0, 931, 814, 816, 815, 881, 882, 883, + 884, 885, 886, 887, 817, 818, 812, 979, 616, 987, + 988, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 751, 768, 0, 782, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 765, 766, + 0, 0, 0, 0, 926, 0, 767, 0, 0, 775, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, - 1019, 1020, 1021, 1022, 1023, 771, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 919, 0, 0, 630, 0, 0, 917, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 970, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 971, 972, 257, - 653, 816, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 824, 825, 281, 308, - 901, 900, 899, 307, 309, 897, 898, 896, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 907, 929, 918, 782, 783, 908, 909, 933, 910, - 785, 786, 930, 931, 779, 780, 784, 932, 934, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 921, 768, 767, - 0, 774, 775, 0, 804, 805, 807, 813, 814, 815, - 826, 873, 874, 882, 884, 885, 883, 886, 887, 888, - 891, 892, 893, 894, 889, 890, 895, 787, 791, 788, - 789, 790, 802, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 803, 944, 945, 946, 947, 948, 949, - 819, 823, 822, 820, 821, 817, 818, 845, 844, 846, - 847, 848, 849, 850, 851, 853, 852, 854, 855, 856, - 857, 858, 859, 827, 828, 831, 832, 830, 829, 833, - 842, 843, 834, 835, 836, 837, 838, 839, 841, 840, - 860, 861, 862, 863, 864, 866, 865, 869, 870, 868, - 867, 872, 871, 766, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 935, 263, 936, 0, - 0, 940, 0, 0, 0, 942, 941, 0, 943, 905, - 904, 0, 0, 937, 938, 0, 939, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 950, 951, 952, 953, 954, 955, 956, 957, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 975, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 86, 529, 0, 778, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 765, 0, 0, 0, 271, 770, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 777, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 772, - 773, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 95, 0, 0, - 1024, 508, 960, 749, 926, 964, 1025, 977, 978, 979, - 965, 0, 238, 966, 967, 245, 968, 0, 925, 808, - 810, 809, 875, 876, 877, 878, 879, 880, 881, 811, - 812, 806, 973, 610, 980, 981, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 745, - 762, 0, 776, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 759, 760, 0, 0, 0, 0, 920, - 0, 761, 0, 0, 769, 982, 983, 984, 985, 986, - 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, - 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, - 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, - 1017, 1018, 1019, 1020, 1021, 1022, 1023, 771, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 919, 0, 0, 630, 0, 0, - 917, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 970, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 971, - 972, 257, 653, 816, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 824, 825, - 281, 308, 901, 900, 899, 307, 309, 897, 898, 896, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 907, 929, 918, 782, 783, 908, 909, - 933, 910, 785, 786, 930, 931, 779, 780, 784, 932, - 934, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 921, - 768, 767, 0, 774, 775, 0, 804, 805, 807, 813, - 814, 815, 826, 873, 874, 882, 884, 885, 883, 886, - 887, 888, 891, 892, 893, 894, 889, 890, 895, 787, - 791, 788, 789, 790, 802, 792, 793, 794, 795, 796, - 797, 798, 799, 800, 801, 803, 944, 945, 946, 947, - 948, 949, 819, 823, 822, 820, 821, 817, 818, 845, - 844, 846, 847, 848, 849, 850, 851, 853, 852, 854, - 855, 856, 857, 858, 859, 827, 828, 831, 832, 830, - 829, 833, 842, 843, 834, 835, 836, 837, 838, 839, - 841, 840, 860, 861, 862, 863, 864, 866, 865, 869, - 870, 868, 867, 872, 871, 766, 196, 221, 369, 94, - 455, 289, 651, 619, 485, 614, 206, 223, 935, 263, - 936, 0, 0, 940, 0, 0, 0, 942, 941, 0, - 943, 905, 904, 0, 0, 937, 938, 0, 939, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 950, 951, 952, 953, 954, 955, 956, - 957, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 975, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 778, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 765, 0, 0, 0, 271, 770, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 777, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 772, 773, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 95, - 0, 0, 1024, 508, 960, 749, 926, 964, 1025, 977, - 978, 979, 965, 0, 238, 966, 967, 245, 968, 0, - 925, 808, 810, 809, 875, 876, 877, 878, 879, 880, - 881, 811, 812, 806, 973, 610, 980, 981, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 745, 762, 0, 776, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 759, 760, 0, 0, 0, - 0, 920, 0, 761, 0, 0, 769, 982, 983, 984, - 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, - 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, - 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, - 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 771, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 919, 0, 0, 630, - 0, 0, 917, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 970, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 4098, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 971, 972, 257, 653, 816, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 824, 825, 281, 308, 901, 900, 899, 307, 309, 897, - 898, 896, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 907, 929, 918, 782, 783, - 908, 909, 933, 910, 785, 786, 930, 931, 779, 780, - 784, 932, 934, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 921, 768, 767, 0, 774, 775, 0, 804, 805, - 807, 813, 814, 815, 826, 873, 874, 882, 884, 885, - 883, 886, 887, 888, 891, 892, 893, 894, 889, 890, - 895, 787, 791, 788, 789, 790, 802, 792, 793, 794, - 795, 796, 797, 798, 799, 800, 801, 803, 944, 945, - 946, 947, 948, 949, 819, 823, 822, 820, 821, 817, - 818, 845, 844, 846, 847, 848, 849, 850, 851, 853, - 852, 854, 855, 856, 857, 858, 859, 827, 828, 831, - 832, 830, 829, 833, 842, 843, 834, 835, 836, 837, - 838, 839, 841, 840, 860, 861, 862, 863, 864, 866, - 865, 869, 870, 868, 867, 872, 871, 766, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 935, 263, 936, 0, 0, 940, 0, 0, 0, 942, - 941, 0, 943, 905, 904, 0, 0, 937, 938, 0, - 939, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 950, 951, 952, 953, 954, - 955, 956, 957, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 975, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 778, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 765, 0, 0, 0, 271, - 770, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 777, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 772, 773, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 95, 0, 1754, 1024, 508, 960, 749, 926, 964, - 1025, 977, 978, 979, 965, 0, 238, 966, 967, 245, - 968, 0, 925, 808, 810, 809, 875, 876, 877, 878, - 879, 880, 881, 811, 812, 806, 973, 610, 980, 981, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 745, 762, 0, 776, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 759, 760, 0, - 0, 0, 0, 920, 0, 761, 0, 0, 769, 982, - 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, + 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, + 1029, 1030, 777, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 925, + 0, 0, 636, 0, 0, 923, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 976, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 977, 978, 259, 659, 822, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 830, 831, 283, 310, 907, 906, 905, + 309, 311, 903, 904, 902, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 913, 935, + 924, 788, 789, 914, 915, 939, 916, 791, 792, 936, + 937, 785, 786, 790, 938, 940, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 927, 774, 773, 0, 780, 781, + 0, 810, 811, 813, 819, 820, 821, 832, 879, 880, + 888, 890, 891, 889, 892, 893, 894, 897, 898, 899, + 900, 895, 896, 901, 793, 797, 794, 795, 796, 808, + 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, + 809, 950, 951, 952, 953, 954, 955, 825, 829, 828, + 826, 827, 823, 824, 851, 850, 852, 853, 854, 855, + 856, 857, 859, 858, 860, 861, 862, 863, 864, 865, + 833, 834, 837, 838, 836, 835, 839, 848, 849, 840, + 841, 842, 843, 844, 845, 847, 846, 866, 867, 868, + 869, 870, 872, 871, 875, 876, 874, 873, 878, 877, + 772, 198, 223, 371, 94, 460, 291, 657, 625, 490, + 620, 208, 225, 941, 265, 942, 0, 0, 946, 0, + 0, 0, 948, 947, 0, 949, 911, 910, 0, 0, + 943, 944, 0, 945, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 956, 957, 958, 959, 960, 961, 962, 963, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 1031, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 784, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 771, 0, 0, 0, 273, 776, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 783, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 778, 779, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 95, 0, + 0, 1032, 513, 966, 755, 932, 970, 1033, 984, 985, + 986, 971, 0, 240, 972, 973, 247, 974, 0, 931, + 814, 816, 815, 881, 882, 883, 884, 885, 886, 887, + 817, 818, 812, 979, 616, 987, 988, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 751, 768, 0, 782, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 765, 766, 0, 0, 0, 0, + 926, 0, 767, 0, 0, 775, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, - 1023, 771, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 919, 0, - 0, 630, 0, 0, 917, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 970, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 971, 972, 257, 653, 816, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 824, 825, 281, 308, 901, 900, 899, 307, - 309, 897, 898, 896, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 907, 929, 918, - 782, 783, 908, 909, 933, 910, 785, 786, 930, 931, - 779, 780, 784, 932, 934, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 921, 768, 767, 0, 774, 775, 0, - 804, 805, 807, 813, 814, 815, 826, 873, 874, 882, - 884, 885, 883, 886, 887, 888, 891, 892, 893, 894, - 889, 890, 895, 787, 791, 788, 789, 790, 802, 792, - 793, 794, 795, 796, 797, 798, 799, 800, 801, 803, - 944, 945, 946, 947, 948, 949, 819, 823, 822, 820, - 821, 817, 818, 845, 844, 846, 847, 848, 849, 850, - 851, 853, 852, 854, 855, 856, 857, 858, 859, 827, - 828, 831, 832, 830, 829, 833, 842, 843, 834, 835, - 836, 837, 838, 839, 841, 840, 860, 861, 862, 863, - 864, 866, 865, 869, 870, 868, 867, 872, 871, 766, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 935, 263, 936, 0, 0, 940, 0, 0, - 0, 942, 941, 0, 943, 905, 904, 0, 0, 937, - 938, 0, 939, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 950, 951, 952, - 953, 954, 955, 956, 957, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 975, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 778, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 765, 0, 0, - 0, 271, 770, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 777, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 772, 773, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 95, 0, 0, 1024, 508, 960, 749, - 926, 964, 1025, 977, 978, 979, 965, 0, 238, 966, - 967, 245, 968, 0, 925, 808, 810, 809, 875, 876, - 877, 878, 879, 880, 881, 811, 812, 806, 973, 610, - 980, 981, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 745, 762, 0, 776, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 759, - 760, 1070, 0, 0, 0, 920, 0, 761, 0, 0, - 769, 982, 983, 984, 985, 986, 987, 988, 989, 990, + 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 777, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 925, 0, 0, 636, 0, + 0, 923, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 976, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 4117, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 977, 978, 259, 659, 822, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 830, + 831, 283, 310, 907, 906, 905, 309, 311, 903, 904, + 902, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 913, 935, 924, 788, 789, 914, + 915, 939, 916, 791, 792, 936, 937, 785, 786, 790, + 938, 940, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 927, 774, 773, 0, 780, 781, 0, 810, 811, 813, + 819, 820, 821, 832, 879, 880, 888, 890, 891, 889, + 892, 893, 894, 897, 898, 899, 900, 895, 896, 901, + 793, 797, 794, 795, 796, 808, 798, 799, 800, 801, + 802, 803, 804, 805, 806, 807, 809, 950, 951, 952, + 953, 954, 955, 825, 829, 828, 826, 827, 823, 824, + 851, 850, 852, 853, 854, 855, 856, 857, 859, 858, + 860, 861, 862, 863, 864, 865, 833, 834, 837, 838, + 836, 835, 839, 848, 849, 840, 841, 842, 843, 844, + 845, 847, 846, 866, 867, 868, 869, 870, 872, 871, + 875, 876, 874, 873, 878, 877, 772, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 941, + 265, 942, 0, 0, 946, 0, 0, 0, 948, 947, + 0, 949, 911, 910, 0, 0, 943, 944, 0, 945, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 956, 957, + 958, 959, 960, 961, 962, 963, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 1031, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 784, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 771, 0, + 0, 0, 273, 776, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 783, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 778, 779, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 95, 0, 1764, 1032, 513, 966, + 755, 932, 970, 1033, 984, 985, 986, 971, 0, 240, + 972, 973, 247, 974, 0, 931, 814, 816, 815, 881, + 882, 883, 884, 885, 886, 887, 817, 818, 812, 979, + 616, 987, 988, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 751, 768, 0, 782, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 765, 766, 0, 0, 0, 0, 926, 0, 767, 0, + 0, 775, 989, 990, 991, 992, 993, 994, 995, 996, + 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, + 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, + 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, + 1027, 1028, 1029, 1030, 777, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 925, 0, 0, 636, 0, 0, 923, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 976, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 977, 978, 259, 659, + 822, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 830, 831, 283, 310, 907, + 906, 905, 309, 311, 903, 904, 902, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 913, 935, 924, 788, 789, 914, 915, 939, 916, 791, + 792, 936, 937, 785, 786, 790, 938, 940, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 927, 774, 773, 0, + 780, 781, 0, 810, 811, 813, 819, 820, 821, 832, + 879, 880, 888, 890, 891, 889, 892, 893, 894, 897, + 898, 899, 900, 895, 896, 901, 793, 797, 794, 795, + 796, 808, 798, 799, 800, 801, 802, 803, 804, 805, + 806, 807, 809, 950, 951, 952, 953, 954, 955, 825, + 829, 828, 826, 827, 823, 824, 851, 850, 852, 853, + 854, 855, 856, 857, 859, 858, 860, 861, 862, 863, + 864, 865, 833, 834, 837, 838, 836, 835, 839, 848, + 849, 840, 841, 842, 843, 844, 845, 847, 846, 866, + 867, 868, 869, 870, 872, 871, 875, 876, 874, 873, + 878, 877, 772, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 941, 265, 942, 0, 0, + 946, 0, 0, 0, 948, 947, 0, 949, 911, 910, + 0, 0, 943, 944, 0, 945, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 956, 957, 958, 959, 960, 961, + 962, 963, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 1031, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 784, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 771, 0, 0, 0, 273, 776, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 783, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 778, 779, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 95, 0, 0, 1032, 513, 966, 755, 932, 970, 1033, + 984, 985, 986, 971, 0, 240, 972, 973, 247, 974, + 0, 931, 814, 816, 815, 881, 882, 883, 884, 885, + 886, 887, 817, 818, 812, 979, 616, 987, 988, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 751, 768, 0, 782, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 765, 766, 1079, 0, + 0, 0, 926, 0, 767, 0, 0, 775, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, - 1021, 1022, 1023, 771, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 919, 0, 0, 630, 0, 0, 917, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 970, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 971, 972, 257, 653, 816, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 824, 825, 281, 308, 901, 900, - 899, 307, 309, 897, 898, 896, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 907, - 929, 918, 782, 783, 908, 909, 933, 910, 785, 786, - 930, 931, 779, 780, 784, 932, 934, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 921, 768, 767, 0, 774, - 775, 0, 804, 805, 807, 813, 814, 815, 826, 873, - 874, 882, 884, 885, 883, 886, 887, 888, 891, 892, - 893, 894, 889, 890, 895, 787, 791, 788, 789, 790, - 802, 792, 793, 794, 795, 796, 797, 798, 799, 800, - 801, 803, 944, 945, 946, 947, 948, 949, 819, 823, - 822, 820, 821, 817, 818, 845, 844, 846, 847, 848, - 849, 850, 851, 853, 852, 854, 855, 856, 857, 858, - 859, 827, 828, 831, 832, 830, 829, 833, 842, 843, - 834, 835, 836, 837, 838, 839, 841, 840, 860, 861, - 862, 863, 864, 866, 865, 869, 870, 868, 867, 872, - 871, 766, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 935, 263, 936, 0, 0, 940, - 0, 0, 0, 942, 941, 0, 943, 905, 904, 0, - 0, 937, 938, 0, 939, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 950, - 951, 952, 953, 954, 955, 956, 957, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 975, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 778, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 765, - 0, 0, 0, 271, 770, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 777, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 772, 773, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 95, 0, 0, 1024, 508, - 960, 749, 926, 964, 1025, 977, 978, 979, 965, 0, - 238, 966, 967, 245, 968, 0, 925, 808, 810, 809, - 875, 876, 877, 878, 879, 880, 881, 811, 812, 806, - 973, 610, 980, 981, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 745, 762, 0, - 776, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 759, 760, 0, 0, 0, 0, 920, 0, 761, - 0, 0, 769, 982, 983, 984, 985, 986, 987, 988, + 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 925, 0, 0, + 636, 0, 0, 923, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 976, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 977, 978, 259, 659, 822, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 830, 831, 283, 310, 907, 906, 905, 309, 311, + 903, 904, 902, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 913, 935, 924, 788, + 789, 914, 915, 939, 916, 791, 792, 936, 937, 785, + 786, 790, 938, 940, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 927, 774, 773, 0, 780, 781, 0, 810, + 811, 813, 819, 820, 821, 832, 879, 880, 888, 890, + 891, 889, 892, 893, 894, 897, 898, 899, 900, 895, + 896, 901, 793, 797, 794, 795, 796, 808, 798, 799, + 800, 801, 802, 803, 804, 805, 806, 807, 809, 950, + 951, 952, 953, 954, 955, 825, 829, 828, 826, 827, + 823, 824, 851, 850, 852, 853, 854, 855, 856, 857, + 859, 858, 860, 861, 862, 863, 864, 865, 833, 834, + 837, 838, 836, 835, 839, 848, 849, 840, 841, 842, + 843, 844, 845, 847, 846, 866, 867, 868, 869, 870, + 872, 871, 875, 876, 874, 873, 878, 877, 772, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 941, 265, 942, 0, 0, 946, 0, 0, 0, + 948, 947, 0, 949, 911, 910, 0, 0, 943, 944, + 0, 945, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 956, 957, 958, 959, 960, 961, 962, 963, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 1031, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 784, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 771, 0, 0, 0, 273, 776, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 783, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 778, 779, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 95, 0, 0, 1032, + 513, 966, 755, 932, 970, 1033, 984, 985, 986, 971, + 0, 240, 972, 973, 247, 974, 0, 931, 814, 816, + 815, 881, 882, 883, 884, 885, 886, 887, 817, 818, + 812, 979, 616, 987, 988, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 751, 768, + 0, 782, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 765, 766, 0, 0, 0, 0, 926, 0, + 767, 0, 0, 775, 989, 990, 991, 992, 993, 994, + 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, + 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, + 1025, 1026, 1027, 1028, 1029, 1030, 777, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 925, 0, 0, 636, 0, 0, 923, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 976, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 977, 978, + 259, 659, 822, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 830, 831, 283, + 310, 907, 906, 905, 309, 311, 903, 904, 902, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 913, 935, 924, 788, 789, 914, 915, 939, + 916, 791, 792, 936, 937, 785, 786, 790, 938, 940, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 927, 774, + 773, 0, 780, 781, 0, 810, 811, 813, 819, 820, + 821, 832, 879, 880, 888, 890, 891, 889, 892, 893, + 894, 897, 898, 899, 900, 895, 896, 901, 793, 797, + 794, 795, 796, 808, 798, 799, 800, 801, 802, 803, + 804, 805, 806, 807, 809, 950, 951, 952, 953, 954, + 955, 825, 829, 828, 826, 827, 823, 824, 851, 850, + 852, 853, 854, 855, 856, 857, 859, 858, 860, 861, + 862, 863, 864, 865, 833, 834, 837, 838, 836, 835, + 839, 848, 849, 840, 841, 842, 843, 844, 845, 847, + 846, 866, 867, 868, 869, 870, 872, 871, 875, 876, + 874, 873, 878, 877, 772, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 941, 265, 942, + 0, 0, 946, 0, 0, 0, 948, 947, 0, 949, + 911, 910, 0, 0, 943, 944, 0, 945, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 956, 957, 958, 959, + 960, 961, 962, 963, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 1031, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 784, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 771, 0, 0, 0, + 273, 776, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 783, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 778, 779, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 95, 0, 0, 1032, 513, 966, 755, 932, + 970, 1033, 984, 985, 986, 971, 0, 240, 972, 973, + 247, 974, 0, 931, 814, 816, 815, 881, 882, 883, + 884, 885, 886, 887, 817, 818, 812, 979, 616, 987, + 988, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 751, 768, 0, 782, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 765, 766, + 0, 0, 0, 0, 926, 0, 767, 0, 0, 775, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, - 1019, 1020, 1021, 1022, 1023, 771, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 919, 0, 0, 630, 0, 0, 917, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 970, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 971, 972, 257, - 653, 816, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 824, 825, 281, 308, - 901, 900, 899, 307, 309, 897, 898, 896, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 907, 929, 918, 782, 783, 908, 909, 933, 910, - 785, 786, 930, 931, 779, 780, 784, 932, 934, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 921, 768, 767, - 0, 774, 775, 0, 804, 805, 807, 813, 814, 815, - 826, 873, 874, 882, 884, 885, 883, 886, 887, 888, - 891, 892, 893, 894, 889, 890, 895, 787, 791, 788, - 789, 790, 802, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 803, 944, 945, 946, 947, 948, 949, - 819, 823, 822, 820, 821, 817, 818, 845, 844, 846, - 847, 848, 849, 850, 851, 853, 852, 854, 855, 856, - 857, 858, 859, 827, 828, 831, 832, 830, 829, 833, - 842, 843, 834, 835, 836, 837, 838, 839, 841, 840, - 860, 861, 862, 863, 864, 866, 865, 869, 870, 868, - 867, 872, 871, 766, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 935, 263, 936, 0, - 0, 940, 0, 0, 0, 942, 941, 0, 943, 905, - 904, 0, 0, 937, 938, 0, 939, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 950, 951, 952, 953, 954, 955, 956, 957, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 975, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 778, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 765, 0, 0, 0, 271, 770, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 777, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 772, - 773, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 95, 0, 0, - 1024, 508, 960, 749, 926, 964, 1025, 977, 978, 979, - 965, 0, 238, 966, 967, 245, 968, 0, 925, 808, - 810, 809, 875, 876, 877, 878, 879, 880, 881, 811, - 812, 806, 973, 610, 980, 981, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 745, - 762, 0, 776, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 759, 760, 0, 0, 0, 0, 920, - 0, 761, 0, 0, 769, 982, 983, 984, 985, 986, - 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, - 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, - 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, - 1017, 1018, 1019, 1020, 1021, 1022, 1023, 3174, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 919, 0, 0, 630, 0, 0, - 917, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 970, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 971, - 972, 257, 653, 816, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 824, 825, - 281, 308, 901, 900, 899, 307, 309, 897, 898, 896, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 907, 929, 918, 782, 783, 908, 909, - 933, 910, 785, 786, 930, 931, 779, 780, 784, 932, - 934, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 921, - 768, 767, 0, 774, 775, 0, 804, 805, 807, 813, - 814, 815, 826, 873, 874, 882, 884, 885, 883, 886, - 887, 888, 891, 892, 893, 894, 889, 890, 895, 787, - 791, 788, 789, 790, 802, 792, 793, 794, 795, 796, - 797, 798, 799, 800, 801, 803, 944, 945, 946, 947, - 948, 949, 819, 823, 822, 820, 821, 817, 818, 845, - 844, 846, 847, 848, 849, 850, 851, 853, 852, 854, - 855, 856, 857, 858, 859, 827, 828, 831, 832, 830, - 829, 833, 842, 843, 834, 835, 836, 837, 838, 839, - 841, 840, 860, 861, 862, 863, 864, 866, 865, 869, - 870, 868, 867, 872, 871, 766, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 935, 263, - 936, 0, 0, 940, 0, 0, 0, 942, 941, 0, - 943, 905, 904, 0, 0, 937, 938, 0, 939, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 950, 951, 952, 953, 954, 955, 956, - 957, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 975, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 778, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 765, 0, 0, 0, 271, 770, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 777, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 772, 773, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 95, - 0, 0, 1024, 508, 960, 749, 926, 964, 1025, 977, - 978, 979, 965, 0, 238, 966, 967, 245, 968, 0, - 925, 808, 810, 809, 875, 876, 877, 878, 879, 880, - 881, 811, 812, 806, 973, 610, 980, 981, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 745, 762, 0, 776, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 759, 760, 0, 0, 0, - 0, 920, 0, 761, 0, 0, 769, 982, 983, 984, - 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, - 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, - 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, - 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 3170, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 919, 0, 0, 630, - 0, 0, 917, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 970, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 971, 972, 257, 653, 816, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 824, 825, 281, 308, 901, 900, 899, 307, 309, 897, - 898, 896, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 907, 929, 918, 782, 783, - 908, 909, 933, 910, 785, 786, 930, 931, 779, 780, - 784, 932, 934, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 921, 768, 767, 0, 774, 775, 0, 804, 805, - 807, 813, 814, 815, 826, 873, 874, 882, 884, 885, - 883, 886, 887, 888, 891, 892, 893, 894, 889, 890, - 895, 787, 791, 788, 789, 790, 802, 792, 793, 794, - 795, 796, 797, 798, 799, 800, 801, 803, 944, 945, - 946, 947, 948, 949, 819, 823, 822, 820, 821, 817, - 818, 845, 844, 846, 847, 848, 849, 850, 851, 853, - 852, 854, 855, 856, 857, 858, 859, 827, 828, 831, - 832, 830, 829, 833, 842, 843, 834, 835, 836, 837, - 838, 839, 841, 840, 860, 861, 862, 863, 864, 866, - 865, 869, 870, 868, 867, 872, 871, 766, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 935, 263, 936, 0, 0, 940, 0, 0, 0, 942, - 941, 0, 943, 905, 904, 0, 0, 937, 938, 0, - 939, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 950, 951, 952, 953, 954, - 955, 956, 957, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 975, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 778, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 765, 0, 0, 0, 271, - 770, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 777, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 772, 773, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 95, 0, 0, 1024, 508, 960, 1091, 926, 964, - 1025, 977, 978, 979, 965, 0, 238, 966, 967, 245, - 968, 0, 925, 808, 810, 809, 875, 876, 877, 878, - 879, 880, 881, 811, 812, 806, 973, 610, 980, 981, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 762, 0, 776, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 759, 760, 0, - 0, 0, 0, 920, 0, 761, 0, 0, 769, 982, - 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, + 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, + 1029, 1030, 3193, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 925, + 0, 0, 636, 0, 0, 923, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 976, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 977, 978, 259, 659, 822, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 830, 831, 283, 310, 907, 906, 905, + 309, 311, 903, 904, 902, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 913, 935, + 924, 788, 789, 914, 915, 939, 916, 791, 792, 936, + 937, 785, 786, 790, 938, 940, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 927, 774, 773, 0, 780, 781, + 0, 810, 811, 813, 819, 820, 821, 832, 879, 880, + 888, 890, 891, 889, 892, 893, 894, 897, 898, 899, + 900, 895, 896, 901, 793, 797, 794, 795, 796, 808, + 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, + 809, 950, 951, 952, 953, 954, 955, 825, 829, 828, + 826, 827, 823, 824, 851, 850, 852, 853, 854, 855, + 856, 857, 859, 858, 860, 861, 862, 863, 864, 865, + 833, 834, 837, 838, 836, 835, 839, 848, 849, 840, + 841, 842, 843, 844, 845, 847, 846, 866, 867, 868, + 869, 870, 872, 871, 875, 876, 874, 873, 878, 877, + 772, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 941, 265, 942, 0, 0, 946, 0, + 0, 0, 948, 947, 0, 949, 911, 910, 0, 0, + 943, 944, 0, 945, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 956, 957, 958, 959, 960, 961, 962, 963, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 1031, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 784, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 771, 0, 0, 0, 273, 776, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 783, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 778, 779, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 95, 0, + 0, 1032, 513, 966, 755, 932, 970, 1033, 984, 985, + 986, 971, 0, 240, 972, 973, 247, 974, 0, 931, + 814, 816, 815, 881, 882, 883, 884, 885, 886, 887, + 817, 818, 812, 979, 616, 987, 988, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 751, 768, 0, 782, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 765, 766, 0, 0, 0, 0, + 926, 0, 767, 0, 0, 775, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, - 1023, 771, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 919, 0, - 0, 630, 0, 0, 917, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 970, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 971, 972, 257, 653, 816, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 824, 825, 281, 308, 901, 900, 899, 307, - 309, 897, 898, 896, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 907, 929, 918, - 782, 783, 908, 909, 933, 910, 785, 786, 930, 931, - 779, 780, 784, 932, 934, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 921, 768, 767, 0, 774, 775, 0, - 804, 805, 807, 813, 814, 815, 826, 873, 874, 882, - 884, 885, 883, 886, 887, 888, 891, 892, 893, 894, - 889, 890, 895, 787, 791, 788, 789, 790, 802, 792, - 793, 794, 795, 796, 797, 798, 799, 800, 801, 803, - 944, 945, 946, 947, 948, 949, 819, 823, 822, 820, - 821, 817, 818, 845, 844, 846, 847, 848, 849, 850, - 851, 853, 852, 854, 855, 856, 857, 858, 859, 827, - 828, 831, 832, 830, 829, 833, 842, 843, 834, 835, - 836, 837, 838, 839, 841, 840, 860, 861, 862, 863, - 864, 866, 865, 869, 870, 868, 867, 872, 871, 766, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 935, 263, 936, 0, 0, 940, 0, 0, - 0, 942, 941, 0, 943, 905, 904, 0, 0, 937, - 938, 0, 939, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 950, 951, 952, - 953, 954, 955, 956, 957, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 975, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 778, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 765, 0, 0, - 0, 271, 770, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 777, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 772, 773, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 95, 0, 0, 1024, 508, 960, 1091, - 926, 964, 1025, 977, 978, 979, 965, 0, 238, 966, - 967, 245, 968, 0, 925, 808, 810, 809, 875, 876, - 877, 878, 879, 880, 881, 811, 812, 806, 973, 610, - 980, 981, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 762, 0, 776, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 759, - 760, 0, 0, 0, 0, 920, 0, 761, 0, 0, - 769, 982, 983, 984, 985, 986, 987, 988, 989, 990, + 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 3189, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 925, 0, 0, 636, 0, + 0, 923, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 976, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 977, 978, 259, 659, 822, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 830, + 831, 283, 310, 907, 906, 905, 309, 311, 903, 904, + 902, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 913, 935, 924, 788, 789, 914, + 915, 939, 916, 791, 792, 936, 937, 785, 786, 790, + 938, 940, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 927, 774, 773, 0, 780, 781, 0, 810, 811, 813, + 819, 820, 821, 832, 879, 880, 888, 890, 891, 889, + 892, 893, 894, 897, 898, 899, 900, 895, 896, 901, + 793, 797, 794, 795, 796, 808, 798, 799, 800, 801, + 802, 803, 804, 805, 806, 807, 809, 950, 951, 952, + 953, 954, 955, 825, 829, 828, 826, 827, 823, 824, + 851, 850, 852, 853, 854, 855, 856, 857, 859, 858, + 860, 861, 862, 863, 864, 865, 833, 834, 837, 838, + 836, 835, 839, 848, 849, 840, 841, 842, 843, 844, + 845, 847, 846, 866, 867, 868, 869, 870, 872, 871, + 875, 876, 874, 873, 878, 877, 772, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 941, + 265, 942, 0, 0, 946, 0, 0, 0, 948, 947, + 0, 949, 911, 910, 0, 0, 943, 944, 0, 945, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 956, 957, + 958, 959, 960, 961, 962, 963, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 1031, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 784, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 771, 0, + 0, 0, 273, 776, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 783, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 778, 779, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 95, 0, 0, 1032, 513, 966, + 1100, 932, 970, 1033, 984, 985, 986, 971, 0, 240, + 972, 973, 247, 974, 0, 931, 814, 816, 815, 881, + 882, 883, 884, 885, 886, 887, 817, 818, 812, 979, + 616, 987, 988, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 768, 0, 782, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 765, 766, 0, 0, 0, 0, 926, 0, 767, 0, + 0, 775, 989, 990, 991, 992, 993, 994, 995, 996, + 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, + 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, + 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, + 1027, 1028, 1029, 1030, 777, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 925, 0, 0, 636, 0, 0, 923, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 976, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 977, 978, 259, 659, + 822, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 830, 831, 283, 310, 907, + 906, 905, 309, 311, 903, 904, 902, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 913, 935, 924, 788, 789, 914, 915, 939, 916, 791, + 792, 936, 937, 785, 786, 790, 938, 940, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 927, 774, 773, 0, + 780, 781, 0, 810, 811, 813, 819, 820, 821, 832, + 879, 880, 888, 890, 891, 889, 892, 893, 894, 897, + 898, 899, 900, 895, 896, 901, 793, 797, 794, 795, + 796, 808, 798, 799, 800, 801, 802, 803, 804, 805, + 806, 807, 809, 950, 951, 952, 953, 954, 955, 825, + 829, 828, 826, 827, 823, 824, 851, 850, 852, 853, + 854, 855, 856, 857, 859, 858, 860, 861, 862, 863, + 864, 865, 833, 834, 837, 838, 836, 835, 839, 848, + 849, 840, 841, 842, 843, 844, 845, 847, 846, 866, + 867, 868, 869, 870, 872, 871, 875, 876, 874, 873, + 878, 877, 772, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 941, 265, 942, 0, 0, + 946, 0, 0, 0, 948, 947, 0, 949, 911, 910, + 0, 0, 943, 944, 0, 945, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 956, 957, 958, 959, 960, 961, + 962, 963, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 1031, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 784, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 771, 0, 0, 0, 273, 776, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 783, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 778, 779, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 95, 0, 0, 1032, 513, 966, 1100, 932, 970, 1033, + 984, 985, 986, 971, 0, 240, 972, 973, 247, 974, + 0, 931, 814, 816, 815, 881, 882, 883, 884, 885, + 886, 887, 817, 818, 812, 979, 616, 987, 988, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 768, 0, 782, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 765, 766, 0, 0, + 0, 0, 926, 0, 767, 0, 0, 775, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, - 1021, 1022, 1023, 2124, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 919, 0, 0, 630, 0, 0, 917, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 970, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 971, 972, 257, 653, 816, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 824, 825, 281, 308, 901, 900, - 899, 307, 309, 897, 898, 896, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 907, - 929, 918, 782, 783, 908, 909, 933, 910, 785, 786, - 930, 931, 779, 780, 784, 932, 934, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 921, 768, 767, 0, 774, - 775, 0, 804, 805, 807, 813, 814, 815, 826, 873, - 874, 882, 884, 885, 883, 886, 887, 888, 891, 892, - 893, 894, 889, 890, 895, 787, 791, 788, 789, 790, - 802, 792, 793, 794, 795, 796, 797, 798, 799, 800, - 801, 803, 944, 945, 946, 947, 948, 949, 819, 823, - 822, 820, 821, 817, 818, 845, 844, 846, 847, 848, - 849, 850, 851, 853, 852, 854, 855, 856, 857, 858, - 859, 827, 828, 831, 832, 830, 829, 833, 842, 843, - 834, 835, 836, 837, 838, 839, 841, 840, 860, 861, - 862, 863, 864, 866, 865, 869, 870, 868, 867, 872, - 871, 766, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 935, 263, 936, 0, 0, 940, - 0, 0, 0, 942, 941, 0, 943, 905, 904, 0, - 0, 937, 938, 0, 939, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 950, - 951, 952, 953, 954, 955, 956, 957, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 975, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 778, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 765, - 0, 0, 0, 271, 770, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 777, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 772, 773, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 95, 0, 0, 1024, 508, - 960, 1091, 926, 964, 1025, 977, 978, 979, 965, 0, - 238, 966, 967, 245, 968, 0, 925, 808, 810, 809, - 875, 876, 877, 878, 879, 880, 881, 811, 812, 806, - 973, 610, 980, 981, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, - 776, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 759, 760, 0, 0, 0, 0, 920, 0, 761, - 0, 0, 769, 982, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, - 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, - 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, - 1019, 1020, 1021, 1022, 1023, 2122, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 919, 0, 0, 630, 0, 0, 917, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 970, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 971, 972, 257, - 653, 816, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 824, 825, 281, 308, - 901, 900, 899, 307, 309, 897, 898, 896, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 907, 929, 918, 782, 783, 908, 909, 933, 910, - 785, 786, 930, 931, 779, 780, 784, 932, 934, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 921, 768, 767, - 0, 774, 775, 0, 804, 805, 807, 813, 814, 815, - 826, 873, 874, 882, 884, 885, 883, 886, 887, 888, - 891, 892, 893, 894, 889, 890, 895, 787, 791, 788, - 789, 790, 802, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 803, 944, 945, 946, 947, 948, 949, - 819, 823, 822, 820, 821, 817, 818, 845, 844, 846, - 847, 848, 849, 850, 851, 853, 852, 854, 855, 856, - 857, 858, 859, 827, 828, 831, 832, 830, 829, 833, - 842, 843, 834, 835, 836, 837, 838, 839, 841, 840, - 860, 861, 862, 863, 864, 866, 865, 869, 870, 868, - 867, 872, 871, 766, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 935, 263, 936, 0, - 0, 940, 0, 0, 0, 942, 941, 0, 943, 905, - 904, 0, 0, 937, 938, 0, 939, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 950, 951, 952, 953, 954, 955, 956, 957, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 975, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 0, 508, 725, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 1142, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 0, 1141, 630, 0, 0, - 0, 0, 0, 1138, 1139, 366, 1099, 331, 197, 225, - 1132, 1136, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 86, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 95, - 0, 0, 0, 508, 194, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 94, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 2427, 0, - 0, 2426, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 1777, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 1779, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 0, 0, 0, 1781, 508, 725, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 1480, - 0, 1481, 1482, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 86, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 95, 0, 1754, 0, 508, 725, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 94, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 95, 0, 0, 0, 508, - 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 2427, 0, 0, 2426, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 2374, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 1962, 508, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 0, 0, 630, 0, 0, - 0, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 2372, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 0, 508, 725, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 1093, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 0, 0, 0, 0, 366, 1099, 331, - 197, 225, 1097, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 2374, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 0, 0, 0, 1962, 508, 194, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 1754, 0, 508, 725, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 3729, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 2133, 508, - 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2134, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 2881, 508, 725, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2882, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 0, 0, 630, 0, 0, - 0, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 0, 508, 725, 0, 0, 0, 0, 2866, - 0, 0, 0, 0, 238, 0, 0, 245, 2867, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 0, 0, 0, 0, 271, - 1800, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 0, 0, 0, 1799, 508, 725, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 0, 0, 508, 727, 728, - 729, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 0, 508, - 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 4073, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 1962, 508, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 0, 0, 630, 0, 0, - 0, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 0, 508, 725, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 3729, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 95, 0, 0, 0, 508, 725, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 0, 0, 0, 2428, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 0, 0, 508, 194, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 1781, 508, - 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 0, 508, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 0, 0, 630, 0, 0, - 0, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 2080, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 2071, 508, 725, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 367, 268, 0, 1929, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 0, 0, 0, 0, 508, 725, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 1927, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 0, 0, 508, 725, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 1925, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 0, 508, - 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 1923, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 0, 508, 725, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 0, 0, 630, 0, 0, - 0, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, - 0, 0, 367, 268, 0, 1921, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 0, 508, 725, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 367, 268, 0, 1917, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 0, 0, 0, 0, 508, 725, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 1915, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 0, 0, 508, 725, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 1913, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 0, 508, - 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 1888, 0, 0, - 0, 508, 725, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 0, 0, 630, 0, 0, - 0, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 1785, 271, 0, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 0, 508, 194, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 95, 0, 0, 0, 508, 960, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 0, 0, 508, 194, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1457, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 1456, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 0, 508, - 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1050, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 0, 508, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 676, 0, 630, 0, 0, - 0, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 0, 508, 725, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 4139, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 0, 0, 0, 0, 508, 725, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 0, 0, 508, 960, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 0, 508, - 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 0, 0, 377, 577, - 578, 317, + 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 2139, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 925, 0, 0, + 636, 0, 0, 923, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 976, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 977, 978, 259, 659, 822, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 830, 831, 283, 310, 907, 906, 905, 309, 311, + 903, 904, 902, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 913, 935, 924, 788, + 789, 914, 915, 939, 916, 791, 792, 936, 937, 785, + 786, 790, 938, 940, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 927, 774, 773, 0, 780, 781, 0, 810, + 811, 813, 819, 820, 821, 832, 879, 880, 888, 890, + 891, 889, 892, 893, 894, 897, 898, 899, 900, 895, + 896, 901, 793, 797, 794, 795, 796, 808, 798, 799, + 800, 801, 802, 803, 804, 805, 806, 807, 809, 950, + 951, 952, 953, 954, 955, 825, 829, 828, 826, 827, + 823, 824, 851, 850, 852, 853, 854, 855, 856, 857, + 859, 858, 860, 861, 862, 863, 864, 865, 833, 834, + 837, 838, 836, 835, 839, 848, 849, 840, 841, 842, + 843, 844, 845, 847, 846, 866, 867, 868, 869, 870, + 872, 871, 875, 876, 874, 873, 878, 877, 772, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 941, 265, 942, 0, 0, 946, 0, 0, 0, + 948, 947, 0, 949, 911, 910, 0, 0, 943, 944, + 0, 945, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 956, 957, 958, 959, 960, 961, 962, 963, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 1031, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 784, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 771, 0, 0, 0, 273, 776, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 783, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 778, 779, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 95, 0, 0, 1032, + 513, 966, 1100, 932, 970, 1033, 984, 985, 986, 971, + 0, 240, 972, 973, 247, 974, 0, 931, 814, 816, + 815, 881, 882, 883, 884, 885, 886, 887, 817, 818, + 812, 979, 616, 987, 988, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 768, + 0, 782, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 765, 766, 0, 0, 0, 0, 926, 0, + 767, 0, 0, 775, 989, 990, 991, 992, 993, 994, + 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, + 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, + 1025, 1026, 1027, 1028, 1029, 1030, 2137, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 925, 0, 0, 636, 0, 0, 923, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 976, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 977, 978, + 259, 659, 822, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 830, 831, 283, + 310, 907, 906, 905, 309, 311, 903, 904, 902, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 913, 935, 924, 788, 789, 914, 915, 939, + 916, 791, 792, 936, 937, 785, 786, 790, 938, 940, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 927, 774, + 773, 0, 780, 781, 0, 810, 811, 813, 819, 820, + 821, 832, 879, 880, 888, 890, 891, 889, 892, 893, + 894, 897, 898, 899, 900, 895, 896, 901, 793, 797, + 794, 795, 796, 808, 798, 799, 800, 801, 802, 803, + 804, 805, 806, 807, 809, 950, 951, 952, 953, 954, + 955, 825, 829, 828, 826, 827, 823, 824, 851, 850, + 852, 853, 854, 855, 856, 857, 859, 858, 860, 861, + 862, 863, 864, 865, 833, 834, 837, 838, 836, 835, + 839, 848, 849, 840, 841, 842, 843, 844, 845, 847, + 846, 866, 867, 868, 869, 870, 872, 871, 875, 876, + 874, 873, 878, 877, 772, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 941, 265, 942, + 0, 0, 946, 0, 0, 0, 948, 947, 0, 949, + 911, 910, 0, 0, 943, 944, 0, 945, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 956, 957, 958, 959, + 960, 961, 962, 963, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 1031, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 0, 0, 0, 0, 513, 731, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 1151, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 0, 1150, 636, 0, 0, 0, 0, 0, 1147, 1148, + 368, 1108, 333, 199, 227, 1141, 1145, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 86, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 97, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 95, 0, + 0, 0, 513, 196, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 94, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 2444, 0, 0, + 2443, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 86, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 97, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 95, 0, 1764, 0, 513, 731, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 94, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 1792, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 1794, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 1796, 513, 731, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 1489, 0, + 1490, 1491, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 95, 0, 0, 0, + 513, 196, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 2444, 0, 0, 2443, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 2389, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 0, 0, 0, 1977, 513, 196, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 2387, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 0, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 731, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 1102, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 368, 1108, 333, 199, + 227, 1106, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 2389, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 0, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 0, 0, 0, 1977, 513, 196, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 1764, 0, 513, 731, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 3748, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 2148, + 513, 731, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2149, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 0, 0, 0, 2900, 513, 731, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2901, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 0, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 731, 0, 0, 0, 0, 2883, 0, + 0, 0, 0, 240, 0, 0, 247, 2884, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 273, 1815, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 0, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 0, 0, 0, 1814, 513, 731, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 0, 513, 733, 734, 735, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 0, + 513, 731, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 4092, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 0, 0, 0, 1977, 513, 196, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 0, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 731, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 3748, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 0, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 95, 0, 0, 0, 513, 731, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 2445, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 0, 513, 196, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 1796, + 513, 731, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 0, 0, 0, 0, 513, 196, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 2095, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 0, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 2086, 513, 731, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 369, 270, 0, + 1944, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 0, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 0, 0, 0, 0, 513, 731, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 1942, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 0, 513, 731, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 1940, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 0, + 513, 731, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 1938, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 0, 0, 0, 0, 513, 731, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 369, 270, 0, 1936, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 0, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 731, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 369, 270, 0, + 1932, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 0, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 0, 0, 0, 0, 513, 731, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 1930, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 0, 513, 731, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 1928, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 0, + 513, 731, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 1903, 0, 0, 0, 513, 731, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 1800, 273, 0, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 0, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 196, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 0, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 95, 0, 0, 0, 513, 966, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 0, 513, 196, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1466, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 1465, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 0, + 513, 196, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1058, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 0, 0, 0, 0, 513, 196, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 682, 0, 636, 0, 0, 0, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 0, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 731, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 4158, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 0, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 0, 0, 0, 0, 513, 731, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 0, 513, 966, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 0, + 513, 196, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 0, 0, 379, 582, 583, 319, } var yyPact = [...]int{ - -1000, -1000, 4350, -1000, -549, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 5272, -1000, -551, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 2520, 2555, -1000, -1000, -1000, -1000, 2696, -1000, 1031, - 2117, -1000, 2474, 4989, -1000, 56250, 778, -1000, 53282, -420, - 897, 238, 36958, -1000, 193, -1000, 186, 54766, 189, -1000, - -1000, -1000, -1000, -420, 22860, 2334, 57, 55, 56250, -1000, - -1000, -1000, -1000, -373, 2641, 2087, -1000, 392, -1000, -1000, - -1000, -1000, -1000, -1000, 52540, -1000, 1119, -1000, -1000, 2482, - 2485, 2309, 941, 2399, -1000, 2569, 2087, -1000, 22860, 2632, - 2475, 22118, 22118, 456, -1000, -1000, 269, -1000, -1000, 31764, - 56250, 39926, 322, -1000, 2474, -1000, -1000, -1000, 211, -1000, - 342, 1987, -1000, 1971, -1000, 937, 914, 389, 473, 471, - 386, 385, 384, 368, 367, 363, 358, 355, 399, -1000, - 958, 958, -218, -220, 371, 769, 460, 460, 1035, 490, - 2427, 2379, -1000, -1000, 958, 958, 958, 339, 958, 958, - 958, 958, 311, 310, 958, 958, 958, 958, 958, 958, - 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, - 958, 917, 2474, 270, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 2469, 2576, -1000, -1000, -1000, -1000, 2667, -1000, 1033, + 2110, -1000, 2476, 5131, -1000, 55821, 518, -1000, 52837, -455, + 883, 238, 36425, -1000, 185, -1000, 159, 54329, 181, -1000, + -1000, -1000, -1000, -455, 22251, 2336, 37, 35, 55821, -1000, + -1000, -1000, -1000, -370, 2640, 2031, -1000, 400, -1000, -1000, + -1000, -1000, -1000, -1000, 52091, -1000, -1000, -1000, 1120, -1000, + -1000, 2480, 2501, 2332, 946, 2398, -1000, 2565, 2031, -1000, + 22251, 2620, 2438, 21505, 21505, 470, -1000, -1000, 275, -1000, + -1000, 31203, 55821, 39409, 909, -1000, 2476, -1000, -1000, -1000, + 193, -1000, 324, 1990, -1000, 1989, -1000, 913, 964, 387, + 469, 467, 386, 385, 383, 382, 367, 365, 363, 355, + 394, -1000, 962, 962, -241, -242, 1369, 796, 442, 442, + 1140, 483, 2444, 2443, -1000, -1000, 962, 962, 962, 360, + 962, 962, 962, 962, 301, 293, 962, 962, 962, 962, + 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, + 962, 962, 962, 884, 2476, 276, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -7470,68 +7435,68 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 56250, 194, 56250, -1000, 828, 775, - -1000, -1000, -459, 1114, 1114, 101, 1114, 1114, 1114, 1114, - 183, 1043, 54, -1000, 182, 261, 168, 271, 1096, 304, - -1000, -1000, 257, 1096, 1834, -1000, 946, 266, 169, -1000, - 1114, 1114, -1000, 15416, 203, 15416, 15416, 265, 172, -1000, - 2464, -1000, -1000, -1000, -1000, -1000, 1344, -1000, -1000, -1000, - -1000, -37, 489, -1000, -1000, -1000, -1000, 54766, 51798, 283, - -1000, -1000, 780, 1851, 1393, 22860, 1315, 938, -1000, -1000, - 1434, 900, -1000, -1000, -1000, -1000, -1000, 809, -1000, 25086, - 25086, 25086, 25086, -1000, -1000, 1830, 51056, 1830, 1830, 25086, - 1830, 25086, 1830, 1830, 1830, 1830, 22860, 1830, 1830, 1830, - 1830, -1000, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, -1000, -1000, -1000, -1000, 1830, 826, 1830, 1830, 1830, - 1830, 1830, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1830, - 1830, 1830, 1830, 1830, 1830, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, -1000, -1000, - -1000, 1692, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1693, - 1513, 1500, 1498, -1000, 19892, 1830, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 55821, 252, 55821, -1000, 835, 517, -1000, -1000, -459, 1107, + 1107, 96, 1107, 1107, 1107, 1107, 172, 1028, 32, -1000, + 160, 294, 167, 277, 1099, 299, -1000, -1000, 265, 1099, + 1868, -1000, 951, 273, 158, -1000, 1107, 1107, -1000, 14767, + 206, 14767, 14767, 269, 147, -1000, 2457, -1000, -1000, -1000, + -1000, -1000, 1365, -1000, -1000, -1000, -1000, -39, 482, -1000, + -1000, -1000, -1000, 54329, 51345, 291, -1000, -1000, 33, 1892, + 1527, 22251, 1574, 944, -1000, -1000, 1428, 906, -1000, -1000, + -1000, -1000, -1000, 816, -1000, 24489, 24489, 24489, 24489, -1000, + -1000, 1998, 50599, 1998, 1998, 24489, 1998, 24489, 1998, 1998, + 1998, 1998, 22251, 1998, 1998, 1998, 1998, -1000, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, -1000, -1000, -1000, + -1000, 1998, 834, 1998, 1998, 1998, 1998, 1998, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 1998, 1998, 1998, 1998, 1998, + 1998, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, -1000, -1000, -1000, 1684, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 1652, 1611, 1609, 1588, -1000, + 19267, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 56250, -1000, 1830, - 216, 54766, 54766, 340, 1333, -1000, -1000, 2569, 2087, -1000, - 2641, 2620, 392, -1000, 3919, 2111, 1683, 1406, 2087, 1954, - 56250, -1000, 2005, -1000, -1000, -1000, -357, -364, 2232, 1455, - 1829, -1000, -1000, -1000, -1000, 1798, 22860, -1000, -1000, 2693, - -1000, 28796, 823, 2687, 50314, -1000, 456, 456, 1969, 421, - 13, -1000, -1000, -1000, -1000, 979, 36216, -1000, -1000, -1000, - -1000, -1000, 1884, 56250, -1000, -1000, 5043, 54766, -1000, 2107, - -1000, 1875, -1000, 2041, 22860, 2126, 768, 54766, 523, 516, - 510, 475, -62, -1000, -1000, -1000, -1000, -1000, -1000, 958, - 958, 958, -1000, 395, 2623, 4989, 5064, -1000, -1000, -1000, - 49572, 2102, 54766, -1000, 2088, -1000, 1039, 861, 864, 864, - 54766, -1000, -1000, 55508, 54766, 1037, 1033, 54766, 54766, 54766, - 54766, -1000, 48830, -1000, 48088, 47346, 1331, 54766, 46604, 45862, - 45120, 44378, 43636, -1000, 2609, -1000, 2204, -1000, -1000, -1000, - 55508, 54766, 54766, 55508, 54766, 55508, 56250, 54766, -1000, -1000, - 357, -1000, -1000, 1329, 1327, 1319, 958, 958, 1317, 1828, - 1823, 1816, 958, 958, 1305, 1800, 38442, 1780, 276, 1299, - 1296, 1294, 1293, 1775, 259, 1757, 1237, 1220, 1272, 54766, - 2083, 56250, -1000, 250, 1070, 434, 978, 2474, 2331, 1964, - 488, 767, 54766, 474, 474, 54766, -1000, 16164, 56250, 230, - -1000, 1744, 22860, -1000, 1117, 1096, 1096, -1000, -1000, -1000, - -1000, -1000, -1000, 1114, 56250, 1117, -1000, -1000, -1000, 1096, - 1114, 56250, 1114, 1114, 1114, 1114, 1096, 1096, 1096, 1114, - 56250, 56250, 56250, 56250, 56250, 56250, 56250, 56250, 56250, 15416, - 946, 1114, -460, -1000, 1742, -1000, -1000, -1000, 2230, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1998, -1000, -1000, -1000, 55821, -1000, 1998, 217, 54329, + 54329, 331, 1347, -1000, -1000, 2565, 2031, -1000, 2640, 2644, + 400, -1000, 3901, 1759, 1695, 1378, 2031, 1967, 55821, -1000, + 2015, 211, -1000, -1000, -1000, -309, -330, 2272, 1486, 1864, + -1000, -1000, -1000, -1000, 2347, 22251, -1000, -1000, 2662, -1000, + 28965, 833, 2658, 49853, -1000, 470, 470, 1986, 423, 9, + -1000, -1000, -1000, -1000, 982, 35679, -1000, -1000, -1000, -1000, + -1000, 1878, 55821, -1000, -1000, 5540, 54329, -1000, 2109, -1000, + 1862, -1000, 2072, 22251, 2125, 516, 54329, 513, 509, 499, + 463, -71, -1000, -1000, -1000, -1000, -1000, -1000, 962, 962, + 962, -1000, 393, 2614, 5131, 6483, -1000, -1000, -1000, 49107, + 2107, 54329, -1000, 2102, -1000, 1046, 842, 877, 877, 54329, + -1000, -1000, 55075, 54329, 1043, 1040, 54329, 54329, 54329, 54329, + -1000, 48361, -1000, 47615, 46869, 1346, 54329, 46123, 45377, 44631, + 43885, 43139, -1000, 2527, -1000, 2143, -1000, -1000, -1000, 55075, + 54329, 54329, 55075, 54329, 55075, 55821, 54329, -1000, -1000, 328, + -1000, -1000, 1343, 1340, 1338, 962, 962, 1337, 1857, 1852, + 1831, 962, 962, 1309, 1820, 37917, 1818, 266, 1303, 1296, + 1294, 1290, 1813, 205, 1809, 1288, 1272, 1280, 54329, 2093, + 55821, -1000, 260, 1006, 1015, 980, 2476, 2335, 1984, 480, + 515, 54329, 461, 461, 54329, -1000, 15519, 55821, 213, -1000, + 1770, 22251, -1000, 1102, 1099, 1099, -1000, -1000, -1000, -1000, + -1000, -1000, 1107, 55821, 1102, -1000, -1000, -1000, 1099, 1107, + 55821, 1107, 1107, 1107, 1107, 1099, 1099, 1099, 1107, 55821, + 55821, 55821, 55821, 55821, 55821, 55821, 55821, 55821, 14767, 951, + 1107, -460, -1000, 1757, -1000, -1000, -1000, 2231, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -7546,337 +7511,339 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 15416, - 15416, -1000, -1000, 2565, 2559, -1000, -1000, -1000, 1960, -1000, - 184, 17, 185, -1000, 42894, 535, 974, -1000, 535, -1000, - -1000, -1000, -1000, -1000, 1959, 42152, -1000, -461, -464, -467, - -469, -1000, -1000, -1000, -471, -473, -1000, -1000, -1000, 22860, - 22860, 22860, 22860, -257, -1000, 1217, 25086, 2491, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 22860, 247, 1131, 25086, 25086, - 25086, 25086, 25086, 25086, 25086, 26570, 25828, 25086, 25086, 25086, - 25086, 25086, 25086, -1000, -1000, 33990, 6271, 6271, 900, 900, - 900, 900, -1000, -174, 1958, 55508, -1000, -1000, -1000, 822, - 22860, 22860, 900, -1000, 1238, 2007, 19892, 22860, 22860, 22860, - 22860, 960, 1393, 55508, 22860, -1000, 1406, -1000, -1000, -1000, - -1000, 1234, -1000, -1000, 1081, 2376, 2376, 2376, 2376, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 2376, - 22860, 208, 208, 919, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 18408, 22860, 22860, 25086, 22860, 22860, 22860, 1406, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 1406, - 22860, 1221, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 17660, - 22860, 22860, 22860, 22860, 22860, -1000, -1000, -1000, -1000, -1000, - -1000, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 1406, - 22860, 22860, 22860, 22860, 22860, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 1686, 1493, 1478, 22860, -1000, - 1957, -1000, -202, 31022, 22860, 1739, 2683, 2157, 54766, -1000, - -1000, -1000, -1000, 2569, -1000, 2569, 1686, 3881, 2277, 22118, - -1000, -1000, 3881, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1737, -1000, 56250, 1954, - 2545, 54766, -1000, -294, -1000, -295, 2272, 1730, 351, -1000, - 22860, 22860, 1953, -1000, 1399, 56250, -1000, -257, -1000, 41410, - -1000, -1000, 14668, 56250, 350, 56250, -1000, 30280, 40668, 306, - -1000, 13, 1933, -1000, 29, 1, 19150, 899, -1000, -1000, - -1000, 371, 27312, 1822, 899, 100, -1000, -1000, -1000, 2041, - -1000, 2041, 2041, 2041, 2041, 351, 351, 351, 351, -1000, - -1000, -1000, -1000, -1000, 2079, 2041, 2075, -1000, 2041, 2041, - 2041, 2041, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2073, - 2073, 2073, 2061, 2061, 2042, 2042, 447, -1000, 22860, 486, - 39926, 2537, 1270, 1538, 250, 475, 2144, 54766, 54766, 54766, - 56250, 989, -1000, 1445, 1412, 1398, -1000, -532, 1952, -1000, - -1000, 2617, -1000, -1000, 956, 1088, 1084, 1064, 54766, 214, - 335, -1000, 433, -1000, 39926, 54766, 1029, 864, 54766, -1000, - 54766, -1000, -1000, -1000, -1000, -1000, 54766, -1000, -1000, 1950, - -1000, 1927, 1106, 1083, 1098, 1080, 1950, -1000, -1000, -183, - 1950, -1000, 1950, -1000, 1950, -1000, 1950, -1000, 1950, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1001, 278, - -350, 54766, 214, 487, -1000, 485, 33990, -1000, -1000, -1000, - 33990, 33990, -1000, -1000, -1000, -1000, 1726, 1723, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 14767, 14767, + -1000, -1000, 2562, 2560, -1000, -1000, -1000, 1981, -1000, 175, + 4, 179, -1000, 42393, 493, 969, -1000, 493, -1000, -1000, + -1000, -1000, -1000, 1977, 41647, -1000, -463, -464, -468, -470, + -1000, -1000, -1000, -471, -477, -1000, -1000, -1000, 22251, 22251, + 22251, 22251, -276, -1000, 1426, 24489, 2456, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 22251, 1195, 1144, 24489, 24489, 24489, + 24489, 24489, 24489, 24489, 25981, 25235, 24489, 24489, 24489, 24489, + 24489, 24489, -1000, -1000, 33441, 5242, 5242, 906, 906, 906, + 906, -1000, -181, 1973, 55075, -1000, -1000, -1000, 832, 22251, + 22251, 906, -1000, 1196, 1029, 19267, 22251, 22251, 22251, 22251, + 990, 1527, 55075, 22251, -1000, 1378, -1000, -1000, -1000, -1000, + 1200, -1000, -1000, 1091, 2403, 2403, 2403, 2403, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 2403, 22251, + 151, 151, 961, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 17775, 22251, 22251, 24489, 22251, 22251, 22251, 1378, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 1378, 22251, + 1199, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 17023, 22251, + 22251, 22251, 22251, 22251, -1000, -1000, -1000, -1000, -1000, -1000, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 1378, 22251, + 22251, 22251, 22251, 22251, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1764, 1721, 1554, 1998, 22251, -1000, + 1972, -1000, -183, 30457, 22251, 1755, 2651, 2147, 54329, -1000, + -1000, -1000, -1000, 2565, -1000, 2565, 1764, 3686, 2279, 21505, + -1000, -1000, 3686, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1783, -1000, 55821, 1967, + 2544, 54329, -1000, 1958, -1000, -1000, 1998, -1000, -315, -1000, + -343, 2265, 1752, 371, -1000, 22251, 22251, 1951, -1000, 1409, + 55821, -1000, -276, -1000, 40901, -1000, -1000, 14015, 55821, 337, + 55821, -1000, 29711, 40155, 303, -1000, 9, 1923, -1000, 11, + -15, 18521, 901, -1000, -1000, -1000, 1369, 26727, 1879, 901, + 85, -1000, -1000, -1000, 2072, -1000, 2072, 2072, 2072, 2072, + 371, 371, 371, 371, -1000, -1000, -1000, -1000, -1000, 2092, + 2072, 2091, -1000, 2072, 2072, 2072, 2072, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -520, 56250, -1000, - 236, 971, 268, 376, 291, 56250, 405, 2423, 2413, 2403, - 2396, 2391, 2373, 2366, 242, 298, 56250, 56250, 474, 2206, - 56250, 2522, 56250, -1000, -1000, -1000, -1000, -1000, 1716, 1708, - -1000, 1393, 56250, -1000, -1000, 1114, 1114, -1000, -1000, 56250, - 1114, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1114, + -1000, -1000, -1000, -1000, 2089, 2089, 2089, 2088, 2088, 2074, + 2074, 437, -1000, 22251, 384, 39409, 2517, 1279, 1681, 260, + 463, 2144, 54329, 54329, 54329, 55821, 1005, -1000, 1476, 1469, + 1425, -1000, -533, 1950, -1000, -1000, 2606, -1000, -1000, 1105, + 1087, 1082, 1138, 54329, 229, 323, -1000, 429, -1000, 39409, + 54329, 1038, 877, 54329, -1000, 54329, -1000, -1000, -1000, -1000, + -1000, 54329, -1000, -1000, 1949, -1000, 1959, 1103, 1081, 1088, + 1065, 1949, -1000, -1000, -189, 1949, -1000, 1949, -1000, 1949, + -1000, 1949, -1000, 1949, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 963, 336, -384, 54329, 229, 475, -1000, + 473, 33441, -1000, -1000, -1000, 33441, 33441, -1000, -1000, -1000, + -1000, 1741, 1737, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 56250, -1000, -1000, -1000, -1000, - 1702, -1000, 56250, -37, 177, -1000, -1000, 54766, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -114, -1000, 854, - 26, 393, -1000, -1000, -1000, -1000, -1000, 2550, -1000, 1393, - 1021, 1010, -1000, 1830, -1000, -1000, 1233, -1000, -1000, -1000, - -1000, -1000, 1830, 1830, 1830, -1000, -1000, -1000, -1000, -1000, - 247, 25086, 25086, 25086, 1782, 777, 1891, 1812, 1474, 1231, - 1231, 976, 25086, 976, 25086, 918, 918, 918, 918, 918, - -1000, -1000, -1000, -1000, -1000, -1000, 1692, -1000, 1667, -1000, - 1830, 55508, 1827, 17660, 1747, 1599, 1406, 932, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3935, 1406, - 1851, 1406, 1674, 3902, 1026, -1000, 22860, 1406, 3610, -1000, - -1000, 1406, 1406, 22860, -1000, -1000, 22860, 22860, 22860, 22860, - 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - 22860, 1538, 1947, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -522, 55821, -1000, 254, 968, 304, 296, 308, + 55821, 390, 2432, 2430, 2426, 2408, 2401, 2395, 2383, 239, + 288, 55821, 55821, 461, 2208, 55821, 2507, 55821, -1000, -1000, + -1000, -1000, -1000, 1733, 1704, -1000, 1527, 55821, -1000, -1000, + 1107, 1107, -1000, -1000, 55821, 1107, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1107, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1938, 2669, 1558, 1538, 1538, 1538, 1538, 3587, 1538, - 1538, 22860, 1358, -1000, -1000, -1000, 1419, 3583, 1684, 3572, - 1538, 1538, -1000, 1538, 3541, 3536, 1406, 2928, 2820, 1538, - 1538, 1538, 1538, 1538, 2792, 2778, 1538, 1538, 2705, 1538, - 3522, 1538, 2698, 2681, 2677, 2633, 2611, 2603, 2594, 2570, - 2561, 2539, 2533, 2523, 2509, 2492, 2458, 2448, 2444, 2407, - 1538, 1538, 1538, 3508, 1538, 3489, 1538, 3485, 1538, 1538, - 3474, 2394, 2364, 1406, 1934, -1000, 3469, 1538, 3457, 3453, - 3446, 2354, 3427, 3422, 3418, 1538, 1538, 1538, 2339, 3413, - 3407, 3395, 3391, 3374, 3369, 3364, 3355, 3343, 1538, 1478, - 1478, 1478, 1478, 1478, 3253, -259, 1538, 1406, -1000, -1000, - -1000, -1000, -1000, 3092, 2333, 3042, 3030, 3011, 3003, 1406, - 1830, 821, -1000, -1000, 1478, 1406, 1406, 1478, 1478, 2995, - 2963, 2957, 2953, 2933, 2834, 1538, 1538, -1000, 1538, 2810, - 2800, 2303, 2290, 1406, -1000, 1478, 56250, -1000, -451, -1000, - -8, 954, 1830, -1000, 38442, 1406, -1000, 4349, -1000, 1168, - -1000, -1000, -1000, -1000, -1000, 35474, 1879, -1000, -1000, -1000, - -1000, 1830, 1762, -1000, -1000, -1000, -1000, 351, 73, 34732, - 890, 890, 123, 1393, 1393, 22860, -1000, -1000, -1000, -1000, - -1000, -1000, 820, 2642, 404, 1830, -1000, 1948, 3576, -1000, - -1000, -1000, 2544, 28054, -1000, -1000, 1830, 1830, 56250, 1939, - 1745, -1000, 819, -1000, 1320, 1933, 13, 24, -1000, -1000, - -1000, -1000, 1393, -1000, 1378, 353, 346, -1000, 437, -1000, - -1000, -1000, -1000, 2343, 81, -1000, -1000, -1000, 912, 351, - -1000, -1000, -1000, -1000, -1000, -1000, 1664, -1000, 1664, -1000, - -1000, -1000, -1000, -1000, 1268, -1000, -1000, -1000, -1000, 1266, - -1000, -1000, 1256, -1000, -1000, 2877, 2183, 486, -1000, -1000, - 958, 1655, -1000, -1000, 2356, 958, 958, 54766, -1000, -1000, - 1783, 2537, 236, 56250, 2203, -1000, 2144, 2144, 2144, -1000, - 2497, -1000, -1000, -1000, -1000, -1000, -1000, -522, 174, 609, - -1000, -1000, -1000, 1389, 54766, 1721, -1000, 224, -1000, 1779, - -1000, 54766, -1000, 1713, 2053, 54766, 54766, -1000, -1000, -1000, - 54766, 1830, -1000, -1000, -1000, -1000, 760, 2471, 319, -1000, - -1000, -283, -1000, -1000, 214, 224, 55508, 54766, 899, -1000, - -1000, -1000, -1000, -1000, -523, 1690, 506, 228, 328, 56250, - 56250, 56250, 56250, 56250, 56250, 800, -1000, -1000, 39, -1000, - -1000, 202, -1000, -1000, 1623, -1000, -1000, -1000, -1000, 202, - -1000, -1000, -1000, -1000, -1000, 275, 478, -1000, 56250, 56250, - 964, -1000, -1000, -1000, -1000, -1000, 1096, -1000, -1000, 1096, + 55821, -1000, -1000, -1000, -1000, 1689, -1000, 55821, -39, 153, + -1000, -1000, 54329, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -117, -1000, 327, 2, 419, -1000, -1000, -1000, + -1000, -1000, 2553, -1000, 1527, 1009, 1020, -1000, 1998, -1000, + -1000, 1108, -1000, -1000, -1000, -1000, -1000, 1998, 1998, 1998, + -1000, -1000, -1000, -1000, -1000, 1195, 24489, 24489, 24489, 1509, + 799, 1412, 924, 1454, 1443, 1443, 955, 24489, 955, 24489, + 910, 910, 910, 910, 910, -1000, -1000, -1000, -1000, -1000, + -1000, 1684, -1000, 1682, -1000, 1998, 55075, 1844, 17023, 2023, + 1371, 1378, 933, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 2457, 56250, 20, -490, -1000, -486, 22860, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1666, 749, 1891, 25086, - 25086, 2007, 2007, 25086, -1000, -1000, -1000, 1076, 1076, 33990, - -1000, 25086, 22860, -1000, -1000, 22860, 22860, 22860, 981, -1000, - 22860, 1181, -1000, 22860, -1000, -259, 1478, 1538, 1538, 1538, - 1538, -259, -259, -259, -259, -259, -259, -259, -259, -259, - -259, 1908, -1000, 22860, 22860, 22860, 1406, 334, -1000, -1000, - -1000, -259, 22860, -1000, -1000, 2666, -1000, 22860, -1000, 33990, - 22860, 22860, 22860, -1000, -1000, -1000, 22860, 22860, -1000, -1000, - 22860, -1000, 22860, -1000, -1000, -1000, -1000, -1000, -1000, 22860, - -1000, 22860, -1000, -1000, -1000, 22860, -1000, 22860, -1000, -1000, - 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, - 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, - 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, - 22860, -1000, 22860, -1000, 22860, -1000, -1000, -1000, 22860, -1000, - 22860, -1000, 22860, -1000, -1000, 22860, -1000, 22860, -1000, 22860, - -1000, 22860, 22860, -1000, 22860, 22860, 22860, -1000, 22860, 22860, - 22860, 22860, -1000, -1000, -1000, -1000, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, -1000, -1000, -1000, -1000, - -1000, -1000, 22860, -1000, 39926, 47, -259, 1221, 47, 1221, - 24344, 832, 507, 23602, -1000, 22860, 16912, -1000, -1000, -1000, - -1000, -1000, 22860, 22860, 22860, 22860, 22860, 22860, -1000, -1000, - -1000, 22860, 22860, -1000, 22860, -1000, 22860, -1000, -1000, -1000, - -1000, -1000, 954, -1000, 455, 453, 864, 54766, -1000, -1000, - -1000, -1000, 1930, -1000, 2564, -1000, 2285, 2284, 2659, 2642, - 22118, -1000, 30280, -1000, -1000, 54766, -419, -1000, 2326, 2476, - 890, 890, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 13920, - 2569, 22860, 2201, 55508, 223, -1000, 29538, 54766, 55508, 30280, - 30280, 30280, 30280, 30280, -1000, 2242, 2235, -1000, 2254, 2228, - 2313, 56250, -1000, 1686, 1688, -1000, 22860, 32506, 1935, 30280, - -1000, -1000, 30280, 56250, 13172, -1000, -1000, 6, -7, -1000, - -1000, -1000, -1000, 371, -1000, -1000, 1082, 2543, 2338, -1000, - -1000, -1000, -1000, -1000, 1682, -1000, 1676, 1928, 1671, 1662, - 278, -1000, 2067, 2451, 958, 958, -1000, 1254, -1000, 1238, - 1614, 1586, -1000, -1000, -1000, 496, -1000, 56250, 2200, 2195, - 2194, -1000, -540, 1253, 2052, 2012, 22860, 2051, 2615, 1913, - 54766, -1000, -1000, 55508, -1000, 197, -1000, 486, 54766, -1000, - -1000, -1000, 335, 56250, -1000, 7068, -1000, -1000, -1000, 224, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 56250, 233, -1000, - 2047, 1343, -1000, -1000, 2140, -1000, -1000, -1000, -1000, -1000, - 213, 201, 1583, 199, 1547, -1000, 199, -1000, 56250, 928, - 2183, 56250, -1000, -1000, -1000, 1114, 1114, -1000, -1000, 2449, - -1000, 1238, 1538, 25086, 25086, -1000, 900, -1000, -1000, 435, - -229, 2041, 2041, -1000, 2041, 2042, -1000, 2041, 171, 2041, - 154, 2041, -1000, -1000, 1406, 1406, -1000, 1478, 2286, 1439, - 2796, -1000, 1393, 22860, 2715, -1000, -1000, -259, -259, -259, - -259, -259, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -69, 2689, 2637, 1538, -1000, 2039, 2036, -1000, - 1538, 22860, 1538, 1406, 2278, 1538, 1538, 1538, 1538, 1538, - 1538, 1538, 1538, 1538, 1538, 1538, 1538, 2266, 2257, 2249, - 2196, 2175, 2171, 2167, 2163, 2158, 2149, 2145, 2128, 2084, - 2080, 2076, 2062, 1538, 1538, 2058, 1538, 2054, 2048, -1000, - 1393, 1478, 2628, 1478, 1538, 1538, 2527, 337, 1538, 1651, - 1651, 1651, 1651, 1651, 1478, 1478, 1478, 1478, 1538, 54766, - -1000, -259, -1000, -1000, -307, -309, -1000, 1406, -259, 1926, - 25086, 1538, 25086, 25086, 25086, 1538, 1406, -1000, 2043, 2010, - 2270, 1940, 1538, 1832, 1538, 1538, 1538, 1821, -1000, 2535, - 1830, 2535, 1830, 2535, 1647, 1168, 56250, -1000, -1000, -1000, - -1000, 2642, 2639, -1000, 1914, -1000, 73, 639, -1000, 2311, - 2476, -1000, 2610, 2306, 2598, -1000, -1000, -1000, -1000, -1000, - 1393, -1000, 2479, 1916, -1000, 963, 1907, -1000, -1000, 21376, - 1649, 2281, 817, 1647, 1923, 3576, 2136, 2190, 3359, -1000, - -1000, -1000, -1000, 2231, -1000, 2063, -1000, -1000, 2005, -1000, - 1790, 350, 30280, 1877, 1877, -1000, 816, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1100, 7068, 2704, -1000, 1544, -1000, - 1366, 195, 1240, -1000, -1000, 958, 958, -1000, 1028, 1020, - -1000, 56250, 2031, -1000, 351, 1529, 351, 1225, -1000, -1000, - 1215, -1000, -1000, -1000, -1000, 1994, 2562, -1000, -1000, -1000, - -1000, 56250, -1000, 56250, 56250, 56250, 2029, 2595, -1000, 22860, - 2015, 962, 2253, 54766, 54766, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 427, 958, -503, 297, - 294, 958, 958, 958, -541, -1000, -1000, 1639, 1637, -1000, - -205, -1000, 22860, -1000, -1000, -1000, -1000, -1000, 1249, 1249, - 1513, 1500, 1498, -1000, 2005, -1000, -1000, -1000, 1722, -1000, - -1000, -186, 54766, 54766, 54766, 54766, -1000, -1000, -1000, 1187, + -1000, -1000, -1000, 3541, 1378, 1892, 1378, 2206, 3526, 997, + -1000, 22251, 1378, 3516, -1000, -1000, 1378, 1378, 22251, -1000, + -1000, 22251, 22251, 22251, 22251, 1681, 1681, 1681, 1681, 1681, + 1681, 1681, 1681, 1681, 1681, 22251, 1681, 1945, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 900, 1406, 375, -188, 1406, -1000, -1000, 351, + -1000, -1000, -1000, -1000, -1000, -1000, 1935, 2649, 2008, 1681, + 1681, 1681, 1681, 3508, 1681, 1681, 22251, 1308, -1000, -1000, + -1000, 1562, 3504, 1367, 3496, 1681, 1681, -1000, 1681, 3491, + 3485, 1378, 2671, 2666, 1681, 1681, 1681, 1681, 1681, 2650, + 2632, 1681, 1681, 2581, 1681, 3461, 1681, 2564, 2556, 2551, + 2542, 2534, 2526, 2479, 2454, 2448, 2427, 2418, 2411, 2373, + 2338, 2331, 2322, 2308, 2304, 1681, 1681, 1681, 3450, 1681, + 3446, 1681, 3442, 1681, 1681, 3433, 2300, 2295, 1378, 1932, + -1000, 3418, 1681, 3414, 3410, 3405, 2270, 3398, 3388, 3384, + 1681, 1681, 1681, 2261, 3371, 3363, 3109, 3102, 3097, 3058, + 3048, 3044, 3028, 1681, 1554, 1554, 1554, 1554, 1554, 3024, + -279, 1681, 1378, -1000, -1000, -1000, -1000, -1000, 2996, 2256, + 2992, 2981, 2976, 2955, 1378, 1998, 831, -1000, -1000, 1554, + 1378, 1378, 1554, 1554, 2920, 2894, 2890, 2882, 2816, 2796, + 1681, 1681, -1000, 1681, 2774, 2762, 2234, 2190, 1378, -1000, + 1554, 55821, -1000, -454, -1000, -12, 912, 1998, -1000, 37917, + 1378, -1000, 4152, -1000, 1353, -1000, -1000, -1000, -1000, -1000, + 34933, 1828, -1000, -1000, -1000, -1000, 1998, 1802, -1000, -494, + 20759, -1000, -1000, -1000, 371, 56, 34187, 882, 882, 111, + 1527, 1527, 22251, -1000, -1000, -1000, -1000, -1000, -1000, 829, + 2639, 438, 1998, -1000, 1944, 2988, -1000, -1000, -1000, 2541, + 27473, -1000, -1000, 1998, 1998, 55821, 1839, 1799, -1000, 825, + -1000, 1370, 1923, 9, -9, -1000, -1000, -1000, -1000, 1527, + -1000, 1422, 353, 351, -1000, 462, -1000, -1000, -1000, -1000, + 2357, 75, -1000, -1000, -1000, 373, 371, -1000, -1000, -1000, + -1000, -1000, -1000, 1678, -1000, 1678, -1000, -1000, -1000, -1000, + -1000, 1277, -1000, -1000, -1000, -1000, 1274, -1000, -1000, 1271, + -1000, -1000, 2692, 2171, 384, -1000, -1000, 962, 1667, -1000, + -1000, 2375, 962, 962, 54329, -1000, -1000, 1829, 2517, 254, + 55821, 2207, -1000, 2144, 2144, 2144, -1000, 2503, -1000, -1000, + -1000, -1000, -1000, -1000, -526, 176, 364, -1000, -1000, -1000, + 5096, 54329, 1794, -1000, 226, -1000, 1765, -1000, 54329, -1000, + 1792, 2087, 54329, 54329, -1000, -1000, -1000, 54329, 1998, -1000, + -1000, -1000, -1000, 504, 2475, 332, -1000, -1000, -301, -1000, + -1000, 229, 226, 55075, 54329, 901, -1000, -1000, -1000, -1000, + -1000, -527, 1787, 490, 231, 334, 55821, 55821, 55821, 55821, + 55821, 55821, 791, -1000, -1000, 18, -1000, -1000, 203, -1000, + -1000, 1664, -1000, -1000, -1000, -1000, 203, -1000, -1000, -1000, + -1000, -1000, 274, 472, -1000, 55821, 55821, 931, -1000, -1000, + -1000, -1000, -1000, 1099, -1000, -1000, 1099, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2453, + 55821, -1, -491, -1000, -488, 22251, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1331, 506, 1412, 24489, 24489, 1029, 1029, + 24489, -1000, -1000, -1000, 996, 996, 33441, -1000, 24489, 22251, + -1000, -1000, 22251, 22251, 22251, 985, -1000, 22251, 1291, -1000, + 22251, -1000, -279, 1554, 1681, 1681, 1681, 1681, -279, -279, + -279, -279, -279, -279, -279, -279, -279, -279, 1926, -1000, + 22251, 22251, 22251, 1378, 333, -1000, -1000, -1000, -279, 22251, + -1000, -1000, 2645, -1000, 22251, -1000, 33441, 22251, 22251, 22251, + -1000, -1000, -1000, 22251, 22251, -1000, -1000, 22251, -1000, 22251, + -1000, -1000, -1000, -1000, -1000, -1000, 22251, -1000, 22251, -1000, + -1000, -1000, 22251, -1000, 22251, -1000, -1000, 22251, -1000, 22251, + -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, + -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, + -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, + -1000, 22251, -1000, -1000, -1000, 22251, -1000, 22251, -1000, 22251, + -1000, -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, 22251, + -1000, 22251, 22251, 22251, -1000, 22251, 22251, 22251, 22251, -1000, + -1000, -1000, -1000, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, -1000, -1000, -1000, -1000, -1000, -1000, 22251, + -1000, 39409, 8, -279, 1199, 8, 1199, 23743, 837, 817, + 22997, -1000, 22251, 16271, -1000, -1000, -1000, -1000, -1000, 22251, + 22251, 22251, 22251, 22251, 22251, -1000, -1000, -1000, 22251, 22251, + -1000, 22251, -1000, 22251, -1000, -1000, -1000, -1000, -1000, 912, + -1000, 471, 446, 877, 54329, -1000, -1000, -1000, -1000, 1922, + -1000, 2552, -1000, 2301, 2292, 2641, 2639, 21505, -1000, 29711, + -1000, -1000, 54329, -1000, -1000, -443, -1000, 2328, 2340, 882, + 882, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 13263, 2565, + 22251, 2204, 55075, 1998, -1000, 28219, 54329, 55075, 29711, 29711, + 29711, 29711, 29711, -1000, 2222, 2220, -1000, 2249, 2248, 2296, + 55821, -1000, 1764, 1781, -1000, 22251, 31949, 1886, 29711, -1000, + -1000, 29711, 55821, 12511, -1000, -1000, -5, -20, -1000, -1000, + -1000, -1000, 1369, -1000, -1000, 1213, 2535, 2351, -1000, -1000, + -1000, -1000, -1000, 1777, -1000, 1748, 1921, 1732, 1730, 336, + -1000, 2118, 2449, 962, 962, -1000, 1263, -1000, 1196, 1661, + 1655, -1000, -1000, -1000, 489, -1000, 55821, 2199, 2191, 2186, + -1000, -544, 1255, 2085, 2116, 22251, 2078, 2604, 1905, 54329, + -1000, -1000, 55075, -1000, 278, -1000, 384, 54329, -1000, -1000, + -1000, 323, 55821, -1000, 9274, -1000, -1000, -1000, 226, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 55821, 241, -1000, 2076, + 1361, -1000, -1000, 2131, -1000, -1000, -1000, -1000, -1000, 208, + 189, 1634, 196, 1622, -1000, 196, -1000, 55821, 923, 2171, + 55821, -1000, -1000, -1000, 1107, 1107, -1000, -1000, 2440, -1000, + 1196, 1681, 24489, 24489, -1000, 906, -1000, -1000, 503, -256, + 2072, 2072, -1000, 2072, 2074, -1000, 2072, 134, 2072, 127, + 2072, -1000, -1000, 1378, 1378, -1000, 1554, 2185, 1383, 2727, + -1000, 1527, 22251, 2719, -1000, -1000, -279, -279, -279, -279, + -279, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -78, 2712, 2706, 1681, -1000, 2070, 2062, -1000, 1681, + 22251, 1681, 1378, 2166, 1681, 1681, 1681, 1681, 1681, 1681, + 1681, 1681, 1681, 1681, 1681, 1681, 2162, 2158, 2154, 2150, + 2145, 2135, 2124, 2117, 2063, 2056, 2045, 2040, 2019, 1995, + 1991, 1979, 1681, 1681, 1974, 1681, 1969, 1928, -1000, 1527, + 1554, 2687, 1554, 1681, 1681, 2637, 330, 1681, 1728, 1728, + 1728, 1728, 1728, 1554, 1554, 1554, 1554, 1681, 54329, -1000, + -279, -1000, -1000, -373, -379, -1000, 1378, -279, 1913, 24489, + 1681, 24489, 24489, 24489, 1681, 1378, -1000, 1897, 1860, 2589, + 1855, 1681, 2378, 1681, 1681, 1681, 1812, -1000, 2536, 1998, + 2536, 1998, 2536, 1712, 1353, 55821, -1000, -1000, -1000, -1000, + 2639, 2629, -1000, 1906, -1000, 56, 616, -1000, 2360, 2340, + -1000, 2603, 2320, 2602, -1000, -1000, -1000, -1000, -1000, 1527, + -1000, 2478, 1896, -1000, 967, 1925, -1000, -1000, 20759, 1717, + 2284, 803, 1712, 1966, 2988, 2140, 2179, 3393, -1000, -1000, + -1000, -1000, 2168, -1000, 2164, -1000, -1000, 2015, -1000, 2366, + 337, 29711, 1965, 1965, -1000, 801, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1100, 9274, 2678, -1000, 1619, -1000, 1360, + 195, 1253, -1000, -1000, 962, 962, -1000, 1035, 1034, -1000, + 55821, 2060, -1000, 371, 1617, 371, 1249, -1000, -1000, 1244, + -1000, -1000, -1000, -1000, 2099, 2350, -1000, -1000, -1000, -1000, + 55821, -1000, 55821, 55821, 55821, 2050, 2601, -1000, 22251, 2048, + 965, 2617, 54329, 54329, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 427, 962, -505, 286, 282, + 962, 962, 962, -545, -1000, -1000, 1703, 1701, -1000, -190, + -1000, 22251, -1000, -1000, -1000, -1000, -1000, 1305, 1305, 1611, + 1609, 1588, -1000, 2015, -1000, -1000, -1000, 1696, -1000, -1000, + -203, 54329, 54329, 54329, 54329, -1000, -1000, -1000, 1209, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 22860, -1000, 22860, -1000, 22860, 1393, 22860, -1000, -1000, -1000, - -1000, -1000, 2569, 1489, 22860, 22860, -1000, 1211, 1209, -259, - 1538, -1000, -1000, -1000, 22860, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 22860, -1000, - 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, - 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, - 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, - -1000, 22860, -1000, -1000, -1000, 22860, -1000, 22860, -1000, 22860, - -1000, -1000, -1000, 22860, 264, 1076, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1406, 347, -1000, - -1000, -1000, 2650, -1000, 1406, 22860, 2007, -1000, 2007, 2007, - 2007, -1000, -1000, -1000, 22860, -1000, 22860, 22860, -1000, 22860, - -1000, 22860, -1000, -1000, -1000, -1000, 22860, 1830, 2374, 39184, - 1830, 39184, 1830, 32506, -1000, -1000, 2639, 2596, 2593, 2300, - 2312, 2312, 2311, -1000, 2589, 2587, -1000, 1472, 2585, 1458, - 1006, -1000, 55508, 22860, -1000, 223, 38442, -1000, 403, 54766, - 223, 54766, -1000, 2634, -1000, -1000, 22860, 2014, -1000, 22860, - -1000, -1000, -1000, -1000, 6271, 2642, 1877, -1000, -1000, 922, - -1000, 22860, -1000, 11485, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 1453, 1446, -1000, -1000, 2006, 22860, -1000, -1000, - -1000, 1663, 1652, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 2005, -1000, -1000, -1000, -1000, 335, -527, 2224, 54766, - 1206, -1000, 1632, 1913, 288, 223, 1432, 958, 958, 958, - 1161, 1152, 38442, 1605, -1000, 54766, 364, -1000, 335, -1000, - -222, -223, 1538, -1000, -1000, 2530, -1000, -1000, 16912, -1000, - -1000, 2003, 2141, -1000, -1000, -1000, -1000, 2264, -179, -200, - -1000, -1000, 1538, 1538, 1538, 1405, 1406, -1000, 1538, 1538, - 1633, 1543, -1000, -1000, 1538, 1538, 1538, 1538, 1538, 1538, - 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - 1538, 1538, 1538, 1538, 1478, 1778, -1000, 264, 1406, 2184, - -1000, -1000, 6271, -1000, -1000, 2634, 2579, 47, -1000, -1000, - 222, 47, 1393, 1032, 1406, 1406, 1032, 1760, 1538, 1660, - 1642, 1538, 1538, 33248, -1000, 2572, 2571, 1542, -1000, -1000, - 39184, 1542, 39184, 954, 2596, -270, 22860, 22860, 2297, 1164, - -1000, -1000, -1000, -1000, 1402, 1390, -1000, 1377, -1000, 2699, - -1000, 1393, -1000, 1830, 223, -1000, 808, 1907, -1000, 2569, - 1393, 54766, 1393, 75, 2634, -1000, 1538, -1000, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, -1000, - -1000, 54766, 2180, -1000, -1000, 2529, 1554, 166, -1000, 1475, - 1913, -1000, -1000, 221, -1000, 22860, -1000, 38442, 1374, 1360, - -1000, -1000, -1000, -1000, -541, -1000, -1000, -1000, -1000, -1000, - -1000, 392, 1888, -1000, 957, 54766, 56250, -1000, 2188, -1000, - -1000, -1000, -1000, 22860, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 906, 1378, 376, -205, 1378, -1000, -1000, 371, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 22251, + -1000, 22251, -1000, 22251, 1527, 22251, -1000, -1000, -1000, -1000, + -1000, 2565, 1581, 22251, 22251, -1000, 1226, 1204, -279, 1681, + -1000, -1000, -1000, 22251, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 22251, -1000, 22251, + -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, + -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, + -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, -1000, -1000, + 22251, -1000, -1000, -1000, 22251, -1000, 22251, -1000, 22251, -1000, + -1000, -1000, 22251, 233, 996, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1378, 329, -1000, -1000, + -1000, 2638, -1000, 1378, 22251, 1029, -1000, 1029, 1029, 1029, + -1000, -1000, -1000, 22251, -1000, 22251, 22251, -1000, 22251, -1000, + 22251, -1000, -1000, -1000, -1000, 22251, 1998, 2468, 38663, 1998, + 38663, 1998, 31949, -1000, -1000, 2629, 2591, 2597, 2309, 2311, + 2311, 2360, -1000, 2594, 2583, -1000, 1564, 2582, 1555, 1027, + -1000, 55075, 22251, -1000, 1998, 37917, -1000, 426, 54329, 1998, + 54329, -1000, 2577, -1000, -1000, 22251, 2036, -1000, 22251, -1000, + -1000, -1000, -1000, 5242, 2639, 1965, -1000, -1000, 916, -1000, + 22251, -1000, 10482, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1549, 1523, -1000, -1000, 2022, 22251, -1000, -1000, -1000, + 1629, 1563, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 2015, -1000, -1000, -1000, -1000, 323, -538, 2223, 54329, 1153, + -1000, 1699, 1905, 309, 1998, 1521, 962, 962, 962, 1139, + 1132, 37917, 1693, -1000, 54329, 350, -1000, 323, -1000, -250, + -251, 1681, -1000, -1000, 2524, -1000, -1000, 16271, -1000, -1000, + 2013, 2137, -1000, -1000, -1000, -1000, 2188, -187, -221, -1000, + -1000, 1681, 1681, 1681, 1189, 1378, -1000, 1681, 1681, 1548, + 1410, -1000, -1000, 1681, 1681, 1681, 1681, 1681, 1681, 1681, + 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, + 1681, 1681, 1681, 1554, 1808, -1000, 233, 1378, 2172, -1000, + -1000, 5242, -1000, -1000, 2577, 2579, 8, -1000, -1000, 221, + 8, 1527, 1019, 1378, 1378, 1019, 1790, 1681, 1775, 1726, + 1681, 1681, 32695, -1000, 2574, 2571, 1671, -1000, -1000, 38663, + 1671, 38663, 912, 2591, -288, 22251, 22251, 2305, 1207, -1000, + -1000, -1000, -1000, 1519, 1488, -1000, 1465, -1000, 2677, -1000, + 1527, -1000, 1998, 1998, -1000, 795, 1925, -1000, 2565, 1527, + 54329, 1527, 55, 2577, -1000, 1681, -1000, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, -1000, -1000, + 54329, 2181, -1000, -1000, 2513, 1688, 163, -1000, 1384, 1905, + -1000, -1000, 892, -1000, 22251, -1000, 37917, 1436, 1385, -1000, + -1000, -1000, -1000, -545, -1000, -1000, -1000, -1000, -1000, -1000, + 400, 1901, -1000, 960, 54329, 55821, -1000, 2161, -1000, -1000, + -1000, -1000, 22251, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 22860, -1000, 1406, 2181, -1000, -375, -1000, -504, 22860, - -259, -1000, -1000, -259, -1000, -1000, -1000, -1000, -1000, 22860, - -1000, -1000, 22860, -1000, 22860, -1000, -1000, 1542, -1000, -1000, - -1000, 37700, -1000, 1542, -1000, 1542, -1000, -270, -1000, 1882, - -1000, 54766, 1393, 345, -1000, 1162, -1000, -1000, -1000, -1000, - -1000, 55508, 54766, 1907, 54766, -1000, -1000, 1508, 1406, 1830, - 2569, -1000, 1482, -1000, 392, -1000, 2002, 2012, -1000, -1000, - -1000, 20634, -1000, -1000, -1000, -1000, -1000, 249, -185, 16912, - 12424, 1480, -1000, -184, 1538, 1478, -1000, -479, -1000, -1000, - -1000, -1000, 279, -1000, -1000, 1851, -1000, -1000, 1621, 1527, - 1444, -1000, -1000, -1000, -1000, -1000, -1000, -270, -1000, -1000, - 2525, -1000, -226, -1000, -1000, 1367, 1442, -1000, -1000, -1000, - 32506, 54024, -1000, -171, 293, -185, 22860, 1995, 1406, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -52, -1000, -1000, - 799, -1000, -1000, -1000, 2140, -189, -1000, -1000, -1000, 284, - -494, -291, -292, 25086, -1000, 22860, -1000, 22860, -1000, 22860, - -1000, 54766, 1830, -1000, -1000, -1000, 1426, -1000, 4978, -334, - 2177, -1000, -126, -1000, -1000, -1000, 1042, 1359, -1000, -1000, - -1000, -1000, -1000, -1000, 1936, 54766, -1000, 446, -1000, -1000, - 16164, -186, -201, 1000, -1000, -1000, -1000, -1000, -1000, 2007, - 1365, 1353, 1538, -1000, 54766, -1000, 54024, -314, 899, 6271, - -1000, 2164, 2159, 2656, -1000, -1000, -1000, -1000, -1000, -1000, - -544, 1356, 243, -1000, -1000, -1000, 284, -338, -1000, 22860, - -1000, 22860, -1000, 1406, -1000, -1000, 2494, 75, -1000, 2658, - -1000, 2643, 1016, 1016, -1000, 1136, -544, -1000, -1000, -1000, - -1000, 1538, 1538, -1000, -354, -1000, -1000, -1000, -1000, -1000, - 440, 1275, -1000, -1000, -1000, -1000, -1000, 6271, -1000, -1000, - -1000, 263, 263, -1000, -1000, + 22251, -1000, 1378, 2167, -1000, -375, -1000, -514, 22251, -279, + -1000, -1000, -279, -1000, -1000, -1000, -1000, -1000, 22251, -1000, + -1000, 22251, -1000, 22251, -1000, -1000, 1671, -1000, -1000, -1000, + 37171, -1000, 1671, -1000, 1671, -1000, -288, -1000, 1900, -1000, + 54329, 1527, 391, -1000, 1191, -1000, -1000, -1000, -1000, -1000, + 55075, 54329, 1925, 54329, -1000, -1000, 1628, 1378, 1998, 2565, + -1000, 1604, -1000, 400, -1000, 2012, 2116, -1000, -1000, -1000, + 20013, -1000, -1000, -1000, -1000, -1000, 272, -197, 16271, 11759, + 1602, -1000, -195, 1681, 1554, -1000, -481, -1000, -1000, -1000, + -1000, 263, -1000, -1000, 1892, -1000, -1000, 1714, 1710, 1677, + -1000, -1000, -1000, -1000, -1000, -1000, -288, -1000, -1000, 2511, + -1000, -253, -1000, -1000, 1890, 1547, -1000, -1000, -1000, 31949, + 53583, -1000, -179, 325, -197, 22251, 2011, 1378, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -40, -1000, -1000, 540, + -1000, -1000, -1000, 2131, -212, -1000, -1000, -1000, 292, -497, + -259, -293, 24489, -1000, 22251, -1000, 22251, -1000, 22251, -1000, + 54329, 1998, -1000, -1000, -1000, 1484, -1000, 4304, -394, 2163, + -1000, -143, -1000, -1000, -1000, 1049, 1373, -1000, -1000, -1000, + -1000, -1000, -1000, 1850, 54329, -1000, 435, -1000, -1000, 15519, + -203, -228, 1010, -1000, -1000, -1000, -1000, -1000, 1029, 1616, + 1377, 1681, -1000, 54329, -1000, 53583, -387, 901, 5242, -1000, + 2159, 2155, 2657, -1000, -1000, -1000, -1000, -1000, -1000, -548, + 1482, 242, -1000, -1000, -1000, 292, -328, -1000, 22251, -1000, + 22251, -1000, 1378, -1000, -1000, 2496, 55, -1000, 2672, -1000, + 2675, 1014, 1014, -1000, 1126, -548, -1000, -1000, -1000, -1000, + 1681, 1681, -1000, -396, -1000, -1000, -1000, -1000, -1000, 430, + 1220, -1000, -1000, -1000, -1000, -1000, 5242, -1000, -1000, -1000, + 235, 235, -1000, -1000, } var yyPgo = [...]int{ - 0, 3243, 3242, 31, 6, 37, 36, 3240, 3239, 3238, - 174, 3237, 3235, 3224, 3223, 3222, 3221, 2754, 2745, 2728, - 3220, 3219, 3218, 3215, 3213, 3211, 3210, 3209, 3208, 38, - 116, 91, 104, 201, 213, 3205, 170, 161, 197, 3203, - 3202, 3201, 115, 187, 84, 92, 195, 3200, 3199, 71, - 3196, 3194, 3192, 190, 189, 188, 1092, 3190, 184, 114, - 48, 3189, 3187, 3184, 3182, 3179, 3178, 3176, 3174, 3173, - 3172, 3170, 3169, 3168, 3165, 3163, 3162, 3161, 3160, 285, - 3157, 3155, 12, 3154, 73, 3153, 3152, 3149, 3147, 3146, - 8, 3140, 3139, 26, 45, 63, 3136, 3134, 44, 3132, - 3131, 3129, 3125, 3124, 72, 3123, 27, 3121, 40, 3120, - 3117, 124, 3115, 3111, 3105, 42, 3104, 3100, 3098, 28, - 169, 3097, 3094, 140, 3093, 3092, 3087, 167, 205, 3085, - 2265, 3082, 99, 3080, 3079, 3077, 166, 193, 3076, 125, - 3074, 3073, 3072, 152, 3068, 3263, 3066, 3065, 59, 80, - 164, 3064, 3062, 199, 79, 54, 3061, 17, 19, 3060, - 3058, 67, 70, 3057, 108, 3056, 3054, 103, 77, 3052, - 105, 102, 3051, 3050, 5, 7, 3048, 1, 4, 2, - 83, 3047, 3044, 119, 3041, 3040, 3039, 101, 3037, 3035, - 4407, 3031, 93, 130, 106, 76, 3028, 171, 132, 3027, - 3026, 3022, 3021, 3016, 2985, 49, 2984, 2983, 2982, 136, - 22, 110, 2981, 146, 346, 51, 147, 2978, 196, 78, - 2977, 172, 2971, 2969, 134, 133, 2968, 2962, 58, 168, - 194, 2960, 96, 129, 120, 176, 95, 135, 2954, 2946, - 56, 62, 2944, 2943, 2940, 2939, 181, 2935, 2929, 61, - 2927, 53, 2925, 182, 2924, 306, 69, 2922, 180, 162, - 2921, 60, 2919, 2918, 68, 100, 55, 39, 2914, 157, - 160, 127, 165, 2913, 2912, 52, 2905, 2899, 2894, 200, - 301, 2891, 2890, 329, 183, 143, 149, 85, 2887, 323, - 2886, 2885, 2884, 16, 5094, 7550, 186, 25, 159, 2883, - 2882, 8334, 20, 43, 24, 2872, 210, 2869, 185, 2867, - 2866, 2865, 211, 207, 112, 158, 57, 2864, 2859, 2857, - 2856, 64, 2855, 2850, 2849, 2848, 2847, 2846, 35, 34, - 33, 75, 218, 65, 21, 98, 156, 151, 66, 2843, - 2841, 2839, 123, 90, 2835, 155, 153, 126, 163, 2829, - 175, 142, 117, 2823, 87, 32, 2822, 2821, 2819, 2818, - 89, 2813, 2810, 2806, 2805, 150, 144, 121, 81, 2803, - 82, 118, 148, 145, 50, 2799, 46, 2798, 2797, 30, - 191, 29, 2787, 13, 111, 109, 2780, 6691, 2779, 9, - 305, 154, 2776, 2775, 10, 11, 14, 2772, 2771, 2770, - 2769, 131, 2768, 2765, 2763, 2761, 23, 47, 18, 15, - 113, 137, 74, 2760, 2746, 141, 2732, 2727, 2722, 0, - 1034, 128, 2721, 202, + 0, 3261, 3259, 47, 7, 36, 34, 3256, 3254, 3239, + 178, 3238, 3237, 3236, 3235, 3234, 3233, 2715, 2702, 2700, + 3229, 3228, 3226, 3225, 3224, 3222, 3220, 3218, 3217, 48, + 110, 72, 108, 213, 215, 3216, 3215, 184, 173, 202, + 3209, 3208, 3207, 116, 193, 83, 87, 197, 3202, 3195, + 78, 3191, 3189, 3188, 191, 190, 189, 1088, 3187, 188, + 114, 50, 3186, 3185, 3182, 3178, 3176, 3175, 3174, 3172, + 3170, 3168, 3167, 3165, 3162, 3156, 3155, 3153, 3150, 3146, + 309, 3143, 3142, 10, 3141, 66, 3139, 3135, 3133, 3130, + 3126, 12, 3125, 3123, 19, 42, 60, 3122, 3119, 49, + 3118, 3114, 3112, 3109, 3107, 45, 3105, 27, 3104, 37, + 3103, 3102, 128, 3100, 3099, 3098, 38, 3097, 3095, 3094, + 5, 170, 3093, 3091, 142, 3090, 3082, 3081, 169, 222, + 3078, 2332, 3074, 99, 3071, 3068, 3061, 174, 200, 3058, + 122, 3057, 3055, 3053, 155, 3044, 3333, 3041, 3039, 68, + 76, 156, 3036, 3034, 199, 74, 11, 3031, 15, 17, + 3030, 3025, 69, 64, 3021, 111, 3013, 3010, 103, 65, + 3009, 100, 97, 3008, 3006, 23, 18, 3003, 6, 1, + 8, 82, 3002, 3001, 119, 2997, 2983, 2982, 93, 2981, + 2979, 3360, 2977, 90, 136, 106, 70, 2968, 171, 153, + 2967, 2966, 2965, 2964, 2963, 2960, 53, 2958, 2957, 2954, + 140, 29, 113, 2953, 2950, 146, 346, 130, 54, 132, + 2947, 149, 2945, 203, 77, 2943, 175, 2941, 2940, 135, + 134, 2938, 2937, 57, 168, 194, 2928, 96, 131, 121, + 150, 94, 133, 2926, 2925, 58, 61, 2911, 2909, 2907, + 2904, 177, 2902, 2901, 62, 2900, 56, 2899, 167, 2897, + 302, 67, 2896, 180, 185, 2895, 73, 2891, 2889, 91, + 95, 102, 26, 2888, 163, 166, 127, 182, 2887, 2884, + 55, 2881, 2879, 2878, 201, 280, 2877, 2873, 308, 179, + 144, 152, 84, 2871, 325, 2869, 2864, 2863, 40, 4520, + 6444, 192, 22, 165, 2860, 2856, 7650, 44, 39, 24, + 2855, 210, 2854, 183, 2853, 2846, 2841, 238, 207, 112, + 164, 59, 2839, 2838, 2836, 2835, 35, 2830, 2828, 2818, + 2816, 2814, 2813, 33, 32, 31, 92, 216, 81, 20, + 98, 172, 157, 63, 2812, 2811, 2810, 125, 85, 2809, + 162, 159, 126, 101, 2807, 186, 145, 118, 2804, 105, + 30, 2799, 2798, 2797, 2796, 89, 2795, 2794, 2791, 2786, + 154, 147, 123, 79, 2784, 80, 120, 151, 148, 52, + 2782, 43, 2781, 2780, 28, 195, 25, 2776, 41, 107, + 117, 2775, 6234, 2774, 9, 335, 161, 2771, 2765, 4, + 13, 16, 2764, 2759, 2748, 2741, 138, 2740, 2739, 2738, + 2732, 21, 46, 14, 2, 115, 141, 71, 2730, 2727, + 143, 2726, 2724, 2708, 0, 1034, 129, 2701, 204, } -//line sql.y:8764 +//line sql.y:8811 type yySymType struct { union any empty struct{} @@ -8490,6 +8457,11 @@ func (st *yySymType) tableSpecUnion() *TableSpec { return v } +func (st *yySymType) tableStmtUnion() TableStatement { + v, _ := st.union.(TableStatement) + return v +} + func (st *yySymType) trimTypeUnion() TrimType { v, _ := st.union.(TrimType) return v @@ -8576,235 +8548,237 @@ func (st *yySymType) withUnion() *With { } var yyR1 = [...]int{ - 0, 417, 418, 418, 7, 7, 7, 7, 7, 7, + 0, 422, 423, 423, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 261, 387, 259, 259, 28, 74, 36, 36, 35, - 35, 38, 38, 37, 31, 31, 31, 32, 32, 32, + 7, 266, 392, 264, 264, 28, 75, 37, 37, 36, + 36, 39, 39, 38, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, - 29, 29, 29, 29, 30, 30, 30, 30, 30, 15, - 16, 34, 34, 17, 17, 109, 109, 18, 19, 19, - 19, 19, 421, 421, 185, 185, 183, 183, 184, 184, - 264, 264, 20, 268, 268, 270, 270, 270, 270, 260, - 260, 260, 21, 21, 269, 269, 271, 271, 271, 274, - 274, 274, 274, 315, 315, 315, 22, 22, 22, 22, - 22, 129, 129, 389, 389, 388, 383, 383, 382, 382, - 381, 386, 386, 385, 385, 384, 40, 41, 50, 50, - 50, 50, 51, 52, 390, 390, 356, 57, 57, 56, - 56, 56, 56, 56, 56, 58, 58, 54, 54, 53, - 53, 55, 55, 358, 358, 344, 344, 357, 357, 357, - 357, 357, 357, 357, 343, 343, 140, 140, 238, 238, - 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, - 238, 238, 238, 238, 238, 405, 405, 405, 404, 404, - 239, 239, 239, 239, 239, 239, 239, 239, 149, 149, - 161, 161, 161, 161, 161, 161, 147, 147, 148, 146, - 146, 146, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 160, 160, 155, 155, 155, 157, 157, 156, 156, 156, - 158, 158, 406, 406, 406, 406, 321, 321, 321, 321, - 324, 324, 322, 322, 322, 322, 322, 322, 322, 322, - 322, 323, 323, 323, 323, 323, 323, 323, 325, 325, - 325, 325, 325, 326, 326, 326, 326, 326, 326, 326, - 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, - 327, 327, 327, 327, 327, 327, 327, 327, 342, 342, - 331, 331, 336, 336, 337, 337, 338, 338, 338, 339, - 339, 339, 340, 340, 333, 333, 333, 333, 333, 333, - 333, 333, 333, 335, 335, 334, 334, 334, 345, 370, - 370, 369, 369, 367, 367, 367, 367, 367, 367, 367, - 367, 354, 354, 364, 364, 364, 364, 364, 353, 353, - 349, 349, 349, 350, 350, 351, 351, 348, 348, 352, - 352, 366, 366, 365, 365, 346, 346, 347, 347, 372, - 407, 407, 407, 407, 407, 408, 408, 373, 397, 399, - 399, 399, 398, 398, 395, 396, 394, 394, 394, 394, - 394, 84, 84, 84, 287, 287, 288, 288, 362, 362, - 361, 361, 361, 363, 363, 360, 360, 360, 360, 360, - 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, - 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, - 360, 360, 360, 360, 360, 360, 282, 282, 282, 393, - 393, 393, 393, 393, 393, 392, 392, 392, 359, 359, - 359, 359, 391, 391, 59, 59, 219, 219, 410, 410, - 412, 412, 412, 47, 47, 47, 47, 47, 47, 46, - 46, 46, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 48, 48, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 23, 23, 23, 23, 23, + 29, 29, 29, 29, 30, 30, 30, 30, 30, 35, + 35, 15, 16, 34, 34, 34, 17, 17, 110, 110, + 18, 19, 19, 19, 19, 426, 426, 186, 186, 184, + 184, 185, 185, 269, 269, 20, 273, 273, 275, 275, + 275, 275, 265, 265, 265, 21, 21, 274, 274, 276, + 276, 276, 279, 279, 279, 279, 320, 320, 320, 22, + 22, 22, 22, 22, 130, 130, 394, 394, 393, 388, + 388, 387, 387, 386, 391, 391, 390, 390, 389, 41, + 42, 51, 51, 51, 51, 52, 53, 395, 395, 361, + 58, 58, 57, 57, 57, 57, 57, 57, 59, 59, + 55, 55, 54, 54, 56, 56, 363, 363, 349, 349, + 362, 362, 362, 362, 362, 362, 362, 348, 348, 141, + 141, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 410, 410, + 410, 409, 409, 244, 244, 244, 244, 244, 244, 244, + 244, 150, 150, 162, 162, 162, 162, 162, 162, 148, + 148, 149, 147, 147, 147, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 161, 161, 156, 156, 156, 158, 158, + 157, 157, 157, 159, 159, 411, 411, 411, 411, 326, + 326, 326, 326, 329, 329, 327, 327, 327, 327, 327, + 327, 327, 327, 327, 328, 328, 328, 328, 328, 328, + 328, 330, 330, 330, 330, 330, 331, 331, 331, 331, + 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, + 331, 331, 331, 332, 332, 332, 332, 332, 332, 332, + 332, 347, 347, 336, 336, 341, 341, 342, 342, 343, + 343, 343, 344, 344, 344, 345, 345, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 340, 340, 339, 339, + 339, 350, 375, 375, 374, 374, 372, 372, 372, 372, + 372, 372, 372, 372, 359, 359, 369, 369, 369, 369, + 369, 358, 358, 354, 354, 354, 355, 355, 356, 356, + 353, 353, 357, 357, 371, 371, 370, 370, 351, 351, + 352, 352, 377, 412, 412, 412, 412, 412, 413, 413, + 378, 402, 404, 404, 404, 403, 403, 400, 401, 399, + 399, 399, 399, 399, 85, 85, 85, 292, 292, 293, + 293, 367, 367, 366, 366, 366, 368, 368, 365, 365, + 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, + 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, + 365, 365, 365, 365, 365, 365, 365, 365, 365, 287, + 287, 287, 398, 398, 398, 398, 398, 398, 397, 397, + 397, 364, 364, 364, 364, 396, 396, 60, 60, 224, + 224, 415, 415, 417, 417, 417, 48, 48, 48, 48, + 48, 48, 47, 47, 47, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 49, 49, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 111, - 111, 112, 112, 112, 112, 114, 114, 114, 375, 375, - 60, 60, 3, 3, 173, 175, 176, 176, 174, 174, - 174, 174, 174, 174, 62, 62, 61, 61, 178, 177, - 179, 179, 179, 1, 1, 2, 2, 4, 4, 380, - 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, - 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, - 380, 341, 341, 341, 374, 374, 376, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 117, 116, 116, - 115, 118, 118, 118, 118, 118, 118, 118, 118, 378, - 378, 378, 63, 63, 379, 328, 329, 330, 5, 6, - 355, 377, 125, 125, 24, 39, 39, 25, 25, 25, - 25, 26, 26, 64, 67, 67, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 292, 292, 281, 281, 290, 290, 280, 280, - 306, 306, 306, 283, 283, 283, 284, 284, 403, 403, - 403, 277, 277, 66, 66, 66, 307, 307, 307, 307, - 69, 69, 413, 413, 414, 414, 415, 415, 415, 70, - 71, 71, 310, 310, 311, 311, 72, 73, 85, 85, - 85, 85, 85, 86, 86, 86, 86, 86, 86, 110, - 110, 110, 10, 10, 10, 10, 81, 81, 81, 9, - 9, 11, 68, 68, 75, 400, 400, 401, 402, 402, - 402, 402, 76, 78, 27, 27, 27, 27, 27, 27, - 135, 135, 123, 123, 123, 123, 123, 123, 123, 123, - 123, 123, 123, 123, 130, 130, 130, 124, 124, 422, - 79, 80, 80, 128, 128, 128, 121, 121, 121, 127, - 127, 127, 12, 12, 13, 263, 263, 14, 14, 134, - 134, 133, 133, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 131, 131, 132, 132, 132, 132, - 299, 299, 299, 298, 298, 167, 167, 169, 168, 168, - 170, 170, 171, 171, 171, 171, 217, 217, 193, 193, - 256, 256, 257, 257, 255, 255, 262, 262, 258, 258, - 258, 258, 265, 265, 172, 172, 172, 172, 180, 180, - 181, 181, 182, 182, 309, 309, 304, 304, 304, 303, - 303, 186, 186, 186, 188, 187, 187, 187, 187, 189, - 189, 191, 191, 190, 190, 192, 197, 197, 196, 196, - 194, 194, 194, 194, 194, 194, 195, 195, 195, 195, - 198, 198, 145, 145, 145, 145, 145, 145, 145, 145, - 411, 411, 159, 159, 159, 159, 159, 159, 159, 162, - 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, - 246, 246, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 222, 222, 221, 221, 87, 87, 87, 88, - 88, 89, 89, 89, 89, 89, 90, 90, 90, 90, - 90, 90, 90, 92, 92, 91, 91, 212, 212, 296, - 296, 93, 94, 94, 95, 95, 98, 98, 97, 96, - 96, 102, 102, 99, 99, 101, 101, 100, 103, 103, - 104, 105, 105, 278, 278, 199, 199, 208, 208, 208, - 208, 200, 200, 201, 201, 201, 201, 201, 201, 209, - 209, 209, 216, 210, 210, 206, 206, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 164, 164, 164, 164, 227, 227, 151, 151, 151, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 112, 112, 113, 113, 113, 113, 115, 115, + 115, 380, 380, 61, 61, 3, 3, 174, 176, 177, + 177, 175, 175, 175, 175, 175, 175, 63, 63, 62, + 62, 179, 178, 180, 180, 180, 1, 1, 2, 2, + 4, 4, 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 385, 385, 346, 346, 346, 379, 379, 381, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 118, 117, 117, 116, 119, 119, 119, 119, 119, 119, + 119, 119, 383, 383, 383, 64, 64, 384, 333, 334, + 335, 5, 6, 360, 382, 126, 126, 24, 40, 40, + 25, 25, 25, 25, 26, 26, 65, 68, 68, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 297, 297, 286, 286, 295, + 295, 285, 285, 311, 311, 311, 288, 288, 288, 289, + 289, 408, 408, 408, 282, 282, 67, 67, 67, 312, + 312, 312, 312, 70, 70, 418, 418, 419, 419, 420, + 420, 420, 71, 72, 72, 315, 315, 316, 316, 73, + 74, 86, 86, 86, 86, 86, 87, 87, 87, 87, + 87, 87, 111, 111, 111, 10, 10, 10, 10, 82, + 82, 82, 9, 9, 11, 69, 69, 76, 405, 405, + 406, 407, 407, 407, 407, 77, 79, 27, 27, 27, + 27, 27, 27, 136, 136, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 131, 131, 131, + 125, 125, 427, 80, 81, 81, 129, 129, 129, 122, + 122, 122, 128, 128, 128, 12, 12, 13, 268, 268, + 14, 14, 135, 135, 134, 134, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 132, 132, 133, + 133, 133, 133, 304, 304, 304, 303, 303, 168, 168, + 170, 169, 169, 171, 171, 172, 172, 172, 172, 222, + 222, 194, 194, 261, 261, 262, 262, 260, 260, 267, + 267, 263, 263, 263, 263, 270, 270, 173, 173, 173, + 173, 181, 181, 182, 182, 183, 183, 314, 314, 309, + 309, 309, 308, 308, 187, 187, 187, 189, 188, 188, + 188, 188, 190, 190, 192, 192, 191, 191, 193, 198, + 198, 197, 197, 195, 195, 195, 195, 195, 195, 196, + 196, 196, 196, 199, 199, 146, 146, 146, 146, 146, + 146, 146, 146, 416, 416, 160, 160, 160, 160, 160, + 160, 160, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 251, 251, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, - 151, 151, 152, 152, 165, 165, 165, 165, 166, 166, - 166, 166, 166, 166, 166, 317, 317, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 120, 120, 120, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 227, 227, 226, 226, 88, + 88, 88, 89, 89, 90, 90, 90, 90, 90, 91, + 91, 91, 91, 91, 91, 91, 93, 93, 92, 92, + 213, 213, 301, 301, 94, 95, 95, 96, 96, 99, + 99, 98, 97, 97, 103, 103, 100, 100, 102, 102, + 101, 104, 104, 105, 106, 106, 283, 283, 200, 200, + 209, 209, 209, 209, 201, 201, 202, 202, 202, 202, + 202, 202, 210, 210, 210, 221, 211, 211, 207, 207, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 165, 165, 165, 165, 232, 232, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 153, 153, 166, 166, 166, + 166, 167, 167, 167, 167, 167, 167, 167, 322, 322, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 423, 423, 332, 332, 332, - 207, 207, 207, 207, 207, 126, 126, 126, 126, 126, - 314, 314, 314, 318, 318, 318, 316, 316, 316, 316, - 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, - 316, 319, 319, 225, 225, 122, 122, 223, 223, 224, - 226, 226, 218, 218, 218, 218, 220, 220, 203, 203, - 203, 228, 228, 320, 320, 229, 229, 106, 107, 107, - 108, 108, 230, 230, 232, 231, 231, 233, 234, 234, - 234, 235, 235, 236, 236, 236, 49, 49, 49, 49, - 49, 44, 44, 44, 44, 45, 45, 45, 45, 137, - 137, 137, 137, 139, 139, 138, 138, 82, 82, 83, - 83, 83, 143, 143, 144, 144, 144, 141, 141, 142, - 142, 253, 253, 253, 253, 253, 253, 253, 237, 237, - 237, 244, 244, 244, 240, 240, 242, 242, 242, 243, - 243, 243, 241, 250, 250, 252, 252, 251, 251, 247, - 247, 248, 248, 249, 249, 249, 245, 245, 202, 202, - 202, 202, 202, 254, 254, 254, 254, 308, 308, 308, - 266, 266, 213, 213, 215, 215, 214, 214, 163, 267, - 267, 275, 272, 272, 273, 273, 300, 300, 300, 276, - 276, 289, 289, 285, 285, 286, 286, 279, 279, 291, - 291, 291, 77, 211, 211, 371, 371, 368, 295, 295, - 297, 297, 301, 301, 305, 305, 302, 302, 8, 416, - 416, 416, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 419, 420, 312, 313, 313, 313, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 428, 428, + 337, 337, 337, 208, 208, 208, 208, 208, 127, 127, + 127, 127, 127, 319, 319, 319, 323, 323, 323, 321, + 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, + 321, 321, 321, 321, 324, 324, 230, 230, 123, 123, + 228, 228, 229, 231, 231, 223, 223, 223, 223, 225, + 225, 204, 204, 204, 233, 233, 325, 325, 234, 234, + 107, 108, 108, 109, 109, 235, 235, 237, 236, 236, + 238, 239, 239, 239, 240, 240, 241, 241, 241, 50, + 50, 50, 50, 50, 45, 45, 45, 45, 46, 46, + 46, 46, 138, 138, 138, 138, 140, 140, 139, 139, + 83, 83, 84, 84, 84, 144, 144, 145, 145, 145, + 142, 142, 143, 143, 258, 258, 258, 258, 258, 258, + 258, 242, 242, 242, 249, 249, 249, 245, 245, 247, + 247, 247, 248, 248, 248, 246, 255, 255, 257, 257, + 256, 256, 252, 252, 253, 253, 254, 254, 254, 250, + 250, 203, 203, 203, 203, 203, 259, 259, 259, 259, + 313, 313, 313, 271, 271, 214, 214, 215, 215, 219, + 219, 218, 218, 216, 217, 220, 220, 164, 272, 272, + 280, 277, 277, 278, 278, 305, 305, 305, 281, 281, + 294, 294, 290, 290, 291, 291, 284, 284, 296, 296, + 296, 78, 212, 212, 376, 376, 373, 300, 300, 302, + 302, 306, 306, 310, 310, 307, 307, 8, 421, 421, + 421, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 424, 425, 317, 318, + 318, 318, } var yyR2 = [...]int{ @@ -8815,164 +8789,165 @@ var yyR2 = [...]int{ 0, 1, 1, 1, 1, 2, 3, 2, 3, 0, 1, 3, 1, 4, 3, 3, 4, 3, 2, 3, 4, 3, 4, 2, 7, 1, 3, 3, 3, 3, - 1, 2, 1, 1, 3, 2, 3, 3, 2, 5, - 7, 10, 9, 7, 8, 1, 1, 10, 11, 9, - 8, 8, 1, 1, 1, 3, 1, 3, 1, 3, - 0, 4, 3, 1, 3, 3, 3, 3, 3, 1, - 1, 2, 5, 4, 1, 3, 3, 2, 2, 2, - 2, 2, 1, 1, 1, 1, 2, 2, 6, 12, - 2, 0, 2, 0, 2, 1, 0, 2, 1, 3, - 3, 0, 1, 1, 3, 3, 6, 4, 7, 8, - 8, 8, 5, 3, 1, 1, 5, 0, 1, 1, - 1, 1, 2, 2, 2, 0, 1, 4, 4, 4, - 4, 4, 4, 2, 4, 1, 3, 1, 1, 3, - 4, 3, 3, 3, 5, 10, 0, 2, 0, 2, - 3, 5, 3, 4, 2, 3, 2, 3, 3, 3, - 3, 2, 2, 4, 4, 1, 1, 1, 1, 1, - 0, 2, 2, 3, 3, 2, 2, 2, 1, 1, - 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 1, 3, 2, 3, 3, 2, 3, + 3, 5, 7, 10, 9, 1, 7, 8, 1, 1, + 10, 11, 9, 8, 8, 1, 1, 1, 3, 1, + 3, 1, 3, 0, 4, 3, 1, 3, 3, 3, + 3, 3, 1, 1, 2, 5, 4, 1, 3, 3, + 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, + 2, 6, 12, 2, 0, 2, 0, 2, 1, 0, + 2, 1, 3, 3, 0, 1, 1, 3, 3, 6, + 4, 7, 8, 8, 8, 5, 3, 1, 1, 5, + 0, 1, 1, 1, 1, 2, 2, 2, 0, 1, + 4, 4, 4, 4, 4, 4, 2, 4, 1, 3, + 1, 1, 3, 4, 3, 3, 3, 5, 10, 0, + 2, 0, 2, 3, 5, 3, 4, 2, 3, 2, + 3, 3, 3, 3, 2, 2, 4, 4, 1, 1, + 1, 1, 1, 0, 2, 2, 3, 3, 2, 2, + 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, + 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, - 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, - 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, - 2, 2, 1, 1, 1, 1, 1, 5, 2, 5, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 0, 3, 0, 5, 1, 3, 0, 3, 5, 0, - 1, 1, 0, 1, 0, 3, 3, 2, 2, 2, - 1, 2, 2, 0, 1, 0, 2, 2, 5, 0, - 1, 1, 2, 1, 3, 2, 1, 1, 3, 3, - 3, 0, 1, 4, 3, 3, 4, 2, 0, 2, - 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, - 1, 1, 3, 3, 4, 3, 1, 3, 1, 7, - 6, 7, 7, 8, 8, 0, 1, 5, 2, 1, - 1, 1, 0, 1, 3, 3, 1, 1, 2, 2, - 2, 0, 1, 1, 1, 2, 0, 1, 0, 1, - 1, 3, 2, 1, 2, 3, 3, 3, 4, 4, - 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 2, 1, 1, 2, 1, 2, 1, 3, + 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 2, 1, 2, 2, 2, 2, 3, 3, 3, 2, + 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, + 5, 2, 5, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 0, 3, 0, 5, 1, 3, 0, + 3, 5, 0, 1, 1, 0, 1, 0, 3, 3, + 2, 2, 2, 1, 2, 2, 0, 1, 0, 2, + 2, 5, 0, 1, 1, 2, 1, 3, 2, 1, + 1, 3, 3, 3, 0, 1, 4, 3, 3, 4, + 2, 0, 2, 1, 1, 1, 1, 1, 0, 1, + 1, 1, 0, 1, 1, 3, 3, 4, 3, 1, + 3, 1, 7, 6, 7, 7, 8, 8, 0, 1, + 5, 2, 1, 1, 1, 0, 1, 3, 3, 1, + 1, 2, 2, 2, 0, 1, 1, 1, 2, 0, + 1, 0, 1, 1, 3, 2, 1, 2, 3, 3, + 3, 4, 4, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 4, 5, 0, 2, 2, 1, + 3, 3, 3, 3, 3, 3, 3, 4, 5, 0, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 1, 1, 0, 1, 0, 1, 0, + 2, 0, 2, 0, 2, 2, 0, 1, 5, 1, + 3, 7, 1, 3, 3, 1, 2, 2, 2, 5, + 5, 5, 6, 8, 5, 5, 4, 4, 4, 6, + 5, 5, 5, 2, 2, 2, 2, 3, 3, 3, + 4, 3, 3, 1, 3, 5, 1, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 2, 2, 3, 4, + 4, 2, 11, 3, 6, 8, 6, 6, 6, 13, + 8, 6, 6, 10, 7, 5, 5, 5, 5, 7, + 5, 5, 5, 5, 5, 7, 7, 5, 5, 5, + 5, 6, 0, 6, 5, 6, 4, 5, 0, 8, + 9, 0, 3, 0, 1, 0, 3, 8, 4, 1, + 3, 3, 6, 7, 7, 8, 4, 0, 1, 0, + 1, 3, 3, 1, 1, 2, 1, 1, 0, 2, + 0, 2, 5, 3, 7, 4, 4, 4, 4, 3, + 3, 3, 7, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 0, 2, 2, 1, 3, 2, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 1, 3, 3, 0, 2, 2, 2, 2, 2, + 2, 2, 4, 4, 3, 0, 1, 4, 3, 4, + 4, 3, 3, 3, 2, 1, 3, 3, 3, 5, + 7, 7, 6, 5, 3, 2, 4, 5, 5, 3, + 3, 7, 3, 3, 3, 3, 4, 7, 5, 2, + 4, 4, 4, 4, 4, 5, 5, 4, 4, 4, + 4, 4, 4, 4, 4, 2, 2, 4, 4, 4, + 4, 4, 2, 3, 3, 3, 3, 3, 5, 2, + 3, 3, 2, 3, 4, 4, 4, 3, 4, 4, + 5, 3, 5, 3, 5, 0, 1, 0, 1, 0, + 1, 1, 1, 0, 2, 2, 0, 2, 2, 0, + 2, 0, 1, 1, 1, 1, 2, 1, 3, 1, + 1, 1, 1, 1, 3, 0, 1, 1, 3, 3, + 2, 2, 1, 1, 5, 0, 1, 0, 1, 2, + 3, 0, 3, 3, 3, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 4, 4, 4, 2, 2, 3, 1, 3, + 2, 1, 2, 1, 2, 2, 4, 3, 3, 6, + 4, 7, 6, 1, 3, 2, 2, 2, 2, 1, + 1, 1, 3, 2, 1, 1, 1, 0, 1, 1, + 0, 3, 0, 2, 0, 2, 1, 2, 2, 0, + 1, 1, 0, 1, 1, 5, 5, 4, 0, 2, + 4, 4, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 0, 1, 0, 1, 0, 2, 0, 2, - 0, 2, 2, 0, 1, 5, 1, 3, 7, 1, - 3, 3, 1, 2, 2, 2, 5, 5, 5, 6, - 8, 5, 5, 4, 4, 4, 6, 5, 5, 5, - 2, 2, 2, 2, 3, 3, 3, 4, 3, 3, - 1, 3, 5, 1, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 3, 4, 4, 2, 11, - 3, 6, 8, 6, 6, 6, 13, 8, 6, 6, - 10, 7, 5, 5, 5, 5, 7, 5, 5, 5, - 5, 5, 7, 7, 5, 5, 5, 5, 6, 0, - 6, 5, 6, 4, 5, 0, 8, 9, 0, 3, - 0, 1, 0, 3, 8, 4, 1, 3, 3, 6, - 7, 7, 8, 4, 0, 1, 0, 1, 3, 3, - 1, 1, 2, 1, 1, 0, 2, 0, 2, 5, - 3, 7, 4, 4, 4, 4, 3, 3, 3, 7, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 0, 2, 2, 1, 3, 2, 0, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 3, 1, 3, - 3, 0, 2, 2, 2, 2, 2, 2, 2, 4, - 4, 3, 0, 1, 4, 3, 4, 4, 3, 3, - 3, 2, 1, 3, 3, 3, 5, 7, 7, 6, - 5, 3, 2, 4, 5, 5, 3, 3, 7, 3, - 3, 3, 3, 4, 7, 5, 2, 4, 4, 4, - 4, 4, 5, 5, 4, 4, 4, 4, 4, 4, - 4, 4, 2, 2, 4, 4, 4, 4, 4, 2, - 3, 3, 3, 3, 3, 5, 2, 3, 3, 2, - 3, 4, 4, 4, 3, 4, 4, 5, 3, 5, - 3, 5, 0, 1, 0, 1, 0, 1, 1, 1, - 0, 2, 2, 0, 2, 2, 0, 2, 0, 1, - 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, - 1, 3, 0, 1, 1, 3, 3, 2, 2, 1, - 1, 5, 0, 1, 0, 1, 2, 3, 0, 3, - 3, 3, 1, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, 1, 4, - 4, 4, 2, 2, 3, 1, 3, 2, 1, 2, - 1, 2, 2, 4, 3, 3, 6, 4, 7, 6, - 1, 3, 2, 2, 2, 2, 1, 1, 1, 3, - 2, 1, 1, 1, 0, 1, 1, 0, 3, 0, - 2, 0, 2, 1, 2, 2, 0, 1, 1, 0, - 1, 1, 5, 5, 4, 0, 2, 4, 4, 0, - 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 1, 2, 3, 5, - 0, 1, 2, 1, 1, 0, 1, 2, 1, 3, - 1, 1, 1, 4, 3, 1, 1, 2, 3, 7, - 0, 3, 0, 1, 1, 3, 1, 3, 1, 1, - 3, 3, 1, 3, 4, 4, 4, 3, 2, 4, - 0, 1, 0, 2, 0, 1, 0, 1, 2, 1, - 1, 1, 2, 2, 1, 2, 3, 2, 3, 2, - 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, - 6, 5, 6, 6, 5, 5, 0, 2, 3, 3, - 0, 2, 3, 3, 3, 2, 3, 1, 3, 6, - 1, 1, 3, 4, 3, 4, 4, 4, 1, 3, - 4, 5, 6, 3, 4, 5, 6, 3, 4, 1, - 1, 1, 3, 3, 3, 3, 3, 3, 5, 5, - 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, - 1, 3, 1, 1, 1, 2, 2, 2, 2, 1, - 1, 2, 7, 7, 6, 6, 2, 2, 5, 6, - 3, 3, 1, 3, 1, 3, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 4, 2, 4, 0, 1, 2, 5, 0, 3, 0, - 1, 4, 4, 2, 1, 0, 0, 1, 1, 2, - 2, 1, 1, 2, 2, 0, 1, 1, 1, 1, - 5, 1, 3, 0, 3, 1, 1, 1, 2, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 4, 6, 4, 4, 8, - 8, 6, 8, 6, 5, 4, 10, 2, 2, 1, - 2, 2, 2, 2, 2, 5, 6, 6, 6, 6, - 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 8, 4, 8, 8, 6, 5, 4, 4, 4, - 5, 7, 4, 4, 7, 4, 4, 6, 6, 6, - 8, 6, 6, 4, 4, 3, 4, 6, 6, 4, - 4, 6, 4, 6, 4, 4, 4, 4, 4, 4, - 6, 4, 6, 4, 4, 4, 6, 4, 6, 4, - 4, 6, 4, 6, 4, 6, 8, 4, 6, 8, + 2, 3, 5, 0, 1, 2, 1, 1, 0, 1, + 2, 1, 3, 1, 1, 1, 4, 3, 1, 1, + 2, 3, 7, 0, 3, 0, 1, 1, 3, 1, + 3, 1, 1, 3, 3, 1, 3, 4, 4, 4, + 3, 2, 4, 0, 1, 0, 2, 0, 1, 0, + 1, 2, 1, 1, 1, 2, 2, 1, 2, 3, + 2, 3, 2, 2, 2, 1, 1, 3, 3, 0, + 1, 1, 2, 6, 5, 6, 6, 5, 5, 0, + 2, 3, 3, 0, 2, 3, 3, 3, 2, 3, + 1, 3, 6, 1, 1, 3, 4, 3, 4, 4, + 4, 1, 3, 4, 5, 6, 3, 4, 5, 6, + 3, 4, 1, 1, 1, 3, 3, 3, 3, 3, + 3, 5, 5, 3, 3, 3, 3, 3, 3, 1, + 1, 1, 1, 1, 3, 1, 1, 1, 2, 2, + 2, 2, 1, 1, 2, 7, 7, 6, 6, 2, + 2, 5, 6, 3, 3, 1, 3, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 4, 2, 4, 0, 1, 2, 5, + 0, 3, 0, 1, 4, 4, 2, 1, 0, 0, + 1, 1, 2, 2, 1, 1, 2, 2, 0, 1, + 1, 1, 1, 5, 1, 3, 0, 3, 1, 1, + 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 4, 6, + 4, 4, 8, 8, 6, 8, 6, 5, 4, 10, + 2, 2, 1, 2, 2, 2, 2, 2, 5, 6, + 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 8, 4, 8, 8, 6, 5, + 4, 4, 4, 5, 7, 4, 4, 7, 4, 4, + 6, 6, 6, 8, 6, 6, 4, 4, 3, 4, + 6, 6, 4, 4, 6, 4, 6, 4, 4, 4, + 4, 4, 4, 6, 4, 6, 4, 4, 4, 6, + 4, 6, 4, 4, 6, 4, 6, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, - 6, 8, 4, 4, 4, 6, 4, 6, 4, 8, - 6, 4, 4, 6, 4, 6, 8, 4, 6, 8, - 4, 4, 6, 8, 6, 4, 6, 6, 8, 10, - 7, 8, 8, 9, 4, 4, 4, 4, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, - 4, 4, 4, 4, 6, 4, 6, 5, 9, 6, - 9, 8, 6, 8, 8, 8, 6, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 2, 6, 8, 10, - 12, 14, 6, 8, 8, 10, 12, 14, 6, 8, - 10, 12, 6, 8, 4, 4, 3, 4, 6, 6, - 4, 6, 4, 6, 8, 0, 2, 1, 1, 1, + 6, 8, 4, 6, 8, 4, 4, 4, 6, 4, + 6, 4, 8, 6, 4, 4, 6, 4, 6, 8, + 4, 6, 8, 4, 4, 6, 8, 6, 4, 6, + 6, 8, 10, 7, 8, 8, 9, 4, 4, 4, + 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 4, 4, 4, 4, 4, 4, 6, 4, 6, + 5, 9, 6, 9, 8, 6, 8, 8, 8, 6, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, + 6, 8, 10, 12, 14, 6, 8, 8, 10, 12, + 14, 6, 8, 10, 12, 6, 8, 4, 4, 3, + 4, 6, 6, 4, 6, 4, 6, 8, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 2, 0, 2, 3, - 4, 4, 4, 4, 4, 0, 3, 4, 7, 3, - 1, 1, 1, 0, 5, 5, 2, 3, 1, 2, - 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, - 1, 0, 1, 0, 1, 0, 2, 1, 2, 4, - 0, 2, 1, 1, 3, 5, 1, 1, 1, 2, - 2, 0, 4, 0, 2, 0, 2, 2, 1, 3, - 0, 1, 0, 1, 3, 1, 3, 2, 0, 1, - 1, 0, 1, 2, 4, 4, 0, 2, 2, 1, - 1, 3, 3, 3, 3, 3, 3, 3, 3, 0, - 3, 3, 3, 0, 3, 1, 1, 0, 4, 0, - 1, 1, 0, 3, 1, 3, 2, 1, 1, 0, - 1, 2, 3, 4, 2, 3, 4, 4, 9, 3, - 5, 0, 3, 3, 0, 1, 0, 2, 2, 0, - 2, 2, 2, 0, 2, 1, 2, 3, 3, 0, - 2, 1, 2, 3, 4, 3, 0, 1, 3, 1, - 6, 5, 4, 1, 3, 3, 5, 0, 2, 5, - 0, 5, 1, 3, 1, 2, 3, 4, 1, 1, - 3, 3, 1, 2, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 0, 2, 0, 3, 0, 1, 0, - 1, 1, 5, 0, 1, 0, 1, 2, 1, 1, - 1, 1, 1, 1, 0, 1, 1, 1, 3, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, + 0, 2, 3, 4, 4, 4, 4, 4, 0, 3, + 4, 7, 3, 1, 1, 1, 0, 5, 5, 2, + 3, 1, 2, 2, 1, 2, 1, 2, 2, 1, + 2, 2, 1, 1, 0, 1, 0, 1, 0, 2, + 1, 2, 4, 0, 2, 1, 1, 3, 5, 1, + 1, 1, 2, 2, 0, 4, 0, 2, 0, 2, + 2, 1, 3, 0, 1, 0, 1, 3, 1, 3, + 2, 0, 1, 1, 0, 1, 2, 4, 4, 0, + 2, 2, 1, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 0, 3, 3, 3, 0, 3, 1, 1, + 0, 4, 0, 1, 1, 0, 3, 1, 3, 2, + 1, 1, 0, 1, 2, 3, 4, 2, 3, 4, + 4, 9, 3, 5, 0, 3, 3, 0, 1, 0, + 2, 2, 0, 2, 2, 2, 0, 2, 1, 2, + 3, 3, 0, 2, 1, 2, 3, 4, 3, 0, + 1, 3, 1, 6, 5, 4, 1, 3, 3, 5, + 0, 2, 5, 0, 5, 1, 3, 1, 3, 1, + 3, 1, 2, 3, 4, 1, 1, 1, 1, 3, + 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 0, 2, 0, 3, 0, 1, 0, 1, + 1, 5, 0, 1, 0, 1, 2, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -9036,568 +9011,571 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, } var yyChk = [...]int{ - -1000, -417, -79, -422, -7, -29, -15, -16, -17, -18, - -19, -20, -21, -22, -23, -24, -25, -26, -64, -67, - -65, -66, -69, -70, -71, -72, -73, -9, -11, -68, - -27, -28, -74, -75, -76, -77, -78, -12, -13, -14, - -8, -32, -31, -30, 13, 14, -109, -35, 35, -40, - -50, 240, -51, -41, 241, -52, 243, 242, 280, 244, - 397, 273, 83, 330, 331, 333, 334, 335, 336, -110, - 704, 278, 279, 246, 39, 51, 36, 37, 40, 250, - 286, 287, 249, 145, -33, -36, 12, -419, 15, 487, - 275, 274, 31, -34, 597, 95, -80, -418, 752, -253, - -237, 26, 36, 32, -236, -232, -128, -237, 24, 22, - 11, -79, -79, -79, 16, 17, -79, -356, -358, 95, - 173, 95, -79, -57, -56, -54, -53, -55, -58, 34, - -47, -48, -380, -46, -43, 245, 242, 290, 135, 136, - 280, 281, 282, 244, 264, 279, 283, 278, 299, -42, - 90, 36, 597, 600, -363, 241, 247, 248, 243, 488, - 138, 137, 84, -360, 392, 631, 722, -58, 724, 110, - 113, 723, 50, 254, 725, 726, 727, 638, 728, 263, - 729, 730, 731, 732, 738, 679, 739, 740, 741, 139, - 11, -79, -305, -301, 100, -294, 594, 266, 629, 441, - 630, 315, 90, 47, 42, 533, 604, 388, 392, 631, - 518, 722, 398, 330, 348, 342, 523, 524, 525, 371, - 363, 595, 632, 605, 318, 267, 303, 716, 361, 149, - 724, 322, 633, 281, 399, 400, 634, 401, 110, 333, - 438, 737, 321, 635, 735, 113, 723, 338, 88, 517, - 57, 719, 326, 50, 276, 446, 447, 359, 249, 355, - 725, 304, 636, 607, 297, 138, 135, 744, 39, 351, - 56, 33, 734, 137, 55, 726, 164, 637, 727, 638, - 403, 378, 710, 54, 404, 282, 639, 93, 287, 599, - 327, 718, 405, 538, 352, 406, 314, 733, 246, 640, - 325, 699, 691, 692, 407, 408, 711, 383, 379, 384, - 540, 641, 430, 522, 409, 695, 696, 751, 58, 642, - 643, 712, 136, 644, 87, 728, 89, 346, 347, 645, - 312, 265, 543, 544, 432, 375, 500, 127, 507, 508, - 120, 121, 503, 122, 509, 123, 128, 510, 511, 512, - 501, 124, 117, 502, 513, 514, 376, 377, 125, 515, - 119, 118, 504, 506, 126, 516, 263, 38, 410, 596, - 316, 64, 320, 291, 433, 52, 381, 748, 51, 706, - 545, 646, 709, 374, 370, 497, 59, 647, 648, 649, - 650, 519, 729, 373, 345, 369, 743, 4, 309, 492, - 520, 730, 68, 248, 386, 385, 387, 298, 429, 366, - 651, 652, 653, 270, 91, 654, 356, 25, 655, 656, - 411, 305, 657, 62, 658, 659, 436, 279, 660, 60, - 731, 45, 661, 284, 745, 732, 662, 663, 664, 705, - 665, 286, 666, 413, 667, 693, 694, 412, 380, 382, - 546, 293, 414, 397, 251, 598, 668, 328, 350, 283, - 736, 669, 271, 534, 535, 536, 537, 717, 542, 541, - 285, 290, 278, 437, 272, 670, 671, 672, 673, 674, - 319, 690, 675, 676, 334, 602, 738, 498, 49, 677, - 678, 679, 680, 681, 313, 308, 431, 440, 67, 92, - 394, 682, 683, 715, 344, 339, 43, 306, 99, 478, - 480, 481, 482, 483, 484, 479, 486, 684, 331, 61, - 739, 740, 741, 300, 742, 526, 527, 528, 529, 13, - 580, 563, 591, 564, 581, 565, 574, 566, 582, 590, - 592, 547, 555, 548, 556, 586, 569, 583, 575, 568, - 567, 589, 572, 576, 549, 557, 587, 573, 550, 558, - 551, 559, 552, 560, 585, 584, 577, 588, 553, 561, - 579, 554, 562, 578, 570, 571, 449, 749, 750, 521, - 416, 139, 310, 311, 53, 367, 292, 685, 323, 686, - 357, 358, 494, 495, 372, 343, 368, 146, 702, 332, - 341, 700, 294, 417, 499, 280, 687, 439, 307, 389, - 131, 340, 395, 324, 603, 539, 299, 418, 714, 601, - 530, 531, 365, 362, 301, 532, 688, 390, 704, 419, - 255, 295, 296, 689, 701, 420, 421, 317, 422, 423, - 424, 425, 426, 428, 329, 427, 703, 697, 698, 302, - 477, 600, 337, 360, 396, 459, 460, 461, 462, 463, - 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, - 474, 475, 476, 496, 253, -79, 253, -190, -301, -130, - 706, 708, 192, -272, 400, -290, 402, 415, 410, 420, - 408, -281, 411, 413, 293, -403, 430, 253, 417, 240, - 403, 412, 421, 422, 317, 428, 423, 329, 427, 302, - 424, 425, 426, -387, 192, 727, 742, 332, 340, 149, - 364, 407, 405, 431, 706, 100, -307, 100, 101, 102, - -294, 332, -310, 337, -295, -387, -294, 335, -79, -79, - -312, -312, -130, -210, -145, 157, -159, -261, -162, 101, - -150, -153, -204, -205, -206, -207, -160, -220, -259, 181, - 182, 189, 158, -216, -163, 29, 593, 489, 488, 192, - 34, 235, 77, 78, 491, 492, 160, 63, 15, 454, - 455, -161, 444, 445, 456, 450, 451, 517, 519, 520, + -1000, -422, -80, -427, -7, -29, -15, -16, -17, -18, + -19, -20, -21, -22, -23, -24, -25, -26, -65, -68, + -66, -67, -70, -71, -72, -73, -74, -9, -11, -69, + -27, -28, -75, -76, -77, -78, -79, -12, -13, -14, + -8, -32, -31, -30, 13, 14, -110, -36, 35, -41, + -51, 240, -52, -42, 241, -53, 243, 242, 280, 244, + 397, 273, 83, 330, 331, 333, 334, 335, 336, -111, + 708, 278, 279, 246, 39, 51, 36, 37, 40, 250, + 286, 287, 249, 145, -33, -37, 12, -424, 15, 487, + 275, 274, 31, -34, 597, 95, -35, 63, -81, -423, + 756, -258, -242, 26, 36, 32, -241, -237, -129, -242, + 24, 22, 11, -80, -80, -80, 16, 17, -80, -361, + -363, 95, 173, 95, -80, -58, -57, -55, -54, -56, + -59, 34, -48, -49, -385, -47, -44, 245, 242, 290, + 135, 136, 280, 281, 282, 244, 264, 279, 283, 278, + 299, -43, 90, 36, 597, 600, -368, 241, 247, 248, + 243, 488, 138, 137, 84, -365, 392, 631, 726, -59, + 728, 110, 113, 727, 50, 254, 729, 730, 731, 638, + 732, 263, 733, 734, 735, 736, 742, 679, 743, 744, + 745, 139, 11, -80, -310, -306, 100, -299, 594, 266, + 629, 441, 630, 315, 90, 47, 42, 533, 604, 388, + 392, 631, 518, 726, 398, 330, 348, 342, 523, 524, + 525, 371, 363, 595, 632, 605, 318, 267, 303, 720, + 361, 149, 728, 322, 633, 281, 399, 400, 634, 401, + 110, 333, 438, 741, 321, 635, 739, 113, 727, 338, + 88, 517, 57, 723, 326, 50, 276, 446, 447, 359, + 249, 355, 729, 304, 636, 607, 297, 138, 135, 748, + 39, 351, 56, 33, 738, 137, 55, 730, 164, 637, + 731, 638, 403, 378, 714, 54, 404, 282, 639, 93, + 287, 599, 327, 722, 405, 538, 352, 406, 314, 737, + 246, 640, 325, 703, 695, 696, 407, 408, 715, 383, + 379, 384, 540, 641, 430, 522, 409, 699, 700, 755, + 58, 642, 643, 716, 136, 644, 87, 732, 89, 346, + 347, 645, 312, 265, 543, 544, 432, 375, 500, 127, + 507, 508, 120, 121, 503, 122, 509, 123, 128, 510, + 511, 512, 501, 124, 117, 502, 513, 514, 376, 377, + 125, 515, 119, 118, 504, 506, 126, 516, 263, 38, + 410, 596, 316, 64, 320, 291, 433, 52, 381, 752, + 51, 710, 545, 646, 713, 374, 370, 497, 691, 59, + 647, 648, 649, 650, 519, 733, 373, 345, 369, 747, + 4, 309, 492, 520, 734, 68, 248, 386, 385, 387, + 298, 429, 366, 651, 652, 653, 270, 91, 654, 356, + 25, 655, 656, 411, 305, 657, 62, 658, 659, 436, + 279, 660, 60, 735, 692, 45, 661, 284, 749, 736, + 662, 663, 664, 709, 665, 286, 666, 413, 667, 697, + 698, 412, 380, 382, 546, 293, 414, 397, 693, 251, + 598, 668, 328, 350, 283, 740, 669, 271, 534, 535, + 536, 537, 721, 542, 541, 285, 290, 278, 437, 272, + 670, 671, 672, 673, 674, 319, 690, 675, 676, 334, + 602, 742, 498, 49, 677, 678, 679, 680, 681, 313, + 308, 431, 440, 67, 92, 394, 682, 683, 719, 344, + 339, 43, 306, 99, 478, 480, 481, 482, 483, 484, + 479, 486, 684, 331, 61, 743, 744, 745, 300, 746, + 526, 527, 528, 529, 13, 580, 563, 591, 564, 581, + 565, 574, 566, 582, 590, 592, 547, 555, 548, 556, + 586, 569, 583, 575, 568, 567, 589, 572, 576, 549, + 557, 587, 573, 550, 558, 551, 559, 552, 560, 585, + 584, 577, 588, 553, 561, 579, 554, 562, 578, 570, + 571, 449, 753, 754, 521, 416, 694, 139, 310, 311, + 53, 367, 292, 685, 323, 686, 357, 358, 494, 495, + 372, 343, 368, 146, 706, 332, 341, 704, 294, 417, + 499, 280, 687, 439, 307, 389, 131, 340, 395, 324, + 603, 539, 299, 418, 718, 601, 530, 531, 365, 362, + 301, 532, 688, 390, 708, 419, 255, 295, 296, 689, + 705, 420, 421, 317, 422, 423, 424, 425, 426, 428, + 329, 427, 707, 701, 702, 302, 477, 600, 337, 360, + 396, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 496, + 253, -80, 253, -191, -306, -131, 710, 712, 192, -277, + 400, -295, 402, 415, 410, 420, 408, -286, 411, 413, + 293, -408, 430, 253, 417, 240, 403, 412, 421, 422, + 317, 428, 423, 329, 427, 302, 424, 425, 426, -392, + 192, 731, 746, 332, 340, 149, 364, 407, 405, 431, + 710, 100, -312, 100, 101, 102, -299, 332, -315, 337, + -300, -392, -299, 335, -80, -80, -317, -317, -131, -211, + -146, 157, -160, -266, -163, 101, -151, -154, -205, -206, + -207, -208, -161, -225, -264, 181, 182, 189, 158, -221, + -164, 29, 593, 489, 488, 192, 34, 235, 77, 78, + 491, 492, 160, 63, 15, 454, 455, -162, 444, 445, + 456, 450, 451, 517, 519, 520, 521, 518, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 522, 533, + 494, 495, 129, 496, 117, 119, 118, 127, 128, 497, + 498, 499, 361, 545, 546, 540, 543, 544, 542, 541, + 376, 377, 500, 563, 564, 568, 567, 565, 566, 569, + 572, 573, 574, 575, 576, 577, 579, 578, 570, 571, + 548, 547, 549, 550, 551, 552, 553, 554, 556, 555, + 557, 558, 559, 560, 561, 562, 580, 581, 582, 583, + 584, 586, 585, 590, 589, 587, 588, 592, 591, 501, + 502, 120, 121, 122, 123, 124, 125, 126, 503, 506, + 504, 505, 507, 508, 509, 514, 515, 510, 511, 512, + 513, 516, 387, 385, 386, 382, 381, 380, -90, -103, + 620, 619, -104, 441, 446, 447, 449, -152, -153, -166, + -167, -300, -306, 258, 443, 252, 187, 487, -155, -149, + -223, 116, 102, -31, -220, 442, 452, 453, 457, 448, + 458, 606, 608, 623, 624, 626, 611, 616, 615, 618, + 534, 535, 536, 537, 538, 539, 695, 696, 697, 698, + 699, 700, 701, 702, -392, -299, 100, -158, -156, -200, + 103, 108, 111, 112, 114, -414, 276, 357, 358, 130, + -424, -216, -217, -157, 105, 106, 107, 132, 133, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 724, 98, 104, 50, 416, 416, -191, -80, -80, + -80, -80, -421, 727, 598, -235, -129, -237, -33, -31, + -424, 12, -80, -31, -32, -30, -37, -39, 625, -38, + -306, -80, 109, -242, -258, 16, 67, 176, 48, 56, + -240, -241, -34, -31, -146, 23, 41, 27, -133, 183, + -146, -306, -133, -284, 257, -80, -80, -273, -320, 332, + -275, 431, 710, 430, -265, -278, 100, -264, -277, 429, + 101, -362, 173, -348, -352, -300, 268, -378, 264, -191, + -371, -370, -300, -424, -130, -294, 254, 262, 261, 150, + -395, 153, 310, 443, 252, -54, -55, -56, -277, 191, + 730, -112, 285, 289, 96, 96, -352, -351, -350, -396, + 289, 268, -377, -369, 260, 269, -358, 261, 262, -353, + 254, 151, -396, -353, 259, 269, 264, 268, 289, 289, + 139, 289, 139, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 284, -359, 165, -359, 601, 601, -365, -396, + 264, 254, -396, -396, 260, -296, -353, 256, 28, 256, + 38, 38, -359, -359, -359, -277, 191, -359, -359, -359, + -359, 297, 297, -359, -359, -359, -359, -359, -359, -359, + -359, -359, -359, -359, -359, -359, -359, -359, -359, -359, + 253, -395, -138, 427, 317, 90, -57, 299, -40, -191, + -294, 254, 255, -395, 286, -191, 236, 253, 713, -288, + 173, 19, -288, -285, 416, 414, 401, 406, -288, -288, + -288, -288, 300, 399, -354, 254, 38, 265, 416, 300, + 399, 300, 301, 300, 301, 409, 419, 300, -311, 18, + 176, 443, 404, 408, 293, 253, 294, 255, 418, 301, + -311, 98, -289, 173, 300, 416, 410, 296, -288, -288, + -318, -424, -302, -300, -298, 245, 41, 156, 28, 30, + 159, 192, 142, 23, 160, 40, 247, 364, 264, 191, + 260, 488, 240, 81, 606, 444, 451, 442, 450, 454, + 490, 491, 443, 402, 34, 17, 608, 31, 274, 27, + 44, 185, 242, 163, 609, 277, 29, 275, 129, 133, + 611, 26, 84, 269, 18, 262, 46, 20, 612, 613, + 21, 74, 258, 257, 176, 254, 79, 15, 235, 32, + 172, 75, 614, 151, 145, 615, 616, 617, 618, 143, + 77, 173, 24, 750, 452, 453, 36, 711, 593, 288, + 187, 82, 65, 712, 157, 448, 619, 620, 130, 621, + 134, 85, 717, 153, 22, 80, 48, 622, 289, 623, + 259, 751, 624, 434, 625, 174, 243, 487, 78, 175, + 724, 626, 725, 252, 415, 12, 493, 35, 273, 261, + 73, 72, 141, 76, 458, 627, 253, 162, 256, 144, + 132, 11, 150, 37, 16, 83, 86, 455, 456, 457, + 63, 140, 597, 161, 19, 628, 435, 155, -392, 713, + -318, -318, 300, 341, 35, 101, -418, -419, -420, 597, + 434, 256, -300, -191, -86, 703, 244, -87, 709, 41, + 251, 146, 38, -136, 416, -124, 192, 731, 714, 715, + 716, 713, 413, 721, 719, 717, 300, 718, 96, 153, + 155, 156, 4, -146, 172, -201, -202, 171, 165, 166, + 167, 168, 169, 170, 177, 176, 157, 159, 173, -251, + 154, 178, 179, 180, 181, 182, 183, 184, 186, 185, + 187, 188, 174, 175, 191, 238, 239, -154, -154, -154, + -154, -221, -227, -226, -424, -223, -392, -299, -306, -424, + -424, -154, -283, -424, -151, -424, -424, -424, -424, -424, + -230, -146, -424, -424, -428, -424, -428, -428, -428, -337, + -424, -337, -337, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, 236, -424, + -424, -424, -424, -424, -337, -337, -337, -337, -337, -337, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, 98, 112, 108, 111, 103, 114, + 98, 98, 98, 98, -31, -32, -211, 63, -424, -317, + -405, -406, -194, -191, -424, 317, -300, -300, 286, 105, + -240, -34, -31, -235, -241, -237, -31, -80, -122, -135, + 69, 70, -134, -137, 27, 44, 74, 76, 99, 72, + 73, 71, 41, -425, 97, -425, -258, -425, 96, -39, + -261, 95, 115, -214, -219, -217, 724, 653, 683, 653, + 683, 67, 49, 98, 98, 96, 25, -236, -238, -146, + 18, -304, 4, -303, 28, -300, 98, 236, 18, -192, + 32, -191, -284, -284, 96, 100, 332, -274, -276, 432, + 434, 165, -305, -300, 98, 34, 97, 96, -191, -326, + -329, -331, -330, -332, -327, -328, 361, 362, 192, 365, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 378, + 390, 35, 276, 357, 358, 359, 360, 379, 380, 381, + 382, 384, 385, 386, 387, 342, 363, 595, 343, 344, + 345, 346, 347, 348, 350, 351, 354, 352, 353, 355, + 356, -301, -300, 95, 97, 96, -336, 95, -146, -138, + 253, -300, 254, 254, 254, -291, 258, 487, -359, -359, + -359, 284, 23, -47, -44, -385, 22, -43, -44, 245, + 135, 136, 242, 95, -348, 95, -357, -301, -300, 95, + 151, 259, 150, -356, -353, -356, -357, -300, -223, -300, + 151, 151, -300, -300, -270, -300, -270, -270, 41, -270, + 41, -270, 41, 105, -300, -270, 41, -270, 41, -270, + 41, -270, 41, -270, 41, 34, 87, 88, 89, 34, + 91, 92, 93, -223, -300, -300, -223, -348, -223, -191, + -300, -277, 105, 105, 105, -359, -359, 105, 98, 98, + 98, -359, -359, 105, 98, -308, -306, 98, 98, -397, + 270, 314, 316, 105, 105, 105, 105, 34, 98, -398, + 34, 738, 737, 739, 740, 741, 98, 105, 34, 105, + 34, 105, -300, 95, -191, -144, 304, 240, 242, 245, + 85, 98, 322, 320, 321, 318, 323, 324, 325, 165, + 50, 96, 256, 253, -300, -290, 258, -290, -300, -307, + -306, -298, -191, 256, 398, 98, -146, -355, 18, 176, + -311, -311, -288, -191, -355, -311, -288, -191, -288, -288, + -288, -288, -311, -311, -311, -288, -306, -306, -191, -191, + -191, -191, -191, -191, -191, -318, -289, -288, 713, 98, + -282, 18, 85, -318, -318, -297, 26, 26, 96, 338, + 435, 436, -316, 335, -82, -300, 98, -10, -29, -18, + -17, -19, 165, -10, 96, 597, -184, -191, 713, 713, + 713, 713, 713, 713, -146, -146, -146, -146, 621, -209, + -416, 157, 132, 133, 130, 131, -163, 42, 43, 41, + -146, -210, -216, -221, 115, 176, 159, 173, -251, -151, + -154, -151, -151, -151, -151, -151, -151, 235, -151, 235, + -151, -151, -151, -151, -151, -151, -319, -300, 98, 192, + -159, -158, 114, -414, -159, 594, 96, -226, 236, -146, + -146, -392, -120, 460, 461, 462, 463, 465, 466, 467, + 470, 471, 475, 476, 459, 477, 464, 469, 472, 473, + 474, 468, 360, -146, -212, -211, -212, -146, -146, -228, + -229, 161, -223, -146, -425, -425, 105, 183, -128, 27, + 44, -128, -128, -128, -128, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -128, -146, -121, 459, 477, + 464, 469, 472, 473, 474, 468, 360, 478, 479, 480, + 481, 482, 483, 484, 485, 486, -121, -120, -146, -146, + -146, -146, -146, -146, -146, -146, -88, -146, 142, 143, + 144, -211, -146, -151, -146, -146, -146, -425, -146, -146, + -146, -212, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -391, -390, + -389, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -211, -211, -211, -211, -211, -146, + -425, -146, -165, -149, 105, -266, 114, 101, -146, -146, + -146, -146, -146, -146, -212, -302, -307, -298, -299, -211, + -212, -212, -211, -211, -146, -146, -146, -146, -146, -146, + -146, -146, -425, -146, -146, -146, -146, -146, -258, -425, + -211, 96, -407, 434, 435, 711, -309, 289, -308, 28, + -212, 98, 18, -268, 86, -300, -240, -240, 69, 70, + 65, -132, -133, -137, -425, -38, 28, -260, -300, 96, + -424, 646, 646, 68, 98, -338, -277, 388, 389, 192, + -146, -146, 96, -239, 30, 31, -191, -303, 183, -307, + -191, -269, 289, -191, -169, -171, -172, -173, -194, -222, + -424, -174, -31, 617, 614, 18, -184, -185, -193, -306, + -275, -320, -274, 96, 433, 435, 436, 85, 134, -146, + -339, 191, -367, -366, -365, -348, -350, -351, -352, 97, + -339, -344, 395, 394, -336, -336, -336, -336, -336, -338, + -338, -338, -338, 95, -336, 95, -336, -336, -336, -336, + -341, 95, -341, -341, -342, -341, 95, -342, -343, 95, + -343, -378, -146, -375, -374, -372, -373, 263, 110, 689, + 645, 597, 638, 679, 86, -370, -239, 105, -425, -144, + -291, -376, -373, -300, -300, -300, -306, 157, 100, 98, + 100, 98, 100, 98, -113, -61, -1, 750, 751, 752, + 96, 23, -349, -348, -60, 314, -381, -382, 289, -377, + -371, -357, 151, -356, -357, -357, -300, 96, 32, 139, + 139, 139, 139, 597, 242, 35, -292, 637, 157, 689, + 645, -348, -60, 256, 256, -319, -319, -319, 98, 98, + -287, 746, -184, -140, 306, 165, 295, 295, 253, 308, + 253, 308, -191, 319, 322, 320, 321, 318, 323, 324, + 325, 326, 41, 41, 41, 41, 41, 41, 41, 307, + 309, 311, 297, -191, -191, -290, 85, -186, -191, 29, + -306, 98, 98, -191, -288, -288, -191, -288, -288, -191, + 98, -306, -420, 339, -300, 375, 704, 706, -124, 434, + 96, 597, 26, -125, 26, -424, -416, 132, 133, -221, + -221, -221, -210, -151, -154, -151, 156, 277, -151, -151, + -424, -223, -425, -302, 28, 96, 86, -425, 181, 96, + -425, -425, 96, 18, 96, -231, -229, 163, -146, -425, + 96, -425, -425, -211, -146, -146, -146, -146, -425, -425, + -425, -425, -425, -425, -425, -425, -425, -425, -211, -425, + 96, 96, 18, -323, 28, -425, -425, -425, -425, 96, + -425, -425, -230, -425, 18, -425, 86, 96, 176, 96, + -425, -425, -425, 96, 96, -425, -425, 96, -425, 96, + -425, -425, -425, -425, -425, -425, 96, -425, 96, -425, + -425, -425, 96, -425, 96, -425, -425, 96, -425, 96, + -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, + -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, + -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, + -425, 96, -425, -425, -425, 96, -425, 96, -425, 96, + -425, -425, 96, -425, 96, -425, 96, -425, 96, 96, + -425, 96, 96, 96, -425, 96, 96, 96, 96, -425, + -425, -425, -425, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, -425, -425, -425, -425, -425, -425, 96, + -95, 622, -425, -425, 96, -425, 96, 96, 96, 96, + 96, -425, -424, 236, -425, -425, -425, -425, -425, 96, + 96, 96, 96, 96, 96, -425, -425, -425, 96, 96, + -425, 96, -425, 96, -425, -406, 710, 435, -198, -197, + -195, 83, 257, 84, -424, -308, -425, -159, -266, -267, + -266, -204, -300, 105, 114, -242, -168, 96, -170, 18, + -221, 97, 96, -219, -425, -338, -246, -252, -285, -300, + 98, 192, -340, 192, -340, 388, 389, -238, 236, -199, + 19, -203, 35, 63, -29, -424, -424, 35, 96, -187, + -189, -188, -190, 75, 79, 81, 76, 77, 78, 82, + -314, 28, -31, -169, -31, -424, -191, -184, -426, 18, + 86, -426, 96, 236, -276, -279, 437, 434, 440, -392, + 98, -112, 96, -365, -352, -243, -141, 46, -345, 396, + -338, 605, -338, -347, 98, -347, 105, 105, 105, 97, + -50, -45, -46, 36, 90, -372, -359, 98, 45, -359, + -359, -300, 97, -239, -140, -191, 85, -376, -376, -376, + 29, -2, 749, 755, 151, 95, 401, 22, -260, 96, + 97, -224, 315, 97, -114, -300, 97, 95, -357, -357, + -300, -424, 253, 34, 34, 689, 645, 637, -60, -224, + -223, -300, -339, 748, 747, 97, 255, 313, -145, 454, + -142, 98, 100, -191, -191, -191, -191, -191, -191, 245, + 242, 424, -415, 327, 98, -415, 298, 256, -184, -191, + 96, -85, 272, 267, -311, -311, 36, -191, 434, 722, + 720, -146, 156, 277, -163, -154, -120, -120, -151, -321, + 192, 361, 276, 359, 355, 375, 366, 394, 357, 395, + 352, 351, 350, -321, -319, -151, -211, -146, -146, -146, + 164, -146, 162, -146, -96, -95, -425, -425, -425, -425, + -425, -96, -96, -96, -96, -96, -96, -96, -96, -96, + -96, -235, -146, -146, -146, -425, 192, 361, -96, -146, + 18, -146, -319, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -389, -146, + -211, -146, -211, -146, -146, -146, -146, -146, -390, -390, + -390, -390, -390, -211, -211, -211, -211, -146, -424, -300, + -99, -98, -97, 672, 257, -95, -165, -99, -165, 235, + -146, 235, 235, 235, -146, -212, -302, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -195, -353, 295, + -353, 295, -353, -270, 96, -281, 26, 18, 63, 63, + -168, -199, -133, -169, -300, -249, 703, -255, 52, -253, + -254, 53, -250, 54, 62, -340, -340, 183, -240, -146, + -271, 85, -272, -280, -223, -215, -218, -216, -424, -259, + -425, -300, -270, -272, -171, -172, -172, -171, -172, 75, + 75, 75, 80, 75, 80, 75, -188, -306, -425, -146, + -309, 86, -169, -169, -193, -306, 183, 434, 438, 439, + -365, -413, 130, 157, 34, 85, 392, 110, -411, 191, + 634, 684, 689, 645, 638, 679, -412, 259, 150, 151, + 271, 28, 47, 97, 96, 97, 96, 97, 97, 96, + -293, -292, -46, -45, -359, -359, 105, -392, 98, 98, + 255, -191, 85, 85, 85, -115, 753, 105, 95, -3, + 90, -146, 95, 23, -348, -223, -383, -333, -384, -334, + -335, -5, -6, -360, -118, 63, 110, -64, 50, 254, + 733, 734, 139, -424, 746, -375, -260, -379, -381, -191, + -150, -424, -162, -148, -147, -149, -155, 181, 182, 276, + 357, 358, -224, -191, -139, 304, 312, 95, -143, 101, + -394, 86, 295, 392, 295, 392, 98, -417, 328, 98, + -417, -191, -85, -50, -191, -288, -288, 36, -392, -425, + -163, -154, -127, 176, 597, -324, 604, -336, -336, -336, + -343, -336, 347, -336, 347, -336, -425, -425, -425, 96, + -425, 26, -425, 96, -146, 96, -96, -96, -96, -96, + -96, -123, 493, 96, 96, -425, 95, 95, -425, -146, + -425, -425, -425, 96, -425, -425, -425, -425, -425, -425, + -425, -425, -425, -425, -425, -425, -425, 96, -425, 96, + -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, + -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, + -425, 96, -425, 96, -425, 96, -425, 96, -425, -425, + 96, -425, -425, -425, 96, -425, 96, -425, 96, -425, + -425, -425, 96, -322, 690, -425, -425, -425, -425, -425, + -425, -425, -425, -425, -425, -425, -94, -301, -95, 654, + 654, -425, -95, -232, 96, -151, -425, -151, -151, -151, + -425, -425, -425, 96, -425, 96, 96, -425, 96, -425, + 96, -425, -425, -425, -425, 96, -196, 26, -424, -196, + -424, -196, -425, -266, -191, -199, -233, 20, -246, 57, + 367, -257, -256, 61, 53, -254, 23, 55, 23, 33, + -271, 96, 165, -313, 96, 28, -425, -425, 96, 63, + 236, -425, -199, -182, -181, 85, 86, -183, 85, -181, + 75, 75, -261, 96, -269, -169, -199, -199, 236, 130, + -424, -150, 16, 98, 98, -392, -410, 737, 738, 34, + 105, -359, -359, 151, 151, -191, 95, -338, 98, -338, + 105, 105, 34, 91, 92, 93, 34, 87, 88, 89, + -191, -191, -191, -191, -380, 95, 23, -146, 95, 165, + 97, -260, -260, 291, 176, -359, 731, 297, 297, -359, + -359, -359, -117, -116, 753, 97, -425, 96, -346, 597, + 600, -146, -156, -156, -261, 97, -388, 597, -393, -300, + -300, -300, -300, 105, 107, -425, 595, 82, 598, -425, + -338, -146, -146, -146, -146, -240, 98, -146, -146, 105, + 105, -96, -425, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -211, -146, -425, -179, -178, -180, 714, + 130, 34, -321, -425, -213, 289, -102, -101, -100, 18, + -425, -146, -120, -120, -120, -120, -146, -146, -146, -146, + -146, -146, -424, 75, 22, 20, -263, -300, 259, -424, + -263, -424, -309, -233, -234, 21, 23, -247, 59, -245, + 58, -245, -256, 23, 23, 98, 23, 98, 151, -280, + -146, -218, -308, 63, -29, -300, -215, -300, -235, -146, + 95, -146, -159, -199, -199, -146, -206, 517, 519, 520, 521, 518, 523, 524, 525, 526, 527, 528, 529, 530, - 531, 532, 522, 533, 494, 495, 129, 496, 117, 119, - 118, 127, 128, 497, 498, 499, 361, 545, 546, 540, - 543, 544, 542, 541, 376, 377, 500, 563, 564, 568, - 567, 565, 566, 569, 572, 573, 574, 575, 576, 577, - 579, 578, 570, 571, 548, 547, 549, 550, 551, 552, - 553, 554, 556, 555, 557, 558, 559, 560, 561, 562, - 580, 581, 582, 583, 584, 586, 585, 590, 589, 587, - 588, 592, 591, 501, 502, 120, 121, 122, 123, 124, - 125, 126, 503, 506, 504, 505, 507, 508, 509, 514, - 515, 510, 511, 512, 513, 516, 387, 385, 386, 382, - 381, 380, -89, -102, 620, 619, -103, 441, 446, 447, - 449, -151, -152, -165, -166, -295, -301, 258, 443, 252, - 187, 487, -154, -148, -218, 116, 102, -31, -214, 442, - 452, 453, 457, 448, 458, 606, 608, 623, 624, 626, - 611, 616, 615, 618, 534, 535, 536, 537, 538, 539, - 691, 692, 693, 694, 695, 696, 697, 698, -387, -294, - 100, -157, -155, -199, 103, 108, 111, 112, 114, -409, - 276, 357, 358, 130, -419, 720, -156, 105, 106, 107, - 132, 133, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 98, 104, 50, 416, 416, -190, - -79, -79, -79, -79, -416, 723, 598, -230, -128, -232, - -33, -31, -419, 12, -79, -31, -32, -30, -36, -38, - 625, -37, -301, 109, -237, -253, 16, 67, 176, 48, - 56, -235, -236, -34, -31, -145, 23, 41, 27, -132, - 183, -145, -301, -132, -279, 257, -79, -79, -268, -315, - 332, -270, 431, 706, 430, -260, -273, 100, -259, -272, - 429, 101, -357, 173, -343, -347, -295, 268, -373, 264, - -190, -366, -365, -295, -419, -129, -289, 254, 262, 261, - 150, -390, 153, 310, 443, 252, -53, -54, -55, -272, - 191, 726, -111, 285, 289, 96, 96, -347, -346, -345, - -391, 289, 268, -372, -364, 260, 269, -353, 261, 262, - -348, 254, 151, -391, -348, 259, 269, 264, 268, 289, - 289, 139, 289, 139, 289, 289, 289, 289, 289, 289, - 289, 289, 289, 284, -354, 165, -354, 601, 601, -360, - -391, 264, 254, -391, -391, 260, -291, -348, 256, 28, - 256, 38, 38, -354, -354, -354, -272, 191, -354, -354, - -354, -354, 297, 297, -354, -354, -354, -354, -354, -354, - -354, -354, -354, -354, -354, -354, -354, -354, -354, -354, - -354, 253, -390, -137, 427, 317, 90, -56, 299, -39, - -190, -289, 254, 255, -390, 286, -190, 236, 253, 709, - -283, 173, 19, -283, -280, 416, 414, 401, 406, -283, - -283, -283, -283, 300, 399, -349, 254, 38, 265, 416, - 300, 399, 300, 301, 300, 301, 409, 419, 300, -306, - 18, 176, 443, 404, 408, 293, 253, 294, 255, 418, - 301, -306, 98, -284, 173, 300, 416, 410, 296, -283, - -283, -313, -419, -297, -295, -293, 245, 41, 156, 28, - 30, 159, 192, 142, 23, 160, 40, 247, 364, 264, - 191, 260, 488, 240, 81, 606, 444, 451, 442, 450, - 454, 490, 491, 443, 402, 34, 17, 608, 31, 274, - 27, 44, 185, 242, 163, 609, 277, 29, 275, 129, - 133, 611, 26, 84, 269, 18, 262, 46, 20, 612, - 613, 21, 74, 258, 257, 176, 254, 79, 15, 235, - 32, 172, 75, 614, 151, 145, 615, 616, 617, 618, - 143, 77, 173, 24, 746, 452, 453, 36, 707, 593, - 288, 187, 82, 65, 708, 157, 448, 619, 620, 130, - 621, 134, 85, 713, 153, 22, 80, 48, 622, 289, - 623, 259, 747, 624, 434, 625, 174, 243, 487, 78, - 175, 720, 626, 721, 252, 415, 12, 493, 35, 273, - 261, 73, 72, 141, 76, 458, 627, 253, 162, 256, - 144, 132, 11, 150, 37, 16, 83, 86, 455, 456, - 457, 63, 140, 597, 161, 19, 628, 435, 155, -387, - 709, -313, -313, 300, 341, 35, 101, -413, -414, -415, - 597, 434, 256, -295, -190, -85, 699, 244, -86, 705, - 41, 251, 146, 38, -135, 416, -123, 192, 727, 710, - 711, 712, 709, 413, 717, 715, 713, 300, 714, 96, - 153, 155, 156, 4, -145, 172, -200, -201, 171, 165, - 166, 167, 168, 169, 170, 177, 176, 157, 159, 173, - -246, 154, 178, 179, 180, 181, 182, 183, 184, 186, - 185, 187, 188, 174, 175, 191, 238, 239, -153, -153, - -153, -153, -216, -222, -221, -419, -218, -387, -294, -301, - -419, -419, -153, -278, -419, -150, -419, -419, -419, -419, - -419, -225, -145, -419, -419, -423, -419, -423, -423, -423, - -332, -419, -332, -332, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, 236, - -419, -419, -419, -419, -419, -332, -332, -332, -332, -332, - -332, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, 98, 112, 108, 111, 103, - 114, 98, 98, 98, 98, -31, -32, -210, -419, -312, - -400, -401, -193, -190, -419, 317, -295, -295, 286, 105, - -235, -34, -31, -230, -236, -232, -31, -79, -121, -134, - 69, 70, -133, -136, 27, 44, 74, 76, 99, 72, - 73, 71, 41, -420, 97, -420, -253, -420, 96, -38, - -256, 95, 653, 683, 653, 683, 67, 49, 98, 98, - 96, 25, -231, -233, -145, 18, -299, 4, -298, 28, - -295, 98, 236, 18, -191, 32, -190, -279, -279, 96, - 100, 332, -269, -271, 432, 434, 165, -300, -295, 98, - 34, 97, 96, -190, -321, -324, -326, -325, -327, -322, - -323, 361, 362, 192, 365, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 378, 390, 35, 276, 357, 358, - 359, 360, 379, 380, 381, 382, 384, 385, 386, 387, - 342, 363, 595, 343, 344, 345, 346, 347, 348, 350, - 351, 354, 352, 353, 355, 356, -296, -295, 95, 97, - 96, -331, 95, -145, -137, 253, -295, 254, 254, 254, - -286, 258, 487, -354, -354, -354, 284, 23, -46, -43, - -380, 22, -42, -43, 245, 135, 136, 242, 95, -343, - 95, -352, -296, -295, 95, 151, 259, 150, -351, -348, - -351, -352, -295, -218, -295, 151, 151, -295, -295, -265, - -295, -265, -265, 41, -265, 41, -265, 41, 105, -295, - -265, 41, -265, 41, -265, 41, -265, 41, -265, 41, - 34, 87, 88, 89, 34, 91, 92, 93, -218, -295, - -295, -218, -343, -218, -190, -295, -272, 105, 105, 105, - -354, -354, 105, 98, 98, 98, -354, -354, 105, 98, - -303, -301, 98, 98, -392, 270, 314, 316, 105, 105, - 105, 105, 34, 98, -393, 34, 734, 733, 735, 736, - 737, 98, 105, 34, 105, 34, 105, -295, 95, -190, - -143, 304, 240, 242, 245, 85, 98, 322, 320, 321, - 318, 323, 324, 325, 165, 50, 96, 256, 253, -295, - -285, 258, -285, -295, -302, -301, -293, -190, 256, 398, - 98, -145, -350, 18, 176, -306, -306, -283, -190, -350, - -306, -283, -190, -283, -283, -283, -283, -306, -306, -306, - -283, -301, -301, -190, -190, -190, -190, -190, -190, -190, - -313, -284, -283, 709, 98, -277, 18, 85, -313, -313, - -292, 26, 26, 96, 338, 435, 436, -311, 335, -81, - -295, 98, -10, -29, -18, -17, -19, 165, -10, 96, - 597, -183, -190, 709, 709, 709, 709, 709, 709, -145, - -145, -145, -145, 621, -208, -411, 157, 132, 133, 130, - 131, -162, 42, 43, 41, -145, -209, -214, -216, 115, - 176, 159, 173, -246, -150, -153, -150, -150, -150, -150, - -150, -150, 235, -150, 235, -150, -150, -150, -150, -150, - -150, -314, -295, 98, 192, -158, -157, 114, -409, -158, - 594, 96, -221, 236, -145, -145, -387, -119, 460, 461, - 462, 463, 465, 466, 467, 470, 471, 475, 476, 459, - 477, 464, 469, 472, 473, 474, 468, 360, -145, -211, - -210, -211, -145, -145, -223, -224, 161, -218, -145, -420, - -420, 105, 183, -127, 27, 44, -127, -127, -127, -127, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -127, -145, -120, 459, 477, 464, 469, 472, 473, 474, - 468, 360, 478, 479, 480, 481, 482, 483, 484, 485, - 486, -120, -119, -145, -145, -145, -145, -145, -145, -145, - -145, -87, -145, 142, 143, 144, -210, -145, -150, -145, - -145, -145, -420, -145, -145, -145, -211, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -386, -385, -384, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -210, - -210, -210, -210, -210, -145, -420, -145, -164, -148, 105, - -261, 114, 101, -145, -145, -145, -145, -145, -145, -211, - -297, -302, -293, -294, -210, -211, -211, -210, -210, -145, - -145, -145, -145, -145, -145, -145, -145, -420, -145, -145, - -145, -145, -145, -253, -420, -210, 96, -402, 434, 435, - 707, -304, 289, -303, 28, -211, 98, 18, -263, 86, - -295, -235, -235, 69, 70, 65, -131, -132, -136, -420, - -37, 28, -255, -295, 646, 646, 68, 98, -333, -272, - 388, 389, 192, -145, -145, 96, -234, 30, 31, -190, - -298, 183, -302, -190, -264, 289, -190, -168, -170, -171, - -172, -193, -217, -419, -173, -31, 617, 614, 18, -183, - -184, -192, -301, -270, -315, -269, 96, 433, 435, 436, - 85, 134, -145, -334, 191, -362, -361, -360, -343, -345, - -346, -347, 97, -334, -339, 395, 394, -331, -331, -331, - -331, -331, -333, -333, -333, -333, 95, -331, 95, -331, - -331, -331, -331, -336, 95, -336, -336, -337, -336, 95, - -337, -338, 95, -338, -373, -145, -370, -369, -367, -368, - 263, 110, 689, 645, 597, 638, 679, 86, -365, -234, - 105, -420, -143, -286, -371, -368, -295, -295, -295, -301, - 157, 100, 98, 100, 98, 100, 98, -112, -60, -1, - 746, 747, 748, 96, 23, -344, -343, -59, 314, -376, - -377, 289, -372, -366, -352, 151, -351, -352, -352, -295, - 96, 32, 139, 139, 139, 139, 597, 242, 35, -287, - 637, 157, 689, 645, -343, -59, 256, 256, -314, -314, - -314, 98, 98, -282, 742, -183, -139, 306, 165, 295, - 295, 253, 308, 253, 308, -190, 319, 322, 320, 321, - 318, 323, 324, 325, 326, 41, 41, 41, 41, 41, - 41, 41, 307, 309, 311, 297, -190, -190, -285, 85, - -185, -190, 29, -301, 98, 98, -190, -283, -283, -190, - -283, -283, -190, 98, -301, -415, 339, -295, 375, 700, - 702, -123, 434, 96, 597, 26, -124, 26, -419, -411, - 132, 133, -216, -216, -216, -209, -150, -153, -150, 156, - 277, -150, -150, -419, -218, -420, -297, 28, 96, 86, - -420, 181, 96, -420, -420, 96, 18, 96, -226, -224, - 163, -145, -420, 96, -420, -420, -210, -145, -145, -145, - -145, -420, -420, -420, -420, -420, -420, -420, -420, -420, - -420, -210, -420, 96, 96, 18, -318, 28, -420, -420, - -420, -420, 96, -420, -420, -225, -420, 18, -420, 86, - 96, 176, 96, -420, -420, -420, 96, 96, -420, -420, - 96, -420, 96, -420, -420, -420, -420, -420, -420, 96, - -420, 96, -420, -420, -420, 96, -420, 96, -420, -420, - 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, - 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, - 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, - 96, -420, 96, -420, 96, -420, -420, -420, 96, -420, - 96, -420, 96, -420, -420, 96, -420, 96, -420, 96, - -420, 96, 96, -420, 96, 96, 96, -420, 96, 96, - 96, 96, -420, -420, -420, -420, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, -420, -420, -420, -420, - -420, -420, 96, -94, 622, -420, -420, 96, -420, 96, - 96, 96, 96, 96, -420, -419, 236, -420, -420, -420, - -420, -420, 96, 96, 96, 96, 96, 96, -420, -420, - -420, 96, 96, -420, 96, -420, 96, -420, -401, 706, - 435, -197, -196, -194, 83, 257, 84, -419, -303, -420, - -158, -261, -262, -261, -203, -295, 105, 114, -237, -167, - 96, -169, 18, -216, 97, 96, -333, -241, -247, -280, - -295, 98, 192, -335, 192, -335, 388, 389, -233, 236, - -198, 19, -202, 35, 63, -29, -419, -419, 35, 96, - -186, -188, -187, -189, 75, 79, 81, 76, 77, 78, - 82, -309, 28, -31, -168, -31, -419, -190, -183, -421, - 18, 86, -421, 96, 236, -271, -274, 437, 434, 440, - -387, 98, -111, 96, -360, -347, -238, -140, 46, -340, - 396, -333, 605, -333, -342, 98, -342, 105, 105, 105, - 97, -49, -44, -45, 36, 90, -367, -354, 98, 45, - -354, -354, -295, 97, -234, -139, -190, 85, -371, -371, - -371, 29, -2, 745, 751, 151, 95, 401, 22, -255, - 96, 97, -219, 315, 97, -113, -295, 97, 95, -352, - -352, -295, -419, 253, 34, 34, 689, 645, 637, -59, - -219, -218, -295, -334, 744, 743, 97, 255, 313, -144, - 454, -141, 98, 100, -190, -190, -190, -190, -190, -190, - 245, 242, 424, -410, 327, 98, -410, 298, 256, -183, - -190, 96, -84, 272, 267, -306, -306, 36, -190, 434, - 718, 716, -145, 156, 277, -162, -153, -119, -119, -150, - -316, 192, 361, 276, 359, 355, 375, 366, 394, 357, - 395, 352, 351, 350, -316, -314, -150, -210, -145, -145, - -145, 164, -145, 162, -145, -95, -94, -420, -420, -420, - -420, -420, -95, -95, -95, -95, -95, -95, -95, -95, - -95, -95, -230, -145, -145, -145, -420, 192, 361, -95, - -145, 18, -145, -314, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -384, - -145, -210, -145, -210, -145, -145, -145, -145, -145, -385, - -385, -385, -385, -385, -210, -210, -210, -210, -145, -419, - -295, -98, -97, -96, 672, 257, -94, -164, -98, -164, - 235, -145, 235, 235, 235, -145, -211, -297, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -194, -348, - 295, -348, 295, -348, -265, 96, -276, 26, 18, 63, - 63, -167, -198, -132, -168, -295, -244, 699, -250, 52, - -248, -249, 53, -245, 54, 62, -335, -335, 183, -235, - -145, -266, 85, -267, -275, -218, -213, -215, -214, -419, - -254, -420, -295, -265, -267, -170, -171, -171, -170, -171, - 75, 75, 75, 80, 75, 80, 75, -187, -301, -420, - -145, -304, 86, -168, -168, -192, -301, 183, 434, 438, - 439, -360, -408, 130, 157, 34, 85, 392, 110, -406, - 191, 634, 684, 689, 645, 638, 679, -407, 259, 150, - 151, 271, 28, 47, 97, 96, 97, 96, 97, 97, - 96, -288, -287, -45, -44, -354, -354, 105, -387, 98, - 98, 255, -190, 85, 85, 85, -114, 749, 105, 95, - -3, 90, -145, 95, 23, -343, -218, -378, -328, -379, - -329, -330, -5, -6, -355, -117, 63, 110, -63, 50, - 254, 729, 730, 139, -419, 742, -370, -255, -374, -376, - -190, -149, -419, -161, -147, -146, -148, -154, 181, 182, - 276, 357, 358, -219, -190, -138, 304, 312, 95, -142, - 101, -389, 86, 295, 392, 295, 392, 98, -412, 328, - 98, -412, -190, -84, -49, -190, -283, -283, 36, -387, - -420, -162, -153, -126, 176, 597, -319, 604, -331, -331, - -331, -338, -331, 347, -331, 347, -331, -420, -420, -420, - 96, -420, 26, -420, 96, -145, 96, -95, -95, -95, - -95, -95, -122, 493, 96, 96, -420, 95, 95, -420, - -145, -420, -420, -420, 96, -420, -420, -420, -420, -420, - -420, -420, -420, -420, -420, -420, -420, -420, 96, -420, - 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, - 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, - 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, - -420, 96, -420, -420, -420, 96, -420, 96, -420, 96, - -420, -420, -420, 96, -317, 690, -420, -420, -420, -420, - -420, -420, -420, -420, -420, -420, -420, -93, -296, -94, - 654, 654, -420, -94, -227, 96, -150, -420, -150, -150, - -150, -420, -420, -420, 96, -420, 96, 96, -420, 96, - -420, 96, -420, -420, -420, -420, 96, -195, 26, -419, - -195, -419, -195, -420, -261, -190, -198, -228, 20, -241, - 57, 367, -252, -251, 61, 53, -249, 23, 55, 23, - 33, -266, 96, 165, -308, 96, 28, -420, -420, 96, - 63, 236, -420, -198, -181, -180, 85, 86, -182, 85, - -180, 75, 75, -256, 96, -264, -168, -198, -198, 236, - 130, -419, -149, 16, 98, 98, -387, -405, 733, 734, - 34, 105, -354, -354, 151, 151, -190, 95, -333, 98, - -333, 105, 105, 34, 91, 92, 93, 34, 87, 88, - 89, -190, -190, -190, -190, -375, 95, 23, -145, 95, - 165, 97, -255, -255, 291, 176, -354, 727, 297, 297, - -354, -354, -354, -116, -115, 749, 97, -420, 96, -341, - 597, 600, -145, -155, -155, -256, 97, -383, 597, -388, - -295, -295, -295, -295, 105, 107, -420, 595, 82, 598, - -420, -333, -145, -145, -145, -145, -235, 98, -145, -145, - 105, 105, -95, -420, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -210, -145, -420, -178, -177, -179, - 710, 130, 34, -316, -420, -212, 289, -101, -100, -99, - 18, -420, -145, -119, -119, -119, -119, -145, -145, -145, - -145, -145, -145, -419, 75, 22, 20, -258, -295, 259, - -419, -258, -419, -304, -228, -229, 21, 23, -242, 59, - -240, 58, -240, -251, 23, 23, 98, 23, 98, 151, - -275, -145, -215, -303, 63, -29, -295, -213, -295, -230, - -145, 95, -145, -158, -198, -198, -145, -205, 517, 519, - 520, 521, 518, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 522, 533, 494, 495, 496, 117, 119, - 118, 127, 128, 497, 498, 499, 361, 545, 546, 540, - 543, 544, 542, 541, 376, 377, 500, 563, 564, 568, - 567, 565, 566, 569, 572, 573, 574, 575, 576, 577, - 579, 578, 570, 571, 548, 547, 549, 550, 551, 552, - 553, 554, 556, 555, 557, 558, 559, 560, 561, 562, - 580, 581, 582, 583, 584, 586, 585, 590, 589, 587, - 588, 592, 591, 501, 502, 120, 121, 122, 123, 124, - 125, 126, 503, 506, 504, 507, 508, 509, 514, 515, - 510, 511, 512, 513, 516, 387, 385, 386, 382, 381, - 380, 441, 446, 447, 449, 534, 535, 536, 537, 538, - 539, 691, 692, 693, 694, 695, 696, 697, 698, 98, - 98, 95, -145, 97, 97, -256, -374, -60, 97, -257, - -255, 105, 97, 292, -214, -419, 98, -354, -354, -354, - 105, 105, -303, -420, 96, -295, -407, -376, 601, 601, - -420, 28, -382, -381, -297, 95, 86, 68, 596, 599, - -420, -420, -420, 96, -420, -420, -420, 97, 97, -420, - -420, -420, -420, -420, -420, -420, -420, -420, -420, -420, - -420, -420, -420, -420, -420, -420, -420, -420, -420, -420, - -420, 96, -420, -177, -179, -420, 85, -158, -230, 23, - -98, 314, 316, -98, -420, -420, -420, -420, -420, 96, - -420, -420, 96, -420, 96, -420, -420, -258, -420, 23, - 23, 96, -420, -258, -420, -258, -197, -229, -108, -107, - -106, 628, -145, -210, -243, 60, 85, 134, 98, 98, - 98, 16, -419, -213, 236, -308, -235, -255, -175, 401, - -230, -420, -255, 97, 28, 97, 751, 151, 97, -214, - -125, -419, 288, -303, 98, 98, -115, -118, -29, 96, - 165, -255, -190, 68, -145, -210, -420, 85, 609, 710, - -92, -91, -88, 721, 747, -210, -94, -94, -145, -145, - -145, -420, -295, 259, -420, -420, -108, 96, -105, -104, - -295, -320, 597, 85, 134, -267, -255, -308, -295, 97, - -420, -419, -235, 97, -239, -29, 95, -3, 288, -328, - -379, -329, -330, -5, -6, -355, -82, 597, -381, -359, - -301, -297, 98, 105, 97, 597, -420, -420, -90, 159, - 719, 687, -155, 235, -420, 96, -420, 96, -420, 96, - -106, 96, 28, 602, -420, -304, -176, -174, -295, 651, - -398, -397, 593, -408, -404, 130, 157, 110, -406, 689, - 645, 140, 141, -82, -145, 95, -420, -83, 303, 706, - 236, -389, 598, -90, 720, 665, 640, 665, 640, -150, - -145, -145, -145, -104, -419, -420, 96, 26, -321, -62, - 662, -395, -396, 85, -399, 407, 661, 682, 130, 98, - 97, -255, 264, -302, -383, 599, 156, -119, -420, 96, - -420, 96, -420, -93, -174, 658, -334, -158, -396, 85, - -395, 85, 17, 16, -4, 750, 97, 305, -90, 665, - 640, -145, -145, -420, -61, 29, -175, -394, 272, 267, - 270, 35, -394, 105, -4, -420, -420, 662, 266, 34, - 130, -158, -178, -177, -177, + 531, 532, 522, 533, 494, 495, 496, 117, 119, 118, + 127, 128, 497, 498, 499, 361, 545, 546, 540, 543, + 544, 542, 541, 376, 377, 500, 563, 564, 568, 567, + 565, 566, 569, 572, 573, 574, 575, 576, 577, 579, + 578, 570, 571, 548, 547, 549, 550, 551, 552, 553, + 554, 556, 555, 557, 558, 559, 560, 561, 562, 580, + 581, 582, 583, 584, 586, 585, 590, 589, 587, 588, + 592, 591, 501, 502, 120, 121, 122, 123, 124, 125, + 126, 503, 506, 504, 507, 508, 509, 514, 515, 510, + 511, 512, 513, 516, 387, 385, 386, 382, 381, 380, + 441, 446, 447, 449, 534, 535, 536, 537, 538, 539, + 695, 696, 697, 698, 699, 700, 701, 702, 98, 98, + 95, -146, 97, 97, -261, -379, -61, 97, -262, -260, + 105, 97, 292, -216, -424, 98, -359, -359, -359, 105, + 105, -308, -425, 96, -300, -412, -381, 601, 601, -425, + 28, -387, -386, -302, 95, 86, 68, 596, 599, -425, + -425, -425, 96, -425, -425, -425, 97, 97, -425, -425, + -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, + -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, + 96, -425, -178, -180, -425, 85, -159, -235, 23, -99, + 314, 316, -99, -425, -425, -425, -425, -425, 96, -425, + -425, 96, -425, 96, -425, -425, -263, -425, 23, 23, + 96, -425, -263, -425, -263, -198, -234, -109, -108, -107, + 628, -146, -211, -248, 60, 85, 134, 98, 98, 98, + 16, -424, -215, 236, -313, -240, -260, -176, 401, -235, + -425, -260, 97, 28, 97, 755, 151, 97, -216, -126, + -424, 288, -308, 98, 98, -116, -119, -29, 96, 165, + -260, -191, 68, -146, -211, -425, 85, 609, 714, -93, + -92, -89, 725, 751, -211, -95, -95, -146, -146, -146, + -425, -300, 259, -425, -425, -109, 96, -106, -105, -300, + -325, 597, 85, 134, -272, -260, -313, -300, 97, -425, + -424, -240, 97, -244, -29, 95, -3, 288, -333, -384, + -334, -335, -5, -6, -360, -83, 597, -386, -364, -306, + -302, 98, 105, 97, 597, -425, -425, -91, 159, 723, + 687, -156, 235, -425, 96, -425, 96, -425, 96, -107, + 96, 28, 602, -425, -309, -177, -175, -300, 651, -403, + -402, 593, -413, -409, 130, 157, 110, -411, 689, 645, + 140, 141, -83, -146, 95, -425, -84, 303, 710, 236, + -394, 598, -91, 724, 665, 640, 665, 640, -151, -146, + -146, -146, -105, -424, -425, 96, 26, -326, -63, 662, + -400, -401, 85, -404, 407, 661, 682, 130, 98, 97, + -260, 264, -307, -388, 599, 156, -120, -425, 96, -425, + 96, -425, -94, -175, 658, -339, -159, -401, 85, -400, + 85, 17, 16, -4, 754, 97, 305, -91, 665, 640, + -146, -146, -425, -62, 29, -176, -399, 272, 267, 270, + 35, -399, 105, -4, -425, -425, 662, 266, 34, 130, + -159, -179, -178, -178, } var yyDef = [...]int{ - 889, -2, -2, 891, 2, 4, 5, 6, 7, 8, + 892, -2, -2, 894, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 70, 72, 73, 889, 889, 889, 0, 889, 0, - 0, 889, -2, -2, 889, 1644, 0, 889, 0, 884, - 0, -2, 804, 810, 0, 819, -2, 0, 0, 889, - 889, 2285, 2285, 884, 0, 0, 0, 0, 0, 889, - 889, 889, 889, 1649, 1502, 50, 889, 0, 85, 86, - 839, 840, 841, 65, 0, 2283, 890, 1, 3, 71, - 75, 0, 0, 0, 58, 1511, 0, 78, 0, 0, - 893, 0, 0, 1627, 889, 889, 0, 126, 127, 0, - 0, 0, -2, 130, -2, 159, 160, 161, 0, 166, - 609, 526, 578, 524, 563, -2, 512, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 529, - 401, 401, 0, 0, -2, 512, 512, 512, 1629, 0, - 0, 0, 560, 463, 401, 401, 401, 0, 401, 401, - 401, 401, 0, 0, 401, 401, 401, 401, 401, 401, - 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, - 401, 1529, 165, 1645, 1642, 1643, 1805, 1806, 1807, 1808, - 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, - 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, - 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, - 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, - 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, - 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, - 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, - 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, - 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, - 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, - 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, - 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, - 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, - 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, - 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, - 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, - 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, - 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, - 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, - 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, - 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, - 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, - 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, - 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, - 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, - 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, - 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, - 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, - 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, - 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, - 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, - 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, - 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, - 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, - 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, - 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, - 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, - 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, - 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, - 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, - 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, - 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, - 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, - 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, - 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, - 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, - 2279, 2280, 2281, 2282, 0, 1621, 0, 722, 993, 0, - 885, 886, 0, 793, 793, 0, 793, 793, 793, 793, - 0, 0, 0, 736, 0, 0, 0, 0, 790, 0, - 752, 753, 0, 790, 0, 759, 796, 0, 0, 766, - 793, 793, 769, 2286, 0, 2286, 2286, 0, 0, 1612, - 0, 787, 785, 799, 800, 42, 803, 806, 807, 808, - 809, 812, 0, 823, 826, 1638, 1639, 0, 828, 833, - 852, 853, 0, 45, 1153, 0, 1017, 0, 1028, -2, - 1039, 1056, 1057, 1058, 1059, 1060, 1062, 1063, 1064, 0, - 0, 0, 0, 1069, 1070, 0, 0, 0, 0, 0, - 1133, 0, 0, 0, 0, 2008, 1473, 0, 0, 1435, - 1435, 1169, 1435, 1435, 1437, 1437, 1437, 1858, 2000, 2009, - 2188, 1819, 1825, 1826, 1827, 2134, 2135, 2136, 2137, 2229, - 2230, 2234, 1922, 1814, 2201, 2202, 0, 2282, 1961, 1969, - 1970, 1946, 1955, 1994, 2096, 2213, 1837, 1989, 2059, 1919, - 1941, 1942, 2077, 2078, 1965, 1966, 1945, 2140, 2142, 2158, - 2159, 2144, 2146, 2155, 2161, 2166, 2145, 2157, 2162, 2175, - 2179, 2182, 2183, 2184, 2152, 2150, 2163, 2167, 2169, 2171, - 2177, 2180, 2153, 2151, 2164, 2168, 2170, 2172, 2178, 2181, - 2139, 2143, 2147, 2156, 2174, 2154, 2173, 2148, 2160, 2165, - 2176, 2149, 2141, 1959, 1962, 1949, 1950, 1952, 1954, 1960, - 1967, 1973, 1951, 1972, 1971, 0, 1947, 1948, 1953, 1964, - 1968, 1956, 1957, 1958, 1963, 1974, 2015, 2014, 2013, 2058, - 1985, 2057, 0, 0, 0, 0, 0, 1808, 1864, 1865, - 2185, 1357, 1358, 1359, 1360, 0, 0, 0, 0, 0, - 0, 0, 290, 291, 1486, 1487, 44, 1152, 1608, 1437, - 1437, 1437, 1437, 1437, 1437, 1091, 1092, 1093, 1094, 1095, - 1121, 1122, 1128, 1129, 2072, 2073, 2074, 2075, 1902, 2224, - 1911, 1912, 2054, 2055, 1924, 1925, 2256, 2257, -2, -2, - -2, 232, 233, 234, 235, 236, 237, 238, 239, 0, - 1863, 2199, 2200, 228, 0, 0, 295, 292, 293, 294, - 1135, 1136, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 297, 298, 2285, 0, 862, 0, - 0, 0, 0, 0, 0, 1650, 1651, 1511, 0, 1503, - 1502, 63, 0, 889, -2, 0, 0, 0, 0, 47, - 0, 52, 950, 892, 77, 76, 1551, 1554, 0, 0, - 0, 59, 1512, 67, 69, 1513, 0, 894, 895, 0, - 926, 930, 0, 0, 0, 1628, 1627, 1627, 102, 0, - 0, 103, 123, 124, 125, 0, 0, 109, 110, 1614, - 1615, 43, 0, 0, 177, 178, 0, 1109, 428, 0, - 173, 0, 421, 360, 0, 1529, 0, 0, 0, 0, - 0, 1625, 0, 1622, 154, 155, 162, 163, 164, 401, - 401, 401, 575, 0, 0, 165, 165, 533, 534, 535, - 0, 0, -2, 426, 0, 513, 0, 0, 415, 415, - 419, 417, 418, 0, 0, 0, 0, 0, 0, 0, - 0, 552, 0, 553, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 670, 0, 402, 0, 573, 574, 464, - 0, 0, 0, 0, 0, 0, 0, 0, 1630, 1631, - 0, 550, 551, 0, 0, 0, 401, 401, 0, 0, - 0, 0, 401, 401, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 153, 1542, 0, 0, 0, -2, 0, 714, - 0, 0, 0, 1623, 1623, 0, 721, 0, 0, 0, - 726, 0, 0, 727, 0, 790, 790, 788, 789, 729, - 730, 731, 732, 793, 0, 0, 410, 411, 412, 790, - 793, 0, 793, 793, 793, 793, 790, 790, 790, 793, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2286, - 796, 793, 0, 760, 0, 761, 762, 763, 764, 767, - 768, 770, 2287, 2288, 1640, 1641, 1652, 1653, 1654, 1655, - 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, + 39, 70, 72, 73, 892, 892, 892, 0, 892, 0, + 0, 892, -2, -2, 892, 1653, 0, 892, 0, 887, + 0, -2, 807, 813, 0, 822, -2, 0, 0, 892, + 892, 2298, 2298, 887, 0, 0, 0, 0, 0, 892, + 892, 892, 892, 1658, 1505, 50, 892, 0, 88, 89, + 842, 843, 844, 65, 0, 2296, 85, 892, 893, 1, + 3, 71, 75, 0, 0, 0, 58, 1514, 0, 78, + 0, 0, 896, 0, 0, 1636, 892, 892, 0, 129, + 130, 0, 0, 0, -2, 133, -2, 162, 163, 164, + 0, 169, 612, 529, 581, 527, 566, -2, 515, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 532, 404, 404, 0, 0, -2, 515, 515, 515, + 1638, 0, 0, 0, 563, 466, 404, 404, 404, 0, + 404, 404, 404, 404, 0, 0, 404, 404, 404, 404, + 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, + 404, 404, 404, 1532, 168, 1654, 1651, 1652, 1814, 1815, + 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, + 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, + 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, + 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, + 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, + 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, + 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, + 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, + 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, + 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, + 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, + 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, + 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, + 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, + 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, + 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, + 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, + 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, + 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, + 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, + 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, + 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, + 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, + 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, + 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, + 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, + 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, + 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, + 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, + 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, + 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, + 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, + 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, + 2146, 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155, + 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, + 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, + 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, + 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, + 2196, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, + 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, + 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, + 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, + 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, + 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, + 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, + 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, + 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, + 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, + 0, 1630, 0, 725, 996, 0, 888, 889, 0, 796, + 796, 0, 796, 796, 796, 796, 0, 0, 0, 739, + 0, 0, 0, 0, 793, 0, 755, 756, 0, 793, + 0, 762, 799, 0, 0, 769, 796, 796, 772, 2299, + 0, 2299, 2299, 0, 0, 1621, 0, 790, 788, 802, + 803, 42, 806, 809, 810, 811, 812, 815, 0, 826, + 829, 1647, 1648, 0, 831, 836, 855, 856, 0, 45, + 1156, 0, 1020, 0, 1031, -2, 1042, 1059, 1060, 1061, + 1062, 1063, 1065, 1066, 1067, 0, 0, 0, 0, 1072, + 1073, 0, 0, 0, 0, 0, 1136, 0, 0, 0, + 0, 2018, 1476, 0, 0, 1438, 1438, 1172, 1438, 1438, + 1440, 1440, 1440, 1867, 2010, 2019, 2200, 1828, 1834, 1835, + 1836, 2146, 2147, 2148, 2149, 2242, 2243, 2247, 1931, 1823, + 2214, 2215, 0, 2295, 1970, 1978, 1979, 1955, 1964, 2003, + 2108, 2226, 1846, 1998, 2070, 1928, 1950, 1951, 2089, 2090, + 1974, 1975, 1954, 2152, 2154, 2170, 2171, 2156, 2158, 2167, + 2173, 2178, 2157, 2169, 2174, 2187, 2191, 2194, 2195, 2196, + 2164, 2162, 2175, 2179, 2181, 2183, 2189, 2192, 2165, 2163, + 2176, 2180, 2182, 2184, 2190, 2193, 2151, 2155, 2159, 2168, + 2186, 2166, 2185, 2160, 2172, 2177, 2188, 2161, 2153, 1968, + 1971, 1958, 1959, 1961, 1963, 1969, 1976, 1982, 1960, 1981, + 1980, 0, 1956, 1957, 1962, 1973, 1977, 1965, 1966, 1967, + 1972, 1983, 2025, 2024, 2023, 2069, 1994, 2068, 0, 0, + 0, 0, 0, 1817, 1873, 1874, 2197, 1360, 1361, 1362, + 1363, 0, 0, 0, 0, 0, 0, 0, 293, 294, + 1489, 1490, 44, 1155, 1617, 1440, 1440, 1440, 1440, 1440, + 1440, 1094, 1095, 1096, 1097, 1098, 1124, 1125, 1131, 1132, + 2084, 2085, 2086, 2087, 1911, 2237, 1920, 1921, 2065, 2066, + 1933, 1934, 2269, 2270, -2, -2, -2, 235, 236, 237, + 238, 239, 240, 241, 242, 0, 1872, 2212, 2213, 231, + 0, 1615, 1616, 298, 295, 296, 297, 1138, 1139, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 300, 301, 2298, 0, 865, 0, 0, 0, + 0, 0, 0, 1659, 1660, 1514, 0, 1506, 1505, 63, + 0, 892, -2, 0, 0, 0, 0, 47, 0, 52, + 953, 0, 895, 77, 76, 1554, 1557, 0, 0, 0, + 59, 1515, 67, 69, 1516, 0, 897, 898, 0, 929, + 933, 0, 0, 0, 1637, 1636, 1636, 105, 0, 0, + 106, 126, 127, 128, 0, 0, 112, 113, 1623, 1624, + 43, 0, 0, 180, 181, 0, 1112, 431, 0, 176, + 0, 424, 363, 0, 1532, 0, 0, 0, 0, 0, + 1634, 0, 1631, 157, 158, 165, 166, 167, 404, 404, + 404, 578, 0, 0, 168, 168, 536, 537, 538, 0, + 0, -2, 429, 0, 516, 0, 0, 418, 418, 422, + 420, 421, 0, 0, 0, 0, 0, 0, 0, 0, + 555, 0, 556, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 673, 0, 405, 0, 576, 577, 467, 0, + 0, 0, 0, 0, 0, 0, 0, 1639, 1640, 0, + 553, 554, 0, 0, 0, 404, 404, 0, 0, 0, + 0, 404, 404, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 156, 1545, 0, 0, 0, -2, 0, 717, 0, + 0, 0, 1632, 1632, 0, 724, 0, 0, 0, 729, + 0, 0, 730, 0, 793, 793, 791, 792, 732, 733, + 734, 735, 796, 0, 0, 413, 414, 415, 793, 796, + 0, 796, 796, 796, 796, 793, 793, 793, 796, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2299, 799, + 796, 0, 763, 0, 764, 765, 766, 767, 770, 771, + 773, 2300, 2301, 1649, 1650, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, @@ -9611,288 +9589,290 @@ var yyDef = [...]int{ 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, - 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 2286, - 2286, 774, 778, 782, 780, 1613, 805, 811, 813, 814, - 0, 0, 824, 827, 846, 49, 1910, 832, 49, 834, - 835, 836, 837, 838, 864, 865, 870, 0, 0, 0, - 0, 876, 877, 878, 0, 0, 881, 882, 883, 0, - 0, 0, 0, 0, 1015, 0, 0, 1141, 1142, 1143, - 1144, 1145, 1146, 1147, 1148, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1040, 1041, 0, 0, 0, 1065, 1066, - 1067, 1068, 1071, 0, 1082, 0, 1084, 1482, -2, 0, - 0, 0, 1076, 1077, 0, 0, 0, 1633, 1633, 0, - 0, 0, 1474, 0, 0, 1167, 0, 1168, 1170, 1171, - 1172, 0, 1173, 1174, 899, 899, 899, 899, 899, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 899, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1633, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1633, 0, - 0, 1633, 1633, 0, 0, 220, 221, 222, 223, 224, - 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 296, 240, 241, 242, 243, - 244, 299, 245, 246, 247, 1152, 0, 0, 0, 46, - 854, 855, 0, 976, 1633, 0, 0, 905, 0, 1648, - 57, 66, 68, 1511, 61, 1511, 0, 909, 0, 0, - -2, -2, 910, 911, 915, 916, 917, 918, 919, 920, - 921, 922, 923, 54, 2284, 55, 0, 74, 0, 48, - 0, 0, 1552, 0, 1555, 0, 0, 0, 374, 1559, - 0, 0, 1504, 1505, 1508, 0, 927, 2006, 931, 0, - 933, 934, 0, 0, 100, 0, 992, 0, 0, 0, - 111, 0, 113, 114, 0, 0, 0, 385, 1616, 1617, - 1618, -2, 408, 0, 385, 369, 307, 308, 309, 360, - 311, 360, 360, 360, 360, 374, 374, 374, 374, 342, - 343, 344, 345, 346, 0, 360, 0, 328, 360, 360, - 360, 360, 350, 351, 352, 353, 354, 355, 356, 357, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 362, - 362, 362, 362, 362, 366, 366, 0, 1110, 0, 389, - 0, 1508, 0, 0, 1542, 1625, 1635, 0, 0, 0, - 0, 0, 132, 0, 0, 0, 576, 620, 527, 564, - 577, 0, 530, 531, -2, 0, 0, 512, 0, 514, - 0, 409, 0, -2, 0, 419, 0, 415, 419, 416, - 419, 407, 420, 554, 555, 556, 0, 558, 559, 650, - 962, 0, 0, 0, 0, 0, 656, 657, 658, 0, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 565, 566, 567, 568, 569, 570, 571, 572, 0, 0, - 0, 0, 514, 0, 561, 0, 0, 465, 466, 467, - 0, 0, 470, 471, 472, 473, 0, 0, 476, 477, - 478, 979, 980, 479, 480, 505, 506, 507, 481, 482, - 483, 484, 485, 486, 487, 499, 500, 501, 502, 503, - 504, 488, 489, 490, 491, 492, 493, 496, 0, 147, - 1533, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1623, 0, - 0, 0, 0, 908, 994, 1646, 1647, 723, 0, 0, - 794, 795, 0, 413, 414, 793, 793, 733, 775, 0, - 793, 737, 776, 738, 740, 739, 741, 754, 755, 793, - 744, 791, 792, 745, 746, 747, 748, 749, 750, 751, - 771, 756, 757, 758, 797, 0, 801, 802, 772, 773, - 0, 783, 0, 0, 0, 817, 818, 0, 825, 849, - 847, 848, 850, 842, 843, 844, 845, 0, 851, 0, - 0, 867, 96, 872, 873, 874, 875, 887, 880, 1154, - 1012, 1013, 1014, 0, 1016, 1022, 0, 1137, 1139, 1020, - 1021, 1024, 0, 0, 0, 1018, 1029, 1149, 1150, 1151, - 0, 0, 0, 0, 0, 1033, 1037, 1042, 1043, 1044, - 1045, 1046, 0, 1047, 0, 1050, 1051, 1052, 1053, 1054, - 1055, 1061, 1450, 1451, 1452, 1080, 300, 301, 0, 1081, - 0, 0, 0, 0, 0, 0, 0, 0, 1397, 1398, - 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, - 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1153, 0, - 1634, 0, 0, 0, 1480, 1477, 0, 0, 0, 1436, - 1438, 0, 0, 0, 900, 901, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1417, 1418, 1419, 1420, 1421, 1422, 1423, - 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, - 1434, 0, 0, 1453, 0, 0, 0, 0, 0, 0, - 0, 1473, 0, 1086, 1087, 1088, 0, 0, 0, 0, - 0, 0, 1215, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 142, 143, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1361, 1362, - 1363, 1364, 41, 0, 0, 0, 0, 0, 0, 0, - 1484, 0, -2, -2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1386, 0, 0, - 0, 0, 0, 0, 1606, 0, 0, 857, 858, 860, - 0, 996, 0, 977, 0, 0, 863, 0, 904, 0, - 907, 60, 62, 913, 914, 0, 935, 924, 912, 56, - 51, 0, 0, 954, 1553, 1556, 1557, 374, 1579, 0, - 383, 383, 380, 1514, 1515, 0, 1507, 1509, 1510, 79, - 932, 928, 0, 1010, 0, 0, 991, 0, 938, 940, - 941, 942, 974, 0, 945, 946, 0, 0, 0, 0, - 0, 98, 993, 104, 0, 112, 0, 0, 117, 118, - 105, 106, 107, 108, 0, 609, -2, 460, 179, 181, - 182, 183, 174, -2, 372, 370, 371, 310, 374, 374, - 336, 337, 338, 339, 340, 341, 0, 348, 0, 329, - 330, 331, 332, 321, 0, 322, 323, 324, 364, 0, - 325, 326, 0, 327, 427, 0, 1516, 390, 391, 393, - 401, 0, 396, 397, 0, 401, 401, 0, 422, 423, - 0, 1508, 1533, 0, 0, 1636, 1635, 1635, 1635, 152, - 0, 167, 168, 169, 170, 171, 172, 645, 0, 0, - 621, 643, 644, 165, 0, 0, 175, 516, 515, 0, - 677, 0, 425, 0, 0, 419, 419, 404, 405, 557, - 0, 0, 652, 653, 654, 655, 0, 0, 0, 543, - 454, 0, 544, 545, 514, 516, 0, 0, 385, 468, - 469, 474, 475, 494, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 592, 593, 595, 598, - 600, 518, 604, 606, 0, 594, 597, 599, 601, 518, - 605, 607, 1530, 1531, 1532, 0, 0, 715, 0, 0, - 451, 94, 1624, 720, 724, 725, 790, 743, 777, 790, - 735, 742, 765, 779, 781, 815, 816, 821, 829, 830, - 831, 871, 0, 0, 0, 0, 879, 0, 0, 1023, - 1138, 1140, 1025, 1026, 1027, 1030, 0, 1034, 1038, 0, - 0, 0, 0, 0, 1085, 1083, 1484, 0, 0, 0, - 1134, 0, 0, 1157, 1158, 0, 0, 0, 0, 1478, - 0, 0, 1165, 0, 1439, 1115, 0, 0, 0, 0, - 0, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, - 1115, 1502, 1192, 0, 0, 0, 0, 0, 1197, 1198, - 1199, 1115, 0, 1202, 1203, 0, 1205, 0, 1206, 0, - 0, 0, 0, 1213, 1214, 1216, 0, 0, 1219, 1220, - 0, 1222, 0, 1224, 1225, 1226, 1227, 1228, 1229, 0, - 1231, 0, 1233, 1234, 1235, 0, 1237, 0, 1239, 1240, - 0, 1242, 0, 1244, 0, 1247, 0, 1250, 0, 1253, - 0, 1256, 0, 1259, 0, 1262, 0, 1265, 0, 1268, - 0, 1271, 0, 1274, 0, 1277, 0, 1280, 0, 1283, - 0, 1286, 0, 1289, 0, 1292, 1293, 1294, 0, 1296, - 0, 1298, 0, 1301, 1302, 0, 1304, 0, 1307, 0, - 1310, 0, 0, 1311, 0, 0, 0, 1315, 0, 0, - 0, 0, 1324, 1325, 1326, 1327, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1338, 1339, 1340, 1341, - 1342, 1343, 0, 1345, 0, 1116, 0, 0, 1116, 0, - 0, 0, 0, 0, 1155, 1633, 0, 1440, 1441, 1442, - 1443, 1444, 0, 0, 0, 0, 0, 0, 1384, 1385, - 1387, 0, 0, 1390, 0, 1392, 0, 1607, 856, 859, - 861, 948, 997, 998, 0, 0, 0, 0, 978, 1632, - 902, 903, 906, 956, 0, 1488, 0, 0, 935, 1010, - 0, 936, 0, 53, 951, 0, 1561, 1560, 1573, 1586, - 383, 383, 377, 378, 384, 379, 381, 382, 1506, 0, - 1511, 0, 1600, 0, 0, 1589, 0, 0, 0, 0, - 0, 0, 0, 0, 981, 0, 0, 984, 0, 0, - 0, 0, 975, 946, 0, 947, 0, -2, 0, 0, - 92, 93, 0, 0, 0, 115, 116, 0, 0, 122, - 386, 387, 156, 165, 462, 180, 435, 0, 0, 306, - 373, 333, 334, 335, 0, 358, 0, 0, 0, 0, - 456, 128, 1520, 1519, 401, 401, 392, 0, 395, 0, - 0, 0, 1637, 361, 424, 0, 146, 0, 0, 0, - 0, 1626, 615, 0, 0, 622, 0, 0, 0, 525, - 0, 536, 537, 0, 649, -2, 711, 389, 0, 403, - 406, 963, 0, 0, 538, 0, 541, 542, 455, 516, - 547, 548, 562, 549, 497, 498, 495, 0, 0, 1543, - 1544, 1549, 1547, 1548, 133, 583, 585, 589, 584, 588, - 0, 0, 0, 520, 0, 608, 520, 581, 0, 451, - 1516, 0, 719, 452, 453, 793, 793, 866, 97, 0, - 869, 0, 0, 0, 0, 1031, 1035, 1048, 1049, 1445, - 1471, 360, 360, 1458, 360, 366, 1461, 360, 1463, 360, - 1466, 360, 1469, 1470, 0, 0, 1078, 0, 0, 0, - 0, 1164, 1481, 0, 0, 1175, 1114, 1115, 1115, 1115, - 1115, 1115, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, - 1189, 1190, 1475, 0, 0, 0, 1196, 0, 0, 1200, + 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, + 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 2299, 2299, + 777, 781, 785, 783, 1622, 808, 814, 816, 817, 0, + 0, 827, 830, 849, 49, 1919, 835, 49, 837, 838, + 839, 840, 841, 867, 868, 873, 0, 0, 0, 0, + 879, 880, 881, 0, 0, 884, 885, 886, 0, 0, + 0, 0, 0, 1018, 0, 0, 1144, 1145, 1146, 1147, + 1148, 1149, 1150, 1151, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1043, 1044, 0, 0, 0, 1068, 1069, 1070, + 1071, 1074, 0, 1085, 0, 1087, 1485, -2, 0, 0, + 0, 1079, 1080, 0, 0, 0, 1642, 1642, 0, 0, + 0, 1477, 0, 0, 1170, 0, 1171, 1173, 1174, 1175, + 0, 1176, 1177, 902, 902, 902, 902, 902, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 902, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, - 145, 0, 0, 0, 0, 0, 0, 1395, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1109, - 1113, 0, 1117, 1118, 0, 0, 1347, 0, 0, 1365, - 0, 0, 0, 0, 0, 0, 0, 1485, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 999, 1006, - 0, 1006, 0, 1006, 0, 0, 0, 1619, 1620, 1489, - 1490, 1010, 1491, 925, 937, 955, 1579, 0, 1572, 0, - -2, 1581, 0, 0, 0, 1587, 375, 376, 929, 80, - 1011, 83, 0, 1600, 1609, 0, 1597, 1602, 1604, 0, - 0, 0, 1593, 0, 1010, 939, 970, 972, 0, 967, - 982, 983, 985, 0, 987, 0, 989, 990, 950, 944, - 0, 100, 0, 1010, 1010, 99, 0, 995, 119, 120, - 121, 461, 184, 189, 0, 0, 0, 194, 0, 196, - 0, 0, 0, 201, 202, 401, 401, 436, 0, 303, - 305, 0, 0, 187, 374, 0, 374, 0, 365, 367, - 0, 437, 457, 1517, 1518, 0, 0, 394, 398, 399, - 400, 0, 148, 0, 0, 0, 618, 0, 646, 0, - 0, 0, 0, 0, 0, 176, 517, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 0, 401, 0, 0, - 0, 401, 401, 401, 0, 703, 388, 0, 0, 674, - 671, 539, 0, 218, 219, 226, 227, 229, 0, 0, - 0, 0, 0, 546, 950, 1534, 1535, 1536, 0, 1546, - 1550, 136, 0, 0, 0, 0, 591, 596, 602, 0, - 519, 603, 716, 717, 718, 95, 728, 734, 868, 888, - 1019, 1032, 1036, 0, 0, 0, 0, 1472, 1456, 374, - 1459, 1460, 1462, 1464, 1465, 1467, 1468, 1074, 1075, 1079, - 0, 1161, 0, 1163, 0, 1479, 0, 1176, 1177, 1178, - 1179, 1180, 1511, 0, 0, 0, 1195, 0, 0, 1115, - 0, 1208, 1207, 1209, 0, 1211, 1212, 1217, 1218, 1221, - 1223, 1230, 1232, 1236, 1238, 1241, 1243, 1245, 0, 1248, - 0, 1251, 0, 1254, 0, 1257, 0, 1260, 0, 1263, - 0, 1266, 0, 1269, 0, 1272, 0, 1275, 0, 1278, - 0, 1281, 0, 1284, 0, 1287, 0, 1290, 0, 1295, - 1297, 0, 1300, 1303, 1305, 0, 1308, 0, 1312, 0, - 1314, 1316, 1317, 0, 0, 0, 1328, 1329, 1330, 1331, - 1332, 1333, 1334, 1335, 1336, 1337, 1344, 0, 1107, 1346, - 1119, 1120, 1125, 1349, 0, 0, 0, 1352, 0, 0, - 0, 1356, 1156, 1367, 0, 1372, 0, 0, 1378, 0, - 1382, 0, 1388, 1389, 1391, 1393, 0, 0, 0, 0, - 0, 0, 0, 976, 957, 64, 1491, 1495, 0, 1566, - 1564, 1564, 1574, 1575, 0, 0, 1582, 0, 0, 0, - 0, 84, 0, 0, 1588, 0, 0, 1605, 0, 0, - 0, 0, 101, 1502, 964, 971, 0, 0, 965, 0, - 966, 986, 988, 943, 0, 1010, 1010, 90, 91, 0, - 190, 0, 192, 0, 195, 197, 198, 199, 205, 206, - 207, 200, 0, 0, 302, 304, 0, 0, 347, 359, - 349, 0, 0, 1521, 1522, 1523, 1524, 1525, 1526, 1527, - 1528, 950, 149, 150, 151, 610, 0, 620, 0, 952, - 0, 613, 0, 528, 0, 0, 0, 401, 401, 401, - 0, 0, 0, 0, 688, 0, 0, 651, 0, 659, - 0, 0, 0, 230, 231, 0, 1545, 582, 0, 134, - 135, 0, 0, 587, 521, 522, 1072, 0, 0, 0, - 1073, 1457, 0, 0, 0, 0, 0, 1476, 0, 0, - 0, 0, 1201, 1204, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1320, 0, 0, 0, - 640, 641, 0, 1396, 1112, 1502, 0, 1116, 1126, 1127, - 0, 1116, 1366, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1007, 0, 0, 0, 958, 959, - 0, 0, 0, 996, 1495, 1500, 0, 0, 1569, 0, - 1562, 1565, 1563, 1576, 0, 0, 1583, 0, 1585, 0, - 1610, 1611, 1603, 1598, 0, 1592, 1595, 1597, 1594, 1511, - 968, 0, 973, 0, 1502, 89, 0, 193, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, - 204, 0, 0, 363, 368, 0, 0, 0, 611, 0, - 953, 623, 614, 0, 701, 0, 705, 0, 0, 0, - 708, 709, 710, 687, 0, 691, 429, 675, 672, 673, - 540, 0, 137, 138, 0, 0, 0, 1446, 0, 1449, - 1159, 1162, 1160, 0, 1191, 1193, 1194, 1454, 1455, 1210, - 1246, 1249, 1252, 1255, 1258, 1261, 1264, 1267, 1270, 1273, - 1276, 1279, 1282, 1285, 1288, 1291, 1299, 1306, 1309, 1313, - 1318, 0, 1321, 0, 0, 1322, 0, 642, 1103, 0, - 0, 1123, 1124, 0, 1351, 1353, 1354, 1355, 1368, 0, - 1373, 1374, 0, 1379, 0, 1383, 1394, 0, 1001, 1008, - 1009, 0, 1004, 0, 1005, 0, 949, 1500, 82, 1501, - 1498, 0, 1496, 1493, 1558, 0, 1567, 1568, 1577, 1578, - 1584, 0, 0, 1597, 0, 1591, 87, 0, 0, 0, - 1511, 191, 0, 210, 0, 619, 0, 622, 612, 699, - 700, 0, 712, 704, 706, 707, 689, -2, 1537, 0, - 0, 0, 590, 1447, 0, 0, 1323, 0, 638, 639, - 1111, 1104, 0, 1089, 1090, 1108, 1348, 1350, 0, 0, - 0, 1000, 960, 961, 1002, 1003, 81, 0, 1497, 1131, - 0, 1492, 0, 1570, 1571, 1601, 0, 1590, 1596, 969, - 976, 0, 88, 442, 435, 1537, 0, 0, 0, 692, - 693, 694, 695, 696, 697, 698, 579, 1539, 139, 140, - 0, 509, 510, 511, 133, 0, 1166, 1319, 1105, 0, - 0, 0, 0, 0, 1369, 0, 1375, 0, 1380, 0, - 1499, 0, 0, 1494, 1599, 624, 0, 626, 0, -2, - 430, 443, 0, 185, 211, 212, 0, 0, 215, 216, - 217, 208, 209, 129, 0, 0, 713, 0, 1540, 1541, - 0, 136, 0, 0, 1096, 1097, 1098, 1099, 1101, 0, - 0, 0, 0, 1132, 1109, 625, 0, 0, 385, 0, - 635, 431, 432, 0, 438, 439, 440, 441, 213, 214, - 647, 0, 0, 508, 586, 1448, 0, 0, 1370, 0, - 1376, 0, 1381, 0, 627, 628, 636, 0, 433, 0, - 434, 0, 0, 0, 616, 0, 647, 1538, 1106, 1100, - 1102, 0, 0, 1130, 0, 637, 633, 444, 446, 447, - 0, 0, 445, 648, 617, 1371, 1377, 0, 448, 449, - 450, 629, 630, 631, 632, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1642, 0, 0, + 1642, 1642, 0, 0, 223, 224, 225, 226, 227, 228, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 299, 243, 244, 245, 246, 247, + 302, 248, 249, 250, 1155, 0, 0, 892, 0, 46, + 857, 858, 0, 979, 1642, 0, 0, 908, 0, 1657, + 57, 66, 68, 1514, 61, 1514, 0, 912, 0, 0, + -2, -2, 913, 914, 918, 919, 920, 921, 922, 923, + 924, 925, 926, 54, 2297, 55, 0, 74, 0, 48, + 0, 0, 79, 80, 1605, 1609, 0, 1555, 0, 1558, + 0, 0, 0, 377, 1562, 0, 0, 1507, 1508, 1511, + 0, 930, 2016, 934, 0, 936, 937, 0, 0, 103, + 0, 995, 0, 0, 0, 114, 0, 116, 117, 0, + 0, 0, 388, 1625, 1626, 1627, -2, 411, 0, 388, + 372, 310, 311, 312, 363, 314, 363, 363, 363, 363, + 377, 377, 377, 377, 345, 346, 347, 348, 349, 0, + 363, 0, 331, 363, 363, 363, 363, 353, 354, 355, + 356, 357, 358, 359, 360, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 365, 365, 365, 365, 365, 369, + 369, 0, 1113, 0, 392, 0, 1511, 0, 0, 1545, + 1634, 1644, 0, 0, 0, 0, 0, 135, 0, 0, + 0, 579, 623, 530, 567, 580, 0, 533, 534, -2, + 0, 0, 515, 0, 517, 0, 412, 0, -2, 0, + 422, 0, 418, 422, 419, 422, 410, 423, 557, 558, + 559, 0, 561, 562, 653, 965, 0, 0, 0, 0, + 0, 659, 660, 661, 0, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 568, 569, 570, 571, 572, + 573, 574, 575, 0, 0, 0, 0, 517, 0, 564, + 0, 0, 468, 469, 470, 0, 0, 473, 474, 475, + 476, 0, 0, 479, 480, 481, 982, 983, 482, 483, + 508, 509, 510, 484, 485, 486, 487, 488, 489, 490, + 502, 503, 504, 505, 506, 507, 491, 492, 493, 494, + 495, 496, 499, 0, 150, 1536, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1632, 0, 0, 0, 0, 911, 997, + 1655, 1656, 726, 0, 0, 797, 798, 0, 416, 417, + 796, 796, 736, 778, 0, 796, 740, 779, 741, 743, + 742, 744, 757, 758, 796, 747, 794, 795, 748, 749, + 750, 751, 752, 753, 754, 774, 759, 760, 761, 800, + 0, 804, 805, 775, 776, 0, 786, 0, 0, 0, + 820, 821, 0, 828, 852, 850, 851, 853, 845, 846, + 847, 848, 0, 854, 0, 0, 870, 99, 875, 876, + 877, 878, 890, 883, 1157, 1015, 1016, 1017, 0, 1019, + 1025, 0, 1140, 1142, 1023, 1024, 1027, 0, 0, 0, + 1021, 1032, 1152, 1153, 1154, 0, 0, 0, 0, 0, + 1036, 1040, 1045, 1046, 1047, 1048, 1049, 0, 1050, 0, + 1053, 1054, 1055, 1056, 1057, 1058, 1064, 1453, 1454, 1455, + 1083, 303, 304, 0, 1084, 0, 0, 0, 0, 0, + 0, 0, 0, 1400, 1401, 1402, 1403, 1404, 1405, 1406, + 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, + 1417, 1418, 1419, 1156, 0, 1643, 0, 0, 0, 1483, + 1480, 0, 0, 0, 1439, 1441, 0, 0, 0, 903, + 904, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1420, 1421, + 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, + 1432, 1433, 1434, 1435, 1436, 1437, 0, 0, 1456, 0, + 0, 0, 0, 0, 0, 0, 1476, 0, 1089, 1090, + 1091, 0, 0, 0, 0, 0, 0, 1218, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, + 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1364, 1365, 1366, 1367, 41, 0, 0, + 0, 0, 0, 0, 0, 1487, 0, -2, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1389, 0, 0, 0, 0, 0, 0, 1613, + 0, 0, 860, 861, 863, 0, 999, 0, 980, 0, + 0, 866, 0, 907, 0, 910, 60, 62, 916, 917, + 0, 938, 927, 915, 56, 51, 0, 0, 957, 0, + 0, 1556, 1559, 1560, 377, 1582, 0, 386, 386, 383, + 1517, 1518, 0, 1510, 1512, 1513, 81, 935, 931, 0, + 1013, 0, 0, 994, 0, 941, 943, 944, 945, 977, + 0, 948, 949, 0, 0, 0, 0, 0, 101, 996, + 107, 0, 115, 0, 0, 120, 121, 108, 109, 110, + 111, 0, 612, -2, 463, 182, 184, 185, 186, 177, + -2, 375, 373, 374, 313, 377, 377, 339, 340, 341, + 342, 343, 344, 0, 351, 0, 332, 333, 334, 335, + 324, 0, 325, 326, 327, 367, 0, 328, 329, 0, + 330, 430, 0, 1519, 393, 394, 396, 404, 0, 399, + 400, 0, 404, 404, 0, 425, 426, 0, 1511, 1536, + 0, 0, 1645, 1644, 1644, 1644, 155, 0, 170, 171, + 172, 173, 174, 175, 648, 0, 0, 624, 646, 647, + 168, 0, 0, 178, 519, 518, 0, 680, 0, 428, + 0, 0, 422, 422, 407, 408, 560, 0, 0, 655, + 656, 657, 658, 0, 0, 0, 546, 457, 0, 547, + 548, 517, 519, 0, 0, 388, 471, 472, 477, 478, + 497, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 595, 596, 598, 601, 603, 521, 607, + 609, 0, 597, 600, 602, 604, 521, 608, 610, 1533, + 1534, 1535, 0, 0, 718, 0, 0, 454, 97, 1633, + 723, 727, 728, 793, 746, 780, 793, 738, 745, 768, + 782, 784, 818, 819, 824, 832, 833, 834, 874, 0, + 0, 0, 0, 882, 0, 0, 1026, 1141, 1143, 1028, + 1029, 1030, 1033, 0, 1037, 1041, 0, 0, 0, 0, + 0, 1088, 1086, 1487, 0, 0, 0, 1137, 0, 0, + 1160, 1161, 0, 0, 0, 0, 1481, 0, 0, 1168, + 0, 1442, 1118, 0, 0, 0, 0, 0, 1118, 1118, + 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1505, 1195, + 0, 0, 0, 0, 0, 1200, 1201, 1202, 1118, 0, + 1205, 1206, 0, 1208, 0, 1209, 0, 0, 0, 0, + 1216, 1217, 1219, 0, 0, 1222, 1223, 0, 1225, 0, + 1227, 1228, 1229, 1230, 1231, 1232, 0, 1234, 0, 1236, + 1237, 1238, 0, 1240, 0, 1242, 1243, 0, 1245, 0, + 1247, 0, 1250, 0, 1253, 0, 1256, 0, 1259, 0, + 1262, 0, 1265, 0, 1268, 0, 1271, 0, 1274, 0, + 1277, 0, 1280, 0, 1283, 0, 1286, 0, 1289, 0, + 1292, 0, 1295, 1296, 1297, 0, 1299, 0, 1301, 0, + 1304, 1305, 0, 1307, 0, 1310, 0, 1313, 0, 0, + 1314, 0, 0, 0, 1318, 0, 0, 0, 0, 1327, + 1328, 1329, 1330, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1341, 1342, 1343, 1344, 1345, 1346, 0, + 1348, 0, 1119, 0, 0, 1119, 0, 0, 0, 0, + 0, 1158, 1642, 0, 1443, 1444, 1445, 1446, 1447, 0, + 0, 0, 0, 0, 0, 1387, 1388, 1390, 0, 0, + 1393, 0, 1395, 0, 1614, 859, 862, 864, 951, 1000, + 1001, 0, 0, 0, 0, 981, 1641, 905, 906, 909, + 959, 0, 1491, 0, 0, 938, 1013, 0, 939, 0, + 53, 954, 0, 1606, 1610, 1564, 1563, 1576, 1589, 386, + 386, 380, 381, 387, 382, 384, 385, 1509, 0, 1514, + 0, 1603, 0, 892, 1592, 0, 0, 0, 0, 0, + 0, 0, 0, 984, 0, 0, 987, 0, 0, 0, + 0, 978, 949, 0, 950, 0, -2, 0, 0, 95, + 96, 0, 0, 0, 118, 119, 0, 0, 125, 389, + 390, 159, 168, 465, 183, 438, 0, 0, 309, 376, + 336, 337, 338, 0, 361, 0, 0, 0, 0, 459, + 131, 1523, 1522, 404, 404, 395, 0, 398, 0, 0, + 0, 1646, 364, 427, 0, 149, 0, 0, 0, 0, + 1635, 618, 0, 0, 625, 0, 0, 0, 528, 0, + 539, 540, 0, 652, -2, 714, 392, 0, 406, 409, + 966, 0, 0, 541, 0, 544, 545, 458, 519, 550, + 551, 565, 552, 500, 501, 498, 0, 0, 1546, 1547, + 1552, 1550, 1551, 136, 586, 588, 592, 587, 591, 0, + 0, 0, 523, 0, 611, 523, 584, 0, 454, 1519, + 0, 722, 455, 456, 796, 796, 869, 100, 0, 872, + 0, 0, 0, 0, 1034, 1038, 1051, 1052, 1448, 1474, + 363, 363, 1461, 363, 369, 1464, 363, 1466, 363, 1469, + 363, 1472, 1473, 0, 0, 1081, 0, 0, 0, 0, + 1167, 1484, 0, 0, 1178, 1117, 1118, 1118, 1118, 1118, + 1118, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, + 1193, 1478, 0, 0, 0, 1199, 0, 0, 1203, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 147, 148, + 0, 0, 0, 0, 0, 0, 1398, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1112, 1116, + 0, 1120, 1121, 0, 0, 1350, 0, 0, 1368, 0, + 0, 0, 0, 0, 0, 0, 1488, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1002, 1009, 0, + 1009, 0, 1009, 0, 0, 0, 1628, 1629, 1492, 1493, + 1013, 1494, 928, 940, 958, 1582, 0, 1575, 0, -2, + 1584, 0, 0, 0, 1590, 378, 379, 932, 82, 1014, + 86, 0, 1603, 1618, 0, 1600, 1607, 1611, 0, 0, + 0, 1596, 0, 1013, 942, 973, 975, 0, 970, 985, + 986, 988, 0, 990, 0, 992, 993, 953, 947, 0, + 103, 0, 1013, 1013, 102, 0, 998, 122, 123, 124, + 464, 187, 192, 0, 0, 0, 197, 0, 199, 0, + 0, 0, 204, 205, 404, 404, 439, 0, 306, 308, + 0, 0, 190, 377, 0, 377, 0, 368, 370, 0, + 440, 460, 1520, 1521, 0, 0, 397, 401, 402, 403, + 0, 151, 0, 0, 0, 621, 0, 649, 0, 0, + 0, 0, 0, 0, 179, 520, 681, 682, 683, 684, + 685, 686, 687, 688, 689, 0, 404, 0, 0, 0, + 404, 404, 404, 0, 706, 391, 0, 0, 677, 674, + 542, 0, 221, 222, 229, 230, 232, 0, 0, 0, + 0, 0, 549, 953, 1537, 1538, 1539, 0, 1549, 1553, + 139, 0, 0, 0, 0, 594, 599, 605, 0, 522, + 606, 719, 720, 721, 98, 731, 737, 871, 891, 1022, + 1035, 1039, 0, 0, 0, 0, 1475, 1459, 377, 1462, + 1463, 1465, 1467, 1468, 1470, 1471, 1077, 1078, 1082, 0, + 1164, 0, 1166, 0, 1482, 0, 1179, 1180, 1181, 1182, + 1183, 1514, 0, 0, 0, 1198, 0, 0, 1118, 0, + 1211, 1210, 1212, 0, 1214, 1215, 1220, 1221, 1224, 1226, + 1233, 1235, 1239, 1241, 1244, 1246, 1248, 0, 1251, 0, + 1254, 0, 1257, 0, 1260, 0, 1263, 0, 1266, 0, + 1269, 0, 1272, 0, 1275, 0, 1278, 0, 1281, 0, + 1284, 0, 1287, 0, 1290, 0, 1293, 0, 1298, 1300, + 0, 1303, 1306, 1308, 0, 1311, 0, 1315, 0, 1317, + 1319, 1320, 0, 0, 0, 1331, 1332, 1333, 1334, 1335, + 1336, 1337, 1338, 1339, 1340, 1347, 0, 1110, 1349, 1122, + 1123, 1128, 1352, 0, 0, 0, 1355, 0, 0, 0, + 1359, 1159, 1370, 0, 1375, 0, 0, 1381, 0, 1385, + 0, 1391, 1392, 1394, 1396, 0, 0, 0, 0, 0, + 0, 0, 979, 960, 64, 1494, 1498, 0, 1569, 1567, + 1567, 1577, 1578, 0, 0, 1585, 0, 0, 0, 0, + 87, 0, 0, 1591, 0, 0, 1612, 0, 0, 0, + 0, 104, 1505, 967, 974, 0, 0, 968, 0, 969, + 989, 991, 946, 0, 1013, 1013, 93, 94, 0, 193, + 0, 195, 0, 198, 200, 201, 202, 208, 209, 210, + 203, 0, 0, 305, 307, 0, 0, 350, 362, 352, + 0, 0, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, + 953, 152, 153, 154, 613, 0, 623, 0, 955, 0, + 616, 0, 531, 0, 0, 0, 404, 404, 404, 0, + 0, 0, 0, 691, 0, 0, 654, 0, 662, 0, + 0, 0, 233, 234, 0, 1548, 585, 0, 137, 138, + 0, 0, 590, 524, 525, 1075, 0, 0, 0, 1076, + 1460, 0, 0, 0, 0, 0, 1479, 0, 0, 0, + 0, 1204, 1207, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1323, 0, 0, 0, 643, + 644, 0, 1399, 1115, 1505, 0, 1119, 1129, 1130, 0, + 1119, 1369, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1010, 0, 0, 0, 961, 962, 0, + 0, 0, 999, 1498, 1503, 0, 0, 1572, 0, 1565, + 1568, 1566, 1579, 0, 0, 1586, 0, 1588, 0, 1619, + 1620, 1608, 1601, 892, 1595, 1598, 1600, 1597, 1514, 971, + 0, 976, 0, 1505, 92, 0, 196, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 206, 207, + 0, 0, 366, 371, 0, 0, 0, 614, 0, 956, + 626, 617, 0, 704, 0, 708, 0, 0, 0, 711, + 712, 713, 690, 0, 694, 432, 678, 675, 676, 543, + 0, 140, 141, 0, 0, 0, 1449, 0, 1452, 1162, + 1165, 1163, 0, 1194, 1196, 1197, 1457, 1458, 1213, 1249, + 1252, 1255, 1258, 1261, 1264, 1267, 1270, 1273, 1276, 1279, + 1282, 1285, 1288, 1291, 1294, 1302, 1309, 1312, 1316, 1321, + 0, 1324, 0, 0, 1325, 0, 645, 1106, 0, 0, + 1126, 1127, 0, 1354, 1356, 1357, 1358, 1371, 0, 1376, + 1377, 0, 1382, 0, 1386, 1397, 0, 1004, 1011, 1012, + 0, 1007, 0, 1008, 0, 952, 1503, 84, 1504, 1501, + 0, 1499, 1496, 1561, 0, 1570, 1571, 1580, 1581, 1587, + 0, 0, 1600, 0, 1594, 90, 0, 0, 0, 1514, + 194, 0, 213, 0, 622, 0, 625, 615, 702, 703, + 0, 715, 707, 709, 710, 692, -2, 1540, 0, 0, + 0, 593, 1450, 0, 0, 1326, 0, 641, 642, 1114, + 1107, 0, 1092, 1093, 1111, 1351, 1353, 0, 0, 0, + 1003, 963, 964, 1005, 1006, 83, 0, 1500, 1134, 0, + 1495, 0, 1573, 1574, 1604, 0, 1593, 1599, 972, 979, + 0, 91, 445, 438, 1540, 0, 0, 0, 695, 696, + 697, 698, 699, 700, 701, 582, 1542, 142, 143, 0, + 512, 513, 514, 136, 0, 1169, 1322, 1108, 0, 0, + 0, 0, 0, 1372, 0, 1378, 0, 1383, 0, 1502, + 0, 0, 1497, 1602, 627, 0, 629, 0, -2, 433, + 446, 0, 188, 214, 215, 0, 0, 218, 219, 220, + 211, 212, 132, 0, 0, 716, 0, 1543, 1544, 0, + 139, 0, 0, 1099, 1100, 1101, 1102, 1104, 0, 0, + 0, 0, 1135, 1112, 628, 0, 0, 388, 0, 638, + 434, 435, 0, 441, 442, 443, 444, 216, 217, 650, + 0, 0, 511, 589, 1451, 0, 0, 1373, 0, 1379, + 0, 1384, 0, 630, 631, 639, 0, 436, 0, 437, + 0, 0, 0, 619, 0, 650, 1541, 1109, 1103, 1105, + 0, 0, 1133, 0, 640, 636, 447, 449, 450, 0, + 0, 448, 651, 620, 1374, 1380, 0, 451, 452, 453, + 632, 633, 634, 635, } var yyTok1 = [...]int{ @@ -9901,7 +9881,7 @@ var yyTok1 = [...]int{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 158, 3, 3, 3, 186, 178, 3, 95, 97, 183, 181, 96, 182, 236, 184, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 752, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 756, 166, 165, 167, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -10036,7 +10016,8 @@ var yyTok3 = [...]int{ 58060, 735, 58061, 736, 58062, 737, 58063, 738, 58064, 739, 58065, 740, 58066, 741, 58067, 742, 58068, 743, 58069, 744, 58070, 745, 58071, 746, 58072, 747, 58073, 748, 58074, 749, - 58075, 750, 58076, 751, 0, + 58075, 750, 58076, 751, 58077, 752, 58078, 753, 58079, 754, + 58080, 755, 0, } var yyErrorMessages = [...]struct { @@ -10386,7 +10367,7 @@ yydefault: case 1: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:631 +//line sql.y:633 { stmt := yyDollar[2].statementUnion() // If the statement is empty and we have comments @@ -10400,46 +10381,46 @@ yydefault: } case 2: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:644 +//line sql.y:646 { } case 3: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:645 +//line sql.y:647 { } case 4: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:649 +//line sql.y:651 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 40: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:688 +//line sql.y:690 { setParseTree(yylex, nil) } case 41: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:694 +//line sql.y:696 { yyLOCAL = NewVariableExpression(yyDollar[1].str, SingleAt) } yyVAL.union = yyLOCAL case 42: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:700 +//line sql.y:702 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 43: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:706 +//line sql.y:708 { yyLOCAL = NewVariableExpression(string(yyDollar[1].str), SingleAt) } @@ -10447,7 +10428,7 @@ yydefault: case 44: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:710 +//line sql.y:712 { yyLOCAL = NewVariableExpression(string(yyDollar[1].str), DoubleAt) } @@ -10455,7 +10436,7 @@ yydefault: case 45: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:716 +//line sql.y:718 { yyLOCAL = &OtherAdmin{} } @@ -10463,7 +10444,7 @@ yydefault: case 46: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:722 +//line sql.y:724 { yyLOCAL = &Load{} } @@ -10471,7 +10452,7 @@ yydefault: case 47: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *With -//line sql.y:728 +//line sql.y:730 { yyLOCAL = &With{CTEs: yyDollar[2].ctesUnion(), Recursive: false} } @@ -10479,7 +10460,7 @@ yydefault: case 48: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *With -//line sql.y:732 +//line sql.y:734 { yyLOCAL = &With{CTEs: yyDollar[3].ctesUnion(), Recursive: true} } @@ -10487,7 +10468,7 @@ yydefault: case 49: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *With -//line sql.y:737 +//line sql.y:739 { yyLOCAL = nil } @@ -10495,14 +10476,14 @@ yydefault: case 50: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *With -//line sql.y:741 +//line sql.y:743 { yyLOCAL = yyDollar[1].withUnion() } yyVAL.union = yyLOCAL case 51: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:747 +//line sql.y:749 { yySLICE := (*[]*CommonTableExpr)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].cteUnion()) @@ -10510,7 +10491,7 @@ yydefault: case 52: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*CommonTableExpr -//line sql.y:751 +//line sql.y:753 { yyLOCAL = []*CommonTableExpr{yyDollar[1].cteUnion()} } @@ -10518,266 +10499,290 @@ yydefault: case 53: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *CommonTableExpr -//line sql.y:757 +//line sql.y:759 { yyLOCAL = &CommonTableExpr{ID: yyDollar[1].identifierCS, Columns: yyDollar[2].columnsUnion(), Subquery: yyDollar[4].subqueryUnion().Select} } yyVAL.union = yyLOCAL case 54: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:763 + var yyLOCAL TableStatement +//line sql.y:765 { - yyLOCAL = yyDollar[2].selStmtUnion() + yyLOCAL = yyDollar[2].tableStmtUnion() } yyVAL.union = yyLOCAL case 55: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:767 + var yyLOCAL TableStatement +//line sql.y:769 { - yyLOCAL = yyDollar[2].selStmtUnion() + yyLOCAL = yyDollar[2].tableStmtUnion() } yyVAL.union = yyLOCAL case 56: yyDollar = yyS[yypt-4 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:771 + var yyLOCAL TableStatement +//line sql.y:773 { - setLockInSelect(yyDollar[2].selStmtUnion(), yyDollar[3].lockUnion()) - yyLOCAL = yyDollar[2].selStmtUnion() + setLockIfPossible(yylex, yyDollar[2].tableStmtUnion(), yyDollar[3].lockUnion()) + yyLOCAL = yyDollar[2].tableStmtUnion() } yyVAL.union = yyLOCAL case 57: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:794 + var yyLOCAL TableStatement +//line sql.y:796 { - yyDollar[1].selStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) - yyDollar[1].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + yyDollar[1].tableStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) + yyDollar[1].tableStmtUnion().SetLimit(yyDollar[3].limitUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 58: yyDollar = yyS[yypt-2 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:800 + var yyLOCAL TableStatement +//line sql.y:802 { - yyDollar[1].selStmtUnion().SetLimit(yyDollar[2].limitUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + yyDollar[1].tableStmtUnion().SetLimit(yyDollar[2].limitUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 59: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:805 + var yyLOCAL TableStatement +//line sql.y:807 { - yyDollar[1].selStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) - yyDollar[1].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + yyDollar[1].tableStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) + yyDollar[1].tableStmtUnion().SetLimit(yyDollar[3].limitUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 60: yyDollar = yyS[yypt-4 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:811 + var yyLOCAL TableStatement +//line sql.y:813 { - yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) - yyDollar[2].selStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) - yyDollar[2].selStmtUnion().SetLimit(yyDollar[4].limitUnion()) - yyLOCAL = yyDollar[2].selStmtUnion() + yyDollar[2].tableStmtUnion().SetWith(yyDollar[1].withUnion()) + yyDollar[2].tableStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) + yyDollar[2].tableStmtUnion().SetLimit(yyDollar[4].limitUnion()) + yyLOCAL = yyDollar[2].tableStmtUnion() } yyVAL.union = yyLOCAL case 61: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:818 + var yyLOCAL TableStatement +//line sql.y:820 { - yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) - yyDollar[2].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) - yyLOCAL = yyDollar[2].selStmtUnion() + yyDollar[2].tableStmtUnion().SetWith(yyDollar[1].withUnion()) + yyDollar[2].tableStmtUnion().SetLimit(yyDollar[3].limitUnion()) + yyLOCAL = yyDollar[2].tableStmtUnion() } yyVAL.union = yyLOCAL case 62: yyDollar = yyS[yypt-4 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:824 + var yyLOCAL TableStatement +//line sql.y:826 { - yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) - yyDollar[2].selStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) - yyDollar[2].selStmtUnion().SetLimit(yyDollar[4].limitUnion()) - yyLOCAL = yyDollar[2].selStmtUnion() + yyDollar[2].tableStmtUnion().SetWith(yyDollar[1].withUnion()) + yyDollar[2].tableStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) + yyDollar[2].tableStmtUnion().SetLimit(yyDollar[4].limitUnion()) + yyLOCAL = yyDollar[2].tableStmtUnion() } yyVAL.union = yyLOCAL case 63: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:831 +//line sql.y:833 { - yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) + yyDollar[2].tableStmtUnion().SetWith(yyDollar[1].withUnion()) } case 64: yyDollar = yyS[yypt-7 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:835 + var yyLOCAL TableStatement +//line sql.y:837 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), SelectExprs{&Nextval{Expr: yyDollar[5].exprUnion()}}, []string{yyDollar[3].str} /*options*/, nil, TableExprs{&AliasedTableExpr{Expr: yyDollar[7].tableName}}, nil /*where*/, nil /*groupBy*/, nil /*having*/, nil) } yyVAL.union = yyLOCAL case 65: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:841 + var yyLOCAL TableStatement +//line sql.y:843 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 66: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:845 + var yyLOCAL TableStatement +//line sql.y:847 { - yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} + yyLOCAL = &Union{Left: yyDollar[1].tableStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].tableStmtUnion()} } yyVAL.union = yyLOCAL case 67: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:849 + var yyLOCAL TableStatement +//line sql.y:851 { - yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} + yyLOCAL = &Union{Left: yyDollar[1].tableStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].tableStmtUnion()} } yyVAL.union = yyLOCAL case 68: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:853 + var yyLOCAL TableStatement +//line sql.y:855 { - yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} + yyLOCAL = &Union{Left: yyDollar[1].tableStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].tableStmtUnion()} } yyVAL.union = yyLOCAL case 69: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:857 + var yyLOCAL TableStatement +//line sql.y:859 { - yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} + yyLOCAL = &Union{Left: yyDollar[1].tableStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].tableStmtUnion()} } yyVAL.union = yyLOCAL case 70: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:863 + var yyLOCAL TableStatement +//line sql.y:865 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 71: yyDollar = yyS[yypt-2 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:867 + var yyLOCAL TableStatement +//line sql.y:869 { - setLockInSelect(yyDollar[1].selStmtUnion(), yyDollar[2].lockUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + setLockIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].lockUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 72: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:872 + var yyLOCAL TableStatement +//line sql.y:874 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 73: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:876 + var yyLOCAL TableStatement +//line sql.y:878 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 74: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:882 + var yyLOCAL TableStatement +//line sql.y:884 { - yyLOCAL = yyDollar[2].selStmtUnion() + yyLOCAL = yyDollar[2].tableStmtUnion() } yyVAL.union = yyLOCAL case 75: yyDollar = yyS[yypt-2 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:886 + var yyLOCAL TableStatement +//line sql.y:888 { - yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + setIntoIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].selectIntoUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 76: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:891 + var yyLOCAL TableStatement +//line sql.y:893 { - yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) - yyDollar[1].selStmtUnion().SetLock(yyDollar[3].lockUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + setIntoIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].selectIntoUnion()) + setLockIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[3].lockUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 77: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:897 + var yyLOCAL TableStatement +//line sql.y:899 { - yyDollar[1].selStmtUnion().SetInto(yyDollar[3].selectIntoUnion()) - yyDollar[1].selStmtUnion().SetLock(yyDollar[2].lockUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + setLockIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].lockUnion()) + setIntoIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[3].selectIntoUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 78: yyDollar = yyS[yypt-2 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:903 + var yyLOCAL TableStatement +//line sql.y:905 { - yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + setIntoIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].selectIntoUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 79: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL TableStatement +//line sql.y:912 + { + yyLOCAL = &ValuesStatement{Comments: Comments(yyDollar[2].strs).Parsed(), ListArg: ListArg(yyDollar[3].str[2:])} + } + yyVAL.union = yyLOCAL + case 80: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL TableStatement +//line sql.y:916 + { + yyLOCAL = &ValuesStatement{Comments: Comments(yyDollar[2].strs).Parsed(), Rows: yyDollar[3].valuesUnion()} + } + yyVAL.union = yyLOCAL + case 81: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:910 +//line sql.y:922 { yyLOCAL = &Stream{Comments: Comments(yyDollar[2].strs).Parsed(), SelectExpr: yyDollar[3].selectExprUnion(), Table: yyDollar[5].tableName} } yyVAL.union = yyLOCAL - case 80: + case 82: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:916 +//line sql.y:928 { yyLOCAL = &VStream{Comments: Comments(yyDollar[2].strs).Parsed(), SelectExpr: yyDollar[3].selectExprUnion(), Table: yyDollar[5].tableName, Where: NewWhere(WhereClause, yyDollar[6].exprUnion()), Limit: yyDollar[7].limitUnion()} } yyVAL.union = yyLOCAL - case 81: + case 83: yyDollar = yyS[yypt-10 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:924 + var yyLOCAL TableStatement +//line sql.y:936 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), yyDollar[4].selectExprsUnion() /*SelectExprs*/, yyDollar[3].strs /*options*/, yyDollar[5].selectIntoUnion() /*into*/, yyDollar[6].tableExprsUnion() /*from*/, NewWhere(WhereClause, yyDollar[7].exprUnion()), yyDollar[8].groupByUnion(), NewWhere(HavingClause, yyDollar[9].exprUnion()), yyDollar[10].namedWindowsUnion()) } yyVAL.union = yyLOCAL - case 82: + case 84: yyDollar = yyS[yypt-9 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:928 + var yyLOCAL TableStatement +//line sql.y:940 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), yyDollar[4].selectExprsUnion() /*SelectExprs*/, yyDollar[3].strs /*options*/, nil, yyDollar[5].tableExprsUnion() /*from*/, NewWhere(WhereClause, yyDollar[6].exprUnion()), yyDollar[7].groupByUnion(), NewWhere(HavingClause, yyDollar[8].exprUnion()), yyDollar[9].namedWindowsUnion()) } yyVAL.union = yyLOCAL - case 83: + case 85: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL TableStatement +//line sql.y:944 + { + yyLOCAL = yyDollar[1].tableStmtUnion() + } + yyVAL.union = yyLOCAL + case 86: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:934 +//line sql.y:950 { // insert_data returns a *Insert pre-filled with Columns & Values ins := yyDollar[6].insUnion() @@ -10790,10 +10795,10 @@ yydefault: yyLOCAL = ins } yyVAL.union = yyLOCAL - case 84: + case 87: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:946 +//line sql.y:962 { cols := make(Columns, 0, len(yyDollar[7].updateExprsUnion())) vals := make(ValTuple, 0, len(yyDollar[8].updateExprsUnion())) @@ -10804,329 +10809,329 @@ yydefault: yyLOCAL = &Insert{Action: yyDollar[1].insertActionUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), Ignore: yyDollar[3].ignoreUnion(), Table: getAliasedTableExprFromTableName(yyDollar[4].tableName), Partitions: yyDollar[5].partitionsUnion(), Columns: cols, Rows: Values{vals}, OnDup: OnDup(yyDollar[8].updateExprsUnion())} } yyVAL.union = yyLOCAL - case 85: + case 88: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL InsertAction -//line sql.y:958 +//line sql.y:974 { yyLOCAL = InsertAct } yyVAL.union = yyLOCAL - case 86: + case 89: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL InsertAction -//line sql.y:962 +//line sql.y:978 { yyLOCAL = ReplaceAct } yyVAL.union = yyLOCAL - case 87: + case 90: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:968 +//line sql.y:984 { yyLOCAL = &Update{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), TableExprs: yyDollar[5].tableExprsUnion(), Exprs: yyDollar[7].updateExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion()), OrderBy: yyDollar[9].orderByUnion(), Limit: yyDollar[10].limitUnion()} } yyVAL.union = yyLOCAL - case 88: + case 91: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:974 +//line sql.y:990 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), TableExprs: TableExprs{&AliasedTableExpr{Expr: yyDollar[6].tableName, As: yyDollar[7].identifierCS}}, Partitions: yyDollar[8].partitionsUnion(), Where: NewWhere(WhereClause, yyDollar[9].exprUnion()), OrderBy: yyDollar[10].orderByUnion(), Limit: yyDollar[11].limitUnion()} } yyVAL.union = yyLOCAL - case 89: + case 92: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Statement -//line sql.y:978 +//line sql.y:994 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[6].tableNamesUnion(), TableExprs: yyDollar[8].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[9].exprUnion())} } yyVAL.union = yyLOCAL - case 90: + case 93: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:982 +//line sql.y:998 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[5].tableNamesUnion(), TableExprs: yyDollar[7].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion())} } yyVAL.union = yyLOCAL - case 91: + case 94: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:986 +//line sql.y:1002 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[5].tableNamesUnion(), TableExprs: yyDollar[7].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion())} } yyVAL.union = yyLOCAL - case 92: + case 95: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:991 +//line sql.y:1007 { } - case 93: + case 96: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:992 +//line sql.y:1008 { } - case 94: + case 97: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:996 +//line sql.y:1012 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL - case 95: + case 98: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1000 +//line sql.y:1016 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) } - case 96: + case 99: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:1006 +//line sql.y:1022 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL - case 97: + case 100: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1010 +//line sql.y:1026 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) } - case 98: + case 101: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:1016 +//line sql.y:1032 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL - case 99: + case 102: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1020 +//line sql.y:1036 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) } - case 100: + case 103: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Partitions -//line sql.y:1025 +//line sql.y:1041 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 101: + case 104: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Partitions -//line sql.y:1029 +//line sql.y:1045 { yyLOCAL = yyDollar[3].partitionsUnion() } yyVAL.union = yyLOCAL - case 102: + case 105: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:1035 +//line sql.y:1051 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), yyDollar[3].setExprsUnion()) } yyVAL.union = yyLOCAL - case 103: + case 106: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SetExprs -//line sql.y:1041 +//line sql.y:1057 { yyLOCAL = SetExprs{yyDollar[1].setExprUnion()} } yyVAL.union = yyLOCAL - case 104: + case 107: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1045 +//line sql.y:1061 { yySLICE := (*SetExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].setExprUnion()) } - case 105: + case 108: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1051 +//line sql.y:1067 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: NewStrLiteral("on")} } yyVAL.union = yyLOCAL - case 106: + case 109: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1055 +//line sql.y:1071 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: NewStrLiteral("off")} } yyVAL.union = yyLOCAL - case 107: + case 110: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1059 +//line sql.y:1075 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 108: + case 111: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1063 +//line sql.y:1079 { yyLOCAL = &SetExpr{Var: NewSetVariable(string(yyDollar[1].str), SessionScope), Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 109: + case 112: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:1069 +//line sql.y:1085 { yyLOCAL = NewSetVariable(string(yyDollar[1].str), SessionScope) } yyVAL.union = yyLOCAL - case 110: + case 113: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:1073 +//line sql.y:1089 { yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL - case 111: + case 114: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Variable -//line sql.y:1077 +//line sql.y:1093 { yyLOCAL = NewSetVariable(string(yyDollar[2].str), yyDollar[1].scopeUnion()) } yyVAL.union = yyLOCAL - case 112: + case 115: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:1083 +//line sql.y:1099 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), UpdateSetExprsScope(yyDollar[5].setExprsUnion(), yyDollar[3].scopeUnion())) } yyVAL.union = yyLOCAL - case 113: + case 116: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:1087 +//line sql.y:1103 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), yyDollar[4].setExprsUnion()) } yyVAL.union = yyLOCAL - case 114: + case 117: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SetExprs -//line sql.y:1093 +//line sql.y:1109 { yyLOCAL = SetExprs{yyDollar[1].setExprUnion()} } yyVAL.union = yyLOCAL - case 115: + case 118: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1097 +//line sql.y:1113 { yySLICE := (*SetExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].setExprUnion()) } - case 116: + case 119: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1103 +//line sql.y:1119 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionIsolationStr, NextTxScope), Expr: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 117: + case 120: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1107 +//line sql.y:1123 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionReadOnlyStr, NextTxScope), Expr: NewStrLiteral("off")} } yyVAL.union = yyLOCAL - case 118: + case 121: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1111 +//line sql.y:1127 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionReadOnlyStr, NextTxScope), Expr: NewStrLiteral("on")} } yyVAL.union = yyLOCAL - case 119: + case 122: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1117 +//line sql.y:1133 { yyVAL.str = RepeatableReadStr } - case 120: + case 123: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1121 +//line sql.y:1137 { yyVAL.str = ReadCommittedStr } - case 121: + case 124: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1125 +//line sql.y:1141 { yyVAL.str = ReadUncommittedStr } - case 122: + case 125: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1129 +//line sql.y:1145 { yyVAL.str = SerializableStr } - case 123: + case 126: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1135 +//line sql.y:1151 { yyLOCAL = SessionScope } yyVAL.union = yyLOCAL - case 124: + case 127: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1139 +//line sql.y:1155 { yyLOCAL = SessionScope } yyVAL.union = yyLOCAL - case 125: + case 128: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1143 +//line sql.y:1159 { yyLOCAL = GlobalScope } yyVAL.union = yyLOCAL - case 126: + case 129: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1149 +//line sql.y:1165 { yyDollar[1].createTableUnion().TableSpec = yyDollar[2].tableSpecUnion() yyDollar[1].createTableUnion().FullyParsed = true yyLOCAL = yyDollar[1].createTableUnion() } yyVAL.union = yyLOCAL - case 127: + case 130: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1155 +//line sql.y:1171 { // Create table [name] like [name] yyDollar[1].createTableUnion().OptLike = yyDollar[2].optLikeUnion() @@ -11134,10 +11139,10 @@ yydefault: yyLOCAL = yyDollar[1].createTableUnion() } yyVAL.union = yyLOCAL - case 128: + case 131: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:1162 +//line sql.y:1178 { indexDef := yyDollar[1].alterTableUnion().AlterOptions[0].(*AddIndexDefinition).IndexDefinition indexDef.Columns = yyDollar[3].indexColumnsUnion() @@ -11147,413 +11152,413 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 129: + case 132: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Statement -//line sql.y:1171 +//line sql.y:1187 { - yyLOCAL = &CreateView{ViewName: yyDollar[8].tableName, Comments: Comments(yyDollar[2].strs).Parsed(), IsReplace: yyDollar[3].booleanUnion(), Algorithm: yyDollar[4].str, Definer: yyDollar[5].definerUnion(), Security: yyDollar[6].str, Columns: yyDollar[9].columnsUnion(), Select: yyDollar[11].selStmtUnion(), CheckOption: yyDollar[12].str} + yyLOCAL = &CreateView{ViewName: yyDollar[8].tableName, Comments: Comments(yyDollar[2].strs).Parsed(), IsReplace: yyDollar[3].booleanUnion(), Algorithm: yyDollar[4].str, Definer: yyDollar[5].definerUnion(), Security: yyDollar[6].str, Columns: yyDollar[9].columnsUnion(), Select: yyDollar[11].tableStmtUnion(), CheckOption: yyDollar[12].str} } yyVAL.union = yyLOCAL - case 130: + case 133: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1175 +//line sql.y:1191 { yyDollar[1].createDatabaseUnion().FullyParsed = true yyDollar[1].createDatabaseUnion().CreateOptions = yyDollar[2].databaseOptionsUnion() yyLOCAL = yyDollar[1].createDatabaseUnion() } yyVAL.union = yyLOCAL - case 131: + case 134: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:1182 +//line sql.y:1198 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 132: + case 135: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:1186 +//line sql.y:1202 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 133: + case 136: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1191 +//line sql.y:1207 { yyVAL.identifierCI = NewIdentifierCI("") } - case 134: + case 137: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1195 +//line sql.y:1211 { yyVAL.identifierCI = yyDollar[2].identifierCI } - case 135: + case 138: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1201 +//line sql.y:1217 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 136: + case 139: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1206 +//line sql.y:1222 { var v []VindexParam yyLOCAL = v } yyVAL.union = yyLOCAL - case 137: + case 140: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1211 +//line sql.y:1227 { yyLOCAL = yyDollar[2].vindexParamsUnion() } yyVAL.union = yyLOCAL - case 138: + case 141: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1217 +//line sql.y:1233 { yyLOCAL = make([]VindexParam, 0, 4) yyLOCAL = append(yyLOCAL, yyDollar[1].vindexParam) } yyVAL.union = yyLOCAL - case 139: + case 142: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1222 +//line sql.y:1238 { yySLICE := (*[]VindexParam)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].vindexParam) } - case 140: + case 143: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1228 +//line sql.y:1244 { yyVAL.vindexParam = VindexParam{Key: yyDollar[1].identifierCI, Val: yyDollar[3].str} } - case 141: + case 144: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1233 +//line sql.y:1249 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 142: + case 145: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1237 +//line sql.y:1253 { yyLOCAL = yyDollar[1].jsonObjectParamsUnion() } yyVAL.union = yyLOCAL - case 143: + case 146: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1243 +//line sql.y:1259 { yyLOCAL = []*JSONObjectParam{yyDollar[1].jsonObjectParam} } yyVAL.union = yyLOCAL - case 144: + case 147: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1247 +//line sql.y:1263 { yySLICE := (*[]*JSONObjectParam)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jsonObjectParam) } - case 145: + case 148: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1253 +//line sql.y:1269 { yyVAL.jsonObjectParam = &JSONObjectParam{Key: yyDollar[1].exprUnion(), Value: yyDollar[3].exprUnion()} } - case 146: + case 149: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *CreateTable -//line sql.y:1259 +//line sql.y:1275 { yyLOCAL = &CreateTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[6].tableName, IfNotExists: yyDollar[5].booleanUnion(), Temp: yyDollar[3].booleanUnion()} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 147: + case 150: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1266 +//line sql.y:1282 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[4].tableName} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 148: + case 151: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1273 +//line sql.y:1289 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[7].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[4].identifierCI}, Options: yyDollar[5].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 149: + case 152: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1278 +//line sql.y:1294 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeFullText}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 150: + case 153: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1283 +//line sql.y:1299 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeSpatial}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 151: + case 154: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1288 +//line sql.y:1304 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeUnique}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 152: + case 155: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *CreateDatabase -//line sql.y:1295 +//line sql.y:1311 { yyLOCAL = &CreateDatabase{Comments: Comments(yyDollar[2].strs).Parsed(), DBName: yyDollar[5].identifierCS, IfNotExists: yyDollar[4].booleanUnion()} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 153: + case 156: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AlterDatabase -//line sql.y:1302 +//line sql.y:1318 { yyLOCAL = &AlterDatabase{Comments: Comments(yyDollar[2].strs).Parsed()} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 156: + case 159: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1313 +//line sql.y:1329 { yyLOCAL = yyDollar[2].tableSpecUnion() yyLOCAL.Options = yyDollar[4].tableOptionsUnion() yyLOCAL.PartitionOption = yyDollar[5].partitionOptionUnion() } yyVAL.union = yyLOCAL - case 157: + case 160: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1320 +//line sql.y:1336 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 158: + case 161: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1324 +//line sql.y:1340 { yyLOCAL = yyDollar[1].databaseOptionsUnion() } yyVAL.union = yyLOCAL - case 159: + case 162: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1330 +//line sql.y:1346 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } yyVAL.union = yyLOCAL - case 160: + case 163: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1334 +//line sql.y:1350 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } yyVAL.union = yyLOCAL - case 161: + case 164: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1338 +//line sql.y:1354 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } yyVAL.union = yyLOCAL - case 162: + case 165: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1342 +//line sql.y:1358 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) } - case 163: + case 166: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1346 +//line sql.y:1362 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) } - case 164: + case 167: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1350 +//line sql.y:1366 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) } - case 165: + case 168: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:1356 +//line sql.y:1372 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 166: + case 169: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:1360 +//line sql.y:1376 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 167: + case 170: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1366 +//line sql.y:1382 { yyVAL.databaseOption = DatabaseOption{Type: CharacterSetType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } - case 168: + case 171: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1370 +//line sql.y:1386 { yyVAL.databaseOption = DatabaseOption{Type: CharacterSetType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } - case 169: + case 172: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1376 +//line sql.y:1392 { yyVAL.databaseOption = DatabaseOption{Type: CollateType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } - case 170: + case 173: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1380 +//line sql.y:1396 { yyVAL.databaseOption = DatabaseOption{Type: CollateType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } - case 171: + case 174: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1386 +//line sql.y:1402 { yyVAL.databaseOption = DatabaseOption{Type: EncryptionType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } - case 172: + case 175: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1390 +//line sql.y:1406 { yyVAL.databaseOption = DatabaseOption{Type: EncryptionType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } - case 173: + case 176: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OptLike -//line sql.y:1396 +//line sql.y:1412 { yyLOCAL = &OptLike{LikeTable: yyDollar[2].tableName} } yyVAL.union = yyLOCAL - case 174: + case 177: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OptLike -//line sql.y:1400 +//line sql.y:1416 { yyLOCAL = &OptLike{LikeTable: yyDollar[3].tableName} } yyVAL.union = yyLOCAL - case 175: + case 178: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColumnDefinition -//line sql.y:1406 +//line sql.y:1422 { yyLOCAL = []*ColumnDefinition{yyDollar[1].columnDefinitionUnion()} } yyVAL.union = yyLOCAL - case 176: + case 179: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1410 +//line sql.y:1426 { yySLICE := (*[]*ColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].columnDefinitionUnion()) } - case 177: + case 180: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1416 +//line sql.y:1432 { yyLOCAL = &TableSpec{} yyLOCAL.AddColumn(yyDollar[1].columnDefinitionUnion()) } yyVAL.union = yyLOCAL - case 178: + case 181: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1421 +//line sql.y:1437 { yyLOCAL = &TableSpec{} yyLOCAL.AddConstraint(yyDollar[1].constraintDefinitionUnion()) } yyVAL.union = yyLOCAL - case 179: + case 182: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1426 +//line sql.y:1442 { yyVAL.tableSpecUnion().AddColumn(yyDollar[3].columnDefinitionUnion()) } - case 180: + case 183: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1430 +//line sql.y:1446 { yyVAL.tableSpecUnion().AddColumn(yyDollar[3].columnDefinitionUnion()) yyVAL.tableSpecUnion().AddConstraint(yyDollar[4].constraintDefinitionUnion()) } - case 181: + case 184: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1435 +//line sql.y:1451 { yyVAL.tableSpecUnion().AddIndex(yyDollar[3].indexDefinitionUnion()) } - case 182: + case 185: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1439 +//line sql.y:1455 { yyVAL.tableSpecUnion().AddConstraint(yyDollar[3].constraintDefinitionUnion()) } - case 183: + case 186: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1443 +//line sql.y:1459 { yyVAL.tableSpecUnion().AddConstraint(yyDollar[3].constraintDefinitionUnion()) } - case 184: + case 187: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColumnDefinition -//line sql.y:1454 +//line sql.y:1470 { yyDollar[2].columnType.Options = yyDollar[4].columnTypeOptionsUnion() if yyDollar[2].columnType.Options.Collate == "" { @@ -11563,10 +11568,10 @@ yydefault: yyLOCAL = &ColumnDefinition{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType} } yyVAL.union = yyLOCAL - case 185: + case 188: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *ColumnDefinition -//line sql.y:1463 +//line sql.y:1479 { yyDollar[2].columnType.Options = yyDollar[9].columnTypeOptionsUnion() yyDollar[2].columnType.Options.As = yyDollar[7].exprUnion() @@ -11575,945 +11580,921 @@ yydefault: yyLOCAL = &ColumnDefinition{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType} } yyVAL.union = yyLOCAL - case 186: + case 189: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1472 +//line sql.y:1488 { yyVAL.str = "" } - case 187: + case 190: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1476 +//line sql.y:1492 { yyVAL.str = "" } - case 188: + case 191: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1485 +//line sql.y:1501 { yyLOCAL = &ColumnTypeOptions{Null: nil, Default: nil, OnUpdate: nil, Autoincrement: false, KeyOpt: ColKeyNone, Comment: nil, As: nil, Invisible: nil, Format: UnspecifiedFormat, EngineAttribute: nil, SecondaryEngineAttribute: nil} } yyVAL.union = yyLOCAL - case 189: + case 192: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1489 +//line sql.y:1505 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 190: + case 193: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1494 +//line sql.y:1510 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 191: + case 194: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1499 +//line sql.y:1515 { yyDollar[1].columnTypeOptionsUnion().Default = yyDollar[4].exprUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 192: + case 195: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1504 +//line sql.y:1520 { yyDollar[1].columnTypeOptionsUnion().Default = yyDollar[3].exprUnion() yyDollar[1].columnTypeOptionsUnion().DefaultLiteral = true yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 193: + case 196: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1510 +//line sql.y:1526 { yyDollar[1].columnTypeOptionsUnion().OnUpdate = yyDollar[4].exprUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 194: + case 197: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1515 +//line sql.y:1531 { yyDollar[1].columnTypeOptionsUnion().Autoincrement = true yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 195: + case 198: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1520 +//line sql.y:1536 { yyDollar[1].columnTypeOptionsUnion().Comment = NewStrLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 196: + case 199: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1525 +//line sql.y:1541 { yyDollar[1].columnTypeOptionsUnion().KeyOpt = yyDollar[2].colKeyOptUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 197: + case 200: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1530 +//line sql.y:1546 { yyDollar[1].columnTypeOptionsUnion().Collate = encodeSQLString(yyDollar[3].str) } - case 198: + case 201: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1534 +//line sql.y:1550 { yyDollar[1].columnTypeOptionsUnion().Collate = string(yyDollar[3].identifierCI.String()) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 199: + case 202: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1539 +//line sql.y:1555 { yyDollar[1].columnTypeOptionsUnion().Format = yyDollar[3].columnFormatUnion() } - case 200: + case 203: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1543 +//line sql.y:1559 { yyDollar[1].columnTypeOptionsUnion().SRID = NewIntLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 201: + case 204: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1548 +//line sql.y:1564 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 202: + case 205: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1553 +//line sql.y:1569 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 203: + case 206: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1558 +//line sql.y:1574 { yyDollar[1].columnTypeOptionsUnion().EngineAttribute = NewStrLiteral(yyDollar[4].str) } - case 204: + case 207: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1562 +//line sql.y:1578 { yyDollar[1].columnTypeOptionsUnion().SecondaryEngineAttribute = NewStrLiteral(yyDollar[4].str) } - case 205: + case 208: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1568 +//line sql.y:1584 { yyLOCAL = FixedFormat } yyVAL.union = yyLOCAL - case 206: + case 209: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1572 +//line sql.y:1588 { yyLOCAL = DynamicFormat } yyVAL.union = yyLOCAL - case 207: + case 210: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1576 +//line sql.y:1592 { yyLOCAL = DefaultFormat } yyVAL.union = yyLOCAL - case 208: + case 211: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnStorage -//line sql.y:1582 +//line sql.y:1598 { yyLOCAL = VirtualStorage } yyVAL.union = yyLOCAL - case 209: + case 212: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnStorage -//line sql.y:1586 +//line sql.y:1602 { yyLOCAL = StoredStorage } yyVAL.union = yyLOCAL - case 210: + case 213: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1591 +//line sql.y:1607 { yyLOCAL = &ColumnTypeOptions{} } yyVAL.union = yyLOCAL - case 211: + case 214: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1595 +//line sql.y:1611 { yyDollar[1].columnTypeOptionsUnion().Storage = yyDollar[2].columnStorageUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 212: + case 215: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1600 +//line sql.y:1616 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 213: + case 216: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1605 +//line sql.y:1621 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 214: + case 217: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1610 +//line sql.y:1626 { yyDollar[1].columnTypeOptionsUnion().Comment = NewStrLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 215: + case 218: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1615 +//line sql.y:1631 { yyDollar[1].columnTypeOptionsUnion().KeyOpt = yyDollar[2].colKeyOptUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 216: + case 219: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1620 +//line sql.y:1636 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 217: + case 220: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1625 +//line sql.y:1641 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 218: + case 221: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1632 +//line sql.y:1648 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 220: + case 223: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1639 +//line sql.y:1655 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_timestamp"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 221: + case 224: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1643 +//line sql.y:1659 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("localtime"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 222: + case 225: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1647 +//line sql.y:1663 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("localtimestamp"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 223: + case 226: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1651 +//line sql.y:1667 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_timestamp"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 224: + case 227: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1655 +//line sql.y:1671 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("now"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 225: + case 228: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1659 +//line sql.y:1675 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("sysdate"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 228: + case 231: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1669 +//line sql.y:1685 { yyLOCAL = &NullVal{} } yyVAL.union = yyLOCAL - case 230: + case 233: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1676 +//line sql.y:1692 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 231: + case 234: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1680 +//line sql.y:1696 { yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 232: + case 235: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1686 +//line sql.y:1702 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 233: + case 236: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1690 +//line sql.y:1706 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 234: + case 237: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1694 +//line sql.y:1710 { yyLOCAL = yyDollar[1].boolValUnion() } yyVAL.union = yyLOCAL - case 235: + case 238: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1698 +//line sql.y:1714 { yyLOCAL = NewHexLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 236: + case 239: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1702 +//line sql.y:1718 { yyLOCAL = NewHexNumLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 237: + case 240: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1706 +//line sql.y:1722 { yyLOCAL = NewBitLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 238: + case 241: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1710 +//line sql.y:1726 { yyLOCAL = NewBitLiteral("0b" + yyDollar[1].str) } yyVAL.union = yyLOCAL - case 239: + case 242: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1714 +//line sql.y:1730 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 240: + case 243: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1718 +//line sql.y:1734 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewBitLiteral("0b" + yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 241: + case 244: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1722 +//line sql.y:1738 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewHexNumLiteral(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 242: + case 245: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1726 +//line sql.y:1742 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewBitLiteral(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 243: + case 246: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1730 +//line sql.y:1746 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewHexLiteral(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 244: + case 247: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1734 +//line sql.y:1750 { arg := parseBindVariable(yylex, yyDollar[2].str[1:]) yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: arg} } yyVAL.union = yyLOCAL - case 245: + case 248: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1739 +//line sql.y:1755 { yyLOCAL = NewDateLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 246: + case 249: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1743 +//line sql.y:1759 { yyLOCAL = NewTimeLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 247: + case 250: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1747 +//line sql.y:1763 { yyLOCAL = NewTimestampLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 248: + case 251: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1753 +//line sql.y:1769 { yyVAL.str = Armscii8Str } - case 249: + case 252: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1757 +//line sql.y:1773 { yyVAL.str = ASCIIStr } - case 250: + case 253: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1761 +//line sql.y:1777 { yyVAL.str = Big5Str } - case 251: + case 254: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1765 +//line sql.y:1781 { yyVAL.str = UBinaryStr } - case 252: + case 255: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1769 +//line sql.y:1785 { yyVAL.str = Cp1250Str } - case 253: + case 256: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1773 +//line sql.y:1789 { yyVAL.str = Cp1251Str } - case 254: + case 257: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1777 +//line sql.y:1793 { yyVAL.str = Cp1256Str } - case 255: + case 258: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1781 +//line sql.y:1797 { yyVAL.str = Cp1257Str } - case 256: + case 259: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1785 +//line sql.y:1801 { yyVAL.str = Cp850Str } - case 257: + case 260: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1789 +//line sql.y:1805 { yyVAL.str = Cp852Str } - case 258: + case 261: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1793 +//line sql.y:1809 { yyVAL.str = Cp866Str } - case 259: + case 262: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1797 +//line sql.y:1813 { yyVAL.str = Cp932Str } - case 260: + case 263: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1801 +//line sql.y:1817 { yyVAL.str = Dec8Str } - case 261: + case 264: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1805 +//line sql.y:1821 { yyVAL.str = EucjpmsStr } - case 262: + case 265: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1809 +//line sql.y:1825 { yyVAL.str = EuckrStr } - case 263: + case 266: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1813 +//line sql.y:1829 { yyVAL.str = Gb18030Str } - case 264: + case 267: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1817 +//line sql.y:1833 { yyVAL.str = Gb2312Str } - case 265: + case 268: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1821 +//line sql.y:1837 { yyVAL.str = GbkStr } - case 266: + case 269: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1825 +//line sql.y:1841 { yyVAL.str = Geostd8Str } - case 267: + case 270: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1829 +//line sql.y:1845 { yyVAL.str = GreekStr } - case 268: + case 271: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1833 +//line sql.y:1849 { yyVAL.str = HebrewStr } - case 269: + case 272: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1837 +//line sql.y:1853 { yyVAL.str = Hp8Str } - case 270: + case 273: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1841 +//line sql.y:1857 { yyVAL.str = Keybcs2Str } - case 271: + case 274: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1845 +//line sql.y:1861 { yyVAL.str = Koi8rStr } - case 272: + case 275: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1849 +//line sql.y:1865 { yyVAL.str = Koi8uStr } - case 273: + case 276: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1853 +//line sql.y:1869 { yyVAL.str = Latin1Str } - case 274: + case 277: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1857 +//line sql.y:1873 { yyVAL.str = Latin2Str } - case 275: + case 278: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1861 +//line sql.y:1877 { yyVAL.str = Latin5Str } - case 276: + case 279: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1865 +//line sql.y:1881 { yyVAL.str = Latin7Str } - case 277: + case 280: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1869 +//line sql.y:1885 { yyVAL.str = MacceStr } - case 278: + case 281: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1873 +//line sql.y:1889 { yyVAL.str = MacromanStr } - case 279: + case 282: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1877 +//line sql.y:1893 { yyVAL.str = SjisStr } - case 280: + case 283: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1881 +//line sql.y:1897 { yyVAL.str = Swe7Str } - case 281: + case 284: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1885 +//line sql.y:1901 { yyVAL.str = Tis620Str } - case 282: + case 285: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1889 +//line sql.y:1905 { yyVAL.str = Ucs2Str } - case 283: + case 286: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1893 +//line sql.y:1909 { yyVAL.str = UjisStr } - case 284: + case 287: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1897 +//line sql.y:1913 { yyVAL.str = Utf16Str } - case 285: + case 288: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1901 +//line sql.y:1917 { yyVAL.str = Utf16leStr } - case 286: + case 289: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1905 +//line sql.y:1921 { yyVAL.str = Utf32Str } - case 287: + case 290: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1909 +//line sql.y:1925 { yyVAL.str = Utf8mb3Str } - case 288: + case 291: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1913 +//line sql.y:1929 { yyVAL.str = Utf8mb4Str } - case 289: + case 292: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1917 +//line sql.y:1933 { yyVAL.str = Utf8mb3Str } - case 292: + case 295: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1927 +//line sql.y:1943 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 293: + case 296: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1931 +//line sql.y:1947 { yyLOCAL = NewFloatLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 294: + case 297: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1935 +//line sql.y:1951 { yyLOCAL = NewDecimalLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 295: + case 298: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1941 +//line sql.y:1957 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 296: + case 299: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1945 +//line sql.y:1961 { yyLOCAL = AppendString(yyDollar[1].exprUnion(), yyDollar[2].str) } yyVAL.union = yyLOCAL - case 297: + case 300: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1951 +//line sql.y:1967 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 298: + case 301: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1955 +//line sql.y:1971 { yyLOCAL = &UnaryExpr{Operator: NStringOp, Expr: NewStrLiteral(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 299: + case 302: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1959 +//line sql.y:1975 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewStrLiteral(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 300: + case 303: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1965 +//line sql.y:1981 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 301: + case 304: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1969 +//line sql.y:1985 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 302: + case 305: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1975 +//line sql.y:1991 { yyLOCAL = ColKeyPrimary } yyVAL.union = yyLOCAL - case 303: + case 306: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1979 +//line sql.y:1995 { yyLOCAL = ColKeyUnique } yyVAL.union = yyLOCAL - case 304: + case 307: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1983 +//line sql.y:1999 { yyLOCAL = ColKeyUniqueKey } yyVAL.union = yyLOCAL - case 305: + case 308: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1987 +//line sql.y:2003 { yyLOCAL = ColKey } yyVAL.union = yyLOCAL - case 306: + case 309: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1993 +//line sql.y:2009 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Unsigned = yyDollar[2].booleanUnion() yyVAL.columnType.Zerofill = yyDollar[3].booleanUnion() } - case 310: + case 313: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2004 +//line sql.y:2020 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Length = yyDollar[2].intPtrUnion() } - case 311: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2009 - { - yyVAL.columnType = yyDollar[1].columnType - } - case 312: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2015 - { - yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} - } - case 313: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2019 - { - yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} - } case 314: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2023 +//line sql.y:2025 { - yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} + yyVAL.columnType = yyDollar[1].columnType } case 315: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2027 +//line sql.y:2031 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 316: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2031 +//line sql.y:2035 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 317: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2035 +//line sql.y:2039 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 318: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2039 +//line sql.y:2043 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 319: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2043 +//line sql.y:2047 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 320: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2047 +//line sql.y:2051 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 321: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2053 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:2055 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} - yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length - yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 322: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:2059 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} - yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length - yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 323: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2065 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:2063 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} - yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length - yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 324: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2071 +//line sql.y:2069 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12521,7 +12502,7 @@ yydefault: } case 325: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2077 +//line sql.y:2075 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12529,7 +12510,7 @@ yydefault: } case 326: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2083 +//line sql.y:2081 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12537,1763 +12518,1787 @@ yydefault: } case 327: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2089 +//line sql.y:2087 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 328: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2097 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:2093 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} + yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length + yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 329: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2101 +//line sql.y:2099 { - yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} + yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} + yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length + yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 330: yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:2105 { - yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} + yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} + yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length + yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 331: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2109 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:2113 { - yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} + yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 332: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2113 +//line sql.y:2117 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } case 333: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:2121 + { + yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} + } + case 334: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:2125 + { + yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} + } + case 335: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:2129 + { + yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} + } + case 336: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2119 +//line sql.y:2135 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion(), Charset: yyDollar[3].columnCharset} } - case 334: + case 337: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2123 +//line sql.y:2139 { // CHAR BYTE is an alias for binary. See also: // https://dev.mysql.com/doc/refman/8.0/en/string-type-syntax.html yyVAL.columnType = &ColumnType{Type: "binary", Length: yyDollar[2].intPtrUnion()} } - case 335: + case 338: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2129 +//line sql.y:2145 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion(), Charset: yyDollar[3].columnCharset} } - case 336: + case 339: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2133 +//line sql.y:2149 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } - case 337: + case 340: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2137 +//line sql.y:2153 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } - case 338: + case 341: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2141 +//line sql.y:2157 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } - case 339: + case 342: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2145 +//line sql.y:2161 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } - case 340: + case 343: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2149 +//line sql.y:2165 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } - case 341: + case 344: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2153 +//line sql.y:2169 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } - case 342: + case 345: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2157 +//line sql.y:2173 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 343: + case 346: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2161 +//line sql.y:2177 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 344: + case 347: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2165 +//line sql.y:2181 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 345: + case 348: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2169 +//line sql.y:2185 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 346: + case 349: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2173 +//line sql.y:2189 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 347: + case 350: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2177 +//line sql.y:2193 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].columnCharset} } - case 348: + case 351: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2181 +//line sql.y:2197 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } - case 349: + case 352: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2186 +//line sql.y:2202 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].columnCharset} } - case 350: + case 353: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2192 +//line sql.y:2208 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 351: + case 354: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2196 +//line sql.y:2212 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 352: + case 355: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2200 +//line sql.y:2216 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 353: + case 356: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2204 +//line sql.y:2220 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 354: + case 357: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2208 +//line sql.y:2224 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 355: + case 358: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2212 +//line sql.y:2228 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 356: + case 359: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2216 +//line sql.y:2232 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 357: + case 360: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2220 +//line sql.y:2236 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 358: + case 361: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2226 +//line sql.y:2242 { yyVAL.strs = make([]string, 0, 4) yyVAL.strs = append(yyVAL.strs, encodeSQLString(yyDollar[1].str)) } - case 359: + case 362: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2231 +//line sql.y:2247 { yyVAL.strs = append(yyDollar[1].strs, encodeSQLString(yyDollar[3].str)) } - case 360: + case 363: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *int -//line sql.y:2236 +//line sql.y:2252 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 361: + case 364: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *int -//line sql.y:2240 +//line sql.y:2256 { yyLOCAL = ptr.Of(convertStringToInt(yyDollar[2].str)) } yyVAL.union = yyLOCAL - case 362: + case 365: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2245 +//line sql.y:2261 { yyVAL.LengthScaleOption = LengthScaleOption{} } - case 363: + case 366: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2249 +//line sql.y:2265 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), Scale: ptr.Of(convertStringToInt(yyDollar[4].str)), } } - case 364: + case 367: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2258 +//line sql.y:2274 { yyVAL.LengthScaleOption = yyDollar[1].LengthScaleOption } - case 365: + case 368: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2262 +//line sql.y:2278 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), } } - case 366: + case 369: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2269 +//line sql.y:2285 { yyVAL.LengthScaleOption = LengthScaleOption{} } - case 367: + case 370: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2273 +//line sql.y:2289 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), } } - case 368: + case 371: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2279 +//line sql.y:2295 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), Scale: ptr.Of(convertStringToInt(yyDollar[4].str)), } } - case 369: + case 372: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2287 +//line sql.y:2303 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 370: + case 373: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2291 +//line sql.y:2307 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 371: + case 374: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2295 +//line sql.y:2311 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 372: + case 375: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2300 +//line sql.y:2316 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 373: + case 376: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2304 +//line sql.y:2320 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 374: + case 377: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2309 +//line sql.y:2325 { yyVAL.columnCharset = ColumnCharset{} } - case 375: + case 378: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2313 +//line sql.y:2329 { yyVAL.columnCharset = ColumnCharset{Name: string(yyDollar[2].identifierCI.String()), Binary: yyDollar[3].booleanUnion()} } - case 376: + case 379: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2317 +//line sql.y:2333 { yyVAL.columnCharset = ColumnCharset{Name: encodeSQLString(yyDollar[2].str), Binary: yyDollar[3].booleanUnion()} } - case 377: + case 380: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2321 +//line sql.y:2337 { yyVAL.columnCharset = ColumnCharset{Name: string(yyDollar[2].str)} } - case 378: + case 381: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2325 +//line sql.y:2341 { // ASCII: Shorthand for CHARACTER SET latin1. yyVAL.columnCharset = ColumnCharset{Name: "latin1", Binary: yyDollar[2].booleanUnion()} } - case 379: + case 382: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2330 +//line sql.y:2346 { // UNICODE: Shorthand for CHARACTER SET ucs2. yyVAL.columnCharset = ColumnCharset{Name: "ucs2", Binary: yyDollar[2].booleanUnion()} } - case 380: + case 383: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2335 +//line sql.y:2351 { // BINARY: Shorthand for default CHARACTER SET but with binary collation yyVAL.columnCharset = ColumnCharset{Name: "", Binary: true} } - case 381: + case 384: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2340 +//line sql.y:2356 { // BINARY ASCII: Shorthand for CHARACTER SET latin1 with binary collation yyVAL.columnCharset = ColumnCharset{Name: "latin1", Binary: true} } - case 382: + case 385: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2345 +//line sql.y:2361 { // BINARY UNICODE: Shorthand for CHARACTER SET ucs2 with binary collation yyVAL.columnCharset = ColumnCharset{Name: "ucs2", Binary: true} } - case 383: + case 386: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2351 +//line sql.y:2367 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 384: + case 387: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2355 +//line sql.y:2371 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 385: + case 388: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2360 +//line sql.y:2376 { yyVAL.str = "" } - case 386: + case 389: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2364 +//line sql.y:2380 { yyVAL.str = string(yyDollar[2].identifierCI.String()) } - case 387: + case 390: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2368 +//line sql.y:2384 { yyVAL.str = encodeSQLString(yyDollar[2].str) } - case 388: + case 391: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexDefinition -//line sql.y:2374 +//line sql.y:2390 { yyLOCAL = &IndexDefinition{Info: yyDollar[1].indexInfoUnion(), Columns: yyDollar[3].indexColumnsUnion(), Options: yyDollar[5].indexOptionsUnion()} } yyVAL.union = yyLOCAL - case 389: + case 392: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2379 +//line sql.y:2395 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 390: + case 393: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2383 +//line sql.y:2399 { yyLOCAL = yyDollar[1].indexOptionsUnion() } yyVAL.union = yyLOCAL - case 391: + case 394: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2389 +//line sql.y:2405 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL - case 392: + case 395: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2393 +//line sql.y:2409 { yySLICE := (*[]*IndexOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexOptionUnion()) } - case 393: + case 396: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2399 +//line sql.y:2415 { yyLOCAL = yyDollar[1].indexOptionUnion() } yyVAL.union = yyLOCAL - case 394: + case 397: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2403 +//line sql.y:2419 { // should not be string yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 395: + case 398: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2408 +//line sql.y:2424 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 396: + case 399: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2412 +//line sql.y:2428 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 397: + case 400: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2416 +//line sql.y:2432 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 398: + case 401: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2420 +//line sql.y:2436 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str) + " " + string(yyDollar[2].str), String: yyDollar[3].identifierCI.String()} } yyVAL.union = yyLOCAL - case 399: + case 402: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2424 +//line sql.y:2440 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 400: + case 403: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2428 +//line sql.y:2444 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 401: + case 404: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2434 +//line sql.y:2450 { yyVAL.str = "" } - case 402: + case 405: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2438 +//line sql.y:2454 { yyVAL.str = string(yyDollar[1].str) } - case 403: + case 406: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2444 +//line sql.y:2460 { yyLOCAL = &IndexInfo{Type: IndexTypePrimary, ConstraintName: NewIdentifierCI(yyDollar[1].str), Name: NewIdentifierCI("PRIMARY")} } yyVAL.union = yyLOCAL - case 404: + case 407: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2448 +//line sql.y:2464 { yyLOCAL = &IndexInfo{Type: IndexTypeSpatial, Name: NewIdentifierCI(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 405: + case 408: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2452 +//line sql.y:2468 { yyLOCAL = &IndexInfo{Type: IndexTypeFullText, Name: NewIdentifierCI(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 406: + case 409: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2456 +//line sql.y:2472 { yyLOCAL = &IndexInfo{Type: IndexTypeUnique, ConstraintName: NewIdentifierCI(yyDollar[1].str), Name: NewIdentifierCI(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 407: + case 410: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2460 +//line sql.y:2476 { yyLOCAL = &IndexInfo{Type: IndexTypeDefault, Name: NewIdentifierCI(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 408: + case 411: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2465 +//line sql.y:2481 { yyVAL.str = "" } - case 409: + case 412: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2469 +//line sql.y:2485 { yyVAL.str = yyDollar[2].str } - case 410: + case 413: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2475 +//line sql.y:2491 { yyVAL.str = string(yyDollar[1].str) } - case 411: + case 414: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2479 +//line sql.y:2495 { yyVAL.str = string(yyDollar[1].str) } - case 412: + case 415: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2483 +//line sql.y:2499 { yyVAL.str = string(yyDollar[1].str) } - case 413: + case 416: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2489 +//line sql.y:2505 { yyVAL.str = string(yyDollar[1].str) } - case 414: + case 417: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2493 +//line sql.y:2509 { yyVAL.str = string(yyDollar[1].str) } - case 415: + case 418: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2498 +//line sql.y:2514 { yyVAL.str = "" } - case 416: + case 419: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2502 +//line sql.y:2518 { yyVAL.str = yyDollar[1].str } - case 417: + case 420: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2508 +//line sql.y:2524 { yyVAL.str = string(yyDollar[1].str) } - case 418: + case 421: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2512 +//line sql.y:2528 { yyVAL.str = string(yyDollar[1].str) } - case 419: + case 422: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2517 +//line sql.y:2533 { yyVAL.str = "" } - case 420: + case 423: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2521 +//line sql.y:2537 { yyVAL.str = string(yyDollar[1].identifierCI.String()) } - case 421: + case 424: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexColumn -//line sql.y:2527 +//line sql.y:2543 { yyLOCAL = []*IndexColumn{yyDollar[1].indexColumnUnion()} } yyVAL.union = yyLOCAL - case 422: + case 425: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2531 +//line sql.y:2547 { yySLICE := (*[]*IndexColumn)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].indexColumnUnion()) } - case 423: + case 426: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexColumn -//line sql.y:2537 +//line sql.y:2553 { yyLOCAL = &IndexColumn{Column: yyDollar[1].identifierCI, Length: yyDollar[2].intPtrUnion(), Direction: yyDollar[3].orderDirectionUnion()} } yyVAL.union = yyLOCAL - case 424: + case 427: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexColumn -//line sql.y:2541 +//line sql.y:2557 { yyLOCAL = &IndexColumn{Expression: yyDollar[2].exprUnion(), Direction: yyDollar[4].orderDirectionUnion()} } yyVAL.union = yyLOCAL - case 425: + case 428: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2547 +//line sql.y:2563 { yyLOCAL = &ConstraintDefinition{Name: yyDollar[2].identifierCI, Details: yyDollar[3].constraintInfoUnion()} } yyVAL.union = yyLOCAL - case 426: + case 429: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2551 +//line sql.y:2567 { yyLOCAL = &ConstraintDefinition{Details: yyDollar[1].constraintInfoUnion()} } yyVAL.union = yyLOCAL - case 427: + case 430: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2557 +//line sql.y:2573 { yyLOCAL = &ConstraintDefinition{Name: yyDollar[2].identifierCI, Details: yyDollar[3].constraintInfoUnion()} } yyVAL.union = yyLOCAL - case 428: + case 431: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2561 +//line sql.y:2577 { yyLOCAL = &ConstraintDefinition{Details: yyDollar[1].constraintInfoUnion()} } yyVAL.union = yyLOCAL - case 429: + case 432: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL ConstraintInfo -//line sql.y:2567 +//line sql.y:2583 { yyLOCAL = &ForeignKeyDefinition{IndexName: NewIdentifierCI(yyDollar[3].str), Source: yyDollar[5].columnsUnion(), ReferenceDefinition: yyDollar[7].referenceDefinitionUnion()} } yyVAL.union = yyLOCAL - case 430: + case 433: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2573 +//line sql.y:2589 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion()} } yyVAL.union = yyLOCAL - case 431: + case 434: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2577 +//line sql.y:2593 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnDelete: yyDollar[7].referenceActionUnion()} } yyVAL.union = yyLOCAL - case 432: + case 435: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2581 +//line sql.y:2597 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnUpdate: yyDollar[7].referenceActionUnion()} } yyVAL.union = yyLOCAL - case 433: + case 436: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2585 +//line sql.y:2601 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnDelete: yyDollar[7].referenceActionUnion(), OnUpdate: yyDollar[8].referenceActionUnion()} } yyVAL.union = yyLOCAL - case 434: + case 437: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2589 +//line sql.y:2605 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnUpdate: yyDollar[7].referenceActionUnion(), OnDelete: yyDollar[8].referenceActionUnion()} } yyVAL.union = yyLOCAL - case 435: + case 438: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2594 +//line sql.y:2610 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 436: + case 439: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2598 +//line sql.y:2614 { yyLOCAL = yyDollar[1].referenceDefinitionUnion() } yyVAL.union = yyLOCAL - case 437: + case 440: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL ConstraintInfo -//line sql.y:2604 +//line sql.y:2620 { yyLOCAL = &CheckConstraintDefinition{Expr: yyDollar[3].exprUnion(), Enforced: yyDollar[5].booleanUnion()} } yyVAL.union = yyLOCAL - case 438: + case 441: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2610 +//line sql.y:2626 { yyLOCAL = yyDollar[2].matchActionUnion() } yyVAL.union = yyLOCAL - case 439: + case 442: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2616 +//line sql.y:2632 { yyLOCAL = Full } yyVAL.union = yyLOCAL - case 440: + case 443: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2620 +//line sql.y:2636 { yyLOCAL = Partial } yyVAL.union = yyLOCAL - case 441: + case 444: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2624 +//line sql.y:2640 { yyLOCAL = Simple } yyVAL.union = yyLOCAL - case 442: + case 445: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2629 +//line sql.y:2645 { yyLOCAL = DefaultMatch } yyVAL.union = yyLOCAL - case 443: + case 446: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2633 +//line sql.y:2649 { yyLOCAL = yyDollar[1].matchActionUnion() } yyVAL.union = yyLOCAL - case 444: + case 447: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2639 +//line sql.y:2655 { yyLOCAL = yyDollar[3].referenceActionUnion() } yyVAL.union = yyLOCAL - case 445: + case 448: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2645 +//line sql.y:2661 { yyLOCAL = yyDollar[3].referenceActionUnion() } yyVAL.union = yyLOCAL - case 446: + case 449: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2651 +//line sql.y:2667 { yyLOCAL = Restrict } yyVAL.union = yyLOCAL - case 447: + case 450: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2655 +//line sql.y:2671 { yyLOCAL = Cascade } yyVAL.union = yyLOCAL - case 448: + case 451: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2659 +//line sql.y:2675 { yyLOCAL = NoAction } yyVAL.union = yyLOCAL - case 449: + case 452: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2663 +//line sql.y:2679 { yyLOCAL = SetDefault } yyVAL.union = yyLOCAL - case 450: + case 453: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2667 +//line sql.y:2683 { yyLOCAL = SetNull } yyVAL.union = yyLOCAL - case 451: + case 454: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2672 +//line sql.y:2688 { yyVAL.str = "" } - case 452: + case 455: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2676 +//line sql.y:2692 { yyVAL.str = string(yyDollar[1].str) } - case 453: + case 456: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2680 +//line sql.y:2696 { yyVAL.str = string(yyDollar[1].str) } - case 454: + case 457: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2686 +//line sql.y:2702 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 455: + case 458: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:2690 +//line sql.y:2706 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 456: + case 459: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2695 +//line sql.y:2711 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 457: + case 460: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2699 +//line sql.y:2715 { yyLOCAL = yyDollar[1].booleanUnion() } yyVAL.union = yyLOCAL - case 458: + case 461: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2704 +//line sql.y:2720 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 459: + case 462: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2708 +//line sql.y:2724 { yyLOCAL = yyDollar[1].tableOptionsUnion() } yyVAL.union = yyLOCAL - case 460: + case 463: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2714 +//line sql.y:2730 { yyLOCAL = TableOptions{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL - case 461: + case 464: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2718 +//line sql.y:2734 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableOptionUnion()) } - case 462: + case 465: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2722 +//line sql.y:2738 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].tableOptionUnion()) } - case 463: + case 466: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2728 +//line sql.y:2744 { yyLOCAL = TableOptions{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL - case 464: + case 467: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2732 +//line sql.y:2748 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].tableOptionUnion()) } - case 465: + case 468: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2738 +//line sql.y:2754 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 466: + case 469: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2742 +//line sql.y:2758 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 467: + case 470: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2746 +//line sql.y:2762 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 468: + case 471: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2750 +//line sql.y:2766 { yyLOCAL = &TableOption{Name: (string(yyDollar[2].str)), String: yyDollar[4].str, CaseSensitive: true} } yyVAL.union = yyLOCAL - case 469: + case 472: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2754 +//line sql.y:2770 { yyLOCAL = &TableOption{Name: string(yyDollar[2].str), String: yyDollar[4].str, CaseSensitive: true} } yyVAL.union = yyLOCAL - case 470: + case 473: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2758 +//line sql.y:2774 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 471: + case 474: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2762 +//line sql.y:2778 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 472: + case 475: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2766 +//line sql.y:2782 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 473: + case 476: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2770 +//line sql.y:2786 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 474: + case 477: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2774 +//line sql.y:2790 { yyLOCAL = &TableOption{Name: (string(yyDollar[1].str) + " " + string(yyDollar[2].str)), Value: NewStrLiteral(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 475: + case 478: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2778 +//line sql.y:2794 { yyLOCAL = &TableOption{Name: (string(yyDollar[1].str) + " " + string(yyDollar[2].str)), Value: NewStrLiteral(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 476: + case 479: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2782 +//line sql.y:2798 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 477: + case 480: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2786 +//line sql.y:2802 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 478: + case 481: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2790 +//line sql.y:2806 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: yyDollar[3].identifierCS.String(), CaseSensitive: true} } yyVAL.union = yyLOCAL - case 479: + case 482: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2794 +//line sql.y:2810 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 480: + case 483: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2798 +//line sql.y:2814 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 481: + case 484: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2802 +//line sql.y:2818 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 482: + case 485: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2806 +//line sql.y:2822 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 483: + case 486: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2810 +//line sql.y:2826 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 484: + case 487: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2814 +//line sql.y:2830 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 485: + case 488: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2818 +//line sql.y:2834 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 486: + case 489: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2822 +//line sql.y:2838 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 487: + case 490: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2826 +//line sql.y:2842 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 488: + case 491: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2830 +//line sql.y:2846 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 489: + case 492: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2834 +//line sql.y:2850 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 490: + case 493: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2838 +//line sql.y:2854 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 491: + case 494: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2842 +//line sql.y:2858 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 492: + case 495: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2846 +//line sql.y:2862 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 493: + case 496: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2850 +//line sql.y:2866 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 494: + case 497: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2854 +//line sql.y:2870 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: (yyDollar[3].identifierCI.String() + yyDollar[4].str), CaseSensitive: true} } yyVAL.union = yyLOCAL - case 495: + case 498: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2858 +//line sql.y:2874 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Tables: yyDollar[4].tableNamesUnion()} } yyVAL.union = yyLOCAL - case 496: + case 499: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2863 +//line sql.y:2879 { yyVAL.str = "" } - case 497: + case 500: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2867 +//line sql.y:2883 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 498: + case 501: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2871 +//line sql.y:2887 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 508: + case 511: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2890 +//line sql.y:2906 { yyVAL.str = String(TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}) } - case 509: + case 512: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2894 +//line sql.y:2910 { yyVAL.str = yyDollar[1].identifierCI.String() } - case 510: + case 513: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2898 +//line sql.y:2914 { yyVAL.str = encodeSQLString(yyDollar[1].str) } - case 511: + case 514: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2902 +//line sql.y:2918 { yyVAL.str = string(yyDollar[1].str) } - case 512: + case 515: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2907 +//line sql.y:2923 { yyVAL.str = "" } - case 514: + case 517: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2913 +//line sql.y:2929 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 515: + case 518: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2917 +//line sql.y:2933 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 516: + case 519: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColName -//line sql.y:2922 +//line sql.y:2938 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 517: + case 520: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColName -//line sql.y:2926 +//line sql.y:2942 { yyLOCAL = yyDollar[2].colNameUnion() } yyVAL.union = yyLOCAL - case 518: + case 521: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2931 +//line sql.y:2947 { yyVAL.str = "" } - case 519: + case 522: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2935 +//line sql.y:2951 { yyVAL.str = string(yyDollar[2].str) } - case 520: + case 523: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Literal -//line sql.y:2940 +//line sql.y:2956 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 521: + case 524: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2944 +//line sql.y:2960 { yyLOCAL = NewIntLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 522: + case 525: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2948 +//line sql.y:2964 { yyLOCAL = NewDecimalLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 523: + case 526: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2953 +//line sql.y:2969 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 524: + case 527: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2957 +//line sql.y:2973 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL - case 525: + case 528: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2961 +//line sql.y:2977 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &OrderByOption{Cols: yyDollar[5].columnsUnion()}) } - case 526: + case 529: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2965 +//line sql.y:2981 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL - case 527: + case 530: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2969 +//line sql.y:2985 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionsUnion()...) } - case 528: + case 531: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2973 +//line sql.y:2989 { yyLOCAL = append(append(yyDollar[1].alterOptionsUnion(), yyDollar[3].alterOptionsUnion()...), &OrderByOption{Cols: yyDollar[7].columnsUnion()}) } yyVAL.union = yyLOCAL - case 529: + case 532: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2979 +//line sql.y:2995 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 530: + case 533: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2983 +//line sql.y:2999 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } - case 531: + case 534: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2987 +//line sql.y:3003 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } - case 532: + case 535: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2993 +//line sql.y:3009 { yyLOCAL = yyDollar[1].tableOptionsUnion() } yyVAL.union = yyLOCAL - case 533: + case 536: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2997 +//line sql.y:3013 { yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } yyVAL.union = yyLOCAL - case 534: + case 537: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3001 +//line sql.y:3017 { yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } yyVAL.union = yyLOCAL - case 535: + case 538: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3005 +//line sql.y:3021 { yyLOCAL = &AddIndexDefinition{IndexDefinition: yyDollar[2].indexDefinitionUnion()} } yyVAL.union = yyLOCAL - case 536: + case 539: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3009 +//line sql.y:3025 { yyLOCAL = &AddColumns{Columns: yyDollar[4].columnDefinitionsUnion()} } yyVAL.union = yyLOCAL - case 537: + case 540: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3013 +//line sql.y:3029 { yyLOCAL = &AddColumns{Columns: []*ColumnDefinition{yyDollar[3].columnDefinitionUnion()}, First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } yyVAL.union = yyLOCAL - case 538: + case 541: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3017 +//line sql.y:3033 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: true} } yyVAL.union = yyLOCAL - case 539: + case 542: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3021 +//line sql.y:3037 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[6].exprUnion(), DefaultLiteral: true} } yyVAL.union = yyLOCAL - case 540: + case 543: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3025 +//line sql.y:3041 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 541: + case 544: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3029 +//line sql.y:3045 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: ptr.Of(false)} } yyVAL.union = yyLOCAL - case 542: + case 545: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3033 +//line sql.y:3049 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: ptr.Of(true)} } yyVAL.union = yyLOCAL - case 543: + case 546: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3037 +//line sql.y:3053 { yyLOCAL = &AlterCheck{Name: yyDollar[3].identifierCI, Enforced: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 544: + case 547: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3041 +//line sql.y:3057 { yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: false} } yyVAL.union = yyLOCAL - case 545: + case 548: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3045 +//line sql.y:3061 { yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: true} } yyVAL.union = yyLOCAL - case 546: + case 549: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3049 +//line sql.y:3065 { yyLOCAL = &ChangeColumn{OldColumn: yyDollar[3].colNameUnion(), NewColDefinition: yyDollar[4].columnDefinitionUnion(), First: yyDollar[5].booleanUnion(), After: yyDollar[6].colNameUnion()} } yyVAL.union = yyLOCAL - case 547: + case 550: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3053 +//line sql.y:3069 { yyLOCAL = &ModifyColumn{NewColDefinition: yyDollar[3].columnDefinitionUnion(), First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } yyVAL.union = yyLOCAL - case 548: + case 551: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3057 +//line sql.y:3073 { yyLOCAL = &RenameColumn{OldName: yyDollar[3].colNameUnion(), NewName: yyDollar[5].colNameUnion()} } yyVAL.union = yyLOCAL - case 549: + case 552: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3061 +//line sql.y:3077 { yyLOCAL = &AlterCharset{CharacterSet: yyDollar[4].str, Collate: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 550: + case 553: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3065 +//line sql.y:3081 { yyLOCAL = &KeyState{Enable: false} } yyVAL.union = yyLOCAL - case 551: + case 554: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3069 +//line sql.y:3085 { yyLOCAL = &KeyState{Enable: true} } yyVAL.union = yyLOCAL - case 552: + case 555: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3073 +//line sql.y:3089 { yyLOCAL = &TablespaceOperation{Import: false} } yyVAL.union = yyLOCAL - case 553: + case 556: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3077 +//line sql.y:3093 { yyLOCAL = &TablespaceOperation{Import: true} } yyVAL.union = yyLOCAL - case 554: + case 557: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3081 +//line sql.y:3097 { yyLOCAL = &DropColumn{Name: yyDollar[3].colNameUnion()} } yyVAL.union = yyLOCAL - case 555: + case 558: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3085 +//line sql.y:3101 { yyLOCAL = &DropKey{Type: NormalKeyType, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 556: + case 559: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3089 +//line sql.y:3105 { yyLOCAL = &DropKey{Type: PrimaryKeyType} } yyVAL.union = yyLOCAL - case 557: + case 560: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3093 +//line sql.y:3109 { yyLOCAL = &DropKey{Type: ForeignKeyType, Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 558: + case 561: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3097 +//line sql.y:3113 { yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 559: + case 562: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3101 +//line sql.y:3117 { yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 560: + case 563: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3105 +//line sql.y:3121 { yyLOCAL = &Force{} } yyVAL.union = yyLOCAL - case 561: + case 564: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3109 +//line sql.y:3125 { yyLOCAL = &RenameTableName{Table: yyDollar[3].tableName} } yyVAL.union = yyLOCAL - case 562: + case 565: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3113 +//line sql.y:3129 { yyLOCAL = &RenameIndex{OldName: yyDollar[3].identifierCI, NewName: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 563: + case 566: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:3119 +//line sql.y:3135 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 564: + case 567: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3123 +//line sql.y:3139 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } - case 565: + case 568: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3129 +//line sql.y:3145 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } yyVAL.union = yyLOCAL - case 566: + case 569: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3133 +//line sql.y:3149 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } yyVAL.union = yyLOCAL - case 567: + case 570: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3137 +//line sql.y:3153 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } yyVAL.union = yyLOCAL - case 568: + case 571: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3141 +//line sql.y:3157 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } yyVAL.union = yyLOCAL - case 569: + case 572: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3145 +//line sql.y:3161 { yyLOCAL = &LockOption{Type: DefaultType} } yyVAL.union = yyLOCAL - case 570: + case 573: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3149 +//line sql.y:3165 { yyLOCAL = &LockOption{Type: NoneType} } yyVAL.union = yyLOCAL - case 571: + case 574: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3153 +//line sql.y:3169 { yyLOCAL = &LockOption{Type: SharedType} } yyVAL.union = yyLOCAL - case 572: + case 575: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3157 +//line sql.y:3173 { yyLOCAL = &LockOption{Type: ExclusiveType} } yyVAL.union = yyLOCAL - case 573: + case 576: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3161 +//line sql.y:3177 { yyLOCAL = &Validation{With: true} } yyVAL.union = yyLOCAL - case 574: + case 577: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3165 +//line sql.y:3181 { yyLOCAL = &Validation{With: false} } yyVAL.union = yyLOCAL - case 575: + case 578: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3171 +//line sql.y:3187 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -14301,10 +14306,10 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 576: + case 579: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3178 +//line sql.y:3194 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -14312,10 +14317,10 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 577: + case 580: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3185 +//line sql.y:3201 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -14323,28 +14328,28 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 578: + case 581: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3192 +//line sql.y:3208 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().PartitionSpec = yyDollar[2].partSpecUnion() yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 579: + case 582: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:3198 +//line sql.y:3214 { - yyLOCAL = &AlterView{ViewName: yyDollar[7].tableName, Comments: Comments(yyDollar[2].strs).Parsed(), Algorithm: yyDollar[3].str, Definer: yyDollar[4].definerUnion(), Security: yyDollar[5].str, Columns: yyDollar[8].columnsUnion(), Select: yyDollar[10].selStmtUnion(), CheckOption: yyDollar[11].str} + yyLOCAL = &AlterView{ViewName: yyDollar[7].tableName, Comments: Comments(yyDollar[2].strs).Parsed(), Algorithm: yyDollar[3].str, Definer: yyDollar[4].definerUnion(), Security: yyDollar[5].str, Columns: yyDollar[8].columnsUnion(), Select: yyDollar[10].tableStmtUnion(), CheckOption: yyDollar[11].str} } yyVAL.union = yyLOCAL - case 580: + case 583: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3208 +//line sql.y:3224 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -14352,10 +14357,10 @@ yydefault: yyLOCAL = yyDollar[1].alterDatabaseUnion() } yyVAL.union = yyLOCAL - case 581: + case 584: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3215 +//line sql.y:3231 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -14363,10 +14368,10 @@ yydefault: yyLOCAL = yyDollar[1].alterDatabaseUnion() } yyVAL.union = yyLOCAL - case 582: + case 585: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3222 +//line sql.y:3238 { yyLOCAL = &AlterVschema{ Action: CreateVindexDDLAction, @@ -14379,10 +14384,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 583: + case 586: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3234 +//line sql.y:3250 { yyLOCAL = &AlterVschema{ Action: DropVindexDDLAction, @@ -14393,26 +14398,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 584: + case 587: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3244 +//line sql.y:3260 { yyLOCAL = &AlterVschema{Action: AddVschemaTableDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 585: + case 588: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3248 +//line sql.y:3264 { yyLOCAL = &AlterVschema{Action: DropVschemaTableDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 586: + case 589: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL Statement -//line sql.y:3252 +//line sql.y:3268 { yyLOCAL = &AlterVschema{ Action: AddColVindexDDLAction, @@ -14426,10 +14431,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 587: + case 590: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3265 +//line sql.y:3281 { yyLOCAL = &AlterVschema{ Action: DropColVindexDDLAction, @@ -14440,26 +14445,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 588: + case 591: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3275 +//line sql.y:3291 { yyLOCAL = &AlterVschema{Action: AddSequenceDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 589: + case 592: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3279 +//line sql.y:3295 { yyLOCAL = &AlterVschema{Action: DropSequenceDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 590: + case 593: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:3283 +//line sql.y:3299 { yyLOCAL = &AlterVschema{ Action: AddAutoIncDDLAction, @@ -14471,10 +14476,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 591: + case 594: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3294 +//line sql.y:3310 { yyLOCAL = &AlterVschema{ Action: DropAutoIncDDLAction, @@ -14482,10 +14487,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 592: + case 595: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3301 +//line sql.y:3317 { yyLOCAL = &AlterMigration{ Type: RetryMigrationType, @@ -14493,10 +14498,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 593: + case 596: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3308 +//line sql.y:3324 { yyLOCAL = &AlterMigration{ Type: CleanupMigrationType, @@ -14504,20 +14509,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 594: + case 597: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3315 +//line sql.y:3331 { yyLOCAL = &AlterMigration{ Type: CleanupAllMigrationType, } } yyVAL.union = yyLOCAL - case 595: + case 598: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3321 +//line sql.y:3337 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -14525,10 +14530,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 596: + case 599: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3328 +//line sql.y:3344 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -14537,20 +14542,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 597: + case 600: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3336 +//line sql.y:3352 { yyLOCAL = &AlterMigration{ Type: LaunchAllMigrationType, } } yyVAL.union = yyLOCAL - case 598: + case 601: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3342 +//line sql.y:3358 { yyLOCAL = &AlterMigration{ Type: CompleteMigrationType, @@ -14558,20 +14563,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 599: + case 602: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3349 +//line sql.y:3365 { yyLOCAL = &AlterMigration{ Type: CompleteAllMigrationType, } } yyVAL.union = yyLOCAL - case 600: + case 603: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3355 +//line sql.y:3371 { yyLOCAL = &AlterMigration{ Type: CancelMigrationType, @@ -14579,20 +14584,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 601: + case 604: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3362 +//line sql.y:3378 { yyLOCAL = &AlterMigration{ Type: CancelAllMigrationType, } } yyVAL.union = yyLOCAL - case 602: + case 605: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3368 +//line sql.y:3384 { yyLOCAL = &AlterMigration{ Type: ThrottleMigrationType, @@ -14602,10 +14607,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 603: + case 606: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3377 +//line sql.y:3393 { yyLOCAL = &AlterMigration{ Type: ThrottleAllMigrationType, @@ -14614,10 +14619,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 604: + case 607: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3385 +//line sql.y:3401 { yyLOCAL = &AlterMigration{ Type: UnthrottleMigrationType, @@ -14625,20 +14630,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 605: + case 608: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3392 +//line sql.y:3408 { yyLOCAL = &AlterMigration{ Type: UnthrottleAllMigrationType, } } yyVAL.union = yyLOCAL - case 606: + case 609: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3398 +//line sql.y:3414 { yyLOCAL = &AlterMigration{ Type: ForceCutOverMigrationType, @@ -14646,20 +14651,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 607: + case 610: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3405 +//line sql.y:3421 { yyLOCAL = &AlterMigration{ Type: ForceCutOverAllMigrationType, } } yyVAL.union = yyLOCAL - case 608: + case 611: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3411 +//line sql.y:3427 { yyLOCAL = &AlterMigration{ Type: SetCutOverThresholdMigrationType, @@ -14668,18 +14673,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 609: + case 612: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3420 +//line sql.y:3436 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 610: + case 613: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3424 +//line sql.y:3440 { yyDollar[3].partitionOptionUnion().Partitions = yyDollar[4].integerUnion() yyDollar[3].partitionOptionUnion().SubPartition = yyDollar[5].subPartitionUnion() @@ -14687,10 +14692,10 @@ yydefault: yyLOCAL = yyDollar[3].partitionOptionUnion() } yyVAL.union = yyLOCAL - case 611: + case 614: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3433 +//line sql.y:3449 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -14699,10 +14704,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 612: + case 615: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3441 +//line sql.y:3457 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -14712,10 +14717,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 613: + case 616: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3450 +//line sql.y:3466 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -14723,10 +14728,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 614: + case 617: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3457 +//line sql.y:3473 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -14734,18 +14739,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 615: + case 618: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3465 +//line sql.y:3481 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 616: + case 619: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3469 +//line sql.y:3485 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -14755,10 +14760,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 617: + case 620: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3478 +//line sql.y:3494 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -14769,678 +14774,678 @@ yydefault: } } yyVAL.union = yyLOCAL - case 618: + case 621: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3489 +//line sql.y:3505 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 619: + case 622: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3493 +//line sql.y:3509 { yyLOCAL = yyDollar[2].partDefsUnion() } yyVAL.union = yyLOCAL - case 620: + case 623: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3498 +//line sql.y:3514 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 621: + case 624: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3502 +//line sql.y:3518 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 622: + case 625: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3507 +//line sql.y:3523 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 623: + case 626: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3511 +//line sql.y:3527 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 624: + case 627: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL TableExpr -//line sql.y:3517 +//line sql.y:3533 { yyLOCAL = &JSONTableExpr{Expr: yyDollar[3].exprUnion(), Filter: yyDollar[5].exprUnion(), Columns: yyDollar[6].jtColumnListUnion(), Alias: yyDollar[8].identifierCS} } yyVAL.union = yyLOCAL - case 625: + case 628: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3523 +//line sql.y:3539 { yyLOCAL = yyDollar[3].jtColumnListUnion() } yyVAL.union = yyLOCAL - case 626: + case 629: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3529 +//line sql.y:3545 { yyLOCAL = []*JtColumnDefinition{yyDollar[1].jtColumnDefinitionUnion()} } yyVAL.union = yyLOCAL - case 627: + case 630: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3533 +//line sql.y:3549 { yySLICE := (*[]*JtColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jtColumnDefinitionUnion()) } - case 628: + case 631: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3539 +//line sql.y:3555 { yyLOCAL = &JtColumnDefinition{JtOrdinal: &JtOrdinalColDef{Name: yyDollar[1].identifierCI}} } yyVAL.union = yyLOCAL - case 629: + case 632: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3543 +//line sql.y:3559 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 630: + case 633: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3549 +//line sql.y:3565 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 631: + case 634: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3555 +//line sql.y:3571 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 632: + case 635: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3561 +//line sql.y:3577 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 633: + case 636: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3567 +//line sql.y:3583 { jtNestedPath := &JtNestedPathColDef{Path: yyDollar[3].exprUnion(), Columns: yyDollar[4].jtColumnListUnion()} yyLOCAL = &JtColumnDefinition{JtNestedPath: jtNestedPath} } yyVAL.union = yyLOCAL - case 634: + case 637: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3573 +//line sql.y:3589 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 635: + case 638: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3577 +//line sql.y:3593 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 636: + case 639: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3581 +//line sql.y:3597 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 637: + case 640: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3585 +//line sql.y:3601 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 638: + case 641: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3591 +//line sql.y:3607 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } yyVAL.union = yyLOCAL - case 639: + case 642: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3597 +//line sql.y:3613 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } yyVAL.union = yyLOCAL - case 640: + case 643: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3603 +//line sql.y:3619 { yyLOCAL = &JtOnResponse{ResponseType: ErrorJSONType} } yyVAL.union = yyLOCAL - case 641: + case 644: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3607 +//line sql.y:3623 { yyLOCAL = &JtOnResponse{ResponseType: NullJSONType} } yyVAL.union = yyLOCAL - case 642: + case 645: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3611 +//line sql.y:3627 { yyLOCAL = &JtOnResponse{ResponseType: DefaultJSONType, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 643: + case 646: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3617 +//line sql.y:3633 { yyLOCAL = RangeType } yyVAL.union = yyLOCAL - case 644: + case 647: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3621 +//line sql.y:3637 { yyLOCAL = ListType } yyVAL.union = yyLOCAL - case 645: + case 648: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3626 +//line sql.y:3642 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 646: + case 649: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3630 +//line sql.y:3646 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 647: + case 650: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3635 +//line sql.y:3651 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 648: + case 651: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3639 +//line sql.y:3655 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 649: + case 652: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3645 +//line sql.y:3661 { yyLOCAL = &PartitionSpec{Action: AddAction, Definitions: []*PartitionDefinition{yyDollar[4].partDefUnion()}} } yyVAL.union = yyLOCAL - case 650: + case 653: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3649 +//line sql.y:3665 { yyLOCAL = &PartitionSpec{Action: DropAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 651: + case 654: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3653 +//line sql.y:3669 { yyLOCAL = &PartitionSpec{Action: ReorganizeAction, Names: yyDollar[3].partitionsUnion(), Definitions: yyDollar[6].partDefsUnion()} } yyVAL.union = yyLOCAL - case 652: + case 655: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3657 +//line sql.y:3673 { yyLOCAL = &PartitionSpec{Action: DiscardAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 653: + case 656: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3661 +//line sql.y:3677 { yyLOCAL = &PartitionSpec{Action: DiscardAction, IsAll: true} } yyVAL.union = yyLOCAL - case 654: + case 657: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3665 +//line sql.y:3681 { yyLOCAL = &PartitionSpec{Action: ImportAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 655: + case 658: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3669 +//line sql.y:3685 { yyLOCAL = &PartitionSpec{Action: ImportAction, IsAll: true} } yyVAL.union = yyLOCAL - case 656: + case 659: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3673 +//line sql.y:3689 { yyLOCAL = &PartitionSpec{Action: TruncateAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 657: + case 660: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3677 +//line sql.y:3693 { yyLOCAL = &PartitionSpec{Action: TruncateAction, IsAll: true} } yyVAL.union = yyLOCAL - case 658: + case 661: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3681 +//line sql.y:3697 { yyLOCAL = &PartitionSpec{Action: CoalesceAction, Number: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 659: + case 662: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3685 +//line sql.y:3701 { yyLOCAL = &PartitionSpec{Action: ExchangeAction, Names: Partitions{yyDollar[3].identifierCI}, TableName: yyDollar[6].tableName, WithoutValidation: yyDollar[7].booleanUnion()} } yyVAL.union = yyLOCAL - case 660: + case 663: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3689 +//line sql.y:3705 { yyLOCAL = &PartitionSpec{Action: AnalyzeAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 661: + case 664: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3693 +//line sql.y:3709 { yyLOCAL = &PartitionSpec{Action: AnalyzeAction, IsAll: true} } yyVAL.union = yyLOCAL - case 662: + case 665: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3697 +//line sql.y:3713 { yyLOCAL = &PartitionSpec{Action: CheckAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 663: + case 666: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3701 +//line sql.y:3717 { yyLOCAL = &PartitionSpec{Action: CheckAction, IsAll: true} } yyVAL.union = yyLOCAL - case 664: + case 667: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3705 +//line sql.y:3721 { yyLOCAL = &PartitionSpec{Action: OptimizeAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 665: + case 668: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3709 +//line sql.y:3725 { yyLOCAL = &PartitionSpec{Action: OptimizeAction, IsAll: true} } yyVAL.union = yyLOCAL - case 666: + case 669: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3713 +//line sql.y:3729 { yyLOCAL = &PartitionSpec{Action: RebuildAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 667: + case 670: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3717 +//line sql.y:3733 { yyLOCAL = &PartitionSpec{Action: RebuildAction, IsAll: true} } yyVAL.union = yyLOCAL - case 668: + case 671: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3721 +//line sql.y:3737 { yyLOCAL = &PartitionSpec{Action: RepairAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 669: + case 672: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3725 +//line sql.y:3741 { yyLOCAL = &PartitionSpec{Action: RepairAction, IsAll: true} } yyVAL.union = yyLOCAL - case 670: + case 673: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3729 +//line sql.y:3745 { yyLOCAL = &PartitionSpec{Action: UpgradeAction} } yyVAL.union = yyLOCAL - case 671: + case 674: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3734 +//line sql.y:3750 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 672: + case 675: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:3738 +//line sql.y:3754 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 673: + case 676: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:3742 +//line sql.y:3758 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 674: + case 677: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3748 +//line sql.y:3764 { yyLOCAL = []*PartitionDefinition{yyDollar[1].partDefUnion()} } yyVAL.union = yyLOCAL - case 675: + case 678: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3752 +//line sql.y:3768 { yySLICE := (*[]*PartitionDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].partDefUnion()) } - case 676: + case 679: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3758 +//line sql.y:3774 { yyVAL.partDefUnion().Options = yyDollar[2].partitionDefinitionOptionsUnion() } - case 677: + case 680: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3763 +//line sql.y:3779 { yyLOCAL = &PartitionDefinitionOptions{} } yyVAL.union = yyLOCAL - case 678: + case 681: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3767 +//line sql.y:3783 { yyDollar[1].partitionDefinitionOptionsUnion().ValueRange = yyDollar[2].partitionValueRangeUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 679: + case 682: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3772 +//line sql.y:3788 { yyDollar[1].partitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 680: + case 683: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3777 +//line sql.y:3793 { yyDollar[1].partitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 681: + case 684: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3782 +//line sql.y:3798 { yyDollar[1].partitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 682: + case 685: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3787 +//line sql.y:3803 { yyDollar[1].partitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 683: + case 686: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3792 +//line sql.y:3808 { yyDollar[1].partitionDefinitionOptionsUnion().MaxRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 684: + case 687: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3797 +//line sql.y:3813 { yyDollar[1].partitionDefinitionOptionsUnion().MinRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 685: + case 688: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3802 +//line sql.y:3818 { yyDollar[1].partitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 686: + case 689: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3807 +//line sql.y:3823 { yyDollar[1].partitionDefinitionOptionsUnion().SubPartitionDefinitions = yyDollar[2].subPartitionDefinitionsUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 687: + case 690: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3813 +//line sql.y:3829 { yyLOCAL = yyDollar[2].subPartitionDefinitionsUnion() } yyVAL.union = yyLOCAL - case 688: + case 691: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3819 +//line sql.y:3835 { yyLOCAL = SubPartitionDefinitions{yyDollar[1].subPartitionDefinitionUnion()} } yyVAL.union = yyLOCAL - case 689: + case 692: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3823 +//line sql.y:3839 { yySLICE := (*SubPartitionDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].subPartitionDefinitionUnion()) } - case 690: + case 693: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SubPartitionDefinition -//line sql.y:3829 +//line sql.y:3845 { yyLOCAL = &SubPartitionDefinition{Name: yyDollar[2].identifierCI, Options: yyDollar[3].subPartitionDefinitionOptionsUnion()} } yyVAL.union = yyLOCAL - case 691: + case 694: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3834 +//line sql.y:3850 { yyLOCAL = &SubPartitionDefinitionOptions{} } yyVAL.union = yyLOCAL - case 692: + case 695: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3838 +//line sql.y:3854 { yyDollar[1].subPartitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 693: + case 696: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3843 +//line sql.y:3859 { yyDollar[1].subPartitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 694: + case 697: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3848 +//line sql.y:3864 { yyDollar[1].subPartitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 695: + case 698: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3853 +//line sql.y:3869 { yyDollar[1].subPartitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 696: + case 699: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3858 +//line sql.y:3874 { yyDollar[1].subPartitionDefinitionOptionsUnion().MaxRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 697: + case 700: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3863 +//line sql.y:3879 { yyDollar[1].subPartitionDefinitionOptionsUnion().MinRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 698: + case 701: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3868 +//line sql.y:3884 { yyDollar[1].subPartitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 699: + case 702: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3875 +//line sql.y:3891 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -15448,10 +15453,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 700: + case 703: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3882 +//line sql.y:3898 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -15459,10 +15464,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 701: + case 704: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3889 +//line sql.y:3905 { yyLOCAL = &PartitionValueRange{ Type: InType, @@ -15470,131 +15475,131 @@ yydefault: } } yyVAL.union = yyLOCAL - case 702: + case 705: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3897 +//line sql.y:3913 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 703: + case 706: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3901 +//line sql.y:3917 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 704: + case 707: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionEngine -//line sql.y:3907 +//line sql.y:3923 { yyLOCAL = &PartitionEngine{Storage: yyDollar[1].booleanUnion(), Name: yyDollar[4].identifierCS.String()} } yyVAL.union = yyLOCAL - case 705: + case 708: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Literal -//line sql.y:3913 +//line sql.y:3929 { yyLOCAL = NewStrLiteral(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 706: + case 709: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3919 +//line sql.y:3935 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 707: + case 710: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3925 +//line sql.y:3941 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 708: + case 711: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3931 +//line sql.y:3947 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 709: + case 712: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3937 +//line sql.y:3953 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 710: + case 713: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3943 +//line sql.y:3959 { yyVAL.str = yyDollar[3].identifierCS.String() } - case 711: + case 714: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinition -//line sql.y:3949 +//line sql.y:3965 { yyLOCAL = &PartitionDefinition{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 712: + case 715: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3955 +//line sql.y:3971 { yyVAL.str = "" } - case 713: + case 716: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3959 +//line sql.y:3975 { yyVAL.str = "" } - case 714: + case 717: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3965 +//line sql.y:3981 { yyLOCAL = &RenameTable{TablePairs: yyDollar[3].renameTablePairsUnion()} } yyVAL.union = yyLOCAL - case 715: + case 718: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*RenameTablePair -//line sql.y:3971 +//line sql.y:3987 { yyLOCAL = []*RenameTablePair{{FromTable: yyDollar[1].tableName, ToTable: yyDollar[3].tableName}} } yyVAL.union = yyLOCAL - case 716: + case 719: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3975 +//line sql.y:3991 { yySLICE := (*[]*RenameTablePair)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &RenameTablePair{FromTable: yyDollar[3].tableName, ToTable: yyDollar[5].tableName}) } - case 717: + case 720: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3981 +//line sql.y:3997 { yyLOCAL = &DropTable{FromTables: yyDollar[6].tableNamesUnion(), IfExists: yyDollar[5].booleanUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), Temp: yyDollar[3].booleanUnion()} } yyVAL.union = yyLOCAL - case 718: + case 721: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3985 +//line sql.y:4001 { // Change this to an alter statement if yyDollar[4].identifierCI.Lowered() == "primary" { @@ -15604,1377 +15609,1377 @@ yydefault: } } yyVAL.union = yyLOCAL - case 719: + case 722: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3994 +//line sql.y:4010 { yyLOCAL = &DropView{FromTables: yyDollar[5].tableNamesUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), IfExists: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 720: + case 723: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3998 +//line sql.y:4014 { yyLOCAL = &DropDatabase{Comments: Comments(yyDollar[2].strs).Parsed(), DBName: yyDollar[5].identifierCS, IfExists: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 721: + case 724: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4004 +//line sql.y:4020 { yyLOCAL = &TruncateTable{Table: yyDollar[3].tableName} } yyVAL.union = yyLOCAL - case 722: + case 725: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4008 +//line sql.y:4024 { yyLOCAL = &TruncateTable{Table: yyDollar[2].tableName} } yyVAL.union = yyLOCAL - case 723: + case 726: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4014 +//line sql.y:4030 { yyLOCAL = &Analyze{IsLocal: yyDollar[2].booleanUnion(), Table: yyDollar[4].tableName} } yyVAL.union = yyLOCAL - case 724: + case 727: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4020 +//line sql.y:4036 { yyLOCAL = &PurgeBinaryLogs{To: string(yyDollar[5].str)} } yyVAL.union = yyLOCAL - case 725: + case 728: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4024 +//line sql.y:4040 { yyLOCAL = &PurgeBinaryLogs{Before: string(yyDollar[5].str)} } yyVAL.union = yyLOCAL - case 726: + case 729: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4030 +//line sql.y:4046 { yyLOCAL = &Show{&ShowBasic{Command: Charset, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 727: + case 730: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4034 +//line sql.y:4050 { yyLOCAL = &Show{&ShowBasic{Command: Collation, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 728: + case 731: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4038 +//line sql.y:4054 { yyLOCAL = &Show{&ShowBasic{Full: yyDollar[2].booleanUnion(), Command: Column, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 729: + case 732: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4042 +//line sql.y:4058 { yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 730: + case 733: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4046 +//line sql.y:4062 { yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 731: + case 734: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4050 +//line sql.y:4066 { yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 732: + case 735: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4054 +//line sql.y:4070 { yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 733: + case 736: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4058 +//line sql.y:4074 { yyLOCAL = &Show{&ShowBasic{Command: Function, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 734: + case 737: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4062 +//line sql.y:4078 { yyLOCAL = &Show{&ShowBasic{Command: Index, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 735: + case 738: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4066 +//line sql.y:4082 { yyLOCAL = &Show{&ShowBasic{Command: OpenTable, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 736: + case 739: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4070 +//line sql.y:4086 { yyLOCAL = &Show{&ShowBasic{Command: Privilege}} } yyVAL.union = yyLOCAL - case 737: + case 740: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4074 +//line sql.y:4090 { yyLOCAL = &Show{&ShowBasic{Command: Procedure, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 738: + case 741: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4078 +//line sql.y:4094 { yyLOCAL = &Show{&ShowBasic{Command: StatusSession, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 739: + case 742: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4082 +//line sql.y:4098 { yyLOCAL = &Show{&ShowBasic{Command: StatusGlobal, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 740: + case 743: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4086 +//line sql.y:4102 { yyLOCAL = &Show{&ShowBasic{Command: VariableSession, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 741: + case 744: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4090 +//line sql.y:4106 { yyLOCAL = &Show{&ShowBasic{Command: VariableGlobal, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 742: + case 745: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4094 +//line sql.y:4110 { yyLOCAL = &Show{&ShowBasic{Command: TableStatus, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 743: + case 746: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4098 +//line sql.y:4114 { yyLOCAL = &Show{&ShowBasic{Command: Table, Full: yyDollar[2].booleanUnion(), DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 744: + case 747: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4102 +//line sql.y:4118 { yyLOCAL = &Show{&ShowBasic{Command: Trigger, DbName: yyDollar[3].identifierCS, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 745: + case 748: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4106 +//line sql.y:4122 { yyLOCAL = &Show{&ShowCreate{Command: CreateDb, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 746: + case 749: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4110 +//line sql.y:4126 { yyLOCAL = &Show{&ShowCreate{Command: CreateE, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 747: + case 750: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4114 +//line sql.y:4130 { yyLOCAL = &Show{&ShowCreate{Command: CreateF, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 748: + case 751: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4118 +//line sql.y:4134 { yyLOCAL = &Show{&ShowCreate{Command: CreateProc, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 749: + case 752: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4122 +//line sql.y:4138 { yyLOCAL = &Show{&ShowCreate{Command: CreateTbl, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 750: + case 753: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4126 +//line sql.y:4142 { yyLOCAL = &Show{&ShowCreate{Command: CreateTr, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 751: + case 754: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4130 +//line sql.y:4146 { yyLOCAL = &Show{&ShowCreate{Command: CreateV, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 752: + case 755: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4134 +//line sql.y:4150 { yyLOCAL = &Show{&ShowBasic{Command: Engines}} } yyVAL.union = yyLOCAL - case 753: + case 756: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4138 +//line sql.y:4154 { yyLOCAL = &Show{&ShowBasic{Command: Plugins}} } yyVAL.union = yyLOCAL - case 754: + case 757: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4142 +//line sql.y:4158 { yyLOCAL = &Show{&ShowBasic{Command: GtidExecGlobal, DbName: yyDollar[4].identifierCS}} } yyVAL.union = yyLOCAL - case 755: + case 758: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4146 +//line sql.y:4162 { yyLOCAL = &Show{&ShowBasic{Command: VGtidExecGlobal, DbName: yyDollar[4].identifierCS}} } yyVAL.union = yyLOCAL - case 756: + case 759: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4150 +//line sql.y:4166 { yyLOCAL = &Show{&ShowBasic{Command: VitessVariables, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 757: + case 760: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4154 +//line sql.y:4170 { yyLOCAL = &Show{&ShowBasic{Command: VitessMigrations, Filter: yyDollar[4].showFilterUnion(), DbName: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL - case 758: + case 761: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4158 +//line sql.y:4174 { yyLOCAL = &ShowMigrationLogs{UUID: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 759: + case 762: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4162 +//line sql.y:4178 { yyLOCAL = &ShowThrottledApps{} } yyVAL.union = yyLOCAL - case 760: + case 763: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4166 +//line sql.y:4182 { yyLOCAL = &Show{&ShowBasic{Command: VitessReplicationStatus, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 761: + case 764: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4170 +//line sql.y:4186 { yyLOCAL = &ShowThrottlerStatus{} } yyVAL.union = yyLOCAL - case 762: + case 765: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4174 +//line sql.y:4190 { yyLOCAL = &Show{&ShowBasic{Command: VschemaTables}} } yyVAL.union = yyLOCAL - case 763: + case 766: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4178 +//line sql.y:4194 { yyLOCAL = &Show{&ShowBasic{Command: VschemaKeyspaces}} } yyVAL.union = yyLOCAL - case 764: + case 767: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4182 +//line sql.y:4198 { yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes}} } yyVAL.union = yyLOCAL - case 765: + case 768: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4186 +//line sql.y:4202 { yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes, Tbl: yyDollar[5].tableName}} } yyVAL.union = yyLOCAL - case 766: + case 769: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4190 +//line sql.y:4206 { yyLOCAL = &Show{&ShowBasic{Command: Warnings}} } yyVAL.union = yyLOCAL - case 767: + case 770: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4194 +//line sql.y:4210 { yyLOCAL = &Show{&ShowBasic{Command: VitessShards, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 768: + case 771: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4198 +//line sql.y:4214 { yyLOCAL = &Show{&ShowBasic{Command: VitessTablets, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 769: + case 772: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4202 +//line sql.y:4218 { yyLOCAL = &Show{&ShowBasic{Command: VitessTarget}} } yyVAL.union = yyLOCAL - case 770: + case 773: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4209 +//line sql.y:4225 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].identifierCI.String())}} } yyVAL.union = yyLOCAL - case 771: + case 774: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4213 +//line sql.y:4229 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL - case 772: + case 775: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4217 +//line sql.y:4233 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String()}} } yyVAL.union = yyLOCAL - case 773: + case 776: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4221 +//line sql.y:4237 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL - case 774: + case 777: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4225 +//line sql.y:4241 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} } yyVAL.union = yyLOCAL - case 775: + case 778: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4229 +//line sql.y:4245 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } yyVAL.union = yyLOCAL - case 776: + case 779: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4233 +//line sql.y:4249 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } yyVAL.union = yyLOCAL - case 777: + case 780: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4237 +//line sql.y:4253 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL - case 778: + case 781: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4241 +//line sql.y:4257 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} } yyVAL.union = yyLOCAL - case 779: + case 782: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4245 +//line sql.y:4261 { yyLOCAL = &Show{&ShowTransactionStatus{TransactionID: string(yyDollar[5].str)}} } yyVAL.union = yyLOCAL - case 780: + case 783: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4249 +//line sql.y:4265 { yyLOCAL = &Show{&ShowTransactionStatus{}} } yyVAL.union = yyLOCAL - case 781: + case 784: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4253 +//line sql.y:4269 { yyLOCAL = &Show{&ShowTransactionStatus{Keyspace: yyDollar[5].identifierCS.String()}} } yyVAL.union = yyLOCAL - case 782: + case 785: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4258 +//line sql.y:4274 { } - case 783: + case 786: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4260 +//line sql.y:4276 { } - case 784: + case 787: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4264 +//line sql.y:4280 { yyVAL.str = "" } - case 785: + case 788: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4268 +//line sql.y:4284 { yyVAL.str = "extended " } - case 786: + case 789: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4274 +//line sql.y:4290 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 787: + case 790: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4278 +//line sql.y:4294 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 788: + case 791: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4284 +//line sql.y:4300 { yyVAL.str = string(yyDollar[1].str) } - case 789: + case 792: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4288 +//line sql.y:4304 { yyVAL.str = string(yyDollar[1].str) } - case 790: + case 793: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4294 +//line sql.y:4310 { yyVAL.identifierCS = NewIdentifierCS("") } - case 791: + case 794: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4298 +//line sql.y:4314 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 792: + case 795: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4302 +//line sql.y:4318 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 793: + case 796: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4308 +//line sql.y:4324 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 794: + case 797: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4312 +//line sql.y:4328 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 795: + case 798: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4316 +//line sql.y:4332 { yyLOCAL = &ShowFilter{Filter: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 796: + case 799: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4322 +//line sql.y:4338 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 797: + case 800: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4326 +//line sql.y:4342 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 798: + case 801: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4332 +//line sql.y:4348 { yyVAL.empty = struct{}{} } - case 799: + case 802: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4336 +//line sql.y:4352 { yyVAL.empty = struct{}{} } - case 800: + case 803: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4340 +//line sql.y:4356 { yyVAL.empty = struct{}{} } - case 801: + case 804: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4346 +//line sql.y:4362 { yyVAL.str = string(yyDollar[1].str) } - case 802: + case 805: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4350 +//line sql.y:4366 { yyVAL.str = string(yyDollar[1].str) } - case 803: + case 806: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4356 +//line sql.y:4372 { yyLOCAL = &Use{DBName: yyDollar[2].identifierCS} } yyVAL.union = yyLOCAL - case 804: + case 807: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4360 +//line sql.y:4376 { yyLOCAL = &Use{DBName: IdentifierCS{v: ""}} } yyVAL.union = yyLOCAL - case 805: + case 808: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4364 +//line sql.y:4380 { yyLOCAL = &Use{DBName: NewIdentifierCS(yyDollar[2].identifierCS.String() + "@" + string(yyDollar[3].str))} } yyVAL.union = yyLOCAL - case 806: + case 809: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4371 +//line sql.y:4387 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 807: + case 810: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4375 +//line sql.y:4391 { yyVAL.identifierCS = NewIdentifierCS("@" + string(yyDollar[1].str)) } - case 808: + case 811: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4379 +//line sql.y:4395 { yyVAL.identifierCS = NewIdentifierCS("@@" + string(yyDollar[1].str)) } - case 809: + case 812: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4383 +//line sql.y:4399 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 810: + case 813: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4390 +//line sql.y:4406 { yyLOCAL = &Begin{} } yyVAL.union = yyLOCAL - case 811: + case 814: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4394 +//line sql.y:4410 { yyLOCAL = &Begin{TxAccessModes: yyDollar[3].txAccessModesUnion()} } yyVAL.union = yyLOCAL - case 812: + case 815: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4399 +//line sql.y:4415 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 813: + case 816: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4403 +//line sql.y:4419 { yyLOCAL = yyDollar[1].txAccessModesUnion() } yyVAL.union = yyLOCAL - case 814: + case 817: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4409 +//line sql.y:4425 { yyLOCAL = []TxAccessMode{yyDollar[1].txAccessModeUnion()} } yyVAL.union = yyLOCAL - case 815: + case 818: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4413 +//line sql.y:4429 { yySLICE := (*[]TxAccessMode)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].txAccessModeUnion()) } - case 816: + case 819: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4419 +//line sql.y:4435 { yyLOCAL = WithConsistentSnapshot } yyVAL.union = yyLOCAL - case 817: + case 820: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4423 +//line sql.y:4439 { yyLOCAL = ReadWrite } yyVAL.union = yyLOCAL - case 818: + case 821: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4427 +//line sql.y:4443 { yyLOCAL = ReadOnly } yyVAL.union = yyLOCAL - case 819: + case 822: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4434 +//line sql.y:4450 { yyLOCAL = &Commit{} } yyVAL.union = yyLOCAL - case 820: + case 823: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4440 +//line sql.y:4456 { yyLOCAL = &Rollback{} } yyVAL.union = yyLOCAL - case 821: + case 824: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4444 +//line sql.y:4460 { yyLOCAL = &SRollback{Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 822: + case 825: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4449 +//line sql.y:4465 { yyVAL.empty = struct{}{} } - case 823: + case 826: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4451 +//line sql.y:4467 { yyVAL.empty = struct{}{} } - case 824: + case 827: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4454 +//line sql.y:4470 { yyVAL.empty = struct{}{} } - case 825: + case 828: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4456 +//line sql.y:4472 { yyVAL.empty = struct{}{} } - case 826: + case 829: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4460 +//line sql.y:4476 { yyLOCAL = &Savepoint{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 827: + case 830: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4466 +//line sql.y:4482 { yyLOCAL = &Release{Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 828: + case 831: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4471 +//line sql.y:4487 { yyLOCAL = EmptyType } yyVAL.union = yyLOCAL - case 829: + case 832: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4475 +//line sql.y:4491 { yyLOCAL = JSONType } yyVAL.union = yyLOCAL - case 830: + case 833: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4479 +//line sql.y:4495 { yyLOCAL = TreeType } yyVAL.union = yyLOCAL - case 831: + case 834: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4483 +//line sql.y:4499 { yyLOCAL = TraditionalType } yyVAL.union = yyLOCAL - case 832: + case 835: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4487 +//line sql.y:4503 { yyLOCAL = AnalyzeType } yyVAL.union = yyLOCAL - case 833: + case 836: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4492 +//line sql.y:4508 { yyLOCAL = PlanVExplainType } yyVAL.union = yyLOCAL - case 834: + case 837: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4496 +//line sql.y:4512 { yyLOCAL = PlanVExplainType } yyVAL.union = yyLOCAL - case 835: + case 838: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4500 +//line sql.y:4516 { yyLOCAL = AllVExplainType } yyVAL.union = yyLOCAL - case 836: + case 839: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4504 +//line sql.y:4520 { yyLOCAL = QueriesVExplainType } yyVAL.union = yyLOCAL - case 837: + case 840: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4508 +//line sql.y:4524 { yyLOCAL = TraceVExplainType } yyVAL.union = yyLOCAL - case 838: + case 841: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4512 +//line sql.y:4528 { yyLOCAL = KeysVExplainType } yyVAL.union = yyLOCAL - case 839: + case 842: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4518 +//line sql.y:4534 { yyVAL.str = yyDollar[1].str } - case 840: + case 843: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4522 +//line sql.y:4538 { yyVAL.str = yyDollar[1].str } - case 841: + case 844: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4526 +//line sql.y:4542 { yyVAL.str = yyDollar[1].str } - case 842: + case 845: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4532 +//line sql.y:4548 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL - case 843: + case 846: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4536 +//line sql.y:4552 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 844: + case 847: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4540 +//line sql.y:4556 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 845: + case 848: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4544 +//line sql.y:4560 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 846: + case 849: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4549 +//line sql.y:4565 { yyVAL.str = "" } - case 847: + case 850: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4553 +//line sql.y:4569 { yyVAL.str = yyDollar[1].identifierCI.val } - case 848: + case 851: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4557 +//line sql.y:4573 { yyVAL.str = encodeSQLString(yyDollar[1].str) } - case 849: + case 852: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4563 +//line sql.y:4579 { yyLOCAL = &ExplainTab{Table: yyDollar[3].tableName, Wild: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 850: + case 853: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4567 +//line sql.y:4583 { yyLOCAL = &ExplainStmt{Type: yyDollar[3].explainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } yyVAL.union = yyLOCAL - case 851: + case 854: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4573 +//line sql.y:4589 { yyLOCAL = &VExplainStmt{Type: yyDollar[3].vexplainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } yyVAL.union = yyLOCAL - case 852: + case 855: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4579 +//line sql.y:4595 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 853: + case 856: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4583 +//line sql.y:4599 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 854: + case 857: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4589 +//line sql.y:4605 { yyLOCAL = &LockTables{Tables: yyDollar[3].tableAndLockTypesUnion()} } yyVAL.union = yyLOCAL - case 855: + case 858: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableAndLockTypes -//line sql.y:4595 +//line sql.y:4611 { yyLOCAL = TableAndLockTypes{yyDollar[1].tableAndLockTypeUnion()} } yyVAL.union = yyLOCAL - case 856: + case 859: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4599 +//line sql.y:4615 { yySLICE := (*TableAndLockTypes)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableAndLockTypeUnion()) } - case 857: + case 860: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *TableAndLockType -//line sql.y:4605 +//line sql.y:4621 { yyLOCAL = &TableAndLockType{Table: yyDollar[1].aliasedTableNameUnion(), Lock: yyDollar[2].lockTypeUnion()} } yyVAL.union = yyLOCAL - case 858: + case 861: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4611 +//line sql.y:4627 { yyLOCAL = Read } yyVAL.union = yyLOCAL - case 859: + case 862: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4615 +//line sql.y:4631 { yyLOCAL = ReadLocal } yyVAL.union = yyLOCAL - case 860: + case 863: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4619 +//line sql.y:4635 { yyLOCAL = Write } yyVAL.union = yyLOCAL - case 861: + case 864: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4623 +//line sql.y:4639 { yyLOCAL = LowPriorityWrite } yyVAL.union = yyLOCAL - case 862: + case 865: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4629 +//line sql.y:4645 { yyLOCAL = &UnlockTables{} } yyVAL.union = yyLOCAL - case 863: + case 866: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4635 +//line sql.y:4651 { yyLOCAL = &RevertMigration{Comments: Comments(yyDollar[2].strs).Parsed(), UUID: string(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 864: + case 867: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4641 +//line sql.y:4657 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), FlushOptions: yyDollar[3].strs} } yyVAL.union = yyLOCAL - case 865: + case 868: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4645 +//line sql.y:4661 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion()} } yyVAL.union = yyLOCAL - case 866: + case 869: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4649 +//line sql.y:4665 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 867: + case 870: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4653 +//line sql.y:4669 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion()} } yyVAL.union = yyLOCAL - case 868: + case 871: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4657 +//line sql.y:4673 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 869: + case 872: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4661 +//line sql.y:4677 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), ForExport: true} } yyVAL.union = yyLOCAL - case 870: + case 873: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4667 +//line sql.y:4683 { yyVAL.strs = []string{yyDollar[1].str} } - case 871: + case 874: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4671 +//line sql.y:4687 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[3].str) } - case 872: + case 875: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4677 +//line sql.y:4693 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 873: + case 876: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4681 +//line sql.y:4697 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 874: + case 877: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4685 +//line sql.y:4701 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 875: + case 878: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4689 +//line sql.y:4705 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 876: + case 879: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4693 +//line sql.y:4709 { yyVAL.str = string(yyDollar[1].str) } - case 877: + case 880: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4697 +//line sql.y:4713 { yyVAL.str = string(yyDollar[1].str) } - case 878: + case 881: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4701 +//line sql.y:4717 { yyVAL.str = string(yyDollar[1].str) } - case 879: + case 882: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4705 +//line sql.y:4721 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyDollar[3].str } - case 880: + case 883: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4709 +//line sql.y:4725 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 881: + case 884: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4713 +//line sql.y:4729 { yyVAL.str = string(yyDollar[1].str) } - case 882: + case 885: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4717 +//line sql.y:4733 { yyVAL.str = string(yyDollar[1].str) } - case 883: + case 886: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4721 +//line sql.y:4737 { yyVAL.str = string(yyDollar[1].str) } - case 884: + case 887: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4726 +//line sql.y:4742 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 885: + case 888: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4730 +//line sql.y:4746 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 886: + case 889: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4734 +//line sql.y:4750 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 887: + case 890: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4739 +//line sql.y:4755 { yyVAL.str = "" } - case 888: + case 891: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4743 +//line sql.y:4759 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String() } - case 889: + case 892: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4748 +//line sql.y:4764 { setAllowComments(yylex, true) } - case 890: + case 893: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4752 +//line sql.y:4768 { yyVAL.strs = yyDollar[2].strs setAllowComments(yylex, false) } - case 891: + case 894: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4758 +//line sql.y:4774 { yyVAL.strs = nil } - case 892: + case 895: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4762 +//line sql.y:4778 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[2].str) } - case 893: + case 896: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4768 +//line sql.y:4784 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 894: + case 897: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4772 +//line sql.y:4788 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 895: + case 898: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4776 +//line sql.y:4792 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 896: + case 899: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4781 +//line sql.y:4797 { yyVAL.str = "" } - case 897: + case 900: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4785 +//line sql.y:4801 { yyVAL.str = SQLNoCacheStr } - case 898: + case 901: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4789 +//line sql.y:4805 { yyVAL.str = SQLCacheStr } - case 899: + case 902: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4794 +//line sql.y:4810 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 900: + case 903: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4798 +//line sql.y:4814 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 901: + case 904: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4802 +//line sql.y:4818 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 902: + case 905: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4808 +//line sql.y:4824 { yyLOCAL = &PrepareStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Statement: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 903: + case 906: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4812 +//line sql.y:4828 { yyLOCAL = &PrepareStmt{ Name: yyDollar[3].identifierCI, @@ -16983,597 +16988,597 @@ yydefault: } } yyVAL.union = yyLOCAL - case 904: + case 907: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4822 +//line sql.y:4838 { yyLOCAL = &ExecuteStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Arguments: yyDollar[4].variablesUnion()} } yyVAL.union = yyLOCAL - case 905: + case 908: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4827 +//line sql.y:4843 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 906: + case 909: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4831 +//line sql.y:4847 { yyLOCAL = yyDollar[2].variablesUnion() } yyVAL.union = yyLOCAL - case 907: + case 910: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4837 +//line sql.y:4853 { yyLOCAL = &DeallocateStmt{Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 908: + case 911: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4841 +//line sql.y:4857 { yyLOCAL = &DeallocateStmt{Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 909: + case 912: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4846 +//line sql.y:4862 { yyVAL.strs = nil } - case 910: + case 913: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4850 +//line sql.y:4866 { yyVAL.strs = yyDollar[1].strs } - case 911: + case 914: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4856 +//line sql.y:4872 { yyVAL.strs = []string{yyDollar[1].str} } - case 912: + case 915: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4860 +//line sql.y:4876 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[2].str) } - case 913: + case 916: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4866 +//line sql.y:4882 { yyVAL.str = SQLNoCacheStr } - case 914: + case 917: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4870 +//line sql.y:4886 { yyVAL.str = SQLCacheStr } - case 915: + case 918: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4874 +//line sql.y:4890 { yyVAL.str = DistinctStr } - case 916: + case 919: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4878 +//line sql.y:4894 { yyVAL.str = DistinctStr } - case 917: + case 920: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4882 +//line sql.y:4898 { yyVAL.str = HighPriorityStr } - case 918: + case 921: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4886 +//line sql.y:4902 { yyVAL.str = StraightJoinHint } - case 919: + case 922: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4890 +//line sql.y:4906 { yyVAL.str = SQLBufferResultStr } - case 920: + case 923: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4894 +//line sql.y:4910 { yyVAL.str = SQLSmallResultStr } - case 921: + case 924: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4898 +//line sql.y:4914 { yyVAL.str = SQLBigResultStr } - case 922: + case 925: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4902 +//line sql.y:4918 { yyVAL.str = SQLCalcFoundRowsStr } - case 923: + case 926: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4906 +//line sql.y:4922 { yyVAL.str = AllStr // These are not picked up by NewSelect, and so ALL will be dropped. But this is OK, since it's redundant anyway } - case 924: + case 927: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4912 +//line sql.y:4928 { yyLOCAL = SelectExprs{yyDollar[1].selectExprUnion()} } yyVAL.union = yyLOCAL - case 925: + case 928: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4916 +//line sql.y:4932 { yySLICE := (*SelectExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].selectExprUnion()) } - case 926: + case 929: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4922 +//line sql.y:4938 { yyLOCAL = &StarExpr{} } yyVAL.union = yyLOCAL - case 927: + case 930: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4926 +//line sql.y:4942 { yyLOCAL = &AliasedExpr{Expr: yyDollar[1].exprUnion(), As: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 928: + case 931: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4930 +//line sql.y:4946 { yyLOCAL = &StarExpr{TableName: TableName{Name: yyDollar[1].identifierCS}} } yyVAL.union = yyLOCAL - case 929: + case 932: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4934 +//line sql.y:4950 { yyLOCAL = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL - case 930: + case 933: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4939 +//line sql.y:4955 { yyVAL.identifierCI = IdentifierCI{} } - case 931: + case 934: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4943 +//line sql.y:4959 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 932: + case 935: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4947 +//line sql.y:4963 { yyVAL.identifierCI = yyDollar[2].identifierCI } - case 934: + case 937: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4954 +//line sql.y:4970 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 935: + case 938: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4959 +//line sql.y:4975 { yyLOCAL = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewIdentifierCS("dual")}}} } yyVAL.union = yyLOCAL - case 936: + case 939: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4963 +//line sql.y:4979 { yyLOCAL = yyDollar[1].tableExprsUnion() } yyVAL.union = yyLOCAL - case 937: + case 940: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4969 +//line sql.y:4985 { yyLOCAL = yyDollar[2].tableExprsUnion() } yyVAL.union = yyLOCAL - case 938: + case 941: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4975 +//line sql.y:4991 { yyLOCAL = TableExprs{yyDollar[1].tableExprUnion()} } yyVAL.union = yyLOCAL - case 939: + case 942: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4979 +//line sql.y:4995 { yySLICE := (*TableExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableExprUnion()) } - case 942: + case 945: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4989 +//line sql.y:5005 { yyLOCAL = yyDollar[1].aliasedTableNameUnion() } yyVAL.union = yyLOCAL - case 943: + case 946: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4993 +//line sql.y:5009 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].derivedTableUnion(), As: yyDollar[3].identifierCS, Columns: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 944: + case 947: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4997 +//line sql.y:5013 { yyLOCAL = &ParenTableExpr{Exprs: yyDollar[2].tableExprsUnion()} } yyVAL.union = yyLOCAL - case 945: + case 948: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5001 +//line sql.y:5017 { yyLOCAL = yyDollar[1].tableExprUnion() } yyVAL.union = yyLOCAL - case 946: + case 949: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:5007 +//line sql.y:5023 { - yyLOCAL = &DerivedTable{Lateral: false, Select: yyDollar[1].selStmtUnion()} + yyLOCAL = &DerivedTable{Lateral: false, Select: yyDollar[1].tableStmtUnion()} } yyVAL.union = yyLOCAL - case 947: + case 950: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:5011 +//line sql.y:5027 { - yyLOCAL = &DerivedTable{Lateral: true, Select: yyDollar[2].selStmtUnion()} + yyLOCAL = &DerivedTable{Lateral: true, Select: yyDollar[2].tableStmtUnion()} } yyVAL.union = yyLOCAL - case 948: + case 951: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:5017 +//line sql.y:5033 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].identifierCS, Hints: yyDollar[3].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 949: + case 952: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:5021 +//line sql.y:5037 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitionsUnion(), As: yyDollar[6].identifierCS, Hints: yyDollar[7].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 950: + case 953: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:5026 +//line sql.y:5042 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 951: + case 954: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:5030 +//line sql.y:5046 { yyLOCAL = yyDollar[2].columnsUnion() } yyVAL.union = yyLOCAL - case 952: + case 955: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:5035 +//line sql.y:5051 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 953: + case 956: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5039 +//line sql.y:5055 { yyLOCAL = yyDollar[1].columnsUnion() } yyVAL.union = yyLOCAL - case 954: + case 957: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5045 +//line sql.y:5061 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 955: + case 958: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5049 +//line sql.y:5065 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 956: + case 959: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*Variable -//line sql.y:5055 +//line sql.y:5071 { yyLOCAL = []*Variable{yyDollar[1].variableUnion()} } yyVAL.union = yyLOCAL - case 957: + case 960: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5059 +//line sql.y:5075 { yySLICE := (*[]*Variable)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].variableUnion()) } - case 958: + case 961: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5065 +//line sql.y:5081 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 959: + case 962: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5069 +//line sql.y:5085 { yyLOCAL = Columns{NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 960: + case 963: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5073 +//line sql.y:5089 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 961: + case 964: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5077 +//line sql.y:5093 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, NewIdentifierCI(string(yyDollar[3].str))) } - case 962: + case 965: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Partitions -//line sql.y:5083 +//line sql.y:5099 { yyLOCAL = Partitions{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 963: + case 966: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5087 +//line sql.y:5103 { yySLICE := (*Partitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 964: + case 967: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5100 +//line sql.y:5116 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 965: + case 968: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5104 +//line sql.y:5120 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 966: + case 969: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5108 +//line sql.y:5124 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 967: + case 970: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5112 +//line sql.y:5128 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion()} } yyVAL.union = yyLOCAL - case 968: + case 971: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5118 +//line sql.y:5134 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 969: + case 972: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:5120 +//line sql.y:5136 { yyVAL.joinCondition = &JoinCondition{Using: yyDollar[3].columnsUnion()} } - case 970: + case 973: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5124 +//line sql.y:5140 { yyVAL.joinCondition = &JoinCondition{} } - case 971: + case 974: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5126 +//line sql.y:5142 { yyVAL.joinCondition = yyDollar[1].joinCondition } - case 972: + case 975: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5130 +//line sql.y:5146 { yyVAL.joinCondition = &JoinCondition{} } - case 973: + case 976: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5132 +//line sql.y:5148 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 974: + case 977: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5135 +//line sql.y:5151 { yyVAL.empty = struct{}{} } - case 975: + case 978: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5137 +//line sql.y:5153 { yyVAL.empty = struct{}{} } - case 976: + case 979: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5140 +//line sql.y:5156 { yyVAL.identifierCS = NewIdentifierCS("") } - case 977: + case 980: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5144 +//line sql.y:5160 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 978: + case 981: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5148 +//line sql.y:5164 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 980: + case 983: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5155 +//line sql.y:5171 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 981: + case 984: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:5161 +//line sql.y:5177 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 982: + case 985: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5165 +//line sql.y:5181 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 983: + case 986: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5169 +//line sql.y:5185 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 984: + case 987: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:5175 +//line sql.y:5191 { yyLOCAL = StraightJoinType } yyVAL.union = yyLOCAL - case 985: + case 988: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5181 +//line sql.y:5197 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 986: + case 989: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:5185 +//line sql.y:5201 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 987: + case 990: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5189 +//line sql.y:5205 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 988: + case 991: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:5193 +//line sql.y:5209 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 989: + case 992: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5199 +//line sql.y:5215 { yyLOCAL = NaturalJoinType } yyVAL.union = yyLOCAL - case 990: + case 993: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5203 +//line sql.y:5219 { if yyDollar[2].joinTypeUnion() == LeftJoinType { yyLOCAL = NaturalLeftJoinType @@ -17582,667 +17587,667 @@ yydefault: } } yyVAL.union = yyLOCAL - case 991: + case 994: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5213 +//line sql.y:5229 { yyVAL.tableName = yyDollar[2].tableName } - case 992: + case 995: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5217 +//line sql.y:5233 { yyVAL.tableName = yyDollar[1].tableName } - case 993: + case 996: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5223 +//line sql.y:5239 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } - case 994: + case 997: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5227 +//line sql.y:5243 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS} } - case 995: + case 998: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5233 +//line sql.y:5249 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } - case 996: + case 999: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5238 +//line sql.y:5254 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 997: + case 1000: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5242 +//line sql.y:5258 { yyLOCAL = yyDollar[1].indexHintsUnion() } yyVAL.union = yyLOCAL - case 998: + case 1001: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5248 +//line sql.y:5264 { yyLOCAL = IndexHints{yyDollar[1].indexHintUnion()} } yyVAL.union = yyLOCAL - case 999: + case 1002: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5252 +//line sql.y:5268 { yySLICE := (*IndexHints)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexHintUnion()) } - case 1000: + case 1003: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5258 +//line sql.y:5274 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 1001: + case 1004: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5262 +//line sql.y:5278 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion()} } yyVAL.union = yyLOCAL - case 1002: + case 1005: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5266 +//line sql.y:5282 { yyLOCAL = &IndexHint{Type: IgnoreOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 1003: + case 1006: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5270 +//line sql.y:5286 { yyLOCAL = &IndexHint{Type: ForceOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 1004: + case 1007: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5274 +//line sql.y:5290 { yyLOCAL = &IndexHint{Type: UseVindexOp, Indexes: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 1005: + case 1008: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5278 +//line sql.y:5294 { yyLOCAL = &IndexHint{Type: IgnoreVindexOp, Indexes: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 1006: + case 1009: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5283 +//line sql.y:5299 { yyLOCAL = NoForType } yyVAL.union = yyLOCAL - case 1007: + case 1010: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5287 +//line sql.y:5303 { yyLOCAL = JoinForType } yyVAL.union = yyLOCAL - case 1008: + case 1011: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5291 +//line sql.y:5307 { yyLOCAL = OrderByForType } yyVAL.union = yyLOCAL - case 1009: + case 1012: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5295 +//line sql.y:5311 { yyLOCAL = GroupByForType } yyVAL.union = yyLOCAL - case 1010: + case 1013: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:5301 +//line sql.y:5317 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1011: + case 1014: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5305 +//line sql.y:5321 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1012: + case 1015: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5312 +//line sql.y:5328 { yyLOCAL = &OrExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1013: + case 1016: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5316 +//line sql.y:5332 { yyLOCAL = &XorExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1014: + case 1017: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5320 +//line sql.y:5336 { yyLOCAL = &AndExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1015: + case 1018: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5324 +//line sql.y:5340 { yyLOCAL = &NotExpr{Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1016: + case 1019: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5328 +//line sql.y:5344 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].isExprOperatorUnion()} } yyVAL.union = yyLOCAL - case 1017: + case 1020: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5332 +//line sql.y:5348 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1018: + case 1021: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5336 +//line sql.y:5352 { yyLOCAL = &AssignmentExpr{Left: yyDollar[1].variableUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1019: + case 1022: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5340 +//line sql.y:5356 { yyLOCAL = &MemberOfExpr{Value: yyDollar[1].exprUnion(), JSONArr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1020: + case 1023: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5346 +//line sql.y:5362 { } - case 1021: + case 1024: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5349 +//line sql.y:5365 { } - case 1022: + case 1025: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5354 +//line sql.y:5370 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNullOp} } yyVAL.union = yyLOCAL - case 1023: + case 1026: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5358 +//line sql.y:5374 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNotNullOp} } yyVAL.union = yyLOCAL - case 1024: + case 1027: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5362 +//line sql.y:5378 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1025: + case 1028: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5366 +//line sql.y:5382 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Modifier: Any, Right: yyDollar[4].subqueryUnion()} } yyVAL.union = yyLOCAL - case 1026: + case 1029: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5370 +//line sql.y:5386 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Modifier: Any, Right: yyDollar[4].subqueryUnion()} } yyVAL.union = yyLOCAL - case 1027: + case 1030: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5374 +//line sql.y:5390 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Modifier: All, Right: yyDollar[4].subqueryUnion()} } yyVAL.union = yyLOCAL - case 1028: + case 1031: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5378 +//line sql.y:5394 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1029: + case 1032: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5384 +//line sql.y:5400 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: InOp, Right: yyDollar[3].colTupleUnion()} } yyVAL.union = yyLOCAL - case 1030: + case 1033: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5388 +//line sql.y:5404 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotInOp, Right: yyDollar[4].colTupleUnion()} } yyVAL.union = yyLOCAL - case 1031: + case 1034: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5392 +//line sql.y:5408 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: true, From: yyDollar[3].exprUnion(), To: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1032: + case 1035: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5396 +//line sql.y:5412 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: false, From: yyDollar[4].exprUnion(), To: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 1033: + case 1036: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5400 +//line sql.y:5416 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1034: + case 1037: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5404 +//line sql.y:5420 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1035: + case 1038: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5408 +//line sql.y:5424 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion(), Escape: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1036: + case 1039: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5412 +//line sql.y:5428 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion(), Escape: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 1037: + case 1040: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5416 +//line sql.y:5432 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: RegexpOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1038: + case 1041: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5420 +//line sql.y:5436 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotRegexpOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1039: + case 1042: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5424 +//line sql.y:5440 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1040: + case 1043: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5430 +//line sql.y:5446 { } - case 1041: + case 1044: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5433 +//line sql.y:5449 { } - case 1042: + case 1045: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5439 +//line sql.y:5455 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitOrOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1043: + case 1046: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5443 +//line sql.y:5459 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitAndOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1044: + case 1047: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5447 +//line sql.y:5463 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftLeftOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1045: + case 1048: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5451 +//line sql.y:5467 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftRightOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1046: + case 1049: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5455 +//line sql.y:5471 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: PlusOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1047: + case 1050: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5459 +//line sql.y:5475 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MinusOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1048: + case 1051: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5463 +//line sql.y:5479 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinaryAdd, Date: yyDollar[1].exprUnion(), Unit: yyDollar[5].intervalTypeUnion(), Interval: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1049: + case 1052: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5467 +//line sql.y:5483 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinarySub, Date: yyDollar[1].exprUnion(), Unit: yyDollar[5].intervalTypeUnion(), Interval: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1050: + case 1053: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5471 +//line sql.y:5487 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MultOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1051: + case 1054: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5475 +//line sql.y:5491 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: DivOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1052: + case 1055: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5479 +//line sql.y:5495 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1053: + case 1056: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5483 +//line sql.y:5499 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: IntDivOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1054: + case 1057: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5487 +//line sql.y:5503 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1055: + case 1058: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5491 +//line sql.y:5507 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitXorOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1056: + case 1059: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5495 +//line sql.y:5511 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1057: + case 1060: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5501 +//line sql.y:5517 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1058: + case 1061: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5505 +//line sql.y:5521 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1059: + case 1062: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5509 +//line sql.y:5525 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1060: + case 1063: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5513 +//line sql.y:5529 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1061: + case 1064: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5517 +//line sql.y:5533 { yyLOCAL = &CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} } yyVAL.union = yyLOCAL - case 1062: + case 1065: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5521 +//line sql.y:5537 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1063: + case 1066: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5525 +//line sql.y:5541 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1064: + case 1067: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5529 +//line sql.y:5545 { yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL - case 1065: + case 1068: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5533 +//line sql.y:5549 { yyLOCAL = yyDollar[2].exprUnion() // TODO: do we really want to ignore unary '+' before any kind of literals? } yyVAL.union = yyLOCAL - case 1066: + case 1069: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5537 +//line sql.y:5553 { yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1067: + case 1070: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5541 +//line sql.y:5557 { yyLOCAL = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1068: + case 1071: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5545 +//line sql.y:5561 { yyLOCAL = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1069: + case 1072: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5549 +//line sql.y:5565 { yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL - case 1070: + case 1073: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5553 +//line sql.y:5569 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1071: + case 1074: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5557 +//line sql.y:5573 { yyLOCAL = &ExistsExpr{Subquery: yyDollar[2].subqueryUnion()} } yyVAL.union = yyLOCAL - case 1072: + case 1075: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:5561 +//line sql.y:5577 { yyLOCAL = &MatchExpr{Columns: yyDollar[2].colNamesUnion(), Expr: yyDollar[5].exprUnion(), Option: yyDollar[6].matchExprOptionUnion()} } yyVAL.union = yyLOCAL - case 1073: + case 1076: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:5565 +//line sql.y:5581 { yyLOCAL = &CastExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion(), Array: yyDollar[6].booleanUnion()} } yyVAL.union = yyLOCAL - case 1074: + case 1077: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5569 +//line sql.y:5585 { yyLOCAL = &ConvertExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion()} } yyVAL.union = yyLOCAL - case 1075: + case 1078: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5573 +//line sql.y:5589 { yyLOCAL = &ConvertUsingExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 1076: + case 1079: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5577 +//line sql.y:5593 { // From: https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#operator_binary // To convert a string expression to a binary string, these constructs are equivalent: @@ -18251,3218 +18256,3218 @@ yydefault: yyLOCAL = &ConvertExpr{Expr: yyDollar[2].exprUnion(), Type: &ConvertType{Type: yyDollar[1].str}} } yyVAL.union = yyLOCAL - case 1077: + case 1080: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5585 +//line sql.y:5601 { yyLOCAL = &Default{ColName: yyDollar[2].str} } yyVAL.union = yyLOCAL - case 1078: + case 1081: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5589 +//line sql.y:5605 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinaryAddLeft, Date: yyDollar[5].exprUnion(), Unit: yyDollar[3].intervalTypeUnion(), Interval: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1079: + case 1082: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5593 +//line sql.y:5609 { yyLOCAL = &IntervalFuncExpr{Expr: yyDollar[3].exprUnion(), Exprs: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1080: + case 1083: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5597 +//line sql.y:5613 { yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[1].exprUnion(), PathList: []Expr{yyDollar[3].exprUnion()}} } yyVAL.union = yyLOCAL - case 1081: + case 1084: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5601 +//line sql.y:5617 { yyLOCAL = &JSONUnquoteExpr{JSONValue: &JSONExtractExpr{JSONDoc: yyDollar[1].exprUnion(), PathList: []Expr{yyDollar[3].exprUnion()}}} } yyVAL.union = yyLOCAL - case 1082: + case 1085: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5607 +//line sql.y:5623 { yyLOCAL = yyDollar[1].colNamesUnion() } yyVAL.union = yyLOCAL - case 1083: + case 1086: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5611 +//line sql.y:5627 { yyLOCAL = yyDollar[2].colNamesUnion() } yyVAL.union = yyLOCAL - case 1084: + case 1087: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5617 +//line sql.y:5633 { yyLOCAL = []*ColName{yyDollar[1].colNameUnion()} } yyVAL.union = yyLOCAL - case 1085: + case 1088: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5621 +//line sql.y:5637 { yySLICE := (*[]*ColName)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].colNameUnion()) } - case 1086: + case 1089: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5627 +//line sql.y:5643 { yyLOCAL = BothTrimType } yyVAL.union = yyLOCAL - case 1087: + case 1090: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5631 +//line sql.y:5647 { yyLOCAL = LeadingTrimType } yyVAL.union = yyLOCAL - case 1088: + case 1091: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5635 +//line sql.y:5651 { yyLOCAL = TrailingTrimType } yyVAL.union = yyLOCAL - case 1089: + case 1092: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FrameUnitType -//line sql.y:5641 +//line sql.y:5657 { yyLOCAL = FrameRowsType } yyVAL.union = yyLOCAL - case 1090: + case 1093: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FrameUnitType -//line sql.y:5645 +//line sql.y:5661 { yyLOCAL = FrameRangeType } yyVAL.union = yyLOCAL - case 1091: + case 1094: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5652 +//line sql.y:5668 { yyLOCAL = CumeDistExprType } yyVAL.union = yyLOCAL - case 1092: + case 1095: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5656 +//line sql.y:5672 { yyLOCAL = DenseRankExprType } yyVAL.union = yyLOCAL - case 1093: + case 1096: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5660 +//line sql.y:5676 { yyLOCAL = PercentRankExprType } yyVAL.union = yyLOCAL - case 1094: + case 1097: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5664 +//line sql.y:5680 { yyLOCAL = RankExprType } yyVAL.union = yyLOCAL - case 1095: + case 1098: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5668 +//line sql.y:5684 { yyLOCAL = RowNumberExprType } yyVAL.union = yyLOCAL - case 1096: + case 1099: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5674 +//line sql.y:5690 { yyLOCAL = &FramePoint{Type: CurrentRowType} } yyVAL.union = yyLOCAL - case 1097: + case 1100: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5678 +//line sql.y:5694 { yyLOCAL = &FramePoint{Type: UnboundedPrecedingType} } yyVAL.union = yyLOCAL - case 1098: + case 1101: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5682 +//line sql.y:5698 { yyLOCAL = &FramePoint{Type: UnboundedFollowingType} } yyVAL.union = yyLOCAL - case 1099: + case 1102: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5686 +//line sql.y:5702 { yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1100: + case 1103: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5690 +//line sql.y:5706 { yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1101: + case 1104: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5694 +//line sql.y:5710 { yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1102: + case 1105: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5698 +//line sql.y:5714 { yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1103: + case 1106: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5703 +//line sql.y:5719 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1104: + case 1107: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5707 +//line sql.y:5723 { yyLOCAL = yyDollar[1].frameClauseUnion() } yyVAL.union = yyLOCAL - case 1105: + case 1108: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5713 +//line sql.y:5729 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[2].framePointUnion()} } yyVAL.union = yyLOCAL - case 1106: + case 1109: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5717 +//line sql.y:5733 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[3].framePointUnion(), End: yyDollar[5].framePointUnion()} } yyVAL.union = yyLOCAL - case 1107: + case 1110: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:5722 +//line sql.y:5738 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1108: + case 1111: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:5726 +//line sql.y:5742 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1109: + case 1112: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5731 +//line sql.y:5747 { yyVAL.identifierCI = IdentifierCI{} } - case 1110: + case 1113: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5735 +//line sql.y:5751 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1111: + case 1114: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *WindowSpecification -//line sql.y:5741 +//line sql.y:5757 { yyLOCAL = &WindowSpecification{Name: yyDollar[1].identifierCI, PartitionClause: yyDollar[2].exprsUnion(), OrderClause: yyDollar[3].orderByUnion(), FrameClause: yyDollar[4].frameClauseUnion()} } yyVAL.union = yyLOCAL - case 1112: + case 1115: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5747 +//line sql.y:5763 { yyLOCAL = &OverClause{WindowSpec: yyDollar[3].windowSpecificationUnion()} } yyVAL.union = yyLOCAL - case 1113: + case 1116: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5751 +//line sql.y:5767 { yyLOCAL = &OverClause{WindowName: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 1114: + case 1117: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5757 +//line sql.y:5773 { yyLOCAL = yyDollar[1].overClauseUnion() } yyVAL.union = yyLOCAL - case 1115: + case 1118: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5761 +//line sql.y:5777 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1116: + case 1119: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5766 +//line sql.y:5782 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1118: + case 1121: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5773 +//line sql.y:5789 { yyLOCAL = &NullTreatmentClause{yyDollar[1].nullTreatmentTypeUnion()} } yyVAL.union = yyLOCAL - case 1119: + case 1122: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5779 +//line sql.y:5795 { yyLOCAL = RespectNullsType } yyVAL.union = yyLOCAL - case 1120: + case 1123: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5783 +//line sql.y:5799 { yyLOCAL = IgnoreNullsType } yyVAL.union = yyLOCAL - case 1121: + case 1124: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5789 +//line sql.y:5805 { yyLOCAL = FirstValueExprType } yyVAL.union = yyLOCAL - case 1122: + case 1125: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5793 +//line sql.y:5809 { yyLOCAL = LastValueExprType } yyVAL.union = yyLOCAL - case 1123: + case 1126: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5799 +//line sql.y:5815 { yyLOCAL = FromFirstType } yyVAL.union = yyLOCAL - case 1124: + case 1127: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5803 +//line sql.y:5819 { yyLOCAL = FromLastType } yyVAL.union = yyLOCAL - case 1125: + case 1128: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5808 +//line sql.y:5824 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1127: + case 1130: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5815 +//line sql.y:5831 { yyLOCAL = &FromFirstLastClause{yyDollar[1].fromFirstLastTypeUnion()} } yyVAL.union = yyLOCAL - case 1128: + case 1131: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5821 +//line sql.y:5837 { yyLOCAL = LagExprType } yyVAL.union = yyLOCAL - case 1129: + case 1132: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5825 +//line sql.y:5841 { yyLOCAL = LeadExprType } yyVAL.union = yyLOCAL - case 1130: + case 1133: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *WindowDefinition -//line sql.y:5831 +//line sql.y:5847 { yyLOCAL = &WindowDefinition{Name: yyDollar[1].identifierCI, WindowSpec: yyDollar[4].windowSpecificationUnion()} } yyVAL.union = yyLOCAL - case 1131: + case 1134: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL WindowDefinitions -//line sql.y:5837 +//line sql.y:5853 { yyLOCAL = WindowDefinitions{yyDollar[1].windowDefinitionUnion()} } yyVAL.union = yyLOCAL - case 1132: + case 1135: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5841 +//line sql.y:5857 { yySLICE := (*WindowDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].windowDefinitionUnion()) } - case 1133: + case 1136: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5847 +//line sql.y:5863 { yyVAL.str = "" } - case 1134: + case 1137: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5851 +//line sql.y:5867 { yyVAL.str = string(yyDollar[2].identifierCI.String()) } - case 1135: + case 1138: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5857 +//line sql.y:5873 { yyLOCAL = BoolVal(true) } yyVAL.union = yyLOCAL - case 1136: + case 1139: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5861 +//line sql.y:5877 { yyLOCAL = BoolVal(false) } yyVAL.union = yyLOCAL - case 1137: + case 1140: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5868 +//line sql.y:5884 { yyLOCAL = IsTrueOp } yyVAL.union = yyLOCAL - case 1138: + case 1141: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5872 +//line sql.y:5888 { yyLOCAL = IsNotTrueOp } yyVAL.union = yyLOCAL - case 1139: + case 1142: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5876 +//line sql.y:5892 { yyLOCAL = IsFalseOp } yyVAL.union = yyLOCAL - case 1140: + case 1143: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5880 +//line sql.y:5896 { yyLOCAL = IsNotFalseOp } yyVAL.union = yyLOCAL - case 1141: + case 1144: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5886 +//line sql.y:5902 { yyLOCAL = yyDollar[1].comparisonExprOperatorUnion() } yyVAL.union = yyLOCAL - case 1142: + case 1145: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5890 +//line sql.y:5906 { yyLOCAL = NullSafeEqualOp } yyVAL.union = yyLOCAL - case 1143: + case 1146: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5896 +//line sql.y:5912 { yyLOCAL = EqualOp } yyVAL.union = yyLOCAL - case 1144: + case 1147: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5900 +//line sql.y:5916 { yyLOCAL = LessThanOp } yyVAL.union = yyLOCAL - case 1145: + case 1148: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5904 +//line sql.y:5920 { yyLOCAL = GreaterThanOp } yyVAL.union = yyLOCAL - case 1146: + case 1149: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5908 +//line sql.y:5924 { yyLOCAL = LessEqualOp } yyVAL.union = yyLOCAL - case 1147: + case 1150: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5912 +//line sql.y:5928 { yyLOCAL = GreaterEqualOp } yyVAL.union = yyLOCAL - case 1148: + case 1151: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5916 +//line sql.y:5932 { yyLOCAL = NotEqualOp } yyVAL.union = yyLOCAL - case 1149: + case 1152: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5922 +//line sql.y:5938 { yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL - case 1150: + case 1153: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5926 +//line sql.y:5942 { yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL - case 1151: + case 1154: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5930 +//line sql.y:5946 { yyLOCAL = ListArg(yyDollar[1].str[2:]) markBindVariable(yylex, yyDollar[1].str[2:]) } yyVAL.union = yyLOCAL - case 1152: + case 1155: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Subquery -//line sql.y:5937 +//line sql.y:5953 { - yyLOCAL = &Subquery{yyDollar[1].selStmtUnion()} + yyLOCAL = &Subquery{yyDollar[1].tableStmtUnion()} } yyVAL.union = yyLOCAL - case 1153: + case 1156: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:5943 +//line sql.y:5959 { yyLOCAL = Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1154: + case 1157: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5947 +//line sql.y:5963 { yySLICE := (*Exprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].exprUnion()) } - case 1155: + case 1158: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5957 +//line sql.y:5973 { yyLOCAL = &FuncExpr{Name: yyDollar[1].identifierCI, Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1156: + case 1159: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5961 +//line sql.y:5977 { yyLOCAL = &FuncExpr{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCI, Exprs: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1157: + case 1160: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5971 +//line sql.y:5987 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("left"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1158: + case 1161: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5975 +//line sql.y:5991 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("right"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1159: + case 1162: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5979 +//line sql.y:5995 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1160: + case 1163: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5983 +//line sql.y:5999 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1161: + case 1164: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5987 +//line sql.y:6003 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1162: + case 1165: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5991 +//line sql.y:6007 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1163: + case 1166: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5995 +//line sql.y:6011 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1164: + case 1167: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5999 +//line sql.y:6015 { yyLOCAL = &CaseExpr{Expr: yyDollar[2].exprUnion(), Whens: yyDollar[3].whensUnion(), Else: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1165: + case 1168: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6003 +//line sql.y:6019 { yyLOCAL = &ValuesFuncExpr{Name: yyDollar[3].colNameUnion()} } yyVAL.union = yyLOCAL - case 1166: + case 1169: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6007 +//line sql.y:6023 { yyLOCAL = &InsertExpr{Str: yyDollar[3].exprUnion(), Pos: yyDollar[5].exprUnion(), Len: yyDollar[7].exprUnion(), NewStr: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1167: + case 1170: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6011 +//line sql.y:6027 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1168: + case 1171: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6022 +//line sql.y:6038 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("utc_date")} } yyVAL.union = yyLOCAL - case 1169: + case 1172: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6026 +//line sql.y:6042 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1170: + case 1173: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6032 +//line sql.y:6048 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("current_date")} } yyVAL.union = yyLOCAL - case 1171: + case 1174: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6036 +//line sql.y:6052 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("curdate")} } yyVAL.union = yyLOCAL - case 1172: + case 1175: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6040 +//line sql.y:6056 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_time"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 1173: + case 1176: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6045 +//line sql.y:6061 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("curtime"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 1174: + case 1177: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6050 +//line sql.y:6066 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_time"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 1175: + case 1178: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6054 +//line sql.y:6070 { yyLOCAL = &CountStar{OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1176: + case 1179: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6058 +//line sql.y:6074 { yyLOCAL = &Count{Distinct: yyDollar[3].booleanUnion(), Args: yyDollar[4].exprsUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1177: + case 1180: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6062 +//line sql.y:6078 { yyLOCAL = &Max{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1178: + case 1181: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6066 +//line sql.y:6082 { yyLOCAL = &Min{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1179: + case 1182: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6070 +//line sql.y:6086 { yyLOCAL = &Sum{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1180: + case 1183: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6074 +//line sql.y:6090 { yyLOCAL = &Avg{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1181: + case 1184: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6078 +//line sql.y:6094 { yyLOCAL = &BitAnd{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1182: + case 1185: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6082 +//line sql.y:6098 { yyLOCAL = &BitOr{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1183: + case 1186: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6086 +//line sql.y:6102 { yyLOCAL = &BitXor{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1184: + case 1187: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6090 +//line sql.y:6106 { yyLOCAL = &Std{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1185: + case 1188: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6094 +//line sql.y:6110 { yyLOCAL = &StdDev{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1186: + case 1189: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6098 +//line sql.y:6114 { yyLOCAL = &StdPop{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1187: + case 1190: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6102 +//line sql.y:6118 { yyLOCAL = &StdSamp{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1188: + case 1191: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6106 +//line sql.y:6122 { yyLOCAL = &VarPop{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1189: + case 1192: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6110 +//line sql.y:6126 { yyLOCAL = &VarSamp{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1190: + case 1193: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6114 +//line sql.y:6130 { yyLOCAL = &Variance{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1191: + case 1194: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6118 +//line sql.y:6134 { yyLOCAL = &GroupConcatExpr{Distinct: yyDollar[3].booleanUnion(), Exprs: yyDollar[4].exprsUnion(), OrderBy: yyDollar[5].orderByUnion(), Separator: yyDollar[6].str, Limit: yyDollar[7].limitUnion()} } yyVAL.union = yyLOCAL - case 1192: + case 1195: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6122 +//line sql.y:6138 { yyLOCAL = &AnyValue{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1193: + case 1196: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6126 +//line sql.y:6142 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprTimestampadd, Date: yyDollar[7].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1194: + case 1197: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6130 +//line sql.y:6146 { yyLOCAL = &TimestampDiffExpr{Unit: yyDollar[3].intervalTypeUnion(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1195: + case 1198: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6134 +//line sql.y:6150 { yyLOCAL = &ExtractFuncExpr{IntervalType: yyDollar[3].intervalTypeUnion(), Expr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1196: + case 1199: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6138 +//line sql.y:6154 { yyLOCAL = &WeightStringFuncExpr{Expr: yyDollar[3].exprUnion(), As: yyDollar[4].convertTypeUnion()} } yyVAL.union = yyLOCAL - case 1197: + case 1200: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6142 +//line sql.y:6158 { yyLOCAL = &JSONPrettyExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1198: + case 1201: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6146 +//line sql.y:6162 { yyLOCAL = &JSONStorageFreeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1199: + case 1202: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6150 +//line sql.y:6166 { yyLOCAL = &JSONStorageSizeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1200: + case 1203: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6154 +//line sql.y:6170 { yyLOCAL = &JSONArrayAgg{Expr: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1201: + case 1204: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:6158 +//line sql.y:6174 { yyLOCAL = &JSONObjectAgg{Key: yyDollar[3].exprUnion(), Value: yyDollar[5].exprUnion(), OverClause: yyDollar[7].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1202: + case 1205: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6162 +//line sql.y:6178 { yyLOCAL = &TrimFuncExpr{TrimFuncType: LTrimType, Type: LeadingTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1203: + case 1206: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6166 +//line sql.y:6182 { yyLOCAL = &TrimFuncExpr{TrimFuncType: RTrimType, Type: TrailingTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1204: + case 1207: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:6170 +//line sql.y:6186 { yyLOCAL = &TrimFuncExpr{Type: yyDollar[3].trimTypeUnion(), TrimArg: yyDollar[4].exprUnion(), StringArg: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 1205: + case 1208: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6174 +//line sql.y:6190 { yyLOCAL = &TrimFuncExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1206: + case 1209: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6178 +//line sql.y:6194 { yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1207: + case 1210: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6182 +//line sql.y:6198 { yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion(), Charset: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 1208: + case 1211: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6186 +//line sql.y:6202 { yyLOCAL = &TrimFuncExpr{TrimArg: yyDollar[3].exprUnion(), StringArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1209: + case 1212: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6190 +//line sql.y:6206 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1210: + case 1213: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6194 +//line sql.y:6210 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion(), Pos: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1211: + case 1214: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6198 +//line sql.y:6214 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1212: + case 1215: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6202 +//line sql.y:6218 { yyLOCAL = &LockingFunc{Type: GetLock, Name: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1213: + case 1216: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6206 +//line sql.y:6222 { yyLOCAL = &LockingFunc{Type: IsFreeLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1214: + case 1217: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6210 +//line sql.y:6226 { yyLOCAL = &LockingFunc{Type: IsUsedLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1215: + case 1218: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6214 +//line sql.y:6230 { yyLOCAL = &LockingFunc{Type: ReleaseAllLocks} } yyVAL.union = yyLOCAL - case 1216: + case 1219: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6218 +//line sql.y:6234 { yyLOCAL = &LockingFunc{Type: ReleaseLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1217: + case 1220: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6222 +//line sql.y:6238 { yyLOCAL = &JSONSchemaValidFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1218: + case 1221: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6226 +//line sql.y:6242 { yyLOCAL = &JSONSchemaValidationReportFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1219: + case 1222: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6230 +//line sql.y:6246 { yyLOCAL = &JSONArrayExpr{Params: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1220: + case 1223: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6234 +//line sql.y:6250 { yyLOCAL = &GeomFormatExpr{FormatType: BinaryFormat, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1221: + case 1224: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6238 +//line sql.y:6254 { yyLOCAL = &GeomFormatExpr{FormatType: BinaryFormat, Geom: yyDollar[3].exprUnion(), AxisOrderOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1222: + case 1225: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6242 +//line sql.y:6258 { yyLOCAL = &GeomFormatExpr{FormatType: TextFormat, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1223: + case 1226: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6246 +//line sql.y:6262 { yyLOCAL = &GeomFormatExpr{FormatType: TextFormat, Geom: yyDollar[3].exprUnion(), AxisOrderOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1224: + case 1227: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6250 +//line sql.y:6266 { yyLOCAL = &GeomPropertyFuncExpr{Property: IsEmpty, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1225: + case 1228: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6254 +//line sql.y:6270 { yyLOCAL = &GeomPropertyFuncExpr{Property: IsSimple, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1226: + case 1229: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6258 +//line sql.y:6274 { yyLOCAL = &GeomPropertyFuncExpr{Property: Dimension, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1227: + case 1230: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6262 +//line sql.y:6278 { yyLOCAL = &GeomPropertyFuncExpr{Property: Envelope, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1228: + case 1231: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6266 +//line sql.y:6282 { yyLOCAL = &GeomPropertyFuncExpr{Property: GeometryType, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1229: + case 1232: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6270 +//line sql.y:6286 { yyLOCAL = &PointPropertyFuncExpr{Property: Latitude, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1230: + case 1233: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6274 +//line sql.y:6290 { yyLOCAL = &PointPropertyFuncExpr{Property: Latitude, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1231: + case 1234: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6278 +//line sql.y:6294 { yyLOCAL = &PointPropertyFuncExpr{Property: Longitude, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1232: + case 1235: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6282 +//line sql.y:6298 { yyLOCAL = &PointPropertyFuncExpr{Property: Longitude, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1233: + case 1236: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6286 +//line sql.y:6302 { yyLOCAL = &LinestrPropertyFuncExpr{Property: EndPoint, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1234: + case 1237: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6290 +//line sql.y:6306 { yyLOCAL = &LinestrPropertyFuncExpr{Property: IsClosed, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1235: + case 1238: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6294 +//line sql.y:6310 { yyLOCAL = &LinestrPropertyFuncExpr{Property: Length, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1236: + case 1239: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6298 +//line sql.y:6314 { yyLOCAL = &LinestrPropertyFuncExpr{Property: Length, Linestring: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1237: + case 1240: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6302 +//line sql.y:6318 { yyLOCAL = &LinestrPropertyFuncExpr{Property: NumPoints, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1238: + case 1241: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6306 +//line sql.y:6322 { yyLOCAL = &LinestrPropertyFuncExpr{Property: PointN, Linestring: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1239: + case 1242: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6310 +//line sql.y:6326 { yyLOCAL = &LinestrPropertyFuncExpr{Property: StartPoint, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1240: + case 1243: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6314 +//line sql.y:6330 { yyLOCAL = &PointPropertyFuncExpr{Property: XCordinate, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1241: + case 1244: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6318 +//line sql.y:6334 { yyLOCAL = &PointPropertyFuncExpr{Property: XCordinate, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1242: + case 1245: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6322 +//line sql.y:6338 { yyLOCAL = &PointPropertyFuncExpr{Property: YCordinate, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1243: + case 1246: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6326 +//line sql.y:6342 { yyLOCAL = &PointPropertyFuncExpr{Property: YCordinate, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1244: + case 1247: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6330 +//line sql.y:6346 { yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1245: + case 1248: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6334 +//line sql.y:6350 { yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1246: + case 1249: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6338 +//line sql.y:6354 { yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1247: + case 1250: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6342 +//line sql.y:6358 { yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1248: + case 1251: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6346 +//line sql.y:6362 { yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1249: + case 1252: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6350 +//line sql.y:6366 { yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1250: + case 1253: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6354 +//line sql.y:6370 { yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1251: + case 1254: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6358 +//line sql.y:6374 { yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1252: + case 1255: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6362 +//line sql.y:6378 { yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1253: + case 1256: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6366 +//line sql.y:6382 { yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1254: + case 1257: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6370 +//line sql.y:6386 { yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1255: + case 1258: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6374 +//line sql.y:6390 { yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1256: + case 1259: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6378 +//line sql.y:6394 { yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1257: + case 1260: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6382 +//line sql.y:6398 { yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1258: + case 1261: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6386 +//line sql.y:6402 { yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1259: + case 1262: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6390 +//line sql.y:6406 { yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1260: + case 1263: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6394 +//line sql.y:6410 { yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1261: + case 1264: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6398 +//line sql.y:6414 { yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1262: + case 1265: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6402 +//line sql.y:6418 { yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1263: + case 1266: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6406 +//line sql.y:6422 { yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1264: + case 1267: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6410 +//line sql.y:6426 { yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1265: + case 1268: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6414 +//line sql.y:6430 { yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1266: + case 1269: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6418 +//line sql.y:6434 { yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1267: + case 1270: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6422 +//line sql.y:6438 { yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1268: + case 1271: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6426 +//line sql.y:6442 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1269: + case 1272: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6430 +//line sql.y:6446 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1270: + case 1273: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6434 +//line sql.y:6450 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1271: + case 1274: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6438 +//line sql.y:6454 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1272: + case 1275: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6442 +//line sql.y:6458 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1273: + case 1276: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6446 +//line sql.y:6462 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1274: + case 1277: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6450 +//line sql.y:6466 { yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1275: + case 1278: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6454 +//line sql.y:6470 { yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1276: + case 1279: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6458 +//line sql.y:6474 { yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1277: + case 1280: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6462 +//line sql.y:6478 { yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1278: + case 1281: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6466 +//line sql.y:6482 { yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1279: + case 1282: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6470 +//line sql.y:6486 { yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1280: + case 1283: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6474 +//line sql.y:6490 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1281: + case 1284: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6478 +//line sql.y:6494 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1282: + case 1285: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6482 +//line sql.y:6498 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1283: + case 1286: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6486 +//line sql.y:6502 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1284: + case 1287: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6490 +//line sql.y:6506 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1285: + case 1288: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6494 +//line sql.y:6510 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1286: + case 1289: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6498 +//line sql.y:6514 { yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1287: + case 1290: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6502 +//line sql.y:6518 { yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1288: + case 1291: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6506 +//line sql.y:6522 { yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1289: + case 1292: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6510 +//line sql.y:6526 { yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1290: + case 1293: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6514 +//line sql.y:6530 { yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1291: + case 1294: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6518 +//line sql.y:6534 { yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1292: + case 1295: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6522 +//line sql.y:6538 { yyLOCAL = &PolygonPropertyFuncExpr{Property: Area, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1293: + case 1296: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6526 +//line sql.y:6542 { yyLOCAL = &PolygonPropertyFuncExpr{Property: Centroid, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1294: + case 1297: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6530 +//line sql.y:6546 { yyLOCAL = &PolygonPropertyFuncExpr{Property: ExteriorRing, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1295: + case 1298: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6534 +//line sql.y:6550 { yyLOCAL = &PolygonPropertyFuncExpr{Property: InteriorRingN, Polygon: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1296: + case 1299: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6538 +//line sql.y:6554 { yyLOCAL = &PolygonPropertyFuncExpr{Property: NumInteriorRings, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1297: + case 1300: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6542 +//line sql.y:6558 { yyLOCAL = &GeomCollPropertyFuncExpr{Property: GeometryN, GeomColl: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1298: + case 1301: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6546 +//line sql.y:6562 { yyLOCAL = &GeomCollPropertyFuncExpr{Property: NumGeometries, GeomColl: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1299: + case 1302: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6550 +//line sql.y:6566 { yyLOCAL = &GeoHashFromLatLongExpr{Longitude: yyDollar[3].exprUnion(), Latitude: yyDollar[5].exprUnion(), MaxLength: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1300: + case 1303: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6554 +//line sql.y:6570 { yyLOCAL = &GeoHashFromPointExpr{Point: yyDollar[3].exprUnion(), MaxLength: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1301: + case 1304: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6558 +//line sql.y:6574 { yyLOCAL = &GeomFromGeoHashExpr{GeomType: LatitudeFromHash, GeoHash: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1302: + case 1305: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6562 +//line sql.y:6578 { yyLOCAL = &GeomFromGeoHashExpr{GeomType: LongitudeFromHash, GeoHash: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1303: + case 1306: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6566 +//line sql.y:6582 { yyLOCAL = &GeomFromGeoHashExpr{GeomType: PointFromHash, GeoHash: yyDollar[3].exprUnion(), SridOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1304: + case 1307: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6570 +//line sql.y:6586 { yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1305: + case 1308: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6574 +//line sql.y:6590 { yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion(), HigherDimHandlerOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1306: + case 1309: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6578 +//line sql.y:6594 { yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion(), HigherDimHandlerOpt: yyDollar[5].exprUnion(), Srid: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1307: + case 1310: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6582 +//line sql.y:6598 { yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1308: + case 1311: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6586 +//line sql.y:6602 { yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion(), MaxDecimalDigits: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1309: + case 1312: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6590 +//line sql.y:6606 { yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion(), MaxDecimalDigits: yyDollar[5].exprUnion(), Bitmask: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1310: + case 1313: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6594 +//line sql.y:6610 { yyLOCAL = &JSONObjectExpr{Params: yyDollar[3].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1311: + case 1314: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6598 +//line sql.y:6614 { yyLOCAL = &JSONQuoteExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1312: + case 1315: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6602 +//line sql.y:6618 { yyLOCAL = &JSONContainsExpr{Target: yyDollar[3].exprUnion(), Candidate: yyDollar[5].exprsUnion()[0], PathList: yyDollar[5].exprsUnion()[1:]} } yyVAL.union = yyLOCAL - case 1313: + case 1316: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6606 +//line sql.y:6622 { yyLOCAL = &JSONContainsPathExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), PathList: yyDollar[7].exprsUnion()} } yyVAL.union = yyLOCAL - case 1314: + case 1317: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6610 +//line sql.y:6626 { yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1315: + case 1318: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6614 +//line sql.y:6630 { yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1316: + case 1319: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6618 +//line sql.y:6634 { yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1317: + case 1320: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6622 +//line sql.y:6638 { yyLOCAL = &JSONOverlapsExpr{JSONDoc1: yyDollar[3].exprUnion(), JSONDoc2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1318: + case 1321: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6626 +//line sql.y:6642 { yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1319: + case 1322: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6630 +//line sql.y:6646 { yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion(), EscapeChar: yyDollar[9].exprsUnion()[0], PathList: yyDollar[9].exprsUnion()[1:]} } yyVAL.union = yyLOCAL - case 1320: + case 1323: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:6634 +//line sql.y:6650 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion()} } yyVAL.union = yyLOCAL - case 1321: + case 1324: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6638 +//line sql.y:6654 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} } yyVAL.union = yyLOCAL - case 1322: + case 1325: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6642 +//line sql.y:6658 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} } yyVAL.union = yyLOCAL - case 1323: + case 1326: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6646 +//line sql.y:6662 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} } yyVAL.union = yyLOCAL - case 1324: + case 1327: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6650 +//line sql.y:6666 { yyLOCAL = &JSONAttributesExpr{Type: DepthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1325: + case 1328: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6654 +//line sql.y:6670 { yyLOCAL = &JSONAttributesExpr{Type: ValidAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1326: + case 1329: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6658 +//line sql.y:6674 { yyLOCAL = &JSONAttributesExpr{Type: TypeAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1327: + case 1330: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6662 +//line sql.y:6678 { yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1328: + case 1331: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6666 +//line sql.y:6682 { yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1329: + case 1332: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6670 +//line sql.y:6686 { yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayAppendType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1330: + case 1333: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6674 +//line sql.y:6690 { yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1331: + case 1334: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6678 +//line sql.y:6694 { yyLOCAL = &JSONValueModifierExpr{Type: JSONInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1332: + case 1335: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6682 +//line sql.y:6698 { yyLOCAL = &JSONValueModifierExpr{Type: JSONReplaceType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1333: + case 1336: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6686 +//line sql.y:6702 { yyLOCAL = &JSONValueModifierExpr{Type: JSONSetType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1334: + case 1337: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6690 +//line sql.y:6706 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergeType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1335: + case 1338: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6694 +//line sql.y:6710 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePatchType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1336: + case 1339: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6698 +//line sql.y:6714 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePreserveType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1337: + case 1340: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6702 +//line sql.y:6718 { yyLOCAL = &JSONRemoveExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1338: + case 1341: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6706 +//line sql.y:6722 { yyLOCAL = &JSONUnquoteExpr{JSONValue: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1339: + case 1342: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6710 +//line sql.y:6726 { yyLOCAL = &MultiPolygonExpr{PolygonParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1340: + case 1343: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6714 +//line sql.y:6730 { yyLOCAL = &MultiPointExpr{PointParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1341: + case 1344: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6718 +//line sql.y:6734 { yyLOCAL = &MultiLinestringExpr{LinestringParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1342: + case 1345: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6722 +//line sql.y:6738 { yyLOCAL = &PolygonExpr{LinestringParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1343: + case 1346: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6726 +//line sql.y:6742 { yyLOCAL = &LineStringExpr{PointParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1344: + case 1347: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6730 +//line sql.y:6746 { yyLOCAL = &PointExpr{XCordinate: yyDollar[3].exprUnion(), YCordinate: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1345: + case 1348: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6734 +//line sql.y:6750 { yyLOCAL = &ArgumentLessWindowExpr{Type: yyDollar[1].argumentLessWindowExprTypeUnion(), OverClause: yyDollar[4].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1346: + case 1349: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6738 +//line sql.y:6754 { yyLOCAL = &FirstOrLastValueExpr{Type: yyDollar[1].firstOrLastValueExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1347: + case 1350: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6742 +//line sql.y:6758 { yyLOCAL = &NtileExpr{N: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1348: + case 1351: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6746 +//line sql.y:6762 { yyLOCAL = &NTHValueExpr{Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), FromFirstLastClause: yyDollar[7].fromFirstLastClauseUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1349: + case 1352: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6750 +//line sql.y:6766 { yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1350: + case 1353: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6754 +//line sql.y:6770 { yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), Default: yyDollar[6].exprUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1351: + case 1354: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6758 +//line sql.y:6774 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprAdddate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1352: + case 1355: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6762 +//line sql.y:6778 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprAdddate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: IntervalNone} } yyVAL.union = yyLOCAL - case 1353: + case 1356: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6766 +//line sql.y:6782 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprDateAdd, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1354: + case 1357: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6770 +//line sql.y:6786 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprDateSub, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1355: + case 1358: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6774 +//line sql.y:6790 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprSubdate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1356: + case 1359: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6778 +//line sql.y:6794 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprSubdate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: IntervalNone} } yyVAL.union = yyLOCAL - case 1361: + case 1364: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6788 +//line sql.y:6804 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1362: + case 1365: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6792 +//line sql.y:6808 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1363: + case 1366: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6796 +//line sql.y:6812 { yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL - case 1364: + case 1367: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6800 +//line sql.y:6816 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 1365: + case 1368: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6805 +//line sql.y:6821 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1366: + case 1369: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6809 +//line sql.y:6825 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1367: + case 1370: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6815 +//line sql.y:6831 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1368: + case 1371: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6819 +//line sql.y:6835 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1369: + case 1372: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6823 +//line sql.y:6839 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1370: + case 1373: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6827 +//line sql.y:6843 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1371: + case 1374: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6831 +//line sql.y:6847 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion(), MatchType: yyDollar[13].exprUnion()} } yyVAL.union = yyLOCAL - case 1372: + case 1375: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6836 +//line sql.y:6852 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1373: + case 1376: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6840 +//line sql.y:6856 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), MatchType: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1374: + case 1377: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6844 +//line sql.y:6860 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1375: + case 1378: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6848 +//line sql.y:6864 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1376: + case 1379: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6852 +//line sql.y:6868 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1377: + case 1380: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6856 +//line sql.y:6872 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion(), MatchType: yyDollar[13].exprUnion()} } yyVAL.union = yyLOCAL - case 1378: + case 1381: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6861 +//line sql.y:6877 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1379: + case 1382: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6865 +//line sql.y:6881 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1380: + case 1383: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6869 +//line sql.y:6885 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1381: + case 1384: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6873 +//line sql.y:6889 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), MatchType: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1382: + case 1385: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6880 +//line sql.y:6896 { yyLOCAL = &ExtractValueExpr{Fragment: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1383: + case 1386: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6884 +//line sql.y:6900 { yyLOCAL = &UpdateXMLExpr{Target: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion(), NewXML: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1384: + case 1387: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6890 +//line sql.y:6906 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatBytesType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1385: + case 1388: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6894 +//line sql.y:6910 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatPicoTimeType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1386: + case 1389: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6898 +//line sql.y:6914 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsCurrentThreadIDType} } yyVAL.union = yyLOCAL - case 1387: + case 1390: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6902 +//line sql.y:6918 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsThreadIDType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1388: + case 1391: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6908 +//line sql.y:6924 { yyLOCAL = >IDFuncExpr{Type: GTIDSubsetType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1389: + case 1392: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6912 +//line sql.y:6928 { yyLOCAL = >IDFuncExpr{Type: GTIDSubtractType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1390: + case 1393: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6916 +//line sql.y:6932 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1391: + case 1394: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6920 +//line sql.y:6936 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1392: + case 1395: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6924 +//line sql.y:6940 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1393: + case 1396: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6928 +//line sql.y:6944 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1394: + case 1397: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6932 +//line sql.y:6948 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion(), Channel: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1395: + case 1398: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6937 +//line sql.y:6953 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1396: + case 1399: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6941 +//line sql.y:6957 { yyLOCAL = yyDollar[2].convertTypeUnion() } yyVAL.union = yyLOCAL - case 1397: + case 1400: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6947 +//line sql.y:6963 { yyLOCAL = IntervalDayHour } yyVAL.union = yyLOCAL - case 1398: + case 1401: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6951 +//line sql.y:6967 { yyLOCAL = IntervalDayMicrosecond } yyVAL.union = yyLOCAL - case 1399: + case 1402: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6955 +//line sql.y:6971 { yyLOCAL = IntervalDayMinute } yyVAL.union = yyLOCAL - case 1400: + case 1403: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6959 +//line sql.y:6975 { yyLOCAL = IntervalDaySecond } yyVAL.union = yyLOCAL - case 1401: + case 1404: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6963 +//line sql.y:6979 { yyLOCAL = IntervalHourMicrosecond } yyVAL.union = yyLOCAL - case 1402: + case 1405: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6967 +//line sql.y:6983 { yyLOCAL = IntervalHourMinute } yyVAL.union = yyLOCAL - case 1403: + case 1406: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6971 +//line sql.y:6987 { yyLOCAL = IntervalHourSecond } yyVAL.union = yyLOCAL - case 1404: + case 1407: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6975 +//line sql.y:6991 { yyLOCAL = IntervalMinuteMicrosecond } yyVAL.union = yyLOCAL - case 1405: + case 1408: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6979 +//line sql.y:6995 { yyLOCAL = IntervalMinuteSecond } yyVAL.union = yyLOCAL - case 1406: + case 1409: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6983 +//line sql.y:6999 { yyLOCAL = IntervalSecondMicrosecond } yyVAL.union = yyLOCAL - case 1407: + case 1410: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6987 +//line sql.y:7003 { yyLOCAL = IntervalYearMonth } yyVAL.union = yyLOCAL - case 1408: + case 1411: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6991 +//line sql.y:7007 { yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL - case 1409: + case 1412: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6995 +//line sql.y:7011 { yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL - case 1410: + case 1413: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6999 +//line sql.y:7015 { yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL - case 1411: + case 1414: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7003 +//line sql.y:7019 { yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL - case 1412: + case 1415: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7007 +//line sql.y:7023 { yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL - case 1413: + case 1416: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7011 +//line sql.y:7027 { yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL - case 1414: + case 1417: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7015 +//line sql.y:7031 { yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL - case 1415: + case 1418: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7019 +//line sql.y:7035 { yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL - case 1416: + case 1419: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7023 +//line sql.y:7039 { yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL - case 1417: + case 1420: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7029 +//line sql.y:7045 { yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL - case 1418: + case 1421: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7033 +//line sql.y:7049 { yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL - case 1419: + case 1422: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7037 +//line sql.y:7053 { yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL - case 1420: + case 1423: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7041 +//line sql.y:7057 { yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL - case 1421: + case 1424: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7045 +//line sql.y:7061 { yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL - case 1422: + case 1425: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7049 +//line sql.y:7065 { yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL - case 1423: + case 1426: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7053 +//line sql.y:7069 { yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL - case 1424: + case 1427: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7057 +//line sql.y:7073 { yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL - case 1425: + case 1428: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7061 +//line sql.y:7077 { yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL - case 1426: + case 1429: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7065 +//line sql.y:7081 { yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL - case 1427: + case 1430: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7069 +//line sql.y:7085 { yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL - case 1428: + case 1431: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7073 +//line sql.y:7089 { yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL - case 1429: + case 1432: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7077 +//line sql.y:7093 { yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL - case 1430: + case 1433: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7081 +//line sql.y:7097 { yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL - case 1431: + case 1434: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7085 +//line sql.y:7101 { yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL - case 1432: + case 1435: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7089 +//line sql.y:7105 { yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL - case 1433: + case 1436: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7093 +//line sql.y:7109 { yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL - case 1434: + case 1437: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7097 +//line sql.y:7113 { yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL - case 1437: + case 1440: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:7107 +//line sql.y:7123 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1438: + case 1441: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:7111 +//line sql.y:7127 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1439: + case 1442: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:7115 +//line sql.y:7131 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1440: + case 1443: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7125 +//line sql.y:7141 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("if"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1441: + case 1444: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7129 +//line sql.y:7145 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("database"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1442: + case 1445: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7133 +//line sql.y:7149 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("schema"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1443: + case 1446: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7137 +//line sql.y:7153 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("mod"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1444: + case 1447: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7141 +//line sql.y:7157 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("replace"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1445: + case 1448: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7147 +//line sql.y:7163 { yyLOCAL = NoOption } yyVAL.union = yyLOCAL - case 1446: + case 1449: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7151 +//line sql.y:7167 { yyLOCAL = BooleanModeOpt } yyVAL.union = yyLOCAL - case 1447: + case 1450: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7155 +//line sql.y:7171 { yyLOCAL = NaturalLanguageModeOpt } yyVAL.union = yyLOCAL - case 1448: + case 1451: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7159 +//line sql.y:7175 { yyLOCAL = NaturalLanguageModeWithQueryExpansionOpt } yyVAL.union = yyLOCAL - case 1449: + case 1452: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7163 +//line sql.y:7179 { yyLOCAL = QueryExpansionOpt } yyVAL.union = yyLOCAL - case 1450: + case 1453: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7169 +//line sql.y:7185 { yyVAL.str = string(yyDollar[1].identifierCI.String()) } - case 1451: + case 1454: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7173 +//line sql.y:7189 { yyVAL.str = string(yyDollar[1].str) } - case 1452: + case 1455: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7177 +//line sql.y:7193 { yyVAL.str = string(yyDollar[1].str) } - case 1453: + case 1456: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7183 +//line sql.y:7199 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1454: + case 1457: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7187 +//line sql.y:7203 { yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: ptr.Of(convertStringToInt(yyDollar[4].str))} } yyVAL.union = yyLOCAL - case 1455: + case 1458: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7191 +//line sql.y:7207 { yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: ptr.Of(convertStringToInt(yyDollar[4].str))} } yyVAL.union = yyLOCAL - case 1456: + case 1459: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7197 +//line sql.y:7213 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1457: + case 1460: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7201 +//line sql.y:7217 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion(), Charset: yyDollar[3].columnCharset} } yyVAL.union = yyLOCAL - case 1458: + case 1461: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7205 +//line sql.y:7221 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1459: + case 1462: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7209 +//line sql.y:7225 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1460: + case 1463: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7213 +//line sql.y:7229 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} yyLOCAL.Length = yyDollar[2].LengthScaleOption.Length yyLOCAL.Scale = yyDollar[2].LengthScaleOption.Scale } yyVAL.union = yyLOCAL - case 1461: + case 1464: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7219 +//line sql.y:7235 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1462: + case 1465: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7223 +//line sql.y:7239 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1463: + case 1466: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7227 +//line sql.y:7243 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1464: + case 1467: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7231 +//line sql.y:7247 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1465: + case 1468: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7235 +//line sql.y:7251 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1466: + case 1469: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7239 +//line sql.y:7255 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1467: + case 1470: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7243 +//line sql.y:7259 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1468: + case 1471: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7247 +//line sql.y:7263 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1469: + case 1472: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7251 +//line sql.y:7267 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1470: + case 1473: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7255 +//line sql.y:7271 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1471: + case 1474: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7261 +//line sql.y:7277 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1472: + case 1475: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7265 +//line sql.y:7281 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1473: + case 1476: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7270 +//line sql.y:7286 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1474: + case 1477: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7274 +//line sql.y:7290 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1475: + case 1478: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7279 +//line sql.y:7295 { yyVAL.str = string("") } - case 1476: + case 1479: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7283 +//line sql.y:7299 { yyVAL.str = encodeSQLString(yyDollar[2].str) } - case 1477: + case 1480: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*When -//line sql.y:7289 +//line sql.y:7305 { yyLOCAL = []*When{yyDollar[1].whenUnion()} } yyVAL.union = yyLOCAL - case 1478: + case 1481: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7293 +//line sql.y:7309 { yySLICE := (*[]*When)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].whenUnion()) } - case 1479: + case 1482: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *When -//line sql.y:7299 +//line sql.y:7315 { yyLOCAL = &When{Cond: yyDollar[2].exprUnion(), Val: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1480: + case 1483: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7304 +//line sql.y:7320 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1481: + case 1484: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7308 +//line sql.y:7324 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1482: + case 1485: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:7314 +//line sql.y:7330 { yyLOCAL = &ColName{Name: yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1483: + case 1486: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:7318 +//line sql.y:7334 { yyLOCAL = &ColName{Name: NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 1484: + case 1487: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColName -//line sql.y:7322 +//line sql.y:7338 { yyLOCAL = &ColName{Qualifier: TableName{Name: yyDollar[1].identifierCS}, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1485: + case 1488: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColName -//line sql.y:7326 +//line sql.y:7342 { yyLOCAL = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}, Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 1486: + case 1489: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7332 +//line sql.y:7348 { yyLOCAL = yyDollar[1].colNameUnion() } yyVAL.union = yyLOCAL - case 1487: + case 1490: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7336 +//line sql.y:7352 { yyLOCAL = &Offset{V: convertStringToInt(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1488: + case 1491: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7342 +//line sql.y:7358 { // TODO(sougou): Deprecate this construct. if yyDollar[1].identifierCI.Lowered() != "value" { @@ -21472,442 +21477,442 @@ yydefault: yyLOCAL = NewIntLiteral("1") } yyVAL.union = yyLOCAL - case 1489: + case 1492: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7351 +//line sql.y:7367 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1490: + case 1493: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7355 +//line sql.y:7371 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 1491: + case 1494: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *GroupBy -//line sql.y:7360 +//line sql.y:7376 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1492: + case 1495: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *GroupBy -//line sql.y:7364 +//line sql.y:7380 { yyLOCAL = &GroupBy{Exprs: yyDollar[3].exprsUnion(), WithRollup: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 1493: + case 1496: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7369 +//line sql.y:7385 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1494: + case 1497: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:7373 +//line sql.y:7389 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1495: + case 1498: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7379 +//line sql.y:7395 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1496: + case 1499: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7383 +//line sql.y:7399 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1497: + case 1500: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *NamedWindow -//line sql.y:7389 +//line sql.y:7405 { yyLOCAL = &NamedWindow{yyDollar[2].windowDefinitionsUnion()} } yyVAL.union = yyLOCAL - case 1498: + case 1501: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7395 +//line sql.y:7411 { yyLOCAL = NamedWindows{yyDollar[1].namedWindowUnion()} } yyVAL.union = yyLOCAL - case 1499: + case 1502: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7399 +//line sql.y:7415 { yySLICE := (*NamedWindows)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].namedWindowUnion()) } - case 1500: + case 1503: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7404 +//line sql.y:7420 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1501: + case 1504: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7408 +//line sql.y:7424 { yyLOCAL = yyDollar[1].namedWindowsUnion() } yyVAL.union = yyLOCAL - case 1502: + case 1505: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7413 +//line sql.y:7429 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1503: + case 1506: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7417 +//line sql.y:7433 { yyLOCAL = yyDollar[1].orderByUnion() } yyVAL.union = yyLOCAL - case 1504: + case 1507: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7423 +//line sql.y:7439 { yyLOCAL = yyDollar[3].orderByUnion() } yyVAL.union = yyLOCAL - case 1505: + case 1508: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7429 +//line sql.y:7445 { yyLOCAL = OrderBy{yyDollar[1].orderUnion()} } yyVAL.union = yyLOCAL - case 1506: + case 1509: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7433 +//line sql.y:7449 { yySLICE := (*OrderBy)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].orderUnion()) } - case 1507: + case 1510: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Order -//line sql.y:7439 +//line sql.y:7455 { yyLOCAL = &Order{Expr: yyDollar[1].exprUnion(), Direction: yyDollar[2].orderDirectionUnion()} } yyVAL.union = yyLOCAL - case 1508: + case 1511: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7444 +//line sql.y:7460 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1509: + case 1512: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7448 +//line sql.y:7464 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1510: + case 1513: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7452 +//line sql.y:7468 { yyLOCAL = DescOrder } yyVAL.union = yyLOCAL - case 1511: + case 1514: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Limit -//line sql.y:7457 +//line sql.y:7473 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1512: + case 1515: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Limit -//line sql.y:7461 +//line sql.y:7477 { yyLOCAL = yyDollar[1].limitUnion() } yyVAL.union = yyLOCAL - case 1513: + case 1516: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Limit -//line sql.y:7467 +//line sql.y:7483 { yyLOCAL = &Limit{Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1514: + case 1517: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:7471 +//line sql.y:7487 { yyLOCAL = &Limit{Offset: yyDollar[2].exprUnion(), Rowcount: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1515: + case 1518: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:7475 +//line sql.y:7491 { yyLOCAL = &Limit{Offset: yyDollar[4].exprUnion(), Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1516: + case 1519: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7480 +//line sql.y:7496 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1517: + case 1520: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7484 +//line sql.y:7500 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1518: + case 1521: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7488 +//line sql.y:7504 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1519: + case 1522: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7492 +//line sql.y:7508 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1520: + case 1523: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7496 +//line sql.y:7512 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1521: + case 1524: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7503 +//line sql.y:7519 { yyLOCAL = &LockOption{Type: DefaultType} } yyVAL.union = yyLOCAL - case 1522: + case 1525: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7507 +//line sql.y:7523 { yyLOCAL = &LockOption{Type: NoneType} } yyVAL.union = yyLOCAL - case 1523: + case 1526: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7511 +//line sql.y:7527 { yyLOCAL = &LockOption{Type: SharedType} } yyVAL.union = yyLOCAL - case 1524: + case 1527: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7515 +//line sql.y:7531 { yyLOCAL = &LockOption{Type: ExclusiveType} } yyVAL.union = yyLOCAL - case 1525: + case 1528: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7521 +//line sql.y:7537 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1526: + case 1529: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7525 +//line sql.y:7541 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1527: + case 1530: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7529 +//line sql.y:7545 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1528: + case 1531: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7533 +//line sql.y:7549 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1529: + case 1532: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7538 +//line sql.y:7554 { yyVAL.str = "" } - case 1530: + case 1533: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7542 +//line sql.y:7558 { yyVAL.str = string(yyDollar[3].str) } - case 1531: + case 1534: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7546 +//line sql.y:7562 { yyVAL.str = string(yyDollar[3].str) } - case 1532: + case 1535: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7550 +//line sql.y:7566 { yyVAL.str = string(yyDollar[3].str) } - case 1533: + case 1536: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7555 +//line sql.y:7571 { yyVAL.str = "" } - case 1534: + case 1537: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7559 +//line sql.y:7575 { yyVAL.str = yyDollar[3].str } - case 1535: + case 1538: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7565 +//line sql.y:7581 { yyVAL.str = string(yyDollar[1].str) } - case 1536: + case 1539: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7569 +//line sql.y:7585 { yyVAL.str = string(yyDollar[1].str) } - case 1537: + case 1540: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7574 +//line sql.y:7590 { yyVAL.str = "" } - case 1538: + case 1541: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:7578 +//line sql.y:7594 { yyVAL.str = yyDollar[2].str } - case 1539: + case 1542: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7583 +//line sql.y:7599 { yyVAL.str = "cascaded" } - case 1540: + case 1543: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7587 +//line sql.y:7603 { yyVAL.str = string(yyDollar[1].str) } - case 1541: + case 1544: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7591 +//line sql.y:7607 { yyVAL.str = string(yyDollar[1].str) } - case 1542: + case 1545: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Definer -//line sql.y:7596 +//line sql.y:7612 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1543: + case 1546: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:7600 +//line sql.y:7616 { yyLOCAL = yyDollar[3].definerUnion() } yyVAL.union = yyLOCAL - case 1544: + case 1547: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Definer -//line sql.y:7606 +//line sql.y:7622 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1545: + case 1548: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:7612 +//line sql.y:7628 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1546: + case 1549: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Definer -//line sql.y:7618 +//line sql.y:7634 { yyLOCAL = &Definer{ Name: yyDollar[1].str, @@ -21915,433 +21920,464 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1547: + case 1550: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7627 +//line sql.y:7643 { yyVAL.str = encodeSQLString(yyDollar[1].str) } - case 1548: + case 1551: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7631 +//line sql.y:7647 { yyVAL.str = formatIdentifier(yyDollar[1].str) } - case 1549: + case 1552: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7636 +//line sql.y:7652 { yyVAL.str = "" } - case 1550: + case 1553: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7640 +//line sql.y:7656 { yyVAL.str = formatAddress(yyDollar[1].str) } - case 1551: + case 1554: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Lock -//line sql.y:7646 +//line sql.y:7662 { yyLOCAL = ForUpdateLock } yyVAL.union = yyLOCAL - case 1552: + case 1555: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Lock -//line sql.y:7650 +//line sql.y:7666 { yyLOCAL = ForUpdateLockNoWait } yyVAL.union = yyLOCAL - case 1553: + case 1556: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7654 +//line sql.y:7670 { yyLOCAL = ForUpdateLockSkipLocked } yyVAL.union = yyLOCAL - case 1554: + case 1557: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Lock -//line sql.y:7658 +//line sql.y:7674 { yyLOCAL = ForShareLock } yyVAL.union = yyLOCAL - case 1555: + case 1558: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Lock -//line sql.y:7662 +//line sql.y:7678 { yyLOCAL = ForShareLockNoWait } yyVAL.union = yyLOCAL - case 1556: + case 1559: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7666 +//line sql.y:7682 { yyLOCAL = ForShareLockSkipLocked } yyVAL.union = yyLOCAL - case 1557: + case 1560: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7670 +//line sql.y:7686 { yyLOCAL = ShareModeLock } yyVAL.union = yyLOCAL - case 1558: + case 1561: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7676 +//line sql.y:7692 { yyLOCAL = &SelectInto{Type: IntoOutfileS3, FileName: encodeSQLString(yyDollar[4].str), Charset: yyDollar[5].columnCharset, FormatOption: yyDollar[6].str, ExportOption: yyDollar[7].str, Manifest: yyDollar[8].str, Overwrite: yyDollar[9].str} } yyVAL.union = yyLOCAL - case 1559: + case 1562: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7680 +//line sql.y:7696 { yyLOCAL = &SelectInto{Type: IntoDumpfile, FileName: encodeSQLString(yyDollar[3].str), Charset: ColumnCharset{}, FormatOption: "", ExportOption: "", Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1560: + case 1563: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7684 +//line sql.y:7700 { yyLOCAL = &SelectInto{Type: IntoOutfile, FileName: encodeSQLString(yyDollar[3].str), Charset: yyDollar[4].columnCharset, FormatOption: "", ExportOption: yyDollar[5].str, Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1561: + case 1564: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7689 +//line sql.y:7705 { yyVAL.str = "" } - case 1562: + case 1565: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7693 +//line sql.y:7709 { yyVAL.str = " format csv" + yyDollar[3].str } - case 1563: + case 1566: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7697 +//line sql.y:7713 { yyVAL.str = " format text" + yyDollar[3].str } - case 1564: + case 1567: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7702 +//line sql.y:7718 { yyVAL.str = "" } - case 1565: + case 1568: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7706 +//line sql.y:7722 { yyVAL.str = " header" } - case 1566: + case 1569: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7711 +//line sql.y:7727 { yyVAL.str = "" } - case 1567: + case 1570: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7715 +//line sql.y:7731 { yyVAL.str = " manifest on" } - case 1568: + case 1571: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7719 +//line sql.y:7735 { yyVAL.str = " manifest off" } - case 1569: + case 1572: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7724 +//line sql.y:7740 { yyVAL.str = "" } - case 1570: + case 1573: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7728 +//line sql.y:7744 { yyVAL.str = " overwrite on" } - case 1571: + case 1574: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7732 +//line sql.y:7748 { yyVAL.str = " overwrite off" } - case 1572: + case 1575: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7738 +//line sql.y:7754 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1573: + case 1576: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7743 +//line sql.y:7759 { yyVAL.str = "" } - case 1574: + case 1577: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7747 +//line sql.y:7763 { yyVAL.str = " lines" + yyDollar[2].str } - case 1575: + case 1578: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7753 +//line sql.y:7769 { yyVAL.str = yyDollar[1].str } - case 1576: + case 1579: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7757 +//line sql.y:7773 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1577: + case 1580: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7763 +//line sql.y:7779 { yyVAL.str = " starting by " + encodeSQLString(yyDollar[3].str) } - case 1578: + case 1581: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7767 +//line sql.y:7783 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1579: + case 1582: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7772 +//line sql.y:7788 { yyVAL.str = "" } - case 1580: + case 1583: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7776 +//line sql.y:7792 { yyVAL.str = " " + yyDollar[1].str + yyDollar[2].str } - case 1581: + case 1584: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7782 +//line sql.y:7798 { yyVAL.str = yyDollar[1].str } - case 1582: + case 1585: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7786 +//line sql.y:7802 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1583: + case 1586: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7792 +//line sql.y:7808 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1584: + case 1587: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:7796 +//line sql.y:7812 { yyVAL.str = yyDollar[1].str + " enclosed by " + encodeSQLString(yyDollar[4].str) } - case 1585: + case 1588: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7800 +//line sql.y:7816 { yyVAL.str = " escaped by " + encodeSQLString(yyDollar[3].str) } - case 1586: + case 1589: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7805 +//line sql.y:7821 { yyVAL.str = "" } - case 1587: + case 1590: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7809 +//line sql.y:7825 { yyVAL.str = " optionally" } - case 1588: + case 1591: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Insert -//line sql.y:7822 +//line sql.y:7838 { yyLOCAL = &Insert{Rows: yyDollar[2].valuesUnion(), RowAlias: yyDollar[3].rowAliasUnion()} } yyVAL.union = yyLOCAL - case 1589: + case 1592: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Insert -//line sql.y:7826 +//line sql.y:7842 { - yyLOCAL = &Insert{Rows: yyDollar[1].selStmtUnion()} + yyLOCAL = &Insert{Rows: yyDollar[1].tableStmtUnion()} } yyVAL.union = yyLOCAL - case 1590: + case 1593: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *Insert -//line sql.y:7830 +//line sql.y:7846 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[5].valuesUnion(), RowAlias: yyDollar[6].rowAliasUnion()} } yyVAL.union = yyLOCAL - case 1591: + case 1594: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *Insert -//line sql.y:7834 +//line sql.y:7850 { yyLOCAL = &Insert{Columns: []IdentifierCI{}, Rows: yyDollar[4].valuesUnion(), RowAlias: yyDollar[5].rowAliasUnion()} } yyVAL.union = yyLOCAL - case 1592: + case 1595: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7838 +//line sql.y:7854 { - yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[4].selStmtUnion()} + yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[4].tableStmtUnion()} } yyVAL.union = yyLOCAL - case 1593: + case 1596: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:7844 +//line sql.y:7860 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1594: + case 1597: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:7848 +//line sql.y:7864 { yyLOCAL = Columns{yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1595: + case 1598: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7852 +//line sql.y:7868 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 1596: + case 1599: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:7856 +//line sql.y:7872 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[5].identifierCI) } - case 1597: + case 1600: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *RowAlias -//line sql.y:7861 +//line sql.y:7877 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1598: + case 1601: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *RowAlias -//line sql.y:7865 +//line sql.y:7881 { yyLOCAL = &RowAlias{TableName: yyDollar[2].identifierCS} } yyVAL.union = yyLOCAL - case 1599: + case 1602: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *RowAlias -//line sql.y:7869 +//line sql.y:7885 { yyLOCAL = &RowAlias{TableName: yyDollar[2].identifierCS, Columns: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 1600: + case 1603: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7874 +//line sql.y:7890 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1601: + case 1604: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7878 +//line sql.y:7894 { yyLOCAL = yyDollar[5].updateExprsUnion() } yyVAL.union = yyLOCAL - case 1602: + case 1605: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Values -//line sql.y:7884 +//line sql.y:7900 { yyLOCAL = Values{yyDollar[1].valTupleUnion()} } yyVAL.union = yyLOCAL - case 1603: + case 1606: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7888 +//line sql.y:7904 { yySLICE := (*Values)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) } - case 1604: + case 1607: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL Values +//line sql.y:7910 + { + yyLOCAL = Values{yyDollar[1].valTupleUnion()} + } + yyVAL.union = yyLOCAL + case 1608: + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:7914 + { + yySLICE := (*Values)(yyIaddr(yyVAL.union)) + *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) + } + case 1609: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7894 +//line sql.y:7920 { yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL - case 1605: + case 1610: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL ValTuple +//line sql.y:7924 + { + yyLOCAL = ValTuple{} + } + yyVAL.union = yyLOCAL + case 1611: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL ValTuple +//line sql.y:7930 + { + yyLOCAL = yyDollar[1].valTupleUnion() + } + yyVAL.union = yyLOCAL + case 1612: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7898 +//line sql.y:7934 { yyLOCAL = ValTuple{} } yyVAL.union = yyLOCAL - case 1606: + case 1613: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7904 +//line sql.y:7940 { yyLOCAL = ValTuple(yyDollar[2].exprsUnion()) } yyVAL.union = yyLOCAL - case 1607: + case 1614: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7908 +//line sql.y:7946 { yyLOCAL = ValTuple(yyDollar[3].exprsUnion()) } yyVAL.union = yyLOCAL - case 1608: + case 1617: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7913 +//line sql.y:7956 { if len(yyDollar[1].valTupleUnion()) == 1 { yyLOCAL = yyDollar[1].valTupleUnion()[0] @@ -22350,300 +22386,300 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1609: + case 1618: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7923 +//line sql.y:7966 { yyLOCAL = UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL - case 1610: + case 1619: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7927 +//line sql.y:7970 { yySLICE := (*UpdateExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].updateExprUnion()) } - case 1611: + case 1620: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *UpdateExpr -//line sql.y:7933 +//line sql.y:7976 { yyLOCAL = &UpdateExpr{Name: yyDollar[1].colNameUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1613: + case 1622: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7940 +//line sql.y:7983 { yyVAL.str = "charset" } - case 1616: + case 1625: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7950 +//line sql.y:7993 { yyLOCAL = NewStrLiteral(yyDollar[1].identifierCI.String()) } yyVAL.union = yyLOCAL - case 1617: + case 1626: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7954 +//line sql.y:7997 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1618: + case 1627: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7958 +//line sql.y:8001 { yyLOCAL = &Default{} } yyVAL.union = yyLOCAL - case 1621: + case 1630: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7967 +//line sql.y:8010 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1622: + case 1631: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7969 +//line sql.y:8012 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1623: + case 1632: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7972 +//line sql.y:8015 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1624: + case 1633: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:7974 +//line sql.y:8017 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1625: + case 1634: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7977 +//line sql.y:8020 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1626: + case 1635: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line sql.y:7979 +//line sql.y:8022 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1627: + case 1636: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Ignore -//line sql.y:7982 +//line sql.y:8025 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1628: + case 1637: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Ignore -//line sql.y:7984 +//line sql.y:8027 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1629: + case 1638: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7987 +//line sql.y:8030 { yyVAL.empty = struct{}{} } - case 1630: + case 1639: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7989 +//line sql.y:8032 { yyVAL.empty = struct{}{} } - case 1631: + case 1640: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7991 +//line sql.y:8034 { yyVAL.empty = struct{}{} } - case 1632: + case 1641: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:7995 +//line sql.y:8038 { yyLOCAL = &CallProc{Name: yyDollar[2].tableName, Params: yyDollar[4].exprsUnion()} } yyVAL.union = yyLOCAL - case 1633: + case 1642: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:8000 +//line sql.y:8043 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1634: + case 1643: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:8004 +//line sql.y:8047 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 1635: + case 1644: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:8009 +//line sql.y:8052 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1636: + case 1645: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:8011 +//line sql.y:8054 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL - case 1637: + case 1646: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:8015 +//line sql.y:8058 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), String: string(yyDollar[2].identifierCI.String())} } yyVAL.union = yyLOCAL - case 1638: + case 1647: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8021 +//line sql.y:8064 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1639: + case 1648: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8025 +//line sql.y:8068 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 1641: + case 1650: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8032 +//line sql.y:8075 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 1642: + case 1651: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8038 +//line sql.y:8081 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1643: + case 1652: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8042 +//line sql.y:8085 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1644: + case 1653: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8048 +//line sql.y:8091 { yyVAL.identifierCS = NewIdentifierCS("") } - case 1645: + case 1654: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8052 +//line sql.y:8095 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 1647: + case 1656: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8059 +//line sql.y:8102 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1648: + case 1657: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:8065 +//line sql.y:8108 { yyLOCAL = &Kill{Type: yyDollar[2].killTypeUnion(), ProcesslistID: convertStringToUInt64(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 1649: + case 1658: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL KillType -//line sql.y:8071 +//line sql.y:8114 { yyLOCAL = ConnectionType } yyVAL.union = yyLOCAL - case 1650: + case 1659: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL KillType -//line sql.y:8075 +//line sql.y:8118 { yyLOCAL = ConnectionType } yyVAL.union = yyLOCAL - case 1651: + case 1660: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL KillType -//line sql.y:8079 +//line sql.y:8122 { yyLOCAL = QueryType } yyVAL.union = yyLOCAL - case 2283: + case 2296: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8739 +//line sql.y:8786 { } - case 2284: + case 2297: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8744 +//line sql.y:8791 { } - case 2285: + case 2298: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8748 +//line sql.y:8795 { skipToEnd(yylex) } - case 2286: + case 2299: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8753 +//line sql.y:8800 { skipToEnd(yylex) } - case 2287: + case 2300: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8757 +//line sql.y:8804 { skipToEnd(yylex) } - case 2288: + case 2301: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8761 +//line sql.y:8808 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index bf1a793e7e8..b6835ad32a5 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -60,14 +60,15 @@ func markBindVariable(yylex yyLexer, bvar string) { } %union { - statement Statement - selStmt SelectStatement - tableExpr TableExpr - expr Expr - colTuple ColTuple - optVal Expr - constraintInfo ConstraintInfo - alterOption AlterOption + statement Statement + selStmt SelectStatement + tableStmt TableStatement + tableExpr TableExpr + expr Expr + colTuple ColTuple + optVal Expr + constraintInfo ConstraintInfo + alterOption AlterOption ins *Insert colName *ColName @@ -401,6 +402,7 @@ func markBindVariable(yylex yyLexer, bvar string) { %token NESTED NETWORK_NAMESPACE NOWAIT NULLS OJ OLD OPTIONAL ORDINALITY ORGANIZATION OTHERS PARTIAL PATH PERSIST PERSIST_ONLY PRECEDING PRIVILEGE_CHECKS_USER PROCESS %token RANDOM REFERENCE REQUIRE_ROW_FORMAT RESOURCE RESPECT RESTART RETAIN REUSE ROLE SECONDARY SECONDARY_ENGINE SECONDARY_ENGINE_ATTRIBUTE SECONDARY_LOAD SECONDARY_UNLOAD SIMPLE SKIP SRID %token THREAD_PRIORITY TIES UNBOUNDED VCPU VISIBLE RETURNING +%token MANUAL PARALLEL QUALIFY TABLESAMPLE // Performance Schema Functions %token FORMAT_BYTES FORMAT_PICO_TIME PS_CURRENT_THREAD_ID PS_THREAD_ID @@ -434,7 +436,7 @@ func markBindVariable(yylex yyLexer, bvar string) { %type prepare_statement execute_statement deallocate_statement %type stream_statement vstream_statement insert_statement update_statement delete_statement set_statement set_transaction_statement %type create_statement alter_statement rename_statement drop_statement truncate_statement flush_statement do_statement -%type select_statement select_stmt_with_into query_expression_parens query_expression query_expression_body query_primary +%type select_statement select_stmt_with_into query_expression_parens query_expression query_expression_body query_primary values_statement %type with_clause_opt with_clause %type common_table_expr %type with_list @@ -517,8 +519,8 @@ func markBindVariable(yylex yyLexer, bvar string) { %type is_suffix %type col_tuple %type expression_list expression_list_opt window_partition_clause_opt -%type tuple_list -%type row_tuple tuple_or_empty +%type row_tuple_list val_tuple_list +%type val_tuple row_tuple val_tuple_or_empty row_tuple_or_empty val_or_row_tuple %type subquery %type derived_table %type column_name after_opt @@ -769,7 +771,7 @@ query_expression_parens: } | openb query_expression locking_clause closeb { - setLockInSelect($2, $3) + setLockIfPossible(yylex, $2, $3) $$ = $2 } @@ -810,9 +812,9 @@ query_expression: | with_clause query_expression_body order_by_opt limit_opt { $2.SetWith($1) - $2.SetOrderBy($3) - $2.SetLimit($4) - $$ = $2 + $2.SetOrderBy($3) + $2.SetLimit($4) + $$ = $2 } | with_clause query_expression_parens limit_clause { @@ -865,7 +867,7 @@ query_expression } | query_expression locking_clause { - setLockInSelect($1, $2) + setLockIfPossible(yylex, $1, $2) $$ = $1 } | query_expression_parens @@ -884,27 +886,37 @@ select_stmt_with_into: } | query_expression into_clause { - $1.SetInto($2) + setIntoIfPossible(yylex, $1, $2) $$ = $1 } | query_expression into_clause locking_clause { - $1.SetInto($2) - $1.SetLock($3) + setIntoIfPossible(yylex, $1, $2) + setLockIfPossible(yylex, $1, $3) $$ = $1 } | query_expression locking_clause into_clause { - $1.SetInto($3) - $1.SetLock($2) + setLockIfPossible(yylex, $1, $2) + setIntoIfPossible(yylex, $1, $3) $$ = $1 } | query_expression_parens into_clause { - $1.SetInto($2) + setIntoIfPossible(yylex, $1, $2) $$ = $1 } +values_statement: + VALUES comment_opt LIST_ARG + { + $$ = &ValuesStatement{Comments: Comments($2).Parsed(), ListArg: ListArg($3[2:])} + } +| VALUES comment_opt row_tuple_list + { + $$ = &ValuesStatement{Comments: Comments($2).Parsed(), Rows: $3} + } + stream_statement: STREAM comment_opt select_expression FROM table_name { @@ -928,6 +940,10 @@ query_primary: { $$ = NewSelect(Comments($2), $4/*SelectExprs*/, $3/*options*/, nil, $5/*from*/, NewWhere(WhereClause, $6), $7, NewWhere(HavingClause, $8), $9) } +| values_statement + { + $$ = $1 + } insert_statement: insert_or_replace comment_opt ignore_opt into_table_name opt_partition_clause insert_data on_dup_opt @@ -3871,7 +3887,7 @@ subpartition_definition_attribute_list_opt: } partition_value_range: - VALUES LESS THAN row_tuple + VALUES LESS THAN val_tuple { $$ = &PartitionValueRange{ Type: LessThanType, @@ -3885,7 +3901,7 @@ partition_value_range: Maxvalue: true, } } -| VALUES IN row_tuple +| VALUES IN val_tuple { $$ = &PartitionValueRange{ Type: InType, @@ -5918,7 +5934,7 @@ any_all_compare: } col_tuple: - row_tuple + val_tuple { $$ = $1 } @@ -7818,7 +7834,7 @@ optionally_opt: // Because the rules are together, the parser can keep shifting // the tokens until it disambiguates a as sql_id and select as keyword. insert_data: - VALUES tuple_list row_alias_opt + VALUES val_tuple_list row_alias_opt { $$ = &Insert{Rows: $2, RowAlias: $3} } @@ -7826,11 +7842,11 @@ insert_data: { $$ = &Insert{Rows: $1} } -| openb ins_column_list closeb VALUES tuple_list row_alias_opt +| openb ins_column_list closeb VALUES val_tuple_list row_alias_opt { $$ = &Insert{Columns: $2, Rows: $5, RowAlias: $6} } -| openb closeb VALUES tuple_list row_alias_opt +| openb closeb VALUES val_tuple_list row_alias_opt { $$ = &Insert{Columns: []IdentifierCI{}, Rows: $4, RowAlias: $5} } @@ -7879,37 +7895,64 @@ on_dup_opt: $$ = $5 } -tuple_list: - tuple_or_empty +row_tuple_list: + row_tuple_or_empty { $$ = Values{$1} } -| tuple_list ',' tuple_or_empty +| row_tuple_list ',' row_tuple_or_empty { $$ = append($1, $3) } -tuple_or_empty: +val_tuple_list: + val_tuple_or_empty + { + $$ = Values{$1} + } +| val_tuple_list ',' val_tuple_or_empty + { + $$ = append($1, $3) + } + +row_tuple_or_empty: row_tuple { $$ = $1 } +| ROW openb closeb + { + $$ = ValTuple{} + } + +val_tuple_or_empty: + val_tuple + { + $$ = $1 + } | openb closeb { $$ = ValTuple{} } -row_tuple: +val_tuple: openb expression_list closeb { $$ = ValTuple($2) } -| ROW openb expression_list closeb + +row_tuple: + ROW openb expression_list closeb { $$ = ValTuple($3) } + +val_or_row_tuple: + val_tuple +| row_tuple + tuple_expression: - row_tuple + val_or_row_tuple { if len($1) == 1 { $$ = $1[0] @@ -8443,6 +8486,7 @@ non_reserved_keyword: | LONGBLOB | LONGTEXT | LTRIM %prec FUNCTION_CALL_NON_KEYWORD +| MANUAL | MANIFEST | MASTER_COMPRESSION_ALGORITHMS | MASTER_PUBLIC_KEY_PATH @@ -8488,6 +8532,7 @@ non_reserved_keyword: | OTHERS | OVERWRITE | PACK_KEYS +| PARALLEL | PARSER | PARTIAL | PARTITIONING @@ -8511,6 +8556,7 @@ non_reserved_keyword: | PROCEDURE | PROCESSLIST | PURGE +| QUALIFY | QUERIES | QUERY | RANDOM @@ -8638,6 +8684,7 @@ non_reserved_keyword: | SUBPARTITIONS | SUM %prec FUNCTION_CALL_NON_KEYWORD | TABLES +| TABLESAMPLE | TABLESPACE | TEMPORARY | TEMPTABLE diff --git a/go/vt/sqlparser/testdata/mysql_keywords.txt b/go/vt/sqlparser/testdata/mysql_keywords.txt index 9e5c6eab6d8..dc24fe94c0a 100644 --- a/go/vt/sqlparser/testdata/mysql_keywords.txt +++ b/go/vt/sqlparser/testdata/mysql_keywords.txt @@ -1,5 +1,5 @@ // Code generated by `SELECT * FROM INFORMATION_SCHEMA.KEYWORDS`. -// Reference: https://dev.mysql.com/doc/refman/8.0/en/information-schema-keywords-table.html +// Reference: https://dev.mysql.com/doc/refman/8.4/en/information-schema-keywords-table.html // DO NOT EDIT. WORD RESERVED ACCESSIBLE 1 @@ -23,8 +23,11 @@ AS 1 ASC 1 ASCII 0 ASENSITIVE 1 +ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 0 AT 0 ATTRIBUTE 0 +AUTHENTICATION 0 +AUTO 0 AUTOEXTEND_SIZE 0 AUTO_INCREMENT 0 AVG 0 @@ -32,6 +35,7 @@ AVG_ROW_LENGTH 0 BACKUP 0 BEFORE 1 BEGIN 0 +BERNOULLI 0 BETWEEN 1 BIGINT 1 BINARY 1 @@ -44,6 +48,7 @@ BOOLEAN 0 BOTH 1 BTREE 0 BUCKETS 0 +BULK 0 BY 1 BYTE 0 CACHE 0 @@ -53,6 +58,7 @@ CASCADED 0 CASE 1 CATALOG_NAME 0 CHAIN 0 +CHALLENGE_RESPONSE 0 CHANGE 1 CHANGED 0 CHANNEL 0 @@ -181,6 +187,7 @@ EXPLAIN 1 EXPORT 0 EXTENDED 0 EXTENT_SIZE 0 +FACTOR 0 FAILED_LOGIN_ATTEMPTS 0 FALSE 1 FAST 0 @@ -190,6 +197,7 @@ FIELDS 0 FILE 0 FILE_BLOCK_SIZE 0 FILTER 0 +FINISH 0 FIRST 0 FIRST_VALUE 1 FIXED 0 @@ -209,6 +217,7 @@ FULL 0 FULLTEXT 1 FUNCTION 1 GENERAL 0 +GENERATE 0 GENERATED 1 GEOMCOLLECTION 0 GEOMETRY 0 @@ -216,6 +225,7 @@ GEOMETRYCOLLECTION 0 GET 1 GET_FORMAT 0 GET_MASTER_PUBLIC_KEY 0 +GET_SOURCE_PUBLIC_KEY 0 GLOBAL 0 GRANT 1 GRANTS 0 @@ -223,6 +233,8 @@ GROUP 1 GROUPING 1 GROUPS 1 GROUP_REPLICATION 0 +GTIDS 0 +GTID_ONLY 0 HANDLER 0 HASH 0 HAVING 1 @@ -246,7 +258,9 @@ INACTIVE 0 INDEX 1 INDEXES 0 INFILE 1 +INITIAL 0 INITIAL_SIZE 0 +INITIATE 0 INNER 1 INOUT 1 INSENSITIVE 1 @@ -261,6 +275,7 @@ INT3 1 INT4 1 INT8 1 INTEGER 1 +INTERSECT 1 INTERVAL 1 INTO 1 INVISIBLE 0 @@ -279,6 +294,7 @@ JSON 0 JSON_TABLE 1 JSON_VALUE 0 KEY 1 +KEYRING 0 KEYS 1 KEY_BLOCK_SIZE 0 KILL 1 @@ -307,6 +323,7 @@ LOCALTIMESTAMP 1 LOCK 1 LOCKED 0 LOCKS 0 +LOG 0 LOGFILE 0 LOGS 0 LONG 1 @@ -314,6 +331,7 @@ LONGBLOB 1 LONGTEXT 1 LOOP 1 LOW_PRIORITY 1 +MANUAL 0 MASTER 0 MASTER_AUTO_POSITION 0 MASTER_BIND 1 @@ -428,7 +446,9 @@ OVER 1 OWNER 0 PACK_KEYS 0 PAGE 0 +PARALLEL 0 PARSER 0 +PARSE_TREE 0 PARTIAL 0 PARTITION 1 PARTITIONING 0 @@ -462,6 +482,7 @@ PROFILE 0 PROFILES 0 PROXY 0 PURGE 1 +QUALIFY 0 QUARTER 0 QUERY 0 QUICK 0 @@ -481,6 +502,7 @@ REDUNDANT 0 REFERENCE 0 REFERENCES 1 REGEXP 1 +REGISTRATION 0 RELAY 0 RELAYLOG 0 RELAY_LOG_FILE 0 @@ -537,6 +559,7 @@ ROW_COUNT 0 ROW_FORMAT 0 ROW_NUMBER 1 RTREE 0 +S3 0 SAVEPOINT 0 SCHEDULE 0 SCHEMA 1 @@ -574,7 +597,33 @@ SOME 0 SONAME 0 SOUNDS 0 SOURCE 0 +SOURCE_AUTO_POSITION 0 +SOURCE_BIND 0 +SOURCE_COMPRESSION_ALGORITHMS 0 SOURCE_CONNECTION_AUTO_FAILOVER 0 +SOURCE_CONNECT_RETRY 0 +SOURCE_DELAY 0 +SOURCE_HEARTBEAT_PERIOD 0 +SOURCE_HOST 0 +SOURCE_LOG_FILE 0 +SOURCE_LOG_POS 0 +SOURCE_PASSWORD 0 +SOURCE_PORT 0 +SOURCE_PUBLIC_KEY_PATH 0 +SOURCE_RETRY_COUNT 0 +SOURCE_SSL 0 +SOURCE_SSL_CA 0 +SOURCE_SSL_CAPATH 0 +SOURCE_SSL_CERT 0 +SOURCE_SSL_CIPHER 0 +SOURCE_SSL_CRL 0 +SOURCE_SSL_CRLPATH 0 +SOURCE_SSL_KEY 0 +SOURCE_SSL_VERIFY_SERVER_CERT 0 +SOURCE_TLS_CIPHERSUITES 0 +SOURCE_TLS_VERSION 0 +SOURCE_USER 0 +SOURCE_ZSTD_COMPRESSION_LEVEL 0 SPATIAL 1 SPECIFIC 1 SQL 1 @@ -625,6 +674,7 @@ SWITCHES 0 SYSTEM 1 TABLE 1 TABLES 0 +TABLESAMPLE 0 TABLESPACE 0 TABLE_CHECKSUM 0 TABLE_NAME 0 @@ -665,10 +715,12 @@ UNION 1 UNIQUE 1 UNKNOWN 0 UNLOCK 1 +UNREGISTER 0 UNSIGNED 1 UNTIL 0 UPDATE 1 UPGRADE 0 +URL 0 USAGE 1 USE 1 USER 0 diff --git a/go/vt/topo/tablet.go b/go/vt/topo/tablet.go index 10ba787a3c1..f2c9ab81d67 100644 --- a/go/vt/topo/tablet.go +++ b/go/vt/topo/tablet.go @@ -492,6 +492,9 @@ func (ts *Server) GetTabletMap(ctx context.Context, tabletAliases []*topodatapb. ) for _, tabletAlias := range tabletAliases { + if tabletAlias == nil { + return nil, vterrors.Errorf(vtrpc.Code_INVALID_ARGUMENT, "nil tablet alias in list") + } wg.Add(1) go func(tabletAlias *topodatapb.TabletAlias) { defer wg.Done() diff --git a/go/vt/vitessdriver/convert.go b/go/vt/vitessdriver/convert.go index aa8bcedc7ee..c5141d1c890 100644 --- a/go/vt/vitessdriver/convert.go +++ b/go/vt/vitessdriver/convert.go @@ -18,9 +18,11 @@ package vitessdriver import ( "database/sql/driver" + "errors" "fmt" "time" + "vitess.io/vitess/go/mysql/datetime" "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" @@ -43,8 +45,10 @@ func (cv *converter) ToNative(v sqltypes.Value) (any, error) { return v.ToUint64() case v.IsFloat(): return v.ToFloat64() - case v.Type() == sqltypes.Datetime, v.Type() == sqltypes.Timestamp, v.Type() == sqltypes.Date: - return v.ToTimeInLocation(cv.location) + case v.Type() == sqltypes.Datetime, v.Type() == sqltypes.Timestamp: + return cv.datetimeToTime(v) + case v.Type() == sqltypes.Date: + return cv.dateToTime(v) case v.IsQuoted() || v.Type() == sqltypes.Bit || v.Type() == sqltypes.Decimal: out, err = v.ToBytes() case v.Type() == sqltypes.Expression: @@ -53,6 +57,56 @@ func (cv *converter) ToNative(v sqltypes.Value) (any, error) { return out, err } +// ErrInvalidTime is returned when we fail to parse a datetime +// string from MySQL. This should never happen unless things are +// seriously messed up. +var ErrInvalidTime = errors.New("invalid MySQL time string") + +func (cv *converter) datetimeToTime(v sqltypes.Value) (time.Time, error) { + if v.IsNull() { + return time.Time{}, nil + } + // Valid format string offsets for a DATETIME + // |DATETIME |19+ + // |------------------|------| + // "2006-01-02 15:04:05.999999" + dt, _, ok := datetime.ParseDateTime(v.ToString(), -1) + if !ok { + return time.Time{}, ErrInvalidTime + } + if dt.IsZero() { + return time.Time{}, nil + } + loc := cv.location + if loc == nil { + loc = time.UTC + } + return time.Date(dt.Date.Year(), time.Month(dt.Date.Month()), dt.Date.Day(), + dt.Time.Hour(), dt.Time.Minute(), dt.Time.Second(), dt.Time.Nanosecond(), loc), nil +} + +func (cv *converter) dateToTime(v sqltypes.Value) (time.Time, error) { + if v.IsNull() { + return time.Time{}, nil + } + // Valid format string offsets for a DATE + // |DATE |10 + // |---------| + // "2006-01-02 00:00:00.000000" + d, ok := datetime.ParseDate(v.ToString()) + if !ok { + return time.Time{}, ErrInvalidTime + } + if d.IsZero() { + return time.Time{}, nil + } + loc := cv.location + if loc == nil { + loc = time.UTC + } + return time.Date(d.Year(), time.Month(d.Month()), d.Day(), 0, 0, 0, 0, loc), nil +} + func (cv *converter) BuildBindVariable(v any) (*querypb.BindVariable, error) { if t, ok := v.(time.Time); ok { return sqltypes.ValueBindVariable(NewDatetime(t, cv.location)), nil diff --git a/go/vt/vtctl/grpcvtctldclient/client_gen.go b/go/vt/vtctl/grpcvtctldclient/client_gen.go index c2da0e97c54..415c737ace8 100644 --- a/go/vt/vtctl/grpcvtctldclient/client_gen.go +++ b/go/vt/vtctl/grpcvtctldclient/client_gen.go @@ -173,6 +173,15 @@ func (client *gRPCVtctldClient) ConcludeTransaction(ctx context.Context, in *vtc return client.c.ConcludeTransaction(ctx, in, opts...) } +// CopySchemaShard is part of the vtctlservicepb.VtctldClient interface. +func (client *gRPCVtctldClient) CopySchemaShard(ctx context.Context, in *vtctldatapb.CopySchemaShardRequest, opts ...grpc.CallOption) (*vtctldatapb.CopySchemaShardResponse, error) { + if client.c == nil { + return nil, status.Error(codes.Unavailable, connClosedMsg) + } + + return client.c.CopySchemaShard(ctx, in, opts...) +} + // CreateKeyspace is part of the vtctlservicepb.VtctldClient interface. func (client *gRPCVtctldClient) CreateKeyspace(ctx context.Context, in *vtctldatapb.CreateKeyspaceRequest, opts ...grpc.CallOption) (*vtctldatapb.CreateKeyspaceResponse, error) { if client.c == nil { @@ -1046,6 +1055,15 @@ func (client *gRPCVtctldClient) ValidateKeyspace(ctx context.Context, in *vtctld return client.c.ValidateKeyspace(ctx, in, opts...) } +// ValidatePermissionsKeyspace is part of the vtctlservicepb.VtctldClient interface. +func (client *gRPCVtctldClient) ValidatePermissionsKeyspace(ctx context.Context, in *vtctldatapb.ValidatePermissionsKeyspaceRequest, opts ...grpc.CallOption) (*vtctldatapb.ValidatePermissionsKeyspaceResponse, error) { + if client.c == nil { + return nil, status.Error(codes.Unavailable, connClosedMsg) + } + + return client.c.ValidatePermissionsKeyspace(ctx, in, opts...) +} + // ValidateSchemaKeyspace is part of the vtctlservicepb.VtctldClient interface. func (client *gRPCVtctldClient) ValidateSchemaKeyspace(ctx context.Context, in *vtctldatapb.ValidateSchemaKeyspaceRequest, opts ...grpc.CallOption) (*vtctldatapb.ValidateSchemaKeyspaceResponse, error) { if client.c == nil { diff --git a/go/vt/vtctl/grpcvtctldserver/server.go b/go/vt/vtctl/grpcvtctldserver/server.go index 706e0bec92a..a3d822ce002 100644 --- a/go/vt/vtctl/grpcvtctldserver/server.go +++ b/go/vt/vtctl/grpcvtctldserver/server.go @@ -871,6 +871,28 @@ func (s *VtctldServer) CompleteSchemaMigration(ctx context.Context, req *vtctlda return resp, nil } +// CopySchemaShard is part of the vtctlservicepb.VtctldServer interface. +func (s *VtctldServer) CopySchemaShard(ctx context.Context, req *vtctldatapb.CopySchemaShardRequest) (resp *vtctldatapb.CopySchemaShardResponse, err error) { + span, ctx := trace.NewSpan(ctx, "VtctldServer.CompleteSchemaMigration") + defer span.Finish() + + defer panicHandler(&err) + + span.Annotate("source_tablet_alias", req.SourceTabletAlias) + span.Annotate("destination_keyspace", req.DestinationKeyspace) + span.Annotate("destination_shard", req.DestinationShard) + + waitReplicasTimeout, _, err := protoutil.DurationFromProto(req.WaitReplicasTimeout) + if err != nil { + return nil, err + } + + err = s.ws.CopySchemaShard(ctx, req.SourceTabletAlias, req.Tables, req.ExcludeTables, req.IncludeViews, + req.DestinationKeyspace, req.DestinationShard, waitReplicasTimeout, req.SkipVerify) + + return &vtctldatapb.CopySchemaShardResponse{}, err +} + // CreateKeyspace is part of the vtctlservicepb.VtctldServer interface. func (s *VtctldServer) CreateKeyspace(ctx context.Context, req *vtctldatapb.CreateKeyspaceRequest) (resp *vtctldatapb.CreateKeyspaceResponse, err error) { span, ctx := trace.NewSpan(ctx, "VtctldServer.CreateKeyspace") @@ -4692,8 +4714,94 @@ func (s *VtctldServer) ValidateKeyspace(ctx context.Context, req *vtctldatapb.Va return resp, err } +// ValidatePermissionsKeyspace validates that all the permissions are the +// same in a keyspace. +func (s *VtctldServer) ValidatePermissionsKeyspace(ctx context.Context, req *vtctldatapb.ValidatePermissionsKeyspaceRequest) (resp *vtctldatapb.ValidatePermissionsKeyspaceResponse, err error) { + span, ctx := trace.NewSpan(ctx, "VtctldServer.ValidatePermissionsKeyspace") + defer span.Finish() + + defer panicHandler(&err) + + span.Annotate("keyspace", req.Keyspace) + span.Annotate("shards", req.Shards) + + var shards []string + if len(req.Shards) != 0 { + // If the user has specified a list of specific shards, we'll use that. + shards = req.Shards + } else { + // Validate all of the shards. + shards, err = s.ts.GetShardNames(ctx, req.Keyspace) + if err != nil { + return nil, err + } + } + + if len(shards) == 0 { + return nil, fmt.Errorf("no shards found in keyspace %s", req.Keyspace) + } + sort.Strings(shards) + + // Find the reference permissions using the first shard's primary. + si, err := s.ts.GetShard(ctx, req.Keyspace, shards[0]) + if err != nil { + return nil, err + } + if !si.HasPrimary() { + return nil, fmt.Errorf("no primary tablet in shard %s/%s", req.Keyspace, shards[0]) + } + referenceAlias := si.PrimaryAlias + log.Infof("Gathering permissions for reference primary %s", topoproto.TabletAliasString(referenceAlias)) + pres, err := s.GetPermissions(ctx, &vtctldatapb.GetPermissionsRequest{ + TabletAlias: si.PrimaryAlias, + }) + if err != nil { + return nil, err + } + referencePermissions := pres.Permissions + + // Then diff the first/reference tablet with all the others. + eg, egctx := errgroup.WithContext(ctx) + for _, shard := range shards { + eg.Go(func() error { + aliases, err := s.ts.FindAllTabletAliasesInShard(egctx, req.Keyspace, shard) + if err != nil { + return err + } + for _, alias := range aliases { + if topoproto.TabletAliasEqual(alias, si.PrimaryAlias) { + continue + } + log.Infof("Gathering permissions for %s", topoproto.TabletAliasString(alias)) + presp, err := s.GetPermissions(ctx, &vtctldatapb.GetPermissionsRequest{ + TabletAlias: alias, + }) + if err != nil { + return err + } + + log.Infof("Diffing permissions between %s and %s", topoproto.TabletAliasString(referenceAlias), + topoproto.TabletAliasString(alias)) + er := &concurrency.AllErrorRecorder{} + tmutils.DiffPermissions(topoproto.TabletAliasString(referenceAlias), referencePermissions, + topoproto.TabletAliasString(alias), presp.Permissions, er) + if er.HasErrors() { + return er.Error() + } + } + return nil + }) + } + if err := eg.Wait(); err != nil { + return nil, fmt.Errorf("permissions diffs: %v", err) + } + + return &vtctldatapb.ValidatePermissionsKeyspaceResponse{}, nil +} + // ValidateSchemaKeyspace is a part of the vtctlservicepb.VtctldServer interface. -// It will diff the schema from all the tablets in the keyspace. +// It will diff the schema between the tablets in all shards -- or a subset if +// any specific shards are specified -- within the keyspace. func (s *VtctldServer) ValidateSchemaKeyspace(ctx context.Context, req *vtctldatapb.ValidateSchemaKeyspaceRequest) (resp *vtctldatapb.ValidateSchemaKeyspaceResponse, err error) { span, ctx := trace.NewSpan(ctx, "VtctldServer.ValidateSchemaKeyspace") defer span.Finish() @@ -4701,17 +4809,25 @@ func (s *VtctldServer) ValidateSchemaKeyspace(ctx context.Context, req *vtctldat defer panicHandler(&err) span.Annotate("keyspace", req.Keyspace) + span.Annotate("shards", req.Shards) keyspace := req.Keyspace resp = &vtctldatapb.ValidateSchemaKeyspaceResponse{ Results: []string{}, } - shards, err := s.ts.GetShardNames(ctx, keyspace) - if err != nil { - resp.Results = append(resp.Results, fmt.Sprintf("TopologyServer.GetShardNames(%v) failed: %v", req.Keyspace, err)) - err = nil - return resp, err + var shards []string + if len(req.Shards) != 0 { + // If the user has specified a list of specific shards, we'll use that. + shards = req.Shards + } else { + // Otherwise we look at all the shards in the keyspace. + shards, err = s.ts.GetShardNames(ctx, keyspace) + if err != nil { + resp.Results = append(resp.Results, fmt.Sprintf("TopologyServer.GetShardNames(%s) failed: %v", req.Keyspace, err)) + err = nil + return resp, err + } } resp.ResultsByShard = make(map[string]*vtctldatapb.ValidateShardResponse, len(shards)) @@ -4754,7 +4870,7 @@ func (s *VtctldServer) ValidateSchemaKeyspace(ctx context.Context, req *vtctldat ) r := &tabletmanagerdatapb.GetSchemaRequest{ExcludeTables: req.ExcludeTables, IncludeViews: req.IncludeViews} - for _, shard := range shards[0:] { + for _, shard := range shards { wg.Add(1) go func(shard string) { defer wg.Done() diff --git a/go/vt/vtctl/localvtctldclient/client_gen.go b/go/vt/vtctl/localvtctldclient/client_gen.go index 6867f4768f6..fd26dc6e4b1 100644 --- a/go/vt/vtctl/localvtctldclient/client_gen.go +++ b/go/vt/vtctl/localvtctldclient/client_gen.go @@ -201,6 +201,11 @@ func (client *localVtctldClient) ConcludeTransaction(ctx context.Context, in *vt return client.s.ConcludeTransaction(ctx, in) } +// CopySchemaShard is part of the vtctlservicepb.VtctldClient interface. +func (client *localVtctldClient) CopySchemaShard(ctx context.Context, in *vtctldatapb.CopySchemaShardRequest, opts ...grpc.CallOption) (*vtctldatapb.CopySchemaShardResponse, error) { + return client.s.CopySchemaShard(ctx, in) +} + // CreateKeyspace is part of the vtctlservicepb.VtctldClient interface. func (client *localVtctldClient) CreateKeyspace(ctx context.Context, in *vtctldatapb.CreateKeyspaceRequest, opts ...grpc.CallOption) (*vtctldatapb.CreateKeyspaceResponse, error) { return client.s.CreateKeyspace(ctx, in) @@ -732,6 +737,11 @@ func (client *localVtctldClient) ValidateKeyspace(ctx context.Context, in *vtctl return client.s.ValidateKeyspace(ctx, in) } +// ValidatePermissionsKeyspace is part of the vtctlservicepb.VtctldClient interface. +func (client *localVtctldClient) ValidatePermissionsKeyspace(ctx context.Context, in *vtctldatapb.ValidatePermissionsKeyspaceRequest, opts ...grpc.CallOption) (*vtctldatapb.ValidatePermissionsKeyspaceResponse, error) { + return client.s.ValidatePermissionsKeyspace(ctx, in) +} + // ValidateSchemaKeyspace is part of the vtctlservicepb.VtctldClient interface. func (client *localVtctldClient) ValidateSchemaKeyspace(ctx context.Context, in *vtctldatapb.ValidateSchemaKeyspaceRequest, opts ...grpc.CallOption) (*vtctldatapb.ValidateSchemaKeyspaceResponse, error) { return client.s.ValidateSchemaKeyspace(ctx, in) diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 9ad64c3d4fd..9bf7bb96a8e 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -588,7 +588,7 @@ var commands = []commandGroup{ name: "ValidateSchemaKeyspace", method: commandValidateSchemaKeyspace, params: "[--exclude_tables=''] [--include-views] [--skip-no-primary] [--include-vschema] ", - help: "Validates that the schema on the primary tablet for shard 0 matches the schema on all of the other tablets in the keyspace.", + help: "Validates that the schema on the primary tablet for the first shard matches the schema on all of the other tablets in the keyspace.", }, { name: "ApplySchema", diff --git a/go/vt/vtctl/workflow/server.go b/go/vt/vtctl/workflow/server.go index f27851275b6..0c40c0dd6d6 100644 --- a/go/vt/vtctl/workflow/server.go +++ b/go/vt/vtctl/workflow/server.go @@ -3019,7 +3019,7 @@ func (s *Server) VReplicationExec(ctx context.Context, tabletAlias *topodatapb.T } // CopySchemaShard copies the schema from a source tablet to the -// specified shard. The schema is applied directly on the primary of +// specified shard. The schema is applied directly on the primary of // the destination shard, and is propagated to the replicas through // binlogs. func (s *Server) CopySchemaShard(ctx context.Context, sourceTabletAlias *topodatapb.TabletAlias, tables, excludeTables []string, includeViews bool, destKeyspace, destShard string, waitReplicasTimeout time.Duration, skipVerify bool) error { diff --git a/go/vt/vterrors/code.go b/go/vt/vterrors/code.go index 0ca275b71fc..df19fcbd408 100644 --- a/go/vt/vterrors/code.go +++ b/go/vt/vterrors/code.go @@ -243,8 +243,15 @@ func errorWithoutState(id string, code vtrpcpb.Code, short, long string) func(ar func errorWithState(id string, code vtrpcpb.Code, state State, short, long string) func(args ...any) *VitessError { return func(args ...any) *VitessError { + var err error + if len(args) != 0 { + err = NewErrorf(code, state, id+": "+short, args...) + } else { + err = NewError(code, state, id+": "+short) + } + return &VitessError{ - Err: NewErrorf(code, state, id+": "+short, args...), + Err: err, Description: long, ID: id, State: state, diff --git a/go/vt/vtexplain/vtexplain_vtgate.go b/go/vt/vtexplain/vtexplain_vtgate.go index d45073cd006..155fe6de743 100644 --- a/go/vt/vtexplain/vtexplain_vtgate.go +++ b/go/vt/vtexplain/vtexplain_vtgate.go @@ -74,7 +74,12 @@ func (vte *VTExplain) initVtgateExecutor(ctx context.Context, ts *topo.Server, v var schemaTracker vtgate.SchemaInfo // no schema tracker for these tests queryLogBufferSize := 10 plans := theine.NewStore[vtgate.PlanCacheKey, *engine.Plan](4*1024*1024, false) - vte.vtgateExecutor = vtgate.NewExecutor(ctx, vte.env, vte.explainTopo, Cell, resolver, opts.Normalize, false, streamSize, plans, schemaTracker, false, opts.PlannerVersion, 0, vtgate.NewDynamicViperConfig()) + eConfig := vtgate.ExecutorConfig{ + Normalize: opts.Normalize, + StreamSize: streamSize, + AllowScatter: true, + } + vte.vtgateExecutor = vtgate.NewExecutor(ctx, vte.env, vte.explainTopo, Cell, resolver, eConfig, false, plans, schemaTracker, opts.PlannerVersion, vtgate.NewDynamicViperConfig()) vte.vtgateExecutor.SetQueryLogger(streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize)) return nil diff --git a/go/vt/vtexplain/vtexplain_vttablet.go b/go/vt/vtexplain/vtexplain_vttablet.go index 65cd1a96181..94697c22e91 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -621,7 +621,10 @@ func (t *explainTablet) handleSelect(query string) (*sqltypes.Result, error) { case *sqlparser.Select: selStmt = stmt case *sqlparser.Union: - selStmt = sqlparser.GetFirstSelect(stmt) + selStmt, err = sqlparser.GetFirstSelect(stmt) + if err != nil { + return nil, err + } default: return nil, fmt.Errorf("vtexplain: unsupported statement type +%v", reflect.TypeOf(stmt)) } diff --git a/go/vt/vtgate/bench_test.go b/go/vt/vtgate/bench_test.go index 5c64c7e3473..c2336662c69 100644 --- a/go/vt/vtgate/bench_test.go +++ b/go/vt/vtgate/bench_test.go @@ -80,7 +80,7 @@ func BenchmarkWithNormalizer(b *testing.B) { func BenchmarkWithoutNormalizer(b *testing.B) { vtgateInst, _, ctx := createVtgateEnv(b) - vtgateInst.executor.normalize = false + vtgateInst.executor.config.Normalize = false for i := 0; i < b.N; i++ { _, _, err := vtgateInst.Execute( diff --git a/go/vt/vtgate/engine/fake_vcursor_test.go b/go/vt/vtgate/engine/fake_vcursor_test.go index 3ac62ddffd9..03df2aaea88 100644 --- a/go/vt/vtgate/engine/fake_vcursor_test.go +++ b/go/vt/vtgate/engine/fake_vcursor_test.go @@ -164,7 +164,7 @@ func (t *noopVCursor) Environment() *vtenv.Environment { } func (t *noopVCursor) TimeZone() *time.Location { - return nil + return time.Local } func (t *noopVCursor) SQLMode() string { diff --git a/go/vt/vtgate/evalengine/fn_time.go b/go/vt/vtgate/evalengine/fn_time.go index 2d5e12f518d..322b89faafb 100644 --- a/go/vt/vtgate/evalengine/fn_time.go +++ b/go/vt/vtgate/evalengine/fn_time.go @@ -256,7 +256,7 @@ func (call *builtinNow) constant() bool { func (call *builtinSysdate) eval(env *ExpressionEnv) (eval, error) { now := SystemTime() - if tz := env.currentTimezone(); tz != nil { + if tz := env.currentTimezone(); tz != time.Local { now = now.In(tz) } return newEvalDateTime(datetime.NewDateTimeFromStd(now), int(call.prec), false), nil @@ -701,7 +701,7 @@ func (b *builtinFromUnixtime) eval(env *ExpressionEnv) (eval, error) { } t := time.Unix(sec, frac) - if tz := env.currentTimezone(); tz != nil { + if tz := env.currentTimezone(); tz != time.Local { t = t.In(tz) } diff --git a/go/vt/vtgate/executor.go b/go/vt/vtgate/executor.go index 0281e28700f..c8dfd0b6269 100644 --- a/go/vt/vtgate/executor.go +++ b/go/vt/vtgate/executor.go @@ -107,39 +107,45 @@ func init() { // Executor is the engine that executes queries by utilizing // the abilities of the underlying vttablets. -type Executor struct { - env *vtenv.Environment - serv srvtopo.Server - cell string - resolver *Resolver - scatterConn *ScatterConn - txConn *TxConn +type ( + ExecutorConfig struct { + Normalize bool + StreamSize int + // AllowScatter will fail planning if set to false and a plan contains any scatter queries + AllowScatter bool + WarmingReadsPercent int + QueryLogToFile string + } - mu sync.Mutex - vschema *vindexes.VSchema - streamSize int - vschemaStats *VSchemaStats + Executor struct { + config ExecutorConfig - plans *PlanCache - epoch atomic.Uint32 + env *vtenv.Environment + serv srvtopo.Server + cell string + resolver *Resolver + scatterConn *ScatterConn + txConn *TxConn - normalize bool + mu sync.Mutex + vschema *vindexes.VSchema + vschemaStats *VSchemaStats - vm *VSchemaManager - schemaTracker SchemaInfo + plans *PlanCache + epoch atomic.Uint32 - // allowScatter will fail planning if set to false and a plan contains any scatter queries - allowScatter bool + vm *VSchemaManager + schemaTracker SchemaInfo - // queryLogger is passed in for logging from this vtgate executor. - queryLogger *streamlog.StreamLogger[*logstats.LogStats] + // queryLogger is passed in for logging from this vtgate executor. + queryLogger *streamlog.StreamLogger[*logstats.LogStats] - warmingReadsPercent int - warmingReadsChannel chan bool + warmingReadsChannel chan bool - vConfig econtext.VCursorConfig - ddlConfig dynamicconfig.DDL -} + vConfig econtext.VCursorConfig + ddlConfig dynamicconfig.DDL + } +) var executorOnce sync.Once @@ -163,28 +169,24 @@ func NewExecutor( serv srvtopo.Server, cell string, resolver *Resolver, - normalize, warnOnShardedOnly bool, - streamSize int, + eConfig ExecutorConfig, + warnOnShardedOnly bool, plans *PlanCache, schemaTracker SchemaInfo, - noScatter bool, pv plancontext.PlannerVersion, - warmingReadsPercent int, ddlConfig dynamicconfig.DDL, ) *Executor { e := &Executor{ - env: env, - serv: serv, - cell: cell, - resolver: resolver, - scatterConn: resolver.scatterConn, - txConn: resolver.scatterConn.txConn, - normalize: normalize, - streamSize: streamSize, + config: eConfig, + env: env, + serv: serv, + cell: cell, + resolver: resolver, + scatterConn: resolver.scatterConn, + txConn: resolver.scatterConn.txConn, + schemaTracker: schemaTracker, - allowScatter: !noScatter, plans: plans, - warmingReadsPercent: warmingReadsPercent, warmingReadsChannel: make(chan bool, warmingReadsConcurrency), ddlConfig: ddlConfig, } @@ -234,7 +236,7 @@ func (e *Executor) Execute(ctx context.Context, mysqlCtx vtgateservice.MySQLConn trace.AnnotateSQL(span, sqlparser.Preview(sql)) defer span.Finish() - logStats := logstats.NewLogStats(ctx, method, sql, safeSession.GetSessionUUID(), bindVars) + logStats := logstats.NewLogStats(ctx, method, sql, safeSession.GetSessionUUID(), bindVars, streamlog.GetQueryLogConfig()) stmtType, result, err := e.execute(ctx, mysqlCtx, safeSession, sql, bindVars, logStats) logStats.Error = err if result == nil { @@ -297,7 +299,7 @@ func (e *Executor) StreamExecute( trace.AnnotateSQL(span, sqlparser.Preview(sql)) defer span.Finish() - logStats := logstats.NewLogStats(ctx, method, sql, safeSession.GetSessionUUID(), bindVars) + logStats := logstats.NewLogStats(ctx, method, sql, safeSession.GetSessionUUID(), bindVars, streamlog.GetQueryLogConfig()) srr := &streaminResultReceiver{callback: callback} var err error @@ -327,7 +329,7 @@ func (e *Executor) StreamExecute( byteCount += col.Len() } - if byteCount >= e.streamSize { + if byteCount >= e.config.StreamSize { err := callback(result) seenResults.Store(true) result = &sqltypes.Result{} @@ -1340,7 +1342,7 @@ func isValidPayloadSize(query string) bool { // Prepare executes a prepare statements. func (e *Executor) Prepare(ctx context.Context, method string, safeSession *econtext.SafeSession, sql string, bindVars map[string]*querypb.BindVariable) (fld []*querypb.Field, err error) { - logStats := logstats.NewLogStats(ctx, method, sql, safeSession.GetSessionUUID(), bindVars) + logStats := logstats.NewLogStats(ctx, method, sql, safeSession.GetSessionUUID(), bindVars, streamlog.GetQueryLogConfig()) fld, err = e.prepare(ctx, safeSession, sql, bindVars, logStats) logStats.Error = err @@ -1419,7 +1421,7 @@ func (e *Executor) initVConfig(warnOnShardedOnly bool, pv plancontext.PlannerVer DBDDLPlugin: dbDDLPlugin, - WarmingReadsPercent: e.warmingReadsPercent, + WarmingReadsPercent: e.config.WarmingReadsPercent, WarmingReadsTimeout: warmingReadsQueryTimeout, WarmingReadsChannel: e.warmingReadsChannel, } @@ -1539,7 +1541,7 @@ func (e *Executor) startVStream(ctx context.Context, rss []*srvtopo.ResolvedShar } func (e *Executor) checkThatPlanIsValid(stmt sqlparser.Statement, plan *engine.Plan) error { - if e.allowScatter || plan.Instructions == nil || sqlparser.AllowScatterDirective(stmt) { + if e.config.AllowScatter || plan.Instructions == nil || sqlparser.AllowScatterDirective(stmt) { return nil } // we go over all the primitives in the plan, searching for a route that is of SelectScatter opcode @@ -1610,7 +1612,7 @@ func (e *Executor) PlanPrepareStmt(ctx context.Context, vcursor *econtext.VCurso } // creating this log stats to not interfere with the original log stats. - lStats := logstats.NewLogStats(ctx, "prepare", query, vcursor.Session().GetSessionUUID(), nil) + lStats := logstats.NewLogStats(ctx, "prepare", query, vcursor.Session().GetSessionUUID(), nil, streamlog.GetQueryLogConfig()) plan, err := e.getPlan( ctx, vcursor, diff --git a/go/vt/vtgate/executor_dml_test.go b/go/vt/vtgate/executor_dml_test.go index 503b5e5cd8b..2846c763ae9 100644 --- a/go/vt/vtgate/executor_dml_test.go +++ b/go/vt/vtgate/executor_dml_test.go @@ -608,9 +608,8 @@ func TestUpdateComments(t *testing.T) { } func TestUpdateNormalize(t *testing.T) { - executor, sbc1, sbc2, _, ctx := createExecutorEnv(t) + executor, sbc1, sbc2, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) - executor.normalize = true session := &vtgatepb.Session{ TargetString: "@primary", } @@ -1337,7 +1336,7 @@ func TestInsertSharded(t *testing.T) { testQueryLog(t, executor, logChan, "TestExecute", "INSERT", "insert into user2(id, `name`, lastname) values (2, 'myname', 'mylastname')", 1) // insert with binary values - executor.normalize = true + executor.config.Normalize = true sbc1.Queries = nil sbc2.Queries = nil sbclookup.Queries = nil @@ -1368,8 +1367,7 @@ func TestInsertSharded(t *testing.T) { } func TestInsertNegativeValue(t *testing.T) { - executor, sbc1, sbc2, sbclookup, ctx := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, sbclookup, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -2528,9 +2526,7 @@ func TestDeleteEqualWithPrepare(t *testing.T) { } func TestUpdateLastInsertID(t *testing.T) { - executor, sbc1, _, _, ctx := createExecutorEnv(t) - - executor.normalize = true + executor, sbc1, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) sql := "update user set a = last_insert_id() where id = 1" session := &vtgatepb.Session{ diff --git a/go/vt/vtgate/executor_framework_test.go b/go/vt/vtgate/executor_framework_test.go index 43987217039..099b785b446 100644 --- a/go/vt/vtgate/executor_framework_test.go +++ b/go/vt/vtgate/executor_framework_test.go @@ -65,10 +65,6 @@ var badVSchema = ` } ` -const ( - testBufferSize = 10 -) - type DestinationAnyShardPickerFirstShard struct{} func (dp DestinationAnyShardPickerFirstShard) PickShard(shardCount int) int { @@ -130,7 +126,7 @@ func init() { vindexes.Register("keyrange_lookuper_unique", newKeyRangeLookuperUnique) } -func createExecutorEnvCallback(t testing.TB, eachShard func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn)) (executor *Executor, ctx context.Context) { +func createExecutorEnvCallback(t testing.TB, eConfig ExecutorConfig, eachShard func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn)) (executor *Executor, ctx context.Context) { var cancel context.CancelFunc ctx, cancel = context.WithCancel(context.Background()) cell := "aa" @@ -183,7 +179,7 @@ func createExecutorEnvCallback(t testing.TB, eachShard func(shard, ks string, ta // one-off queries from thrashing the cache. Disable the doorkeeper in the tests to prevent flakiness. plans := theine.NewStore[PlanCacheKey, *engine.Plan](queryPlanCacheMemory, false) - executor = NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, false, false, testBufferSize, plans, nil, false, querypb.ExecuteOptions_Gen4, 0, NewDynamicViperConfig()) + executor = NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, eConfig, false, plans, nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) executor.SetQueryLogger(queryLogger) key.AnyShardPicker = DestinationAnyShardPickerFirstShard{} @@ -198,7 +194,11 @@ func createExecutorEnvCallback(t testing.TB, eachShard func(shard, ks string, ta } func createExecutorEnv(t testing.TB) (executor *Executor, sbc1, sbc2, sbclookup *sandboxconn.SandboxConn, ctx context.Context) { - executor, ctx = createExecutorEnvCallback(t, func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn) { + return createExecutorEnvWithConfig(t, createExecutorConfig()) +} + +func createExecutorEnvWithConfig(t testing.TB, eConfig ExecutorConfig) (executor *Executor, sbc1, sbc2, sbclookup *sandboxconn.SandboxConn, ctx context.Context) { + executor, ctx = createExecutorEnvCallback(t, eConfig, func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn) { switch { case ks == KsTestSharded && shard == "-20": sbc1 = conn @@ -210,7 +210,6 @@ func createExecutorEnv(t testing.TB) (executor *Executor, sbc1, sbc2, sbclookup }) return } - func createCustomExecutor(t testing.TB, vschema string, mysqlVersion string) (executor *Executor, sbc1, sbc2, sbclookup *sandboxconn.SandboxConn, ctx context.Context) { var cancel context.CancelFunc ctx, cancel = context.WithCancel(context.Background()) @@ -232,7 +231,7 @@ func createCustomExecutor(t testing.TB, vschema string, mysqlVersion string) (ex plans := DefaultPlanCache() env, err := vtenv.New(vtenv.Options{MySQLServerVersion: mysqlVersion}) require.NoError(t, err) - executor = NewExecutor(ctx, env, serv, cell, resolver, false, false, testBufferSize, plans, nil, false, querypb.ExecuteOptions_Gen4, 0, NewDynamicViperConfig()) + executor = NewExecutor(ctx, env, serv, cell, resolver, createExecutorConfig(), false, plans, nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) executor.SetQueryLogger(queryLogger) t.Cleanup(func() { @@ -244,6 +243,21 @@ func createCustomExecutor(t testing.TB, vschema string, mysqlVersion string) (ex return executor, sbc1, sbc2, sbclookup, ctx } +func createExecutorConfig() ExecutorConfig { + return ExecutorConfig{ + StreamSize: 10, + AllowScatter: true, + } +} + +func createExecutorConfigWithNormalizer() ExecutorConfig { + return ExecutorConfig{ + StreamSize: 10, + AllowScatter: true, + Normalize: true, + } +} + func createCustomExecutorSetValues(t testing.TB, vschema string, values []*sqltypes.Result) (executor *Executor, sbc1, sbc2, sbclookup *sandboxconn.SandboxConn, ctx context.Context) { var cancel context.CancelFunc ctx, cancel = context.WithCancel(context.Background()) @@ -269,7 +283,7 @@ func createCustomExecutorSetValues(t testing.TB, vschema string, values []*sqlty sbclookup = hc.AddTestTablet(cell, "0", 1, KsTestUnsharded, "0", topodatapb.TabletType_PRIMARY, true, 1, nil) queryLogger := streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize) plans := DefaultPlanCache() - executor = NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, false, false, testBufferSize, plans, nil, false, querypb.ExecuteOptions_Gen4, 0, NewDynamicViperConfig()) + executor = NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, createExecutorConfig(), false, plans, nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) executor.SetQueryLogger(queryLogger) t.Cleanup(func() { @@ -294,7 +308,9 @@ func createExecutorEnvWithPrimaryReplicaConn(t testing.TB, ctx context.Context, replica = hc.AddTestTablet(cell, "0-replica", 1, KsTestUnsharded, "0", topodatapb.TabletType_REPLICA, true, 1, nil) queryLogger := streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize) - executor = NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, false, false, testBufferSize, DefaultPlanCache(), nil, false, querypb.ExecuteOptions_Gen4, warmingReadsPercent, NewDynamicViperConfig()) + eConfig := createExecutorConfig() + eConfig.WarmingReadsPercent = warmingReadsPercent + executor = NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, eConfig, false, DefaultPlanCache(), nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) executor.SetQueryLogger(queryLogger) t.Cleanup(func() { diff --git a/go/vt/vtgate/executor_select_test.go b/go/vt/vtgate/executor_select_test.go index 16628729ac6..3d8261495fe 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -166,7 +166,7 @@ func TestSelectDBA(t *testing.T) { func TestSystemVariablesMySQLBelow80(t *testing.T) { executor, sbc1, _, _, _ := createCustomExecutor(t, "{}", "5.7.0") - executor.normalize = true + executor.config.Normalize = true setVarEnabled = true session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, TargetString: "TestExecutor"}) @@ -200,7 +200,7 @@ func TestSystemVariablesMySQLBelow80(t *testing.T) { func TestSystemVariablesWithSetVarDisabled(t *testing.T) { executor, sbc1, _, _, _ := createCustomExecutor(t, "{}", "8.0.0") - executor.normalize = true + executor.config.Normalize = true executor.vConfig.SetVarEnabled = false session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, TargetString: "TestExecutor"}) @@ -233,7 +233,7 @@ func TestSystemVariablesWithSetVarDisabled(t *testing.T) { func TestSetSystemVariablesTx(t *testing.T) { executor, sbc1, _, _, _ := createCustomExecutor(t, "{}", "8.0.1") - executor.normalize = true + executor.config.Normalize = true session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, TargetString: "TestExecutor"}) @@ -278,9 +278,7 @@ func TestSetSystemVariablesTx(t *testing.T) { } func TestSetSystemVariables(t *testing.T) { - executor, _, _, lookup, _ := createExecutorEnv(t) - executor.normalize = true - + executor, _, _, lookup, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, TargetString: KsTestUnsharded, SystemVariables: map[string]string{}}) // Set @@sql_mode and execute a select statement. We should have SET_VAR in the select statement @@ -389,8 +387,7 @@ func TestSetSystemVariables(t *testing.T) { } func TestSetSystemVariablesWithReservedConnection(t *testing.T) { - executor, sbc1, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, SystemVariables: map[string]string{}}) @@ -445,8 +442,7 @@ func TestSelectVindexFunc(t *testing.T) { } func TestCreateTableValidTimestamp(t *testing.T) { - executor, sbc1, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor", SystemVariables: map[string]string{"sql_mode": "ALLOW_INVALID_DATES"}}) @@ -464,8 +460,7 @@ func TestCreateTableValidTimestamp(t *testing.T) { } func TestGen4SelectDBA(t *testing.T) { - executor, sbc1, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) query := "select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS" _, err := executor.Execute(context.Background(), nil, "TestSelectDBA", @@ -699,18 +694,19 @@ func TestStreamLimitOffset(t *testing.T) { }}, } - executor, _ := createExecutorEnvCallback(t, func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn) { - if ks == KsTestSharded { - conn.SetResults([]*sqltypes.Result{{ - Fields: []*querypb.Field{ - {Name: "id", Type: sqltypes.Int32, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_NUM_FLAG)}, - {Name: "textcol", Type: sqltypes.VarChar, Charset: uint32(collations.MySQL8().DefaultConnectionCharset())}, - {Name: "weight_string(id)", Type: sqltypes.VarBinary, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_BINARY_FLAG)}, - }, - Rows: returnRows[shard], - }}) - } - }) + executor, _ := createExecutorEnvCallback(t, createExecutorConfig(), + func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn) { + if ks == KsTestSharded { + conn.SetResults([]*sqltypes.Result{{ + Fields: []*querypb.Field{ + {Name: "id", Type: sqltypes.Int32, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_NUM_FLAG)}, + {Name: "textcol", Type: sqltypes.VarChar, Charset: uint32(collations.MySQL8().DefaultConnectionCharset())}, + {Name: "weight_string(id)", Type: sqltypes.VarBinary, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_BINARY_FLAG)}, + }, + Rows: returnRows[shard], + }}) + } + }) results := make(chan *sqltypes.Result, 10) session := &vtgatepb.Session{ @@ -756,12 +752,11 @@ func TestStreamLimitOffset(t *testing.T) { } func TestSelectLastInsertId(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{ TargetString: "@primary", LastInsertId: 52, } - executor.normalize = true logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -780,7 +775,7 @@ func TestSelectLastInsertId(t *testing.T) { } func TestSelectSystemVariables(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{ TargetString: "@primary", @@ -790,7 +785,6 @@ func TestSelectSystemVariables(t *testing.T) { SessionTrackGtids: true, }, } - executor.normalize = true logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -840,8 +834,7 @@ func TestSelectSystemVariables(t *testing.T) { } func TestSelectInitializedVitessAwareVariable(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -872,8 +865,7 @@ func TestSelectInitializedVitessAwareVariable(t *testing.T) { } func TestSelectUserDefinedVariable(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -908,8 +900,7 @@ func TestSelectUserDefinedVariable(t *testing.T) { } func TestFoundRows(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -935,8 +926,7 @@ func TestFoundRows(t *testing.T) { } func TestRowCount(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -968,8 +958,7 @@ func testRowCount(t *testing.T, ctx context.Context, executor *Executor, session } func TestSelectLastInsertIdInUnion(t *testing.T) { - executor, sbc1, _, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{ TargetString: "@primary", @@ -1002,8 +991,7 @@ func TestSelectLastInsertIdInUnion(t *testing.T) { } func TestSelectLastInsertIdInWhere(t *testing.T) { - executor, _, _, lookup, ctx := createExecutorEnv(t) - executor.normalize = true + executor, _, _, lookup, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -1022,8 +1010,7 @@ func TestSelectLastInsertIdInWhere(t *testing.T) { } func TestLastInsertIDInVirtualTable(t *testing.T) { - executor, sbc1, _, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) result1 := []*sqltypes.Result{{ Fields: []*querypb.Field{ {Name: "id", Type: sqltypes.Int32, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_NUM_FLAG)}, @@ -1050,8 +1037,7 @@ func TestLastInsertIDInVirtualTable(t *testing.T) { } func TestLastInsertIDInSubQueryExpression(t *testing.T) { - executor, sbc1, sbc2, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{ TargetString: "@primary", LastInsertId: 12345, @@ -1074,8 +1060,7 @@ func TestLastInsertIDInSubQueryExpression(t *testing.T) { } func TestSelectDatabase(t *testing.T) { - executor, _, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) sql := "select database()" newSession := &vtgatepb.Session{ TargetString: "@primary", @@ -1334,8 +1319,7 @@ func TestSelectComments(t *testing.T) { } func TestSelectNormalize(t *testing.T) { - executor, sbc1, sbc2, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{ TargetString: "@primary", @@ -1644,7 +1628,7 @@ func TestSelectListArg(t *testing.T) { func createExecutor(ctx context.Context, serv *sandboxTopo, cell string, resolver *Resolver) *Executor { queryLogger := streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize) plans := DefaultPlanCache() - ex := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, false, false, testBufferSize, plans, nil, false, querypb.ExecuteOptions_Gen4, 0, NewDynamicViperConfig()) + ex := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, createExecutorConfig(), false, plans, nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) ex.SetQueryLogger(queryLogger) return ex } @@ -3123,8 +3107,7 @@ func TestSelectBindvarswithPrepare(t *testing.T) { } func TestSelectDatabasePrepare(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -3137,8 +3120,7 @@ func TestSelectDatabasePrepare(t *testing.T) { } func TestSelectWithUnionAll(t *testing.T) { - executor, sbc1, sbc2, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) sql := "select id from user where id in (1, 2, 3) union all select id from user where id in (1, 2, 3)" bv, _ := sqltypes.BuildBindVariable([]int64{1, 2, 3}) bv1, _ := sqltypes.BuildBindVariable([]int64{1, 2}) @@ -3326,7 +3308,7 @@ func TestStreamOrderByWithMultipleResults(t *testing.T) { } queryLogger := streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize) plans := DefaultPlanCache() - executor := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, true, false, testBufferSize, plans, nil, false, querypb.ExecuteOptions_Gen4, 0, NewDynamicViperConfig()) + executor := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, createExecutorConfigWithNormalizer(), false, plans, nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) executor.SetQueryLogger(queryLogger) defer executor.Close() // some sleep for all goroutines to start @@ -3369,7 +3351,7 @@ func TestStreamOrderByLimitWithMultipleResults(t *testing.T) { } queryLogger := streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize) plans := DefaultPlanCache() - executor := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, true, false, testBufferSize, plans, nil, false, querypb.ExecuteOptions_Gen4, 0, NewDynamicViperConfig()) + executor := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, createExecutorConfigWithNormalizer(), false, plans, nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) executor.SetQueryLogger(queryLogger) defer executor.Close() // some sleep for all goroutines to start @@ -3420,7 +3402,7 @@ func TestSelectScatterFails(t *testing.T) { executor := createExecutor(ctx, serv, cell, resolver) defer executor.Close() - executor.allowScatter = false + executor.config.AllowScatter = false logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -3447,8 +3429,7 @@ func TestSelectScatterFails(t *testing.T) { } func TestGen4SelectStraightJoin(t *testing.T) { - executor, sbc1, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}) query := "select u.id from user u straight_join user2 u2 on u.id = u2.id" @@ -3469,8 +3450,7 @@ func TestGen4SelectStraightJoin(t *testing.T) { } func TestGen4MultiColumnVindexEqual(t *testing.T) { - executor, sbc1, sbc2, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}) query := "select * from user_region where cola = 1 and colb = 2" @@ -3507,8 +3487,7 @@ func TestGen4MultiColumnVindexEqual(t *testing.T) { } func TestGen4MultiColumnVindexIn(t *testing.T) { - executor, sbc1, sbc2, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}) query := "select * from user_region where cola IN (1,17984) and colb IN (2,3,4)" @@ -3545,8 +3524,7 @@ func TestGen4MultiColumnVindexIn(t *testing.T) { } func TestGen4MultiColMixedColComparision(t *testing.T) { - executor, sbc1, sbc2, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}) query := "select * from user_region where colb = 2 and cola IN (1,17984)" @@ -3581,8 +3559,7 @@ func TestGen4MultiColMixedColComparision(t *testing.T) { } func TestGen4MultiColBestVindexSel(t *testing.T) { - executor, sbc1, sbc2, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}) query := "select * from user_region where colb = 2 and cola IN (1,17984) and cola = 1" @@ -3626,8 +3603,7 @@ func TestGen4MultiColBestVindexSel(t *testing.T) { } func TestGen4MultiColMultiEqual(t *testing.T) { - executor, sbc1, sbc2, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}) query := "select * from user_region where (cola,colb) in ((17984,2),(17984,3))" @@ -4229,8 +4205,7 @@ func TestSelectAggregationRandom(t *testing.T) { } func TestSelectDateTypes(t *testing.T) { - executor, _, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewAutocommitSession(&vtgatepb.Session{}) qr, err := executor.Execute(context.Background(), nil, "TestSelectDateTypes", session, "select '2020-01-01' + interval month(date_sub(FROM_UNIXTIME(1234), interval 1 month))-1 month", nil) @@ -4240,8 +4215,7 @@ func TestSelectDateTypes(t *testing.T) { } func TestSelectHexAndBit(t *testing.T) { - executor, _, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewAutocommitSession(&vtgatepb.Session{}) qr, err := executor.Execute(context.Background(), nil, "TestSelectHexAndBit", session, "select 0b1001, b'1001', 0x9, x'09'", nil) @@ -4256,8 +4230,7 @@ func TestSelectHexAndBit(t *testing.T) { // TestSelectCFC tests validates that cfc vindex plan gets cached and same plan is getting reused. // This also validates that cache_size is able to calculate the cfc vindex plan size. func TestSelectCFC(t *testing.T) { - executor, _, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewAutocommitSession(&vtgatepb.Session{}) _, err := executor.Execute(context.Background(), nil, "TestSelectCFC", session, "select /*vt+ PLANNER=gen4 */ c2 from tbl_cfc where c1 like 'A%'", nil) @@ -4281,12 +4254,11 @@ func TestSelectCFC(t *testing.T) { } func TestSelectView(t *testing.T) { - executor, sbc, _, _, _ := createExecutorEnv(t) + executor, sbc, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) // add the view to local vschema err := executor.vschema.AddView(KsTestSharded, "user_details_view", "select user.id, user_extra.col from user join user_extra on user.id = user_extra.user_id", executor.vm.parser) require.NoError(t, err) - executor.normalize = true session := econtext.NewAutocommitSession(&vtgatepb.Session{}) _, err = executor.Execute(context.Background(), nil, "TestSelectView", session, "select * from user_details_view", nil) @@ -4327,7 +4299,7 @@ func TestWarmingReads(t *testing.T) { ctx := utils.LeakCheckContext(t) executor, primary, replica := createExecutorEnvWithPrimaryReplicaConn(t, ctx, 100) - executor.normalize = true + executor.config.Normalize = true session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: KsTestUnsharded}) // Since queries on the replica will run in a separate go-routine, we need synchronization for the Queries field in the sandboxconn. replica.RequireQueriesLocking() @@ -4451,8 +4423,7 @@ func TestStreamJoinQuery(t *testing.T) { // It also tests that setting a global variable does not affect the session variable and vice versa. // Also, test what happens on running select @@global and select @@session for a system variable. func TestSysVarGlobalAndSession(t *testing.T) { - executor, sbc1, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, SystemVariables: map[string]string{}}) sbc1.SetResults([]*sqltypes.Result{ diff --git a/go/vt/vtgate/executor_set_test.go b/go/vt/vtgate/executor_set_test.go index f8ed0b558c3..310d885a134 100644 --- a/go/vt/vtgate/executor_set_test.go +++ b/go/vt/vtgate/executor_set_test.go @@ -514,7 +514,7 @@ func createMap(keys []string, values []any) map[string]*querypb.BindVariable { func TestSetVar(t *testing.T) { executor, _, _, sbc, ctx := createCustomExecutor(t, "{}", "8.0.0") - executor.normalize = true + executor.config.Normalize = true session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, TargetString: KsTestUnsharded}) @@ -553,7 +553,7 @@ func TestSetVar(t *testing.T) { func TestSetVarShowVariables(t *testing.T) { executor, _, _, sbc, ctx := createCustomExecutor(t, "{}", "8.0.0") - executor.normalize = true + executor.config.Normalize = true session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, TargetString: KsTestUnsharded}) @@ -576,8 +576,7 @@ func TestSetVarShowVariables(t *testing.T) { } func TestExecutorSetAndSelect(t *testing.T) { - e, _, _, sbc, ctx := createExecutorEnv(t) - e.normalize = true + e, _, _, sbc, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) testcases := []struct { sysVar string diff --git a/go/vt/vtgate/executor_stream_test.go b/go/vt/vtgate/executor_stream_test.go index 8bb10aae8fb..796e0c0466b 100644 --- a/go/vt/vtgate/executor_stream_test.go +++ b/go/vt/vtgate/executor_stream_test.go @@ -68,7 +68,7 @@ func TestStreamSQLSharded(t *testing.T) { queryLogger := streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize) plans := DefaultPlanCache() - executor := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, false, false, testBufferSize, plans, nil, false, querypb.ExecuteOptions_Gen4, 0, NewDynamicViperConfig()) + executor := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, createExecutorConfig(), false, plans, nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) executor.SetQueryLogger(queryLogger) defer executor.Close() diff --git a/go/vt/vtgate/executor_test.go b/go/vt/vtgate/executor_test.go index 74bfb710582..904805e789b 100644 --- a/go/vt/vtgate/executor_test.go +++ b/go/vt/vtgate/executor_test.go @@ -36,6 +36,8 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" + "vitess.io/vitess/go/streamlog" + econtext "vitess.io/vitess/go/vt/vtgate/executorcontext" "vitess.io/vitess/go/mysql/collations" @@ -196,9 +198,7 @@ func TestExecutorTransactionsNoAutoCommit(t *testing.T) { } func TestDirectTargetRewrites(t *testing.T) { - executor, _, _, sbclookup, ctx := createExecutorEnv(t) - - executor.normalize = true + executor, _, _, sbclookup, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{ TargetString: "TestUnsharded/0@primary", @@ -1277,17 +1277,19 @@ func TestExecutorDDL(t *testing.T) { } for _, stmt := range stmts2 { - sbc1.ExecCount.Store(0) - sbc2.ExecCount.Store(0) - sbclookup.ExecCount.Store(0) - _, err := executor.Execute(ctx, nil, "TestExecute", econtext.NewSafeSession(&vtgatepb.Session{TargetString: ""}), stmt.input, nil) - if stmt.hasErr { - require.EqualError(t, err, econtext.ErrNoKeyspace.Error(), "expect query to fail") - testQueryLog(t, executor, logChan, "TestExecute", "", stmt.input, 0) - } else { - require.NoError(t, err) - testQueryLog(t, executor, logChan, "TestExecute", "DDL", stmt.input, 8) - } + t.Run(stmt.input, func(t *testing.T) { + sbc1.ExecCount.Store(0) + sbc2.ExecCount.Store(0) + sbclookup.ExecCount.Store(0) + _, err := executor.Execute(ctx, nil, "TestExecute", econtext.NewSafeSession(&vtgatepb.Session{TargetString: ""}), stmt.input, nil) + if stmt.hasErr { + assert.EqualError(t, err, econtext.ErrNoKeyspace.Error(), "expect query to fail") + testQueryLog(t, executor, logChan, "TestExecute", "", stmt.input, 0) + } else { + assert.NoError(t, err) + testQueryLog(t, executor, logChan, "TestExecute", "DDL", stmt.input, 8) + } + }) } } @@ -1623,7 +1625,7 @@ func assertCacheContains(t *testing.T, e *Executor, vc *econtext.VCursorImpl, sq } func getPlanCached(t *testing.T, ctx context.Context, e *Executor, vcursor *econtext.VCursorImpl, sql string, comments sqlparser.MarginComments, bindVars map[string]*querypb.BindVariable, skipQueryPlanCache bool) (*engine.Plan, *logstats.LogStats) { - logStats := logstats.NewLogStats(ctx, "Test", "", "", nil) + logStats := logstats.NewLogStats(ctx, "Test", "", "", nil, streamlog.NewQueryLogConfigForTest()) vcursor.SafeSession = &econtext.SafeSession{ Session: &vtgatepb.Session{ Options: &querypb.ExecuteOptions{SkipQueryPlanCache: skipQueryPlanCache}}, @@ -1631,7 +1633,7 @@ func getPlanCached(t *testing.T, ctx context.Context, e *Executor, vcursor *econ stmt, reservedVars, err := parseAndValidateQuery(sql, sqlparser.NewTestParser()) require.NoError(t, err) - plan, err := e.getPlan(context.Background(), vcursor, sql, stmt, comments, bindVars, reservedVars /* normalize */, e.normalize, logStats) + plan, err := e.getPlan(context.Background(), vcursor, sql, stmt, comments, bindVars, reservedVars /* normalize */, e.config.Normalize, logStats) require.NoError(t, err) // Wait for cache to settle @@ -1691,8 +1693,7 @@ func TestGetPlanCacheUnnormalized(t *testing.T) { func TestGetPlanCacheNormalized(t *testing.T) { t.Run("Cache", func(t *testing.T) { - r, _, _, _, ctx := createExecutorEnv(t) - r.normalize = true + r, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) emptyvc, _ := econtext.NewVCursorImpl(econtext.NewSafeSession(&vtgatepb.Session{TargetString: "@unknown"}), makeComments(""), r, nil, r.vm, r.VSchema(), r.resolver.resolver, nil, nullResultsObserver{}, r.vConfig) query1 := "select * from music_user_map where id = 1" @@ -1708,8 +1709,7 @@ func TestGetPlanCacheNormalized(t *testing.T) { t.Run("Skip Cache", func(t *testing.T) { // Skip cache using directive - r, _, _, _, ctx := createExecutorEnv(t) - r.normalize = true + r, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) unshardedvc, _ := econtext.NewVCursorImpl(econtext.NewSafeSession(&vtgatepb.Session{TargetString: KsTestUnsharded + "@unknown"}), makeComments(""), r, nil, r.vm, r.VSchema(), r.resolver.resolver, nil, nullResultsObserver{}, r.vConfig) query1 := "insert /*vt+ SKIP_QUERY_PLAN_CACHE=1 */ into user(id) values (1), (2)" @@ -1733,9 +1733,8 @@ func TestGetPlanCacheNormalized(t *testing.T) { } func TestGetPlanNormalized(t *testing.T) { - r, _, _, _, ctx := createExecutorEnv(t) + r, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) - r.normalize = true emptyvc, _ := econtext.NewVCursorImpl(econtext.NewSafeSession(&vtgatepb.Session{TargetString: "@unknown"}), makeComments(""), r, nil, r.vm, r.VSchema(), r.resolver.resolver, nil, nullResultsObserver{}, econtext.VCursorConfig{}) unshardedvc, _ := econtext.NewVCursorImpl(econtext.NewSafeSession(&vtgatepb.Session{TargetString: KsTestUnsharded + "@unknown"}), makeComments(""), r, nil, r.vm, r.VSchema(), r.resolver.resolver, nil, nullResultsObserver{}, econtext.VCursorConfig{}) @@ -1790,10 +1789,9 @@ func TestGetPlanPriority(t *testing.T) { testCase := aTestCase t.Run(testCase.name, func(t *testing.T) { - r, _, _, _, ctx := createExecutorEnv(t) + r, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) - r.normalize = true - logStats := logstats.NewLogStats(ctx, "Test", "", "", nil) + logStats := logstats.NewLogStats(ctx, "Test", "", "", nil, streamlog.NewQueryLogConfigForTest()) vCursor, err := econtext.NewVCursorImpl(session, makeComments(""), r, nil, r.vm, r.VSchema(), r.resolver.resolver, nil, nullResultsObserver{}, econtext.VCursorConfig{}) assert.NoError(t, err) @@ -1816,7 +1814,7 @@ func TestGetPlanPriority(t *testing.T) { } func TestPassthroughDDL(t *testing.T) { - executor, sbc1, sbc2, _, ctx := createExecutorEnv(t) + executor, sbc1, sbc2, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{ TargetString: "TestExecutor", } @@ -1839,7 +1837,6 @@ func TestPassthroughDDL(t *testing.T) { // Force the query to go to only one shard. Normalization doesn't make any difference. session.TargetString = "TestExecutor/40-60" - executor.normalize = true _, err = executorExec(ctx, executor, session, alterDDL, nil) require.NoError(t, err) @@ -1851,7 +1848,6 @@ func TestPassthroughDDL(t *testing.T) { // Use range query session.TargetString = "TestExecutor[-]" - executor.normalize = true _, err = executorExec(ctx, executor, session, alterDDL, nil) require.NoError(t, err) @@ -2001,10 +1997,7 @@ func TestExecutorMaxPayloadSizeExceeded(t *testing.T) { } func TestOlapSelectDatabase(t *testing.T) { - executor, _, _, _, _ := createExecutorEnv(t) - - executor.normalize = true - + executor, _, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{Autocommit: true} sql := `select database()` @@ -2282,9 +2275,7 @@ func TestExecutorExplainStmt(t *testing.T) { } func TestExecutorVExplain(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) - - executor.normalize = true + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -2672,10 +2663,12 @@ func TestExecutorShowVitessMigrations(t *testing.T) { func TestExecutorDescHash(t *testing.T) { executor, _, _, _, ctx := createExecutorEnv(t) - - showQuery := "desc hash_index" session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}) - _, err := executor.Execute(ctx, nil, "", session, showQuery, nil) + + _, err := executor.Execute(ctx, nil, "", session, "desc hash_index", nil) + require.EqualError(t, err, "VT05004: table 'hash_index' does not exist") + + _, err = executor.Execute(ctx, nil, "", session, "desc music", nil) require.NoError(t, err) } @@ -2752,9 +2745,7 @@ func TestExecutorStartTxnStmt(t *testing.T) { } func TestExecutorPrepareExecute(t *testing.T) { - executor, _, _, _, _ := createExecutorEnv(t) - - executor.normalize = true + executor, _, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewAutocommitSession(&vtgatepb.Session{}) // prepare statement. diff --git a/go/vt/vtgate/executorcontext/safe_session.go b/go/vt/vtgate/executorcontext/safe_session.go index c77bba76ff8..e9a25438bc4 100644 --- a/go/vt/vtgate/executorcontext/safe_session.go +++ b/go/vt/vtgate/executorcontext/safe_session.go @@ -656,17 +656,18 @@ func (session *SafeSession) TimeZone() *time.Location { session.mu.Unlock() if !ok { - return nil + return time.Local } tz, err := sqltypes.DecodeStringSQL(zoneSQL) if err != nil { - return nil + return time.Local } - loc, _ := datetime.ParseTimeZone(tz) - // it's safe to ignore the error - if we get an error, loc will be nil, - // and this is exactly the behaviour we want anyway + loc, err := datetime.ParseTimeZone(tz) + if err != nil { + return time.Local + } return loc } diff --git a/go/vt/vtgate/executorcontext/safe_session_test.go b/go/vt/vtgate/executorcontext/safe_session_test.go index 14ea2ad9dac..66130209d33 100644 --- a/go/vt/vtgate/executorcontext/safe_session_test.go +++ b/go/vt/vtgate/executorcontext/safe_session_test.go @@ -173,6 +173,10 @@ func TestTimeZone(t *testing.T) { tz string want string }{ + { + tz: "", + want: time.Local.String(), + }, { tz: "'Europe/Amsterdam'", want: "Europe/Amsterdam", @@ -183,16 +187,18 @@ func TestTimeZone(t *testing.T) { }, { tz: "foo", - want: (*time.Location)(nil).String(), + want: time.Local.String(), }, } for _, tc := range testCases { t.Run(tc.tz, func(t *testing.T) { + sysvars := map[string]string{} + if tc.tz != "" { + sysvars["time_zone"] = tc.tz + } session := NewSafeSession(&vtgatepb.Session{ - SystemVariables: map[string]string{ - "time_zone": tc.tz, - }, + SystemVariables: sysvars, }) assert.Equal(t, tc.want, session.TimeZone().String()) diff --git a/go/vt/vtgate/executorcontext/vcursor_impl.go b/go/vt/vtgate/executorcontext/vcursor_impl.go index 3f8d7def797..79a46c86496 100644 --- a/go/vt/vtgate/executorcontext/vcursor_impl.go +++ b/go/vt/vtgate/executorcontext/vcursor_impl.go @@ -392,7 +392,7 @@ func (vc *VCursorImpl) StartPrimitiveTrace() func() engine.Stats { // FindTable finds the specified table. If the keyspace what specified in the input, it gets used as qualifier. // Otherwise, the keyspace from the request is used, if one was provided. func (vc *VCursorImpl) FindTable(name sqlparser.TableName) (*vindexes.Table, string, topodatapb.TabletType, key.Destination, error) { - destKeyspace, destTabletType, dest, err := vc.ParseDestinationTarget(name.Qualifier.String()) + destKeyspace, destTabletType, dest, err := vc.parseDestinationTarget(name.Qualifier.String()) if err != nil { return nil, "", destTabletType, nil, err } @@ -406,8 +406,8 @@ func (vc *VCursorImpl) FindTable(name sqlparser.TableName) (*vindexes.Table, str return table, destKeyspace, destTabletType, dest, err } -func (vc *VCursorImpl) FindView(name sqlparser.TableName) sqlparser.SelectStatement { - ks, _, _, err := vc.ParseDestinationTarget(name.Qualifier.String()) +func (vc *VCursorImpl) FindView(name sqlparser.TableName) sqlparser.TableStatement { + ks, _, _, err := vc.parseDestinationTarget(name.Qualifier.String()) if err != nil { return nil } @@ -418,7 +418,7 @@ func (vc *VCursorImpl) FindView(name sqlparser.TableName) sqlparser.SelectStatem } func (vc *VCursorImpl) FindRoutedTable(name sqlparser.TableName) (*vindexes.Table, error) { - destKeyspace, destTabletType, _, err := vc.ParseDestinationTarget(name.Qualifier.String()) + destKeyspace, destTabletType, _, err := vc.parseDestinationTarget(name.Qualifier.String()) if err != nil { return nil, err } @@ -442,7 +442,7 @@ func (vc *VCursorImpl) FindTableOrVindex(name sqlparser.TableName) (*vindexes.Ta return vc.getDualTable() } - destKeyspace, destTabletType, dest, err := ParseDestinationTarget(name.Qualifier.String(), vc.tabletType, vc.vschema) + destKeyspace, destTabletType, dest, err := vc.parseDestinationTarget(name.Qualifier.String()) if err != nil { return nil, nil, "", destTabletType, nil, err } @@ -456,7 +456,24 @@ func (vc *VCursorImpl) FindTableOrVindex(name sqlparser.TableName) (*vindexes.Ta return table, vindex, destKeyspace, destTabletType, dest, nil } -func (vc *VCursorImpl) ParseDestinationTarget(targetString string) (string, topodatapb.TabletType, key.Destination, error) { +// FindViewTarget finds the specified view's target keyspace. +func (vc *VCursorImpl) FindViewTarget(name sqlparser.TableName) (*vindexes.Keyspace, error) { + destKeyspace, _, _, err := vc.parseDestinationTarget(name.Qualifier.String()) + if err != nil { + return nil, err + } + if destKeyspace != "" { + return vc.FindKeyspace(destKeyspace) + } + + tbl, err := vc.vschema.FindRoutedTable("", name.Name.String(), vc.tabletType) + if err != nil || tbl == nil { + return nil, err + } + return tbl.Keyspace, nil +} + +func (vc *VCursorImpl) parseDestinationTarget(targetString string) (string, topodatapb.TabletType, key.Destination, error) { return ParseDestinationTarget(targetString, vc.tabletType, vc.vschema) } @@ -1319,7 +1336,7 @@ func (vc *VCursorImpl) GetAggregateUDFs() []string { // FindMirrorRule finds the mirror rule for the requested table name and // VSchema tablet type. func (vc *VCursorImpl) FindMirrorRule(name sqlparser.TableName) (*vindexes.MirrorRule, error) { - destKeyspace, destTabletType, _, err := vc.ParseDestinationTarget(name.Qualifier.String()) + destKeyspace, destTabletType, _, err := vc.parseDestinationTarget(name.Qualifier.String()) if err != nil { return nil, err } diff --git a/go/vt/vtgate/executorcontext/vcursor_impl_test.go b/go/vt/vtgate/executorcontext/vcursor_impl_test.go index 08e27be4c51..244a80c9ffe 100644 --- a/go/vt/vtgate/executorcontext/vcursor_impl_test.go +++ b/go/vt/vtgate/executorcontext/vcursor_impl_test.go @@ -27,6 +27,8 @@ import ( "github.com/stretchr/testify/require" + "vitess.io/vitess/go/streamlog" + "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/sqltypes" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" @@ -367,7 +369,7 @@ func TestSetExecQueryTimeout(t *testing.T) { func TestRecordMirrorStats(t *testing.T) { safeSession := NewSafeSession(nil) - logStats := logstats.NewLogStats(context.Background(), t.Name(), "select 1", "", nil) + logStats := logstats.NewLogStats(context.Background(), t.Name(), "select 1", "", nil, streamlog.NewQueryLogConfigForTest()) vc, err := NewVCursorImpl(safeSession, sqlparser.MarginComments{}, nil, logStats, nil, &vindexes.VSchema{}, nil, nil, fakeObserver{}, VCursorConfig{}) require.NoError(t, err) diff --git a/go/vt/vtgate/logstats/logstats.go b/go/vt/vtgate/logstats/logstats.go index fdc0e69c8db..3ad75d07722 100644 --- a/go/vt/vtgate/logstats/logstats.go +++ b/go/vt/vtgate/logstats/logstats.go @@ -33,6 +33,8 @@ import ( // LogStats records the stats for a single vtgate query type LogStats struct { + Config streamlog.QueryLogConfig + Ctx context.Context Method string TabletType string @@ -59,7 +61,7 @@ type LogStats struct { // NewLogStats constructs a new LogStats with supplied Method and ctx // field values, and the StartTime field set to the present time. -func NewLogStats(ctx context.Context, methodName, sql, sessionUUID string, bindVars map[string]*querypb.BindVariable) *LogStats { +func NewLogStats(ctx context.Context, methodName, sql, sessionUUID string, bindVars map[string]*querypb.BindVariable, config streamlog.QueryLogConfig) *LogStats { return &LogStats{ Ctx: ctx, Method: methodName, @@ -67,6 +69,7 @@ func NewLogStats(ctx context.Context, methodName, sql, sessionUUID string, bindV SessionUUID: sessionUUID, BindVariables: bindVars, StartTime: time.Now(), + Config: config, } } @@ -130,16 +133,15 @@ func (stats *LogStats) MirrorTargetErrorStr() string { // Logf formats the log record to the given writer, either as // tab-separated list of logged fields or as JSON. func (stats *LogStats) Logf(w io.Writer, params url.Values) error { - if !streamlog.ShouldEmitLog(stats.SQL, stats.RowsAffected, stats.RowsReturned) { + if !stats.Config.ShouldEmitLog(stats.SQL, stats.RowsAffected, stats.RowsReturned, stats.Error != nil) { return nil } - redacted := streamlog.GetRedactDebugUIQueries() _, fullBindParams := params["full"] remoteAddr, username := stats.RemoteAddrUsername() log := logstats.NewLogger() - log.Init(streamlog.GetQueryLogFormat() == streamlog.QueryLogFormatJSON) + log.Init(stats.Config.Format == streamlog.QueryLogFormatJSON) log.Key("Method") log.StringUnquoted(stats.Method) log.Key("RemoteAddr") @@ -167,7 +169,7 @@ func (stats *LogStats) Logf(w io.Writer, params url.Values) error { log.Key("SQL") log.String(stats.SQL) log.Key("BindVars") - if redacted { + if stats.Config.RedactDebugUIQueries { log.Redacted() } else { log.BindVariables(stats.BindVariables, fullBindParams) diff --git a/go/vt/vtgate/logstats/logstats_test.go b/go/vt/vtgate/logstats/logstats_test.go index 872b34c6964..78b27342a7e 100644 --- a/go/vt/vtgate/logstats/logstats_test.go +++ b/go/vt/vtgate/logstats/logstats_test.go @@ -55,11 +55,7 @@ func testFormat(t *testing.T, stats *LogStats, params url.Values) string { } func TestLogStatsFormat(t *testing.T) { - defer func() { - streamlog.SetRedactDebugUIQueries(false) - streamlog.SetQueryLogFormat("text") - }() - logStats := NewLogStats(context.Background(), "test", "sql1", "suuid", nil) + logStats := NewLogStats(context.Background(), "test", "sql1", "suuid", nil, streamlog.NewQueryLogConfigForTest()) logStats.StartTime = time.Date(2017, time.January, 1, 1, 2, 3, 0, time.UTC) logStats.EndTime = time.Date(2017, time.January, 1, 1, 2, 4, 1234, time.UTC) logStats.TablesUsed = []string{"ks1.tbl1", "ks2.tbl2"} @@ -125,8 +121,8 @@ func TestLogStatsFormat(t *testing.T) { for _, variable := range logStats.BindVariables { fmt.Println("->" + fmt.Sprintf("%v", variable)) } - streamlog.SetRedactDebugUIQueries(test.redact) - streamlog.SetQueryLogFormat(test.format) + logStats.Config.RedactDebugUIQueries = test.redact + logStats.Config.Format = test.format if test.format == "text" { got := testFormat(t, logStats, params) t.Logf("got: %s", got) @@ -148,9 +144,8 @@ func TestLogStatsFormat(t *testing.T) { } func TestLogStatsFilter(t *testing.T) { - defer func() { streamlog.SetQueryLogFilterTag("") }() - - logStats := NewLogStats(context.Background(), "test", "sql1 /* LOG_THIS_QUERY */", "", map[string]*querypb.BindVariable{"intVal": sqltypes.Int64BindVariable(1)}) + logStats := NewLogStats(context.Background(), "test", "sql1 /* LOG_THIS_QUERY */", "", + map[string]*querypb.BindVariable{"intVal": sqltypes.Int64BindVariable(1)}, streamlog.NewQueryLogConfigForTest()) logStats.StartTime = time.Date(2017, time.January, 1, 1, 2, 3, 0, time.UTC) logStats.EndTime = time.Date(2017, time.January, 1, 1, 2, 4, 1234, time.UTC) params := map[string][]string{"full": {}} @@ -159,21 +154,20 @@ func TestLogStatsFilter(t *testing.T) { want := "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\t0.000000\t0.000000\t\"\"\n" assert.Equal(t, want, got) - streamlog.SetQueryLogFilterTag("LOG_THIS_QUERY") + logStats.Config.FilterTag = "LOG_THIS_QUERY" got = testFormat(t, logStats, params) want = "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\t0.000000\t0.000000\t\"\"\n" assert.Equal(t, want, got) - streamlog.SetQueryLogFilterTag("NOT_THIS_QUERY") + logStats.Config.FilterTag = "NOT_THIS_QUERY" got = testFormat(t, logStats, params) want = "" assert.Equal(t, want, got) } func TestLogStatsRowThreshold(t *testing.T) { - defer func() { streamlog.SetQueryLogRowThreshold(0) }() - - logStats := NewLogStats(context.Background(), "test", "sql1 /* LOG_THIS_QUERY */", "", map[string]*querypb.BindVariable{"intVal": sqltypes.Int64BindVariable(1)}) + logStats := NewLogStats(context.Background(), "test", "sql1 /* LOG_THIS_QUERY */", "", + map[string]*querypb.BindVariable{"intVal": sqltypes.Int64BindVariable(1)}, streamlog.NewQueryLogConfigForTest()) logStats.StartTime = time.Date(2017, time.January, 1, 1, 2, 3, 0, time.UTC) logStats.EndTime = time.Date(2017, time.January, 1, 1, 2, 4, 1234, time.UTC) params := map[string][]string{"full": {}} @@ -182,11 +176,11 @@ func TestLogStatsRowThreshold(t *testing.T) { want := "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\t0.000000\t0.000000\t\"\"\n" assert.Equal(t, want, got) - streamlog.SetQueryLogRowThreshold(0) got = testFormat(t, logStats, params) want = "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\t0.000000\t0.000000\t\"\"\n" assert.Equal(t, want, got) - streamlog.SetQueryLogRowThreshold(1) + + logStats.Config.RowThreshold = 1 got = testFormat(t, logStats, params) assert.Empty(t, got) } @@ -197,14 +191,14 @@ func TestLogStatsContextHTML(t *testing.T) { Html: testconversions.MakeHTMLForTest(html), } ctx := callinfo.NewContext(context.Background(), callInfo) - logStats := NewLogStats(ctx, "test", "sql1", "", map[string]*querypb.BindVariable{}) + logStats := NewLogStats(ctx, "test", "sql1", "", map[string]*querypb.BindVariable{}, streamlog.NewQueryLogConfigForTest()) if logStats.ContextHTML().String() != html { t.Fatalf("expect to get html: %s, but got: %s", html, logStats.ContextHTML().String()) } } func TestLogStatsErrorStr(t *testing.T) { - logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}) + logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}, streamlog.NewQueryLogConfigForTest()) if logStats.ErrorStr() != "" { t.Fatalf("should not get error in stats, but got: %s", logStats.ErrorStr()) } @@ -216,7 +210,7 @@ func TestLogStatsErrorStr(t *testing.T) { } func TestLogStatsMirrorTargetErrorStr(t *testing.T) { - logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}) + logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}, streamlog.NewQueryLogConfigForTest()) if logStats.MirrorTargetErrorStr() != "" { t.Fatalf("should not get error in stats, but got: %s", logStats.ErrorStr()) } @@ -228,7 +222,7 @@ func TestLogStatsMirrorTargetErrorStr(t *testing.T) { } func TestLogStatsRemoteAddrUsername(t *testing.T) { - logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}) + logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}, streamlog.NewQueryLogConfigForTest()) addr, user := logStats.RemoteAddrUsername() if addr != "" { t.Fatalf("remote addr should be empty") @@ -244,7 +238,7 @@ func TestLogStatsRemoteAddrUsername(t *testing.T) { User: username, } ctx := callinfo.NewContext(context.Background(), callInfo) - logStats = NewLogStats(ctx, "test", "sql1", "", map[string]*querypb.BindVariable{}) + logStats = NewLogStats(ctx, "test", "sql1", "", map[string]*querypb.BindVariable{}, streamlog.NewQueryLogConfigForTest()) addr, user = logStats.RemoteAddrUsername() if addr != remoteAddr { t.Fatalf("expected to get remote addr: %s, but got: %s", remoteAddr, addr) @@ -253,3 +247,18 @@ func TestLogStatsRemoteAddrUsername(t *testing.T) { t.Fatalf("expected to get username: %s, but got: %s", username, user) } } + +// TestLogStatsErrorsOnly tests that LogStats only logs errors when the query log mode is set to errors only for VTGate. +func TestLogStatsErrorsOnly(t *testing.T) { + logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}, streamlog.NewQueryLogConfigForTest()) + logStats.Config.Mode = streamlog.QueryLogModeError + + // no error, should not log + logOutput := testFormat(t, logStats, url.Values{}) + assert.Empty(t, logOutput) + + // error, should log + logStats.Error = errors.New("test error") + logOutput = testFormat(t, logStats, url.Values{}) + assert.Contains(t, logOutput, "test error") +} diff --git a/go/vt/vtgate/plan_execute.go b/go/vt/vtgate/plan_execute.go index db7923c09f0..75a7af6bf2a 100644 --- a/go/vt/vtgate/plan_execute.go +++ b/go/vt/vtgate/plan_execute.go @@ -131,7 +131,7 @@ func (e *Executor) newExecute( // the vtgate to clear the cached plans when processing the new serving vschema. // When buffering ends, many queries might be getting planned at the same time and we then // take full advatange of the cached plan. - plan, err = e.getPlan(ctx, vcursor, query, stmt, comments, bindVars, reservedVars, e.normalize, logStats) + plan, err = e.getPlan(ctx, vcursor, query, stmt, comments, bindVars, reservedVars, e.config.Normalize, logStats) execStart := e.logPlanningFinished(logStats, plan) if err != nil { diff --git a/go/vt/vtgate/planbuilder/builder.go b/go/vt/vtgate/planbuilder/builder.go index ca4ccb7ac5a..065c50a6dfa 100644 --- a/go/vt/vtgate/planbuilder/builder.go +++ b/go/vt/vtgate/planbuilder/builder.go @@ -43,10 +43,6 @@ const ( Gen4Left2Right = querypb.ExecuteOptions_Gen4Left2Right ) -var ( - plannerVersions = []plancontext.PlannerVersion{Gen4, Gen4GreedyOnly, Gen4Left2Right} -) - type ( planResult struct { primitive engine.Primitive diff --git a/go/vt/vtgate/planbuilder/bypass.go b/go/vt/vtgate/planbuilder/bypass.go index d3384d509c1..6e3f64990d7 100644 --- a/go/vt/vtgate/planbuilder/bypass.go +++ b/go/vt/vtgate/planbuilder/bypass.go @@ -56,6 +56,8 @@ func buildPlanForBypass(stmt sqlparser.Statement, _ *sqlparser.ReservedVars, vsc } } + sqlparser.RemoveSpecificKeyspace(stmt, keyspace.Name) + send := &engine.Send{ Keyspace: keyspace, TargetDestination: vschema.Destination(), diff --git a/go/vt/vtgate/planbuilder/ddl.go b/go/vt/vtgate/planbuilder/ddl.go index a0045cec060..2ca924c31ab 100644 --- a/go/vt/vtgate/planbuilder/ddl.go +++ b/go/vt/vtgate/planbuilder/ddl.go @@ -196,9 +196,13 @@ func buildCreateViewCommon( vschema plancontext.VSchema, reservedVars *sqlparser.ReservedVars, cfg dynamicconfig.DDL, - ddlSelect sqlparser.SelectStatement, + ddlSelect sqlparser.TableStatement, ddl sqlparser.DDLStatement, ) (key.Destination, *vindexes.Keyspace, error) { + if vschema.IsViewsEnabled() { + return createViewEnabled(vschema, reservedVars, ddlSelect, ddl) + } + // For Create View, we require that the keyspace exist and the select query can be satisfied within the keyspace itself // We should remove the keyspace name from the table name, as the database name in MySQL might be different than the keyspace name destination, keyspace, err := findTableDestinationAndKeyspace(vschema, ddl) @@ -228,9 +232,6 @@ func buildCreateViewCommon( sqlparser.RemoveKeyspace(ddl) - if vschema.IsViewsEnabled() { - return destination, keyspace, nil - } isRoutePlan, opCode := tryToGetRoutePlan(selectPlan.primitive) if !isRoutePlan { return nil, nil, vterrors.VT12001(ViewComplex) @@ -241,6 +242,55 @@ func buildCreateViewCommon( return destination, keyspace, nil } +func createViewEnabled(vschema plancontext.VSchema, reservedVars *sqlparser.ReservedVars, ddlSelect sqlparser.TableStatement, ddl sqlparser.DDLStatement) (key.Destination, *vindexes.Keyspace, error) { + // For Create View, we require that the keyspace exist and the select query can be satisfied within the keyspace itself + // We should remove the keyspace name from the table name, as the database name in MySQL might be different than the keyspace name + destination, keyspace, err := findTableDestinationAndKeyspace(vschema, ddl) + if err != nil { + return nil, nil, err + } + + // views definition with `select *` should not be expanded as schema tracker might not be up-to-date + // We copy the expressions and restore them after the planning context is created + var expressions []sqlparser.SelectExprs + _ = sqlparser.VisitAllSelects(ddlSelect, func(p *sqlparser.Select, idx int) error { + expressions = append(expressions, sqlparser.Clone(p.SelectExprs)) + return nil + }) + + pCtx, err := plancontext.CreatePlanningContext(ddlSelect, reservedVars, vschema, Gen4) + if err != nil { + return nil, nil, err + } + + var tblKs string + for _, tbl := range pCtx.SemTable.Tables { + vTbl := tbl.GetVindexTable() + if vTbl == nil { + continue + } + if tblKs == "" { + tblKs = vTbl.Keyspace.Name + } + if tblKs != vTbl.Keyspace.Name { + return nil, nil, vterrors.VT12001(ViewComplex) + } + } + + if tblKs != keyspace.Name { + return nil, nil, vterrors.VT12001(ViewDifferentKeyspace) + } + + _ = sqlparser.VisitAllSelects(ddlSelect, func(p *sqlparser.Select, idx int) error { + p.SelectExprs = expressions[idx] + return nil + }) + + sqlparser.RemoveKeyspace(ddl) + + return destination, keyspace, nil +} + func buildDropView(vschema plancontext.VSchema, ddlStatement sqlparser.DDLStatement) (key.Destination, *vindexes.Keyspace, error) { if !vschema.IsViewsEnabled() { return buildDropTable(vschema, ddlStatement) @@ -248,7 +298,7 @@ func buildDropView(vschema plancontext.VSchema, ddlStatement sqlparser.DDLStatem var ks *vindexes.Keyspace viewMap := make(map[string]any) for _, tbl := range ddlStatement.GetFromTables() { - _, ksForView, _, err := vschema.TargetDestination(tbl.Qualifier.String()) + ksForView, err := vschema.FindViewTarget(tbl) if err != nil { return nil, nil, err } diff --git a/go/vt/vtgate/planbuilder/operators/SQL_builder.go b/go/vt/vtgate/planbuilder/operators/SQL_builder.go index fc91569981d..ca15b5c9134 100644 --- a/go/vt/vtgate/planbuilder/operators/SQL_builder.go +++ b/go/vt/vtgate/planbuilder/operators/SQL_builder.go @@ -37,8 +37,9 @@ type ( } ) -func (qb *queryBuilder) asSelectStatement() sqlparser.SelectStatement { - return qb.stmt.(sqlparser.SelectStatement) +func (qb *queryBuilder) asSelectStatement() sqlparser.TableStatement { + return qb.stmt.(sqlparser.TableStatement) + } func (qb *queryBuilder) asOrderAndLimit() sqlparser.OrderAndLimit { return qb.stmt.(sqlparser.OrderAndLimit) @@ -191,7 +192,8 @@ func (qb *queryBuilder) pushUnionInsideDerived() { As: sqlparser.NewIdentifierCS("dt"), }}, } - sel.SelectExprs = unionSelects(sqlparser.GetFirstSelect(selStmt).SelectExprs) + firstSelect := getFirstSelect(selStmt) + sel.SelectExprs = unionSelects(firstSelect.SelectExprs) qb.stmt = sel } @@ -208,9 +210,10 @@ func unionSelects(exprs sqlparser.SelectExprs) (selectExprs sqlparser.SelectExpr return } -func checkUnionColumnByName(column *sqlparser.ColName, sel sqlparser.SelectStatement) { +func checkUnionColumnByName(column *sqlparser.ColName, sel sqlparser.TableStatement) { colName := column.Name.String() - exprs := sqlparser.GetFirstSelect(sel).SelectExprs + firstSelect := getFirstSelect(sel) + exprs := firstSelect.SelectExprs offset := slices.IndexFunc(exprs, func(expr sqlparser.SelectExpr) bool { switch ae := expr.(type) { case *sqlparser.StarExpr: @@ -244,8 +247,8 @@ func (qb *queryBuilder) unionWith(other *queryBuilder, distinct bool) { func (qb *queryBuilder) recursiveCteWith(other *queryBuilder, name, alias string, distinct bool, columns sqlparser.Columns) { cteUnion := &sqlparser.Union{ - Left: qb.stmt.(sqlparser.SelectStatement), - Right: other.stmt.(sqlparser.SelectStatement), + Left: qb.stmt.(sqlparser.TableStatement), + Right: other.stmt.(sqlparser.TableStatement), Distinct: distinct, } @@ -393,7 +396,7 @@ func removeKeyspaceFromSelectExpr(expr sqlparser.SelectExpr) { } } -func stripDownQuery(from, to sqlparser.SelectStatement) { +func stripDownQuery(from, to sqlparser.TableStatement) { switch node := from.(type) { case *sqlparser.Select: toNode, ok := to.(*sqlparser.Select) @@ -450,7 +453,12 @@ func buildQuery(op Operator, qb *queryBuilder) { buildUnion(op, qb) case *Distinct: buildQuery(op.Source, qb) - qb.asSelectStatement().MakeDistinct() + statement := qb.asSelectStatement() + d, ok := statement.(sqlparser.Distinctable) + if !ok { + panic(vterrors.VT13001("expected a select statement with distinct")) + } + d.MakeDistinct() case *Update: buildUpdate(op, qb) case *Delete: diff --git a/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go b/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go index 73169369a41..ced81df147a 100644 --- a/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go +++ b/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go @@ -544,7 +544,7 @@ func splitAggrColumnsToLeftAndRight( canPushDistinctAggr, distinctExprs := checkIfWeCanPush(ctx, aggregator) - // Distinct aggregation cannot be pushed down in the join. + // Distinctable aggregation cannot be pushed down in the join. // We keep node of the distinct aggregation expression to be used later for ordering. if !canPushDistinctAggr { if len(distinctExprs) != 1 { diff --git a/go/vt/vtgate/planbuilder/operators/ast_to_op.go b/go/vt/vtgate/planbuilder/operators/ast_to_op.go index 12c19bb72a6..2e3781c94db 100644 --- a/go/vt/vtgate/planbuilder/operators/ast_to_op.go +++ b/go/vt/vtgate/planbuilder/operators/ast_to_op.go @@ -178,7 +178,7 @@ func createOperatorFromUnion(ctx *plancontext.PlanningContext, node *sqlparser.U return newHorizon(union, node) } -func translateQueryToOpForUnion(ctx *plancontext.PlanningContext, node sqlparser.SelectStatement) Operator { +func translateQueryToOpForUnion(ctx *plancontext.PlanningContext, node sqlparser.TableStatement) Operator { op := translateQueryToOp(ctx, node) if hz, ok := op.(*Horizon); ok { hz.Truncate = true diff --git a/go/vt/vtgate/planbuilder/operators/expressions.go b/go/vt/vtgate/planbuilder/operators/expressions.go index 38848693775..f42ec87404d 100644 --- a/go/vt/vtgate/planbuilder/operators/expressions.go +++ b/go/vt/vtgate/planbuilder/operators/expressions.go @@ -121,3 +121,11 @@ func simplifyPredicates(ctx *plancontext.PlanningContext, in sqlparser.Expr) sql } return output } + +func getFirstSelect(selStmt sqlparser.TableStatement) *sqlparser.Select { + firstSelect, err := sqlparser.GetFirstSelect(selStmt) + if err != nil { + panic(err) + } + return firstSelect +} diff --git a/go/vt/vtgate/planbuilder/operators/horizon.go b/go/vt/vtgate/planbuilder/operators/horizon.go index 292be1b37c5..aa7737001d6 100644 --- a/go/vt/vtgate/planbuilder/operators/horizon.go +++ b/go/vt/vtgate/planbuilder/operators/horizon.go @@ -45,7 +45,7 @@ type Horizon struct { // QP contains the QueryProjection for this op QP *QueryProjection - Query sqlparser.SelectStatement + Query sqlparser.TableStatement // Columns needed to feed other plans Columns []*sqlparser.ColName @@ -54,7 +54,7 @@ type Horizon struct { Truncate bool } -func newHorizon(src Operator, query sqlparser.SelectStatement) *Horizon { +func newHorizon(src Operator, query sqlparser.TableStatement) *Horizon { return &Horizon{ unaryOperator: newUnaryOp(src), Query: query, @@ -148,7 +148,7 @@ func (h *Horizon) FindCol(ctx *plancontext.PlanningContext, expr sqlparser.Expr, return -1 } - for idx, se := range sqlparser.GetFirstSelect(h.Query).SelectExprs { + for idx, se := range getFirstSelect(h.Query).SelectExprs { ae, ok := se.(*sqlparser.AliasedExpr) if !ok { panic(vterrors.VT09015()) @@ -174,7 +174,7 @@ func (h *Horizon) GetColumns(ctx *plancontext.PlanningContext) (exprs []*sqlpars } func (h *Horizon) GetSelectExprs(*plancontext.PlanningContext) sqlparser.SelectExprs { - return sqlparser.GetFirstSelect(h.Query).SelectExprs + return getFirstSelect(h.Query).SelectExprs } func (h *Horizon) GetOrdering(ctx *plancontext.PlanningContext) []OrderBy { @@ -185,7 +185,7 @@ func (h *Horizon) GetOrdering(ctx *plancontext.PlanningContext) []OrderBy { } // TODO: REMOVE -func (h *Horizon) selectStatement() sqlparser.SelectStatement { +func (h *Horizon) selectStatement() sqlparser.TableStatement { return h.Query } diff --git a/go/vt/vtgate/planbuilder/operators/insert.go b/go/vt/vtgate/planbuilder/operators/insert.go index 4ce37901a77..ae125dea19c 100644 --- a/go/vt/vtgate/planbuilder/operators/insert.go +++ b/go/vt/vtgate/planbuilder/operators/insert.go @@ -394,7 +394,7 @@ func createInsertOperator(ctx *plancontext.PlanningContext, insStmt *sqlparser.I case sqlparser.Values: op = route route.Source = insertRowsPlan(ctx, insOp, insStmt, rows) - case sqlparser.SelectStatement: + case sqlparser.TableStatement: op = insertSelectPlan(ctx, insOp, route, insStmt, rows) } if insStmt.Comments != nil { @@ -408,7 +408,7 @@ func insertSelectPlan( insOp *Insert, routeOp *Route, ins *sqlparser.Insert, - sel sqlparser.SelectStatement, + sel sqlparser.TableStatement, ) *InsertSelection { if columnMismatch(insOp.AutoIncrement, ins, sel) { panic(vterrors.VT03006()) @@ -457,7 +457,7 @@ func insertSelectPlan( return insertSelect } -func columnMismatch(gen *Generate, ins *sqlparser.Insert, sel sqlparser.SelectStatement) bool { +func columnMismatch(gen *Generate, ins *sqlparser.Insert, sel sqlparser.TableStatement) bool { origColCount := len(ins.Columns) if gen != nil && gen.added { // One column got added to the insert query ast for auto increment column. @@ -468,7 +468,7 @@ func columnMismatch(gen *Generate, ins *sqlparser.Insert, sel sqlparser.SelectSt return true } if origColCount > sel.GetColumnCount() { - sel := sqlparser.GetFirstSelect(sel) + sel := getFirstSelect(sel) var hasStarExpr bool for _, sExpr := range sel.SelectExprs { if _, hasStarExpr = sExpr.(*sqlparser.StarExpr); hasStarExpr { diff --git a/go/vt/vtgate/planbuilder/operators/query_planning.go b/go/vt/vtgate/planbuilder/operators/query_planning.go index 5fe0c7773c1..db716966d47 100644 --- a/go/vt/vtgate/planbuilder/operators/query_planning.go +++ b/go/vt/vtgate/planbuilder/operators/query_planning.go @@ -32,7 +32,7 @@ import ( func planQuery(ctx *plancontext.PlanningContext, root Operator) Operator { var selExpr sqlparser.SelectExprs if horizon, isHorizon := root.(*Horizon); isHorizon { - sel := sqlparser.GetFirstSelect(horizon.Query) + sel := getFirstSelect(horizon.Query) selExpr = sqlparser.Clone(sel.SelectExprs) } @@ -207,7 +207,7 @@ func pushOrExpandHorizon(ctx *plancontext.PlanningContext, in *Horizon) (Operato !hasHaving && !needsOrdering && !qp.NeedsAggregation() && - !in.selectStatement().IsDistinct() && + !isDistinctAST(in.selectStatement()) && in.selectStatement().GetLimit() == nil if canPush { @@ -784,7 +784,7 @@ func isDistinct(op Operator) bool { case *Union: return op.distinct case *Horizon: - return op.Query.IsDistinct() + return isDistinctAST(op.Query) case *Limit: return isDistinct(op.Source) default: @@ -792,6 +792,13 @@ func isDistinct(op Operator) bool { } } +func isDistinctAST(s sqlparser.Statement) bool { + if d, ok := s.(sqlparser.Distinctable); ok { + return d.IsDistinct() + } + return false +} + func tryPushUnion(ctx *plancontext.PlanningContext, op *Union) (Operator, *ApplyResult) { if res := compactUnion(op); res != NoRewrite { return op, res diff --git a/go/vt/vtgate/planbuilder/operators/queryprojection.go b/go/vt/vtgate/planbuilder/operators/queryprojection.go index a245831ca13..c66bf757dd8 100644 --- a/go/vt/vtgate/planbuilder/operators/queryprojection.go +++ b/go/vt/vtgate/planbuilder/operators/queryprojection.go @@ -203,7 +203,7 @@ func (qp *QueryProjection) addSelectExpressions(ctx *plancontext.PlanningContext func createQPFromUnion(ctx *plancontext.PlanningContext, union *sqlparser.Union) *QueryProjection { qp := &QueryProjection{} - sel := sqlparser.GetFirstSelect(union) + sel := getFirstSelect(union) qp.addSelectExpressions(ctx, sel) qp.addOrderBy(ctx, union.OrderBy) @@ -714,7 +714,7 @@ func CompareRefInt(a *int, b *int) bool { return *a < *b } -func CreateQPFromSelectStatement(ctx *plancontext.PlanningContext, stmt sqlparser.SelectStatement) *QueryProjection { +func CreateQPFromSelectStatement(ctx *plancontext.PlanningContext, stmt sqlparser.TableStatement) *QueryProjection { switch sel := stmt.(type) { case *sqlparser.Select: return createQPFromSelect(ctx, sel) diff --git a/go/vt/vtgate/planbuilder/operators/subquery_builder.go b/go/vt/vtgate/planbuilder/operators/subquery_builder.go index c2256df06f4..6ec5ecdd7f3 100644 --- a/go/vt/vtgate/planbuilder/operators/subquery_builder.go +++ b/go/vt/vtgate/planbuilder/operators/subquery_builder.go @@ -115,7 +115,7 @@ func createSubqueryOp( // inspectStatement goes through all the predicates contained in the AST // and extracts subqueries into operators func (sqb *SubQueryBuilder) inspectStatement(ctx *plancontext.PlanningContext, - stmt sqlparser.SelectStatement, + stmt sqlparser.TableStatement, ) (sqlparser.Exprs, []applyJoinColumn) { switch stmt := stmt.(type) { case *sqlparser.Select: diff --git a/go/vt/vtgate/planbuilder/operators/subquery_planning.go b/go/vt/vtgate/planbuilder/operators/subquery_planning.go index e222ae0f343..06ca69dd7f3 100644 --- a/go/vt/vtgate/planbuilder/operators/subquery_planning.go +++ b/go/vt/vtgate/planbuilder/operators/subquery_planning.go @@ -30,7 +30,7 @@ import ( "vitess.io/vitess/go/vt/vtgate/semantics" ) -func isMergeable(ctx *plancontext.PlanningContext, query sqlparser.SelectStatement, op Operator) bool { +func isMergeable(ctx *plancontext.PlanningContext, query sqlparser.TableStatement, op Operator) bool { validVindex := func(expr sqlparser.Expr) bool { sc := findColumnVindex(ctx, op, expr) return sc != nil && sc.IsUnique() @@ -672,7 +672,7 @@ func (s *subqueryRouteMerger) rewriteASTExpression(ctx *plancontext.PlanningCont if err != nil { panic(err) } - subqStmt, ok := stmt.(sqlparser.SelectStatement) + subqStmt, ok := stmt.(sqlparser.TableStatement) if !ok { panic(vterrors.VT13001("subqueries should only be select statement")) } @@ -700,7 +700,7 @@ func (s *subqueryRouteMerger) rewriteASTExpression(ctx *plancontext.PlanningCont if !deps.IsSolvedBy(subqID) { cursor.Replace(exprFound) } - }, nil).(sqlparser.SelectStatement) + }, nil).(sqlparser.TableStatement) if err != nil { panic(err) } diff --git a/go/vt/vtgate/planbuilder/operators/union.go b/go/vt/vtgate/planbuilder/operators/union.go index 7d09391cf7d..1c692c9f38e 100644 --- a/go/vt/vtgate/planbuilder/operators/union.go +++ b/go/vt/vtgate/planbuilder/operators/union.go @@ -150,7 +150,7 @@ func (u *Union) GetSelectFor(source int) *sqlparser.Select { for { switch op := src.(type) { case *Horizon: - return sqlparser.GetFirstSelect(op.Query) + return getFirstSelect(op.Query) case *Route: src = op.Source default: diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index f3bed93e3c8..8a8d55279a6 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -577,10 +577,10 @@ func (s *planTestSuite) TestOtherPlanningFromFile() { vw, err := vschemawrapper.NewVschemaWrapper(env, vschema, TestBuilder) require.NoError(s.T(), err) + s.testFile("other_read_cases.json", vw, false) + vw.Vcursor.SetTarget("main") vw.Keyspace = &vindexes.Keyspace{Name: "main"} - - s.testFile("other_read_cases.json", vw, false) s.testFile("other_admin_cases.json", vw, false) } diff --git a/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go b/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go index e5e96b0a4be..2844f7e87dc 100644 --- a/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go +++ b/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go @@ -186,12 +186,17 @@ func createPlanContext(st *semantics.SemTable) *PlanningContext { type vschema struct{} +func (v *vschema) FindViewTarget(name sqlparser.TableName) (*vindexes.Keyspace, error) { + // TODO implement me + panic("implement me") +} + func (v *vschema) FindTable(tablename sqlparser.TableName) (*vindexes.Table, string, topodatapb.TabletType, key.Destination, error) { // TODO implement me panic("implement me") } -func (v *vschema) FindView(name sqlparser.TableName) sqlparser.SelectStatement { +func (v *vschema) FindView(name sqlparser.TableName) sqlparser.TableStatement { // TODO implement me panic("implement me") } diff --git a/go/vt/vtgate/planbuilder/plancontext/vschema.go b/go/vt/vtgate/planbuilder/plancontext/vschema.go index b4560424718..c810324f369 100644 --- a/go/vt/vtgate/planbuilder/plancontext/vschema.go +++ b/go/vt/vtgate/planbuilder/plancontext/vschema.go @@ -25,7 +25,9 @@ type PlannerVersion = querypb.ExecuteOptions_PlannerVersion // info about tables. type VSchema interface { FindTable(tablename sqlparser.TableName) (*vindexes.Table, string, topodatapb.TabletType, key.Destination, error) - FindView(name sqlparser.TableName) sqlparser.SelectStatement + FindView(name sqlparser.TableName) sqlparser.TableStatement + // FindViewTarget finds the target keyspace for the view table provided. + FindViewTarget(name sqlparser.TableName) (*vindexes.Keyspace, error) FindTableOrVindex(tablename sqlparser.TableName) (*vindexes.Table, vindexes.Vindex, string, topodatapb.TabletType, key.Destination, error) // SelectedKeyspace returns the current keyspace if set, otherwise returns an error diff --git a/go/vt/vtgate/planbuilder/simplifier_test.go b/go/vt/vtgate/planbuilder/simplifier_test.go index dce21b3e175..5aeb0565f9b 100644 --- a/go/vt/vtgate/planbuilder/simplifier_test.go +++ b/go/vt/vtgate/planbuilder/simplifier_test.go @@ -49,7 +49,7 @@ func TestSimplifyBuggyQuery(t *testing.T) { reservedVars := sqlparser.NewReservedVars("vtg", reserved) simplified := simplifier.SimplifyStatement( - stmt.(sqlparser.SelectStatement), + stmt.(sqlparser.TableStatement), vw.CurrentDb(), vw, keepSameError(query, reservedVars, vw, rewritten.BindVarNeeds), @@ -73,7 +73,7 @@ func TestSimplifyPanic(t *testing.T) { reservedVars := sqlparser.NewReservedVars("vtg", reserved) simplified := simplifier.SimplifyStatement( - stmt.(sqlparser.SelectStatement), + stmt.(sqlparser.TableStatement), vw.CurrentDb(), vw, keepPanicking(query, reservedVars, vw, rewritten.BindVarNeeds), @@ -95,7 +95,7 @@ func TestUnsupportedFile(t *testing.T) { log.Errorf("unsupported_cases.txt - %s", tcase.Query) stmt, reserved, err := sqlparser.NewTestParser().Parse2(tcase.Query) require.NoError(t, err) - _, ok := stmt.(sqlparser.SelectStatement) + _, ok := stmt.(sqlparser.TableStatement) if !ok { t.Skip() return @@ -110,7 +110,7 @@ func TestUnsupportedFile(t *testing.T) { origQuery := sqlparser.String(ast) stmt, _, _ = sqlparser.NewTestParser().Parse2(tcase.Query) simplified := simplifier.SimplifyStatement( - stmt.(sqlparser.SelectStatement), + stmt.(sqlparser.TableStatement), vw.CurrentDb(), vw, keepSameError(tcase.Query, reservedVars, vw, rewritten.BindVarNeeds), @@ -128,7 +128,7 @@ func TestUnsupportedFile(t *testing.T) { } } -func keepSameError(query string, reservedVars *sqlparser.ReservedVars, vschema *vschemawrapper.VSchemaWrapper, needs *sqlparser.BindVarNeeds) func(statement sqlparser.SelectStatement) bool { +func keepSameError(query string, reservedVars *sqlparser.ReservedVars, vschema *vschemawrapper.VSchemaWrapper, needs *sqlparser.BindVarNeeds) func(statement sqlparser.TableStatement) bool { stmt, _, err := sqlparser.NewTestParser().Parse2(query) if err != nil { panic(err) @@ -139,7 +139,7 @@ func keepSameError(query string, reservedVars *sqlparser.ReservedVars, vschema * if expected == nil { panic("query does not fail to plan") } - return func(statement sqlparser.SelectStatement) bool { + return func(statement sqlparser.TableStatement) bool { _, myErr := BuildFromStmt(context.Background(), query, statement, reservedVars, vschema, needs, staticConfig{}) if myErr == nil { return false @@ -152,8 +152,8 @@ func keepSameError(query string, reservedVars *sqlparser.ReservedVars, vschema * } } -func keepPanicking(query string, reservedVars *sqlparser.ReservedVars, vschema *vschemawrapper.VSchemaWrapper, needs *sqlparser.BindVarNeeds) func(statement sqlparser.SelectStatement) bool { - cmp := func(statement sqlparser.SelectStatement) (res bool) { +func keepPanicking(query string, reservedVars *sqlparser.ReservedVars, vschema *vschemawrapper.VSchemaWrapper, needs *sqlparser.BindVarNeeds) func(statement sqlparser.TableStatement) bool { + cmp := func(statement sqlparser.TableStatement) (res bool) { defer func() { r := recover() if r != nil { @@ -172,7 +172,7 @@ func keepPanicking(query string, reservedVars *sqlparser.ReservedVars, vschema * if err != nil { panic(err.Error()) } - if !cmp(stmt.(sqlparser.SelectStatement)) { + if !cmp(stmt.(sqlparser.TableStatement)) { panic("query is not panicking") } diff --git a/go/vt/vtgate/planbuilder/testdata/bypass_keyrange_cases.json b/go/vt/vtgate/planbuilder/testdata/bypass_keyrange_cases.json index b13bafd77f8..e1ff7de97a0 100644 --- a/go/vt/vtgate/planbuilder/testdata/bypass_keyrange_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/bypass_keyrange_cases.json @@ -164,5 +164,22 @@ "Query": "create /* test */ table t1(id bigint, primary key(id)) /* comments */" } } + }, + { + "comment": "remove the matching keyspace from shard targeted query", + "query": "select count(*), col from `main`.unsharded join vt_main.t1 where exists (select 1 from main.t2 join information_schema.tables where table_name = 't3')", + "plan": { + "QueryType": "SELECT", + "Original": "select count(*), col from `main`.unsharded join vt_main.t1 where exists (select 1 from main.t2 join information_schema.tables where table_name = 't3')", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "ExactKeyRange(-)", + "Query": "select count(*), col from unsharded join vt_main.t1 where exists (select 1 from t2 join information_schema.`tables` where table_name = 't3')" + } + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/bypass_shard_cases.json b/go/vt/vtgate/planbuilder/testdata/bypass_shard_cases.json index 02a00444724..80d4dbbd08b 100644 --- a/go/vt/vtgate/planbuilder/testdata/bypass_shard_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/bypass_shard_cases.json @@ -251,5 +251,22 @@ "QueryTimeout": 100 } } + }, + { + "comment": "remove the matching keyspace from shard targeted query", + "query": "select count(*), col from `main`.unsharded join vt_main.t1 where exists (select 1 from main.t2 join information_schema.tables where table_name = 't3')", + "plan": { + "QueryType": "SELECT", + "Original": "select count(*), col from `main`.unsharded join vt_main.t1 where exists (select 1 from main.t2 join information_schema.tables where table_name = 't3')", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "Shard(-80)", + "Query": "select count(*), col from unsharded join vt_main.t1 where exists (select 1 from t2 join information_schema.`tables` where table_name = 't3')" + } + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/other_read_cases.json b/go/vt/vtgate/planbuilder/testdata/other_read_cases.json index 2258bcd768c..1a7c9ddac2a 100644 --- a/go/vt/vtgate/planbuilder/testdata/other_read_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/other_read_cases.json @@ -8,24 +8,24 @@ "Instructions": { "OperatorType": "Send", "Keyspace": { - "Name": "main", - "Sharded": false + "Name": "user", + "Sharded": true }, "TargetDestination": "AnyShard()", "Query": "explain select * from `user`", "SingleShardOnly": true }, "TablesUsed": [ - "main.user" + "user.user" ] } }, { "comment": "Analyze statement", - "query": "analyze table t1", + "query": "analyze table main.t1", "plan": { "QueryType": "ANALYZE", - "Original": "analyze table t1", + "Original": "analyze table main.t1", "Instructions": { "OperatorType": "Send", "Keyspace": { @@ -42,43 +42,43 @@ }, { "comment": "Describe statement", - "query": "describe select * from t", + "query": "describe select * from user", "plan": { "QueryType": "EXPLAIN", - "Original": "describe select * from t", + "Original": "describe select * from user", "Instructions": { "OperatorType": "Send", "Keyspace": { - "Name": "main", - "Sharded": false + "Name": "user", + "Sharded": true }, "TargetDestination": "AnyShard()", - "Query": "explain select * from t", + "Query": "explain select * from `user`", "SingleShardOnly": true }, "TablesUsed": [ - "main.t" + "user.user" ] } }, { "comment": "Desc statement", - "query": "desc select * from t", + "query": "desc select * from user", "plan": { "QueryType": "EXPLAIN", - "Original": "desc select * from t", + "Original": "desc select * from user", "Instructions": { "OperatorType": "Send", "Keyspace": { - "Name": "main", - "Sharded": false + "Name": "user", + "Sharded": true }, "TargetDestination": "AnyShard()", - "Query": "explain select * from t", + "Query": "explain select * from `user`", "SingleShardOnly": true }, "TablesUsed": [ - "main.t" + "user.user" ] } }, @@ -167,5 +167,31 @@ "main.administrable_role_authorizations" ] } + }, + { + "comment": "describe table without qualifier", + "query": "describe user", + "plan": { + "QueryType": "EXPLAIN", + "Original": "describe user", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "TargetDestination": "AnyShard()", + "Query": "explain `user`", + "SingleShardOnly": true + }, + "TablesUsed": [ + "user.user" + ] + } + }, + { + "comment": "describe table does not exists", + "query": "describe unknown_table", + "plan": "table unknown_table not found" } ] diff --git a/go/vt/vtgate/planbuilder/vexplain.go b/go/vt/vtgate/planbuilder/vexplain.go index 7aed1e48884..a12139c3068 100644 --- a/go/vt/vtgate/planbuilder/vexplain.go +++ b/go/vt/vtgate/planbuilder/vexplain.go @@ -55,7 +55,7 @@ func buildVExplainPlan( func explainTabPlan(explain *sqlparser.ExplainTab, vschema plancontext.VSchema) (*planResult, error) { var keyspace *vindexes.Keyspace - var destination key.Destination + var dest key.Destination if sqlparser.SystemSchema(explain.Table.Qualifier.String()) { var err error @@ -64,30 +64,26 @@ func explainTabPlan(explain *sqlparser.ExplainTab, vschema plancontext.VSchema) return nil, err } } else { + var tbl *vindexes.Table var err error - var ks string - _, _, ks, _, destination, err = vschema.FindTableOrVindex(explain.Table) + tbl, _, _, _, dest, err = vschema.FindTableOrVindex(explain.Table) if err != nil { return nil, err } - explain.Table.Qualifier = sqlparser.NewIdentifierCS("") - - keyspace, err = vschema.FindKeyspace(ks) - if err != nil { - return nil, err - } - if keyspace == nil { - return nil, vterrors.VT14004(ks) + if tbl == nil { + return nil, vterrors.VT05004(explain.Table.Name.String()) } + keyspace = tbl.Keyspace + explain.Table = sqlparser.NewTableName(tbl.Name.String()) } - if destination == nil { - destination = key.DestinationAnyShard{} + if dest == nil { + dest = key.DestinationAnyShard{} } return newPlanResult(&engine.Send{ Keyspace: keyspace, - TargetDestination: destination, + TargetDestination: dest, Query: sqlparser.String(explain), SingleShardOnly: true, }, singleTable(keyspace.Name, explain.Table.Name.String())), nil diff --git a/go/vt/vtgate/querylog.go b/go/vt/vtgate/querylog.go index bddc799363d..686ff419764 100644 --- a/go/vt/vtgate/querylog.go +++ b/go/vt/vtgate/querylog.go @@ -49,8 +49,8 @@ func (e *Executor) defaultQueryLogger() error { queryzHandler(e, w, r) }) - if queryLogToFile != "" { - _, err := queryLogger.LogToFile(queryLogToFile, streamlog.GetFormatter(queryLogger)) + if e.config.QueryLogToFile != "" { + _, err := queryLogger.LogToFile(e.config.QueryLogToFile, streamlog.GetFormatter(queryLogger)) if err != nil { return err } diff --git a/go/vt/vtgate/querylogz_test.go b/go/vt/vtgate/querylogz_test.go index 9236b2ac840..2bc5d7e2295 100644 --- a/go/vt/vtgate/querylogz_test.go +++ b/go/vt/vtgate/querylogz_test.go @@ -26,16 +26,17 @@ import ( "testing" "time" + "vitess.io/vitess/go/streamlog" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtgate/logstats" - "vitess.io/vitess/go/streamlog" "vitess.io/vitess/go/vt/callerid" ) func TestQuerylogzHandlerFormatting(t *testing.T) { req, _ := http.NewRequest("GET", "/querylogz?timeout=10&limit=1", nil) - logStats := logstats.NewLogStats(context.Background(), "Execute", "select name, 'inject ' from test_table limit 1000", "suuid", nil) + logStats := logstats.NewLogStats(context.Background(), "Execute", + "select name, 'inject ' from test_table limit 1000", "suuid", nil, streamlog.NewQueryLogConfigForTest()) logStats.StmtType = "select" logStats.RowsAffected = 1000 logStats.ShardQueries = 1 @@ -139,8 +140,7 @@ func TestQuerylogzHandlerFormatting(t *testing.T) { checkQuerylogzHasStats(t, slowQueryPattern, logStats, body) // ensure querylogz is not affected by the filter tag - streamlog.SetQueryLogFilterTag("XXX_SKIP_ME") - defer func() { streamlog.SetQueryLogFilterTag("") }() + logStats.Config.FilterTag = "XXX_SKIP_ME" ch = make(chan *logstats.LogStats, 1) ch <- logStats querylogzHandler(ch, response, req, sqlparser.NewTestParser()) diff --git a/go/vt/vtgate/schema/tracker.go b/go/vt/vtgate/schema/tracker.go index a1b2009d0e1..8fa41712223 100644 --- a/go/vt/vtgate/schema/tracker.go +++ b/go/vt/vtgate/schema/tracker.go @@ -73,7 +73,7 @@ func NewTracker(ch chan *discovery.TabletHealth, enableViews, enableUDFs bool, p } if enableViews { - t.views = &viewMap{m: map[keyspaceStr]map[viewNameStr]sqlparser.SelectStatement{}, parser: parser} + t.views = &viewMap{m: map[keyspaceStr]map[viewNameStr]sqlparser.TableStatement{}, parser: parser} } if enableUDFs { t.udfs = map[keyspaceStr][]string{} @@ -283,7 +283,7 @@ func (t *Tracker) Tables(ks string) map[string]*vindexes.TableInfo { } // Views returns all known views in the keyspace with their definition. -func (t *Tracker) Views(ks string) map[string]sqlparser.SelectStatement { +func (t *Tracker) Views(ks string) map[string]sqlparser.TableStatement { if t.views == nil { return nil } @@ -525,14 +525,14 @@ func (t *Tracker) clearKeyspaceTables(ks string) { } type viewMap struct { - m map[keyspaceStr]map[viewNameStr]sqlparser.SelectStatement + m map[keyspaceStr]map[viewNameStr]sqlparser.TableStatement parser *sqlparser.Parser } func (vm *viewMap) set(ks, tbl, sql string) { m := vm.m[ks] if m == nil { - m = make(map[tableNameStr]sqlparser.SelectStatement) + m = make(map[tableNameStr]sqlparser.TableStatement) vm.m[ks] = m } stmt, err := vm.parser.Parse(sql) @@ -548,7 +548,7 @@ func (vm *viewMap) set(ks, tbl, sql string) { m[tbl] = cv.Select } -func (vm *viewMap) get(ks, tbl string) sqlparser.SelectStatement { +func (vm *viewMap) get(ks, tbl string) sqlparser.TableStatement { m := vm.m[ks] if m == nil { return nil @@ -571,7 +571,7 @@ func (t *Tracker) clearKeyspaceViews(ks string) { } // GetViews returns the view statement for the given keyspace and view name. -func (t *Tracker) GetViews(ks string, tbl string) sqlparser.SelectStatement { +func (t *Tracker) GetViews(ks string, tbl string) sqlparser.TableStatement { t.mu.Lock() defer t.mu.Unlock() diff --git a/go/vt/vtgate/semantics/analyzer.go b/go/vt/vtgate/semantics/analyzer.go index 62cdc019ddf..c4e7dc55866 100644 --- a/go/vt/vtgate/semantics/analyzer.go +++ b/go/vt/vtgate/semantics/analyzer.go @@ -286,14 +286,22 @@ func containsStar(s sqlparser.SelectExprs) bool { } func checkUnionColumns(union *sqlparser.Union) error { - firstProj := sqlparser.GetFirstSelect(union).SelectExprs + lft, err := sqlparser.GetFirstSelect(union) + if err != nil { + return err + } + firstProj := lft.GetColumns() if containsStar(firstProj) { // if we still have *, we can't figure out if the query is invalid or not // we'll fail it at run time instead return nil } - secondProj := sqlparser.GetFirstSelect(union.Right).SelectExprs + rgt, err := sqlparser.GetFirstSelect(union.Right) + if err != nil { + return err + } + secondProj := rgt.GetColumns() if containsStar(secondProj) { return nil } diff --git a/go/vt/vtgate/semantics/analyzer_test.go b/go/vt/vtgate/semantics/analyzer_test.go index de8fbdee0d7..3f7a21cb6ac 100644 --- a/go/vt/vtgate/semantics/analyzer_test.go +++ b/go/vt/vtgate/semantics/analyzer_test.go @@ -1003,8 +1003,10 @@ func TestUnionWithOrderBy(t *testing.T) { stmt, semTable := parseAndAnalyze(t, query, "") union, _ := stmt.(*sqlparser.Union) - sel1 := sqlparser.GetFirstSelect(union) - sel2 := sqlparser.GetFirstSelect(union.Right) + sel1, err := sqlparser.GetFirstSelect(union) + require.NoError(t, err) + sel2, err := sqlparser.GetFirstSelect(union.Right) + require.NoError(t, err) t1 := sel1.From[0].(*sqlparser.AliasedTableExpr) t2 := sel2.From[0].(*sqlparser.AliasedTableExpr) diff --git a/go/vt/vtgate/semantics/cte_table.go b/go/vt/vtgate/semantics/cte_table.go index 498fc5076c1..7083fea10d2 100644 --- a/go/vt/vtgate/semantics/cte_table.go +++ b/go/vt/vtgate/semantics/cte_table.go @@ -150,7 +150,7 @@ func (cte *CTETable) GetMirrorRule() *vindexes.MirrorRule { type CTE struct { Name string - Query sqlparser.SelectStatement + Query sqlparser.TableStatement isAuthoritative bool recursiveDeps *TableSet Columns sqlparser.Columns diff --git a/go/vt/vtgate/semantics/early_rewriter.go b/go/vt/vtgate/semantics/early_rewriter.go index 3e53ed0816a..64426e25748 100644 --- a/go/vt/vtgate/semantics/early_rewriter.go +++ b/go/vt/vtgate/semantics/early_rewriter.go @@ -385,12 +385,16 @@ func getIntLiteral(e sqlparser.Expr) *sqlparser.Literal { // handleOrderBy processes the ORDER BY clause. func (r *earlyRewriter) handleOrderBy(parent sqlparser.SQLNode, iter iterator) error { - stmt, ok := parent.(sqlparser.SelectStatement) + stmt, ok := parent.(sqlparser.TableStatement) if !ok { return nil } - sel := sqlparser.GetFirstSelect(stmt) + sel, err := sqlparser.GetFirstSelect(stmt) + if err != nil { + return err + } + for e := iter.next(); e != nil; e = iter.next() { lit, err := r.replaceLiteralsInOrderBy(e, iter) if err != nil { @@ -419,12 +423,15 @@ func (r *earlyRewriter) handleOrderBy(parent sqlparser.SQLNode, iter iterator) e // handleGroupBy processes the GROUP BY clause. func (r *earlyRewriter) handleGroupBy(parent sqlparser.SQLNode, iter iterator) error { - stmt, ok := parent.(sqlparser.SelectStatement) + stmt, ok := parent.(*sqlparser.Select) if !ok { return nil } - sel := sqlparser.GetFirstSelect(stmt) + sel, err := sqlparser.GetFirstSelect(stmt) + if err != nil { + return err + } for e := iter.next(); e != nil; e = iter.next() { expr, err := r.replaceLiteralsInGroupBy(e) if err != nil { @@ -435,7 +442,6 @@ func (r *earlyRewriter) handleGroupBy(parent sqlparser.SQLNode, iter iterator) e if err != nil { return err } - } err = iter.replace(expr) if err != nil { diff --git a/go/vt/vtgate/semantics/info_schema.go b/go/vt/vtgate/semantics/info_schema.go index 127f4a00960..b33a20620e4 100644 --- a/go/vt/vtgate/semantics/info_schema.go +++ b/go/vt/vtgate/semantics/info_schema.go @@ -699,7 +699,7 @@ func getInfoSchema57() map[string][]vindexes.Column { // getInfoSchema80 returns a map of all information_schema tables and their columns with types // To recreate this information from MySQL, you can run the test in info_schema_gen_test.go func getInfoSchema80() map[string][]vindexes.Column { - parser, err := sqlparser.New(sqlparser.Options{MySQLServerVersion: "8.0.30"}) + parser, err := sqlparser.New(sqlparser.Options{MySQLServerVersion: "8.0.40"}) if err != nil { panic(err) } diff --git a/go/vt/vtgate/semantics/scoper.go b/go/vt/vtgate/semantics/scoper.go index 9d596d9ecd1..e6df3c3a5b0 100644 --- a/go/vt/vtgate/semantics/scoper.go +++ b/go/vt/vtgate/semantics/scoper.go @@ -297,11 +297,11 @@ func (s *scoper) createSpecialScopePostProjection(parent sqlparser.SQLNode) erro for i, sel := range sqlparser.GetAllSelects(parent) { if i == 0 { nScope.stmt = sel - tableInfo = createVTableInfoForExpressions(sel.SelectExprs, nil /*needed for star expressions*/, s.org) + tableInfo = createVTableInfoForExpressions(sel.GetColumns(), nil /*needed for star expressions*/, s.org) nScope.tables = append(nScope.tables, tableInfo) continue } - thisTableInfo := createVTableInfoForExpressions(sel.SelectExprs, nil /*needed for star expressions*/, s.org) + thisTableInfo := createVTableInfoForExpressions(sel.GetColumns(), nil /*needed for star expressions*/, s.org) if len(tableInfo.cols) != len(thisTableInfo.cols) { return vterrors.NewErrorf(vtrpcpb.Code_FAILED_PRECONDITION, vterrors.WrongNumberOfColumnsInSelect, "The used SELECT statements have a different number of columns") } diff --git a/go/vt/vtgate/semantics/semantic_table.go b/go/vt/vtgate/semantics/semantic_table.go index 30a41ba5f12..e3eead71c90 100644 --- a/go/vt/vtgate/semantics/semantic_table.go +++ b/go/vt/vtgate/semantics/semantic_table.go @@ -493,7 +493,7 @@ func (st *SemTable) ForeignKeysPresent() bool { return false } -func (st *SemTable) SelectExprs(sel sqlparser.SelectStatement) sqlparser.SelectExprs { +func (st *SemTable) SelectExprs(sel sqlparser.TableStatement) sqlparser.SelectExprs { switch sel := sel.(type) { case *sqlparser.Select: return sel.SelectExprs diff --git a/go/vt/vtgate/semantics/table_collector.go b/go/vt/vtgate/semantics/table_collector.go index 45a50fd23a2..329ebcef254 100644 --- a/go/vt/vtgate/semantics/table_collector.go +++ b/go/vt/vtgate/semantics/table_collector.go @@ -154,8 +154,11 @@ func (tc *tableCollector) visitAliasedTableExpr(node *sqlparser.AliasedTableExpr } func (tc *tableCollector) visitUnion(union *sqlparser.Union) error { - firstSelect := sqlparser.GetFirstSelect(union) - expanded, selectExprs := getColumnNames(firstSelect.SelectExprs) + firstSelect, err := sqlparser.GetFirstSelect(union) + if err != nil { + return err + } + expanded, selectExprs := getColumnNames(firstSelect.GetColumns()) info := unionInfo{ isAuthoritative: expanded, exprs: selectExprs, @@ -165,12 +168,12 @@ func (tc *tableCollector) visitUnion(union *sqlparser.Union) error { return nil } - size := len(firstSelect.SelectExprs) + size := firstSelect.GetColumnCount() info.recursive = make([]TableSet, size) typers := make([]evalengine.TypeAggregator, size) collations := tc.org.collationEnv() - err := sqlparser.VisitAllSelects(union, func(s *sqlparser.Select, idx int) error { + err = sqlparser.VisitAllSelects(union, func(s *sqlparser.Select, idx int) error { for i, expr := range s.SelectExprs { ae, ok := expr.(*sqlparser.AliasedExpr) if !ok { @@ -413,7 +416,10 @@ func checkValidRecursiveCTE(cteDef *CTE) error { return vterrors.VT09026(cteDef.Name) } - firstSelect := sqlparser.GetFirstSelect(union.Right) + firstSelect, err := sqlparser.GetFirstSelect(union.Right) + if err != nil { + return err + } if firstSelect.GroupBy != nil { return vterrors.VT09027(cteDef.Name) } @@ -470,8 +476,16 @@ func (tc *tableCollector) addSelectDerivedTable( return scope.addTable(tableInfo) } -func (tc *tableCollector) addUnionDerivedTable(union *sqlparser.Union, node *sqlparser.AliasedTableExpr, columns sqlparser.Columns, alias sqlparser.IdentifierCS) error { - firstSelect := sqlparser.GetFirstSelect(union) +func (tc *tableCollector) addUnionDerivedTable( + union *sqlparser.Union, + node *sqlparser.AliasedTableExpr, + columns sqlparser.Columns, + alias sqlparser.IdentifierCS, +) error { + firstSelect, err := sqlparser.GetFirstSelect(union) + if err != nil { + return err + } tables := tc.scoper.wScope[firstSelect] info, found := tc.unionInfo[union] if !found { diff --git a/go/vt/vtgate/simplifier/simplifier.go b/go/vt/vtgate/simplifier/simplifier.go index e838450e3a2..c15e2ea58d1 100644 --- a/go/vt/vtgate/simplifier/simplifier.go +++ b/go/vt/vtgate/simplifier/simplifier.go @@ -25,17 +25,17 @@ import ( // SimplifyStatement simplifies the AST of a query. It basically iteratively prunes leaves of the AST, as long as the pruning // continues to return true from the `test` function. func SimplifyStatement( - in sqlparser.SelectStatement, + in sqlparser.TableStatement, currentDB string, si semantics.SchemaInformation, - testF func(sqlparser.SelectStatement) bool, -) sqlparser.SelectStatement { + testF func(sqlparser.TableStatement) bool, +) sqlparser.TableStatement { tables, err := getTables(in, currentDB, si) if err != nil { panic(err) } - test := func(s sqlparser.SelectStatement) bool { + test := func(s sqlparser.TableStatement) bool { // Since our semantic analysis changes the AST, we clone it first, so we have a pristine AST to play with return testF(sqlparser.Clone(s)) } @@ -68,7 +68,7 @@ func SimplifyStatement( return in } -func trySimplifyDistinct(in sqlparser.SelectStatement, test func(statement sqlparser.SelectStatement) bool) sqlparser.SelectStatement { +func trySimplifyDistinct(in sqlparser.TableStatement, test func(statement sqlparser.TableStatement) bool) sqlparser.TableStatement { simplified := false alwaysVisitChildren := func(node, parent sqlparser.SQLNode) bool { return true @@ -100,7 +100,7 @@ func trySimplifyDistinct(in sqlparser.SelectStatement, test func(statement sqlpa return nil } -func trySimplifyExpressions(in sqlparser.SelectStatement, test func(sqlparser.SelectStatement) bool) sqlparser.SelectStatement { +func trySimplifyExpressions(in sqlparser.TableStatement, test func(sqlparser.TableStatement) bool) sqlparser.TableStatement { simplified := false visit := func(cursor expressionCursor) bool { // first - let's try to remove the expression @@ -141,7 +141,7 @@ func trySimplifyExpressions(in sqlparser.SelectStatement, test func(sqlparser.Se return nil } -func trySimplifyUnions(in sqlparser.SelectStatement, test func(sqlparser.SelectStatement) bool) (res sqlparser.SelectStatement) { +func trySimplifyUnions(in sqlparser.TableStatement, test func(subquery sqlparser.TableStatement) bool) (res sqlparser.TableStatement) { if union, ok := in.(*sqlparser.Union); ok { // the root object is an UNION if test(sqlparser.Clone(union.Left)) { @@ -193,7 +193,7 @@ func trySimplifyUnions(in sqlparser.SelectStatement, test func(sqlparser.SelectS return nil } -func tryRemoveTable(tables []semantics.TableInfo, in sqlparser.SelectStatement, currentDB string, si semantics.SchemaInformation, test func(sqlparser.SelectStatement) bool) sqlparser.SelectStatement { +func tryRemoveTable(tables []semantics.TableInfo, in sqlparser.TableStatement, currentDB string, si semantics.SchemaInformation, test func(sqlparser.TableStatement) bool) sqlparser.TableStatement { // we start by removing one table at a time, and see if we still have an interesting plan for idx, tbl := range tables { clone := sqlparser.Clone(in) @@ -209,7 +209,7 @@ func tryRemoveTable(tables []semantics.TableInfo, in sqlparser.SelectStatement, return nil } -func getTables(in sqlparser.SelectStatement, currentDB string, si semantics.SchemaInformation) ([]semantics.TableInfo, error) { +func getTables(in sqlparser.TableStatement, currentDB string, si semantics.SchemaInformation) ([]semantics.TableInfo, error) { // Since our semantic analysis changes the AST, we clone it first, so we have a pristine AST to play with clone := sqlparser.Clone(in) semTable, err := semantics.Analyze(clone, currentDB, si) @@ -219,7 +219,7 @@ func getTables(in sqlparser.SelectStatement, currentDB string, si semantics.Sche return semTable.Tables, nil } -func simplifyStarExpr(in sqlparser.SelectStatement, test func(sqlparser.SelectStatement) bool) sqlparser.SelectStatement { +func simplifyStarExpr(in sqlparser.TableStatement, test func(sqlparser.TableStatement) bool) sqlparser.TableStatement { simplified := false alwaysVisitChildren := func(node, parent sqlparser.SQLNode) bool { return true @@ -254,7 +254,7 @@ func simplifyStarExpr(in sqlparser.SelectStatement, test func(sqlparser.SelectSt // removeTable removes the table with the given index from the select statement, which includes the FROM clause // but also all expressions and predicates that depend on the table -func removeTable(clone sqlparser.SelectStatement, searchedTS semantics.TableSet, db string, si semantics.SchemaInformation) bool { +func removeTable(clone sqlparser.TableStatement, searchedTS semantics.TableSet, db string, si semantics.SchemaInformation) bool { semTable, err := semantics.Analyze(clone, db, si) if err != nil { panic(err) @@ -429,7 +429,7 @@ func newExprCursor(expr sqlparser.Expr, replace func(replaceWith sqlparser.Expr) // This cursor has a few extra capabilities that the normal sqlparser.SafeRewrite does not have, // such as visiting and being able to change individual expressions in a AND tree // if visit returns true, then traversal continues, otherwise traversal stops -func visitAllExpressionsInAST(clone sqlparser.SelectStatement, visit func(expressionCursor) bool) { +func visitAllExpressionsInAST(clone sqlparser.TableStatement, visit func(expressionCursor) bool) { alwaysVisitChildren := func(node, parent sqlparser.SQLNode) bool { return true } diff --git a/go/vt/vtgate/simplifier/simplifier_test.go b/go/vt/vtgate/simplifier/simplifier_test.go index 340497da8ef..0948f720f2d 100644 --- a/go/vt/vtgate/simplifier/simplifier_test.go +++ b/go/vt/vtgate/simplifier/simplifier_test.go @@ -52,7 +52,7 @@ limit 123 offset 456 ` ast, err := sqlparser.NewTestParser().Parse(query) require.NoError(t, err) - visitAllExpressionsInAST(ast.(sqlparser.SelectStatement), func(cursor expressionCursor) bool { + visitAllExpressionsInAST(ast.(sqlparser.TableStatement), func(cursor expressionCursor) bool { fmt.Printf(">> found expression: %s\n", sqlparser.String(cursor.expr)) cursor.remove() fmt.Printf("remove: %s\n", sqlparser.String(ast)) @@ -70,7 +70,7 @@ func TestAbortExpressionCursor(t *testing.T) { query := "select user.id, count(*), unsharded.name from user join unsharded on 13 = 14 where unsharded.id = 42 and name = 'foo' and user.id = unsharded.id" ast, err := sqlparser.NewTestParser().Parse(query) require.NoError(t, err) - visitAllExpressionsInAST(ast.(sqlparser.SelectStatement), func(cursor expressionCursor) bool { + visitAllExpressionsInAST(ast.(sqlparser.TableStatement), func(cursor expressionCursor) bool { fmt.Println(sqlparser.String(cursor.expr)) cursor.replace(sqlparser.NewIntLiteral("1")) fmt.Println(sqlparser.String(ast)) diff --git a/go/vt/vtgate/vindexes/vschema.go b/go/vt/vtgate/vindexes/vschema.go index 278dd6932ae..05081a3c9ba 100644 --- a/go/vt/vtgate/vindexes/vschema.go +++ b/go/vt/vtgate/vindexes/vschema.go @@ -57,6 +57,7 @@ const ( TypeTable = "" TypeSequence = "sequence" TypeReference = "reference" + TypeView = "view" ) // VSchema represents the denormalized version of SrvVSchema, @@ -263,7 +264,7 @@ type KeyspaceSchema struct { ForeignKeyMode vschemapb.Keyspace_ForeignKeyMode Tables map[string]*Table Vindexes map[string]Vindex - Views map[string]sqlparser.SelectStatement + Views map[string]sqlparser.TableStatement Error error MultiTenantSpec *vschemapb.MultiTenantSpec @@ -430,16 +431,16 @@ func (vschema *VSchema) AddView(ksname, viewName, query string, parser *sqlparse if err != nil { return err } - selectStmt, ok := ast.(sqlparser.SelectStatement) + selectStmt, ok := ast.(sqlparser.TableStatement) if !ok { return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "expected SELECT or UNION query, got %T", ast) } if ks.Views == nil { - ks.Views = make(map[string]sqlparser.SelectStatement) + ks.Views = make(map[string]sqlparser.TableStatement) } ks.Views[viewName] = selectStmt t := &Table{ - Type: "View", + Type: TypeView, Name: sqlparser.NewIdentifierCS(viewName), Keyspace: ks.Keyspace, ColumnListAuthoritative: true, @@ -1476,7 +1477,7 @@ func (vschema *VSchema) FindTableOrVindex(keyspace, name string, tabletType topo return nil, nil, NotFoundError{TableName: name} } -func (vschema *VSchema) FindView(keyspace, name string) sqlparser.SelectStatement { +func (vschema *VSchema) FindView(keyspace, name string) sqlparser.TableStatement { if keyspace == "" { switch { case len(vschema.Keyspaces) == 1: diff --git a/go/vt/vtgate/vschema_manager.go b/go/vt/vtgate/vschema_manager.go index 290971c45ed..49674951ed7 100644 --- a/go/vt/vtgate/vschema_manager.go +++ b/go/vt/vtgate/vschema_manager.go @@ -49,7 +49,7 @@ type VSchemaManager struct { // SchemaInfo is an interface to schema tracker. type SchemaInfo interface { Tables(ks string) map[string]*vindexes.TableInfo - Views(ks string) map[string]sqlparser.SelectStatement + Views(ks string) map[string]sqlparser.TableStatement UDFs(ks string) []string } @@ -204,21 +204,34 @@ func (vm *VSchemaManager) buildAndEnhanceVSchema(v *vschemapb.SrvVSchema) *vinde func (vm *VSchemaManager) updateFromSchema(vschema *vindexes.VSchema) { for ksName, ks := range vschema.Keyspaces { - vm.updateTableInfo(vschema, ks, ksName) vm.updateViewInfo(ks, ksName) + vm.updateTableInfo(vschema, ks, ksName) vm.updateUDFsInfo(ks, ksName) } } func (vm *VSchemaManager) updateViewInfo(ks *vindexes.KeyspaceSchema, ksName string) { views := vm.schema.Views(ksName) - if views != nil { - ks.Views = make(map[string]sqlparser.SelectStatement, len(views)) - for name, def := range views { - ks.Views[name] = sqlparser.Clone(def) + if views == nil { + return + } + ks.Views = make(map[string]sqlparser.TableStatement, len(views)) + for name, def := range views { + ks.Views[name] = sqlparser.Clone(def) + vTbl, ok := ks.Tables[name] + if ok { + vTbl.Type = vindexes.TypeView + } else { + // Adding view to the VSchema as a table. + ks.Tables[name] = &vindexes.Table{ + Type: vindexes.TypeView, + Name: sqlparser.NewIdentifierCS(name), + Keyspace: ks.Keyspace, + } } } } + func (vm *VSchemaManager) updateTableInfo(vschema *vindexes.VSchema, ks *vindexes.KeyspaceSchema, ksName string) { m := vm.schema.Tables(ksName) // Before we add the foreign key definitions in the tables, we need to make sure that all the tables diff --git a/go/vt/vtgate/vschema_manager_test.go b/go/vt/vtgate/vschema_manager_test.go index 8db0c2df05b..b4b7a20804f 100644 --- a/go/vt/vtgate/vschema_manager_test.go +++ b/go/vt/vtgate/vschema_manager_test.go @@ -900,7 +900,7 @@ func (f *fakeSchema) Tables(string) map[string]*vindexes.TableInfo { return f.t } -func (f *fakeSchema) Views(string) map[string]sqlparser.SelectStatement { +func (f *fakeSchema) Views(string) map[string]sqlparser.TableStatement { return nil } func (f *fakeSchema) UDFs(string) []string { return f.udfs } diff --git a/go/vt/vtgate/vtgate.go b/go/vt/vtgate/vtgate.go index a1dcd3219f6..8b8302d77d4 100644 --- a/go/vt/vtgate/vtgate.go +++ b/go/vt/vtgate/vtgate.go @@ -143,7 +143,7 @@ var ( // schema tracking flags enableSchemaChangeSignal = true - enableViews bool + enableViews = true enableUdfs bool // vtgate views flags @@ -352,22 +352,15 @@ func Init( plans := DefaultPlanCache() - executor := NewExecutor( - ctx, - env, - serv, - cell, - resolver, - normalizeQueries, - warnShardedOnly, - streamBufferSize, - plans, - si, - noScatter, - pv, - warmingReadsPercent, - dynamicConfig, - ) + eConfig := ExecutorConfig{ + Normalize: normalizeQueries, + StreamSize: streamBufferSize, + AllowScatter: !noScatter, + WarmingReadsPercent: warmingReadsPercent, + QueryLogToFile: queryLogToFile, + } + + executor := NewExecutor(ctx, env, serv, cell, resolver, eConfig, warnShardedOnly, plans, si, pv, dynamicConfig) if err := executor.defaultQueryLogger(); err != nil { log.Fatalf("error initializing query logger: %v", err) diff --git a/go/vt/vtgate/vtgate_test.go b/go/vt/vtgate/vtgate_test.go index c113ed16308..f05f63474d0 100644 --- a/go/vt/vtgate/vtgate_test.go +++ b/go/vt/vtgate/vtgate_test.go @@ -715,8 +715,7 @@ func createVtgateEnv(t testing.TB) (*VTGate, *sandboxconn.SandboxConn, context.C cell := "aa" sb := createSandbox(KsTestSharded) sb.ShardSpec = "-" - executor, _, _, sbc, ctx := createExecutorEnv(t) - executor.normalize = normalizeQueries + executor, _, _, sbc, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) vsm := newVStreamManager(executor.resolver.resolver, executor.serv, cell) vtg := newVTGate(executor, executor.resolver, vsm, nil, executor.scatterConn.gateway) diff --git a/go/vt/vtorc/config/config.go b/go/vt/vtorc/config/config.go index cafff5acce8..db367673aeb 100644 --- a/go/vt/vtorc/config/config.go +++ b/go/vt/vtorc/config/config.go @@ -174,6 +174,15 @@ var ( Dynamic: true, }, ) + + enablePrimaryDiskStalledRecovery = viperutil.Configure( + "enable-primary-disk-stalled-recovery", + viperutil.Options[bool]{ + FlagName: "enable-primary-disk-stalled-recovery", + Default: false, + Dynamic: true, + }, + ) ) func init() { @@ -197,6 +206,7 @@ func registerFlags(fs *pflag.FlagSet) { fs.Duration("recovery-poll-duration", recoveryPollDuration.Default(), "Timer duration on which VTOrc polls its database to run a recovery") fs.Bool("allow-emergency-reparent", ersEnabled.Default(), "Whether VTOrc should be allowed to run emergency reparent operation when it detects a dead primary") fs.Bool("change-tablets-with-errant-gtid-to-drained", convertTabletsWithErrantGTIDs.Default(), "Whether VTOrc should be changing the type of tablets with errant GTIDs to DRAINED") + fs.Bool("enable-primary-disk-stalled-recovery", enablePrimaryDiskStalledRecovery.Default(), "Whether VTOrc should detect a stalled disk on the primary and failover") viperutil.BindFlags(fs, instancePollTime, @@ -214,6 +224,7 @@ func registerFlags(fs *pflag.FlagSet) { recoveryPollDuration, ersEnabled, convertTabletsWithErrantGTIDs, + enablePrimaryDiskStalledRecovery, ) } @@ -332,6 +343,11 @@ func SetConvertTabletWithErrantGTIDs(val bool) { convertTabletsWithErrantGTIDs.Set(val) } +// GetStalledDiskPrimaryRecovery reports whether VTOrc is allowed to check for and recovery stalled disk problems. +func GetStalledDiskPrimaryRecovery() bool { + return enablePrimaryDiskStalledRecovery.Get() +} + // MarkConfigurationLoaded is called once configuration has first been loaded. // Listeners on ConfigurationLoaded will get a notification func MarkConfigurationLoaded() { diff --git a/go/vt/vtorc/db/generate_base.go b/go/vt/vtorc/db/generate_base.go index 21375fb8eb3..8baa9a12476 100644 --- a/go/vt/vtorc/db/generate_base.go +++ b/go/vt/vtorc/db/generate_base.go @@ -105,6 +105,7 @@ CREATE TABLE database_instance ( semi_sync_primary_status TINYint NOT NULL DEFAULT 0, semi_sync_replica_status TINYint NOT NULL DEFAULT 0, semi_sync_primary_clients int NOT NULL DEFAULT 0, + is_disk_stalled TINYint NOT NULL DEFAULT 0, PRIMARY KEY (alias) )`, ` diff --git a/go/vt/vtorc/inst/analysis.go b/go/vt/vtorc/inst/analysis.go index fa2e1a4ec95..6a800e5ee0b 100644 --- a/go/vt/vtorc/inst/analysis.go +++ b/go/vt/vtorc/inst/analysis.go @@ -56,6 +56,7 @@ const ( LockedSemiSyncPrimaryHypothesis AnalysisCode = "LockedSemiSyncPrimaryHypothesis" LockedSemiSyncPrimary AnalysisCode = "LockedSemiSyncPrimary" ErrantGTIDDetected AnalysisCode = "ErrantGTIDDetected" + PrimaryDiskStalled AnalysisCode = "PrimaryDiskStalled" ) type StructureAnalysisCode string @@ -129,6 +130,7 @@ type ReplicationAnalysis struct { MaxReplicaGTIDMode string MaxReplicaGTIDErrant string IsReadOnly bool + IsDiskStalled bool } func (replicationAnalysis *ReplicationAnalysis) MarshalJSON() ([]byte, error) { diff --git a/go/vt/vtorc/inst/analysis_dao.go b/go/vt/vtorc/inst/analysis_dao.go index 7837955c541..d487973b0f0 100644 --- a/go/vt/vtorc/inst/analysis_dao.go +++ b/go/vt/vtorc/inst/analysis_dao.go @@ -79,7 +79,7 @@ func GetReplicationAnalysis(keyspace string, shard string, hints *ReplicationAna vitess_keyspace.durability_policy AS durability_policy, vitess_shard.primary_timestamp AS shard_primary_term_timestamp, primary_instance.read_only AS read_only, - MIN(primary_instance.gtid_errant) AS gtid_errant, + MIN(primary_instance.gtid_errant) AS gtid_errant, MIN(primary_instance.alias) IS NULL AS is_invalid, MIN(primary_instance.binary_log_file) AS binary_log_file, MIN(primary_instance.binary_log_pos) AS binary_log_pos, @@ -233,7 +233,8 @@ func GetReplicationAnalysis(keyspace string, shard string, hints *ReplicationAna COUNT( DISTINCT case when replica_instance.log_bin AND replica_instance.log_replica_updates then replica_instance.major_version else NULL end - ) AS count_distinct_logging_major_versions + ) AS count_distinct_logging_major_versions, + primary_instance.is_disk_stalled != 0 AS is_disk_stalled FROM vitess_tablet JOIN vitess_keyspace ON ( @@ -354,6 +355,7 @@ func GetReplicationAnalysis(keyspace string, shard string, hints *ReplicationAna a.HeartbeatInterval = m.GetFloat64("heartbeat_interval") a.IsReadOnly = m.GetUint("read_only") == 1 + a.IsDiskStalled = m.GetBool("is_disk_stalled") if !a.LastCheckValid { analysisMessage := fmt.Sprintf("analysis: Alias: %+v, Keyspace: %+v, Shard: %+v, IsPrimary: %+v, LastCheckValid: %+v, LastCheckPartialSuccess: %+v, CountReplicas: %+v, CountValidReplicas: %+v, CountValidReplicatingReplicas: %+v, CountLaggingReplicas: %+v, CountDelayedReplicas: %+v", @@ -401,6 +403,10 @@ func GetReplicationAnalysis(keyspace string, shard string, hints *ReplicationAna } else if isInvalid { a.Analysis = InvalidReplica a.Description = "VTOrc hasn't been able to reach the replica even once since restart/shutdown" + } else if a.IsClusterPrimary && !a.LastCheckValid && a.IsDiskStalled { + a.Analysis = PrimaryDiskStalled + a.Description = "Primary has a stalled disk" + ca.hasClusterwideAction = true } else if a.IsClusterPrimary && !a.LastCheckValid && a.CountReplicas == 0 { a.Analysis = DeadPrimaryWithoutReplicas a.Description = "Primary cannot be reached by vtorc and has no replica" diff --git a/go/vt/vtorc/inst/analysis_dao_test.go b/go/vt/vtorc/inst/analysis_dao_test.go index ae4f7279403..baa1121b776 100644 --- a/go/vt/vtorc/inst/analysis_dao_test.go +++ b/go/vt/vtorc/inst/analysis_dao_test.go @@ -34,10 +34,10 @@ var ( // The initialSQL is a set of insert commands copied from a dump of an actual running VTOrc instances. The relevant insert commands are here. // This is a dump taken from a test running 4 tablets, zone1-101 is the primary, zone1-100 is a replica, zone1-112 is a rdonly and zone2-200 is a cross-cell replica. initialSQL = []string{ - `INSERT INTO database_instance VALUES('zone1-0000000112','localhost',6747,'2022-12-28 07:26:04','2022-12-28 07:26:04',213696377,'8.0.31','ROW',1,1,'vt-0000000112-bin.000001',15963,'localhost',6714,8,4.0,1,1,'vt-0000000101-bin.000001',15583,'vt-0000000101-bin.000001',15583,0,0,1,'','',1,'vt-0000000112-relay-bin.000002',15815,1,0,'zone1','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a5138-8680-11ed-9240-92a06c3be3c2','2022-12-28 07:26:04','',1,0,0,'Homebrew','8.0','FULL',10816929,0,0,'ON',1,'729a4cc4-8680-11ed-a104-47706090afbd','','729a4cc4-8680-11ed-a104-47706090afbd,729a5138-8680-11ed-9240-92a06c3be3c2',1,1,'',1000000000000000000,1,0,0,0);`, - `INSERT INTO database_instance VALUES('zone1-0000000100','localhost',6711,'2022-12-28 07:26:04','2022-12-28 07:26:04',1094500338,'8.0.31','ROW',1,1,'vt-0000000100-bin.000001',15963,'localhost',6714,8,4.0,1,1,'vt-0000000101-bin.000001',15583,'vt-0000000101-bin.000001',15583,0,0,1,'','',1,'vt-0000000100-relay-bin.000002',15815,1,0,'zone1','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a5138-8680-11ed-acf8-d6b0ef9f4eaa','2022-12-28 07:26:04','',1,0,0,'Homebrew','8.0','FULL',10103920,0,1,'ON',1,'729a4cc4-8680-11ed-a104-47706090afbd','','729a4cc4-8680-11ed-a104-47706090afbd,729a5138-8680-11ed-acf8-d6b0ef9f4eaa',1,1,'',1000000000000000000,1,0,1,0);`, - `INSERT INTO database_instance VALUES('zone1-0000000101','localhost',6714,'2022-12-28 07:26:04','2022-12-28 07:26:04',390954723,'8.0.31','ROW',1,1,'vt-0000000101-bin.000001',15583,'',0,0,0,0,0,'',0,'',0,NULL,NULL,0,'','',0,'',0,0,0,'zone1','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a4cc4-8680-11ed-a104-47706090afbd','2022-12-28 07:26:04','',0,0,0,'Homebrew','8.0','FULL',11366095,1,1,'ON',1,'','','729a4cc4-8680-11ed-a104-47706090afbd',-1,-1,'',1000000000000000000,1,1,0,2);`, - `INSERT INTO database_instance VALUES('zone2-0000000200','localhost',6756,'2022-12-28 07:26:05','2022-12-28 07:26:05',444286571,'8.0.31','ROW',1,1,'vt-0000000200-bin.000001',15963,'localhost',6714,8,4.0,1,1,'vt-0000000101-bin.000001',15583,'vt-0000000101-bin.000001',15583,0,0,1,'','',1,'vt-0000000200-relay-bin.000002',15815,1,0,'zone2','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a497c-8680-11ed-8ad4-3f51d747db75','2022-12-28 07:26:05','',1,0,0,'Homebrew','8.0','FULL',10443112,0,1,'ON',1,'729a4cc4-8680-11ed-a104-47706090afbd','','729a4cc4-8680-11ed-a104-47706090afbd,729a497c-8680-11ed-8ad4-3f51d747db75',1,1,'',1000000000000000000,1,0,1,0);`, + `INSERT INTO database_instance VALUES('zone1-0000000112','localhost',6747,'2022-12-28 07:26:04','2022-12-28 07:26:04',213696377,'8.0.31','ROW',1,1,'vt-0000000112-bin.000001',15963,'localhost',6714,8,4.0,1,1,'vt-0000000101-bin.000001',15583,'vt-0000000101-bin.000001',15583,0,0,1,'','',1,'vt-0000000112-relay-bin.000002',15815,1,0,'zone1','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a5138-8680-11ed-9240-92a06c3be3c2','2022-12-28 07:26:04','',1,0,0,'Homebrew','8.0','FULL',10816929,0,0,'ON',1,'729a4cc4-8680-11ed-a104-47706090afbd','','729a4cc4-8680-11ed-a104-47706090afbd,729a5138-8680-11ed-9240-92a06c3be3c2',1,1,'',1000000000000000000,1,0,0,0,false);`, + `INSERT INTO database_instance VALUES('zone1-0000000100','localhost',6711,'2022-12-28 07:26:04','2022-12-28 07:26:04',1094500338,'8.0.31','ROW',1,1,'vt-0000000100-bin.000001',15963,'localhost',6714,8,4.0,1,1,'vt-0000000101-bin.000001',15583,'vt-0000000101-bin.000001',15583,0,0,1,'','',1,'vt-0000000100-relay-bin.000002',15815,1,0,'zone1','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a5138-8680-11ed-acf8-d6b0ef9f4eaa','2022-12-28 07:26:04','',1,0,0,'Homebrew','8.0','FULL',10103920,0,1,'ON',1,'729a4cc4-8680-11ed-a104-47706090afbd','','729a4cc4-8680-11ed-a104-47706090afbd,729a5138-8680-11ed-acf8-d6b0ef9f4eaa',1,1,'',1000000000000000000,1,0,1,0,false);`, + `INSERT INTO database_instance VALUES('zone1-0000000101','localhost',6714,'2022-12-28 07:26:04','2022-12-28 07:26:04',390954723,'8.0.31','ROW',1,1,'vt-0000000101-bin.000001',15583,'',0,0,0,0,0,'',0,'',0,NULL,NULL,0,'','',0,'',0,0,0,'zone1','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a4cc4-8680-11ed-a104-47706090afbd','2022-12-28 07:26:04','',0,0,0,'Homebrew','8.0','FULL',11366095,1,1,'ON',1,'','','729a4cc4-8680-11ed-a104-47706090afbd',-1,-1,'',1000000000000000000,1,1,0,2,false);`, + `INSERT INTO database_instance VALUES('zone2-0000000200','localhost',6756,'2022-12-28 07:26:05','2022-12-28 07:26:05',444286571,'8.0.31','ROW',1,1,'vt-0000000200-bin.000001',15963,'localhost',6714,8,4.0,1,1,'vt-0000000101-bin.000001',15583,'vt-0000000101-bin.000001',15583,0,0,1,'','',1,'vt-0000000200-relay-bin.000002',15815,1,0,'zone2','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a497c-8680-11ed-8ad4-3f51d747db75','2022-12-28 07:26:05','',1,0,0,'Homebrew','8.0','FULL',10443112,0,1,'ON',1,'729a4cc4-8680-11ed-a104-47706090afbd','','729a4cc4-8680-11ed-a104-47706090afbd,729a497c-8680-11ed-8ad4-3f51d747db75',1,1,'',1000000000000000000,1,0,1,0,false);`, `INSERT INTO vitess_tablet VALUES('zone1-0000000100','localhost',6711,'ks','0','zone1',2,'0001-01-01 00:00:00+00:00',X'616c6961733a7b63656c6c3a227a6f6e653122207569643a3130307d20686f73746e616d653a226c6f63616c686f73742220706f72745f6d61703a7b6b65793a2267727063222076616c75653a363731307d20706f72745f6d61703a7b6b65793a227674222076616c75653a363730397d206b657973706163653a226b73222073686172643a22302220747970653a5245504c494341206d7973716c5f686f73746e616d653a226c6f63616c686f737422206d7973716c5f706f72743a363731312064625f7365727665725f76657273696f6e3a22382e302e3331222064656661756c745f636f6e6e5f636f6c6c6174696f6e3a3435');`, `INSERT INTO vitess_tablet VALUES('zone1-0000000101','localhost',6714,'ks','0','zone1',1,'2022-12-28 07:23:25.129898+00:00',X'616c6961733a7b63656c6c3a227a6f6e653122207569643a3130317d20686f73746e616d653a226c6f63616c686f73742220706f72745f6d61703a7b6b65793a2267727063222076616c75653a363731337d20706f72745f6d61703a7b6b65793a227674222076616c75653a363731327d206b657973706163653a226b73222073686172643a22302220747970653a5052494d415259206d7973716c5f686f73746e616d653a226c6f63616c686f737422206d7973716c5f706f72743a36373134207072696d6172795f7465726d5f73746172745f74696d653a7b7365636f6e64733a31363732323132323035206e616e6f7365636f6e64733a3132393839383030307d2064625f7365727665725f76657273696f6e3a22382e302e3331222064656661756c745f636f6e6e5f636f6c6c6174696f6e3a3435');`, `INSERT INTO vitess_tablet VALUES('zone1-0000000112','localhost',6747,'ks','0','zone1',3,'0001-01-01 00:00:00+00:00',X'616c6961733a7b63656c6c3a227a6f6e653122207569643a3131327d20686f73746e616d653a226c6f63616c686f73742220706f72745f6d61703a7b6b65793a2267727063222076616c75653a363734367d20706f72745f6d61703a7b6b65793a227674222076616c75653a363734357d206b657973706163653a226b73222073686172643a22302220747970653a52444f4e4c59206d7973716c5f686f73746e616d653a226c6f63616c686f737422206d7973716c5f706f72743a363734372064625f7365727665725f76657273696f6e3a22382e302e3331222064656661756c745f636f6e6e5f636f6c6c6174696f6e3a3435');`, @@ -96,6 +96,29 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { keyspaceWanted: "ks", shardWanted: "0", codeWanted: PrimaryTabletDeleted, + }, { + name: "StalledDiskPrimary", + info: []*test.InfoForRecoveryAnalysis{{ + TabletInfo: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{Cell: "zon1", Uid: 100}, + Hostname: "localhost", + Keyspace: "ks", + Shard: "0", + Type: topodatapb.TabletType_PRIMARY, + MysqlHostname: "localhost", + MysqlPort: 6709, + }, + DurabilityPolicy: "none", + LastCheckValid: 0, + CountReplicas: 4, + CountValidReplicas: 4, + CountValidReplicatingReplicas: 0, + IsPrimary: 1, + IsStalledDisk: 1, + }}, + keyspaceWanted: "ks", + shardWanted: "0", + codeWanted: PrimaryDiskStalled, }, { name: "DeadPrimary", info: []*test.InfoForRecoveryAnalysis{{ diff --git a/go/vt/vtorc/inst/instance.go b/go/vt/vtorc/inst/instance.go index fef1e90acce..b7b097bb14d 100644 --- a/go/vt/vtorc/inst/instance.go +++ b/go/vt/vtorc/inst/instance.go @@ -91,6 +91,7 @@ type Instance struct { IsUpToDate bool IsRecentlyChecked bool SecondsSinceLastSeen sql.NullInt64 + StalledDisk bool AllowTLS bool diff --git a/go/vt/vtorc/inst/instance_dao.go b/go/vt/vtorc/inst/instance_dao.go index 9198514d6ed..f92a15079dd 100644 --- a/go/vt/vtorc/inst/instance_dao.go +++ b/go/vt/vtorc/inst/instance_dao.go @@ -175,6 +175,7 @@ func ReadTopologyInstanceBufferable(tabletAlias string, latency *stopwatch.Named var tablet *topodatapb.Tablet var fs *replicationdatapb.FullStatus readingStartTime := time.Now() + stalledDisk := false instance := NewInstance() instanceFound := false partialSuccess := false @@ -205,6 +206,9 @@ func ReadTopologyInstanceBufferable(tabletAlias string, latency *stopwatch.Named fs, err = fullStatus(tabletAlias) if err != nil { + if config.GetStalledDiskPrimaryRecovery() && strings.Contains(err.Error(), "stalled disk") { + stalledDisk = true + } goto Cleanup } partialSuccess = true // We at least managed to read something from the server. @@ -381,9 +385,10 @@ Cleanup: // Something is wrong, could be network-wise. Record that we // tried to check the instance. last_attempted_check is also - // updated on success by writeInstance. + // updated on success by writeInstance. If the reason is a + // stalled disk, we can record that as well. latency.Start("backend") - _ = UpdateInstanceLastChecked(tabletAlias, partialSuccess) + _ = UpdateInstanceLastChecked(tabletAlias, partialSuccess, stalledDisk) latency.Stop("backend") return nil, err } @@ -874,6 +879,7 @@ func mkInsertForInstances(instances []*Instance, instanceWasActuallyFound bool, "semi_sync_primary_clients", "semi_sync_replica_status", "last_discovery_latency", + "is_disk_stalled", } values := make([]string, len(columns)) @@ -953,6 +959,7 @@ func mkInsertForInstances(instances []*Instance, instanceWasActuallyFound bool, args = append(args, instance.SemiSyncPrimaryClients) args = append(args, instance.SemiSyncReplicaStatus) args = append(args, instance.LastDiscoveryLatency.Nanoseconds()) + args = append(args, instance.StalledDisk) } sql, err := mkInsert("database_instance", columns, values, len(instances), insertIgnore) @@ -998,16 +1005,18 @@ func WriteInstance(instance *Instance, instanceWasActuallyFound bool, lastError // UpdateInstanceLastChecked updates the last_check timestamp in the vtorc backed database // for a given instance -func UpdateInstanceLastChecked(tabletAlias string, partialSuccess bool) error { +func UpdateInstanceLastChecked(tabletAlias string, partialSuccess bool, stalledDisk bool) error { writeFunc := func() error { _, err := db.ExecVTOrc(`UPDATE database_instance SET last_checked = DATETIME('now'), - last_check_partial_success = ? + last_check_partial_success = ?, + is_disk_stalled = ? WHERE alias = ? `, partialSuccess, + stalledDisk, tabletAlias, ) if err != nil { diff --git a/go/vt/vtorc/inst/instance_dao_test.go b/go/vt/vtorc/inst/instance_dao_test.go index 1a14041450c..c3b99455741 100644 --- a/go/vt/vtorc/inst/instance_dao_test.go +++ b/go/vt/vtorc/inst/instance_dao_test.go @@ -64,13 +64,13 @@ func TestMkInsertSingle(t *testing.T) { version, major_version, version_comment, binlog_server, read_only, binlog_format, binlog_row_image, log_bin, log_replica_updates, binary_log_file, binary_log_pos, source_host, source_port, replica_net_timeout, heartbeat_interval, replica_sql_running, replica_io_running, replication_sql_thread_state, replication_io_thread_state, has_replication_filters, supports_oracle_gtid, oracle_gtid, source_uuid, ancestry_uuid, executed_gtid_set, gtid_mode, gtid_purged, gtid_errant, - source_log_file, read_source_log_pos, relay_source_log_file, exec_source_log_pos, relay_log_file, relay_log_pos, last_sql_error, last_io_error, replication_lag_seconds, replica_lag_seconds, sql_delay, data_center, region, physical_environment, replication_depth, is_co_primary, has_replication_credentials, allow_tls, semi_sync_enforced, semi_sync_primary_enabled, semi_sync_primary_timeout, semi_sync_primary_wait_for_replica_count, semi_sync_replica_enabled, semi_sync_primary_status, semi_sync_primary_clients, semi_sync_replica_status, last_discovery_latency, last_seen) + source_log_file, read_source_log_pos, relay_source_log_file, exec_source_log_pos, relay_log_file, relay_log_pos, last_sql_error, last_io_error, replication_lag_seconds, replica_lag_seconds, sql_delay, data_center, region, physical_environment, replication_depth, is_co_primary, has_replication_credentials, allow_tls, semi_sync_enforced, semi_sync_primary_enabled, semi_sync_primary_timeout, semi_sync_primary_wait_for_replica_count, semi_sync_replica_enabled, semi_sync_primary_status, semi_sync_primary_clients, semi_sync_replica_status, last_discovery_latency, is_disk_stalled, last_seen) VALUES - (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')) + (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')) ` a1 := `zone1-i710, i710, 3306, 710, , 5.6.7, 5.6, MySQL, false, false, STATEMENT, FULL, false, false, , 0, , 0, 0, 0, - false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 10, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0,` + false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 10, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0, false,` sql1, args1, err := mkInsertForInstances(instances[:1], false, true) require.NoError(t, err) @@ -87,16 +87,16 @@ func TestMkInsertThree(t *testing.T) { version, major_version, version_comment, binlog_server, read_only, binlog_format, binlog_row_image, log_bin, log_replica_updates, binary_log_file, binary_log_pos, source_host, source_port, replica_net_timeout, heartbeat_interval, replica_sql_running, replica_io_running, replication_sql_thread_state, replication_io_thread_state, has_replication_filters, supports_oracle_gtid, oracle_gtid, source_uuid, ancestry_uuid, executed_gtid_set, gtid_mode, gtid_purged, gtid_errant, - source_log_file, read_source_log_pos, relay_source_log_file, exec_source_log_pos, relay_log_file, relay_log_pos, last_sql_error, last_io_error, replication_lag_seconds, replica_lag_seconds, sql_delay, data_center, region, physical_environment, replication_depth, is_co_primary, has_replication_credentials, allow_tls, semi_sync_enforced, semi_sync_primary_enabled, semi_sync_primary_timeout, semi_sync_primary_wait_for_replica_count, semi_sync_replica_enabled, semi_sync_primary_status, semi_sync_primary_clients, semi_sync_replica_status, last_discovery_latency, last_seen) + source_log_file, read_source_log_pos, relay_source_log_file, exec_source_log_pos, relay_log_file, relay_log_pos, last_sql_error, last_io_error, replication_lag_seconds, replica_lag_seconds, sql_delay, data_center, region, physical_environment, replication_depth, is_co_primary, has_replication_credentials, allow_tls, semi_sync_enforced, semi_sync_primary_enabled, semi_sync_primary_timeout, semi_sync_primary_wait_for_replica_count, semi_sync_replica_enabled, semi_sync_primary_status, semi_sync_primary_clients, semi_sync_replica_status, last_discovery_latency, is_disk_stalled, last_seen) VALUES - (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')), - (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')), - (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')) + (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')), + (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')), + (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')) ` a3 := ` - zone1-i710, i710, 3306, 710, , 5.6.7, 5.6, MySQL, false, false, STATEMENT, FULL, false, false, , 0, , 0, 0, 0, false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 10, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0, - zone1-i720, i720, 3306, 720, , 5.6.7, 5.6, MySQL, false, false, STATEMENT, FULL, false, false, , 0, , 0, 0, 0, false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 20, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0, - zone1-i730, i730, 3306, 730, , 5.6.7, 5.6, MySQL, false, false, STATEMENT, FULL, false, false, , 0, , 0, 0, 0, false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 30, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0, + zone1-i710, i710, 3306, 710, , 5.6.7, 5.6, MySQL, false, false, STATEMENT, FULL, false, false, , 0, , 0, 0, 0, false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 10, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0, false, + zone1-i720, i720, 3306, 720, , 5.6.7, 5.6, MySQL, false, false, STATEMENT, FULL, false, false, , 0, , 0, 0, 0, false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 20, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0, false, + zone1-i730, i730, 3306, 730, , 5.6.7, 5.6, MySQL, false, false, STATEMENT, FULL, false, false, , 0, , 0, 0, 0, false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 30, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0, false, ` sql3, args3, err := mkInsertForInstances(instances[:3], true, true) @@ -483,9 +483,9 @@ func TestReadOutdatedInstanceKeys(t *testing.T) { tabletAliases, err := ReadOutdatedInstanceKeys() - errInDataCollection := db.QueryVTOrcRowsMap(`select alias, -last_checked, -last_attempted_check, + errInDataCollection := db.QueryVTOrcRowsMap(`select alias, +last_checked, +last_attempted_check, ROUND((JULIANDAY(DATETIME('now')) - JULIANDAY(last_checked)) * 86400) AS difference, last_attempted_check <= last_checked as use1, last_checked < DATETIME('now', '-1500 second') as is_outdated1, @@ -507,22 +507,32 @@ func TestUpdateInstanceLastChecked(t *testing.T) { name string tabletAlias string partialSuccess bool + stalledDisk bool conditionToCheck string }{ { name: "Verify updated last checked", tabletAlias: "zone1-0000000100", partialSuccess: false, - conditionToCheck: "last_checked >= DATETIME('now', '-30 second') and last_check_partial_success = false", + stalledDisk: false, + conditionToCheck: "last_checked >= DATETIME('now', '-30 second') and last_check_partial_success = false and is_disk_stalled = false", }, { name: "Verify partial success", tabletAlias: "zone1-0000000100", partialSuccess: true, - conditionToCheck: "last_checked >= DATETIME('now', '-30 second') and last_check_partial_success = true", + stalledDisk: false, + conditionToCheck: "last_checked >= datetime('now', '-30 second') and last_check_partial_success = true and is_disk_stalled = false", + }, { + name: "Verify stalled disk", + tabletAlias: "zone1-0000000100", + partialSuccess: false, + stalledDisk: true, + conditionToCheck: "last_checked >= DATETIME('now', '-30 second') and last_check_partial_success = false and is_disk_stalled = true", }, { name: "Verify no error on unknown tablet", tabletAlias: "unknown tablet", partialSuccess: true, + stalledDisk: true, }, } @@ -537,7 +547,7 @@ func TestUpdateInstanceLastChecked(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err := UpdateInstanceLastChecked(tt.tabletAlias, tt.partialSuccess) + err := UpdateInstanceLastChecked(tt.tabletAlias, tt.partialSuccess, tt.stalledDisk) require.NoError(t, err) if tt.conditionToCheck != "" { diff --git a/go/vt/vtorc/logic/topology_recovery.go b/go/vt/vtorc/logic/topology_recovery.go index 0d0bbff5b53..ab41d1fa988 100644 --- a/go/vt/vtorc/logic/topology_recovery.go +++ b/go/vt/vtorc/logic/topology_recovery.go @@ -285,7 +285,7 @@ func checkAndRecoverGenericProblem(ctx context.Context, analysisEntry *inst.Repl func getCheckAndRecoverFunctionCode(analysisCode inst.AnalysisCode, tabletAlias string) recoveryFunction { switch analysisCode { // primary - case inst.DeadPrimary, inst.DeadPrimaryAndSomeReplicas: + case inst.DeadPrimary, inst.DeadPrimaryAndSomeReplicas, inst.PrimaryDiskStalled: // If ERS is disabled, we have no way of repairing the cluster. if !config.ERSEnabled() { log.Infof("VTOrc not configured to run ERS, skipping recovering %v", analysisCode) diff --git a/go/vt/vtorc/logic/topology_recovery_test.go b/go/vt/vtorc/logic/topology_recovery_test.go index f7658060b95..ca164d78836 100644 --- a/go/vt/vtorc/logic/topology_recovery_test.go +++ b/go/vt/vtorc/logic/topology_recovery_test.go @@ -42,6 +42,11 @@ func TestAnalysisEntriesHaveSameRecovery(t *testing.T) { prevAnalysisCode: inst.DeadPrimary, newAnalysisCode: inst.DeadPrimaryAndSomeReplicas, shouldBeEqual: true, + }, { + // DeadPrimary and StalledDiskPrimary have the same recovery + prevAnalysisCode: inst.DeadPrimary, + newAnalysisCode: inst.PrimaryDiskStalled, + shouldBeEqual: true, }, { // DeadPrimary and PrimaryTabletDeleted are different recoveries. prevAnalysisCode: inst.DeadPrimary, @@ -215,6 +220,16 @@ func TestGetCheckAndRecoverFunctionCode(t *testing.T) { ersEnabled: false, analysisCode: inst.DeadPrimary, wantRecoveryFunction: noRecoveryFunc, + }, { + name: "StalledDiskPrimary with ERS enabled", + ersEnabled: true, + analysisCode: inst.PrimaryDiskStalled, + wantRecoveryFunction: recoverDeadPrimaryFunc, + }, { + name: "StalledDiskPrimary with ERS disabled", + ersEnabled: false, + analysisCode: inst.PrimaryDiskStalled, + wantRecoveryFunction: noRecoveryFunc, }, { name: "PrimaryTabletDeleted with ERS enabled", ersEnabled: true, diff --git a/go/vt/vtorc/test/recovery_analysis.go b/go/vt/vtorc/test/recovery_analysis.go index 218a679bdb0..bb6e4132243 100644 --- a/go/vt/vtorc/test/recovery_analysis.go +++ b/go/vt/vtorc/test/recovery_analysis.go @@ -80,6 +80,7 @@ type InfoForRecoveryAnalysis struct { MaxReplicaGTIDMode string MaxReplicaGTIDErrant string ReadOnly uint + IsStalledDisk uint } func (info *InfoForRecoveryAnalysis) ConvertToRowMap() sqlutils.RowMap { @@ -145,6 +146,7 @@ func (info *InfoForRecoveryAnalysis) ConvertToRowMap() sqlutils.RowMap { rowMap["semi_sync_replica_enabled"] = sqlutils.CellData{String: fmt.Sprintf("%v", info.SemiSyncReplicaEnabled), Valid: true} res, _ := prototext.Marshal(info.TabletInfo) rowMap["tablet_info"] = sqlutils.CellData{String: string(res), Valid: true} + rowMap["is_disk_stalled"] = sqlutils.CellData{String: fmt.Sprintf("%v", info.IsStalledDisk), Valid: true} return rowMap } diff --git a/go/vt/vttablet/filelogger/filelogger_test.go b/go/vt/vttablet/filelogger/filelogger_test.go index f747ebba93b..47602e1a855 100644 --- a/go/vt/vttablet/filelogger/filelogger_test.go +++ b/go/vt/vttablet/filelogger/filelogger_test.go @@ -75,11 +75,6 @@ func TestFileLog(t *testing.T) { // TestFileLog sends a stream of five query records to the plugin, and verifies that they are logged. func TestFileLogRedacted(t *testing.T) { - streamlog.SetRedactDebugUIQueries(true) - defer func() { - streamlog.SetRedactDebugUIQueries(false) - }() - dir := t.TempDir() logPath := path.Join(dir, "test.log") @@ -94,7 +89,9 @@ func TestFileLogRedacted(t *testing.T) { log1 := &tabletenv.LogStats{ Ctx: ctx, OriginalSQL: "test 1", + Config: streamlog.NewQueryLogConfigForTest(), } + log1.Config.RedactDebugUIQueries = true log1.AddRewrittenSQL("test 1 PII", time.Time{}) log1.MysqlResponseTime = 0 tabletenv.StatsLogger.Send(log1) @@ -102,7 +99,9 @@ func TestFileLogRedacted(t *testing.T) { log2 := &tabletenv.LogStats{ Ctx: ctx, OriginalSQL: "test 2", + Config: streamlog.NewQueryLogConfigForTest(), } + log2.Config.RedactDebugUIQueries = true log2.AddRewrittenSQL("test 2 PII", time.Time{}) log2.MysqlResponseTime = 0 tabletenv.StatsLogger.Send(log2) diff --git a/go/vt/vttablet/grpctmclient/client.go b/go/vt/vttablet/grpctmclient/client.go index 20aa1e5f39f..01d51e2993a 100644 --- a/go/vt/vttablet/grpctmclient/client.go +++ b/go/vt/vttablet/grpctmclient/client.go @@ -63,7 +63,7 @@ var ( name string ) -func registerFlags(fs *pflag.FlagSet) { +func RegisterFlags(fs *pflag.FlagSet) { fs.IntVar(&concurrency, "tablet_manager_grpc_concurrency", concurrency, "concurrency to use to talk to a vttablet server for performance-sensitive RPCs (like ExecuteFetchAs{Dba,App}, CheckThrottler and FullStatus)") fs.StringVar(&cert, "tablet_manager_grpc_cert", cert, "the cert to use to connect") fs.StringVar(&key, "tablet_manager_grpc_key", key, "the key to use to connect") @@ -92,7 +92,7 @@ func init() { }) for _, cmd := range _binaries { - servenv.OnParseFor(cmd, registerFlags) + servenv.OnParseFor(cmd, RegisterFlags) } } diff --git a/go/vt/vttablet/onlineddl/executor.go b/go/vt/vttablet/onlineddl/executor.go index ce81a2dd516..76c7af7fc2e 100644 --- a/go/vt/vttablet/onlineddl/executor.go +++ b/go/vt/vttablet/onlineddl/executor.go @@ -838,34 +838,41 @@ func (e *Executor) killTableLockHoldersAndAccessors(ctx context.Context, tableNa } } capableOf := mysql.ServerVersionCapableOf(conn.ServerVersion) - capable, err := capableOf(capabilities.PerformanceSchemaDataLocksTableCapability) - if err != nil { - return err - } - if capable { - { - // Kill connections that have open transactions locking the table. These potentially (probably?) are not - // actively running a query on our table. They're doing other things while holding locks on our table. - query, err := sqlparser.ParseAndBind(sqlProcessWithLocksOnTable, sqltypes.StringBindVariable(tableName)) - if err != nil { - return err - } - rs, err := conn.Conn.ExecuteFetch(query, -1, true) + terminateTransactions := func(capability capabilities.FlavorCapability, query string, column string, description string) error { + capable, err := capableOf(capability) + if err != nil { + return err + } + if !capable { + return nil + } + query, err = sqlparser.ParseAndBind(query, sqltypes.StringBindVariable(tableName)) + if err != nil { + return err + } + rs, err := conn.Conn.ExecuteFetch(query, -1, true) + if err != nil { + return vterrors.Wrapf(err, "finding transactions locking table `%s` %s", tableName, description) + } + log.Infof("terminateTransactions: found %v transactions locking table `%s` %s", len(rs.Rows), tableName, description) + for _, row := range rs.Named().Rows { + threadId := row.AsInt64(column, 0) + log.Infof("terminateTransactions: killing connection %v with transaction locking table `%s` %s", threadId, tableName, description) + killConnection := fmt.Sprintf("KILL %d", threadId) + _, err = conn.Conn.ExecuteFetch(killConnection, 1, false) if err != nil { - return vterrors.Wrapf(err, "finding transactions locking table") - } - log.Infof("killTableLockHoldersAndAccessors: found %v locking transactions", len(rs.Rows)) - for _, row := range rs.Named().Rows { - threadId := row.AsInt64("trx_mysql_thread_id", 0) - log.Infof("killTableLockHoldersAndAccessors: killing connection %v with transaction on table", threadId) - killConnection := fmt.Sprintf("KILL %d", threadId) - _, err = conn.Conn.ExecuteFetch(killConnection, 1, false) - if err != nil { - log.Errorf("Unable to kill the connection %d: %v", threadId, err) - } + log.Errorf("terminateTransactions: unable to kill the connection %d locking table `%s` %s: %v", threadId, tableName, description, err) } } + return nil + } + if err := terminateTransactions(capabilities.PerformanceSchemaDataLocksTableCapability, sqlProcessWithLocksOnTable, "trx_mysql_thread_id", "data"); err != nil { + return err } + if err := terminateTransactions(capabilities.PerformanceSchemaMetadataLocksTableCapability, sqlProcessWithMetadataLocksOnTable, "processlist_id", "metadata"); err != nil { + return err + } + return nil } diff --git a/go/vt/vttablet/onlineddl/schema.go b/go/vt/vttablet/onlineddl/schema.go index 6ba0217519c..6c0bff1086f 100644 --- a/go/vt/vttablet/onlineddl/schema.go +++ b/go/vt/vttablet/onlineddl/schema.go @@ -567,6 +567,15 @@ const ( where data_locks.OBJECT_SCHEMA=database() AND data_locks.OBJECT_NAME=%a ` + sqlProcessWithMetadataLocksOnTable = ` + SELECT + DISTINCT threads.processlist_id + from + performance_schema.metadata_locks + join performance_schema.threads on (metadata_locks.OWNER_THREAD_ID=threads.THREAD_ID) + where + metadata_locks.OBJECT_SCHEMA=database() AND metadata_locks.OBJECT_NAME=%a + ` ) var ( diff --git a/go/vt/vttablet/sysloglogger/sysloglogger_test.go b/go/vt/vttablet/sysloglogger/sysloglogger_test.go index 3a06b98ed1c..835f6b71b48 100644 --- a/go/vt/vttablet/sysloglogger/sysloglogger_test.go +++ b/go/vt/vttablet/sysloglogger/sysloglogger_test.go @@ -50,13 +50,14 @@ func (fw *fakeWriter) Info(msg string) error { return fw.write(syslog.LOG_INFO, func (fw *fakeWriter) Close() error { return nil } // mockLogStats generates a dummy tabletserver.LogStats message for testing. -func mockLogStats(originalSQL string) *tabletenv.LogStats { - logstats := tabletenv.NewLogStats(context.Background(), "Execute") +func mockLogStats(originalSQL string, redactUIQuery bool) *tabletenv.LogStats { + logstats := tabletenv.NewLogStats(context.Background(), "Execute", streamlog.NewQueryLogConfigForTest()) logstats.StartTime = time.Time{} logstats.PlanType = "PASS_SELECT" logstats.OriginalSQL = originalSQL logstats.AddRewrittenSQL(originalSQL, time.Now()) logstats.MysqlResponseTime = 0 + logstats.Config.RedactDebugUIQueries = redactUIQuery return logstats } @@ -112,11 +113,11 @@ func TestSyslog(t *testing.T) { }() // Send fake messages to the mock channel, and then close the channel to end the plugin loop - ch <- mockLogStats("select 1") - ch <- mockLogStats("select 2") - ch <- mockLogStats("select 3") - ch <- mockLogStats("select 4") - ch <- mockLogStats("select 5") + ch <- mockLogStats("select 1", false) + ch <- mockLogStats("select 2", false) + ch <- mockLogStats("select 3", false) + ch <- mockLogStats("select 4", false) + ch <- mockLogStats("select 5", false) close(ch) <-syncChannel @@ -142,10 +143,6 @@ func TestSyslog(t *testing.T) { // when redaction is enabled. func TestSyslogRedacted(t *testing.T) { // Overwrite the usual syslog writer and StatsLogger subscription channel with mocks - streamlog.SetRedactDebugUIQueries(true) - defer func() { - streamlog.SetRedactDebugUIQueries(false) - }() mock := newFakeWriter() writer = mock ch = make(chan *tabletenv.LogStats, 10) @@ -158,11 +155,11 @@ func TestSyslogRedacted(t *testing.T) { }() // Send fake messages to the mock channel, and then close the channel to end the plugin loop - ch <- mockLogStats("select 1") - ch <- mockLogStats("select 2") - ch <- mockLogStats("select 3") - ch <- mockLogStats("select 4") - ch <- mockLogStats("select 5") + ch <- mockLogStats("select 1", true) + ch <- mockLogStats("select 2", true) + ch <- mockLogStats("select 3", true) + ch <- mockLogStats("select 4", true) + ch <- mockLogStats("select 5", true) close(ch) <-syncChannel @@ -198,10 +195,10 @@ func TestSyslogWithBadData(t *testing.T) { }() // Send 5 records for logging, one of which is bad - ch <- mockLogStats("select 1") - ch <- mockLogStats("select 2") - ch <- mockLogStats("select 3") - ch <- mockLogStats("select 5") + ch <- mockLogStats("select 1", false) + ch <- mockLogStats("select 2", false) + ch <- mockLogStats("select 3", false) + ch <- mockLogStats("select 5", false) close(ch) <-syncChannel @@ -239,11 +236,11 @@ func TestSyslogWithInterruptedConnection(t *testing.T) { close(syncChannel) }() - ch <- mockLogStats("select 1") - ch <- mockLogStats("select 2") - ch <- mockLogStats("select 3") - ch <- mockLogStats("select 4") // This record will get dropped due to a syslog outage - ch <- mockLogStats("select 5") + ch <- mockLogStats("select 1", false) + ch <- mockLogStats("select 2", false) + ch <- mockLogStats("select 3", false) + ch <- mockLogStats("select 4", false) // This record will get dropped due to a syslog outage + ch <- mockLogStats("select 5", false) close(ch) <-syncChannel diff --git a/go/vt/vttablet/tabletmanager/disk_health_monitor.go b/go/vt/vttablet/tabletmanager/disk_health_monitor.go new file mode 100644 index 00000000000..e35bc662a12 --- /dev/null +++ b/go/vt/vttablet/tabletmanager/disk_health_monitor.go @@ -0,0 +1,131 @@ +package tabletmanager + +import ( + "context" + "os" + "path" + "strconv" + "sync" + "time" +) + +type DiskHealthMonitor interface { + // IsDiskStalled returns true if the disk is stalled or rejecting writes. + IsDiskStalled() bool +} + +func newDiskHealthMonitor(ctx context.Context) DiskHealthMonitor { + if stalledDiskWriteDir == "" { + return newNoopDiskHealthMonitor() + } + + return newPollingDiskHealthMonitor(ctx, attemptFileWrite, stalledDiskWriteInterval, stalledDiskWriteTimeout) +} + +type writeFunction func() error + +func attemptFileWrite() error { + file, err := os.Create(path.Join(stalledDiskWriteDir, ".stalled_disk_check")) + if err != nil { + return err + } + _, err = file.WriteString(strconv.FormatInt(time.Now().UnixNano(), 10)) + if err != nil { + return err + } + err = file.Sync() + if err != nil { + return err + } + return file.Close() +} + +type pollingDiskHealthMonitor struct { + stalledMutex sync.RWMutex + stalled bool + writeInProgressMutex sync.RWMutex + writeInProgress bool + writeFunc writeFunction + pollingInterval time.Duration + writeTimeout time.Duration +} + +var _ DiskHealthMonitor = &pollingDiskHealthMonitor{} + +func newPollingDiskHealthMonitor(ctx context.Context, writeFunc writeFunction, pollingInterval, writeTimeout time.Duration) *pollingDiskHealthMonitor { + fs := &pollingDiskHealthMonitor{ + stalledMutex: sync.RWMutex{}, + stalled: false, + writeInProgressMutex: sync.RWMutex{}, + writeInProgress: false, + writeFunc: writeFunc, + pollingInterval: pollingInterval, + writeTimeout: writeTimeout, + } + go fs.poll(ctx) + return fs +} + +func (fs *pollingDiskHealthMonitor) poll(ctx context.Context) { + for { + select { + case <-ctx.Done(): + return + case <-time.After(fs.pollingInterval): + if fs.isWriteInProgress() { + continue + } + + ch := make(chan error, 1) + go func() { + fs.setIsWriteInProgress(true) + err := fs.writeFunc() + fs.setIsWriteInProgress(false) + ch <- err + }() + + select { + case <-time.After(fs.writeTimeout): + fs.setIsDiskStalled(true) + case err := <-ch: + fs.setIsDiskStalled(err != nil) + } + } + } +} + +func (fs *pollingDiskHealthMonitor) IsDiskStalled() bool { + fs.stalledMutex.RLock() + defer fs.stalledMutex.RUnlock() + return fs.stalled +} + +func (fs *pollingDiskHealthMonitor) setIsDiskStalled(isStalled bool) { + fs.stalledMutex.Lock() + defer fs.stalledMutex.Unlock() + fs.stalled = isStalled +} + +func (fs *pollingDiskHealthMonitor) isWriteInProgress() bool { + fs.writeInProgressMutex.RLock() + defer fs.writeInProgressMutex.RUnlock() + return fs.writeInProgress +} + +func (fs *pollingDiskHealthMonitor) setIsWriteInProgress(isInProgress bool) { + fs.writeInProgressMutex.Lock() + defer fs.writeInProgressMutex.Unlock() + fs.writeInProgress = isInProgress +} + +type noopDiskHealthMonitor struct{} + +var _ DiskHealthMonitor = &noopDiskHealthMonitor{} + +func newNoopDiskHealthMonitor() DiskHealthMonitor { + return &noopDiskHealthMonitor{} +} + +func (fs *noopDiskHealthMonitor) IsDiskStalled() bool { + return false +} diff --git a/go/vt/vttablet/tabletmanager/disk_health_monitor_test.go b/go/vt/vttablet/tabletmanager/disk_health_monitor_test.go new file mode 100644 index 00000000000..68930f3061d --- /dev/null +++ b/go/vt/vttablet/tabletmanager/disk_health_monitor_test.go @@ -0,0 +1,103 @@ +package tabletmanager + +import ( + "context" + "errors" + "sync" + "testing" + "time" +) + +func TestDiskHealthMonitor_noStall(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + mockFileWriter := &sequencedMockWriter{} + diskHealthMonitor := newPollingDiskHealthMonitor(ctx, mockFileWriter.mockWriteFunction, 50*time.Millisecond, 25*time.Millisecond) + + time.Sleep(300 * time.Millisecond) + if totalCreateCalls := mockFileWriter.getTotalCreateCalls(); totalCreateCalls != 5 { + t.Fatalf("expected 5 calls to createFile, got %d", totalCreateCalls) + } + if isStalled := diskHealthMonitor.IsDiskStalled(); isStalled { + t.Fatalf("expected isStalled to be false") + } +} + +func TestDiskHealthMonitor_stallAndRecover(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + mockFileWriter := &sequencedMockWriter{sequencedWriteFunctions: []writeFunction{delayedWriteFunction(10*time.Millisecond, nil), delayedWriteFunction(300*time.Millisecond, nil)}} + diskHealthMonitor := newPollingDiskHealthMonitor(ctx, mockFileWriter.mockWriteFunction, 50*time.Millisecond, 25*time.Millisecond) + + time.Sleep(300 * time.Millisecond) + if totalCreateCalls := mockFileWriter.getTotalCreateCalls(); totalCreateCalls != 2 { + t.Fatalf("expected 2 calls to createFile, got %d", totalCreateCalls) + } + if isStalled := diskHealthMonitor.IsDiskStalled(); !isStalled { + t.Fatalf("expected isStalled to be true") + } + + time.Sleep(300 * time.Millisecond) + if totalCreateCalls := mockFileWriter.getTotalCreateCalls(); totalCreateCalls < 5 { + t.Fatalf("expected at least 5 calls to createFile, got %d", totalCreateCalls) + } + if isStalled := diskHealthMonitor.IsDiskStalled(); isStalled { + t.Fatalf("expected isStalled to be false") + } +} + +func TestDiskHealthMonitor_stallDetected(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + mockFileWriter := &sequencedMockWriter{defaultWriteFunction: delayedWriteFunction(10*time.Millisecond, errors.New("test error"))} + diskHealthMonitor := newPollingDiskHealthMonitor(ctx, mockFileWriter.mockWriteFunction, 50*time.Millisecond, 25*time.Millisecond) + + time.Sleep(300 * time.Millisecond) + if totalCreateCalls := mockFileWriter.getTotalCreateCalls(); totalCreateCalls != 5 { + t.Fatalf("expected 5 calls to createFile, got %d", totalCreateCalls) + } + if isStalled := diskHealthMonitor.IsDiskStalled(); !isStalled { + t.Fatalf("expected isStalled to be true") + } +} + +type sequencedMockWriter struct { + defaultWriteFunction writeFunction + sequencedWriteFunctions []writeFunction + + totalCreateCalls int + totalCreateCallsMutex sync.RWMutex +} + +func (smw *sequencedMockWriter) mockWriteFunction() error { + functionIndex := smw.getTotalCreateCalls() + smw.incrementTotalCreateCalls() + + if functionIndex >= len(smw.sequencedWriteFunctions) { + if smw.defaultWriteFunction != nil { + return smw.defaultWriteFunction() + } + return delayedWriteFunction(10*time.Millisecond, nil)() + } + + return smw.sequencedWriteFunctions[functionIndex]() +} + +func (smw *sequencedMockWriter) incrementTotalCreateCalls() { + smw.totalCreateCallsMutex.Lock() + defer smw.totalCreateCallsMutex.Unlock() + smw.totalCreateCalls += 1 +} + +func (smw *sequencedMockWriter) getTotalCreateCalls() int { + smw.totalCreateCallsMutex.RLock() + defer smw.totalCreateCallsMutex.RUnlock() + return smw.totalCreateCalls +} + +func delayedWriteFunction(delay time.Duration, err error) writeFunction { + return func() error { + time.Sleep(delay) + return err + } +} diff --git a/go/vt/vttablet/tabletmanager/rpc_replication.go b/go/vt/vttablet/tabletmanager/rpc_replication.go index 47794e92b9a..b27b25d87c6 100644 --- a/go/vt/vttablet/tabletmanager/rpc_replication.go +++ b/go/vt/vttablet/tabletmanager/rpc_replication.go @@ -18,6 +18,7 @@ package tabletmanager import ( "context" + "errors" "fmt" "runtime" "strings" @@ -60,6 +61,13 @@ func (tm *TabletManager) FullStatus(ctx context.Context) (*replicationdatapb.Ful if err := tm.waitForGrantsToHaveApplied(ctx); err != nil { return nil, err } + + // Return error if the disk is stalled or rejecting writes. + // Noop by default, must be enabled with the flag "disk-write-dir". + if tm.dhMonitor.IsDiskStalled() { + return nil, errors.New("stalled disk") + } + // Server ID - "select @@global.server_id" serverID, err := tm.MysqlDaemon.GetServerID(ctx) if err != nil { diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index fbef04de357..c22ea0a6e51 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -95,8 +95,11 @@ var ( skipBuildInfoTags = "/.*/" initTags flagutil.StringMapValue - initTimeout = 1 * time.Minute - mysqlShutdownTimeout = mysqlctl.DefaultShutdownTimeout + initTimeout = 1 * time.Minute + mysqlShutdownTimeout = mysqlctl.DefaultShutdownTimeout + stalledDiskWriteDir = "" + stalledDiskWriteTimeout = 30 * time.Second + stalledDiskWriteInterval = 5 * time.Second ) func registerInitFlags(fs *pflag.FlagSet) { @@ -109,6 +112,9 @@ func registerInitFlags(fs *pflag.FlagSet) { fs.Var(&initTags, "init_tags", "(init parameter) comma separated list of key:value pairs used to tag the tablet") fs.DurationVar(&initTimeout, "init_timeout", initTimeout, "(init parameter) timeout to use for the init phase.") fs.DurationVar(&mysqlShutdownTimeout, "mysql-shutdown-timeout", mysqlShutdownTimeout, "timeout to use when MySQL is being shut down.") + fs.StringVar(&stalledDiskWriteDir, "disk-write-dir", stalledDiskWriteDir, "if provided, tablet will attempt to write a file to this directory to check if the disk is stalled") + fs.DurationVar(&stalledDiskWriteTimeout, "disk-write-timeout", stalledDiskWriteTimeout, "if writes exceed this duration, the disk is considered stalled") + fs.DurationVar(&stalledDiskWriteInterval, "disk-write-interval", stalledDiskWriteInterval, "how often to write to the disk to check whether it is stalled") } var ( @@ -164,6 +170,7 @@ type TabletManager struct { VREngine *vreplication.Engine VDiffEngine *vdiff.Engine Env *vtenv.Environment + dhMonitor DiskHealthMonitor // tmc is used to run an RPC against other vttablets. tmc tmclient.TabletManagerClient @@ -372,6 +379,7 @@ func (tm *TabletManager) Start(tablet *topodatapb.Tablet, config *tabletenv.Tabl tm.tmc = tmclient.NewTabletManagerClient() tm.tmState = newTMState(tm, tablet) tm.actionSema = semaphore.NewWeighted(1) + tm.dhMonitor = newDiskHealthMonitor(tm.BatchCtx) tm._waitForGrantsComplete = make(chan struct{}) tm.baseTabletType = tablet.Type diff --git a/go/vt/vttablet/tabletmanager/vdiff/engine_test.go b/go/vt/vttablet/tabletmanager/vdiff/engine_test.go index 61d713a8e58..374756418c6 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/engine_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/engine_test.go @@ -139,7 +139,7 @@ func TestVDiff(t *testing.T) { "lastpk|mismatch|report", "varbinary|int64|json", ), - `fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}|0|{}`, + `target:{fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}}|0|{}`, ), nil) vdenv.dbClient.ExpectRequest(fmt.Sprintf("select column_name as column_name, collation_name as collation_name from information_schema.columns where table_schema='%s' and table_name='t1' and column_name in ('c1')", vdiffDBName), sqltypes.MakeTestResult(sqltypes.MakeTestFields( "collation_name", @@ -159,7 +159,7 @@ func TestVDiff(t *testing.T) { "lastpk|mismatch|report", "varbinary|int64|json", ), - `fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}|0|{"TableName": "t1", "MatchingRows": 1, "ProcessedRows": 1, "MismatchedRows": 0, "ExtraRowsSource": 0, "ExtraRowsTarget": 0}`, + `target:{fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}}|0|{}`, ), nil) vdenv.dbClient.ExpectRequest("update _vt.vdiff_table set table_rows = 1 where vdiff_id = 1 and table_name = 't1'", singleRowAffected, nil) @@ -169,7 +169,7 @@ func TestVDiff(t *testing.T) { "lastpk|mismatch|report", "varbinary|int64|json", ), - `fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}|0|{"TableName": "t1", "MatchingRows": 1, "ProcessedRows": 1, "MismatchedRows": 0, "ExtraRowsSource": 0, "ExtraRowsTarget": 0}`, + `target:{fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}}|0|{}`, ), nil) vdenv.dbClient.ExpectRequest("update _vt.vdiff_table set state = 'started' where vdiff_id = 1 and table_name = 't1'", singleRowAffected, nil) vdenv.dbClient.ExpectRequest(`insert into _vt.vdiff_log(vdiff_id, message) values (1, 'started: table \'t1\'')`, singleRowAffected, nil) @@ -185,7 +185,7 @@ func TestVDiff(t *testing.T) { "lastpk|mismatch|report", "varbinary|int64|json", ), - `fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}|0|{}`, + `target:{fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}}|0|{}`, ), nil) vdenv.dbClient.ExpectRequest(`update _vt.vdiff_table set rows_compared = 0, report = '{"TableName":"t1","ProcessedRows":0,"MatchingRows":0,"MismatchedRows":0,"ExtraRowsSource":0,"ExtraRowsTarget":0}' where vdiff_id = 1 and table_name = 't1'`, singleRowAffected, nil) vdenv.dbClient.ExpectRequest(`update _vt.vdiff_table set state = 'completed', rows_compared = 0, report = '{"TableName":"t1","ProcessedRows":0,"MatchingRows":0,"MismatchedRows":0,"ExtraRowsSource":0,"ExtraRowsTarget":0}' where vdiff_id = 1 and table_name = 't1'`, singleRowAffected, nil) diff --git a/go/vt/vttablet/tabletmanager/vdiff/framework_test.go b/go/vt/vttablet/tabletmanager/vdiff/framework_test.go index 7d4cdb78c20..563741fcd23 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/framework_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/framework_test.go @@ -678,5 +678,15 @@ func (tvde *testVDiffEnv) createController(t *testing.T, id int) *controller { tvde.dbClient.ExpectRequest(fmt.Sprintf("select * from _vt.vdiff where id = %d", id), noResults, nil) ct, err := newController(context.Background(), controllerQR.Named().Row(), tvde.dbClientFactory, tstenv.TopoServ, tvde.vde, tvde.opts) require.NoError(t, err) + ct.sources = map[string]*migrationSource{ + tstenv.ShardName: { + vrID: 1, + shardStreamer: &shardStreamer{ + tablet: tvde.vde.thisTablet, + shard: tstenv.ShardName, + }, + }, + } + ct.sourceKeyspace = tstenv.KeyspaceName return ct } diff --git a/go/vt/vttablet/tabletmanager/vdiff/table_differ.go b/go/vt/vttablet/tabletmanager/vdiff/table_differ.go index 102d7535af9..1ebeab8ed8d 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/table_differ.go +++ b/go/vt/vttablet/tabletmanager/vdiff/table_differ.go @@ -20,10 +20,12 @@ import ( "context" "encoding/json" "fmt" + "slices" "strings" "sync" "time" + "golang.org/x/exp/maps" "google.golang.org/protobuf/encoding/prototext" "vitess.io/vitess/go/mysql/collations" @@ -34,6 +36,7 @@ import ( "vitess.io/vitess/go/vt/concurrency" "vitess.io/vitess/go/vt/discovery" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/mysqlctl" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" @@ -86,9 +89,10 @@ type tableDiffer struct { targetPrimitive engine.Primitive // sourceQuery is computed from the associated query for this table in the vreplication workflow's Rule Filter - sourceQuery string - table *tabletmanagerdatapb.TableDefinition - lastPK *querypb.QueryResult + sourceQuery string + table *tabletmanagerdatapb.TableDefinition + lastSourcePK *querypb.QueryResult + lastTargetPK *querypb.QueryResult // wgShardStreamers is used, with a cancellable context, to wait for all shard streamers // to finish after each diff is complete. @@ -238,15 +242,9 @@ func (td *tableDiffer) selectTablets(ctx context.Context) error { sourceCells := strings.Split(td.wd.opts.PickerOptions.SourceCell, ",") targetCells := strings.Split(td.wd.opts.PickerOptions.TargetCell, ",") - // For Mount+Migrate, the source tablets will be in a different - // Vitess cluster with its own TopoServer. - sourceTopoServer := td.wd.ct.ts - if td.wd.ct.externalCluster != "" { - extTS, err := td.wd.ct.ts.OpenExternalVitessClusterServer(ctx, td.wd.ct.externalCluster) - if err != nil { - return err - } - sourceTopoServer = extTS + sourceTopoServer, err := td.wd.getSourceTopoServer() + if err != nil { + return vterrors.Wrap(err, "failed to get source topo server") } tabletPickerOptions := discovery.TabletPickerOptions{} wg.Add(1) @@ -349,7 +347,7 @@ func (td *tableDiffer) startTargetDataStream(ctx context.Context) error { ct := td.wd.ct gtidch := make(chan string, 1) ct.targetShardStreamer.result = make(chan *sqltypes.Result, 1) - go td.streamOneShard(ctx, ct.targetShardStreamer, td.tablePlan.targetQuery, td.lastPK, gtidch) + go td.streamOneShard(ctx, ct.targetShardStreamer, td.tablePlan.targetQuery, td.lastTargetPK, gtidch) gtid, ok := <-gtidch if !ok { log.Infof("streaming error: %v", ct.targetShardStreamer.err) @@ -364,7 +362,7 @@ func (td *tableDiffer) startSourceDataStreams(ctx context.Context) error { if err := td.forEachSource(func(source *migrationSource) error { gtidch := make(chan string, 1) source.result = make(chan *sqltypes.Result, 1) - go td.streamOneShard(ctx, source.shardStreamer, td.tablePlan.sourceQuery, td.lastPK, gtidch) + go td.streamOneShard(ctx, source.shardStreamer, td.tablePlan.sourceQuery, td.lastSourcePK, gtidch) gtid, ok := <-gtidch if !ok { @@ -721,32 +719,17 @@ func (td *tableDiffer) updateTableProgress(dbClient binlogplayer.DBClient, dr *D if dr == nil { return fmt.Errorf("cannot update progress with a nil diff report") } - var lastPK []byte + var err error var query string rpt, err := json.Marshal(dr) if err != nil { return err } - if lastRow != nil { - lastPK, err = td.lastPKFromRow(lastRow) - if err != nil { - return err - } - - if td.wd.opts.CoreOptions.MaxDiffSeconds > 0 { - // Update the in-memory lastPK as well so that we can restart the table - // diff if needed. - lastpkpb := &querypb.QueryResult{} - if err := prototext.Unmarshal(lastPK, lastpkpb); err != nil { - return err - } - td.lastPK = lastpkpb - } - query, err = sqlparser.ParseAndBind(sqlUpdateTableProgress, + if lastRow == nil { + query, err = sqlparser.ParseAndBind(sqlUpdateTableNoProgress, sqltypes.Int64BindVariable(dr.ProcessedRows), - sqltypes.StringBindVariable(string(lastPK)), sqltypes.StringBindVariable(string(rpt)), sqltypes.Int64BindVariable(td.wd.ct.id), sqltypes.StringBindVariable(td.table.Name), @@ -755,8 +738,25 @@ func (td *tableDiffer) updateTableProgress(dbClient binlogplayer.DBClient, dr *D return err } } else { - query, err = sqlparser.ParseAndBind(sqlUpdateTableNoProgress, + lastPK := td.lastPKFromRow(lastRow) + if td.wd.opts.CoreOptions.MaxDiffSeconds > 0 { + // Update the in-memory lastPK as well so that we can restart the table + // diff if needed. + td.lastTargetPK = lastPK.Target + if lastPK.Source == nil { + // If the source PK is nil, we use the target value for both. + td.lastSourcePK = lastPK.Target + } else { + td.lastSourcePK = lastPK.Source + } + } + lastPKTxt, err := prototext.Marshal(lastPK) + if err != nil { + return vterrors.Wrapf(err, "failed to marshal lastpk value %+v for table %s", lastPK, td.table.Name) + } + query, err = sqlparser.ParseAndBind(sqlUpdateTableProgress, sqltypes.Int64BindVariable(dr.ProcessedRows), + sqltypes.StringBindVariable(string(lastPKTxt)), sqltypes.StringBindVariable(string(rpt)), sqltypes.Int64BindVariable(td.wd.ct.id), sqltypes.StringBindVariable(td.table.Name), @@ -768,6 +768,7 @@ func (td *tableDiffer) updateTableProgress(dbClient binlogplayer.DBClient, dr *D if _, err := dbClient.ExecuteFetch(query, 1); err != nil { return err } + td.wd.ct.TableDiffRowCounts.Add(td.table.Name, dr.ProcessedRows) return nil } @@ -832,19 +833,30 @@ func updateTableMismatch(dbClient binlogplayer.DBClient, vdiffID int64, table st return nil } -func (td *tableDiffer) lastPKFromRow(row []sqltypes.Value) ([]byte, error) { - pkColCnt := len(td.tablePlan.pkCols) - pkFields := make([]*querypb.Field, pkColCnt) - pkVals := make([]sqltypes.Value, pkColCnt) - for i, colIndex := range td.tablePlan.pkCols { - pkFields[i] = td.tablePlan.table.Fields[colIndex] - pkVals[i] = row[colIndex] - } - buf, err := prototext.Marshal(&querypb.QueryResult{ - Fields: pkFields, - Rows: []*querypb.Row{sqltypes.RowToProto3(pkVals)}, - }) - return buf, err +func (td *tableDiffer) lastPKFromRow(row []sqltypes.Value) *tabletmanagerdatapb.VDiffTableLastPK { + buildQR := func(pkCols []int) *querypb.QueryResult { + pkColCnt := len(pkCols) + pkFields := make([]*querypb.Field, pkColCnt) + pkVals := make([]sqltypes.Value, pkColCnt) + for i, colIndex := range pkCols { + pkFields[i] = td.tablePlan.table.Fields[colIndex] + pkVals[i] = row[colIndex] + } + return &querypb.QueryResult{ + Fields: pkFields, + Rows: []*querypb.Row{sqltypes.RowToProto3(pkVals)}, + } + } + lastPK := &tabletmanagerdatapb.VDiffTableLastPK{ + Target: buildQR(td.tablePlan.pkCols), + } + // If the source and target PKs are different, we need to save the source PK + // as well. Otherwise the source will be nil which means that the target value + // should also be used for the source. + if !slices.Equal(td.tablePlan.pkCols, td.tablePlan.sourcePkCols) { + lastPK.Source = buildQR(td.tablePlan.sourcePkCols) + } + return lastPK } // If SourceTimeZone is defined in the BinlogSource (_vt.vreplication.source), the @@ -893,6 +905,83 @@ func (td *tableDiffer) adjustForSourceTimeZone(targetSelectExprs sqlparser.Selec return targetSelectExprs } +// getSourcePKCols populates the sourcePkCols field in the tablePlan. +// We need this information in order to save the lastpk value for the +// source if the PK columns differ between the source and target. +func (td *tableDiffer) getSourcePKCols() error { + ctx, cancel := context.WithTimeout(td.wd.ct.vde.ctx, topo.RemoteOperationTimeout*3) + defer cancel() + + // We use the first sourceShard as all of them should have the same schema. + if len(td.wd.ct.sources) == 0 { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "no source shards found in %s keyspace", + td.wd.ct.sourceKeyspace) + } + sourceShardName := maps.Keys(td.wd.ct.sources)[0] + sourceTS, err := td.wd.getSourceTopoServer() + if err != nil { + return vterrors.Wrap(err, "failed to get source topo server") + } + sourceShard, err := sourceTS.GetShard(ctx, td.wd.ct.sourceKeyspace, sourceShardName) + if err != nil { + return vterrors.Wrapf(err, "failed to get source shard %s", sourceShardName) + } + if sourceShard.PrimaryAlias == nil { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "source shard %s has no primary", sourceShardName) + } + sourceTablet, err := sourceTS.GetTablet(ctx, sourceShard.PrimaryAlias) + if err != nil { + return vterrors.Wrapf(err, "failed to get primary tablet in source shard %s/%s", + td.wd.ct.sourceKeyspace, sourceShardName) + } + sourceSchema, err := td.wd.ct.tmc.GetSchema(ctx, sourceTablet.Tablet, &tabletmanagerdatapb.GetSchemaRequest{ + Tables: []string{td.table.Name}, + }) + if err != nil { + return vterrors.Wrapf(err, "failed to get the schema for table %s from source tablet %s", + td.table.Name, topoproto.TabletAliasString(sourceTablet.Tablet.Alias)) + } + sourceTable := sourceSchema.TableDefinitions[0] + if len(sourceTable.PrimaryKeyColumns) == 0 { + // We use the columns from a PKE if there is one. + executeFetch := func(query string, maxrows int, wantfields bool) (*sqltypes.Result, error) { + res, err := td.wd.ct.tmc.ExecuteFetchAsApp(ctx, sourceTablet.Tablet, false, &tabletmanagerdatapb.ExecuteFetchAsAppRequest{ + Query: []byte(query), + MaxRows: 1, + }) + if err != nil { + return nil, vterrors.Wrapf(err, "failed to query the %s source tablet in order to get a primary key equivalent for the %s table", + topoproto.TabletAliasString(sourceTablet.Tablet.Alias), td.table.Name) + } + return sqltypes.Proto3ToResult(res), nil + } + pkeCols, _, err := mysqlctl.GetPrimaryKeyEquivalentColumns(ctx, executeFetch, sourceTablet.DbName(), td.table.Name) + if err != nil { + return vterrors.Wrapf(err, "failed to get a primary key equivalent for the %s table from source tablet %s", + td.table.Name, topoproto.TabletAliasString(sourceTablet.Tablet.Alias)) + } + if len(pkeCols) > 0 { + sourceTable.PrimaryKeyColumns = pkeCols + } else { + // We use every column together as a substitute PK. + sourceTable.PrimaryKeyColumns = append(sourceTable.PrimaryKeyColumns, td.table.Columns...) + } + } + + sourcePKColumns := make(map[string]struct{}, len(sourceTable.PrimaryKeyColumns)) + td.tablePlan.sourcePkCols = make([]int, 0, len(sourceTable.PrimaryKeyColumns)) + for _, pkc := range sourceTable.PrimaryKeyColumns { + sourcePKColumns[pkc] = struct{}{} + } + for i, pkc := range td.table.Columns { + if _, ok := sourcePKColumns[pkc]; ok { + td.tablePlan.sourcePkCols = append(td.tablePlan.sourcePkCols, i) + } + } + + return nil +} + func getColumnNameForSelectExpr(selectExpression sqlparser.SelectExpr) (string, error) { aliasedExpr := selectExpression.(*sqlparser.AliasedExpr) expr := aliasedExpr.Expr diff --git a/go/vt/vttablet/tabletmanager/vdiff/table_differ_test.go b/go/vt/vttablet/tabletmanager/vdiff/table_differ_test.go new file mode 100644 index 00000000000..03ba218cd66 --- /dev/null +++ b/go/vt/vttablet/tabletmanager/vdiff/table_differ_test.go @@ -0,0 +1,131 @@ +/* +Copyright 2025 The Vitess Authors. + +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 + + http://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 vdiff + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/stats" + "vitess.io/vitess/go/vt/binlog/binlogplayer" + + querypb "vitess.io/vitess/go/vt/proto/query" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" +) + +func TestUpdateTableProgress(t *testing.T) { + wd := &workflowDiffer{ + ct: &controller{ + id: 1, + TableDiffRowCounts: stats.NewCountersWithSingleLabel("", "", "Rows"), + }, + opts: &tabletmanagerdatapb.VDiffOptions{ + CoreOptions: &tabletmanagerdatapb.VDiffCoreOptions{ + MaxDiffSeconds: 100, + }, + }, + } + table := &tabletmanagerdatapb.TableDefinition{ + Name: "test", + } + dr := &DiffReport{ + TableName: table.Name, + ProcessedRows: 1e9, + } + queryTemplate := `update _vt.vdiff_table set rows_compared = 1000000000, lastpk = '%s', report = '{"TableName":"test","ProcessedRows":1000000000,"MatchingRows":0,"MismatchedRows":0,"ExtraRowsSource":0,"ExtraRowsTarget":0}' where vdiff_id = 1 and table_name = 'test'` + + testCases := []struct { + name string + fields []*querypb.Field + pkCols []int + sourcePkCols []int + lastRow []sqltypes.Value + expectedLastPK string + wantErr bool + }{ + { + name: "identical PKs", + fields: []*querypb.Field{ + { + Name: "a", Type: sqltypes.Int64, + }, + { + Name: "b", Type: sqltypes.Int64, + }, + }, + pkCols: []int{0, 1}, + sourcePkCols: []int{0, 1}, + lastRow: []sqltypes.Value{sqltypes.NewInt64(1), sqltypes.NewInt64(2)}, + expectedLastPK: `target:{fields:{name:"a" type:INT64} fields:{name:"b" type:INT64} rows:{lengths:1 lengths:1 values:"12"}}`, + }, + { + name: "more PK cols on target", + fields: []*querypb.Field{ + { + Name: "a", Type: sqltypes.Int64, + }, + { + Name: "b", Type: sqltypes.Int64, + }, + }, + pkCols: []int{0, 1}, + sourcePkCols: []int{0}, + lastRow: []sqltypes.Value{sqltypes.NewInt64(1), sqltypes.NewInt64(2)}, + expectedLastPK: `target:{fields:{name:"a" type:INT64} fields:{name:"b" type:INT64} rows:{lengths:1 lengths:1 values:"12"}} source:{fields:{name:"a" type:INT64} rows:{lengths:1 values:"1"}}`, + }, + { + name: "more PK cols on source", + fields: []*querypb.Field{ + { + Name: "a", Type: sqltypes.Int64, + }, + { + Name: "b", Type: sqltypes.Int64, + }, + }, + pkCols: []int{0}, + sourcePkCols: []int{0, 1}, + lastRow: []sqltypes.Value{sqltypes.NewInt64(1), sqltypes.NewInt64(2)}, + expectedLastPK: `target:{fields:{name:"a" type:INT64} rows:{lengths:1 values:"1"}} source:{fields:{name:"a" type:INT64} fields:{name:"b" type:INT64} rows:{lengths:1 lengths:1 values:"12"}}`, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + dbc := binlogplayer.NewMockDBClient(t) + dbc.ExpectRequest(fmt.Sprintf(queryTemplate, tc.expectedLastPK), &sqltypes.Result{}, nil) + td := &tableDiffer{ + wd: wd, + table: table, + tablePlan: &tablePlan{ + pkCols: tc.pkCols, + sourcePkCols: tc.sourcePkCols, + table: &tabletmanagerdatapb.TableDefinition{ + Fields: tc.fields, + }, + }, + } + if err := td.updateTableProgress(dbc, dr, tc.lastRow); (err != nil) != tc.wantErr { + require.FailNow(t, "tableDiffer.updateTableProgress() error = %v, wantErr %v", + err, tc.wantErr) + } + }) + } +} diff --git a/go/vt/vttablet/tabletmanager/vdiff/table_plan.go b/go/vt/vttablet/tabletmanager/vdiff/table_plan.go index 836df8ffe94..b5ea384d864 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/table_plan.go +++ b/go/vt/vttablet/tabletmanager/vdiff/table_plan.go @@ -53,6 +53,11 @@ type tablePlan struct { comparePKs []compareColInfo // pkCols has the indices of PK cols in the select list pkCols []int + // sourcePkCols has the indices of PK cols in the select + // list, but from the source keyspace. This is needed to + // properly store the lastpk for the source when the source + // and target have different PK columns. + sourcePkCols []int // selectPks is the list of pk columns as they appear in the select clause for the diff. selectPks []int diff --git a/go/vt/vttablet/tabletmanager/vdiff/utils.go b/go/vt/vttablet/tabletmanager/vdiff/utils.go index aeaa28972e0..68e8a6acb57 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/utils.go +++ b/go/vt/vttablet/tabletmanager/vdiff/utils.go @@ -80,17 +80,6 @@ func insertVDiffLog(ctx context.Context, dbClient binlogplayer.DBClient, vdiffID } } -func stringListContains(lst []string, item string) bool { - contains := false - for _, t := range lst { - if t == item { - contains = true - break - } - } - return contains -} - // copyNonKeyRangeExpressions copies all expressions from the input WHERE clause // to the output WHERE clause except for any in_keyrange() expressions. func copyNonKeyRangeExpressions(where *sqlparser.Where) *sqlparser.Where { diff --git a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go index ef30d8f14b0..775ae1d9179 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go +++ b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" "reflect" + "slices" "strings" "time" @@ -33,6 +34,7 @@ import ( "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/vtctl/schematools" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/vindexes" @@ -40,7 +42,6 @@ import ( "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" - querypb "vitess.io/vitess/go/vt/proto/query" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) @@ -344,7 +345,7 @@ func (wd *workflowDiffer) buildPlan(dbClient binlogplayer.DBClient, filter *binl for _, table := range schm.TableDefinitions { // if user specified tables explicitly only use those, otherwise diff all tables in workflow - if len(specifiedTables) != 0 && !stringListContains(specifiedTables, table.Name) { + if len(specifiedTables) != 0 && !slices.Contains(specifiedTables, table.Name) { continue } if schema.IsInternalOperationTableName(table.Name) && !schema.IsOnlineDDLTableName(table.Name) { @@ -370,15 +371,24 @@ func (wd *workflowDiffer) buildPlan(dbClient binlogplayer.DBClient, filter *binl } td := newTableDiffer(wd, table, sourceQuery) - lastpkpb, err := wd.getTableLastPK(dbClient, table.Name) + lastPK, err := wd.getTableLastPK(dbClient, table.Name) if err != nil { return err } - td.lastPK = lastpkpb + if lastPK != nil { + td.lastSourcePK = lastPK.Source + td.lastTargetPK = lastPK.Target + } wd.tableDiffers[table.Name] = td if _, err := td.buildTablePlan(dbClient, wd.ct.vde.dbName, wd.collationEnv); err != nil { return err } + // We get the PK columns from the source schema as well as they can differ + // and they determine the proper position to use when saving our progress. + if err := td.getSourcePKCols(); err != nil { + return vterrors.Wrapf(err, "could not get the primary key columns from the %s source keyspace", + wd.ct.sourceKeyspace) + } } if len(wd.tableDiffers) == 0 { return fmt.Errorf("no tables found to diff, %s:%s, on tablet %v", @@ -388,7 +398,7 @@ func (wd *workflowDiffer) buildPlan(dbClient binlogplayer.DBClient, filter *binl } // getTableLastPK gets the lastPK protobuf message for a given vdiff table. -func (wd *workflowDiffer) getTableLastPK(dbClient binlogplayer.DBClient, tableName string) (*querypb.QueryResult, error) { +func (wd *workflowDiffer) getTableLastPK(dbClient binlogplayer.DBClient, tableName string) (*tabletmanagerdatapb.VDiffTableLastPK, error) { query, err := sqlparser.ParseAndBind(sqlGetVDiffTable, sqltypes.Int64BindVariable(wd.ct.id), sqltypes.StringBindVariable(tableName), @@ -406,11 +416,15 @@ func (wd *workflowDiffer) getTableLastPK(dbClient binlogplayer.DBClient, tableNa return nil, err } if len(lastpk) != 0 { - var lastpkpb querypb.QueryResult - if err := prototext.Unmarshal(lastpk, &lastpkpb); err != nil { - return nil, err + lastPK := &tabletmanagerdatapb.VDiffTableLastPK{} + if err := prototext.Unmarshal(lastpk, lastPK); err != nil { + return nil, vterrors.Wrapf(err, "failed to unmarshal lastpk value of %s for the %s table", + string(lastpk), tableName) + } + if lastPK.Source == nil { // Then it's the same as the target + lastPK.Source = lastPK.Target } - return &lastpkpb, nil + return lastPK, nil } } return nil, nil @@ -488,3 +502,14 @@ func (wd *workflowDiffer) initVDiffTables(dbClient binlogplayer.DBClient) error } return nil } + +// getSourceTopoServer returns the source topo server as for Mount+Migrate the +// source tablets will be in a different Vitess cluster with its own TopoServer. +func (wd *workflowDiffer) getSourceTopoServer() (*topo.Server, error) { + if wd.ct.externalCluster == "" { + return wd.ct.ts, nil + } + ctx, cancel := context.WithTimeout(wd.ct.vde.ctx, topo.RemoteOperationTimeout) + defer cancel() + return wd.ct.ts.OpenExternalVitessClusterServer(ctx, wd.ct.externalCluster) +} diff --git a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ_test.go b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ_test.go index c51b6fdf281..5ac0fabd726 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ_test.go @@ -51,6 +51,16 @@ func TestBuildPlanSuccess(t *testing.T) { vdiffenv.dbClient.ExpectRequest("select * from _vt.vdiff where id = 1", noResults, nil) ct, err := newController(context.Background(), controllerQR.Named().Row(), vdiffenv.dbClientFactory, tstenv.TopoServ, vdiffenv.vde, vdiffenv.opts) require.NoError(t, err) + ct.sources = map[string]*migrationSource{ + tstenv.ShardName: { + vrID: 1, + shardStreamer: &shardStreamer{ + tablet: vdenv.vde.thisTablet, + shard: tstenv.ShardName, + }, + }, + } + ct.sourceKeyspace = tstenv.KeyspaceName testcases := []struct { input *binlogdatapb.Rule @@ -63,14 +73,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 order by c1 asc", - targetQuery: "select c1, c2 from t1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 order by c1 asc", + targetQuery: "select c1, c2 from t1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -83,14 +94,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 where in_keyrange('-80') order by c1 asc", - targetQuery: "select c1, c2 from t1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 where in_keyrange('-80') order by c1 asc", + targetQuery: "select c1, c2 from t1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -103,14 +115,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 order by c1 asc", - targetQuery: "select c1, c2 from t1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 order by c1 asc", + targetQuery: "select c1, c2 from t1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -123,14 +136,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c2, c1 from t1 order by c1 asc", - targetQuery: "select c2, c1 from t1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{1}, - selectPks: []int{1}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c2, c1 from t1 order by c1 asc", + targetQuery: "select c2, c1 from t1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{1}, + sourcePkCols: []int{0}, + selectPks: []int{1}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -143,14 +157,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c0 as c1, c2 from t2 order by c1 asc", - targetQuery: "select c1, c2 from t1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c0 as c1, c2 from t2 order by c1 asc", + targetQuery: "select c1, c2 from t1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -164,14 +179,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "nonpktext", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["nonpktext"]], - sourceQuery: "select c1, textcol from nonpktext order by c1 asc", - targetQuery: "select c1, textcol from nonpktext order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "textcol"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["nonpktext"]], + sourceQuery: "select c1, textcol from nonpktext order by c1 asc", + targetQuery: "select c1, textcol from nonpktext order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "textcol"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -185,14 +201,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "nonpktext", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["nonpktext"]], - sourceQuery: "select textcol, c1 from nonpktext order by c1 asc", - targetQuery: "select textcol, c1 from nonpktext order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "textcol"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{1}, - selectPks: []int{1}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["nonpktext"]], + sourceQuery: "select textcol, c1 from nonpktext order by c1 asc", + targetQuery: "select textcol, c1 from nonpktext order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "textcol"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{1}, + sourcePkCols: []int{0}, + selectPks: []int{1}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -206,14 +223,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "pktext", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["pktext"]], - sourceQuery: "select textcol, c2 from pktext order by textcol asc", - targetQuery: "select textcol, c2 from pktext order by textcol asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["pktext"]], + sourceQuery: "select textcol, c2 from pktext order by textcol asc", + targetQuery: "select textcol, c2 from pktext order by textcol asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, + pkCols: []int{0}, + sourcePkCols: []int{}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("textcol")}, Direction: sqlparser.AscOrder, @@ -227,14 +245,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "pktext", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["pktext"]], - sourceQuery: "select c2, textcol from pktext order by textcol asc", - targetQuery: "select c2, textcol from pktext order by textcol asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, - comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, - pkCols: []int{1}, - selectPks: []int{1}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["pktext"]], + sourceQuery: "select c2, textcol from pktext order by textcol asc", + targetQuery: "select c2, textcol from pktext order by textcol asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, + comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, + pkCols: []int{1}, + sourcePkCols: []int{}, + selectPks: []int{1}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("textcol")}, Direction: sqlparser.AscOrder, @@ -248,14 +267,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "nopk", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["nopk"]], - sourceQuery: "select c1, c2, c3 from nopk order by c1 asc, c2 asc, c3 asc", - targetQuery: "select c1, c2, c3 from nopk order by c1 asc, c2 asc, c3 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, - pkCols: []int{0, 1, 2}, - selectPks: []int{0, 1, 2}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["nopk"]], + sourceQuery: "select c1, c2, c3 from nopk order by c1 asc, c2 asc, c3 asc", + targetQuery: "select c1, c2, c3 from nopk order by c1 asc, c2 asc, c3 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, + pkCols: []int{0, 1, 2}, + sourcePkCols: []int{0}, + selectPks: []int{0, 1, 2}, orderBy: sqlparser.OrderBy{ &sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, @@ -279,14 +299,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "nopkwithpke", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["nopkwithpke"]], - sourceQuery: "select c1, c2, c3 from nopkwithpke order by c3 asc", - targetQuery: "select c1, c2, c3 from nopkwithpke order by c3 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, - comparePKs: []compareColInfo{{2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, - pkCols: []int{2}, - selectPks: []int{2}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["nopkwithpke"]], + sourceQuery: "select c1, c2, c3 from nopkwithpke order by c3 asc", + targetQuery: "select c1, c2, c3 from nopkwithpke order by c3 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, + comparePKs: []compareColInfo{{2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, + pkCols: []int{2}, + sourcePkCols: []int{0}, + selectPks: []int{2}, orderBy: sqlparser.OrderBy{ &sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c3")}, @@ -302,14 +323,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "pktext", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["pktext"]], - sourceQuery: "select c2, a + b as textcol from pktext order by textcol asc", - targetQuery: "select c2, textcol from pktext order by textcol asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, - comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, - pkCols: []int{1}, - selectPks: []int{1}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["pktext"]], + sourceQuery: "select c2, a + b as textcol from pktext order by textcol asc", + targetQuery: "select c2, textcol from pktext order by textcol asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, + comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, + pkCols: []int{1}, + sourcePkCols: []int{}, + selectPks: []int{1}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("textcol")}, Direction: sqlparser.AscOrder, @@ -322,14 +344,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "multipk", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["multipk"]], - sourceQuery: "select c1, c2 from multipk order by c1 asc, c2 asc", - targetQuery: "select c1, c2 from multipk order by c1 asc, c2 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}}, - pkCols: []int{0, 1}, - selectPks: []int{0, 1}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["multipk"]], + sourceQuery: "select c1, c2 from multipk order by c1 asc, c2 asc", + targetQuery: "select c1, c2 from multipk order by c1 asc, c2 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}}, + pkCols: []int{0, 1}, + sourcePkCols: []int{0}, + selectPks: []int{0, 1}, orderBy: sqlparser.OrderBy{ &sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, @@ -349,14 +372,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 where in_keyrange('-80') order by c1 asc", - targetQuery: "select c1, c2 from t1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 where in_keyrange('-80') order by c1 asc", + targetQuery: "select c1, c2 from t1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -370,14 +394,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 where c2 = 2 and in_keyrange('-80') order by c1 asc", - targetQuery: "select c1, c2 from t1 where c2 = 2 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 where c2 = 2 and in_keyrange('-80') order by c1 asc", + targetQuery: "select c1, c2 from t1 where c2 = 2 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -391,14 +416,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 where in_keyrange('-80') and c2 = 2 order by c1 asc", - targetQuery: "select c1, c2 from t1 where c2 = 2 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 where in_keyrange('-80') and c2 = 2 order by c1 asc", + targetQuery: "select c1, c2 from t1 where c2 = 2 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -412,14 +438,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 where c2 = 2 and c1 = 1 and in_keyrange('-80') order by c1 asc", - targetQuery: "select c1, c2 from t1 where c2 = 2 and c1 = 1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 where c2 = 2 and c1 = 1 and in_keyrange('-80') order by c1 asc", + targetQuery: "select c1, c2 from t1 where c2 = 2 and c1 = 1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -433,14 +460,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 where c2 = 2 and in_keyrange('-80') order by c1 asc", - targetQuery: "select c1, c2 from t1 where c2 = 2 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 where c2 = 2 and in_keyrange('-80') order by c1 asc", + targetQuery: "select c1, c2 from t1 where c2 = 2 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -454,14 +482,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 group by c1 order by c1 asc", - targetQuery: "select c1, c2 from t1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 group by c1 order by c1 asc", + targetQuery: "select c1, c2 from t1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -475,14 +504,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "aggr", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["aggr"]], - sourceQuery: "select c1, c2, count(*) as c3, sum(c4) as c4 from t1 group by c1 order by c1 asc", - targetQuery: "select c1, c2, c3, c4 from aggr order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c3"}, {3, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c4"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["aggr"]], + sourceQuery: "select c1, c2, count(*) as c3, sum(c4) as c4 from t1 group by c1 order by c1 asc", + targetQuery: "select c1, c2, c3, c4 from aggr order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c3"}, {3, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c4"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -500,14 +530,15 @@ func TestBuildPlanSuccess(t *testing.T) { sourceTimeZone: "US/Pacific", table: "datze", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["datze"]], - sourceQuery: "select id, dt from datze order by id asc", - targetQuery: "select id, convert_tz(dt, 'UTC', 'US/Pacific') as dt from datze order by id asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "id"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "dt"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "id"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["datze"]], + sourceQuery: "select id, dt from datze order by id asc", + targetQuery: "select id, convert_tz(dt, 'UTC', 'US/Pacific') as dt from datze order by id asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "id"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "dt"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "id"}}, + pkCols: []int{0}, + sourcePkCols: []int{}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("id")}, Direction: sqlparser.AscOrder, diff --git a/go/vt/vttablet/tabletserver/dt_executor_test.go b/go/vt/vttablet/tabletserver/dt_executor_test.go index b21667392d6..f83d7ff9006 100644 --- a/go/vt/vttablet/tabletserver/dt_executor_test.go +++ b/go/vt/vttablet/tabletserver/dt_executor_test.go @@ -31,6 +31,8 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" + "vitess.io/vitess/go/streamlog" + "vitess.io/vitess/go/event/syslogger" "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/mysql/sqlerror" @@ -714,7 +716,7 @@ func TestNoTwopc(t *testing.T) { func newTestTxExecutor(t *testing.T, ctx context.Context) (txe *DTExecutor, tsv *TabletServer, db *fakesqldb.DB, closer func()) { db = setUpQueryExecutorTest(t) - logStats := tabletenv.NewLogStats(ctx, "TestTxExecutor") + logStats := tabletenv.NewLogStats(ctx, "TestTxExecutor", streamlog.NewQueryLogConfigForTest()) tsv = newTestTabletServer(ctx, smallTxPool, db) cfg := tabletenv.NewDefaultConfig() cfg.DB = newDBConfigs(db) @@ -741,7 +743,7 @@ func newTestTxExecutor(t *testing.T, ctx context.Context) (txe *DTExecutor, tsv // newShortAgeExecutor is same as newTestTxExecutor, but shorter transaction abandon age. func newShortAgeExecutor(t *testing.T, ctx context.Context) (txe *DTExecutor, tsv *TabletServer, db *fakesqldb.DB) { db = setUpQueryExecutorTest(t) - logStats := tabletenv.NewLogStats(ctx, "TestTxExecutor") + logStats := tabletenv.NewLogStats(ctx, "TestTxExecutor", streamlog.NewQueryLogConfigForTest()) tsv = newTestTabletServer(ctx, smallTxPool|shortTwopcAge, db) db.AddQueryPattern("insert into _vt\\.redo_state\\(dtid, state, time_created\\) values \\(_binary'aa', 1,.*", &sqltypes.Result{}) db.AddQueryPattern("insert into _vt\\.redo_statement.*", &sqltypes.Result{}) @@ -758,7 +760,7 @@ func newShortAgeExecutor(t *testing.T, ctx context.Context) (txe *DTExecutor, ts // newNoTwopcExecutor is same as newTestTxExecutor, but 2pc disabled. func newNoTwopcExecutor(t *testing.T, ctx context.Context) (txe *DTExecutor, tsv *TabletServer, db *fakesqldb.DB) { db = setUpQueryExecutorTest(t) - logStats := tabletenv.NewLogStats(ctx, "TestTxExecutor") + logStats := tabletenv.NewLogStats(ctx, "TestTxExecutor", streamlog.NewQueryLogConfigForTest()) tsv = newTestTabletServer(ctx, noTwopc, db) return &DTExecutor{ ctx: ctx, diff --git a/go/vt/vttablet/tabletserver/query_engine.go b/go/vt/vttablet/tabletserver/query_engine.go index d0542165878..4168a11f584 100644 --- a/go/vt/vttablet/tabletserver/query_engine.go +++ b/go/vt/vttablet/tabletserver/query_engine.go @@ -196,6 +196,8 @@ type QueryEngine struct { // Loggers accessCheckerLogger *logutil.ThrottledLogger + + redactUIQuery bool } // NewQueryEngine creates a new QueryEngine. @@ -209,6 +211,7 @@ func NewQueryEngine(env tabletenv.Env, se *schema.Engine) *QueryEngine { se: se, queryRuleSources: rules.NewMap(), enablePerWorkloadTableMetrics: config.EnablePerWorkloadTableMetrics, + redactUIQuery: streamlog.NewQueryLogConfigForTest().RedactDebugUIQueries, } // Cache for query plans: user configured size with a doorkeeper by default to prevent one-off queries @@ -737,7 +740,7 @@ func (qe *QueryEngine) handleHTTPConsolidations(response http.ResponseWriter, re response.Write([]byte(fmt.Sprintf("Length: %d\n", len(items)))) for _, v := range items { var query string - if streamlog.GetRedactDebugUIQueries() { + if qe.redactUIQuery { query, _ = qe.env.Environment().Parser().RedactSQLQuery(v.Query) } else { query = v.Query diff --git a/go/vt/vttablet/tabletserver/query_engine_test.go b/go/vt/vttablet/tabletserver/query_engine_test.go index a1c293ea8ba..c86e8aa163a 100644 --- a/go/vt/vttablet/tabletserver/query_engine_test.go +++ b/go/vt/vttablet/tabletserver/query_engine_test.go @@ -108,7 +108,7 @@ func TestGetPlanPanicDuetoEmptyQuery(t *testing.T) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) _, err := qe.GetPlan(ctx, logStats, "", false) require.EqualError(t, err, "Query was empty") } @@ -195,7 +195,7 @@ func TestQueryPlanCache(t *testing.T) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) initialHits := qe.queryEnginePlanCacheHits.Get() initialMisses := qe.queryEnginePlanCacheMisses.Get() @@ -244,7 +244,7 @@ func TestNoQueryPlanCache(t *testing.T) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) firstPlan, err := qe.GetPlan(ctx, logStats, firstQuery, true) if err != nil { @@ -273,7 +273,7 @@ func TestNoQueryPlanCacheDirective(t *testing.T) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) firstPlan, err := qe.GetPlan(ctx, logStats, firstQuery, false) if err != nil { @@ -301,7 +301,7 @@ func TestStreamQueryPlanCache(t *testing.T) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) firstPlan, err := qe.GetStreamPlan(ctx, logStats, firstQuery, false) require.NoError(t, err) @@ -325,7 +325,7 @@ func TestNoStreamQueryPlanCache(t *testing.T) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) firstPlan, err := qe.GetStreamPlan(ctx, logStats, firstQuery, true) require.NoError(t, err) require.NotNil(t, firstPlan) @@ -349,7 +349,7 @@ func TestNoStreamQueryPlanCacheDirective(t *testing.T) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) firstPlan, err := qe.GetStreamPlan(ctx, logStats, firstQuery, false) require.NoError(t, err) require.NotNil(t, firstPlan) @@ -369,7 +369,7 @@ func TestStatsURL(t *testing.T) { defer qe.Close() // warm up cache ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) qe.GetPlan(ctx, logStats, query, false) request, _ := http.NewRequest("GET", "/debug/tablet_plans", nil) @@ -425,18 +425,12 @@ func runConsolidatedQuery(t *testing.T, sql string) *QueryEngine { } func TestConsolidationsUIRedaction(t *testing.T) { - // Reset to default redaction state. - defer func() { - streamlog.SetRedactDebugUIQueries(false) - }() - request, _ := http.NewRequest("GET", "/debug/consolidations", nil) sql := "select * from test_db_01 where col = 'secret'" redactedSQL := "select * from test_db_01 where col = :col" // First with the redaction off - streamlog.SetRedactDebugUIQueries(false) unRedactedResponse := httptest.NewRecorder() qe := runConsolidatedQuery(t, sql) @@ -446,7 +440,7 @@ func TestConsolidationsUIRedaction(t *testing.T) { } // Now with the redaction on - streamlog.SetRedactDebugUIQueries(true) + qe.redactUIQuery = true redactedResponse := httptest.NewRecorder() qe.handleHTTPConsolidations(redactedResponse, request) @@ -473,7 +467,7 @@ func BenchmarkPlanCacheThroughput(b *testing.B) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) for i := 0; i < b.N; i++ { query := fmt.Sprintf("SELECT (a, b, c) FROM test_table_%d", rand.IntN(500)) @@ -503,7 +497,7 @@ func benchmarkPlanCache(b *testing.B, db *fakesqldb.DB, par int) { b.SetParallelism(par) b.RunParallel(func(pb *testing.PB) { ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) for pb.Next() { query := fmt.Sprintf("SELECT (a, b, c) FROM test_table_%d", rand.IntN(500)) @@ -618,7 +612,7 @@ func TestPlanCachePollution(t *testing.T) { runner := func(totalQueries uint64, stats *Stats, sample func() string) { for i := uint64(0); i < totalQueries; i++ { ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) query := sample() start := time.Now() diff --git a/go/vt/vttablet/tabletserver/query_executor_test.go b/go/vt/vttablet/tabletserver/query_executor_test.go index ade79ecaef5..6f6becd4038 100644 --- a/go/vt/vttablet/tabletserver/query_executor_test.go +++ b/go/vt/vttablet/tabletserver/query_executor_test.go @@ -28,6 +28,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/streamlog" + "vitess.io/vitess/go/stats" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtenv" @@ -840,7 +842,7 @@ func TestQueryExecutorMessageStreamACL(t *testing.T) { ctx: ctx, query: "stream from msg", plan: plan, - logStats: tabletenv.NewLogStats(ctx, "TestQueryExecutor"), + logStats: tabletenv.NewLogStats(ctx, "TestQueryExecutor", streamlog.NewQueryLogConfigForTest()), tsv: tsv, } @@ -1556,7 +1558,7 @@ func newTransaction(tsv *TabletServer, options *querypb.ExecuteOptions) int64 { } func newTestQueryExecutor(ctx context.Context, tsv *TabletServer, sql string, txID int64) *QueryExecutor { - logStats := tabletenv.NewLogStats(ctx, "TestQueryExecutor") + logStats := tabletenv.NewLogStats(ctx, "TestQueryExecutor", streamlog.NewQueryLogConfigForTest()) plan, err := tsv.qe.GetPlan(ctx, logStats, sql, false) if err != nil { panic(err) @@ -1573,7 +1575,7 @@ func newTestQueryExecutor(ctx context.Context, tsv *TabletServer, sql string, tx } func newTestQueryExecutorStreaming(ctx context.Context, tsv *TabletServer, sql string, txID int64) *QueryExecutor { - logStats := tabletenv.NewLogStats(ctx, "TestQueryExecutorStreaming") + logStats := tabletenv.NewLogStats(ctx, "TestQueryExecutorStreaming", streamlog.NewQueryLogConfigForTest()) plan, err := tsv.qe.GetStreamPlan(ctx, logStats, sql, false) if err != nil { panic(err) diff --git a/go/vt/vttablet/tabletserver/query_list.go b/go/vt/vttablet/tabletserver/query_list.go index 60fac1ea3af..7263bea3afc 100644 --- a/go/vt/vttablet/tabletserver/query_list.go +++ b/go/vt/vttablet/tabletserver/query_list.go @@ -63,6 +63,8 @@ type QueryList struct { parser *sqlparser.Parser ca ClusterActionState + + redactUIQuery bool } type ClusterActionState int @@ -76,10 +78,11 @@ const ( // NewQueryList creates a new QueryList func NewQueryList(name string, parser *sqlparser.Parser) *QueryList { return &QueryList{ - name: name, - queryDetails: make(map[int64][]*QueryDetail), - parser: parser, - ca: ClusterActionNotInProgress, + name: name, + queryDetails: make(map[int64][]*QueryDetail), + parser: parser, + ca: ClusterActionNotInProgress, + redactUIQuery: streamlog.GetQueryLogConfig().RedactDebugUIQueries, } } @@ -186,7 +189,7 @@ func (ql *QueryList) AppendQueryzRows(rows []QueryDetailzRow) []QueryDetailzRow for _, qds := range ql.queryDetails { for _, qd := range qds { query := qd.conn.Current() - if streamlog.GetRedactDebugUIQueries() { + if ql.redactUIQuery { query, _ = ql.parser.RedactSQLQuery(query) } row := QueryDetailzRow{ diff --git a/go/vt/vttablet/tabletserver/querylogz_test.go b/go/vt/vttablet/tabletserver/querylogz_test.go index ee26437f330..7f865541295 100644 --- a/go/vt/vttablet/tabletserver/querylogz_test.go +++ b/go/vt/vttablet/tabletserver/querylogz_test.go @@ -35,7 +35,7 @@ import ( func TestQuerylogzHandler(t *testing.T) { req, _ := http.NewRequest("GET", "/querylogz?timeout=10&limit=1", nil) - logStats := tabletenv.NewLogStats(context.Background(), "Execute") + logStats := tabletenv.NewLogStats(context.Background(), "Execute", streamlog.NewQueryLogConfigForTest()) logStats.PlanType = planbuilder.PlanSelect.String() logStats.OriginalSQL = "select name, 'inject ' from test_table limit 1000" logStats.RowsAffected = 1000 @@ -144,8 +144,7 @@ func TestQuerylogzHandler(t *testing.T) { checkQuerylogzHasStats(t, slowQueryPattern, logStats, body) // ensure querylogz is not affected by the filter tag - streamlog.SetQueryLogFilterTag("XXX_SKIP_ME") - defer func() { streamlog.SetQueryLogFilterTag("") }() + logStats.Config.FilterTag = "XXX_SKIP_ME" ch = make(chan *tabletenv.LogStats, 1) ch <- logStats querylogzHandler(ch, response, req, sqlparser.NewTestParser()) diff --git a/go/vt/vttablet/tabletserver/stream_consolidator_flaky_test.go b/go/vt/vttablet/tabletserver/stream_consolidator_flaky_test.go index caa519cc477..c8d9f634384 100644 --- a/go/vt/vttablet/tabletserver/stream_consolidator_flaky_test.go +++ b/go/vt/vttablet/tabletserver/stream_consolidator_flaky_test.go @@ -24,6 +24,7 @@ import ( "testing" "time" + "vitess.io/vitess/go/streamlog" querypb "vitess.io/vitess/go/vt/proto/query" "github.com/stretchr/testify/require" @@ -126,7 +127,7 @@ func (ct *consolidationTest) run(workers int, generateCallback func(int) (string defer wg.Done() exporter := servenv.NewExporter("ConsolidatorTest", "") timings := exporter.NewTimings("ConsolidatorWaits", "", "StreamConsolidations") - logStats := tabletenv.NewLogStats(context.Background(), "StreamConsolidation") + logStats := tabletenv.NewLogStats(context.Background(), "StreamConsolidation", streamlog.NewQueryLogConfigForTest()) query, callback := generateCallback(worker) start := time.Now() err := ct.cc.Consolidate(timings, logStats, query, func(result *sqltypes.Result) error { diff --git a/go/vt/vttablet/tabletserver/tabletenv/config.go b/go/vt/vttablet/tabletserver/tabletenv/config.go index 42cc300f92d..08bf0b1d7c8 100644 --- a/go/vt/vttablet/tabletserver/tabletenv/config.go +++ b/go/vt/vttablet/tabletserver/tabletenv/config.go @@ -278,11 +278,12 @@ func Init() { currentConfig.Healthcheck.UnhealthyThreshold = unhealthyThreshold currentConfig.GracePeriods.Transition = transitionGracePeriod - switch streamlog.GetQueryLogFormat() { + logFormat := streamlog.GetQueryLogConfig().Format + switch logFormat { case streamlog.QueryLogFormatText: case streamlog.QueryLogFormatJSON: default: - log.Exitf("Invalid querylog-format value %v: must be either text or json", streamlog.GetQueryLogFormat()) + log.Exitf("Invalid querylog-format value %v: must be either text or json", logFormat) } if queryLogHandler != "" { diff --git a/go/vt/vttablet/tabletserver/tabletenv/logstats.go b/go/vt/vttablet/tabletserver/tabletenv/logstats.go index ad7e09de169..40156f3bcdc 100644 --- a/go/vt/vttablet/tabletserver/tabletenv/logstats.go +++ b/go/vt/vttablet/tabletserver/tabletenv/logstats.go @@ -43,6 +43,8 @@ const ( // LogStats records the stats for a single query type LogStats struct { + Config streamlog.QueryLogConfig + Ctx context.Context Method string Target *querypb.Target @@ -66,11 +68,12 @@ type LogStats struct { // NewLogStats constructs a new LogStats with supplied Method and ctx // field values, and the StartTime field set to the present time. -func NewLogStats(ctx context.Context, methodName string) *LogStats { +func NewLogStats(ctx context.Context, methodName string, config streamlog.QueryLogConfig) *LogStats { return &LogStats{ Ctx: ctx, Method: methodName, StartTime: time.Now(), + Config: config, } } @@ -177,17 +180,16 @@ func (stats *LogStats) CallInfo() (string, string) { // Logf formats the log record to the given writer, either as // tab-separated list of logged fields or as JSON. func (stats *LogStats) Logf(w io.Writer, params url.Values) error { - if !streamlog.ShouldEmitLog(stats.OriginalSQL, uint64(stats.RowsAffected), uint64(len(stats.Rows))) { + if !stats.Config.ShouldEmitLog(stats.OriginalSQL, uint64(stats.RowsAffected), uint64(len(stats.Rows)), stats.Error != nil) { return nil } - redacted := streamlog.GetRedactDebugUIQueries() _, fullBindParams := params["full"] // TODO: remove username here we fully enforce immediate caller id callInfo, username := stats.CallInfo() log := logstats.NewLogger() - log.Init(streamlog.GetQueryLogFormat() == streamlog.QueryLogFormatJSON) + log.Init(stats.Config.Format == streamlog.QueryLogFormatJSON) log.Key("Method") log.StringUnquoted(stats.Method) log.Key("CallInfo") @@ -209,7 +211,7 @@ func (stats *LogStats) Logf(w io.Writer, params url.Values) error { log.Key("OriginalSQL") log.String(stats.OriginalSQL) log.Key("BindVars") - if redacted { + if stats.Config.RedactDebugUIQueries { log.Redacted() } else { log.BindVariables(stats.BindVariables, fullBindParams) @@ -217,7 +219,7 @@ func (stats *LogStats) Logf(w io.Writer, params url.Values) error { log.Key("Queries") log.Int(int64(stats.NumberOfQueries)) log.Key("RewrittenSQL") - if redacted { + if stats.Config.RedactDebugUIQueries { log.Redacted() } else { log.String(stats.RewrittenSQL()) diff --git a/go/vt/vttablet/tabletserver/tabletenv/logstats_test.go b/go/vt/vttablet/tabletserver/tabletenv/logstats_test.go index 7412a0a436c..4c31b890cca 100644 --- a/go/vt/vttablet/tabletserver/tabletenv/logstats_test.go +++ b/go/vt/vttablet/tabletserver/tabletenv/logstats_test.go @@ -26,6 +26,8 @@ import ( "time" "github.com/google/safehtml/testconversions" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/streamlog" @@ -35,7 +37,7 @@ import ( ) func TestLogStats(t *testing.T) { - logStats := NewLogStats(context.Background(), "test") + logStats := NewLogStats(context.Background(), "test", streamlog.QueryLogConfig{}) logStats.AddRewrittenSQL("sql1", time.Now()) if !strings.Contains(logStats.RewrittenSQL(), "sql1") { @@ -59,7 +61,7 @@ func testFormat(stats *LogStats, params url.Values) string { } func TestLogStatsFormat(t *testing.T) { - logStats := NewLogStats(context.Background(), "test") + logStats := NewLogStats(context.Background(), "test", streamlog.NewQueryLogConfigForTest()) logStats.StartTime = time.Date(2017, time.January, 1, 1, 2, 3, 0, time.UTC) logStats.EndTime = time.Date(2017, time.January, 1, 1, 2, 4, 1234, time.UTC) logStats.OriginalSQL = "sql" @@ -70,90 +72,65 @@ func TestLogStatsFormat(t *testing.T) { logStats.Rows = [][]sqltypes.Value{{sqltypes.NewVarBinary("a")}} params := map[string][]string{"full": {}} - streamlog.SetRedactDebugUIQueries(false) - streamlog.SetQueryLogFormat("text") - got := testFormat(logStats, url.Values(params)) + got := testFormat(logStats, params) want := "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t\t\"sql\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t1\t\"sql with pii\"\tmysql\t0.000000\t0.000000\t0\t12345\t1\t\"\"\t\n" - if got != want { - t.Errorf("logstats format: got:\n%q\nwant:\n%q\n", got, want) - } + assert.Equal(t, want, got) - streamlog.SetRedactDebugUIQueries(true) - streamlog.SetQueryLogFormat("text") - got = testFormat(logStats, url.Values(params)) + logStats.Config.RedactDebugUIQueries = true + + got = testFormat(logStats, params) want = "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t\t\"sql\"\t\"[REDACTED]\"\t1\t\"[REDACTED]\"\tmysql\t0.000000\t0.000000\t0\t12345\t1\t\"\"\t\n" - if got != want { - t.Errorf("logstats format: got:\n%q\nwant:\n%q\n", got, want) - } + assert.Equal(t, want, got) - streamlog.SetRedactDebugUIQueries(false) - streamlog.SetQueryLogFormat("json") - got = testFormat(logStats, url.Values(params)) + logStats.Config.RedactDebugUIQueries = false + logStats.Config.Format = streamlog.QueryLogFormatJSON + + got = testFormat(logStats, params) var parsed map[string]any err := json.Unmarshal([]byte(got), &parsed) if err != nil { t.Errorf("logstats format: error unmarshaling json: %v -- got:\n%v", err, got) } formatted, err := json.MarshalIndent(parsed, "", " ") - if err != nil { - t.Errorf("logstats format: error marshaling json: %v -- got:\n%v", err, got) - } + require.NoError(t, err) want = "{\n \"BindVars\": {\n \"intVal\": {\n \"type\": \"INT64\",\n \"value\": 1\n }\n },\n \"CallInfo\": \"\",\n \"ConnWaitTime\": 0,\n \"Effective Caller\": \"\",\n \"End\": \"2017-01-01 01:02:04.000001\",\n \"Error\": \"\",\n \"ImmediateCaller\": \"\",\n \"Method\": \"test\",\n \"MysqlTime\": 0,\n \"OriginalSQL\": \"sql\",\n \"PlanType\": \"\",\n \"Queries\": 1,\n \"QuerySources\": \"mysql\",\n \"ResponseSize\": 1,\n \"RewrittenSQL\": \"sql with pii\",\n \"RowsAffected\": 0,\n \"Start\": \"2017-01-01 01:02:03.000000\",\n \"TotalTime\": 1.000001,\n \"TransactionID\": 12345,\n \"Username\": \"\"\n}" - if string(formatted) != want { - t.Errorf("logstats format: got:\n%q\nwant:\n%v\n", string(formatted), want) - } + assert.Equal(t, want, string(formatted)) + + logStats.Config.RedactDebugUIQueries = true + logStats.Config.Format = streamlog.QueryLogFormatJSON - streamlog.SetRedactDebugUIQueries(true) - streamlog.SetQueryLogFormat("json") - got = testFormat(logStats, url.Values(params)) + got = testFormat(logStats, params) err = json.Unmarshal([]byte(got), &parsed) - if err != nil { - t.Errorf("logstats format: error unmarshaling json: %v -- got:\n%v", err, got) - } + require.NoError(t, err) formatted, err = json.MarshalIndent(parsed, "", " ") - if err != nil { - t.Errorf("logstats format: error marshaling json: %v -- got:\n%v", err, got) - } + require.NoError(t, err) want = "{\n \"BindVars\": \"[REDACTED]\",\n \"CallInfo\": \"\",\n \"ConnWaitTime\": 0,\n \"Effective Caller\": \"\",\n \"End\": \"2017-01-01 01:02:04.000001\",\n \"Error\": \"\",\n \"ImmediateCaller\": \"\",\n \"Method\": \"test\",\n \"MysqlTime\": 0,\n \"OriginalSQL\": \"sql\",\n \"PlanType\": \"\",\n \"Queries\": 1,\n \"QuerySources\": \"mysql\",\n \"ResponseSize\": 1,\n \"RewrittenSQL\": \"[REDACTED]\",\n \"RowsAffected\": 0,\n \"Start\": \"2017-01-01 01:02:03.000000\",\n \"TotalTime\": 1.000001,\n \"TransactionID\": 12345,\n \"Username\": \"\"\n}" - if string(formatted) != want { - t.Errorf("logstats format: got:\n%q\nwant:\n%v\n", string(formatted), want) - } - - streamlog.SetRedactDebugUIQueries(false) + assert.Equal(t, want, string(formatted)) // Make sure formatting works for string bind vars. We can't do this as part of a single // map because the output ordering is undefined. logStats.BindVariables = map[string]*querypb.BindVariable{"strVal": sqltypes.StringBindVariable("abc")} + logStats.Config.RedactDebugUIQueries = false + logStats.Config.Format = streamlog.QueryLogFormatText - streamlog.SetQueryLogFormat("text") - got = testFormat(logStats, url.Values(params)) + got = testFormat(logStats, params) want = "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t\t\"sql\"\t{\"strVal\": {\"type\": \"VARCHAR\", \"value\": \"abc\"}}\t1\t\"sql with pii\"\tmysql\t0.000000\t0.000000\t0\t12345\t1\t\"\"\t\n" - if got != want { - t.Errorf("logstats format: got:\n%q\nwant:\n%q\n", got, want) - } + assert.Equal(t, want, got) + + logStats.Config.RedactDebugUIQueries = false + logStats.Config.Format = streamlog.QueryLogFormatJSON - streamlog.SetQueryLogFormat("json") - got = testFormat(logStats, url.Values(params)) + got = testFormat(logStats, params) err = json.Unmarshal([]byte(got), &parsed) - if err != nil { - t.Errorf("logstats format: error unmarshaling json: %v -- got:\n%v", err, got) - } + require.NoError(t, err) formatted, err = json.MarshalIndent(parsed, "", " ") - if err != nil { - t.Errorf("logstats format: error marshaling json: %v -- got:\n%v", err, got) - } + require.NoError(t, err) want = "{\n \"BindVars\": {\n \"strVal\": {\n \"type\": \"VARCHAR\",\n \"value\": \"abc\"\n }\n },\n \"CallInfo\": \"\",\n \"ConnWaitTime\": 0,\n \"Effective Caller\": \"\",\n \"End\": \"2017-01-01 01:02:04.000001\",\n \"Error\": \"\",\n \"ImmediateCaller\": \"\",\n \"Method\": \"test\",\n \"MysqlTime\": 0,\n \"OriginalSQL\": \"sql\",\n \"PlanType\": \"\",\n \"Queries\": 1,\n \"QuerySources\": \"mysql\",\n \"ResponseSize\": 1,\n \"RewrittenSQL\": \"sql with pii\",\n \"RowsAffected\": 0,\n \"Start\": \"2017-01-01 01:02:03.000000\",\n \"TotalTime\": 1.000001,\n \"TransactionID\": 12345,\n \"Username\": \"\"\n}" - if string(formatted) != want { - t.Errorf("logstats format: got:\n%q\nwant:\n%v\n", string(formatted), want) - } - - streamlog.SetQueryLogFormat("text") + assert.Equal(t, want, string(formatted)) } func TestLogStatsFilter(t *testing.T) { - defer func() { streamlog.SetQueryLogFilterTag("") }() - - logStats := NewLogStats(context.Background(), "test") + logStats := NewLogStats(context.Background(), "test", streamlog.NewQueryLogConfigForTest()) logStats.StartTime = time.Date(2017, time.January, 1, 1, 2, 3, 0, time.UTC) logStats.EndTime = time.Date(2017, time.January, 1, 1, 2, 4, 1234, time.UTC) logStats.OriginalSQL = "sql /* LOG_THIS_QUERY */" @@ -163,21 +140,21 @@ func TestLogStatsFilter(t *testing.T) { logStats.Rows = [][]sqltypes.Value{{sqltypes.NewVarBinary("a")}} params := map[string][]string{"full": {}} - got := testFormat(logStats, url.Values(params)) + got := testFormat(logStats, params) want := "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t\t\"sql /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t1\t\"sql with pii\"\tmysql\t0.000000\t0.000000\t0\t0\t1\t\"\"\t\n" if got != want { t.Errorf("logstats format: got:\n%q\nwant:\n%q\n", got, want) } - streamlog.SetQueryLogFilterTag("LOG_THIS_QUERY") - got = testFormat(logStats, url.Values(params)) + logStats.Config.FilterTag = "LOG_THIS_QUERY" + got = testFormat(logStats, params) want = "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t\t\"sql /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t1\t\"sql with pii\"\tmysql\t0.000000\t0.000000\t0\t0\t1\t\"\"\t\n" if got != want { t.Errorf("logstats format: got:\n%q\nwant:\n%q\n", got, want) } - streamlog.SetQueryLogFilterTag("NOT_THIS_QUERY") - got = testFormat(logStats, url.Values(params)) + logStats.Config.FilterTag = "NOT_THIS_QUERY" + got = testFormat(logStats, params) want = "" if got != want { t.Errorf("logstats format: got:\n%q\nwant:\n%q\n", got, want) @@ -185,7 +162,7 @@ func TestLogStatsFilter(t *testing.T) { } func TestLogStatsFormatQuerySources(t *testing.T) { - logStats := NewLogStats(context.Background(), "test") + logStats := NewLogStats(context.Background(), "test", streamlog.NewQueryLogConfigForTest()) if logStats.FmtQuerySources() != "none" { t.Fatalf("should return none since log stats does not have any query source, but got: %s", logStats.FmtQuerySources()) } @@ -207,14 +184,14 @@ func TestLogStatsContextHTML(t *testing.T) { Html: testconversions.MakeHTMLForTest(html), } ctx := callinfo.NewContext(context.Background(), callInfo) - logStats := NewLogStats(ctx, "test") + logStats := NewLogStats(ctx, "test", streamlog.NewQueryLogConfigForTest()) if logStats.ContextHTML().String() != html { t.Fatalf("expect to get html: %s, but got: %s", html, logStats.ContextHTML().String()) } } func TestLogStatsErrorStr(t *testing.T) { - logStats := NewLogStats(context.Background(), "test") + logStats := NewLogStats(context.Background(), "test", streamlog.NewQueryLogConfigForTest()) if logStats.ErrorStr() != "" { t.Fatalf("should not get error in stats, but got: %s", logStats.ErrorStr()) } @@ -226,7 +203,7 @@ func TestLogStatsErrorStr(t *testing.T) { } func TestLogStatsCallInfo(t *testing.T) { - logStats := NewLogStats(context.Background(), "test") + logStats := NewLogStats(context.Background(), "test", streamlog.NewQueryLogConfigForTest()) caller, user := logStats.CallInfo() if caller != "" { t.Fatalf("caller should be empty") @@ -243,7 +220,7 @@ func TestLogStatsCallInfo(t *testing.T) { User: username, } ctx := callinfo.NewContext(context.Background(), callInfo) - logStats = NewLogStats(ctx, "test") + logStats = NewLogStats(ctx, "test", streamlog.NewQueryLogConfigForTest()) caller, user = logStats.CallInfo() wantCaller := remoteAddr + ":FakeExecute(fakeRPC)" if caller != wantCaller { @@ -253,3 +230,18 @@ func TestLogStatsCallInfo(t *testing.T) { t.Fatalf("expected to get username: %s, but got: %s", username, user) } } + +// TestLogStatsErrorsOnly tests that LogStats only logs errors when the query log mode is set to errors only for VTTablet. +func TestLogStatsErrorsOnly(t *testing.T) { + logStats := NewLogStats(context.Background(), "test", streamlog.NewQueryLogConfigForTest()) + logStats.Config.Mode = streamlog.QueryLogModeError + + // no error, should not log + logOutput := testFormat(logStats, url.Values{}) + assert.Empty(t, logOutput) + + // error, should log + logStats.Error = errors.New("test error") + logOutput = testFormat(logStats, url.Values{}) + assert.Contains(t, logOutput, "test error") +} diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index deeac10bd05..30f73d2d818 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -37,6 +37,7 @@ import ( "vitess.io/vitess/go/pools/smartconnpool" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/stats" + "vitess.io/vitess/go/streamlog" "vitess.io/vitess/go/tb" "vitess.io/vitess/go/trace" "vitess.io/vitess/go/vt/callerid" @@ -1551,7 +1552,7 @@ func (tsv *TabletServer) execRequest( defer span.Finish() - logStats := tabletenv.NewLogStats(ctx, requestName) + logStats := tabletenv.NewLogStats(ctx, requestName, streamlog.GetQueryLogConfig()) logStats.Target = target logStats.OriginalSQL = sql logStats.BindVariables = sqltypes.CopyBindVariables(bindVariables) @@ -1875,7 +1876,9 @@ func (tsv *TabletServer) registerQuerylogzHandler() { } func (tsv *TabletServer) registerTxlogzHandler() { - tsv.exporter.HandleFunc("/txlogz", txlogzHandler) + tsv.exporter.HandleFunc("/txlogz", func(w http.ResponseWriter, r *http.Request) { + txlogzHandler(w, r, streamlog.GetQueryLogConfig().RedactDebugUIQueries) + }) } func (tsv *TabletServer) registerQueryListHandlers(queryLists []*QueryList) { @@ -1890,7 +1893,7 @@ func (tsv *TabletServer) registerQueryListHandlers(queryLists []*QueryList) { func (tsv *TabletServer) registerTwopczHandler() { tsv.exporter.HandleFunc("/twopcz", func(w http.ResponseWriter, r *http.Request) { ctx := tabletenv.LocalContext() - txe := NewDTExecutor(ctx, tabletenv.NewLogStats(ctx, "twopcz"), tsv.te, tsv.qe, tsv.getShard) + txe := NewDTExecutor(ctx, tabletenv.NewLogStats(ctx, "twopcz", streamlog.GetQueryLogConfig()), tsv.te, tsv.qe, tsv.getShard) twopczHandler(txe, w, r) }) } diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index 621941224a9..e4faf4ee6c9 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -33,6 +33,7 @@ import ( "vitess.io/vitess/go/mysql/config" "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/stats" + "vitess.io/vitess/go/streamlog" "vitess.io/vitess/go/vt/callerid" "vitess.io/vitess/go/vt/sidecardb" "vitess.io/vitess/go/vt/vtenv" @@ -1659,7 +1660,7 @@ func TestPurgeMessages(t *testing.T) { func TestHandleExecUnknownError(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - logStats := tabletenv.NewLogStats(ctx, "TestHandleExecError") + logStats := tabletenv.NewLogStats(ctx, "TestHandleExecError", streamlog.NewQueryLogConfigForTest()) cfg := tabletenv.NewDefaultConfig() srvTopoCounts := stats.NewCountersWithSingleLabel("", "Resilient srvtopo server operations", "type") tsv := NewTabletServer(ctx, vtenv.NewTestEnv(), "TabletServerTest", cfg, memorytopo.NewServer(ctx, ""), &topodatapb.TabletAlias{}, srvTopoCounts) @@ -1676,7 +1677,7 @@ func TestHandlePanicAndSendLogStatsMessageTruncation(t *testing.T) { defer cancel() tl := newTestLogger() defer tl.Close() - logStats := tabletenv.NewLogStats(ctx, "TestHandlePanicAndSendLogStatsMessageTruncation") + logStats := tabletenv.NewLogStats(ctx, "TestHandlePanicAndSendLogStatsMessageTruncation", streamlog.NewQueryLogConfigForTest()) env, err := vtenv.New(vtenv.Options{ MySQLServerVersion: config.DefaultMySQLVersion, TruncateErrLen: 32, diff --git a/go/vt/vttablet/tabletserver/txlogz.go b/go/vt/vttablet/tabletserver/txlogz.go index 8d1b88c8c85..9a60812ca0b 100644 --- a/go/vt/vttablet/tabletserver/txlogz.go +++ b/go/vt/vttablet/tabletserver/txlogz.go @@ -25,7 +25,6 @@ import ( "github.com/google/safehtml/template" "vitess.io/vitess/go/acl" - "vitess.io/vitess/go/streamlog" "vitess.io/vitess/go/vt/callerid" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/logz" @@ -76,13 +75,13 @@ var ( // Endpoint: /txlogz?timeout=%d&limit=%d // timeout: the txlogz will keep dumping transactions until timeout // limit: txlogz will keep dumping transactions until it hits the limit -func txlogzHandler(w http.ResponseWriter, req *http.Request) { +func txlogzHandler(w http.ResponseWriter, req *http.Request, redactUIQuery bool) { if err := acl.CheckAccessHTTP(req, acl.DEBUGGING); err != nil { acl.SendError(w, err) return } - if streamlog.GetRedactDebugUIQueries() { + if redactUIQuery { io.WriteString(w, ` diff --git a/go/vt/vttablet/tabletserver/txlogz_test.go b/go/vt/vttablet/tabletserver/txlogz_test.go index 8faec74d07b..4556665a52a 100644 --- a/go/vt/vttablet/tabletserver/txlogz_test.go +++ b/go/vt/vttablet/tabletserver/txlogz_test.go @@ -27,8 +27,6 @@ import ( "vitess.io/vitess/go/vt/vttablet/tabletserver/tx" "vitess.io/vitess/go/vt/callerid" - - "vitess.io/vitess/go/streamlog" ) func testNotRedacted(t *testing.T, r *httptest.ResponseRecorder) { @@ -45,11 +43,10 @@ func testRedacted(t *testing.T, r *httptest.ResponseRecorder) { func testHandler(req *http.Request, t *testing.T) { // Test with redactions off to start - streamlog.SetRedactDebugUIQueries(false) response := httptest.NewRecorder() tabletenv.TxLogger.Send("test msg") - txlogzHandler(response, req) + txlogzHandler(response, req, false) if !strings.Contains(response.Body.String(), "error") { t.Fatalf("should show an error page since transaction log format is invalid.") } @@ -66,26 +63,22 @@ func testHandler(req *http.Request, t *testing.T) { txConn.txProps.EndTime = txConn.txProps.StartTime response = httptest.NewRecorder() tabletenv.TxLogger.Send(txConn) - txlogzHandler(response, req) + txlogzHandler(response, req, false) testNotRedacted(t, response) txConn.txProps.EndTime = txConn.txProps.StartTime.Add(time.Duration(2) * time.Second) response = httptest.NewRecorder() tabletenv.TxLogger.Send(txConn) - txlogzHandler(response, req) + txlogzHandler(response, req, false) testNotRedacted(t, response) txConn.txProps.EndTime = txConn.txProps.StartTime.Add(time.Duration(500) * time.Millisecond) response = httptest.NewRecorder() tabletenv.TxLogger.Send(txConn) - txlogzHandler(response, req) + txlogzHandler(response, req, false) testNotRedacted(t, response) // Test with redactions on - streamlog.SetRedactDebugUIQueries(true) - txlogzHandler(response, req) + txlogzHandler(response, req, true) testRedacted(t, response) - - // Reset to default redaction state - streamlog.SetRedactDebugUIQueries(false) } func TestTxlogzHandler(t *testing.T) { diff --git a/go/vt/vttablet/tabletserver/txserializer/tx_serializer.go b/go/vt/vttablet/tabletserver/txserializer/tx_serializer.go index 10428ed67c7..d8962f1c2b8 100644 --- a/go/vt/vttablet/tabletserver/txserializer/tx_serializer.go +++ b/go/vt/vttablet/tabletserver/txserializer/tx_serializer.go @@ -19,14 +19,13 @@ limitations under the License. package txserializer import ( + "context" "fmt" "net/http" "strings" "sync" "time" - "context" - "vitess.io/vitess/go/acl" "vitess.io/vitess/go/stats" "vitess.io/vitess/go/streamlog" @@ -87,9 +86,10 @@ type TxSerializer struct { logQueueExceededDryRun *logutil.ThrottledLogger logGlobalQueueExceededDryRun *logutil.ThrottledLogger - mu sync.Mutex - queues map[string]*queue - globalSize int + mu sync.Mutex + queues map[string]*queue + globalSize int + redactUIQuery bool } // New returns a TxSerializer object. @@ -130,6 +130,7 @@ func New(env tabletenv.Env) *TxSerializer { logQueueExceededDryRun: logutil.NewThrottledLogger("HotRowProtection QueueExceeded DryRun", 5*time.Second), logGlobalQueueExceededDryRun: logutil.NewThrottledLogger("HotRowProtection GlobalQueueExceeded DryRun", 5*time.Second), queues: make(map[string]*queue), + redactUIQuery: streamlog.NewQueryLogConfigForTest().RedactDebugUIQueries, } } @@ -328,7 +329,7 @@ func (txs *TxSerializer) Pending(key string) int { // ServeHTTP lists the most recent, cached queries and their count. func (txs *TxSerializer) ServeHTTP(response http.ResponseWriter, request *http.Request) { - if streamlog.GetRedactDebugUIQueries() { + if txs.redactUIQuery { response.Write([]byte(` diff --git a/go/vt/vttablet/tabletserver/txserializer/tx_serializer_test.go b/go/vt/vttablet/tabletserver/txserializer/tx_serializer_test.go index e1b4b5a7612..d53c434d9b6 100644 --- a/go/vt/vttablet/tabletserver/txserializer/tx_serializer_test.go +++ b/go/vt/vttablet/tabletserver/txserializer/tx_serializer_test.go @@ -26,7 +26,6 @@ import ( "testing" "time" - "vitess.io/vitess/go/streamlog" "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" @@ -71,17 +70,13 @@ func TestTxSerializer_NoHotRow(t *testing.T) { } func TestTxSerializerRedactDebugUI(t *testing.T) { - streamlog.SetRedactDebugUIQueries(true) - defer func() { - streamlog.SetRedactDebugUIQueries(false) - }() - cfg := tabletenv.NewDefaultConfig() cfg.HotRowProtection.MaxQueueSize = 1 cfg.HotRowProtection.MaxGlobalQueueSize = 1 cfg.HotRowProtection.MaxConcurrency = 5 txs := New(tabletenv.NewEnv(vtenv.NewTestEnv(), cfg, "TxSerializerTest")) resetVariables(txs) + txs.redactUIQuery = true done, waited, err := txs.Wait(context.Background(), "t1 where1", "t1") if err != nil { diff --git a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go index 31c47674233..317936e4289 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go @@ -276,7 +276,8 @@ func (rs *rowStreamer) buildSelect(st *binlogdatapb.MinimalTable) (string, error buf.Myprintf(" from %v%s", sqlparser.NewIdentifierCS(rs.plan.Table.Name), indexHint) if len(rs.lastpk) != 0 { if len(rs.lastpk) != len(rs.pkColumns) { - return "", fmt.Errorf("primary key values don't match length: %v vs %v", rs.lastpk, rs.pkColumns) + return "", fmt.Errorf("cannot build a row streamer plan for the %s table as a lastpk value was provided and the number of primary key values within it (%v) does not match the number of primary key columns in the table (%d)", + st.Name, rs.lastpk, rs.pkColumns) } buf.WriteString(" where ") prefix := "" diff --git a/java/example/pom.xml b/java/example/pom.xml index fabab27dd77..19b5838510b 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -30,9 +30,9 @@ - mysql - mysql-connector-java - 8.0.33 + com.mysql + mysql-connector-j + 8.4.0 false diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index dd554e64501..a52048576a1 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -57,25 +57,6 @@ 3.12.4 test - - - org.powermock - powermock-api-mockito2 - 2.0.9 - test - - - org.powermock - powermock-core - 2.0.9 - test - - - org.powermock - powermock-module-junit4 - 2.0.9 - test - diff --git a/java/jdbc/src/main/java/io/vitess/jdbc/VitessJDBCUrl.java b/java/jdbc/src/main/java/io/vitess/jdbc/VitessJDBCUrl.java index e6a1b0187dd..3835ba543f8 100644 --- a/java/jdbc/src/main/java/io/vitess/jdbc/VitessJDBCUrl.java +++ b/java/jdbc/src/main/java/io/vitess/jdbc/VitessJDBCUrl.java @@ -218,7 +218,7 @@ private static Properties getURLParamProperties(String paramString, Properties i } } - // Per the mysql-connector-java docs, passed in Properties values should take precedence + // Per the mysql-connector-j docs, passed in Properties values should take precedence // over // those in the URL. See javadoc for NonRegisteringDriver#connect if ((null != value && value.length() > 0) && (parameter.length() > 0) && null == info diff --git a/java/jdbc/src/main/java/io/vitess/jdbc/VitessMySQLDatabaseMetadata.java b/java/jdbc/src/main/java/io/vitess/jdbc/VitessMySQLDatabaseMetadata.java index 0235393a2c9..1f4e33585f3 100644 --- a/java/jdbc/src/main/java/io/vitess/jdbc/VitessMySQLDatabaseMetadata.java +++ b/java/jdbc/src/main/java/io/vitess/jdbc/VitessMySQLDatabaseMetadata.java @@ -67,18 +67,19 @@ public class VitessMySQLDatabaseMetadata extends VitessDatabaseMetaData implemen "INNER", "INOUT", "INSENSITIVE", "INSERT", "INT", "INT1", "INT2", "INT3", "INT4", "INT8", "INTEGER", "INTERVAL", "INTO", "IS", "ITERATE", "JOIN", "KEY", "KEYS", "KILL", "LEADING", "LEAVE", "LEFT", "LIKE", "LIMIT", "LINEAR", "LINES", "LOAD", "LOCALTIME", "LOCALTIMESTAMP", - "LOCK", "LONG", "LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY", "MATCH", "MEDIUMBLOB", - "MEDIUMINT", "MEDIUMTEXT", "MIDDLEINT", "MINUTE_MICROSECOND", "MINUTE_SECOND", "MOD", - "MODIFIES", "NATURAL", "NOT", "NO_WRITE_TO_BINLOG", "NULL", "NUMERIC", "ON", "OPTIMIZE", - "OPTION", "OPTIONALLY", "OR", "ORDER", "OUT", "OUTER", "OUTFILE", "PRECISION", "PRIMARY", - "PROCEDURE", "PURGE", "RANGE", "READ", "READS", "READ_ONLY", "READ_WRITE", "REAL", - "REFERENCES", "REGEXP", "RELEASE", "RENAME", "REPEAT", "REPLACE", "REQUIRE", "RESTRICT", - "RETURN", "REVOKE", "RIGHT", "RLIKE", "SCHEMA", "SCHEMAS", "SECOND_MICROSECOND", "SELECT", - "SENSITIVE", "SEPARATOR", "SET", "SHOW", "SMALLINT", "SPATIAL", "SPECIFIC", "SQL", - "SQLEXCEPTION", "SQLSTATE", "SQLWARNING", "SQL_BIG_RESULT", "SQL_CALC_FOUND_ROWS", - "SQL_SMALL_RESULT", "SSL", "STARTING", "STRAIGHT_JOIN", "TABLE", "TERMINATED", "THEN", - "TINYBLOB", "TINYINT", "TINYTEXT", "TO", "TRAILING", "TRIGGER", "TRUE", "UNDO", "UNION", - "UNIQUE", "UNLOCK", "UNSIGNED", "UPDATE", "USAGE", "USE", "USING", "UTC_DATE", "UTC_TIME", + "LOCK", "LONG", "LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY", "MANUAL", "MATCH", + "MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "MIDDLEINT", "MINUTE_MICROSECOND", + "MINUTE_SECOND", "MOD", "MODIFIES", "NATURAL", "NOT", "NO_WRITE_TO_BINLOG", "NULL", + "NUMERIC", "ON", "OPTIMIZE", "OPTION", "OPTIONALLY", "OR", "ORDER", "OUT", "OUTER", + "OUTFILE", "PARALLEL", "PRECISION", "PRIMARY", "PROCEDURE", "PURGE", "QUALIFY", "RANGE", + "READ", "READS", "READ_ONLY", "READ_WRITE", "REAL", "REFERENCES", "REGEXP", "RELEASE", + "RENAME", "REPEAT", "REPLACE", "REQUIRE", "RESTRICT", "RETURN", "REVOKE", "RIGHT", + "RLIKE", "SCHEMA", "SCHEMAS", "SECOND_MICROSECOND", "SELECT", "SENSITIVE", "SEPARATOR", + "SET", "SHOW", "SMALLINT", "SPATIAL", "SPECIFIC", "SQL", "SQLEXCEPTION", "SQLSTATE", + "SQLWARNING", "SQL_BIG_RESULT", "SQL_CALC_FOUND_ROWS", "SQL_SMALL_RESULT", "SSL", + "STARTING", "STRAIGHT_JOIN", "TABLE", "TABLESAMPLE", "TERMINATED", "THEN", "TINYBLOB", + "TINYINT", "TINYTEXT", "TO", "TRAILING", "TRIGGER", "TRUE", "UNDO", "UNION", "UNIQUE", + "UNLOCK", "UNSIGNED", "UPDATE", "USAGE", "USE", "USING", "UTC_DATE", "UTC_TIME", "UTC_TIMESTAMP", "VALUES", "VARBINARY", "VARCHAR", "VARCHARACTER", "VARYING", "WHEN", "WHERE", "WHILE", "WITH", "WRITE", "X509", "XOR", "YEAR_MONTH", "ZEROFILL"}; String[] sql92Keywords = new String[]{"ABSOLUTE", "EXEC", "OVERLAPS", "ACTION", "EXECUTE", diff --git a/java/jdbc/src/main/java/io/vitess/jdbc/VitessParameterMetaData.java b/java/jdbc/src/main/java/io/vitess/jdbc/VitessParameterMetaData.java index 8bb880e3749..e556ba7ac37 100644 --- a/java/jdbc/src/main/java/io/vitess/jdbc/VitessParameterMetaData.java +++ b/java/jdbc/src/main/java/io/vitess/jdbc/VitessParameterMetaData.java @@ -25,7 +25,7 @@ public class VitessParameterMetaData implements ParameterMetaData { private final int parameterCount; /** - * This implementation (and defaults below) is equivalent to mysql-connector-java's "simple" + * This implementation (and defaults below) is equivalent to mysql-connector-j's "simple" * (non-server) statement metadata */ VitessParameterMetaData(int count) { diff --git a/java/jdbc/src/main/java/io/vitess/jdbc/VitessPreparedStatement.java b/java/jdbc/src/main/java/io/vitess/jdbc/VitessPreparedStatement.java index 550b5180e11..e97b2d151bb 100644 --- a/java/jdbc/src/main/java/io/vitess/jdbc/VitessPreparedStatement.java +++ b/java/jdbc/src/main/java/io/vitess/jdbc/VitessPreparedStatement.java @@ -426,7 +426,7 @@ public ParameterMetaData getParameterMetaData() throws SQLException { } /** - * This function was ported from mysql-connector-java ParseInfo object and greatly simplified to + * This function was ported from mysql-connector-j ParseInfo object and greatly simplified to * just the parts for counting parameters */ private int calculateParameterCount() throws SQLException { diff --git a/java/jdbc/src/main/java/io/vitess/util/charset/CharsetMapping.java b/java/jdbc/src/main/java/io/vitess/util/charset/CharsetMapping.java index 343ae0e90eb..8b32e2aab67 100644 --- a/java/jdbc/src/main/java/io/vitess/util/charset/CharsetMapping.java +++ b/java/jdbc/src/main/java/io/vitess/util/charset/CharsetMapping.java @@ -24,7 +24,7 @@ import java.util.Map; /** - * These classes were pulled from mysql-connector-java and simplified to just the parts supporting + * These classes were pulled from mysql-connector-j and simplified to just the parts supporting * the statically available charsets */ public class CharsetMapping { diff --git a/java/jdbc/src/main/java/io/vitess/util/charset/Collation.java b/java/jdbc/src/main/java/io/vitess/util/charset/Collation.java index 31548686655..7bd24d10f2a 100644 --- a/java/jdbc/src/main/java/io/vitess/util/charset/Collation.java +++ b/java/jdbc/src/main/java/io/vitess/util/charset/Collation.java @@ -17,7 +17,7 @@ package io.vitess.util.charset; /** - * These classes were pulled from mysql-connector-java and simplified to just the parts supporting + * These classes were pulled from mysql-connector-j and simplified to just the parts supporting * the statically available charsets */ class Collation { diff --git a/java/jdbc/src/main/java/io/vitess/util/charset/MysqlCharset.java b/java/jdbc/src/main/java/io/vitess/util/charset/MysqlCharset.java index fad94cb8dcb..6691e1cb4b4 100644 --- a/java/jdbc/src/main/java/io/vitess/util/charset/MysqlCharset.java +++ b/java/jdbc/src/main/java/io/vitess/util/charset/MysqlCharset.java @@ -23,7 +23,7 @@ import java.util.Set; /** - * These classes were pulled from mysql-connector-java and simplified to just the parts supporting + * These classes were pulled from mysql-connector-j and simplified to just the parts supporting * the statically available charsets */ class MysqlCharset { diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java index 26ad5fd11b3..d02dd416d05 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java @@ -28,15 +28,7 @@ import org.junit.Assert; import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.mockito.internal.verification.VerificationModeFactory; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -@PrepareForTest(FieldWithMetadata.class) -@RunWith(PowerMockRunner.class) + public class FieldWithMetadataTest extends BaseTest { @Test @@ -284,7 +276,8 @@ public void testNumericAndDateTimeEncoding() throws SQLException { Query.Type.HEXVAL, Query.Type.HEXNUM, Query.Type.BITNUM, - Query.Type.RAW + Query.Type.RAW, + Query.Type.ROW_TUPLE ); @Test @@ -491,92 +484,6 @@ public void testToString() throws SQLException { Assert.assertEquals(result, field.toString()); } - public void testCollations() throws Exception { - VitessConnection conn = getVitessConnection(); - - Query.Field raw = Query.Field.newBuilder().setTable("foo").setType(Query.Type.CHAR) - .setName("foo").setOrgName("foo").setCharset(33).build(); - - FieldWithMetadata fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - String first = fieldWithMetadata.getCollation(); - String second = fieldWithMetadata.getCollation(); - - Assert.assertEquals("utf8_general_ci", first); - Assert.assertEquals("cached response is same as first", first, second); - - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(1)) - .invoke("getCollationIndex"); - - try { - raw = raw.toBuilder() - // value chosen because it's obviously out of bounds for the underlying array - .setCharset(Integer.MAX_VALUE).build(); - - fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - fieldWithMetadata.getCollation(); - Assert.fail("Should have received an array index out of bounds because " - + "charset/collationIndex of Int.MAX is well above size of charset array"); - } catch (SQLException e) { - if (e.getCause() instanceof ArrayIndexOutOfBoundsException) { - Assert.assertEquals("CollationIndex '" + Integer.MAX_VALUE + "' out of bounds for " - + "collationName lookup, should be within 0 and " - + CharsetMapping.COLLATION_INDEX_TO_COLLATION_NAME.length, e.getMessage()); - } else { - // just rethrow so we fail that way - throw e; - } - } - - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(1)) - .invoke("getCollationIndex"); - //Mockito.verify(fieldWithMetadata, Mockito.times(1)).getCollationIndex(); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - Assert.assertEquals("null response when not including all fields", null, - fieldWithMetadata.getCollation()); - - // We should not call this at all, because we're short circuiting due to included fields - //Mockito.verify(fieldWithMetadata, Mockito.never()).getCollationIndex(); - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(0)) - .invoke("getCollationIndex"); - } - - @Test - public void testMaxBytesPerChar() throws Exception { - VitessConnection conn = PowerMockito.spy(getVitessConnection()); - - Query.Field raw = Query.Field.newBuilder().setTable("foo").setType(Query.Type.CHAR) - .setName("foo").setOrgName("foo").setCharset(33).build(); - - FieldWithMetadata fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - - int first = fieldWithMetadata.getMaxBytesPerCharacter(); - int second = fieldWithMetadata.getMaxBytesPerCharacter(); - - Assert.assertEquals("cached response is same as first", first, second); - // We called getMaxBytesPerCharacter 2 times above, but should only have made 1 call to - // fieldWithMetadata.getMaxBytesPerChar: - // first - call conn - // second - return cached - Mockito.verify(fieldWithMetadata, VerificationModeFactory.times(1)) - .getMaxBytesPerChar(33, "UTF-8"); - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(1)) - .invoke("getCollationIndex"); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - Assert.assertEquals("0 return value when not including all fields", 0, - fieldWithMetadata.getMaxBytesPerCharacter()); - - // We should not call this function because we short circuited due to not including all fields. - Mockito.verify(fieldWithMetadata, VerificationModeFactory.times(0)) - .getMaxBytesPerChar(33, "UTF-8"); - // Should not be called at all, because it's new for just this test - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(0)) - .invoke("getCollationIndex"); - } - @Test public void testGetEncodingForIndex() throws SQLException { Query.Field raw = Query.Field.newBuilder().setTable("foo").setType(Query.Type.CHAR) diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessConnectionTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessConnectionTest.java index 415790ed3f4..e10c97c8636 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessConnectionTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/VitessConnectionTest.java @@ -40,15 +40,11 @@ import java.util.Properties; import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.modules.junit4.PowerMockRunner; /** * Created by harshit.gangal on 19/01/16. */ -@RunWith(PowerMockRunner.class) public class VitessConnectionTest extends BaseTest { @Test @@ -118,13 +114,13 @@ public void testDefaultSetAutoCommitForClose() throws SQLException { @Test public void testCommit() throws Exception { - VTSession mockSession = PowerMockito.mock(VTSession.class); + VTSession mockSession = Mockito.mock(VTSession.class); VitessConnection vitessConnection = getVitessConnection(); Field privateVTSessionField = VitessConnection.class.getDeclaredField("vtSession"); privateVTSessionField.setAccessible(true); privateVTSessionField.set(vitessConnection, mockSession); - PowerMockito.when(mockSession.isInTransaction()).thenReturn(false); - PowerMockito.when(mockSession.isAutoCommit()).thenReturn(false); + Mockito.when(mockSession.isInTransaction()).thenReturn(false); + Mockito.when(mockSession.isAutoCommit()).thenReturn(false); vitessConnection.commit(); } @@ -159,13 +155,13 @@ public void testClosed() throws SQLException { @Test(expected = SQLException.class) public void testClosedForException() throws Exception { - VTSession mockSession = PowerMockito.mock(VTSession.class); + VTSession mockSession = Mockito.mock(VTSession.class); VitessConnection vitessConnection = getVitessConnection(); Field privateVTSessionField = VitessConnection.class.getDeclaredField("vtSession"); privateVTSessionField.setAccessible(true); privateVTSessionField.set(vitessConnection, mockSession); - PowerMockito.when(mockSession.isInTransaction()).thenReturn(true); - PowerMockito.when(mockSession.isAutoCommit()).thenReturn(true); + Mockito.when(mockSession.isInTransaction()).thenReturn(true); + Mockito.when(mockSession.isAutoCommit()).thenReturn(true); vitessConnection.close(); } diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessDatabaseMetadataTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessDatabaseMetadataTest.java index 92d5cfede9b..e1e50e8a6e6 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessDatabaseMetadataTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/VitessDatabaseMetadataTest.java @@ -19,37 +19,26 @@ import com.google.common.base.Charsets; import com.google.common.io.CharStreams; import com.google.protobuf.ByteString; - import io.vitess.client.cursor.Cursor; import io.vitess.client.cursor.SimpleCursor; import io.vitess.proto.Query; import io.vitess.util.Constants; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.sql.Types; +import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.Scanner; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - /** * Created by ashudeep.sharma on 08/03/16. */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({VitessMySQLDatabaseMetadata.class, VitessConnection.class}) public class VitessDatabaseMetadataTest extends BaseTest { private ResultSet resultSet; @@ -860,19 +849,19 @@ public void autoCommitFailureClosesAllResultSetsTest() throws SQLException { @Test public void getUrlTest() throws SQLException { String connectionUrl = "jdbc:vitess://://"; - VitessJDBCUrl mockUrl = PowerMockito.mock(VitessJDBCUrl.class); - PowerMockito.when(mockUrl.getUrl()).thenReturn(connectionUrl); + VitessJDBCUrl mockUrl = Mockito.mock(VitessJDBCUrl.class); + Mockito.when(mockUrl.getUrl()).thenReturn(connectionUrl); - VitessConnection mockConn = PowerMockito.mock(VitessConnection.class); - PowerMockito.when(mockConn.getUrl()).thenReturn(mockUrl); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + Mockito.when(mockConn.getUrl()).thenReturn(mockUrl); Assert.assertEquals(connectionUrl, mockConn.getUrl().getUrl()); } @Test public void isReadOnlyTest() throws SQLException { - VitessConnection mockConn = PowerMockito.mock(VitessConnection.class); - PowerMockito.when(mockConn.isReadOnly()).thenReturn(false); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + Mockito.when(mockConn.isReadOnly()).thenReturn(false); Assert.assertEquals(false, mockConn.isReadOnly()); } @@ -1022,74 +1011,6 @@ public void supportsStatementPooling() throws SQLException { Assert.assertEquals(false, vitessMariaDBDatabaseMetadata.supportsStatementPooling()); } - @Test - public void getCatalogsTest() throws SQLException, Exception { - String sql = "SHOW DATABASES"; - Cursor mockedCursor = new SimpleCursor(Query.QueryResult.newBuilder().addFields( - Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.VARCHAR).build()).addRows( - Query.Row.newBuilder().addLengths("vitessDB".length()) - .setValues(ByteString.copyFromUtf8("vitessDB"))).addRows( - Query.Row.newBuilder().addLengths("sampleDB".length()) - .setValues(ByteString.copyFromUtf8("sampleDB"))).addRows( - Query.Row.newBuilder().addLengths("testDB".length()) - .setValues(ByteString.copyFromUtf8("testDB"))).addRows( - Query.Row.newBuilder().addLengths("dummyDB".length()) - .setValues(ByteString.copyFromUtf8("dummyDB"))).build()); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - ResultSet resultSet = vitessDatabaseMetaData.getCatalogs(); - ArrayList resultSetList = new ArrayList(); - while (resultSet.next()) { - resultSetList.add(resultSet.getString(1)); - } - Assert.assertEquals("dummyDB", resultSetList.get(0)); - Assert.assertEquals("sampleDB", resultSetList.get(1)); - Assert.assertEquals("testDB", resultSetList.get(2)); - Assert.assertEquals("vitessDB", resultSetList.get(3)); - } - - @Test - public void getTablesTest() throws SQLException, Exception { - - String sql = "SHOW FULL TABLES FROM `vt` LIKE '%'"; - Cursor mockedCursor = getTablesCursor(); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata( - getVitessConnection()); - ResultSet actualResultSet = vitessDatabaseMetaData.getTables("vt", null, null, null); - ResultSet expectedResultSet = new VitessResultSet(mockedCursor); - - assertResultSetEquals(actualResultSet, expectedResultSet); - } - - @Test - public void getTablesProperResultTypeTest() throws SQLException, Exception { - - String sql = "SHOW FULL TABLES FROM `vt` LIKE '%'"; - Cursor mockedCursor = getTablesCursor(); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata( - getVitessConnection()); - ResultSet actualResultSet = vitessDatabaseMetaData.getTables("vt", null, null, null); - actualResultSet.next(); - Assert.assertEquals(String.class, actualResultSet.getObject("TABLE_CAT").getClass()); - } - private Cursor getTablesCursor() throws Exception { return new SimpleCursor(Query.QueryResult.newBuilder() .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.VARCHAR)) @@ -1131,231 +1052,6 @@ private Cursor getTablesCursor() throws Exception { .build()); } - @Test - public void getColumnsTest() throws SQLException, Exception { - - String sql = "SHOW FULL COLUMNS FROM `sampleTable1` FROM `TestDB1` LIKE '%'"; - Cursor mockedTablecursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_SCHEM").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_NAME").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_TYPE").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("REMARKS").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE_CAT").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE_SCHEM").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE_NAME").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("SELF_REFERENCING_COL_NAME") - .setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("REF_GENERATION").setType(Query.Type.VARCHAR)) - .addRows(Query.Row.newBuilder().addLengths("TestDB1".length()).addLengths("".length()) - .addLengths("sampleTable1".length()).addLengths("TABLE".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8("TestDB1sampleTable1TABLE"))).build()); - - Cursor actualCursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("Field").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Type").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Collation").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Null").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Key").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Default").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Extra").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Privileges").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Comment").setType(Query.Type.VARCHAR)).addRows( - Query.Row.newBuilder().addLengths("shipmentid".length()).addLengths("bigint".length()) - .addLengths("NULL".length()).addLengths("NO".length()).addLengths("PRI".length()) - .addLengths("NULL".length()).addLengths("".length()) - .addLengths("select,insert,update,references".length()).addLengths("".length()) - .setValues(ByteString - .copyFromUtf8("shipmentidbigintNULLNOPRINULLselect,insert,update,references"))) - .addRows( - Query.Row.newBuilder().addLengths("trackingid".length()).addLengths("varchar".length()) - .addLengths("utf8_general_ci".length()).addLengths("YES".length()) - .addLengths("".length()).addLengths("NULL".length()).addLengths("".length()) - .addLengths("select,insert,update,references".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8( - "trackingidvarcharutf8_general_ciYESNULLselect,insert,update,references"))) - .build()); - Cursor expectedCursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_SCHEM").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("COLUMN_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("DATA_TYPE").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("TYPE_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("COLUMN_SIZE").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("BUFFER_LENGTH").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("DECIMAL_DIGITS").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("NUM_PREC_RADIX").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("NULLABLE").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("REMARKS").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("COLUMN_DEF").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SQL_DATA_TYPE").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("SQL_DATETIME_SUB").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("CHAR_OCTET_LENGTH").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("ORDINAL_POSITION").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("ISNULLABLE").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SCOPE_CATALOG").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SCOPE_SCHEMA").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SCOPE_TABLE").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SOURCE_DATA_TYPE").setType(Query.Type.INT16)) - .addFields(Query.Field.newBuilder().setName("IS_AUTOINCREMENT").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("IS_GENERATEDCOLUMN").setType(Query.Type.CHAR)) - .addRows(Query.Row.newBuilder().addLengths("TestDB1".length()).addLengths(-1) - .addLengths("sampleTable1".length()).addLengths("shipmentid".length()) - .addLengths("-5".length()).addLengths("BIGINT".length()).addLengths("19".length()) - .addLengths("65535".length()).addLengths("0".length()).addLengths("10".length()) - .addLengths("0".length()).addLengths("Comment".length()).addLengths("NULL".length()) - .addLengths("0".length()).addLengths("0".length()).addLengths("0".length()) - .addLengths("1".length()).addLengths("NO".length()).addLengths(-1).addLengths(-1) - .addLengths(-1).addLengths(-1).addLengths("NO".length()).addLengths("NO".length()) - .setValues(ByteString.copyFromUtf8( - "TestDB1sampleTable1shipmentid-5BIGINT19655350100CommentNULL0001NONONO"))).addRows( - Query.Row.newBuilder().addLengths("TestDB1".length()).addLengths(-1) - .addLengths("sampleTable1".length()).addLengths("trackingid".length()) - .addLengths("12".length()).addLengths("VARCHAR".length()).addLengths("255".length()) - .addLengths("65535".length()).addLengths(-1).addLengths("10".length()) - .addLengths("1".length()).addLengths("Comment".length()).addLengths("NULL".length()) - .addLengths("0".length()).addLengths("0".length()).addLengths("255".length()) - .addLengths("2".length()).addLengths("YES".length()).addLengths(-1).addLengths(-1) - .addLengths(-1).addLengths(-1).addLengths("NO".length()).addLengths("NO".length()) - .setValues(ByteString.copyFromUtf8( - "TestDB1sampleTable1trackingid12VARCHAR25565535101CommentNULL002552YESNONO"))) - .build()); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(actualCursor)); - - VitessDatabaseMetaData vitessDatabaseMetaData = PowerMockito - .mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.doCallRealMethod().when(vitessDatabaseMetaData) - .getColumns("TestDB1", null, null, null); - PowerMockito.when(vitessDatabaseMetaData.getTables("TestDB1", null, "%", new String[0])) - .thenReturn(new VitessResultSet(mockedTablecursor)); - ResultSet actualResultSet = vitessDatabaseMetaData.getColumns("TestDB1", null, null, null); - ResultSet expectedResultSet = new VitessResultSet(expectedCursor); - - assertResultSetEquals(actualResultSet, expectedResultSet); - } - - @Test - public void getPrimaryKeysTest() throws SQLException, Exception { - - String sql = "SHOW KEYS FROM `shipment` FROM `vt`"; - Cursor mockedCursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Non_unique").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Key_name").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Seq_in_index").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Column_name").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Collation").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Cardinality").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Sub_part").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Packed").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Null").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Index_type").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Comment").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Index_comment").setType(Query.Type.VARCHAR)) - .addRows(Query.Row.newBuilder().addLengths("shipment".length()).addLengths("0".length()) - .addLengths("PRIMARY".length()).addLengths("1".length()) - .addLengths("shipmentid".length()).addLengths("A".length()) - .addLengths("434880".length()).addLengths(-1).addLengths(-1).addLengths("".length()) - .addLengths("BTREE".length()).addLengths("".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8("shipment0PRIMARY1shipmentidA434880BTREE"))) - .build()); - Cursor expectedcursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_SCHEM").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("COLUMN_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("KEY_SEQ").setType(Query.Type.INT16)) - .addFields(Query.Field.newBuilder().setName("PK_NAME").setType(Query.Type.CHAR)).addRows( - Query.Row.newBuilder().addLengths("vt".length()).addLengths(-1) - .addLengths("shipment".length()).addLengths("shipmentid".length()) - .addLengths("1".length()).addLengths("PRIMARY".length()) - .setValues(ByteString.copyFromUtf8("vtshipmentshipmentid1PRIMARY"))).build()); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - VitessDatabaseMetaData vitessDatabaseMetaData = PowerMockito - .mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.doCallRealMethod().when(vitessDatabaseMetaData) - .getPrimaryKeys("vt", null, "shipment"); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - ResultSet expectedResultSet = vitessDatabaseMetaData.getPrimaryKeys("vt", null, "shipment"); - ResultSet actualResultSet = new VitessResultSet(expectedcursor); - - assertResultSetEquals(actualResultSet, expectedResultSet); - } - - @Test - public void getIndexInfoTest() throws SQLException, Exception { - - String sql = "SHOW INDEX FROM `shipment` FROM `vt`"; - Cursor mockedCursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("Table").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Non_unique").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Key_name").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Seq_in_index").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Column_name").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Collation").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Cardinality").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Sub_part").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Packed").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Null").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Index_type").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Comment").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Index_comment").setType(Query.Type.VARCHAR)) - .addRows(Query.Row.newBuilder().addLengths("shipment".length()).addLengths("0".length()) - .addLengths("PRIMARY".length()).addLengths("1".length()) - .addLengths("shipmentid".length()).addLengths("A".length()) - .addLengths("434880".length()).addLengths(-1).addLengths(-1).addLengths("".length()) - .addLengths("BTREE".length()).addLengths("".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8("shipment0PRIMARY1shipmentidA434880BTREE"))) - .build()); - - Cursor expectedcursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_SCHEM").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("Non_unique").setType(Query.Type.BIT)) - .addFields(Query.Field.newBuilder().setName("INDEX_QUALIFIER").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("INDEX_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE").setType(Query.Type.INT16)) - .addFields(Query.Field.newBuilder().setName("ORDINAL_POSITION").setType(Query.Type.INT16)) - .addFields(Query.Field.newBuilder().setName("COLUMN_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("ASC_OR_DESC").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("CARDINALITY").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("PAGES").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("FILTER_CONDITION").setType(Query.Type.CHAR)) - .addRows(Query.Row.newBuilder().addLengths("vt".length()).addLengths(-1) - .addLengths("shipment".length()).addLengths("false".length()).addLengths("".length()) - .addLengths("PRIMARY".length()).addLengths("3".length()).addLengths("1".length()) - .addLengths("shipmentid".length()).addLengths("A".length()) - .addLengths("434880".length()).addLengths("0".length()).addLengths(-1) - .setValues(ByteString.copyFromUtf8("vtshipmentfalsePRIMARY31shipmentidA4348800"))) - .build()); - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - VitessDatabaseMetaData vitessDatabaseMetaData = PowerMockito - .mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.doCallRealMethod().when(vitessDatabaseMetaData) - .getIndexInfo("vt", null, "shipment", true, false); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - ResultSet actualResultSet = vitessDatabaseMetaData - .getIndexInfo("vt", null, "shipment", true, false); - ResultSet expectedResultSet = new VitessResultSet(expectedcursor); - - assertResultSetEquals(actualResultSet, expectedResultSet); - } - private void assertResultSetEquals(ResultSet actualResultSet, ResultSet expectedResultSet) throws SQLException { ResultSetMetaData actualResultSetMetadata = actualResultSet.getMetaData(); @@ -1440,137 +1136,6 @@ public void getUserNameTest() { } } - @Test - public void testCaseSensitivityIdentifierFuncsMySql() throws Exception { - assertCaseSensitivityForDatabaseType(false); - } - - @Test - public void testCaseSensitivityIdentifierFuncsMariaDb() throws Exception { - assertCaseSensitivityForDatabaseType(true); - } - - private void assertCaseSensitivityForDatabaseType(boolean useMariaDb) throws Exception { - VitessConnection connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", - null); - mockStatementForLowercaseTablesValue("0", useMariaDb); - Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseQuotedIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseQuotedIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseQuotedIdentifiers()); - connection.close(); - - connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", null); - mockStatementForLowercaseTablesValue("1", useMariaDb); - Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseQuotedIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesLowerCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesMixedCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesLowerCaseQuotedIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesMixedCaseQuotedIdentifiers()); - connection.close(); - - connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", null); - mockStatementForLowercaseTablesValue("2", useMariaDb); - Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseQuotedIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseQuotedIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseQuotedIdentifiers()); - connection.close(); - - connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", null); - mockStatementForLowercaseTablesValue("something random", useMariaDb); - Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseQuotedIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseQuotedIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseQuotedIdentifiers()); - connection.close(); - } - - private void mockStatementForLowercaseTablesValue(String lcTablesValue, boolean useMariaDb) - throws Exception { - String sql = "SHOW VARIABLES WHERE VARIABLE_NAME IN (\'tx_isolation\',\'INNODB_VERSION\', " - + "\'lower_case_table_names\')"; - String versionName = "innodb_version"; - String versionValue = "5.7.16-10"; - if (useMariaDb) { - versionValue = versionValue + "-mariadb"; - } - String txIsoName = "tx_isolation"; - String txIsoValue = "REPEATABLE-READ"; - String lcTablesName = "lower_case_table_names"; - - Cursor mockedCursor = new SimpleCursor(Query.QueryResult.newBuilder().addFields( - Query.Field.newBuilder().setName("Variable_name").setType(Query.Type.VARCHAR).build()) - .addFields(Query.Field.newBuilder().setName("Value").setType(Query.Type.VARCHAR).build()) - .addRows(Query.Row.newBuilder().addLengths(versionName.length()) - .addLengths(versionValue.length()) - .setValues(ByteString.copyFromUtf8(versionName + versionValue))).addRows( - Query.Row.newBuilder().addLengths(txIsoName.length()).addLengths(txIsoValue.length()) - .setValues(ByteString.copyFromUtf8(txIsoName + txIsoValue))).addRows( - Query.Row.newBuilder().addLengths(lcTablesName.length()) - .addLengths(lcTablesValue.length()) - .setValues(ByteString.copyFromUtf8(lcTablesName + lcTablesValue))).build()); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - } - - /** - * Tests that we're properly stitching together the results of SHOW CREATE TABLE. See {@link - * #extractForeignKeyForTableTest()} for more thorough testing of the actual parsing - */ - @Test - public void getImportedKeysTest() throws Exception { - try (InputStream resourceAsStream = this.getClass() - .getResourceAsStream("/getImportedKeysTestCase.sql")) { - String table = "testA"; - String showCreate = CharStreams - .toString(new InputStreamReader(resourceAsStream, Charsets.UTF_8)); - - Query.QueryResult queryResult = Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("Table").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("Create Table").setType(Query.Type.CHAR)) - .addRows(Query.Row.newBuilder().addLengths(table.length()).addLengths(showCreate.length()) - .setValues(ByteString.copyFromUtf8(table + showCreate))).build(); - - String sql = "SHOW CREATE TABLE `testA`"; - VitessConnection vitessConnection = new VitessConnection( - "jdbc:vitess://username@ip1:port1/keyspace", null); - VitessStatement vitessStatement = PowerMockito.spy(new VitessStatement(vitessConnection)); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.doReturn(new VitessResultSet(new SimpleCursor(queryResult), vitessStatement)) - .when(vitessStatement).executeQuery(sql); - - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata( - vitessConnection); - ResultSet importedKeys = vitessDatabaseMetaData.getImportedKeys("test", "test", "testA"); - importedKeys.next(); - Assert.assertEquals("test", importedKeys.getString("PKTABLE_CAT")); - Assert.assertEquals(null, importedKeys.getString("PKTABLE_SCHEM")); - Assert.assertEquals("fTable", importedKeys.getString("PKTABLE_NAME")); - Assert.assertEquals("id", importedKeys.getString("PKCOLUMN_NAME")); - Assert.assertEquals("test", importedKeys.getString("FKTABLE_CAT")); - Assert.assertEquals(null, importedKeys.getString("FKTABLE_SCHEM")); - Assert.assertEquals("testA", importedKeys.getString("FKTABLE_NAME")); - Assert.assertEquals("fIdOne", importedKeys.getString("FKCOLUMN_NAME")); - Assert.assertEquals(1, importedKeys.getInt("KEY_SEQ")); - Assert.assertEquals(3, importedKeys.getInt("UPDATE_RULE")); - Assert.assertEquals(3, importedKeys.getInt("DELETE_RULE")); - Assert.assertEquals("fk_testA", importedKeys.getString("FK_NAME")); - Assert.assertEquals(null, importedKeys.getString("PK_NAME")); - Assert.assertEquals(7, importedKeys.getInt("DEFERRABILITY")); - } - } - /** * Tests parsing all the various outputs of SHOW CREATE TABLE for the foreign key constraints. */ diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessParameterMetaDataTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessParameterMetaDataTest.java index 8916063ffaf..890212d5071 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessParameterMetaDataTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/VitessParameterMetaDataTest.java @@ -16,20 +16,13 @@ package io.vitess.jdbc; +import org.junit.Assert; +import org.junit.Test; + import java.sql.ParameterMetaData; import java.sql.SQLException; import java.sql.Types; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.internal.verification.VerificationModeFactory; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -@RunWith(PowerMockRunner.class) -@PrepareForTest(VitessParameterMetaData.class) public class VitessParameterMetaDataTest { @Test @@ -70,22 +63,6 @@ public void testOutOfBoundsValidation() { } } - @Test - public void testOutOfBoundCoverage() throws Exception { - int param = 2; - VitessParameterMetaData metaData = PowerMockito.spy(new VitessParameterMetaData(5)); - - metaData.getParameterType(param); - metaData.getPrecision(param); - metaData.getScale(param); - metaData.getParameterClassName(param); - metaData.getParameterTypeName(param); - metaData.isSigned(param); - - PowerMockito.verifyPrivate(metaData, VerificationModeFactory.times(6)) - .invoke("checkBounds", param); - } - @Test(expected = SQLException.class) public void testNullableNotAvailable() throws SQLException { VitessParameterMetaData metaData = new VitessParameterMetaData(5); diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java index c5a9b4cbd33..2ebadf371ec 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java @@ -18,12 +18,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.nullable; -import static org.mockito.Matchers.anyMap; -import static org.mockito.Matchers.anyString; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; import com.google.common.collect.ImmutableMap; @@ -59,19 +54,13 @@ import org.junit.Assert; import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.Matchers; import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; /** * Created by harshit.gangal on 09/02/16. */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({VTGateConnection.class, Vtrpc.RPCError.class}) public class VitessPreparedStatementTest { private String sqlSelect = "select 1 from test_table"; @@ -81,7 +70,7 @@ public class VitessPreparedStatementTest { @Test public void testStatementExecute() { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessPreparedStatement preparedStatement; try { preparedStatement = new VitessPreparedStatement(mockConn, sqlShow); @@ -110,17 +99,17 @@ public void testStatementExecute() { @Test public void testExecuteQuery() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))). + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))). thenReturn(mockSqlFutureCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); - when(mockConn.isSimpleExecute()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(true); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); VitessPreparedStatement preparedStatement; try { @@ -156,7 +145,7 @@ public void testExecuteQuery() throws SQLException { try { //when returned cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(null); preparedStatement.executeQuery(); fail("Should have thrown exception for cursor null"); } catch (SQLException ex) { @@ -170,19 +159,19 @@ public void testExecuteQuery() throws SQLException { @Test public void testExecuteQueryWithStream() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockCursor); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.STREAM); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.STREAM); VitessPreparedStatement preparedStatement; try { @@ -218,7 +207,7 @@ public void testExecuteQueryWithStream() throws SQLException { try { //when returned cursor is null - when(mockVtGateConn + Mockito.when(mockVtGateConn .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(null); preparedStatement.executeQuery(); @@ -235,17 +224,17 @@ public void testExecuteQueryWithStream() throws SQLException { @Test public void testExecuteUpdate() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - List fieldList = mock(ArrayList.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + List fieldList = Mockito.mock(ArrayList.class); + + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); VitessPreparedStatement preparedStatement; try { @@ -257,14 +246,14 @@ public void testExecuteUpdate() throws SQLException { assertEquals(0, updateCount); //tx is null & autoCommit is true - when(mockConn.getAutoCommit()).thenReturn(true); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); preparedStatement = new VitessPreparedStatement(mockConn, sqlUpdate); updateCount = preparedStatement.executeUpdate(); assertEquals(0, updateCount); //cursor fields is not null - when(mockCursor.getFields()).thenReturn(fieldList); - when(fieldList.isEmpty()).thenReturn(false); + Mockito.when(mockCursor.getFields()).thenReturn(fieldList); + Mockito.when(fieldList.isEmpty()).thenReturn(false); try { preparedStatement.executeUpdate(); fail("Should have thrown exception for field not null"); @@ -273,7 +262,7 @@ public void testExecuteUpdate() throws SQLException { } //cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(null); try { preparedStatement.executeUpdate(); fail("Should have thrown exception for cursor null"); @@ -282,7 +271,7 @@ public void testExecuteUpdate() throws SQLException { } //read only - when(mockConn.isReadOnly()).thenReturn(true); + Mockito.when(mockConn.isReadOnly()).thenReturn(true); try { preparedStatement.executeUpdate(); fail("Should have thrown exception for read only"); @@ -291,7 +280,7 @@ public void testExecuteUpdate() throws SQLException { } //read only - when(mockConn.isReadOnly()).thenReturn(true); + Mockito.when(mockConn.isReadOnly()).thenReturn(true); try { preparedStatement.executeBatch(); fail("Should have thrown exception for read only"); @@ -306,31 +295,31 @@ public void testExecuteUpdate() throws SQLException { @Test public void testExecute() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - List mockFieldList = PowerMockito.spy(new ArrayList<>()); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + List mockFieldList = Mockito.spy(new ArrayList<>()); + + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); - when(mockConn.isSimpleExecute()).thenReturn(true); + Mockito.when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(true); - when(mockConn.getAutoCommit()).thenReturn(true); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(mockFieldList); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(mockFieldList); VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); try { int fieldSize = 5; - when(mockCursor.getFields()).thenReturn(mockFieldList); - PowerMockito.doReturn(fieldSize).when(mockFieldList).size(); - PowerMockito.doReturn(false).when(mockFieldList).isEmpty(); + Mockito.when(mockCursor.getFields()).thenReturn(mockFieldList); + Mockito.doReturn(fieldSize).when(mockFieldList).size(); + Mockito.doReturn(false).when(mockFieldList).isEmpty(); boolean hasResultSet = preparedStatement.execute(); Assert.assertTrue(hasResultSet); Assert.assertNotNull(preparedStatement.getResultSet()); @@ -341,9 +330,9 @@ public void testExecute() throws SQLException { Assert.assertNotNull(preparedStatement.getResultSet()); int mockUpdateCount = 10; - when(mockCursor.getFields()) + Mockito.when(mockCursor.getFields()) .thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - when(mockCursor.getRowsAffected()).thenReturn((long) mockUpdateCount); + Mockito.when(mockCursor.getRowsAffected()).thenReturn((long) mockUpdateCount); preparedStatement = new VitessPreparedStatement(mockConn, sqlUpdate); hasResultSet = preparedStatement.execute(); Assert.assertFalse(hasResultSet); @@ -351,7 +340,7 @@ public void testExecute() throws SQLException { assertEquals(mockUpdateCount, preparedStatement.getUpdateCount()); //cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(null); try { preparedStatement = new VitessPreparedStatement(mockConn, sqlShow); preparedStatement.execute(); @@ -375,19 +364,19 @@ public void testExecuteFetchSizeAsStreaming() throws SQLException { private void testExecute(int fetchSize, boolean simpleExecute, boolean shouldRunExecute, boolean shouldRunStreamExecute) throws SQLException { - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); - VitessConnection mockConn = mock(VitessConnection.class); - when(mockConn.isSimpleExecute()).thenReturn(simpleExecute); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(simpleExecute); + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockVtGateConn + Mockito.when(mockVtGateConn .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockCursor); @@ -408,32 +397,32 @@ private void testExecute(int fetchSize, boolean simpleExecute, boolean shouldRun @Test public void testGetUpdateCount() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFuture = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFuture = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFuture); - when(mockSqlFuture.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFuture.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect); try { - when(mockCursor.getRowsAffected()).thenReturn(10L); + Mockito.when(mockCursor.getRowsAffected()).thenReturn(10L); int updateCount = preparedStatement.executeUpdate(); assertEquals(10L, updateCount); assertEquals(10L, preparedStatement.getUpdateCount()); // Truncated Update Count - when(mockCursor.getRowsAffected()).thenReturn((long) Integer.MAX_VALUE + 10); + Mockito.when(mockCursor.getRowsAffected()).thenReturn((long) Integer.MAX_VALUE + 10); updateCount = preparedStatement.executeUpdate(); assertEquals(Integer.MAX_VALUE, updateCount); assertEquals(Integer.MAX_VALUE, preparedStatement.getUpdateCount()); - when(mockConn.isSimpleExecute()).thenReturn(true); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(true); preparedStatement.executeQuery(); assertEquals(-1, preparedStatement.getUpdateCount()); @@ -444,7 +433,7 @@ public void testGetUpdateCount() throws SQLException { @Test public void testSetParameters() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); Mockito.when(mockConn.getTreatUtilDateAsTimestamp()).thenReturn(true); VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect); Boolean boolValue = true; @@ -565,7 +554,7 @@ public void testSetParameters() throws Exception { @Test public void testTreatUtilDateAsTimestamp() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect); java.util.Date utilDateValue = new java.util.Date(System.currentTimeMillis()); @@ -593,24 +582,24 @@ public void testTreatUtilDateAsTimestamp() throws Exception { @Test public void testAutoGeneratedKeys() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); try { long expectedFirstGeneratedId = 121; long[] expectedGeneratedIds = {121, 122}; int expectedAffectedRows = 2; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); - when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedAffectedRows)); + Mockito.when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); + Mockito.when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedAffectedRows)); //Executing Insert Statement VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlInsert, @@ -632,7 +621,7 @@ public void testAutoGeneratedKeys() throws SQLException { @Test public void testAddBatch() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessPreparedStatement statement = new VitessPreparedStatement(mockConn, sqlInsert); try { statement.addBatch(this.sqlInsert); @@ -656,7 +645,7 @@ public void testAddBatch() throws SQLException { @Test public void testClearBatch() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessPreparedStatement statement = new VitessPreparedStatement(mockConn, sqlInsert); statement.setString(1, "string1"); statement.addBatch(); @@ -674,25 +663,25 @@ public void testClearBatch() throws SQLException { @Test public void testExecuteBatch() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessPreparedStatement statement = new VitessPreparedStatement(mockConn, sqlInsert); int[] updateCounts = statement.executeBatch(); assertEquals(0, updateCounts.length); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockConn.getAutoCommit()).thenReturn(true); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - when(mockVtGateConn.executeBatch(nullable(Context.class), Matchers.anyList(), Matchers.anyList(), + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + Mockito.when(mockVtGateConn.executeBatch(nullable(Context.class), Matchers.anyList(), Matchers.anyList(), nullable(VTSession.class))).thenReturn(mockSqlFutureCursor); List mockCursorWithErrorList = new ArrayList<>(); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); - CursorWithError mockCursorWithError1 = mock(CursorWithError.class); - when(mockCursorWithError1.getError()).thenReturn(null); - when(mockCursorWithError1.getCursor()).thenReturn(mock(Cursor.class)); + CursorWithError mockCursorWithError1 = Mockito.mock(CursorWithError.class); + Mockito.when(mockCursorWithError1.getError()).thenReturn(null); + Mockito.when(mockCursorWithError1.getCursor()).thenReturn(Mockito.mock(Cursor.class)); mockCursorWithErrorList.add(mockCursorWithError1); statement.setString(1, "string1"); @@ -700,10 +689,10 @@ public void testExecuteBatch() throws SQLException { updateCounts = statement.executeBatch(); assertEquals(1, updateCounts.length); - CursorWithError mockCursorWithError2 = mock(CursorWithError.class); + CursorWithError mockCursorWithError2 = Mockito.mock(CursorWithError.class); Vtrpc.RPCError rpcError = Vtrpc.RPCError.newBuilder() .setMessage("preparedStatement execute batch error").build(); - when(mockCursorWithError2.getError()).thenReturn(rpcError); + Mockito.when(mockCursorWithError2.getError()).thenReturn(rpcError); mockCursorWithErrorList.add(mockCursorWithError2); statement.setString(1, "string1"); statement.addBatch(); @@ -721,7 +710,7 @@ public void testExecuteBatch() throws SQLException { @Test public void testStatementCount() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); Map testCases = ImmutableMap.builder() .put("select * from foo where a = ?", 1).put("select * from foo where a = ? and b = ?", 2) .put("select * from foo where a = ? and b = \"?\"", 1) diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java index a2be875e0d0..bd753d2fcb5 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java @@ -40,18 +40,13 @@ import org.junit.Assert; import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.Matchers; +import org.mockito.Mockito; import org.mockito.internal.verification.VerificationModeFactory; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; /** * Created by harshit.gangal on 19/01/16. */ -@RunWith(PowerMockRunner.class) -@PrepareForTest(VitessResultSet.class) public class VitessResultSetTest extends BaseTest { public Cursor getCursorWithRows() { @@ -635,230 +630,6 @@ public void testEnhancedFieldsFromCursor() throws Exception { assertEquals(cursor.getFields().size(), vitessResultSet.getFields().size()); } - @Test - public void testGetStringUsesEncoding() throws Exception { - VitessConnection conn = getVitessConnection(); - VitessResultSet resultOne = PowerMockito - .spy(new VitessResultSet(getCursorWithRows(), new VitessStatement(conn))); - resultOne.next(); - // test all ways to get to convertBytesToString - - // Verify that we're going through convertBytesToString for column types that return bytes - // (string-like), - // but not for those that return a real object - //resultOne.getString("col21"); // is a string, should go through convert bytes - //resultOne.getString("col13"); // is a datetime, should not - //PowerMockito.verifyPrivate(resultOne, VerificationModeFactory.times(1)) - // .invoke("convertBytesToString", Matchers.any(byte[].class), Matchers.anyString()); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - VitessResultSet resultTwo = PowerMockito - .spy(new VitessResultSet(getCursorWithRows(), new VitessStatement(conn))); - resultTwo.next(); - - // neither of these should go through convertBytesToString, because we didn't include all fields - resultTwo.getString("col21"); - resultTwo.getString("col13"); - PowerMockito.verifyPrivate(resultTwo, VerificationModeFactory.times(0)) - .invoke("convertBytesToString", Matchers.any(byte[].class), Matchers.anyString()); - } - - @Test - public void testGetObjectForBitValues() throws Exception { - VitessConnection conn = getVitessConnection(); - - ByteString.Output value = ByteString.newOutput(); - value.write(new byte[]{1}); - value.write(new byte[]{0}); - value.write(new byte[]{1, 2, 3, 4}); - - Query.QueryResult result = Query.QueryResult.newBuilder().addFields( - Query.Field.newBuilder().setName("col1").setColumnLength(1).setType(Query.Type.BIT)) - .addFields( - Query.Field.newBuilder().setName("col2").setColumnLength(1).setType(Query.Type.BIT)) - .addFields( - Query.Field.newBuilder().setName("col3").setColumnLength(4).setType(Query.Type.BIT)) - .addRows(Query.Row.newBuilder().addLengths(1).addLengths(1).addLengths(4) - .setValues(value.toByteString())).build(); - - VitessResultSet vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - assertEquals(true, vitessResultSet.getObject(1)); - assertEquals(false, vitessResultSet.getObject(2)); - Assert.assertArrayEquals(new byte[]{1, 2, 3, 4}, (byte[]) vitessResultSet.getObject(3)); - - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(3)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - Assert.assertArrayEquals(new byte[]{1}, (byte[]) vitessResultSet.getObject(1)); - Assert.assertArrayEquals(new byte[]{0}, (byte[]) vitessResultSet.getObject(2)); - Assert.assertArrayEquals(new byte[]{1, 2, 3, 4}, (byte[]) vitessResultSet.getObject(3)); - - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(0)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - } - - @Test - public void testGetObjectForVarBinLikeValues() throws Exception { - VitessConnection conn = getVitessConnection(); - - ByteString.Output value = ByteString.newOutput(); - - byte[] binary = new byte[]{1, 2, 3, 4}; - byte[] varbinary = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; - byte[] blob = new byte[MysqlDefs.LENGTH_BLOB]; - for (int i = 0; i < blob.length; i++) { - blob[i] = 1; - } - byte[] fakeGeometry = new byte[]{2, 3, 4}; - - value.write(binary); - value.write(varbinary); - value.write(blob); - value.write(fakeGeometry); - - Query.QueryResult result = Query.QueryResult.newBuilder().addFields( - Query.Field.newBuilder().setName("col1").setColumnLength(4) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary).setType(Query.Type.BINARY) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE)).addFields( - Query.Field.newBuilder().setName("col2").setColumnLength(13) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary).setType(Query.Type.VARBINARY) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE)).addFields( - Query.Field.newBuilder().setName("col3") // should go to LONGVARBINARY due to below settings - .setColumnLength(MysqlDefs.LENGTH_BLOB) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE).setType(Query.Type.BLOB)).addFields( - Query.Field.newBuilder().setName("col4").setType(Query.Type.GEOMETRY) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary).setType(Query.Type.BINARY) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE)).addRows( - Query.Row.newBuilder().addLengths(4).addLengths(13).addLengths(MysqlDefs.LENGTH_BLOB) - .addLengths(3).setValues(value.toByteString())).build(); - - VitessResultSet vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - // All of these types should pass straight through, returning the direct bytes - Assert.assertArrayEquals(binary, (byte[]) vitessResultSet.getObject(1)); - Assert.assertArrayEquals(varbinary, (byte[]) vitessResultSet.getObject(2)); - Assert.assertArrayEquals(blob, (byte[]) vitessResultSet.getObject(3)); - Assert.assertArrayEquals(fakeGeometry, (byte[]) vitessResultSet.getObject(4)); - - // We should still call the function 4 times - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(4)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - // Same as above since this doesn't really do much but pass right through for the varbinary type - Assert.assertArrayEquals(binary, (byte[]) vitessResultSet.getObject(1)); - Assert.assertArrayEquals(varbinary, (byte[]) vitessResultSet.getObject(2)); - Assert.assertArrayEquals(blob, (byte[]) vitessResultSet.getObject(3)); - Assert.assertArrayEquals(fakeGeometry, (byte[]) vitessResultSet.getObject(4)); - - // Never call because not including all - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(0)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - } - - @Test - public void testGetObjectForStringLikeValues() throws Exception { - ByteString.Output value = ByteString.newOutput(); - - String trimmedCharStr = "wasting space"; - String varcharStr = "i have a variable length!"; - String masqueradingBlobStr = "look at me, im a blob"; - String textStr = "an enthralling string of TEXT in some foreign language"; - String jsonStr = "{\"status\": \"ok\"}"; - - int paddedCharColLength = 20; - byte[] trimmedChar = StringUtils.getBytes(trimmedCharStr, "UTF-16"); - byte[] varchar = StringUtils.getBytes(varcharStr, "UTF-8"); - byte[] masqueradingBlob = StringUtils.getBytes(masqueradingBlobStr, "US-ASCII"); - byte[] text = StringUtils.getBytes(textStr, "ISO8859_8"); - byte[] opaqueBinary = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9}; - byte[] json = StringUtils.getBytes(jsonStr, "UTF-8"); - - value.write(trimmedChar); - value.write(varchar); - value.write(opaqueBinary); - value.write(masqueradingBlob); - value.write(text); - value.write(json); - - Query.QueryResult result = Query.QueryResult.newBuilder() - // This tests CHAR - .addFields(Query.Field.newBuilder().setName("col1").setColumnLength(paddedCharColLength) - .setCharset(/* utf-16 collation index from CharsetMapping */ 54) - .setType(Query.Type.CHAR)) - // This tests VARCHAR - .addFields(Query.Field.newBuilder().setName("col2").setColumnLength(varchar.length) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_utf8).setType(Query.Type.VARCHAR)) - // This tests VARCHAR that is an opaque binary - .addFields(Query.Field.newBuilder().setName("col2").setColumnLength(opaqueBinary.length) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE).setType(Query.Type.VARCHAR)) - // This tests LONGVARCHAR - .addFields(Query.Field.newBuilder().setName("col3").setColumnLength(masqueradingBlob.length) - .setCharset(/* us-ascii collation index from CharsetMapping */11) - .setType(Query.Type.BLOB)) - // This tests TEXT, which falls through the default case of the switch - .addFields(Query.Field.newBuilder().setName("col4").setColumnLength(text.length) - .setCharset(/* corresponds to greek, from CharsetMapping */25).setType(Query.Type.TEXT)) - .addFields(Query.Field.newBuilder().setName("col5").setColumnLength(json.length) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_utf8).setType(Query.Type.JSON)) - .addRows(Query.Row.newBuilder().addLengths(trimmedChar.length).addLengths(varchar.length) - .addLengths(opaqueBinary.length).addLengths(masqueradingBlob.length) - .addLengths(text.length).addLengths(json.length).setValues(value.toByteString())) - .build(); - - VitessConnection conn = getVitessConnection(); - VitessResultSet vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - assertEquals(trimmedCharStr, vitessResultSet.getObject(1)); - assertEquals(varcharStr, vitessResultSet.getObject(2)); - Assert.assertArrayEquals(opaqueBinary, (byte[]) vitessResultSet.getObject(3)); - assertEquals(masqueradingBlobStr, vitessResultSet.getObject(4)); - assertEquals(textStr, vitessResultSet.getObject(5)); - assertEquals(jsonStr, vitessResultSet.getObject(6)); - - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(6)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - Assert.assertArrayEquals(trimmedChar, (byte[]) vitessResultSet.getObject(1)); - Assert.assertArrayEquals(varchar, (byte[]) vitessResultSet.getObject(2)); - Assert.assertArrayEquals(opaqueBinary, (byte[]) vitessResultSet.getObject(3)); - Assert.assertArrayEquals(masqueradingBlob, (byte[]) vitessResultSet.getObject(4)); - Assert.assertArrayEquals(text, (byte[]) vitessResultSet.getObject(5)); - Assert.assertArrayEquals(json, (byte[]) vitessResultSet.getObject(6)); - - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(0)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - } - @Test public void testGetClob() throws SQLException { VitessResultSet vitessResultSet = new VitessResultSet(new String[]{"clob"}, diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessStatementTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessStatementTest.java index 3f4bb39a44c..b641cafdefb 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessStatementTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/VitessStatementTest.java @@ -22,15 +22,8 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.nullable; -import static org.mockito.Matchers.anyList; -import static org.mockito.Matchers.anyMap; -import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.verify; -import static org.powermock.api.mockito.PowerMockito.doReturn; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; import io.vitess.client.Context; import io.vitess.client.SQLFuture; @@ -52,18 +45,12 @@ import java.util.Map; import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; /** * Created by harshit.gangal on 19/01/16. */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({VTGateConnection.class, Vtrpc.RPCError.class}) public class VitessStatementTest { private String sqlSelect = "select 1 from test_table"; @@ -76,7 +63,7 @@ public class VitessStatementTest { @Test public void testGetConnection() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertEquals(mockConn, statement.getConnection()); @@ -84,24 +71,24 @@ public void testGetConnection() throws SQLException { @Test public void testGetResultSet() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertEquals(null, statement.getResultSet()); } @Test public void testExecuteQuery() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockConn.isSimpleExecute()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(true); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); VitessStatement statement = new VitessStatement(mockConn); //Empty Sql Statement @@ -116,13 +103,13 @@ public void testExecuteQuery() throws SQLException { assertEquals(-1, statement.getUpdateCount()); //autocommit is false and not in transaction - when(mockConn.getAutoCommit()).thenReturn(false); - when(mockConn.isInTransaction()).thenReturn(false); + Mockito.when(mockConn.getAutoCommit()).thenReturn(false); + Mockito.when(mockConn.isInTransaction()).thenReturn(false); rs = statement.executeQuery(sqlSelect); assertEquals(-1, statement.getUpdateCount()); //when returned cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(null); try { statement.executeQuery(sqlSelect); fail("Should have thrown exception for cursor null"); @@ -133,18 +120,18 @@ public void testExecuteQuery() throws SQLException { @Test public void testExecuteQueryWithStreamExecuteType() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.STREAM); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.STREAM); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); VitessStatement statement = new VitessStatement(mockConn); //Empty Sql Statement @@ -164,13 +151,13 @@ public void testExecuteQueryWithStreamExecuteType() throws SQLException { assertEquals(-1, statement.getUpdateCount()); //select on primary when tx is null and autocommit is false - when(mockConn.getAutoCommit()).thenReturn(false); - when(mockConn.isInTransaction()).thenReturn(false); + Mockito.when(mockConn.getAutoCommit()).thenReturn(false); + Mockito.when(mockConn.isInTransaction()).thenReturn(false); rs = statement.executeQuery(sqlSelect); assertEquals(-1, statement.getUpdateCount()); //when returned cursor is null - when(mockVtGateConn + Mockito.when(mockVtGateConn .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(null); try { @@ -191,19 +178,19 @@ public void testExecuteFetchSizeAsStreaming() throws SQLException { private void testExecute(int fetchSize, boolean simpleExecute, boolean shouldRunExecute, boolean shouldRunStreamExecute) throws SQLException { - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); - VitessConnection mockConn = mock(VitessConnection.class); - when(mockConn.isSimpleExecute()).thenReturn(simpleExecute); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(simpleExecute); + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockVtGateConn + Mockito.when(mockVtGateConn .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockCursor); @@ -224,17 +211,17 @@ private void testExecute(int fetchSize, boolean simpleExecute, boolean shouldRun @Test public void testExecuteUpdate() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - List fieldList = mock(ArrayList.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + List fieldList = Mockito.mock(ArrayList.class); + + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); VitessStatement statement = new VitessStatement(mockConn); //executing dml on primary @@ -242,13 +229,13 @@ public void testExecuteUpdate() throws SQLException { assertEquals(0, updateCount); //tx is null & autoCommit is true - when(mockConn.getAutoCommit()).thenReturn(true); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); updateCount = statement.executeUpdate(sqlUpdate); assertEquals(0, updateCount); //cursor fields is not null - when(mockCursor.getFields()).thenReturn(fieldList); - when(fieldList.isEmpty()).thenReturn(false); + Mockito.when(mockCursor.getFields()).thenReturn(fieldList); + Mockito.when(fieldList.isEmpty()).thenReturn(false); try { statement.executeUpdate(sqlSelect); fail("Should have thrown exception for field not null"); @@ -257,7 +244,7 @@ public void testExecuteUpdate() throws SQLException { } //cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(null); try { statement.executeUpdate(sqlUpdate); fail("Should have thrown exception for cursor null"); @@ -266,7 +253,7 @@ public void testExecuteUpdate() throws SQLException { } //read only - when(mockConn.isReadOnly()).thenReturn(true); + Mockito.when(mockConn.isReadOnly()).thenReturn(true); try { statement.execute("UPDATE SET foo = 1 ON mytable WHERE id = 1"); fail("Should have thrown exception for read only"); @@ -275,7 +262,7 @@ public void testExecuteUpdate() throws SQLException { } //read only - when(mockConn.isReadOnly()).thenReturn(true); + Mockito.when(mockConn.isReadOnly()).thenReturn(true); try { statement.executeBatch(); fail("Should have thrown exception for read only"); @@ -286,27 +273,27 @@ public void testExecuteUpdate() throws SQLException { @Test public void testExecute() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - List mockFieldList = PowerMockito.spy(new ArrayList<>()); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + List mockFieldList = Mockito.spy(new ArrayList<>()); + + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockConn.getAutoCommit()).thenReturn(true); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); - when(mockConn.isSimpleExecute()).thenReturn(true); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); + Mockito.when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(mockFieldList); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(mockFieldList); VitessStatement statement = new VitessStatement(mockConn); int fieldSize = 5; - when(mockCursor.getFields()).thenReturn(mockFieldList); - doReturn(fieldSize).when(mockFieldList).size(); - doReturn(false).when(mockFieldList).isEmpty(); + Mockito.when(mockCursor.getFields()).thenReturn(mockFieldList); + Mockito.doReturn(fieldSize).when(mockFieldList).size(); + Mockito.doReturn(false).when(mockFieldList).isEmpty(); boolean hasResultSet = statement.execute(sqlSelect); assertTrue(hasResultSet); @@ -317,15 +304,15 @@ public void testExecute() throws SQLException { assertNotNull(statement.getResultSet()); int mockUpdateCount = 10; - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - when(mockCursor.getRowsAffected()).thenReturn((long) mockUpdateCount); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockCursor.getRowsAffected()).thenReturn((long) mockUpdateCount); hasResultSet = statement.execute(sqlUpdate); assertFalse(hasResultSet); assertNull(statement.getResultSet()); assertEquals(mockUpdateCount, statement.getUpdateCount()); //cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(null); try { statement.execute(sqlUpdate); fail("Should have thrown exception for cursor null"); @@ -336,47 +323,47 @@ public void testExecute() throws SQLException { @Test public void testGetUpdateCount() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFuture = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFuture = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFuture); - when(mockSqlFuture.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFuture.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); VitessStatement statement = new VitessStatement(mockConn); - when(mockCursor.getRowsAffected()).thenReturn(10L); + Mockito.when(mockCursor.getRowsAffected()).thenReturn(10L); int updateCount = statement.executeUpdate(sqlUpdate); assertEquals(10L, updateCount); assertEquals(10L, statement.getUpdateCount()); // Truncated Update Count - when(mockCursor.getRowsAffected()).thenReturn((long) Integer.MAX_VALUE + 10); + Mockito.when(mockCursor.getRowsAffected()).thenReturn((long) Integer.MAX_VALUE + 10); updateCount = statement.executeUpdate(sqlUpdate); assertEquals(Integer.MAX_VALUE, updateCount); assertEquals(Integer.MAX_VALUE, statement.getUpdateCount()); - when(mockConn.isSimpleExecute()).thenReturn(true); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(true); statement.executeQuery(sqlSelect); assertEquals(-1, statement.getUpdateCount()); } @Test public void testClose() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); - when(mockConn.isSimpleExecute()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(true); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); VitessStatement statement = new VitessStatement(mockConn); ResultSet rs = statement.executeQuery(sqlSelect); @@ -391,7 +378,7 @@ public void testClose() throws Exception { @Test public void testGetMaxFieldSize() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertEquals(65535, statement.getMaxFieldSize()); @@ -399,7 +386,7 @@ public void testGetMaxFieldSize() throws SQLException { @Test public void testGetMaxRows() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); @@ -417,7 +404,7 @@ public void testGetMaxRows() throws SQLException { @Test public void testGetQueryTimeout() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); Mockito.when(mockConn.getTimeout()).thenReturn((long) Constants.DEFAULT_TIMEOUT); VitessStatement statement = new VitessStatement(mockConn); @@ -426,7 +413,7 @@ public void testGetQueryTimeout() throws SQLException { @Test public void testGetQueryTimeoutZeroDefault() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); Mockito.when(mockConn.getTimeout()).thenReturn(0L); VitessStatement statement = new VitessStatement(mockConn); @@ -435,7 +422,7 @@ public void testGetQueryTimeoutZeroDefault() throws SQLException { @Test public void testSetQueryTimeout() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); Mockito.when(mockConn.getTimeout()).thenReturn((long) Constants.DEFAULT_TIMEOUT); VitessStatement statement = new VitessStatement(mockConn); @@ -457,7 +444,7 @@ public void testSetQueryTimeout() throws SQLException { @Test public void testGetWarnings() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertNull(statement.getWarnings()); @@ -465,7 +452,7 @@ public void testGetWarnings() throws SQLException { @Test public void testGetFetchDirection() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertEquals(ResultSet.FETCH_FORWARD, statement.getFetchDirection()); @@ -473,7 +460,7 @@ public void testGetFetchDirection() throws SQLException { @Test public void testGetFetchSize() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertEquals(0, statement.getFetchSize()); @@ -481,7 +468,7 @@ public void testGetFetchSize() throws SQLException { @Test public void testGetResultSetConcurrency() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertEquals(ResultSet.CONCUR_READ_ONLY, statement.getResultSetConcurrency()); @@ -489,7 +476,7 @@ public void testGetResultSetConcurrency() throws SQLException { @Test public void testGetResultSetType() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertEquals(ResultSet.TYPE_FORWARD_ONLY, statement.getResultSetType()); @@ -497,7 +484,7 @@ public void testGetResultSetType() throws SQLException { @Test public void testIsClosed() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertFalse(statement.isClosed()); @@ -507,23 +494,23 @@ public void testIsClosed() throws SQLException { @Test public void testAutoGeneratedKeys() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); VitessStatement statement = new VitessStatement(mockConn); long expectedFirstGeneratedId = 121; long[] expectedGeneratedIds = {121, 122, 123, 124, 125}; int expectedAffectedRows = 5; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); - when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedAffectedRows)); + Mockito.when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); + Mockito.when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedAffectedRows)); //Executing Insert Statement int updateCount = statement.executeUpdate(sqlInsert, Statement.RETURN_GENERATED_KEYS); @@ -550,7 +537,7 @@ public void testAutoGeneratedKeys() throws SQLException { //Fetching Generated Keys on update query expectedFirstGeneratedId = 0; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); + Mockito.when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); updateCount = statement.executeUpdate(sqlUpdate, Statement.RETURN_GENERATED_KEYS); assertEquals(expectedAffectedRows, updateCount); @@ -560,7 +547,7 @@ public void testAutoGeneratedKeys() throws SQLException { @Test public void testAddBatch() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); statement.addBatch(sqlInsert); Field privateStringField = VitessStatement.class.getDeclaredField("batchedArgs"); @@ -570,7 +557,7 @@ public void testAddBatch() throws Exception { @Test public void testClearBatch() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); statement.addBatch(sqlInsert); statement.clearBatch(); @@ -581,36 +568,36 @@ public void testClearBatch() throws Exception { @Test public void testExecuteBatch() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); int[] updateCounts = statement.executeBatch(); assertEquals(0, updateCounts.length); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockConn.getAutoCommit()).thenReturn(true); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - when( + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + Mockito.when( mockVtGateConn.executeBatch(nullable(Context.class), nullable(List.class), nullable(List.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); List mockCursorWithErrorList = new ArrayList<>(); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); - CursorWithError mockCursorWithError1 = mock(CursorWithError.class); - when(mockCursorWithError1.getError()).thenReturn(null); - when(mockCursorWithError1.getCursor()).thenReturn(mock(Cursor.class)); + CursorWithError mockCursorWithError1 = Mockito.mock(CursorWithError.class); + Mockito.when(mockCursorWithError1.getError()).thenReturn(null); + Mockito.when(mockCursorWithError1.getCursor()).thenReturn(Mockito.mock(Cursor.class)); mockCursorWithErrorList.add(mockCursorWithError1); statement.addBatch(sqlUpdate); updateCounts = statement.executeBatch(); assertEquals(1, updateCounts.length); - CursorWithError mockCursorWithError2 = mock(CursorWithError.class); + CursorWithError mockCursorWithError2 = Mockito.mock(CursorWithError.class); Vtrpc.RPCError rpcError = Vtrpc.RPCError.newBuilder() .setMessage("statement execute batch error").build(); - when(mockCursorWithError2.getError()).thenReturn(rpcError); + Mockito.when(mockCursorWithError2.getError()).thenReturn(rpcError); mockCursorWithErrorList.add(mockCursorWithError2); statement.addBatch(sqlUpdate); statement.addBatch(sqlUpdate); @@ -627,33 +614,33 @@ public void testExecuteBatch() throws SQLException { @Test public void testBatchGeneratedKeys() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockConn.getAutoCommit()).thenReturn(true); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - when( + Mockito.when( mockVtGateConn.executeBatch(nullable(Context.class), nullable(List.class), nullable(List.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); List mockCursorWithErrorList = new ArrayList<>(); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); - CursorWithError mockCursorWithError = mock(CursorWithError.class); - when(mockCursorWithError.getError()).thenReturn(null); - when(mockCursorWithError.getCursor()).thenReturn(mockCursor); + CursorWithError mockCursorWithError = Mockito.mock(CursorWithError.class); + Mockito.when(mockCursorWithError.getError()).thenReturn(null); + Mockito.when(mockCursorWithError.getCursor()).thenReturn(mockCursor); mockCursorWithErrorList.add(mockCursorWithError); long expectedFirstGeneratedId = 121; long[] expectedGeneratedIds = {121, 122, 123, 124, 125}; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); - when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedGeneratedIds.length)); + Mockito.when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); + Mockito.when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedGeneratedIds.length)); statement.addBatch(sqlInsert); statement.executeBatch(); @@ -668,33 +655,33 @@ public void testBatchGeneratedKeys() throws SQLException { @Test public void testBatchUpsertGeneratedKeys() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockConn.getAutoCommit()).thenReturn(true); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - when( + Mockito.when( mockVtGateConn.executeBatch(nullable(Context.class), nullable(List.class), nullable(List.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); List mockCursorWithErrorList = new ArrayList<>(); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); - CursorWithError mockCursorWithError = mock(CursorWithError.class); - when(mockCursorWithError.getError()).thenReturn(null); - when(mockCursorWithError.getCursor()).thenReturn(mockCursor); + CursorWithError mockCursorWithError = Mockito.mock(CursorWithError.class); + Mockito.when(mockCursorWithError.getError()).thenReturn(null); + Mockito.when(mockCursorWithError.getCursor()).thenReturn(mockCursor); mockCursorWithErrorList.add(mockCursorWithError); long expectedFirstGeneratedId = 121; long[] expectedGeneratedIds = {121, 122}; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); - when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedGeneratedIds.length)); + Mockito.when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); + Mockito.when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedGeneratedIds.length)); statement.addBatch(sqlUpsert); statement.executeBatch(); @@ -709,8 +696,8 @@ public void testBatchUpsertGeneratedKeys() throws SQLException { } VitessStatement noUpdate = new VitessStatement(mockConn); - when(mockCursor.getInsertId()).thenReturn(0L); - when(mockCursor.getRowsAffected()).thenReturn(1L); + Mockito.when(mockCursor.getInsertId()).thenReturn(0L); + Mockito.when(mockCursor.getRowsAffected()).thenReturn(1L); noUpdate.addBatch(sqlUpsert); noUpdate.executeBatch(); diff --git a/java/pom.xml b/java/pom.xml index e68bbd5574e..bc173282faf 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -252,7 +252,7 @@ true true - mysql:mysql-connector-java + com.mysql:mysql-connector-j io.grpc:grpc-context diff --git a/proto/tabletmanagerdata.proto b/proto/tabletmanagerdata.proto index bb20e712e7f..4a3dd20a0a1 100644 --- a/proto/tabletmanagerdata.proto +++ b/proto/tabletmanagerdata.proto @@ -760,6 +760,13 @@ message VDiffOptions { VDiffReportOptions report_options = 3; } +message VDiffTableLastPK { + query.QueryResult target = 1; + // If the source value is nil then it's the same as the target + // and the target value should be used for both. + optional query.QueryResult source = 2; +} + // UpdateVReplicationWorkflowRequest is used to update an existing VReplication // workflow. Note that the following fields MUST have an explicit value provided diff --git a/proto/vtctldata.proto b/proto/vtctldata.proto index b1e5fb215bc..498d6ee093e 100644 --- a/proto/vtctldata.proto +++ b/proto/vtctldata.proto @@ -556,6 +556,20 @@ message CompleteSchemaMigrationResponse { map rows_affected_by_shard = 1; } +message CopySchemaShardRequest { + topodata.TabletAlias source_tablet_alias = 1; + repeated string tables = 2; + repeated string exclude_tables = 3; + bool include_views = 4; + bool skip_verify = 5; + vttime.Duration wait_replicas_timeout = 6; + string destination_keyspace = 7; + string destination_shard = 8; +} + +message CopySchemaShardResponse { +} + message CreateKeyspaceRequest { // Name is the name of the keyspace. string name = 1; @@ -1860,12 +1874,25 @@ message ValidateKeyspaceResponse { map results_by_shard = 2; } +message ValidatePermissionsKeyspaceRequest { + string keyspace = 1; + // If you only want to validate a subset of the shards in the + // keyspace, then specify a list of shard names. + repeated string shards = 2; +} + +message ValidatePermissionsKeyspaceResponse { +} + message ValidateSchemaKeyspaceRequest { string keyspace = 1; repeated string exclude_tables = 2; bool include_views = 3; bool skip_no_primary = 4; bool include_vschema = 5; + // If you only want to validate a subset of the shards in the + // keyspace, then specify a list of shard names. + repeated string shards = 6; } message ValidateSchemaKeyspaceResponse { diff --git a/proto/vtctlservice.proto b/proto/vtctlservice.proto index 3133d4fb4e1..d99e8f1775b 100644 --- a/proto/vtctlservice.proto +++ b/proto/vtctlservice.proto @@ -74,6 +74,8 @@ service Vtctld { rpc CompleteSchemaMigration(vtctldata.CompleteSchemaMigrationRequest) returns (vtctldata.CompleteSchemaMigrationResponse) {}; // CompleteSchemaMigration completes one or all migrations executed with --postpone-completion. rpc ConcludeTransaction(vtctldata.ConcludeTransactionRequest) returns (vtctldata.ConcludeTransactionResponse) {}; + // CopySchemaShard copies the schema from a source tablet to all tablets in a keyspace/shard. + rpc CopySchemaShard(vtctldata.CopySchemaShardRequest) returns (vtctldata.CopySchemaShardResponse) {}; // CreateKeyspace creates the specified keyspace in the topology. For a // SNAPSHOT keyspace, the request must specify the name of a base keyspace, // as well as a snapshot time. @@ -349,6 +351,8 @@ service Vtctld { // ValidateKeyspace validates that all nodes reachable from the specified // keyspace are consistent. rpc ValidateKeyspace(vtctldata.ValidateKeyspaceRequest) returns (vtctldata.ValidateKeyspaceResponse) {}; + // ValidatePermissionsKeyspace validates that all the permissions are the same in a keyspace. + rpc ValidatePermissionsKeyspace(vtctldata.ValidatePermissionsKeyspaceRequest) returns (vtctldata.ValidatePermissionsKeyspaceResponse) {}; // ValidateSchemaKeyspace validates that the schema on the primary tablet for shard 0 matches the schema on all of the other tablets in the keyspace. rpc ValidateSchemaKeyspace(vtctldata.ValidateSchemaKeyspaceRequest) returns (vtctldata.ValidateSchemaKeyspaceResponse) {}; // ValidateShard validates that all nodes reachable from the specified shard diff --git a/test.go b/test.go index 95d62af892f..247541009a6 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql80", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "39", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "41", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") @@ -112,7 +112,7 @@ const ( configFileName = "test/config.json" // List of flavors for which a bootstrap Docker image is available. - flavors = "mysql80,percona80" + flavors = "mysql80,mysql84,percona80" ) // Config is the overall object serialized in test/config.json. diff --git a/test/config.json b/test/config.json index dfc0910f10e..17cdb019e97 100644 --- a/test/config.json +++ b/test/config.json @@ -8,7 +8,7 @@ "java_test" ], "Manual": false, - "Shard": "10", + "Shard": "java", "RetryMax": 1, "Tags": [] }, @@ -19,7 +19,7 @@ "test/client_test.sh" ], "Manual": false, - "Shard": "25", + "Shard": "java", "RetryMax": 1, "Tags": [] }, @@ -483,7 +483,7 @@ ], "Command": [], "Manual": false, - "Shard": "25", + "Shard": "docker_cluster", "RetryMax": 1, "Tags": [ "site_test" @@ -989,7 +989,7 @@ "Args": ["vitess.io/vitess/go/test/endtoend/topotest/zk2", "--topo-flavor=zk2"], "Command": [], "Manual": false, - "Shard": "25", + "Shard": "docker_cluster", "RetryMax": 1, "Tags": [] }, @@ -1061,7 +1061,7 @@ "Args": ["vitess.io/vitess/go/test/endtoend/vtcombo"], "Command": [], "Manual": false, - "Shard": "25", + "Shard": "docker_cluster", "RetryMax": 1, "Tags": [] }, diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index f51b06a2faf..c5129805126 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -13,6 +13,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on {{.Name}} runs-on: {{if .Cores16}}gh-hosted-runners-16cores-1-24.04{{else}}ubuntu-24.04{{end}} @@ -56,7 +57,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -66,6 +69,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' @@ -105,6 +109,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | {{if .InstallXtraBackup}} diff --git a/test/templates/cluster_endtoend_test_docker.tpl b/test/templates/cluster_endtoend_test_docker.tpl index f7e8aa2c1d8..39a36b88c89 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -28,7 +28,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -38,6 +40,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/test/templates/cluster_endtoend_test_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index f4152c939b0..a6cbc969c1a 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -61,7 +61,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -71,6 +73,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/test/templates/cluster_vitess_tester.tpl b/test/templates/cluster_vitess_tester.tpl index b8d77754ba6..508824dde87 100644 --- a/test/templates/cluster_vitess_tester.tpl +++ b/test/templates/cluster_vitess_tester.tpl @@ -43,7 +43,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -53,6 +55,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/vtgate/vitess_tester/**' diff --git a/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index af4376d3ca9..733377418f8 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=39 +ARG bootstrap_version=41 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index f802ee7ad4a..10c3b8c0c6a 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -43,7 +43,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -53,6 +55,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/web/vtadmin/src/components/routes/keyspaces/KeyspaceActions.tsx b/web/vtadmin/src/components/routes/keyspaces/KeyspaceActions.tsx index 6b123258d3c..4a8c83a5fe2 100644 --- a/web/vtadmin/src/components/routes/keyspaces/KeyspaceActions.tsx +++ b/web/vtadmin/src/components/routes/keyspaces/KeyspaceActions.tsx @@ -79,8 +79,8 @@ const KeyspaceActions: React.FC = ({ keyspace, clusterID } isOpen={currentDialog === 'Validate Schema'} body={
- Validates that the schema on the primary tablet for shard 0 matches the schema on all of the - other tablets in the keyspace {keyspace}. + Validates that the schema on the primary tablet for the first shard matches the schema on all of + the other tablets in the keyspace {keyspace}.
} successBody={ diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index 234c7e0f323..e8fd5040baf 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -34138,6 +34138,112 @@ export namespace tabletmanagerdata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a VDiffTableLastPK. */ + interface IVDiffTableLastPK { + + /** VDiffTableLastPK target */ + target?: (query.IQueryResult|null); + + /** VDiffTableLastPK source */ + source?: (query.IQueryResult|null); + } + + /** Represents a VDiffTableLastPK. */ + class VDiffTableLastPK implements IVDiffTableLastPK { + + /** + * Constructs a new VDiffTableLastPK. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IVDiffTableLastPK); + + /** VDiffTableLastPK target. */ + public target?: (query.IQueryResult|null); + + /** VDiffTableLastPK source. */ + public source?: (query.IQueryResult|null); + + /** VDiffTableLastPK _source. */ + public _source?: "source"; + + /** + * Creates a new VDiffTableLastPK instance using the specified properties. + * @param [properties] Properties to set + * @returns VDiffTableLastPK instance + */ + public static create(properties?: tabletmanagerdata.IVDiffTableLastPK): tabletmanagerdata.VDiffTableLastPK; + + /** + * Encodes the specified VDiffTableLastPK message. Does not implicitly {@link tabletmanagerdata.VDiffTableLastPK.verify|verify} messages. + * @param message VDiffTableLastPK message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IVDiffTableLastPK, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified VDiffTableLastPK message, length delimited. Does not implicitly {@link tabletmanagerdata.VDiffTableLastPK.verify|verify} messages. + * @param message VDiffTableLastPK message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IVDiffTableLastPK, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a VDiffTableLastPK message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns VDiffTableLastPK + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.VDiffTableLastPK; + + /** + * Decodes a VDiffTableLastPK message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns VDiffTableLastPK + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.VDiffTableLastPK; + + /** + * Verifies a VDiffTableLastPK message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a VDiffTableLastPK message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns VDiffTableLastPK + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.VDiffTableLastPK; + + /** + * Creates a plain object from a VDiffTableLastPK message. Also converts values to other types if specified. + * @param message VDiffTableLastPK + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.VDiffTableLastPK, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this VDiffTableLastPK to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for VDiffTableLastPK + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of an UpdateVReplicationWorkflowRequest. */ interface IUpdateVReplicationWorkflowRequest { @@ -55874,6 +55980,236 @@ export namespace vtctldata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a CopySchemaShardRequest. */ + interface ICopySchemaShardRequest { + + /** CopySchemaShardRequest source_tablet_alias */ + source_tablet_alias?: (topodata.ITabletAlias|null); + + /** CopySchemaShardRequest tables */ + tables?: (string[]|null); + + /** CopySchemaShardRequest exclude_tables */ + exclude_tables?: (string[]|null); + + /** CopySchemaShardRequest include_views */ + include_views?: (boolean|null); + + /** CopySchemaShardRequest skip_verify */ + skip_verify?: (boolean|null); + + /** CopySchemaShardRequest wait_replicas_timeout */ + wait_replicas_timeout?: (vttime.IDuration|null); + + /** CopySchemaShardRequest destination_keyspace */ + destination_keyspace?: (string|null); + + /** CopySchemaShardRequest destination_shard */ + destination_shard?: (string|null); + } + + /** Represents a CopySchemaShardRequest. */ + class CopySchemaShardRequest implements ICopySchemaShardRequest { + + /** + * Constructs a new CopySchemaShardRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.ICopySchemaShardRequest); + + /** CopySchemaShardRequest source_tablet_alias. */ + public source_tablet_alias?: (topodata.ITabletAlias|null); + + /** CopySchemaShardRequest tables. */ + public tables: string[]; + + /** CopySchemaShardRequest exclude_tables. */ + public exclude_tables: string[]; + + /** CopySchemaShardRequest include_views. */ + public include_views: boolean; + + /** CopySchemaShardRequest skip_verify. */ + public skip_verify: boolean; + + /** CopySchemaShardRequest wait_replicas_timeout. */ + public wait_replicas_timeout?: (vttime.IDuration|null); + + /** CopySchemaShardRequest destination_keyspace. */ + public destination_keyspace: string; + + /** CopySchemaShardRequest destination_shard. */ + public destination_shard: string; + + /** + * Creates a new CopySchemaShardRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns CopySchemaShardRequest instance + */ + public static create(properties?: vtctldata.ICopySchemaShardRequest): vtctldata.CopySchemaShardRequest; + + /** + * Encodes the specified CopySchemaShardRequest message. Does not implicitly {@link vtctldata.CopySchemaShardRequest.verify|verify} messages. + * @param message CopySchemaShardRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.ICopySchemaShardRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified CopySchemaShardRequest message, length delimited. Does not implicitly {@link vtctldata.CopySchemaShardRequest.verify|verify} messages. + * @param message CopySchemaShardRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.ICopySchemaShardRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a CopySchemaShardRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns CopySchemaShardRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.CopySchemaShardRequest; + + /** + * Decodes a CopySchemaShardRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns CopySchemaShardRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.CopySchemaShardRequest; + + /** + * Verifies a CopySchemaShardRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a CopySchemaShardRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns CopySchemaShardRequest + */ + public static fromObject(object: { [k: string]: any }): vtctldata.CopySchemaShardRequest; + + /** + * Creates a plain object from a CopySchemaShardRequest message. Also converts values to other types if specified. + * @param message CopySchemaShardRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.CopySchemaShardRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this CopySchemaShardRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for CopySchemaShardRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a CopySchemaShardResponse. */ + interface ICopySchemaShardResponse { + } + + /** Represents a CopySchemaShardResponse. */ + class CopySchemaShardResponse implements ICopySchemaShardResponse { + + /** + * Constructs a new CopySchemaShardResponse. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.ICopySchemaShardResponse); + + /** + * Creates a new CopySchemaShardResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns CopySchemaShardResponse instance + */ + public static create(properties?: vtctldata.ICopySchemaShardResponse): vtctldata.CopySchemaShardResponse; + + /** + * Encodes the specified CopySchemaShardResponse message. Does not implicitly {@link vtctldata.CopySchemaShardResponse.verify|verify} messages. + * @param message CopySchemaShardResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.ICopySchemaShardResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified CopySchemaShardResponse message, length delimited. Does not implicitly {@link vtctldata.CopySchemaShardResponse.verify|verify} messages. + * @param message CopySchemaShardResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.ICopySchemaShardResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a CopySchemaShardResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns CopySchemaShardResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.CopySchemaShardResponse; + + /** + * Decodes a CopySchemaShardResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns CopySchemaShardResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.CopySchemaShardResponse; + + /** + * Verifies a CopySchemaShardResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a CopySchemaShardResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns CopySchemaShardResponse + */ + public static fromObject(object: { [k: string]: any }): vtctldata.CopySchemaShardResponse; + + /** + * Creates a plain object from a CopySchemaShardResponse message. Also converts values to other types if specified. + * @param message CopySchemaShardResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.CopySchemaShardResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this CopySchemaShardResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for CopySchemaShardResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a CreateKeyspaceRequest. */ interface ICreateKeyspaceRequest { @@ -75654,6 +75990,200 @@ export namespace vtctldata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a ValidatePermissionsKeyspaceRequest. */ + interface IValidatePermissionsKeyspaceRequest { + + /** ValidatePermissionsKeyspaceRequest keyspace */ + keyspace?: (string|null); + + /** ValidatePermissionsKeyspaceRequest shards */ + shards?: (string[]|null); + } + + /** Represents a ValidatePermissionsKeyspaceRequest. */ + class ValidatePermissionsKeyspaceRequest implements IValidatePermissionsKeyspaceRequest { + + /** + * Constructs a new ValidatePermissionsKeyspaceRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.IValidatePermissionsKeyspaceRequest); + + /** ValidatePermissionsKeyspaceRequest keyspace. */ + public keyspace: string; + + /** ValidatePermissionsKeyspaceRequest shards. */ + public shards: string[]; + + /** + * Creates a new ValidatePermissionsKeyspaceRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns ValidatePermissionsKeyspaceRequest instance + */ + public static create(properties?: vtctldata.IValidatePermissionsKeyspaceRequest): vtctldata.ValidatePermissionsKeyspaceRequest; + + /** + * Encodes the specified ValidatePermissionsKeyspaceRequest message. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceRequest.verify|verify} messages. + * @param message ValidatePermissionsKeyspaceRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.IValidatePermissionsKeyspaceRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ValidatePermissionsKeyspaceRequest message, length delimited. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceRequest.verify|verify} messages. + * @param message ValidatePermissionsKeyspaceRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.IValidatePermissionsKeyspaceRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ValidatePermissionsKeyspaceRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ValidatePermissionsKeyspaceRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.ValidatePermissionsKeyspaceRequest; + + /** + * Decodes a ValidatePermissionsKeyspaceRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ValidatePermissionsKeyspaceRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.ValidatePermissionsKeyspaceRequest; + + /** + * Verifies a ValidatePermissionsKeyspaceRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ValidatePermissionsKeyspaceRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ValidatePermissionsKeyspaceRequest + */ + public static fromObject(object: { [k: string]: any }): vtctldata.ValidatePermissionsKeyspaceRequest; + + /** + * Creates a plain object from a ValidatePermissionsKeyspaceRequest message. Also converts values to other types if specified. + * @param message ValidatePermissionsKeyspaceRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.ValidatePermissionsKeyspaceRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ValidatePermissionsKeyspaceRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ValidatePermissionsKeyspaceRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a ValidatePermissionsKeyspaceResponse. */ + interface IValidatePermissionsKeyspaceResponse { + } + + /** Represents a ValidatePermissionsKeyspaceResponse. */ + class ValidatePermissionsKeyspaceResponse implements IValidatePermissionsKeyspaceResponse { + + /** + * Constructs a new ValidatePermissionsKeyspaceResponse. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.IValidatePermissionsKeyspaceResponse); + + /** + * Creates a new ValidatePermissionsKeyspaceResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns ValidatePermissionsKeyspaceResponse instance + */ + public static create(properties?: vtctldata.IValidatePermissionsKeyspaceResponse): vtctldata.ValidatePermissionsKeyspaceResponse; + + /** + * Encodes the specified ValidatePermissionsKeyspaceResponse message. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceResponse.verify|verify} messages. + * @param message ValidatePermissionsKeyspaceResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.IValidatePermissionsKeyspaceResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ValidatePermissionsKeyspaceResponse message, length delimited. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceResponse.verify|verify} messages. + * @param message ValidatePermissionsKeyspaceResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.IValidatePermissionsKeyspaceResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ValidatePermissionsKeyspaceResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ValidatePermissionsKeyspaceResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.ValidatePermissionsKeyspaceResponse; + + /** + * Decodes a ValidatePermissionsKeyspaceResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ValidatePermissionsKeyspaceResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.ValidatePermissionsKeyspaceResponse; + + /** + * Verifies a ValidatePermissionsKeyspaceResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ValidatePermissionsKeyspaceResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ValidatePermissionsKeyspaceResponse + */ + public static fromObject(object: { [k: string]: any }): vtctldata.ValidatePermissionsKeyspaceResponse; + + /** + * Creates a plain object from a ValidatePermissionsKeyspaceResponse message. Also converts values to other types if specified. + * @param message ValidatePermissionsKeyspaceResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.ValidatePermissionsKeyspaceResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ValidatePermissionsKeyspaceResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ValidatePermissionsKeyspaceResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a ValidateSchemaKeyspaceRequest. */ interface IValidateSchemaKeyspaceRequest { @@ -75671,6 +76201,9 @@ export namespace vtctldata { /** ValidateSchemaKeyspaceRequest include_vschema */ include_vschema?: (boolean|null); + + /** ValidateSchemaKeyspaceRequest shards */ + shards?: (string[]|null); } /** Represents a ValidateSchemaKeyspaceRequest. */ @@ -75697,6 +76230,9 @@ export namespace vtctldata { /** ValidateSchemaKeyspaceRequest include_vschema. */ public include_vschema: boolean; + /** ValidateSchemaKeyspaceRequest shards. */ + public shards: string[]; + /** * Creates a new ValidateSchemaKeyspaceRequest instance using the specified properties. * @param [properties] Properties to set diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index f1935b2a9b3..d215662ab7c 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -78899,6 +78899,262 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { return VDiffOptions; })(); + tabletmanagerdata.VDiffTableLastPK = (function() { + + /** + * Properties of a VDiffTableLastPK. + * @memberof tabletmanagerdata + * @interface IVDiffTableLastPK + * @property {query.IQueryResult|null} [target] VDiffTableLastPK target + * @property {query.IQueryResult|null} [source] VDiffTableLastPK source + */ + + /** + * Constructs a new VDiffTableLastPK. + * @memberof tabletmanagerdata + * @classdesc Represents a VDiffTableLastPK. + * @implements IVDiffTableLastPK + * @constructor + * @param {tabletmanagerdata.IVDiffTableLastPK=} [properties] Properties to set + */ + function VDiffTableLastPK(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * VDiffTableLastPK target. + * @member {query.IQueryResult|null|undefined} target + * @memberof tabletmanagerdata.VDiffTableLastPK + * @instance + */ + VDiffTableLastPK.prototype.target = null; + + /** + * VDiffTableLastPK source. + * @member {query.IQueryResult|null|undefined} source + * @memberof tabletmanagerdata.VDiffTableLastPK + * @instance + */ + VDiffTableLastPK.prototype.source = null; + + // OneOf field names bound to virtual getters and setters + let $oneOfFields; + + /** + * VDiffTableLastPK _source. + * @member {"source"|undefined} _source + * @memberof tabletmanagerdata.VDiffTableLastPK + * @instance + */ + Object.defineProperty(VDiffTableLastPK.prototype, "_source", { + get: $util.oneOfGetter($oneOfFields = ["source"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new VDiffTableLastPK instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {tabletmanagerdata.IVDiffTableLastPK=} [properties] Properties to set + * @returns {tabletmanagerdata.VDiffTableLastPK} VDiffTableLastPK instance + */ + VDiffTableLastPK.create = function create(properties) { + return new VDiffTableLastPK(properties); + }; + + /** + * Encodes the specified VDiffTableLastPK message. Does not implicitly {@link tabletmanagerdata.VDiffTableLastPK.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {tabletmanagerdata.IVDiffTableLastPK} message VDiffTableLastPK message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + VDiffTableLastPK.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.target != null && Object.hasOwnProperty.call(message, "target")) + $root.query.QueryResult.encode(message.target, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.source != null && Object.hasOwnProperty.call(message, "source")) + $root.query.QueryResult.encode(message.source, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified VDiffTableLastPK message, length delimited. Does not implicitly {@link tabletmanagerdata.VDiffTableLastPK.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {tabletmanagerdata.IVDiffTableLastPK} message VDiffTableLastPK message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + VDiffTableLastPK.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a VDiffTableLastPK message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.VDiffTableLastPK} VDiffTableLastPK + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + VDiffTableLastPK.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.VDiffTableLastPK(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.target = $root.query.QueryResult.decode(reader, reader.uint32()); + break; + } + case 2: { + message.source = $root.query.QueryResult.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a VDiffTableLastPK message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.VDiffTableLastPK} VDiffTableLastPK + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + VDiffTableLastPK.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a VDiffTableLastPK message. + * @function verify + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + VDiffTableLastPK.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + let properties = {}; + if (message.target != null && message.hasOwnProperty("target")) { + let error = $root.query.QueryResult.verify(message.target); + if (error) + return "target." + error; + } + if (message.source != null && message.hasOwnProperty("source")) { + properties._source = 1; + { + let error = $root.query.QueryResult.verify(message.source); + if (error) + return "source." + error; + } + } + return null; + }; + + /** + * Creates a VDiffTableLastPK message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.VDiffTableLastPK} VDiffTableLastPK + */ + VDiffTableLastPK.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.VDiffTableLastPK) + return object; + let message = new $root.tabletmanagerdata.VDiffTableLastPK(); + if (object.target != null) { + if (typeof object.target !== "object") + throw TypeError(".tabletmanagerdata.VDiffTableLastPK.target: object expected"); + message.target = $root.query.QueryResult.fromObject(object.target); + } + if (object.source != null) { + if (typeof object.source !== "object") + throw TypeError(".tabletmanagerdata.VDiffTableLastPK.source: object expected"); + message.source = $root.query.QueryResult.fromObject(object.source); + } + return message; + }; + + /** + * Creates a plain object from a VDiffTableLastPK message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {tabletmanagerdata.VDiffTableLastPK} message VDiffTableLastPK + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + VDiffTableLastPK.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) + object.target = null; + if (message.target != null && message.hasOwnProperty("target")) + object.target = $root.query.QueryResult.toObject(message.target, options); + if (message.source != null && message.hasOwnProperty("source")) { + object.source = $root.query.QueryResult.toObject(message.source, options); + if (options.oneofs) + object._source = "source"; + } + return object; + }; + + /** + * Converts this VDiffTableLastPK to JSON. + * @function toJSON + * @memberof tabletmanagerdata.VDiffTableLastPK + * @instance + * @returns {Object.} JSON object + */ + VDiffTableLastPK.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for VDiffTableLastPK + * @function getTypeUrl + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + VDiffTableLastPK.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.VDiffTableLastPK"; + }; + + return VDiffTableLastPK; + })(); + tabletmanagerdata.UpdateVReplicationWorkflowRequest = (function() { /** @@ -138127,6 +138383,590 @@ export const vtctldata = $root.vtctldata = (() => { return CompleteSchemaMigrationResponse; })(); + vtctldata.CopySchemaShardRequest = (function() { + + /** + * Properties of a CopySchemaShardRequest. + * @memberof vtctldata + * @interface ICopySchemaShardRequest + * @property {topodata.ITabletAlias|null} [source_tablet_alias] CopySchemaShardRequest source_tablet_alias + * @property {Array.|null} [tables] CopySchemaShardRequest tables + * @property {Array.|null} [exclude_tables] CopySchemaShardRequest exclude_tables + * @property {boolean|null} [include_views] CopySchemaShardRequest include_views + * @property {boolean|null} [skip_verify] CopySchemaShardRequest skip_verify + * @property {vttime.IDuration|null} [wait_replicas_timeout] CopySchemaShardRequest wait_replicas_timeout + * @property {string|null} [destination_keyspace] CopySchemaShardRequest destination_keyspace + * @property {string|null} [destination_shard] CopySchemaShardRequest destination_shard + */ + + /** + * Constructs a new CopySchemaShardRequest. + * @memberof vtctldata + * @classdesc Represents a CopySchemaShardRequest. + * @implements ICopySchemaShardRequest + * @constructor + * @param {vtctldata.ICopySchemaShardRequest=} [properties] Properties to set + */ + function CopySchemaShardRequest(properties) { + this.tables = []; + this.exclude_tables = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * CopySchemaShardRequest source_tablet_alias. + * @member {topodata.ITabletAlias|null|undefined} source_tablet_alias + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.source_tablet_alias = null; + + /** + * CopySchemaShardRequest tables. + * @member {Array.} tables + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.tables = $util.emptyArray; + + /** + * CopySchemaShardRequest exclude_tables. + * @member {Array.} exclude_tables + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.exclude_tables = $util.emptyArray; + + /** + * CopySchemaShardRequest include_views. + * @member {boolean} include_views + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.include_views = false; + + /** + * CopySchemaShardRequest skip_verify. + * @member {boolean} skip_verify + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.skip_verify = false; + + /** + * CopySchemaShardRequest wait_replicas_timeout. + * @member {vttime.IDuration|null|undefined} wait_replicas_timeout + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.wait_replicas_timeout = null; + + /** + * CopySchemaShardRequest destination_keyspace. + * @member {string} destination_keyspace + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.destination_keyspace = ""; + + /** + * CopySchemaShardRequest destination_shard. + * @member {string} destination_shard + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.destination_shard = ""; + + /** + * Creates a new CopySchemaShardRequest instance using the specified properties. + * @function create + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {vtctldata.ICopySchemaShardRequest=} [properties] Properties to set + * @returns {vtctldata.CopySchemaShardRequest} CopySchemaShardRequest instance + */ + CopySchemaShardRequest.create = function create(properties) { + return new CopySchemaShardRequest(properties); + }; + + /** + * Encodes the specified CopySchemaShardRequest message. Does not implicitly {@link vtctldata.CopySchemaShardRequest.verify|verify} messages. + * @function encode + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {vtctldata.ICopySchemaShardRequest} message CopySchemaShardRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CopySchemaShardRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.source_tablet_alias != null && Object.hasOwnProperty.call(message, "source_tablet_alias")) + $root.topodata.TabletAlias.encode(message.source_tablet_alias, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.tables != null && message.tables.length) + for (let i = 0; i < message.tables.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.tables[i]); + if (message.exclude_tables != null && message.exclude_tables.length) + for (let i = 0; i < message.exclude_tables.length; ++i) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.exclude_tables[i]); + if (message.include_views != null && Object.hasOwnProperty.call(message, "include_views")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.include_views); + if (message.skip_verify != null && Object.hasOwnProperty.call(message, "skip_verify")) + writer.uint32(/* id 5, wireType 0 =*/40).bool(message.skip_verify); + if (message.wait_replicas_timeout != null && Object.hasOwnProperty.call(message, "wait_replicas_timeout")) + $root.vttime.Duration.encode(message.wait_replicas_timeout, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.destination_keyspace != null && Object.hasOwnProperty.call(message, "destination_keyspace")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.destination_keyspace); + if (message.destination_shard != null && Object.hasOwnProperty.call(message, "destination_shard")) + writer.uint32(/* id 8, wireType 2 =*/66).string(message.destination_shard); + return writer; + }; + + /** + * Encodes the specified CopySchemaShardRequest message, length delimited. Does not implicitly {@link vtctldata.CopySchemaShardRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {vtctldata.ICopySchemaShardRequest} message CopySchemaShardRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CopySchemaShardRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a CopySchemaShardRequest message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.CopySchemaShardRequest} CopySchemaShardRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CopySchemaShardRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.CopySchemaShardRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.source_tablet_alias = $root.topodata.TabletAlias.decode(reader, reader.uint32()); + break; + } + case 2: { + if (!(message.tables && message.tables.length)) + message.tables = []; + message.tables.push(reader.string()); + break; + } + case 3: { + if (!(message.exclude_tables && message.exclude_tables.length)) + message.exclude_tables = []; + message.exclude_tables.push(reader.string()); + break; + } + case 4: { + message.include_views = reader.bool(); + break; + } + case 5: { + message.skip_verify = reader.bool(); + break; + } + case 6: { + message.wait_replicas_timeout = $root.vttime.Duration.decode(reader, reader.uint32()); + break; + } + case 7: { + message.destination_keyspace = reader.string(); + break; + } + case 8: { + message.destination_shard = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a CopySchemaShardRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.CopySchemaShardRequest} CopySchemaShardRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CopySchemaShardRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a CopySchemaShardRequest message. + * @function verify + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + CopySchemaShardRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.source_tablet_alias != null && message.hasOwnProperty("source_tablet_alias")) { + let error = $root.topodata.TabletAlias.verify(message.source_tablet_alias); + if (error) + return "source_tablet_alias." + error; + } + if (message.tables != null && message.hasOwnProperty("tables")) { + if (!Array.isArray(message.tables)) + return "tables: array expected"; + for (let i = 0; i < message.tables.length; ++i) + if (!$util.isString(message.tables[i])) + return "tables: string[] expected"; + } + if (message.exclude_tables != null && message.hasOwnProperty("exclude_tables")) { + if (!Array.isArray(message.exclude_tables)) + return "exclude_tables: array expected"; + for (let i = 0; i < message.exclude_tables.length; ++i) + if (!$util.isString(message.exclude_tables[i])) + return "exclude_tables: string[] expected"; + } + if (message.include_views != null && message.hasOwnProperty("include_views")) + if (typeof message.include_views !== "boolean") + return "include_views: boolean expected"; + if (message.skip_verify != null && message.hasOwnProperty("skip_verify")) + if (typeof message.skip_verify !== "boolean") + return "skip_verify: boolean expected"; + if (message.wait_replicas_timeout != null && message.hasOwnProperty("wait_replicas_timeout")) { + let error = $root.vttime.Duration.verify(message.wait_replicas_timeout); + if (error) + return "wait_replicas_timeout." + error; + } + if (message.destination_keyspace != null && message.hasOwnProperty("destination_keyspace")) + if (!$util.isString(message.destination_keyspace)) + return "destination_keyspace: string expected"; + if (message.destination_shard != null && message.hasOwnProperty("destination_shard")) + if (!$util.isString(message.destination_shard)) + return "destination_shard: string expected"; + return null; + }; + + /** + * Creates a CopySchemaShardRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.CopySchemaShardRequest} CopySchemaShardRequest + */ + CopySchemaShardRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.CopySchemaShardRequest) + return object; + let message = new $root.vtctldata.CopySchemaShardRequest(); + if (object.source_tablet_alias != null) { + if (typeof object.source_tablet_alias !== "object") + throw TypeError(".vtctldata.CopySchemaShardRequest.source_tablet_alias: object expected"); + message.source_tablet_alias = $root.topodata.TabletAlias.fromObject(object.source_tablet_alias); + } + if (object.tables) { + if (!Array.isArray(object.tables)) + throw TypeError(".vtctldata.CopySchemaShardRequest.tables: array expected"); + message.tables = []; + for (let i = 0; i < object.tables.length; ++i) + message.tables[i] = String(object.tables[i]); + } + if (object.exclude_tables) { + if (!Array.isArray(object.exclude_tables)) + throw TypeError(".vtctldata.CopySchemaShardRequest.exclude_tables: array expected"); + message.exclude_tables = []; + for (let i = 0; i < object.exclude_tables.length; ++i) + message.exclude_tables[i] = String(object.exclude_tables[i]); + } + if (object.include_views != null) + message.include_views = Boolean(object.include_views); + if (object.skip_verify != null) + message.skip_verify = Boolean(object.skip_verify); + if (object.wait_replicas_timeout != null) { + if (typeof object.wait_replicas_timeout !== "object") + throw TypeError(".vtctldata.CopySchemaShardRequest.wait_replicas_timeout: object expected"); + message.wait_replicas_timeout = $root.vttime.Duration.fromObject(object.wait_replicas_timeout); + } + if (object.destination_keyspace != null) + message.destination_keyspace = String(object.destination_keyspace); + if (object.destination_shard != null) + message.destination_shard = String(object.destination_shard); + return message; + }; + + /** + * Creates a plain object from a CopySchemaShardRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {vtctldata.CopySchemaShardRequest} message CopySchemaShardRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + CopySchemaShardRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) { + object.tables = []; + object.exclude_tables = []; + } + if (options.defaults) { + object.source_tablet_alias = null; + object.include_views = false; + object.skip_verify = false; + object.wait_replicas_timeout = null; + object.destination_keyspace = ""; + object.destination_shard = ""; + } + if (message.source_tablet_alias != null && message.hasOwnProperty("source_tablet_alias")) + object.source_tablet_alias = $root.topodata.TabletAlias.toObject(message.source_tablet_alias, options); + if (message.tables && message.tables.length) { + object.tables = []; + for (let j = 0; j < message.tables.length; ++j) + object.tables[j] = message.tables[j]; + } + if (message.exclude_tables && message.exclude_tables.length) { + object.exclude_tables = []; + for (let j = 0; j < message.exclude_tables.length; ++j) + object.exclude_tables[j] = message.exclude_tables[j]; + } + if (message.include_views != null && message.hasOwnProperty("include_views")) + object.include_views = message.include_views; + if (message.skip_verify != null && message.hasOwnProperty("skip_verify")) + object.skip_verify = message.skip_verify; + if (message.wait_replicas_timeout != null && message.hasOwnProperty("wait_replicas_timeout")) + object.wait_replicas_timeout = $root.vttime.Duration.toObject(message.wait_replicas_timeout, options); + if (message.destination_keyspace != null && message.hasOwnProperty("destination_keyspace")) + object.destination_keyspace = message.destination_keyspace; + if (message.destination_shard != null && message.hasOwnProperty("destination_shard")) + object.destination_shard = message.destination_shard; + return object; + }; + + /** + * Converts this CopySchemaShardRequest to JSON. + * @function toJSON + * @memberof vtctldata.CopySchemaShardRequest + * @instance + * @returns {Object.} JSON object + */ + CopySchemaShardRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for CopySchemaShardRequest + * @function getTypeUrl + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + CopySchemaShardRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.CopySchemaShardRequest"; + }; + + return CopySchemaShardRequest; + })(); + + vtctldata.CopySchemaShardResponse = (function() { + + /** + * Properties of a CopySchemaShardResponse. + * @memberof vtctldata + * @interface ICopySchemaShardResponse + */ + + /** + * Constructs a new CopySchemaShardResponse. + * @memberof vtctldata + * @classdesc Represents a CopySchemaShardResponse. + * @implements ICopySchemaShardResponse + * @constructor + * @param {vtctldata.ICopySchemaShardResponse=} [properties] Properties to set + */ + function CopySchemaShardResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new CopySchemaShardResponse instance using the specified properties. + * @function create + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {vtctldata.ICopySchemaShardResponse=} [properties] Properties to set + * @returns {vtctldata.CopySchemaShardResponse} CopySchemaShardResponse instance + */ + CopySchemaShardResponse.create = function create(properties) { + return new CopySchemaShardResponse(properties); + }; + + /** + * Encodes the specified CopySchemaShardResponse message. Does not implicitly {@link vtctldata.CopySchemaShardResponse.verify|verify} messages. + * @function encode + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {vtctldata.ICopySchemaShardResponse} message CopySchemaShardResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CopySchemaShardResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified CopySchemaShardResponse message, length delimited. Does not implicitly {@link vtctldata.CopySchemaShardResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {vtctldata.ICopySchemaShardResponse} message CopySchemaShardResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CopySchemaShardResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a CopySchemaShardResponse message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.CopySchemaShardResponse} CopySchemaShardResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CopySchemaShardResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.CopySchemaShardResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a CopySchemaShardResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.CopySchemaShardResponse} CopySchemaShardResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CopySchemaShardResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a CopySchemaShardResponse message. + * @function verify + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + CopySchemaShardResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a CopySchemaShardResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.CopySchemaShardResponse} CopySchemaShardResponse + */ + CopySchemaShardResponse.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.CopySchemaShardResponse) + return object; + return new $root.vtctldata.CopySchemaShardResponse(); + }; + + /** + * Creates a plain object from a CopySchemaShardResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {vtctldata.CopySchemaShardResponse} message CopySchemaShardResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + CopySchemaShardResponse.toObject = function toObject() { + return {}; + }; + + /** + * Converts this CopySchemaShardResponse to JSON. + * @function toJSON + * @memberof vtctldata.CopySchemaShardResponse + * @instance + * @returns {Object.} JSON object + */ + CopySchemaShardResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for CopySchemaShardResponse + * @function getTypeUrl + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + CopySchemaShardResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.CopySchemaShardResponse"; + }; + + return CopySchemaShardResponse; + })(); + vtctldata.CreateKeyspaceRequest = (function() { /** @@ -184550,6 +185390,424 @@ export const vtctldata = $root.vtctldata = (() => { return ValidateKeyspaceResponse; })(); + vtctldata.ValidatePermissionsKeyspaceRequest = (function() { + + /** + * Properties of a ValidatePermissionsKeyspaceRequest. + * @memberof vtctldata + * @interface IValidatePermissionsKeyspaceRequest + * @property {string|null} [keyspace] ValidatePermissionsKeyspaceRequest keyspace + * @property {Array.|null} [shards] ValidatePermissionsKeyspaceRequest shards + */ + + /** + * Constructs a new ValidatePermissionsKeyspaceRequest. + * @memberof vtctldata + * @classdesc Represents a ValidatePermissionsKeyspaceRequest. + * @implements IValidatePermissionsKeyspaceRequest + * @constructor + * @param {vtctldata.IValidatePermissionsKeyspaceRequest=} [properties] Properties to set + */ + function ValidatePermissionsKeyspaceRequest(properties) { + this.shards = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ValidatePermissionsKeyspaceRequest keyspace. + * @member {string} keyspace + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @instance + */ + ValidatePermissionsKeyspaceRequest.prototype.keyspace = ""; + + /** + * ValidatePermissionsKeyspaceRequest shards. + * @member {Array.} shards + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @instance + */ + ValidatePermissionsKeyspaceRequest.prototype.shards = $util.emptyArray; + + /** + * Creates a new ValidatePermissionsKeyspaceRequest instance using the specified properties. + * @function create + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {vtctldata.IValidatePermissionsKeyspaceRequest=} [properties] Properties to set + * @returns {vtctldata.ValidatePermissionsKeyspaceRequest} ValidatePermissionsKeyspaceRequest instance + */ + ValidatePermissionsKeyspaceRequest.create = function create(properties) { + return new ValidatePermissionsKeyspaceRequest(properties); + }; + + /** + * Encodes the specified ValidatePermissionsKeyspaceRequest message. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceRequest.verify|verify} messages. + * @function encode + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {vtctldata.IValidatePermissionsKeyspaceRequest} message ValidatePermissionsKeyspaceRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidatePermissionsKeyspaceRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.keyspace != null && Object.hasOwnProperty.call(message, "keyspace")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.keyspace); + if (message.shards != null && message.shards.length) + for (let i = 0; i < message.shards.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.shards[i]); + return writer; + }; + + /** + * Encodes the specified ValidatePermissionsKeyspaceRequest message, length delimited. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {vtctldata.IValidatePermissionsKeyspaceRequest} message ValidatePermissionsKeyspaceRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidatePermissionsKeyspaceRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ValidatePermissionsKeyspaceRequest message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.ValidatePermissionsKeyspaceRequest} ValidatePermissionsKeyspaceRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidatePermissionsKeyspaceRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.ValidatePermissionsKeyspaceRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.keyspace = reader.string(); + break; + } + case 2: { + if (!(message.shards && message.shards.length)) + message.shards = []; + message.shards.push(reader.string()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ValidatePermissionsKeyspaceRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.ValidatePermissionsKeyspaceRequest} ValidatePermissionsKeyspaceRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidatePermissionsKeyspaceRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ValidatePermissionsKeyspaceRequest message. + * @function verify + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ValidatePermissionsKeyspaceRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + if (!$util.isString(message.keyspace)) + return "keyspace: string expected"; + if (message.shards != null && message.hasOwnProperty("shards")) { + if (!Array.isArray(message.shards)) + return "shards: array expected"; + for (let i = 0; i < message.shards.length; ++i) + if (!$util.isString(message.shards[i])) + return "shards: string[] expected"; + } + return null; + }; + + /** + * Creates a ValidatePermissionsKeyspaceRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.ValidatePermissionsKeyspaceRequest} ValidatePermissionsKeyspaceRequest + */ + ValidatePermissionsKeyspaceRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.ValidatePermissionsKeyspaceRequest) + return object; + let message = new $root.vtctldata.ValidatePermissionsKeyspaceRequest(); + if (object.keyspace != null) + message.keyspace = String(object.keyspace); + if (object.shards) { + if (!Array.isArray(object.shards)) + throw TypeError(".vtctldata.ValidatePermissionsKeyspaceRequest.shards: array expected"); + message.shards = []; + for (let i = 0; i < object.shards.length; ++i) + message.shards[i] = String(object.shards[i]); + } + return message; + }; + + /** + * Creates a plain object from a ValidatePermissionsKeyspaceRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {vtctldata.ValidatePermissionsKeyspaceRequest} message ValidatePermissionsKeyspaceRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ValidatePermissionsKeyspaceRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.shards = []; + if (options.defaults) + object.keyspace = ""; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + object.keyspace = message.keyspace; + if (message.shards && message.shards.length) { + object.shards = []; + for (let j = 0; j < message.shards.length; ++j) + object.shards[j] = message.shards[j]; + } + return object; + }; + + /** + * Converts this ValidatePermissionsKeyspaceRequest to JSON. + * @function toJSON + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @instance + * @returns {Object.} JSON object + */ + ValidatePermissionsKeyspaceRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ValidatePermissionsKeyspaceRequest + * @function getTypeUrl + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ValidatePermissionsKeyspaceRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.ValidatePermissionsKeyspaceRequest"; + }; + + return ValidatePermissionsKeyspaceRequest; + })(); + + vtctldata.ValidatePermissionsKeyspaceResponse = (function() { + + /** + * Properties of a ValidatePermissionsKeyspaceResponse. + * @memberof vtctldata + * @interface IValidatePermissionsKeyspaceResponse + */ + + /** + * Constructs a new ValidatePermissionsKeyspaceResponse. + * @memberof vtctldata + * @classdesc Represents a ValidatePermissionsKeyspaceResponse. + * @implements IValidatePermissionsKeyspaceResponse + * @constructor + * @param {vtctldata.IValidatePermissionsKeyspaceResponse=} [properties] Properties to set + */ + function ValidatePermissionsKeyspaceResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new ValidatePermissionsKeyspaceResponse instance using the specified properties. + * @function create + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {vtctldata.IValidatePermissionsKeyspaceResponse=} [properties] Properties to set + * @returns {vtctldata.ValidatePermissionsKeyspaceResponse} ValidatePermissionsKeyspaceResponse instance + */ + ValidatePermissionsKeyspaceResponse.create = function create(properties) { + return new ValidatePermissionsKeyspaceResponse(properties); + }; + + /** + * Encodes the specified ValidatePermissionsKeyspaceResponse message. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceResponse.verify|verify} messages. + * @function encode + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {vtctldata.IValidatePermissionsKeyspaceResponse} message ValidatePermissionsKeyspaceResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidatePermissionsKeyspaceResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified ValidatePermissionsKeyspaceResponse message, length delimited. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {vtctldata.IValidatePermissionsKeyspaceResponse} message ValidatePermissionsKeyspaceResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidatePermissionsKeyspaceResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ValidatePermissionsKeyspaceResponse message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.ValidatePermissionsKeyspaceResponse} ValidatePermissionsKeyspaceResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidatePermissionsKeyspaceResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.ValidatePermissionsKeyspaceResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ValidatePermissionsKeyspaceResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.ValidatePermissionsKeyspaceResponse} ValidatePermissionsKeyspaceResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidatePermissionsKeyspaceResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ValidatePermissionsKeyspaceResponse message. + * @function verify + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ValidatePermissionsKeyspaceResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a ValidatePermissionsKeyspaceResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.ValidatePermissionsKeyspaceResponse} ValidatePermissionsKeyspaceResponse + */ + ValidatePermissionsKeyspaceResponse.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.ValidatePermissionsKeyspaceResponse) + return object; + return new $root.vtctldata.ValidatePermissionsKeyspaceResponse(); + }; + + /** + * Creates a plain object from a ValidatePermissionsKeyspaceResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {vtctldata.ValidatePermissionsKeyspaceResponse} message ValidatePermissionsKeyspaceResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ValidatePermissionsKeyspaceResponse.toObject = function toObject() { + return {}; + }; + + /** + * Converts this ValidatePermissionsKeyspaceResponse to JSON. + * @function toJSON + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @instance + * @returns {Object.} JSON object + */ + ValidatePermissionsKeyspaceResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ValidatePermissionsKeyspaceResponse + * @function getTypeUrl + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ValidatePermissionsKeyspaceResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.ValidatePermissionsKeyspaceResponse"; + }; + + return ValidatePermissionsKeyspaceResponse; + })(); + vtctldata.ValidateSchemaKeyspaceRequest = (function() { /** @@ -184561,6 +185819,7 @@ export const vtctldata = $root.vtctldata = (() => { * @property {boolean|null} [include_views] ValidateSchemaKeyspaceRequest include_views * @property {boolean|null} [skip_no_primary] ValidateSchemaKeyspaceRequest skip_no_primary * @property {boolean|null} [include_vschema] ValidateSchemaKeyspaceRequest include_vschema + * @property {Array.|null} [shards] ValidateSchemaKeyspaceRequest shards */ /** @@ -184573,6 +185832,7 @@ export const vtctldata = $root.vtctldata = (() => { */ function ValidateSchemaKeyspaceRequest(properties) { this.exclude_tables = []; + this.shards = []; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -184619,6 +185879,14 @@ export const vtctldata = $root.vtctldata = (() => { */ ValidateSchemaKeyspaceRequest.prototype.include_vschema = false; + /** + * ValidateSchemaKeyspaceRequest shards. + * @member {Array.} shards + * @memberof vtctldata.ValidateSchemaKeyspaceRequest + * @instance + */ + ValidateSchemaKeyspaceRequest.prototype.shards = $util.emptyArray; + /** * Creates a new ValidateSchemaKeyspaceRequest instance using the specified properties. * @function create @@ -184654,6 +185922,9 @@ export const vtctldata = $root.vtctldata = (() => { writer.uint32(/* id 4, wireType 0 =*/32).bool(message.skip_no_primary); if (message.include_vschema != null && Object.hasOwnProperty.call(message, "include_vschema")) writer.uint32(/* id 5, wireType 0 =*/40).bool(message.include_vschema); + if (message.shards != null && message.shards.length) + for (let i = 0; i < message.shards.length; ++i) + writer.uint32(/* id 6, wireType 2 =*/50).string(message.shards[i]); return writer; }; @@ -184710,6 +185981,12 @@ export const vtctldata = $root.vtctldata = (() => { message.include_vschema = reader.bool(); break; } + case 6: { + if (!(message.shards && message.shards.length)) + message.shards = []; + message.shards.push(reader.string()); + break; + } default: reader.skipType(tag & 7); break; @@ -184764,6 +186041,13 @@ export const vtctldata = $root.vtctldata = (() => { if (message.include_vschema != null && message.hasOwnProperty("include_vschema")) if (typeof message.include_vschema !== "boolean") return "include_vschema: boolean expected"; + if (message.shards != null && message.hasOwnProperty("shards")) { + if (!Array.isArray(message.shards)) + return "shards: array expected"; + for (let i = 0; i < message.shards.length; ++i) + if (!$util.isString(message.shards[i])) + return "shards: string[] expected"; + } return null; }; @@ -184794,6 +186078,13 @@ export const vtctldata = $root.vtctldata = (() => { message.skip_no_primary = Boolean(object.skip_no_primary); if (object.include_vschema != null) message.include_vschema = Boolean(object.include_vschema); + if (object.shards) { + if (!Array.isArray(object.shards)) + throw TypeError(".vtctldata.ValidateSchemaKeyspaceRequest.shards: array expected"); + message.shards = []; + for (let i = 0; i < object.shards.length; ++i) + message.shards[i] = String(object.shards[i]); + } return message; }; @@ -184810,8 +186101,10 @@ export const vtctldata = $root.vtctldata = (() => { if (!options) options = {}; let object = {}; - if (options.arrays || options.defaults) + if (options.arrays || options.defaults) { object.exclude_tables = []; + object.shards = []; + } if (options.defaults) { object.keyspace = ""; object.include_views = false; @@ -184831,6 +186124,11 @@ export const vtctldata = $root.vtctldata = (() => { object.skip_no_primary = message.skip_no_primary; if (message.include_vschema != null && message.hasOwnProperty("include_vschema")) object.include_vschema = message.include_vschema; + if (message.shards && message.shards.length) { + object.shards = []; + for (let j = 0; j < message.shards.length; ++j) + object.shards[j] = message.shards[j]; + } return object; };