diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..af61c5c
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,11 @@
+#### Which issue(s) this PR fixes:
+<!--
+Use `Issue #<issue number>` or `Issue longhorn/longhorn#<issue number>` or `Issue (paste link of issue)`. DON'T use `Fixes #<issue number>` or `Fixes (paste link of issue)`, as it will automatically close the linked issue when the PR is merged.
+-->
+Issue #
+
+#### What this PR does / why we need it:
+
+#### Special notes for your reviewer:
+
+#### Additional documentation or context
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
new file mode 100644
index 0000000..da1d45b
--- /dev/null
+++ b/.github/workflows/build.yaml
@@ -0,0 +1,20 @@
+name: build
+on:
+  push:
+    branches:
+    - main
+  pull_request:
+jobs:
+  build:
+    name: Build images
+    runs-on: ubuntu-latest
+    container:
+      image: rancher/dapper:v0.6.0
+    steps:
+    # Git is not in Dapper container image. Add it manually for dirty check.
+    - name: Add Git
+      run: apk add -U git
+    - name: Checkout code
+      uses: actions/checkout@v4
+    - name: Run dapper ci
+      run: dapper ci
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9598e2b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,26 @@
+/.dapper
+/.trash-cache
+/bin
+*.pyc
+*.pyo
+*.swp
+.python-version
+
+integration/.tox/
+integration/.venv/
+integration/MANIFEST
+
+# Test binary, build with `go test -c`
+*.test
+
+# Output of the go coverage tool, specifically when used with LiteIDE
+*.out
+
+# ignores all goland project folders and files
+.idea/
+*.iml
+*.ipr
+
+# build folders
+.pyprotobuild/
+.goprotobuild/
diff --git a/Dockerfile.dapper b/Dockerfile.dapper
new file mode 100644
index 0000000..79f563b
--- /dev/null
+++ b/Dockerfile.dapper
@@ -0,0 +1,90 @@
+FROM registry.suse.com/bci/bci-base:15.5
+
+ARG DAPPER_HOST_ARCH=amd64
+ARG http_proxy
+ARG https_proxy
+ENV HOST_ARCH=${DAPPER_HOST_ARCH} ARCH=${DAPPER_HOST_ARCH}
+ENV PROTOC_VER=24.3
+ENV PROTOBUF_VER_PY=4.24.3
+ENV PROTOC_GEN_GO_VER=v1.31.0
+ENV PROTOC_GEN_GO_GRPC_VER=v1.3.0
+
+# Setup environment
+ENV PATH /go/bin:$PATH
+ENV DAPPER_DOCKER_SOCKET true
+ENV DAPPER_SOURCE /go/src/github.com/longhorn/types
+ENV DAPPER_OUTPUT ./pkg ./generated-py
+WORKDIR ${DAPPER_SOURCE}
+
+RUN zypper -n addrepo --refresh https://download.opensuse.org/repositories/system:/snappy/SLE_15/system:snappy.repo && \
+    zypper --gpg-auto-import-keys ref
+
+# Install packages
+RUN if [ ${ARCH} == "amd64" ]; then \
+    zypper -n install autoconf libtool libunwind-devel; \
+    fi
+
+# TODO: replace python311 with python3 if SLE upgrade system python version to python3.10+
+RUN zypper -n install wget git tar gzip unzip \
+    python311 python311-devel python311-pip && \
+    rm -rf rm -rf /var/cache/zypp/*
+
+# needed for ${!var} substitution
+RUN rm -f /bin/sh && ln -s /bin/bash /bin/sh
+
+RUN if [ ${ARCH} == "s390x" ]; then \
+    ln -s /usr/bin/gcc /usr/bin/s390x-linux-gnu-gcc;\
+    fi
+
+# Install Go
+ENV GOLANG_ARCH_amd64=amd64 GOLANG_ARCH_arm64=arm64 GOLANG_ARCH_s390x=s390x GOLANG_ARCH=GOLANG_ARCH_${ARCH} \
+    GOPATH=/go PATH=/go/bin:/usr/local/go/bin:${PATH} SHELL=/bin/bash
+RUN wget -O - https://storage.googleapis.com/golang/go1.21.7.linux-${!GOLANG_ARCH}.tar.gz | tar -xzf - -C /usr/local
+
+# protoc
+ENV PROTOC_amd64=https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VER}/protoc-${PROTOC_VER}-linux-x86_64.zip \
+    PROTOC_arm64=https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VER}/protoc-${PROTOC_VER}-linux-aarch_64.zip \
+    PROTOC_s390x=https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VER}/protoc-${PROTOC_VER}-linux-s390_64.zip \
+    PROTOC=PROTOC_${ARCH}
+
+RUN cd /usr/src && \
+    wget ${!PROTOC} -O protoc_${ARCH}.zip && \
+    unzip protoc_${ARCH}.zip -d /usr/local/
+
+# protoc-gen-go
+RUN mkdir -p /go/src/github.com && \
+    cd /go/src/github.com/ && \
+    mkdir protocolbuffers/ && \
+    cd protocolbuffers && \
+    git clone https://github.com/protocolbuffers/protobuf-go.git && \
+    cd protobuf-go && \
+    git checkout ${PROTOC_GEN_GO_VER} && \
+    cd cmd/protoc-gen-go && \
+    go build && \
+    cp protoc-gen-go /usr/local/bin
+
+# protoc-gen-go-grpc
+RUN cd /go/src/github.com/ && \
+    mkdir grpc/ && \
+    cd grpc && \
+    git clone https://github.com/grpc/grpc-go.git && \
+    cd grpc-go && \
+    git checkout cmd/protoc-gen-go-grpc/${PROTOC_GEN_GO_GRPC_VER} && \
+    cd cmd/protoc-gen-go-grpc && \
+    go build && \
+    cp protoc-gen-go-grpc /usr/local/bin
+
+# use python 3.11, so we can install latest grpcio
+RUN ln -sf /usr/bin/python3.11 /usr/bin/python3 & \
+    ln -sf /usr/bin/pip3.11 /usr/bin/pip3
+
+# python grpc-tools
+RUN if [ "${ARCH}" == "s390x" ]; then \
+    zypper -n in libopenssl-devel && \
+    GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=True pip3 install grpcio==1.58.0 grpcio_tools==1.58.0 protobuf==${PROTOBUF_VER_PY}; \
+    else \
+    pip3 install grpcio==1.58.0 grpcio_tools==1.58.0 protobuf==${PROTOBUF_VER_PY}; \
+    fi
+
+ENTRYPOINT ["./scripts/entry"]
+CMD ["ci"]
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f433b1a
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,177 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..78839b9
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,15 @@
+TARGETS := $(shell ls scripts)
+
+.dapper:
+	@echo Downloading dapper
+	@curl -sL https://releases.rancher.com/dapper/latest/dapper-`uname -s`-`uname -m` > .dapper.tmp
+	@@chmod +x .dapper.tmp
+	@./.dapper.tmp -v
+	@mv .dapper.tmp .dapper
+
+$(TARGETS): .dapper
+	./.dapper $@
+
+.DEFAULT_GOAL := ci
+
+.PHONY: $(TARGETS)
diff --git a/README.md b/README.md
index 2b40412..1c07764 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,14 @@
-# types
\ No newline at end of file
+# longhorn types
+
+## Dependencies
+
+* protoc 24.3
+* protoc-gen-go 1.31.0
+* protoc-gen-go-grpc 1.3.0
+* python protobuf 4.24.3
+
+## Generate protobuf files
+
+```
+make generate_grpc
+```
diff --git a/generated-py/bimrpc/bimrpc_pb2.py b/generated-py/bimrpc/bimrpc_pb2.py
new file mode 100644
index 0000000..866537a
--- /dev/null
+++ b/generated-py/bimrpc/bimrpc_pb2.py
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: bimrpc/bimrpc.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13\x62imrpc/bimrpc.proto\x12\x06\x62imrpc\x1a\x1bgoogle/protobuf/empty.proto\"c\n\x10\x42\x61\x63kingImageSpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04uuid\x18\x02 \x01(\t\x12\x0c\n\x04size\x18\x03 \x01(\x03\x12\x10\n\x08\x63hecksum\x18\x04 \x01(\t\x12\x13\n\x0bvirtualSize\x18\x05 \x01(\x03\"\x95\x01\n\x12\x42\x61\x63kingImageStatus\x12\r\n\x05state\x18\x01 \x01(\t\x12\x11\n\terror_msg\x18\x02 \x01(\t\x12\x19\n\x11sending_reference\x18\x03 \x01(\x05\x12\x1e\n\x16sender_manager_address\x18\x04 \x01(\t\x12\x10\n\x08progress\x18\x05 \x01(\x05\x12\x10\n\x08\x63hecksum\x18\x06 \x01(\t\"j\n\x14\x42\x61\x63kingImageResponse\x12&\n\x04spec\x18\x01 \x01(\x0b\x32\x18.bimrpc.BackingImageSpec\x12*\n\x06status\x18\x02 \x01(\x0b\x32\x1a.bimrpc.BackingImageStatus\"+\n\rDeleteRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04uuid\x18\x02 \x01(\t\"(\n\nGetRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04uuid\x18\x02 \x01(\t\"\xa3\x01\n\x0cListResponse\x12?\n\x0e\x62\x61\x63king_images\x18\x01 \x03(\x0b\x32\'.bimrpc.ListResponse.BackingImagesEntry\x1aR\n\x12\x42\x61\x63kingImagesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12+\n\x05value\x18\x02 \x01(\x0b\x32\x1c.bimrpc.BackingImageResponse:\x02\x38\x01\"\xa2\x01\n\x0fVersionResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x11\n\tgitCommit\x18\x02 \x01(\t\x12\x11\n\tbuildDate\x18\x03 \x01(\t\x12)\n!backing_image_manager_api_version\x18\x04 \x01(\x03\x12-\n%backing_image_manager_api_min_version\x18\x05 \x01(\x03\"K\n\x0bSyncRequest\x12&\n\x04spec\x18\x01 \x01(\x0b\x32\x18.bimrpc.BackingImageSpec\x12\x14\n\x0c\x66rom_address\x18\x02 \x01(\t\"=\n\x0bSendRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04uuid\x18\x02 \x01(\t\x12\x12\n\nto_address\x18\x03 \x01(\t\"S\n\x0c\x46\x65tchRequest\x12&\n\x04spec\x18\x01 \x01(\x0b\x32\x18.bimrpc.BackingImageSpec\x12\x1b\n\x13\x64\x61ta_source_address\x18\x02 \x01(\t\"4\n\x16PrepareDownloadRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04uuid\x18\x02 \x01(\t\"A\n\x17PrepareDownloadResponse\x12\x15\n\rsrc_file_path\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"\x94\x02\n\x13\x42\x61\x63kupCreateRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04uuid\x18\x02 \x01(\t\x12\x10\n\x08\x63hecksum\x18\x03 \x01(\t\x12\x15\n\rbackup_target\x18\x04 \x01(\t\x12\x0e\n\x06labels\x18\x05 \x03(\t\x12?\n\ncredential\x18\x06 \x03(\x0b\x32+.bimrpc.BackupCreateRequest.CredentialEntry\x12\x1a\n\x12\x63ompression_method\x18\x07 \x01(\t\x12\x18\n\x10\x63oncurrent_limit\x18\x08 \x01(\x05\x1a\x31\n\x0f\x43redentialEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"#\n\x13\x42\x61\x63kupStatusRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"Z\n\x14\x42\x61\x63kupStatusResponse\x12\x10\n\x08progress\x18\x01 \x01(\x05\x12\x12\n\nbackup_url\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12\r\n\x05state\x18\x04 \x01(\t2\xe3\x05\n\x1a\x42\x61\x63kingImageManagerService\x12\x39\n\x06\x44\x65lete\x12\x15.bimrpc.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x39\n\x03Get\x12\x12.bimrpc.GetRequest\x1a\x1c.bimrpc.BackingImageResponse\"\x00\x12\x36\n\x04List\x12\x16.google.protobuf.Empty\x1a\x14.bimrpc.ListResponse\"\x00\x12=\n\nVersionGet\x12\x16.google.protobuf.Empty\x1a\x17.bimrpc.VersionResponse\x12;\n\x04Sync\x12\x13.bimrpc.SyncRequest\x1a\x1c.bimrpc.BackingImageResponse\"\x00\x12\x35\n\x04Send\x12\x13.bimrpc.SendRequest\x1a\x16.google.protobuf.Empty\"\x00\x12=\n\x05\x46\x65tch\x12\x14.bimrpc.FetchRequest\x1a\x1c.bimrpc.BackingImageResponse\"\x00\x12T\n\x0fPrepareDownload\x12\x1e.bimrpc.PrepareDownloadRequest\x1a\x1f.bimrpc.PrepareDownloadResponse\"\x00\x12\x45\n\x0c\x42\x61\x63kupCreate\x12\x1b.bimrpc.BackupCreateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12K\n\x0c\x42\x61\x63kupStatus\x12\x1b.bimrpc.BackupStatusRequest\x1a\x1c.bimrpc.BackupStatusResponse\"\x00\x12;\n\x05Watch\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x00\x30\x01\x42\x30Z.github.com/longhorn/types/pkg/generated/bimrpcb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'bimrpc.bimrpc_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z.github.com/longhorn/types/pkg/generated/bimrpc'
+  _LISTRESPONSE_BACKINGIMAGESENTRY._options = None
+  _LISTRESPONSE_BACKINGIMAGESENTRY._serialized_options = b'8\001'
+  _BACKUPCREATEREQUEST_CREDENTIALENTRY._options = None
+  _BACKUPCREATEREQUEST_CREDENTIALENTRY._serialized_options = b'8\001'
+  _globals['_BACKINGIMAGESPEC']._serialized_start=60
+  _globals['_BACKINGIMAGESPEC']._serialized_end=159
+  _globals['_BACKINGIMAGESTATUS']._serialized_start=162
+  _globals['_BACKINGIMAGESTATUS']._serialized_end=311
+  _globals['_BACKINGIMAGERESPONSE']._serialized_start=313
+  _globals['_BACKINGIMAGERESPONSE']._serialized_end=419
+  _globals['_DELETEREQUEST']._serialized_start=421
+  _globals['_DELETEREQUEST']._serialized_end=464
+  _globals['_GETREQUEST']._serialized_start=466
+  _globals['_GETREQUEST']._serialized_end=506
+  _globals['_LISTRESPONSE']._serialized_start=509
+  _globals['_LISTRESPONSE']._serialized_end=672
+  _globals['_LISTRESPONSE_BACKINGIMAGESENTRY']._serialized_start=590
+  _globals['_LISTRESPONSE_BACKINGIMAGESENTRY']._serialized_end=672
+  _globals['_VERSIONRESPONSE']._serialized_start=675
+  _globals['_VERSIONRESPONSE']._serialized_end=837
+  _globals['_SYNCREQUEST']._serialized_start=839
+  _globals['_SYNCREQUEST']._serialized_end=914
+  _globals['_SENDREQUEST']._serialized_start=916
+  _globals['_SENDREQUEST']._serialized_end=977
+  _globals['_FETCHREQUEST']._serialized_start=979
+  _globals['_FETCHREQUEST']._serialized_end=1062
+  _globals['_PREPAREDOWNLOADREQUEST']._serialized_start=1064
+  _globals['_PREPAREDOWNLOADREQUEST']._serialized_end=1116
+  _globals['_PREPAREDOWNLOADRESPONSE']._serialized_start=1118
+  _globals['_PREPAREDOWNLOADRESPONSE']._serialized_end=1183
+  _globals['_BACKUPCREATEREQUEST']._serialized_start=1186
+  _globals['_BACKUPCREATEREQUEST']._serialized_end=1462
+  _globals['_BACKUPCREATEREQUEST_CREDENTIALENTRY']._serialized_start=1413
+  _globals['_BACKUPCREATEREQUEST_CREDENTIALENTRY']._serialized_end=1462
+  _globals['_BACKUPSTATUSREQUEST']._serialized_start=1464
+  _globals['_BACKUPSTATUSREQUEST']._serialized_end=1499
+  _globals['_BACKUPSTATUSRESPONSE']._serialized_start=1501
+  _globals['_BACKUPSTATUSRESPONSE']._serialized_end=1591
+  _globals['_BACKINGIMAGEMANAGERSERVICE']._serialized_start=1594
+  _globals['_BACKINGIMAGEMANAGERSERVICE']._serialized_end=2333
+# @@protoc_insertion_point(module_scope)
diff --git a/generated-py/bimrpc/bimrpc_pb2_grpc.py b/generated-py/bimrpc/bimrpc_pb2_grpc.py
new file mode 100644
index 0000000..ecfd1f6
--- /dev/null
+++ b/generated-py/bimrpc/bimrpc_pb2_grpc.py
@@ -0,0 +1,397 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from bimrpc import bimrpc_pb2 as bimrpc_dot_bimrpc__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+class BackingImageManagerServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Delete = channel.unary_unary(
+                '/bimrpc.BackingImageManagerService/Delete',
+                request_serializer=bimrpc_dot_bimrpc__pb2.DeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Get = channel.unary_unary(
+                '/bimrpc.BackingImageManagerService/Get',
+                request_serializer=bimrpc_dot_bimrpc__pb2.GetRequest.SerializeToString,
+                response_deserializer=bimrpc_dot_bimrpc__pb2.BackingImageResponse.FromString,
+                )
+        self.List = channel.unary_unary(
+                '/bimrpc.BackingImageManagerService/List',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=bimrpc_dot_bimrpc__pb2.ListResponse.FromString,
+                )
+        self.VersionGet = channel.unary_unary(
+                '/bimrpc.BackingImageManagerService/VersionGet',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=bimrpc_dot_bimrpc__pb2.VersionResponse.FromString,
+                )
+        self.Sync = channel.unary_unary(
+                '/bimrpc.BackingImageManagerService/Sync',
+                request_serializer=bimrpc_dot_bimrpc__pb2.SyncRequest.SerializeToString,
+                response_deserializer=bimrpc_dot_bimrpc__pb2.BackingImageResponse.FromString,
+                )
+        self.Send = channel.unary_unary(
+                '/bimrpc.BackingImageManagerService/Send',
+                request_serializer=bimrpc_dot_bimrpc__pb2.SendRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Fetch = channel.unary_unary(
+                '/bimrpc.BackingImageManagerService/Fetch',
+                request_serializer=bimrpc_dot_bimrpc__pb2.FetchRequest.SerializeToString,
+                response_deserializer=bimrpc_dot_bimrpc__pb2.BackingImageResponse.FromString,
+                )
+        self.PrepareDownload = channel.unary_unary(
+                '/bimrpc.BackingImageManagerService/PrepareDownload',
+                request_serializer=bimrpc_dot_bimrpc__pb2.PrepareDownloadRequest.SerializeToString,
+                response_deserializer=bimrpc_dot_bimrpc__pb2.PrepareDownloadResponse.FromString,
+                )
+        self.BackupCreate = channel.unary_unary(
+                '/bimrpc.BackingImageManagerService/BackupCreate',
+                request_serializer=bimrpc_dot_bimrpc__pb2.BackupCreateRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.BackupStatus = channel.unary_unary(
+                '/bimrpc.BackingImageManagerService/BackupStatus',
+                request_serializer=bimrpc_dot_bimrpc__pb2.BackupStatusRequest.SerializeToString,
+                response_deserializer=bimrpc_dot_bimrpc__pb2.BackupStatusResponse.FromString,
+                )
+        self.Watch = channel.unary_stream(
+                '/bimrpc.BackingImageManagerService/Watch',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class BackingImageManagerServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Delete(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Get(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def List(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VersionGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Sync(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Send(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Fetch(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def PrepareDownload(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def BackupCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def BackupStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Watch(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_BackingImageManagerServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Delete': grpc.unary_unary_rpc_method_handler(
+                    servicer.Delete,
+                    request_deserializer=bimrpc_dot_bimrpc__pb2.DeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=bimrpc_dot_bimrpc__pb2.GetRequest.FromString,
+                    response_serializer=bimrpc_dot_bimrpc__pb2.BackingImageResponse.SerializeToString,
+            ),
+            'List': grpc.unary_unary_rpc_method_handler(
+                    servicer.List,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=bimrpc_dot_bimrpc__pb2.ListResponse.SerializeToString,
+            ),
+            'VersionGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.VersionGet,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=bimrpc_dot_bimrpc__pb2.VersionResponse.SerializeToString,
+            ),
+            'Sync': grpc.unary_unary_rpc_method_handler(
+                    servicer.Sync,
+                    request_deserializer=bimrpc_dot_bimrpc__pb2.SyncRequest.FromString,
+                    response_serializer=bimrpc_dot_bimrpc__pb2.BackingImageResponse.SerializeToString,
+            ),
+            'Send': grpc.unary_unary_rpc_method_handler(
+                    servicer.Send,
+                    request_deserializer=bimrpc_dot_bimrpc__pb2.SendRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Fetch': grpc.unary_unary_rpc_method_handler(
+                    servicer.Fetch,
+                    request_deserializer=bimrpc_dot_bimrpc__pb2.FetchRequest.FromString,
+                    response_serializer=bimrpc_dot_bimrpc__pb2.BackingImageResponse.SerializeToString,
+            ),
+            'PrepareDownload': grpc.unary_unary_rpc_method_handler(
+                    servicer.PrepareDownload,
+                    request_deserializer=bimrpc_dot_bimrpc__pb2.PrepareDownloadRequest.FromString,
+                    response_serializer=bimrpc_dot_bimrpc__pb2.PrepareDownloadResponse.SerializeToString,
+            ),
+            'BackupCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.BackupCreate,
+                    request_deserializer=bimrpc_dot_bimrpc__pb2.BackupCreateRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'BackupStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.BackupStatus,
+                    request_deserializer=bimrpc_dot_bimrpc__pb2.BackupStatusRequest.FromString,
+                    response_serializer=bimrpc_dot_bimrpc__pb2.BackupStatusResponse.SerializeToString,
+            ),
+            'Watch': grpc.unary_stream_rpc_method_handler(
+                    servicer.Watch,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'bimrpc.BackingImageManagerService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class BackingImageManagerService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def Delete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bimrpc.BackingImageManagerService/Delete',
+            bimrpc_dot_bimrpc__pb2.DeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Get(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bimrpc.BackingImageManagerService/Get',
+            bimrpc_dot_bimrpc__pb2.GetRequest.SerializeToString,
+            bimrpc_dot_bimrpc__pb2.BackingImageResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def List(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bimrpc.BackingImageManagerService/List',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            bimrpc_dot_bimrpc__pb2.ListResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VersionGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bimrpc.BackingImageManagerService/VersionGet',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            bimrpc_dot_bimrpc__pb2.VersionResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Sync(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bimrpc.BackingImageManagerService/Sync',
+            bimrpc_dot_bimrpc__pb2.SyncRequest.SerializeToString,
+            bimrpc_dot_bimrpc__pb2.BackingImageResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Send(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bimrpc.BackingImageManagerService/Send',
+            bimrpc_dot_bimrpc__pb2.SendRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Fetch(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bimrpc.BackingImageManagerService/Fetch',
+            bimrpc_dot_bimrpc__pb2.FetchRequest.SerializeToString,
+            bimrpc_dot_bimrpc__pb2.BackingImageResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def PrepareDownload(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bimrpc.BackingImageManagerService/PrepareDownload',
+            bimrpc_dot_bimrpc__pb2.PrepareDownloadRequest.SerializeToString,
+            bimrpc_dot_bimrpc__pb2.PrepareDownloadResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def BackupCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bimrpc.BackingImageManagerService/BackupCreate',
+            bimrpc_dot_bimrpc__pb2.BackupCreateRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def BackupStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bimrpc.BackingImageManagerService/BackupStatus',
+            bimrpc_dot_bimrpc__pb2.BackupStatusRequest.SerializeToString,
+            bimrpc_dot_bimrpc__pb2.BackupStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Watch(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/bimrpc.BackingImageManagerService/Watch',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/generated-py/imrpc/common_pb2.py b/generated-py/imrpc/common_pb2.py
new file mode 100644
index 0000000..9052a01
--- /dev/null
+++ b/generated-py/imrpc/common_pb2.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: imrpc/common.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12imrpc/common.proto\x12\x05imrpc*$\n\x12\x42\x61\x63kendStoreDriver\x12\x06\n\x02v1\x10\x00\x12\x06\n\x02v2\x10\x01*4\n\nDataEngine\x12\x12\n\x0e\x44\x41TA_ENGINE_V1\x10\x00\x12\x12\n\x0e\x44\x41TA_ENGINE_V2\x10\x01\x42/Z-github.com/longhorn/types/pkg/generated/imrpcb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'imrpc.common_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z-github.com/longhorn/types/pkg/generated/imrpc'
+  _globals['_BACKENDSTOREDRIVER']._serialized_start=29
+  _globals['_BACKENDSTOREDRIVER']._serialized_end=65
+  _globals['_DATAENGINE']._serialized_start=67
+  _globals['_DATAENGINE']._serialized_end=119
+# @@protoc_insertion_point(module_scope)
diff --git a/generated-py/imrpc/common_pb2_grpc.py b/generated-py/imrpc/common_pb2_grpc.py
new file mode 100644
index 0000000..2daafff
--- /dev/null
+++ b/generated-py/imrpc/common_pb2_grpc.py
@@ -0,0 +1,4 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
diff --git a/generated-py/imrpc/disk_pb2.py b/generated-py/imrpc/disk_pb2.py
new file mode 100644
index 0000000..dbd7089
--- /dev/null
+++ b/generated-py/imrpc/disk_pb2.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: imrpc/disk.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10imrpc/disk.proto\x12\x05imrpc\x1a\x1bgoogle/protobuf/empty.proto\"\xd6\x01\n\x04\x44isk\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04uuid\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\t\x12\x12\n\ntotal_size\x18\x05 \x01(\x03\x12\x11\n\tfree_size\x18\x06 \x01(\x03\x12\x14\n\x0ctotal_blocks\x18\x07 \x01(\x03\x12\x13\n\x0b\x66ree_blocks\x18\x08 \x01(\x03\x12\x12\n\nblock_size\x18\t \x01(\x03\x12\x14\n\x0c\x63luster_size\x18\n \x01(\x03\x12\x0e\n\x06\x64river\x18\x0b \x01(\t\x12\x0c\n\x04name\x18\x0c \x01(\t\"{\n\x0fReplicaInstance\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04uuid\x18\x02 \x01(\t\x12\x11\n\tdisk_name\x18\x03 \x01(\t\x12\x11\n\tdisk_uuid\x18\x04 \x01(\t\x12\x11\n\tspec_size\x18\x05 \x01(\x04\x12\x13\n\x0b\x61\x63tual_size\x18\x06 \x01(\x04\"\x99\x01\n\x11\x44iskCreateRequest\x12\"\n\tdisk_type\x18\x01 \x01(\x0e\x32\x0f.imrpc.DiskType\x12\x11\n\tdisk_name\x18\x02 \x01(\t\x12\x11\n\tdisk_uuid\x18\x03 \x01(\t\x12\x11\n\tdisk_path\x18\x04 \x01(\t\x12\x12\n\nblock_size\x18\x05 \x01(\x03\x12\x13\n\x0b\x64isk_driver\x18\x06 \x01(\t\"o\n\x0e\x44iskGetRequest\x12\"\n\tdisk_type\x18\x01 \x01(\x0e\x32\x0f.imrpc.DiskType\x12\x11\n\tdisk_name\x18\x02 \x01(\t\x12\x11\n\tdisk_path\x18\x03 \x01(\t\x12\x13\n\x0b\x64isk_driver\x18\x04 \x01(\t\"\x85\x01\n\x11\x44iskDeleteRequest\x12\"\n\tdisk_type\x18\x01 \x01(\x0e\x32\x0f.imrpc.DiskType\x12\x11\n\tdisk_name\x18\x02 \x01(\t\x12\x11\n\tdisk_uuid\x18\x03 \x01(\t\x12\x11\n\tdisk_path\x18\x04 \x01(\t\x12\x13\n\x0b\x64isk_driver\x18\x05 \x01(\t\"l\n\x1e\x44iskReplicaInstanceListRequest\x12\"\n\tdisk_type\x18\x01 \x01(\x0e\x32\x0f.imrpc.DiskType\x12\x11\n\tdisk_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64isk_driver\x18\x03 \x01(\t\"\xcb\x01\n\x1f\x44iskReplicaInstanceListResponse\x12W\n\x11replica_instances\x18\x01 \x03(\x0b\x32<.imrpc.DiskReplicaInstanceListResponse.ReplicaInstancesEntry\x1aO\n\x15ReplicaInstancesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.imrpc.ReplicaInstance:\x02\x38\x01\"\xa0\x01\n DiskReplicaInstanceDeleteRequest\x12\"\n\tdisk_type\x18\x01 \x01(\x0e\x32\x0f.imrpc.DiskType\x12\x11\n\tdisk_name\x18\x02 \x01(\t\x12\x11\n\tdisk_uuid\x18\x03 \x01(\t\x12\x1d\n\x15replcia_instance_name\x18\x04 \x01(\t\x12\x13\n\x0b\x64isk_driver\x18\x05 \x01(\t\"\xab\x01\n\x13\x44iskVersionResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x11\n\tgitCommit\x18\x02 \x01(\t\x12\x11\n\tbuildDate\x18\x03 \x01(\t\x12,\n$instanceManagerDiskServiceAPIVersion\x18\x04 \x01(\x03\x12/\n\'instanceManagerDiskServiceAPIMinVersion\x18\x05 \x01(\x03*%\n\x08\x44iskType\x12\x0e\n\nfilesystem\x10\x00\x12\t\n\x05\x62lock\x10\x01\x32\xbb\x03\n\x0b\x44iskService\x12\x33\n\nDiskCreate\x12\x18.imrpc.DiskCreateRequest\x1a\x0b.imrpc.Disk\x12>\n\nDiskDelete\x12\x18.imrpc.DiskDeleteRequest\x1a\x16.google.protobuf.Empty\x12-\n\x07\x44iskGet\x12\x15.imrpc.DiskGetRequest\x1a\x0b.imrpc.Disk\x12h\n\x17\x44iskReplicaInstanceList\x12%.imrpc.DiskReplicaInstanceListRequest\x1a&.imrpc.DiskReplicaInstanceListResponse\x12\\\n\x19\x44iskReplicaInstanceDelete\x12\'.imrpc.DiskReplicaInstanceDeleteRequest\x1a\x16.google.protobuf.Empty\x12@\n\nVersionGet\x12\x16.google.protobuf.Empty\x1a\x1a.imrpc.DiskVersionResponseB/Z-github.com/longhorn/types/pkg/generated/imrpcb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'imrpc.disk_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z-github.com/longhorn/types/pkg/generated/imrpc'
+  _DISKREPLICAINSTANCELISTRESPONSE_REPLICAINSTANCESENTRY._options = None
+  _DISKREPLICAINSTANCELISTRESPONSE_REPLICAINSTANCESENTRY._serialized_options = b'8\001'
+  _globals['_DISKTYPE']._serialized_start=1456
+  _globals['_DISKTYPE']._serialized_end=1493
+  _globals['_DISK']._serialized_start=57
+  _globals['_DISK']._serialized_end=271
+  _globals['_REPLICAINSTANCE']._serialized_start=273
+  _globals['_REPLICAINSTANCE']._serialized_end=396
+  _globals['_DISKCREATEREQUEST']._serialized_start=399
+  _globals['_DISKCREATEREQUEST']._serialized_end=552
+  _globals['_DISKGETREQUEST']._serialized_start=554
+  _globals['_DISKGETREQUEST']._serialized_end=665
+  _globals['_DISKDELETEREQUEST']._serialized_start=668
+  _globals['_DISKDELETEREQUEST']._serialized_end=801
+  _globals['_DISKREPLICAINSTANCELISTREQUEST']._serialized_start=803
+  _globals['_DISKREPLICAINSTANCELISTREQUEST']._serialized_end=911
+  _globals['_DISKREPLICAINSTANCELISTRESPONSE']._serialized_start=914
+  _globals['_DISKREPLICAINSTANCELISTRESPONSE']._serialized_end=1117
+  _globals['_DISKREPLICAINSTANCELISTRESPONSE_REPLICAINSTANCESENTRY']._serialized_start=1038
+  _globals['_DISKREPLICAINSTANCELISTRESPONSE_REPLICAINSTANCESENTRY']._serialized_end=1117
+  _globals['_DISKREPLICAINSTANCEDELETEREQUEST']._serialized_start=1120
+  _globals['_DISKREPLICAINSTANCEDELETEREQUEST']._serialized_end=1280
+  _globals['_DISKVERSIONRESPONSE']._serialized_start=1283
+  _globals['_DISKVERSIONRESPONSE']._serialized_end=1454
+  _globals['_DISKSERVICE']._serialized_start=1496
+  _globals['_DISKSERVICE']._serialized_end=1939
+# @@protoc_insertion_point(module_scope)
diff --git a/generated-py/imrpc/disk_pb2_grpc.py b/generated-py/imrpc/disk_pb2_grpc.py
new file mode 100644
index 0000000..de127bc
--- /dev/null
+++ b/generated-py/imrpc/disk_pb2_grpc.py
@@ -0,0 +1,232 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from imrpc import disk_pb2 as imrpc_dot_disk__pb2
+
+
+class DiskServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.DiskCreate = channel.unary_unary(
+                '/imrpc.DiskService/DiskCreate',
+                request_serializer=imrpc_dot_disk__pb2.DiskCreateRequest.SerializeToString,
+                response_deserializer=imrpc_dot_disk__pb2.Disk.FromString,
+                )
+        self.DiskDelete = channel.unary_unary(
+                '/imrpc.DiskService/DiskDelete',
+                request_serializer=imrpc_dot_disk__pb2.DiskDeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.DiskGet = channel.unary_unary(
+                '/imrpc.DiskService/DiskGet',
+                request_serializer=imrpc_dot_disk__pb2.DiskGetRequest.SerializeToString,
+                response_deserializer=imrpc_dot_disk__pb2.Disk.FromString,
+                )
+        self.DiskReplicaInstanceList = channel.unary_unary(
+                '/imrpc.DiskService/DiskReplicaInstanceList',
+                request_serializer=imrpc_dot_disk__pb2.DiskReplicaInstanceListRequest.SerializeToString,
+                response_deserializer=imrpc_dot_disk__pb2.DiskReplicaInstanceListResponse.FromString,
+                )
+        self.DiskReplicaInstanceDelete = channel.unary_unary(
+                '/imrpc.DiskService/DiskReplicaInstanceDelete',
+                request_serializer=imrpc_dot_disk__pb2.DiskReplicaInstanceDeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.VersionGet = channel.unary_unary(
+                '/imrpc.DiskService/VersionGet',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=imrpc_dot_disk__pb2.DiskVersionResponse.FromString,
+                )
+
+
+class DiskServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def DiskCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DiskDelete(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DiskGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DiskReplicaInstanceList(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DiskReplicaInstanceDelete(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VersionGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_DiskServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'DiskCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.DiskCreate,
+                    request_deserializer=imrpc_dot_disk__pb2.DiskCreateRequest.FromString,
+                    response_serializer=imrpc_dot_disk__pb2.Disk.SerializeToString,
+            ),
+            'DiskDelete': grpc.unary_unary_rpc_method_handler(
+                    servicer.DiskDelete,
+                    request_deserializer=imrpc_dot_disk__pb2.DiskDeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'DiskGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.DiskGet,
+                    request_deserializer=imrpc_dot_disk__pb2.DiskGetRequest.FromString,
+                    response_serializer=imrpc_dot_disk__pb2.Disk.SerializeToString,
+            ),
+            'DiskReplicaInstanceList': grpc.unary_unary_rpc_method_handler(
+                    servicer.DiskReplicaInstanceList,
+                    request_deserializer=imrpc_dot_disk__pb2.DiskReplicaInstanceListRequest.FromString,
+                    response_serializer=imrpc_dot_disk__pb2.DiskReplicaInstanceListResponse.SerializeToString,
+            ),
+            'DiskReplicaInstanceDelete': grpc.unary_unary_rpc_method_handler(
+                    servicer.DiskReplicaInstanceDelete,
+                    request_deserializer=imrpc_dot_disk__pb2.DiskReplicaInstanceDeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'VersionGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.VersionGet,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=imrpc_dot_disk__pb2.DiskVersionResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'imrpc.DiskService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class DiskService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def DiskCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.DiskService/DiskCreate',
+            imrpc_dot_disk__pb2.DiskCreateRequest.SerializeToString,
+            imrpc_dot_disk__pb2.Disk.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DiskDelete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.DiskService/DiskDelete',
+            imrpc_dot_disk__pb2.DiskDeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DiskGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.DiskService/DiskGet',
+            imrpc_dot_disk__pb2.DiskGetRequest.SerializeToString,
+            imrpc_dot_disk__pb2.Disk.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DiskReplicaInstanceList(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.DiskService/DiskReplicaInstanceList',
+            imrpc_dot_disk__pb2.DiskReplicaInstanceListRequest.SerializeToString,
+            imrpc_dot_disk__pb2.DiskReplicaInstanceListResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DiskReplicaInstanceDelete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.DiskService/DiskReplicaInstanceDelete',
+            imrpc_dot_disk__pb2.DiskReplicaInstanceDeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VersionGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.DiskService/VersionGet',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            imrpc_dot_disk__pb2.DiskVersionResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/generated-py/imrpc/imrpc_pb2.py b/generated-py/imrpc/imrpc_pb2.py
new file mode 100644
index 0000000..fe7ccd2
--- /dev/null
+++ b/generated-py/imrpc/imrpc_pb2.py
@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: imrpc/imrpc.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11imrpc/imrpc.proto\x1a\x1bgoogle/protobuf/empty.proto\"`\n\x0bProcessSpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x62inary\x18\x02 \x01(\t\x12\x0c\n\x04\x61rgs\x18\x03 \x03(\t\x12\x12\n\nport_count\x18\x04 \x01(\x05\x12\x11\n\tport_args\x18\x05 \x03(\t\"\xbe\x01\n\rProcessStatus\x12\r\n\x05state\x18\x01 \x01(\t\x12\x11\n\terror_msg\x18\x02 \x01(\t\x12\x12\n\nport_start\x18\x03 \x01(\x05\x12\x10\n\x08port_end\x18\x04 \x01(\x05\x12\x32\n\nconditions\x18\x05 \x03(\x0b\x32\x1e.ProcessStatus.ConditionsEntry\x1a\x31\n\x0f\x43onditionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\"2\n\x14ProcessCreateRequest\x12\x1a\n\x04spec\x18\x01 \x01(\x0b\x32\x0c.ProcessSpec\"$\n\x14ProcessDeleteRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"!\n\x11ProcessGetRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"^\n\x0fProcessResponse\x12\x1a\n\x04spec\x18\x01 \x01(\x0b\x32\x0c.ProcessSpec\x12\x1e\n\x06status\x18\x02 \x01(\x0b\x32\x0e.ProcessStatus\x12\x0f\n\x07\x64\x65leted\x18\x03 \x01(\x08\"\x14\n\x12ProcessListRequest\"\x91\x01\n\x13ProcessListResponse\x12\x36\n\tprocesses\x18\x01 \x03(\x0b\x32#.ProcessListResponse.ProcessesEntry\x1a\x42\n\x0eProcessesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.ProcessResponse:\x02\x38\x01\"\x1a\n\nLogRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"M\n\x15ProcessReplaceRequest\x12\x1a\n\x04spec\x18\x01 \x01(\x0b\x32\x0c.ProcessSpec\x12\x18\n\x10terminate_signal\x18\x02 \x01(\t\"\x1b\n\x0bLogResponse\x12\x0c\n\x04line\x18\x02 \x01(\t\"\xe4\x01\n\x0fVersionResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x11\n\tgitCommit\x18\x02 \x01(\t\x12\x11\n\tbuildDate\x18\x03 \x01(\t\x12!\n\x19instanceManagerAPIVersion\x18\x04 \x01(\x03\x12$\n\x1cinstanceManagerAPIMinVersion\x18\x05 \x01(\x03\x12&\n\x1einstanceManagerProxyAPIVersion\x18\x06 \x01(\x03\x12)\n!instanceManagerProxyAPIMinVersion\x18\x07 \x01(\x03\x32\xe2\x03\n\x15ProcessManagerService\x12:\n\rProcessCreate\x12\x15.ProcessCreateRequest\x1a\x10.ProcessResponse\"\x00\x12:\n\rProcessDelete\x12\x15.ProcessDeleteRequest\x1a\x10.ProcessResponse\"\x00\x12\x34\n\nProcessGet\x12\x12.ProcessGetRequest\x1a\x10.ProcessResponse\"\x00\x12:\n\x0bProcessList\x12\x13.ProcessListRequest\x1a\x14.ProcessListResponse\"\x00\x12+\n\nProcessLog\x12\x0b.LogRequest\x1a\x0c.LogResponse\"\x00\x30\x01\x12<\n\x0cProcessWatch\x12\x16.google.protobuf.Empty\x1a\x10.ProcessResponse\"\x00\x30\x01\x12<\n\x0eProcessReplace\x12\x16.ProcessReplaceRequest\x1a\x10.ProcessResponse\"\x00\x12\x36\n\nVersionGet\x12\x16.google.protobuf.Empty\x1a\x10.VersionResponseB/Z-github.com/longhorn/types/pkg/generated/imrpcb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'imrpc.imrpc_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z-github.com/longhorn/types/pkg/generated/imrpc'
+  _PROCESSSTATUS_CONDITIONSENTRY._options = None
+  _PROCESSSTATUS_CONDITIONSENTRY._serialized_options = b'8\001'
+  _PROCESSLISTRESPONSE_PROCESSESENTRY._options = None
+  _PROCESSLISTRESPONSE_PROCESSESENTRY._serialized_options = b'8\001'
+  _globals['_PROCESSSPEC']._serialized_start=50
+  _globals['_PROCESSSPEC']._serialized_end=146
+  _globals['_PROCESSSTATUS']._serialized_start=149
+  _globals['_PROCESSSTATUS']._serialized_end=339
+  _globals['_PROCESSSTATUS_CONDITIONSENTRY']._serialized_start=290
+  _globals['_PROCESSSTATUS_CONDITIONSENTRY']._serialized_end=339
+  _globals['_PROCESSCREATEREQUEST']._serialized_start=341
+  _globals['_PROCESSCREATEREQUEST']._serialized_end=391
+  _globals['_PROCESSDELETEREQUEST']._serialized_start=393
+  _globals['_PROCESSDELETEREQUEST']._serialized_end=429
+  _globals['_PROCESSGETREQUEST']._serialized_start=431
+  _globals['_PROCESSGETREQUEST']._serialized_end=464
+  _globals['_PROCESSRESPONSE']._serialized_start=466
+  _globals['_PROCESSRESPONSE']._serialized_end=560
+  _globals['_PROCESSLISTREQUEST']._serialized_start=562
+  _globals['_PROCESSLISTREQUEST']._serialized_end=582
+  _globals['_PROCESSLISTRESPONSE']._serialized_start=585
+  _globals['_PROCESSLISTRESPONSE']._serialized_end=730
+  _globals['_PROCESSLISTRESPONSE_PROCESSESENTRY']._serialized_start=664
+  _globals['_PROCESSLISTRESPONSE_PROCESSESENTRY']._serialized_end=730
+  _globals['_LOGREQUEST']._serialized_start=732
+  _globals['_LOGREQUEST']._serialized_end=758
+  _globals['_PROCESSREPLACEREQUEST']._serialized_start=760
+  _globals['_PROCESSREPLACEREQUEST']._serialized_end=837
+  _globals['_LOGRESPONSE']._serialized_start=839
+  _globals['_LOGRESPONSE']._serialized_end=866
+  _globals['_VERSIONRESPONSE']._serialized_start=869
+  _globals['_VERSIONRESPONSE']._serialized_end=1097
+  _globals['_PROCESSMANAGERSERVICE']._serialized_start=1100
+  _globals['_PROCESSMANAGERSERVICE']._serialized_end=1582
+# @@protoc_insertion_point(module_scope)
diff --git a/generated-py/imrpc/imrpc_pb2_grpc.py b/generated-py/imrpc/imrpc_pb2_grpc.py
new file mode 100644
index 0000000..a8ed9b9
--- /dev/null
+++ b/generated-py/imrpc/imrpc_pb2_grpc.py
@@ -0,0 +1,298 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from imrpc import imrpc_pb2 as imrpc_dot_imrpc__pb2
+
+
+class ProcessManagerServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.ProcessCreate = channel.unary_unary(
+                '/ProcessManagerService/ProcessCreate',
+                request_serializer=imrpc_dot_imrpc__pb2.ProcessCreateRequest.SerializeToString,
+                response_deserializer=imrpc_dot_imrpc__pb2.ProcessResponse.FromString,
+                )
+        self.ProcessDelete = channel.unary_unary(
+                '/ProcessManagerService/ProcessDelete',
+                request_serializer=imrpc_dot_imrpc__pb2.ProcessDeleteRequest.SerializeToString,
+                response_deserializer=imrpc_dot_imrpc__pb2.ProcessResponse.FromString,
+                )
+        self.ProcessGet = channel.unary_unary(
+                '/ProcessManagerService/ProcessGet',
+                request_serializer=imrpc_dot_imrpc__pb2.ProcessGetRequest.SerializeToString,
+                response_deserializer=imrpc_dot_imrpc__pb2.ProcessResponse.FromString,
+                )
+        self.ProcessList = channel.unary_unary(
+                '/ProcessManagerService/ProcessList',
+                request_serializer=imrpc_dot_imrpc__pb2.ProcessListRequest.SerializeToString,
+                response_deserializer=imrpc_dot_imrpc__pb2.ProcessListResponse.FromString,
+                )
+        self.ProcessLog = channel.unary_stream(
+                '/ProcessManagerService/ProcessLog',
+                request_serializer=imrpc_dot_imrpc__pb2.LogRequest.SerializeToString,
+                response_deserializer=imrpc_dot_imrpc__pb2.LogResponse.FromString,
+                )
+        self.ProcessWatch = channel.unary_stream(
+                '/ProcessManagerService/ProcessWatch',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=imrpc_dot_imrpc__pb2.ProcessResponse.FromString,
+                )
+        self.ProcessReplace = channel.unary_unary(
+                '/ProcessManagerService/ProcessReplace',
+                request_serializer=imrpc_dot_imrpc__pb2.ProcessReplaceRequest.SerializeToString,
+                response_deserializer=imrpc_dot_imrpc__pb2.ProcessResponse.FromString,
+                )
+        self.VersionGet = channel.unary_unary(
+                '/ProcessManagerService/VersionGet',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=imrpc_dot_imrpc__pb2.VersionResponse.FromString,
+                )
+
+
+class ProcessManagerServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def ProcessCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ProcessDelete(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ProcessGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ProcessList(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ProcessLog(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ProcessWatch(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ProcessReplace(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VersionGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ProcessManagerServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'ProcessCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.ProcessCreate,
+                    request_deserializer=imrpc_dot_imrpc__pb2.ProcessCreateRequest.FromString,
+                    response_serializer=imrpc_dot_imrpc__pb2.ProcessResponse.SerializeToString,
+            ),
+            'ProcessDelete': grpc.unary_unary_rpc_method_handler(
+                    servicer.ProcessDelete,
+                    request_deserializer=imrpc_dot_imrpc__pb2.ProcessDeleteRequest.FromString,
+                    response_serializer=imrpc_dot_imrpc__pb2.ProcessResponse.SerializeToString,
+            ),
+            'ProcessGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.ProcessGet,
+                    request_deserializer=imrpc_dot_imrpc__pb2.ProcessGetRequest.FromString,
+                    response_serializer=imrpc_dot_imrpc__pb2.ProcessResponse.SerializeToString,
+            ),
+            'ProcessList': grpc.unary_unary_rpc_method_handler(
+                    servicer.ProcessList,
+                    request_deserializer=imrpc_dot_imrpc__pb2.ProcessListRequest.FromString,
+                    response_serializer=imrpc_dot_imrpc__pb2.ProcessListResponse.SerializeToString,
+            ),
+            'ProcessLog': grpc.unary_stream_rpc_method_handler(
+                    servicer.ProcessLog,
+                    request_deserializer=imrpc_dot_imrpc__pb2.LogRequest.FromString,
+                    response_serializer=imrpc_dot_imrpc__pb2.LogResponse.SerializeToString,
+            ),
+            'ProcessWatch': grpc.unary_stream_rpc_method_handler(
+                    servicer.ProcessWatch,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=imrpc_dot_imrpc__pb2.ProcessResponse.SerializeToString,
+            ),
+            'ProcessReplace': grpc.unary_unary_rpc_method_handler(
+                    servicer.ProcessReplace,
+                    request_deserializer=imrpc_dot_imrpc__pb2.ProcessReplaceRequest.FromString,
+                    response_serializer=imrpc_dot_imrpc__pb2.ProcessResponse.SerializeToString,
+            ),
+            'VersionGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.VersionGet,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=imrpc_dot_imrpc__pb2.VersionResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'ProcessManagerService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ProcessManagerService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def ProcessCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ProcessManagerService/ProcessCreate',
+            imrpc_dot_imrpc__pb2.ProcessCreateRequest.SerializeToString,
+            imrpc_dot_imrpc__pb2.ProcessResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ProcessDelete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ProcessManagerService/ProcessDelete',
+            imrpc_dot_imrpc__pb2.ProcessDeleteRequest.SerializeToString,
+            imrpc_dot_imrpc__pb2.ProcessResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ProcessGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ProcessManagerService/ProcessGet',
+            imrpc_dot_imrpc__pb2.ProcessGetRequest.SerializeToString,
+            imrpc_dot_imrpc__pb2.ProcessResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ProcessList(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ProcessManagerService/ProcessList',
+            imrpc_dot_imrpc__pb2.ProcessListRequest.SerializeToString,
+            imrpc_dot_imrpc__pb2.ProcessListResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ProcessLog(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/ProcessManagerService/ProcessLog',
+            imrpc_dot_imrpc__pb2.LogRequest.SerializeToString,
+            imrpc_dot_imrpc__pb2.LogResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ProcessWatch(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/ProcessManagerService/ProcessWatch',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            imrpc_dot_imrpc__pb2.ProcessResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ProcessReplace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ProcessManagerService/ProcessReplace',
+            imrpc_dot_imrpc__pb2.ProcessReplaceRequest.SerializeToString,
+            imrpc_dot_imrpc__pb2.ProcessResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VersionGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ProcessManagerService/VersionGet',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            imrpc_dot_imrpc__pb2.VersionResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/generated-py/imrpc/instance_pb2.py b/generated-py/imrpc/instance_pb2.py
new file mode 100644
index 0000000..5abbcce
--- /dev/null
+++ b/generated-py/imrpc/instance_pb2.py
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: imrpc/instance.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from imrpc import common_pb2 as imrpc_dot_common__pb2
+from imrpc import imrpc_pb2 as imrpc_dot_imrpc__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14imrpc/instance.proto\x12\x05imrpc\x1a\x1bgoogle/protobuf/empty.proto\x1a\x12imrpc/common.proto\x1a\x11imrpc/imrpc.proto\"3\n\x13ProcessInstanceSpec\x12\x0e\n\x06\x62inary\x18\x01 \x01(\t\x12\x0c\n\x04\x61rgs\x18\x02 \x03(\t\"\xf8\x01\n\x10SpdkInstanceSpec\x12K\n\x13replica_address_map\x18\x01 \x03(\x0b\x32..imrpc.SpdkInstanceSpec.ReplicaAddressMapEntry\x12\x11\n\tdisk_name\x18\x02 \x01(\t\x12\x11\n\tdisk_uuid\x18\x03 \x01(\t\x12\x0c\n\x04size\x18\x04 \x01(\x04\x12\x17\n\x0f\x65xpose_required\x18\x05 \x01(\x08\x12\x10\n\x08\x66rontend\x18\x06 \x01(\t\x1a\x38\n\x16ReplicaAddressMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xbb\x02\n\x0cInstanceSpec\x12;\n\x14\x62\x61\x63kend_store_driver\x18\x01 \x01(\x0e\x32\x19.imrpc.BackendStoreDriverB\x02\x18\x01\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x13\n\x0bvolume_name\x18\x04 \x01(\t\x12\x12\n\nport_count\x18\x05 \x01(\x05\x12\x11\n\tport_args\x18\x06 \x03(\t\x12\x39\n\x15process_instance_spec\x18\x07 \x01(\x0b\x32\x1a.imrpc.ProcessInstanceSpec\x12\x33\n\x12spdk_instance_spec\x18\x08 \x01(\x0b\x32\x17.imrpc.SpdkInstanceSpec\x12&\n\x0b\x64\x61ta_engine\x18\t \x01(\x0e\x32\x11.imrpc.DataEngine\"\xc6\x01\n\x0eInstanceStatus\x12\r\n\x05state\x18\x01 \x01(\t\x12\x11\n\terror_msg\x18\x02 \x01(\t\x12\x12\n\nport_start\x18\x03 \x01(\x05\x12\x10\n\x08port_end\x18\x04 \x01(\x05\x12\x39\n\nconditions\x18\x05 \x03(\x0b\x32%.imrpc.InstanceStatus.ConditionsEntry\x1a\x31\n\x0f\x43onditionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\":\n\x15InstanceCreateRequest\x12!\n\x04spec\x18\x01 \x01(\x0b\x32\x13.imrpc.InstanceSpec\"\xc5\x01\n\x15InstanceDeleteRequest\x12;\n\x14\x62\x61\x63kend_store_driver\x18\x01 \x01(\x0e\x32\x19.imrpc.BackendStoreDriverB\x02\x18\x01\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x11\n\tdisk_uuid\x18\x04 \x01(\t\x12\x18\n\x10\x63leanup_required\x18\x05 \x01(\x08\x12&\n\x0b\x64\x61ta_engine\x18\x06 \x01(\x0e\x32\x11.imrpc.DataEngine\"\x95\x01\n\x12InstanceGetRequest\x12;\n\x14\x62\x61\x63kend_store_driver\x18\x01 \x01(\x0e\x32\x19.imrpc.BackendStoreDriverB\x02\x18\x01\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12&\n\x0b\x64\x61ta_engine\x18\x04 \x01(\x0e\x32\x11.imrpc.DataEngine\"m\n\x10InstanceResponse\x12!\n\x04spec\x18\x01 \x01(\x0b\x32\x13.imrpc.InstanceSpec\x12%\n\x06status\x18\x02 \x01(\x0b\x32\x15.imrpc.InstanceStatus\x12\x0f\n\x07\x64\x65leted\x18\x03 \x01(\x08\"\xa0\x01\n\x14InstanceListResponse\x12=\n\tinstances\x18\x01 \x03(\x0b\x32*.imrpc.InstanceListResponse.InstancesEntry\x1aI\n\x0eInstancesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.imrpc.InstanceResponse:\x02\x38\x01\"\x95\x01\n\x12InstanceLogRequest\x12;\n\x14\x62\x61\x63kend_store_driver\x18\x01 \x01(\x0e\x32\x19.imrpc.BackendStoreDriverB\x02\x18\x01\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12&\n\x0b\x64\x61ta_engine\x18\x04 \x01(\x0e\x32\x11.imrpc.DataEngine\"U\n\x16InstanceReplaceRequest\x12!\n\x04spec\x18\x01 \x01(\x0b\x32\x13.imrpc.InstanceSpec\x12\x18\n\x10terminate_signal\x18\x02 \x01(\t\"K\n\x12LogSetLevelRequest\x12&\n\x0b\x64\x61ta_engine\x18\x01 \x01(\x0e\x32\x11.imrpc.DataEngine\x12\r\n\x05level\x18\x02 \x01(\t\"K\n\x12LogSetFlagsRequest\x12&\n\x0b\x64\x61ta_engine\x18\x01 \x01(\x0e\x32\x11.imrpc.DataEngine\x12\r\n\x05\x66lags\x18\x02 \x01(\t\"<\n\x12LogGetLevelRequest\x12&\n\x0b\x64\x61ta_engine\x18\x01 \x01(\x0e\x32\x11.imrpc.DataEngine\"$\n\x13LogGetLevelResponse\x12\r\n\x05level\x18\x01 \x01(\t\"<\n\x12LogGetFlagsRequest\x12&\n\x0b\x64\x61ta_engine\x18\x01 \x01(\x0e\x32\x11.imrpc.DataEngine\"$\n\x13LogGetFlagsResponse\x12\r\n\x05\x66lags\x18\x01 \x01(\t2\xc9\x06\n\x0fInstanceService\x12I\n\x0eInstanceCreate\x12\x1c.imrpc.InstanceCreateRequest\x1a\x17.imrpc.InstanceResponse\"\x00\x12I\n\x0eInstanceDelete\x12\x1c.imrpc.InstanceDeleteRequest\x1a\x17.imrpc.InstanceResponse\"\x00\x12\x43\n\x0bInstanceGet\x12\x19.imrpc.InstanceGetRequest\x1a\x17.imrpc.InstanceResponse\"\x00\x12\x45\n\x0cInstanceList\x12\x16.google.protobuf.Empty\x1a\x1b.imrpc.InstanceListResponse\"\x00\x12:\n\x0bInstanceLog\x12\x19.imrpc.InstanceLogRequest\x1a\x0c.LogResponse\"\x00\x30\x01\x12\x43\n\rInstanceWatch\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x00\x30\x01\x12K\n\x0fInstanceReplace\x12\x1d.imrpc.InstanceReplaceRequest\x1a\x17.imrpc.InstanceResponse\"\x00\x12@\n\x0bLogSetLevel\x12\x19.imrpc.LogSetLevelRequest\x1a\x16.google.protobuf.Empty\x12@\n\x0bLogSetFlags\x12\x19.imrpc.LogSetFlagsRequest\x1a\x16.google.protobuf.Empty\x12\x44\n\x0bLogGetLevel\x12\x19.imrpc.LogGetLevelRequest\x1a\x1a.imrpc.LogGetLevelResponse\x12\x44\n\x0bLogGetFlags\x12\x19.imrpc.LogGetFlagsRequest\x1a\x1a.imrpc.LogGetFlagsResponse\x12\x36\n\nVersionGet\x12\x16.google.protobuf.Empty\x1a\x10.VersionResponseB/Z-github.com/longhorn/types/pkg/generated/imrpcb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'imrpc.instance_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z-github.com/longhorn/types/pkg/generated/imrpc'
+  _SPDKINSTANCESPEC_REPLICAADDRESSMAPENTRY._options = None
+  _SPDKINSTANCESPEC_REPLICAADDRESSMAPENTRY._serialized_options = b'8\001'
+  _INSTANCESPEC.fields_by_name['backend_store_driver']._options = None
+  _INSTANCESPEC.fields_by_name['backend_store_driver']._serialized_options = b'\030\001'
+  _INSTANCESTATUS_CONDITIONSENTRY._options = None
+  _INSTANCESTATUS_CONDITIONSENTRY._serialized_options = b'8\001'
+  _INSTANCEDELETEREQUEST.fields_by_name['backend_store_driver']._options = None
+  _INSTANCEDELETEREQUEST.fields_by_name['backend_store_driver']._serialized_options = b'\030\001'
+  _INSTANCEGETREQUEST.fields_by_name['backend_store_driver']._options = None
+  _INSTANCEGETREQUEST.fields_by_name['backend_store_driver']._serialized_options = b'\030\001'
+  _INSTANCELISTRESPONSE_INSTANCESENTRY._options = None
+  _INSTANCELISTRESPONSE_INSTANCESENTRY._serialized_options = b'8\001'
+  _INSTANCELOGREQUEST.fields_by_name['backend_store_driver']._options = None
+  _INSTANCELOGREQUEST.fields_by_name['backend_store_driver']._serialized_options = b'\030\001'
+  _globals['_PROCESSINSTANCESPEC']._serialized_start=99
+  _globals['_PROCESSINSTANCESPEC']._serialized_end=150
+  _globals['_SPDKINSTANCESPEC']._serialized_start=153
+  _globals['_SPDKINSTANCESPEC']._serialized_end=401
+  _globals['_SPDKINSTANCESPEC_REPLICAADDRESSMAPENTRY']._serialized_start=345
+  _globals['_SPDKINSTANCESPEC_REPLICAADDRESSMAPENTRY']._serialized_end=401
+  _globals['_INSTANCESPEC']._serialized_start=404
+  _globals['_INSTANCESPEC']._serialized_end=719
+  _globals['_INSTANCESTATUS']._serialized_start=722
+  _globals['_INSTANCESTATUS']._serialized_end=920
+  _globals['_INSTANCESTATUS_CONDITIONSENTRY']._serialized_start=871
+  _globals['_INSTANCESTATUS_CONDITIONSENTRY']._serialized_end=920
+  _globals['_INSTANCECREATEREQUEST']._serialized_start=922
+  _globals['_INSTANCECREATEREQUEST']._serialized_end=980
+  _globals['_INSTANCEDELETEREQUEST']._serialized_start=983
+  _globals['_INSTANCEDELETEREQUEST']._serialized_end=1180
+  _globals['_INSTANCEGETREQUEST']._serialized_start=1183
+  _globals['_INSTANCEGETREQUEST']._serialized_end=1332
+  _globals['_INSTANCERESPONSE']._serialized_start=1334
+  _globals['_INSTANCERESPONSE']._serialized_end=1443
+  _globals['_INSTANCELISTRESPONSE']._serialized_start=1446
+  _globals['_INSTANCELISTRESPONSE']._serialized_end=1606
+  _globals['_INSTANCELISTRESPONSE_INSTANCESENTRY']._serialized_start=1533
+  _globals['_INSTANCELISTRESPONSE_INSTANCESENTRY']._serialized_end=1606
+  _globals['_INSTANCELOGREQUEST']._serialized_start=1609
+  _globals['_INSTANCELOGREQUEST']._serialized_end=1758
+  _globals['_INSTANCEREPLACEREQUEST']._serialized_start=1760
+  _globals['_INSTANCEREPLACEREQUEST']._serialized_end=1845
+  _globals['_LOGSETLEVELREQUEST']._serialized_start=1847
+  _globals['_LOGSETLEVELREQUEST']._serialized_end=1922
+  _globals['_LOGSETFLAGSREQUEST']._serialized_start=1924
+  _globals['_LOGSETFLAGSREQUEST']._serialized_end=1999
+  _globals['_LOGGETLEVELREQUEST']._serialized_start=2001
+  _globals['_LOGGETLEVELREQUEST']._serialized_end=2061
+  _globals['_LOGGETLEVELRESPONSE']._serialized_start=2063
+  _globals['_LOGGETLEVELRESPONSE']._serialized_end=2099
+  _globals['_LOGGETFLAGSREQUEST']._serialized_start=2101
+  _globals['_LOGGETFLAGSREQUEST']._serialized_end=2161
+  _globals['_LOGGETFLAGSRESPONSE']._serialized_start=2163
+  _globals['_LOGGETFLAGSRESPONSE']._serialized_end=2199
+  _globals['_INSTANCESERVICE']._serialized_start=2202
+  _globals['_INSTANCESERVICE']._serialized_end=3043
+# @@protoc_insertion_point(module_scope)
diff --git a/generated-py/imrpc/instance_pb2_grpc.py b/generated-py/imrpc/instance_pb2_grpc.py
new file mode 100644
index 0000000..677df9a
--- /dev/null
+++ b/generated-py/imrpc/instance_pb2_grpc.py
@@ -0,0 +1,431 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from imrpc import imrpc_pb2 as imrpc_dot_imrpc__pb2
+from imrpc import instance_pb2 as imrpc_dot_instance__pb2
+
+
+class InstanceServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.InstanceCreate = channel.unary_unary(
+                '/imrpc.InstanceService/InstanceCreate',
+                request_serializer=imrpc_dot_instance__pb2.InstanceCreateRequest.SerializeToString,
+                response_deserializer=imrpc_dot_instance__pb2.InstanceResponse.FromString,
+                )
+        self.InstanceDelete = channel.unary_unary(
+                '/imrpc.InstanceService/InstanceDelete',
+                request_serializer=imrpc_dot_instance__pb2.InstanceDeleteRequest.SerializeToString,
+                response_deserializer=imrpc_dot_instance__pb2.InstanceResponse.FromString,
+                )
+        self.InstanceGet = channel.unary_unary(
+                '/imrpc.InstanceService/InstanceGet',
+                request_serializer=imrpc_dot_instance__pb2.InstanceGetRequest.SerializeToString,
+                response_deserializer=imrpc_dot_instance__pb2.InstanceResponse.FromString,
+                )
+        self.InstanceList = channel.unary_unary(
+                '/imrpc.InstanceService/InstanceList',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=imrpc_dot_instance__pb2.InstanceListResponse.FromString,
+                )
+        self.InstanceLog = channel.unary_stream(
+                '/imrpc.InstanceService/InstanceLog',
+                request_serializer=imrpc_dot_instance__pb2.InstanceLogRequest.SerializeToString,
+                response_deserializer=imrpc_dot_imrpc__pb2.LogResponse.FromString,
+                )
+        self.InstanceWatch = channel.unary_stream(
+                '/imrpc.InstanceService/InstanceWatch',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.InstanceReplace = channel.unary_unary(
+                '/imrpc.InstanceService/InstanceReplace',
+                request_serializer=imrpc_dot_instance__pb2.InstanceReplaceRequest.SerializeToString,
+                response_deserializer=imrpc_dot_instance__pb2.InstanceResponse.FromString,
+                )
+        self.LogSetLevel = channel.unary_unary(
+                '/imrpc.InstanceService/LogSetLevel',
+                request_serializer=imrpc_dot_instance__pb2.LogSetLevelRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.LogSetFlags = channel.unary_unary(
+                '/imrpc.InstanceService/LogSetFlags',
+                request_serializer=imrpc_dot_instance__pb2.LogSetFlagsRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.LogGetLevel = channel.unary_unary(
+                '/imrpc.InstanceService/LogGetLevel',
+                request_serializer=imrpc_dot_instance__pb2.LogGetLevelRequest.SerializeToString,
+                response_deserializer=imrpc_dot_instance__pb2.LogGetLevelResponse.FromString,
+                )
+        self.LogGetFlags = channel.unary_unary(
+                '/imrpc.InstanceService/LogGetFlags',
+                request_serializer=imrpc_dot_instance__pb2.LogGetFlagsRequest.SerializeToString,
+                response_deserializer=imrpc_dot_instance__pb2.LogGetFlagsResponse.FromString,
+                )
+        self.VersionGet = channel.unary_unary(
+                '/imrpc.InstanceService/VersionGet',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=imrpc_dot_imrpc__pb2.VersionResponse.FromString,
+                )
+
+
+class InstanceServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def InstanceCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def InstanceDelete(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def InstanceGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def InstanceList(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def InstanceLog(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def InstanceWatch(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def InstanceReplace(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def LogSetLevel(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def LogSetFlags(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def LogGetLevel(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def LogGetFlags(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VersionGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_InstanceServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'InstanceCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.InstanceCreate,
+                    request_deserializer=imrpc_dot_instance__pb2.InstanceCreateRequest.FromString,
+                    response_serializer=imrpc_dot_instance__pb2.InstanceResponse.SerializeToString,
+            ),
+            'InstanceDelete': grpc.unary_unary_rpc_method_handler(
+                    servicer.InstanceDelete,
+                    request_deserializer=imrpc_dot_instance__pb2.InstanceDeleteRequest.FromString,
+                    response_serializer=imrpc_dot_instance__pb2.InstanceResponse.SerializeToString,
+            ),
+            'InstanceGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.InstanceGet,
+                    request_deserializer=imrpc_dot_instance__pb2.InstanceGetRequest.FromString,
+                    response_serializer=imrpc_dot_instance__pb2.InstanceResponse.SerializeToString,
+            ),
+            'InstanceList': grpc.unary_unary_rpc_method_handler(
+                    servicer.InstanceList,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=imrpc_dot_instance__pb2.InstanceListResponse.SerializeToString,
+            ),
+            'InstanceLog': grpc.unary_stream_rpc_method_handler(
+                    servicer.InstanceLog,
+                    request_deserializer=imrpc_dot_instance__pb2.InstanceLogRequest.FromString,
+                    response_serializer=imrpc_dot_imrpc__pb2.LogResponse.SerializeToString,
+            ),
+            'InstanceWatch': grpc.unary_stream_rpc_method_handler(
+                    servicer.InstanceWatch,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'InstanceReplace': grpc.unary_unary_rpc_method_handler(
+                    servicer.InstanceReplace,
+                    request_deserializer=imrpc_dot_instance__pb2.InstanceReplaceRequest.FromString,
+                    response_serializer=imrpc_dot_instance__pb2.InstanceResponse.SerializeToString,
+            ),
+            'LogSetLevel': grpc.unary_unary_rpc_method_handler(
+                    servicer.LogSetLevel,
+                    request_deserializer=imrpc_dot_instance__pb2.LogSetLevelRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'LogSetFlags': grpc.unary_unary_rpc_method_handler(
+                    servicer.LogSetFlags,
+                    request_deserializer=imrpc_dot_instance__pb2.LogSetFlagsRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'LogGetLevel': grpc.unary_unary_rpc_method_handler(
+                    servicer.LogGetLevel,
+                    request_deserializer=imrpc_dot_instance__pb2.LogGetLevelRequest.FromString,
+                    response_serializer=imrpc_dot_instance__pb2.LogGetLevelResponse.SerializeToString,
+            ),
+            'LogGetFlags': grpc.unary_unary_rpc_method_handler(
+                    servicer.LogGetFlags,
+                    request_deserializer=imrpc_dot_instance__pb2.LogGetFlagsRequest.FromString,
+                    response_serializer=imrpc_dot_instance__pb2.LogGetFlagsResponse.SerializeToString,
+            ),
+            'VersionGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.VersionGet,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=imrpc_dot_imrpc__pb2.VersionResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'imrpc.InstanceService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class InstanceService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def InstanceCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.InstanceService/InstanceCreate',
+            imrpc_dot_instance__pb2.InstanceCreateRequest.SerializeToString,
+            imrpc_dot_instance__pb2.InstanceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def InstanceDelete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.InstanceService/InstanceDelete',
+            imrpc_dot_instance__pb2.InstanceDeleteRequest.SerializeToString,
+            imrpc_dot_instance__pb2.InstanceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def InstanceGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.InstanceService/InstanceGet',
+            imrpc_dot_instance__pb2.InstanceGetRequest.SerializeToString,
+            imrpc_dot_instance__pb2.InstanceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def InstanceList(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.InstanceService/InstanceList',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            imrpc_dot_instance__pb2.InstanceListResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def InstanceLog(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/imrpc.InstanceService/InstanceLog',
+            imrpc_dot_instance__pb2.InstanceLogRequest.SerializeToString,
+            imrpc_dot_imrpc__pb2.LogResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def InstanceWatch(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/imrpc.InstanceService/InstanceWatch',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def InstanceReplace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.InstanceService/InstanceReplace',
+            imrpc_dot_instance__pb2.InstanceReplaceRequest.SerializeToString,
+            imrpc_dot_instance__pb2.InstanceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def LogSetLevel(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.InstanceService/LogSetLevel',
+            imrpc_dot_instance__pb2.LogSetLevelRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def LogSetFlags(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.InstanceService/LogSetFlags',
+            imrpc_dot_instance__pb2.LogSetFlagsRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def LogGetLevel(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.InstanceService/LogGetLevel',
+            imrpc_dot_instance__pb2.LogGetLevelRequest.SerializeToString,
+            imrpc_dot_instance__pb2.LogGetLevelResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def LogGetFlags(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.InstanceService/LogGetFlags',
+            imrpc_dot_instance__pb2.LogGetFlagsRequest.SerializeToString,
+            imrpc_dot_instance__pb2.LogGetFlagsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VersionGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.InstanceService/VersionGet',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            imrpc_dot_imrpc__pb2.VersionResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/generated-py/imrpc/proxy_pb2.py b/generated-py/imrpc/proxy_pb2.py
new file mode 100644
index 0000000..b779414
--- /dev/null
+++ b/generated-py/imrpc/proxy_pb2.py
@@ -0,0 +1,145 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: imrpc/proxy.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from ptypes import controller_pb2 as ptypes_dot_controller__pb2
+from ptypes import syncagent_pb2 as ptypes_dot_syncagent__pb2
+from imrpc import common_pb2 as imrpc_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11imrpc/proxy.proto\x12\x05imrpc\x1a\x1bgoogle/protobuf/empty.proto\x1a\x17ptypes/controller.proto\x1a\x16ptypes/syncagent.proto\x1a\x12imrpc/common.proto\"\xb4\x01\n\x12ProxyEngineRequest\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12;\n\x14\x62\x61\x63kend_store_driver\x18\x02 \x01(\x0e\x32\x19.imrpc.BackendStoreDriverB\x02\x18\x01\x12\x13\n\x0b\x65ngine_name\x18\x03 \x01(\t\x12\x13\n\x0bvolume_name\x18\x04 \x01(\t\x12&\n\x0b\x64\x61ta_engine\x18\x05 \x01(\x0e\x32\x11.imrpc.DataEngine\"D\n\x1a\x45ngineVersionProxyResponse\x12&\n\x07version\x18\x01 \x01(\x0b\x32\x15.ptypes.VersionOutput\">\n\x1c\x45ngineVolumeGetProxyResponse\x12\x1e\n\x06volume\x18\x01 \x01(\x0b\x32\x0e.ptypes.Volume\"\x81\x01\n\x19\x45ngineVolumeExpandRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12+\n\x06\x65xpand\x18\x02 \x01(\x0b\x32\x1b.ptypes.VolumeExpandRequest\"\x97\x01\n EngineVolumeFrontendStartRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12:\n\x0e\x66rontend_start\x18\x02 \x01(\x0b\x32\".ptypes.VolumeFrontendStartRequest\"\x8e\x01\n\x1b\x45ngineVolumeSnapshotRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x36\n\x0fsnapshot_volume\x18\x02 \x01(\x0b\x32\x1d.ptypes.VolumeSnapshotRequest\"R\n!EngineVolumeSnapshotProxyResponse\x12-\n\x08snapshot\x18\x01 \x01(\x0b\x32\x1b.ptypes.VolumeSnapshotReply\"\xb6\x01\n/EngineVolumeUnmapMarkSnapChainRemovedSetRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12J\n\x0funmap_mark_snap\x18\x02 \x01(\x0b\x32\x31.ptypes.VolumeUnmapMarkSnapChainRemovedSetRequest\"\x9a\x01\n&EngineVolumeSnapshotMaxCountSetRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x37\n\x05\x63ount\x18\x02 \x01(\x0b\x32(.ptypes.VolumeSnapshotMaxCountSetRequest\"\x97\x01\n%EngineVolumeSnapshotMaxSizeSetRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x35\n\x04size\x18\x02 \x01(\x0b\x32\'.ptypes.VolumeSnapshotMaxSizeSetRequest\"\xb0\x01\n\x1f\x45ngineSnapshotListProxyResponse\x12@\n\x05\x64isks\x18\x01 \x03(\x0b\x32\x31.imrpc.EngineSnapshotListProxyResponse.DisksEntry\x1aK\n\nDisksEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12,\n\x05value\x18\x02 \x01(\x0b\x32\x1d.imrpc.EngineSnapshotDiskInfo:\x02\x38\x01\"\xd6\x02\n\x16\x45ngineSnapshotDiskInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06parent\x18\x02 \x01(\t\x12=\n\x08\x63hildren\x18\x03 \x03(\x0b\x32+.imrpc.EngineSnapshotDiskInfo.ChildrenEntry\x12\x0f\n\x07removed\x18\x04 \x01(\x08\x12\x14\n\x0cuser_created\x18\x05 \x01(\x08\x12\x0f\n\x07\x63reated\x18\x06 \x01(\t\x12\x0c\n\x04size\x18\x07 \x01(\t\x12\x39\n\x06labels\x18\x08 \x03(\x0b\x32).imrpc.EngineSnapshotDiskInfo.LabelsEntry\x1a/\n\rChildrenEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x1b\x45ngineSnapshotRevertRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x0c\n\x04name\x18\x02 \x01(\t\"r\n\x1a\x45ngineSnapshotPurgeRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x1b\n\x13skip_if_in_progress\x18\x02 \x01(\x08\"\xc7\x01\n&EngineSnapshotPurgeStatusProxyResponse\x12I\n\x06status\x18\x01 \x03(\x0b\x32\x39.imrpc.EngineSnapshotPurgeStatusProxyResponse.StatusEntry\x1aR\n\x0bStatusEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x32\n\x05value\x18\x02 \x01(\x0b\x32#.ptypes.SnapshotPurgeStatusResponse:\x02\x38\x01\"\x8b\x02\n\x1a\x45ngineSnapshotCloneRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x1b\n\x13\x66rom_engine_address\x18\x02 \x01(\t\x12\x15\n\rsnapshot_name\x18\x03 \x01(\t\x12%\n\x1d\x65xport_backing_image_if_exist\x18\x04 \x01(\x08\x12%\n\x1d\x66ile_sync_http_client_timeout\x18\x05 \x01(\x05\x12\x18\n\x10\x66rom_engine_name\x18\x06 \x01(\t\x12\x18\n\x10\x66rom_volume_name\x18\x07 \x01(\t\"\xc7\x01\n&EngineSnapshotCloneStatusProxyResponse\x12I\n\x06status\x18\x01 \x03(\x0b\x32\x39.imrpc.EngineSnapshotCloneStatusProxyResponse.StatusEntry\x1aR\n\x0bStatusEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x32\n\x05value\x18\x02 \x01(\x0b\x32#.ptypes.SnapshotCloneStatusResponse:\x02\x38\x01\"e\n\x1b\x45ngineSnapshotRemoveRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\r\n\x05names\x18\x02 \x03(\t\"\xa4\x03\n\x1b\x45ngineSnapshotBackupRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x0c\n\x04\x65nvs\x18\x08 \x03(\t\x12\x13\n\x0b\x62\x61\x63kup_name\x18\x02 \x01(\t\x12\x15\n\rsnapshot_name\x18\x03 \x01(\t\x12\x15\n\rbackup_target\x18\x04 \x01(\t\x12\x1a\n\x12\x62\x61\x63king_image_name\x18\x05 \x01(\t\x12\x1e\n\x16\x62\x61\x63king_image_checksum\x18\x06 \x01(\t\x12>\n\x06labels\x18\x07 \x03(\x0b\x32..imrpc.EngineSnapshotBackupRequest.LabelsEntry\x12\x1a\n\x12\x63ompression_method\x18\t \x01(\t\x12\x18\n\x10\x63oncurrent_limit\x18\n \x01(\x05\x12\x1a\n\x12storage_class_name\x18\x0b \x01(\t\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"_\n!EngineSnapshotBackupProxyResponse\x12\x11\n\tbackup_id\x18\x01 \x01(\t\x12\x0f\n\x07replica\x18\x02 \x01(\t\x12\x16\n\x0eis_incremental\x18\x03 \x01(\x08\"\xa0\x01\n!EngineSnapshotBackupStatusRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x13\n\x0b\x62\x61\x63kup_name\x18\x02 \x01(\t\x12\x17\n\x0freplica_address\x18\x03 \x01(\t\x12\x14\n\x0creplica_name\x18\x04 \x01(\t\"\x9d\x01\n\'EngineSnapshotBackupStatusProxyResponse\x12\x12\n\nbackup_url\x18\x01 \x01(\t\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x10\n\x08progress\x18\x03 \x01(\x05\x12\x15\n\rsnapshot_name\x18\x04 \x01(\t\x12\r\n\x05state\x18\x05 \x01(\t\x12\x17\n\x0freplica_address\x18\x06 \x01(\t\"\xaf\x01\n\x1a\x45ngineBackupRestoreRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x0c\n\x04\x65nvs\x18\x02 \x03(\t\x12\x0b\n\x03url\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x13\n\x0bvolume_name\x18\x05 \x01(\t\x12\x18\n\x10\x63oncurrent_limit\x18\x06 \x01(\x05\"5\n EngineBackupRestoreProxyResponse\x12\x11\n\ttaskError\x18\x01 \x01(\x0c\"\xc4\x01\n&EngineBackupRestoreStatusProxyResponse\x12I\n\x06status\x18\x01 \x03(\x0b\x32\x39.imrpc.EngineBackupRestoreStatusProxyResponse.StatusEntry\x1aO\n\x0bStatusEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .imrpc.EngineBackupRestoreStatus:\x02\x38\x01\"\xc0\x01\n\x19\x45ngineBackupRestoreStatus\x12\x14\n\x0cis_restoring\x18\x01 \x01(\x08\x12\x15\n\rlast_restored\x18\x02 \x01(\t\x12 \n\x18\x63urrent_restoring_backup\x18\x03 \x01(\t\x12\x10\n\x08progress\x18\x04 \x01(\x05\x12\r\n\x05\x65rror\x18\x05 \x01(\t\x12\x10\n\x08\x66ilename\x18\x06 \x01(\t\x12\r\n\x05state\x18\x07 \x01(\t\x12\x12\n\nbackup_url\x18\x08 \x01(\t\"[\n EngineBackupRestoreFinishRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\"\xf0\x01\n\x17\x45ngineReplicaAddRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x17\n\x0freplica_address\x18\x02 \x01(\t\x12\x0f\n\x07restore\x18\x03 \x01(\x08\x12\x0c\n\x04size\x18\x04 \x01(\x03\x12\x14\n\x0c\x63urrent_size\x18\x05 \x01(\x03\x12\x11\n\tfast_sync\x18\x06 \x01(\x08\x12%\n\x1d\x66ile_sync_http_client_timeout\x18\x07 \x01(\x05\x12\x14\n\x0creplica_name\x18\x08 \x01(\t\"P\n\x1e\x45ngineReplicaListProxyResponse\x12.\n\x0creplica_list\x18\x01 \x01(\x0b\x32\x18.ptypes.ReplicaListReply\"\x8b\x01\n!EngineReplicaVerifyRebuildRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x17\n\x0freplica_address\x18\x02 \x01(\t\x12\x14\n\x0creplica_name\x18\x03 \x01(\t\"\xca\x01\n\'EngineReplicaRebuildStatusProxyResponse\x12J\n\x06status\x18\x01 \x03(\x0b\x32:.imrpc.EngineReplicaRebuildStatusProxyResponse.StatusEntry\x1aS\n\x0bStatusEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.ptypes.ReplicaRebuildStatusResponse:\x02\x38\x01\"\x84\x01\n\x1a\x45ngineReplicaRemoveRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x17\n\x0freplica_address\x18\x02 \x01(\t\x12\x14\n\x0creplica_name\x18\x03 \x01(\t\"\x95\x01\n\x1e\x45ngineReplicaModeUpdateRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x17\n\x0freplica_address\x18\x02 \x01(\t\x12!\n\x04mode\x18\x03 \x01(\x0e\x32\x13.ptypes.ReplicaMode\"{\n\x19\x45ngineSnapshotHashRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x15\n\rsnapshot_name\x18\x02 \x01(\t\x12\x0e\n\x06rehash\x18\x03 \x01(\x08\"q\n\x1f\x45ngineSnapshotHashStatusRequest\x12\x37\n\x14proxy_engine_request\x18\x01 \x01(\x0b\x32\x19.imrpc.ProxyEngineRequest\x12\x15\n\rsnapshot_name\x18\x02 \x01(\t\"\xc4\x01\n%EngineSnapshotHashStatusProxyResponse\x12H\n\x06status\x18\x01 \x03(\x0b\x32\x38.imrpc.EngineSnapshotHashStatusProxyResponse.StatusEntry\x1aQ\n\x0bStatusEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x31\n\x05value\x18\x02 \x01(\x0b\x32\".ptypes.SnapshotHashStatusResponse:\x02\x38\x01\"A\n\x1d\x45ngineMetricsGetProxyResponse\x12 \n\x07metrics\x18\x01 \x01(\x0b\x32\x0f.ptypes.Metrics\"+\n\x14RemountVolumeRequest\x12\x13\n\x0bvolume_name\x18\x01 \x01(\t2\x85\x16\n\x12ProxyEngineService\x12P\n\x10ServerVersionGet\x12\x19.imrpc.ProxyEngineRequest\x1a!.imrpc.EngineVersionProxyResponse\x12K\n\tVolumeGet\x12\x19.imrpc.ProxyEngineRequest\x1a#.imrpc.EngineVolumeGetProxyResponse\x12H\n\x0cVolumeExpand\x12 .imrpc.EngineVolumeExpandRequest\x1a\x16.google.protobuf.Empty\x12V\n\x13VolumeFrontendStart\x12\'.imrpc.EngineVolumeFrontendStartRequest\x1a\x16.google.protobuf.Empty\x12K\n\x16VolumeFrontendShutdown\x12\x19.imrpc.ProxyEngineRequest\x1a\x16.google.protobuf.Empty\x12t\n\"VolumeUnmapMarkSnapChainRemovedSet\x12\x36.imrpc.EngineVolumeUnmapMarkSnapChainRemovedSetRequest\x1a\x16.google.protobuf.Empty\x12\x62\n\x19VolumeSnapshotMaxCountSet\x12-.imrpc.EngineVolumeSnapshotMaxCountSetRequest\x1a\x16.google.protobuf.Empty\x12`\n\x18VolumeSnapshotMaxSizeSet\x12,.imrpc.EngineVolumeSnapshotMaxSizeSetRequest\x1a\x16.google.protobuf.Empty\x12^\n\x0eVolumeSnapshot\x12\".imrpc.EngineVolumeSnapshotRequest\x1a(.imrpc.EngineVolumeSnapshotProxyResponse\x12Q\n\x0cSnapshotList\x12\x19.imrpc.ProxyEngineRequest\x1a&.imrpc.EngineSnapshotListProxyResponse\x12L\n\x0eSnapshotRevert\x12\".imrpc.EngineSnapshotRevertRequest\x1a\x16.google.protobuf.Empty\x12J\n\rSnapshotPurge\x12!.imrpc.EngineSnapshotPurgeRequest\x1a\x16.google.protobuf.Empty\x12_\n\x13SnapshotPurgeStatus\x12\x19.imrpc.ProxyEngineRequest\x1a-.imrpc.EngineSnapshotPurgeStatusProxyResponse\x12J\n\rSnapshotClone\x12!.imrpc.EngineSnapshotCloneRequest\x1a\x16.google.protobuf.Empty\x12_\n\x13SnapshotCloneStatus\x12\x19.imrpc.ProxyEngineRequest\x1a-.imrpc.EngineSnapshotCloneStatusProxyResponse\x12L\n\x0eSnapshotRemove\x12\".imrpc.EngineSnapshotRemoveRequest\x1a\x16.google.protobuf.Empty\x12H\n\x0cSnapshotHash\x12 .imrpc.EngineSnapshotHashRequest\x1a\x16.google.protobuf.Empty\x12j\n\x12SnapshotHashStatus\x12&.imrpc.EngineSnapshotHashStatusRequest\x1a,.imrpc.EngineSnapshotHashStatusProxyResponse\x12^\n\x0eSnapshotBackup\x12\".imrpc.EngineSnapshotBackupRequest\x1a(.imrpc.EngineSnapshotBackupProxyResponse\x12p\n\x14SnapshotBackupStatus\x12(.imrpc.EngineSnapshotBackupStatusRequest\x1a..imrpc.EngineSnapshotBackupStatusProxyResponse\x12[\n\rBackupRestore\x12!.imrpc.EngineBackupRestoreRequest\x1a\'.imrpc.EngineBackupRestoreProxyResponse\x12_\n\x13\x42\x61\x63kupRestoreStatus\x12\x19.imrpc.ProxyEngineRequest\x1a-.imrpc.EngineBackupRestoreStatusProxyResponse\x12V\n\x13\x42\x61\x63kupRestoreFinish\x12\'.imrpc.EngineBackupRestoreFinishRequest\x1a\x16.google.protobuf.Empty\x12J\n\x18\x43leanupBackupMountPoints\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\x12\x44\n\nReplicaAdd\x12\x1e.imrpc.EngineReplicaAddRequest\x1a\x16.google.protobuf.Empty\x12O\n\x0bReplicaList\x12\x19.imrpc.ProxyEngineRequest\x1a%.imrpc.EngineReplicaListProxyResponse\x12\x64\n\x17ReplicaRebuildingStatus\x12\x19.imrpc.ProxyEngineRequest\x1a..imrpc.EngineReplicaRebuildStatusProxyResponse\x12X\n\x14ReplicaVerifyRebuild\x12(.imrpc.EngineReplicaVerifyRebuildRequest\x1a\x16.google.protobuf.Empty\x12J\n\rReplicaRemove\x12!.imrpc.EngineReplicaRemoveRequest\x1a\x16.google.protobuf.Empty\x12R\n\x11ReplicaModeUpdate\x12%.imrpc.EngineReplicaModeUpdateRequest\x1a\x16.google.protobuf.Empty\x12M\n\nMetricsGet\x12\x19.imrpc.ProxyEngineRequest\x1a$.imrpc.EngineMetricsGetProxyResponse\x12L\n\x15RemountReadOnlyVolume\x12\x1b.imrpc.RemountVolumeRequest\x1a\x16.google.protobuf.EmptyB/Z-github.com/longhorn/types/pkg/generated/imrpcb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'imrpc.proxy_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z-github.com/longhorn/types/pkg/generated/imrpc'
+  _PROXYENGINEREQUEST.fields_by_name['backend_store_driver']._options = None
+  _PROXYENGINEREQUEST.fields_by_name['backend_store_driver']._serialized_options = b'\030\001'
+  _ENGINESNAPSHOTLISTPROXYRESPONSE_DISKSENTRY._options = None
+  _ENGINESNAPSHOTLISTPROXYRESPONSE_DISKSENTRY._serialized_options = b'8\001'
+  _ENGINESNAPSHOTDISKINFO_CHILDRENENTRY._options = None
+  _ENGINESNAPSHOTDISKINFO_CHILDRENENTRY._serialized_options = b'8\001'
+  _ENGINESNAPSHOTDISKINFO_LABELSENTRY._options = None
+  _ENGINESNAPSHOTDISKINFO_LABELSENTRY._serialized_options = b'8\001'
+  _ENGINESNAPSHOTPURGESTATUSPROXYRESPONSE_STATUSENTRY._options = None
+  _ENGINESNAPSHOTPURGESTATUSPROXYRESPONSE_STATUSENTRY._serialized_options = b'8\001'
+  _ENGINESNAPSHOTCLONESTATUSPROXYRESPONSE_STATUSENTRY._options = None
+  _ENGINESNAPSHOTCLONESTATUSPROXYRESPONSE_STATUSENTRY._serialized_options = b'8\001'
+  _ENGINESNAPSHOTBACKUPREQUEST_LABELSENTRY._options = None
+  _ENGINESNAPSHOTBACKUPREQUEST_LABELSENTRY._serialized_options = b'8\001'
+  _ENGINEBACKUPRESTORESTATUSPROXYRESPONSE_STATUSENTRY._options = None
+  _ENGINEBACKUPRESTORESTATUSPROXYRESPONSE_STATUSENTRY._serialized_options = b'8\001'
+  _ENGINEREPLICAREBUILDSTATUSPROXYRESPONSE_STATUSENTRY._options = None
+  _ENGINEREPLICAREBUILDSTATUSPROXYRESPONSE_STATUSENTRY._serialized_options = b'8\001'
+  _ENGINESNAPSHOTHASHSTATUSPROXYRESPONSE_STATUSENTRY._options = None
+  _ENGINESNAPSHOTHASHSTATUSPROXYRESPONSE_STATUSENTRY._serialized_options = b'8\001'
+  _globals['_PROXYENGINEREQUEST']._serialized_start=127
+  _globals['_PROXYENGINEREQUEST']._serialized_end=307
+  _globals['_ENGINEVERSIONPROXYRESPONSE']._serialized_start=309
+  _globals['_ENGINEVERSIONPROXYRESPONSE']._serialized_end=377
+  _globals['_ENGINEVOLUMEGETPROXYRESPONSE']._serialized_start=379
+  _globals['_ENGINEVOLUMEGETPROXYRESPONSE']._serialized_end=441
+  _globals['_ENGINEVOLUMEEXPANDREQUEST']._serialized_start=444
+  _globals['_ENGINEVOLUMEEXPANDREQUEST']._serialized_end=573
+  _globals['_ENGINEVOLUMEFRONTENDSTARTREQUEST']._serialized_start=576
+  _globals['_ENGINEVOLUMEFRONTENDSTARTREQUEST']._serialized_end=727
+  _globals['_ENGINEVOLUMESNAPSHOTREQUEST']._serialized_start=730
+  _globals['_ENGINEVOLUMESNAPSHOTREQUEST']._serialized_end=872
+  _globals['_ENGINEVOLUMESNAPSHOTPROXYRESPONSE']._serialized_start=874
+  _globals['_ENGINEVOLUMESNAPSHOTPROXYRESPONSE']._serialized_end=956
+  _globals['_ENGINEVOLUMEUNMAPMARKSNAPCHAINREMOVEDSETREQUEST']._serialized_start=959
+  _globals['_ENGINEVOLUMEUNMAPMARKSNAPCHAINREMOVEDSETREQUEST']._serialized_end=1141
+  _globals['_ENGINEVOLUMESNAPSHOTMAXCOUNTSETREQUEST']._serialized_start=1144
+  _globals['_ENGINEVOLUMESNAPSHOTMAXCOUNTSETREQUEST']._serialized_end=1298
+  _globals['_ENGINEVOLUMESNAPSHOTMAXSIZESETREQUEST']._serialized_start=1301
+  _globals['_ENGINEVOLUMESNAPSHOTMAXSIZESETREQUEST']._serialized_end=1452
+  _globals['_ENGINESNAPSHOTLISTPROXYRESPONSE']._serialized_start=1455
+  _globals['_ENGINESNAPSHOTLISTPROXYRESPONSE']._serialized_end=1631
+  _globals['_ENGINESNAPSHOTLISTPROXYRESPONSE_DISKSENTRY']._serialized_start=1556
+  _globals['_ENGINESNAPSHOTLISTPROXYRESPONSE_DISKSENTRY']._serialized_end=1631
+  _globals['_ENGINESNAPSHOTDISKINFO']._serialized_start=1634
+  _globals['_ENGINESNAPSHOTDISKINFO']._serialized_end=1976
+  _globals['_ENGINESNAPSHOTDISKINFO_CHILDRENENTRY']._serialized_start=1882
+  _globals['_ENGINESNAPSHOTDISKINFO_CHILDRENENTRY']._serialized_end=1929
+  _globals['_ENGINESNAPSHOTDISKINFO_LABELSENTRY']._serialized_start=1931
+  _globals['_ENGINESNAPSHOTDISKINFO_LABELSENTRY']._serialized_end=1976
+  _globals['_ENGINESNAPSHOTREVERTREQUEST']._serialized_start=1978
+  _globals['_ENGINESNAPSHOTREVERTREQUEST']._serialized_end=2078
+  _globals['_ENGINESNAPSHOTPURGEREQUEST']._serialized_start=2080
+  _globals['_ENGINESNAPSHOTPURGEREQUEST']._serialized_end=2194
+  _globals['_ENGINESNAPSHOTPURGESTATUSPROXYRESPONSE']._serialized_start=2197
+  _globals['_ENGINESNAPSHOTPURGESTATUSPROXYRESPONSE']._serialized_end=2396
+  _globals['_ENGINESNAPSHOTPURGESTATUSPROXYRESPONSE_STATUSENTRY']._serialized_start=2314
+  _globals['_ENGINESNAPSHOTPURGESTATUSPROXYRESPONSE_STATUSENTRY']._serialized_end=2396
+  _globals['_ENGINESNAPSHOTCLONEREQUEST']._serialized_start=2399
+  _globals['_ENGINESNAPSHOTCLONEREQUEST']._serialized_end=2666
+  _globals['_ENGINESNAPSHOTCLONESTATUSPROXYRESPONSE']._serialized_start=2669
+  _globals['_ENGINESNAPSHOTCLONESTATUSPROXYRESPONSE']._serialized_end=2868
+  _globals['_ENGINESNAPSHOTCLONESTATUSPROXYRESPONSE_STATUSENTRY']._serialized_start=2786
+  _globals['_ENGINESNAPSHOTCLONESTATUSPROXYRESPONSE_STATUSENTRY']._serialized_end=2868
+  _globals['_ENGINESNAPSHOTREMOVEREQUEST']._serialized_start=2870
+  _globals['_ENGINESNAPSHOTREMOVEREQUEST']._serialized_end=2971
+  _globals['_ENGINESNAPSHOTBACKUPREQUEST']._serialized_start=2974
+  _globals['_ENGINESNAPSHOTBACKUPREQUEST']._serialized_end=3394
+  _globals['_ENGINESNAPSHOTBACKUPREQUEST_LABELSENTRY']._serialized_start=1931
+  _globals['_ENGINESNAPSHOTBACKUPREQUEST_LABELSENTRY']._serialized_end=1976
+  _globals['_ENGINESNAPSHOTBACKUPPROXYRESPONSE']._serialized_start=3396
+  _globals['_ENGINESNAPSHOTBACKUPPROXYRESPONSE']._serialized_end=3491
+  _globals['_ENGINESNAPSHOTBACKUPSTATUSREQUEST']._serialized_start=3494
+  _globals['_ENGINESNAPSHOTBACKUPSTATUSREQUEST']._serialized_end=3654
+  _globals['_ENGINESNAPSHOTBACKUPSTATUSPROXYRESPONSE']._serialized_start=3657
+  _globals['_ENGINESNAPSHOTBACKUPSTATUSPROXYRESPONSE']._serialized_end=3814
+  _globals['_ENGINEBACKUPRESTOREREQUEST']._serialized_start=3817
+  _globals['_ENGINEBACKUPRESTOREREQUEST']._serialized_end=3992
+  _globals['_ENGINEBACKUPRESTOREPROXYRESPONSE']._serialized_start=3994
+  _globals['_ENGINEBACKUPRESTOREPROXYRESPONSE']._serialized_end=4047
+  _globals['_ENGINEBACKUPRESTORESTATUSPROXYRESPONSE']._serialized_start=4050
+  _globals['_ENGINEBACKUPRESTORESTATUSPROXYRESPONSE']._serialized_end=4246
+  _globals['_ENGINEBACKUPRESTORESTATUSPROXYRESPONSE_STATUSENTRY']._serialized_start=4167
+  _globals['_ENGINEBACKUPRESTORESTATUSPROXYRESPONSE_STATUSENTRY']._serialized_end=4246
+  _globals['_ENGINEBACKUPRESTORESTATUS']._serialized_start=4249
+  _globals['_ENGINEBACKUPRESTORESTATUS']._serialized_end=4441
+  _globals['_ENGINEBACKUPRESTOREFINISHREQUEST']._serialized_start=4443
+  _globals['_ENGINEBACKUPRESTOREFINISHREQUEST']._serialized_end=4534
+  _globals['_ENGINEREPLICAADDREQUEST']._serialized_start=4537
+  _globals['_ENGINEREPLICAADDREQUEST']._serialized_end=4777
+  _globals['_ENGINEREPLICALISTPROXYRESPONSE']._serialized_start=4779
+  _globals['_ENGINEREPLICALISTPROXYRESPONSE']._serialized_end=4859
+  _globals['_ENGINEREPLICAVERIFYREBUILDREQUEST']._serialized_start=4862
+  _globals['_ENGINEREPLICAVERIFYREBUILDREQUEST']._serialized_end=5001
+  _globals['_ENGINEREPLICAREBUILDSTATUSPROXYRESPONSE']._serialized_start=5004
+  _globals['_ENGINEREPLICAREBUILDSTATUSPROXYRESPONSE']._serialized_end=5206
+  _globals['_ENGINEREPLICAREBUILDSTATUSPROXYRESPONSE_STATUSENTRY']._serialized_start=5123
+  _globals['_ENGINEREPLICAREBUILDSTATUSPROXYRESPONSE_STATUSENTRY']._serialized_end=5206
+  _globals['_ENGINEREPLICAREMOVEREQUEST']._serialized_start=5209
+  _globals['_ENGINEREPLICAREMOVEREQUEST']._serialized_end=5341
+  _globals['_ENGINEREPLICAMODEUPDATEREQUEST']._serialized_start=5344
+  _globals['_ENGINEREPLICAMODEUPDATEREQUEST']._serialized_end=5493
+  _globals['_ENGINESNAPSHOTHASHREQUEST']._serialized_start=5495
+  _globals['_ENGINESNAPSHOTHASHREQUEST']._serialized_end=5618
+  _globals['_ENGINESNAPSHOTHASHSTATUSREQUEST']._serialized_start=5620
+  _globals['_ENGINESNAPSHOTHASHSTATUSREQUEST']._serialized_end=5733
+  _globals['_ENGINESNAPSHOTHASHSTATUSPROXYRESPONSE']._serialized_start=5736
+  _globals['_ENGINESNAPSHOTHASHSTATUSPROXYRESPONSE']._serialized_end=5932
+  _globals['_ENGINESNAPSHOTHASHSTATUSPROXYRESPONSE_STATUSENTRY']._serialized_start=5851
+  _globals['_ENGINESNAPSHOTHASHSTATUSPROXYRESPONSE_STATUSENTRY']._serialized_end=5932
+  _globals['_ENGINEMETRICSGETPROXYRESPONSE']._serialized_start=5934
+  _globals['_ENGINEMETRICSGETPROXYRESPONSE']._serialized_end=5999
+  _globals['_REMOUNTVOLUMEREQUEST']._serialized_start=6001
+  _globals['_REMOUNTVOLUMEREQUEST']._serialized_end=6044
+  _globals['_PROXYENGINESERVICE']._serialized_start=6047
+  _globals['_PROXYENGINESERVICE']._serialized_end=8868
+# @@protoc_insertion_point(module_scope)
diff --git a/generated-py/imrpc/proxy_pb2_grpc.py b/generated-py/imrpc/proxy_pb2_grpc.py
new file mode 100644
index 0000000..da3f28c
--- /dev/null
+++ b/generated-py/imrpc/proxy_pb2_grpc.py
@@ -0,0 +1,1090 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from imrpc import proxy_pb2 as imrpc_dot_proxy__pb2
+
+
+class ProxyEngineServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.ServerVersionGet = channel.unary_unary(
+                '/imrpc.ProxyEngineService/ServerVersionGet',
+                request_serializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+                response_deserializer=imrpc_dot_proxy__pb2.EngineVersionProxyResponse.FromString,
+                )
+        self.VolumeGet = channel.unary_unary(
+                '/imrpc.ProxyEngineService/VolumeGet',
+                request_serializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+                response_deserializer=imrpc_dot_proxy__pb2.EngineVolumeGetProxyResponse.FromString,
+                )
+        self.VolumeExpand = channel.unary_unary(
+                '/imrpc.ProxyEngineService/VolumeExpand',
+                request_serializer=imrpc_dot_proxy__pb2.EngineVolumeExpandRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.VolumeFrontendStart = channel.unary_unary(
+                '/imrpc.ProxyEngineService/VolumeFrontendStart',
+                request_serializer=imrpc_dot_proxy__pb2.EngineVolumeFrontendStartRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.VolumeFrontendShutdown = channel.unary_unary(
+                '/imrpc.ProxyEngineService/VolumeFrontendShutdown',
+                request_serializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.VolumeUnmapMarkSnapChainRemovedSet = channel.unary_unary(
+                '/imrpc.ProxyEngineService/VolumeUnmapMarkSnapChainRemovedSet',
+                request_serializer=imrpc_dot_proxy__pb2.EngineVolumeUnmapMarkSnapChainRemovedSetRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.VolumeSnapshotMaxCountSet = channel.unary_unary(
+                '/imrpc.ProxyEngineService/VolumeSnapshotMaxCountSet',
+                request_serializer=imrpc_dot_proxy__pb2.EngineVolumeSnapshotMaxCountSetRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.VolumeSnapshotMaxSizeSet = channel.unary_unary(
+                '/imrpc.ProxyEngineService/VolumeSnapshotMaxSizeSet',
+                request_serializer=imrpc_dot_proxy__pb2.EngineVolumeSnapshotMaxSizeSetRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.VolumeSnapshot = channel.unary_unary(
+                '/imrpc.ProxyEngineService/VolumeSnapshot',
+                request_serializer=imrpc_dot_proxy__pb2.EngineVolumeSnapshotRequest.SerializeToString,
+                response_deserializer=imrpc_dot_proxy__pb2.EngineVolumeSnapshotProxyResponse.FromString,
+                )
+        self.SnapshotList = channel.unary_unary(
+                '/imrpc.ProxyEngineService/SnapshotList',
+                request_serializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+                response_deserializer=imrpc_dot_proxy__pb2.EngineSnapshotListProxyResponse.FromString,
+                )
+        self.SnapshotRevert = channel.unary_unary(
+                '/imrpc.ProxyEngineService/SnapshotRevert',
+                request_serializer=imrpc_dot_proxy__pb2.EngineSnapshotRevertRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.SnapshotPurge = channel.unary_unary(
+                '/imrpc.ProxyEngineService/SnapshotPurge',
+                request_serializer=imrpc_dot_proxy__pb2.EngineSnapshotPurgeRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.SnapshotPurgeStatus = channel.unary_unary(
+                '/imrpc.ProxyEngineService/SnapshotPurgeStatus',
+                request_serializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+                response_deserializer=imrpc_dot_proxy__pb2.EngineSnapshotPurgeStatusProxyResponse.FromString,
+                )
+        self.SnapshotClone = channel.unary_unary(
+                '/imrpc.ProxyEngineService/SnapshotClone',
+                request_serializer=imrpc_dot_proxy__pb2.EngineSnapshotCloneRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.SnapshotCloneStatus = channel.unary_unary(
+                '/imrpc.ProxyEngineService/SnapshotCloneStatus',
+                request_serializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+                response_deserializer=imrpc_dot_proxy__pb2.EngineSnapshotCloneStatusProxyResponse.FromString,
+                )
+        self.SnapshotRemove = channel.unary_unary(
+                '/imrpc.ProxyEngineService/SnapshotRemove',
+                request_serializer=imrpc_dot_proxy__pb2.EngineSnapshotRemoveRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.SnapshotHash = channel.unary_unary(
+                '/imrpc.ProxyEngineService/SnapshotHash',
+                request_serializer=imrpc_dot_proxy__pb2.EngineSnapshotHashRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.SnapshotHashStatus = channel.unary_unary(
+                '/imrpc.ProxyEngineService/SnapshotHashStatus',
+                request_serializer=imrpc_dot_proxy__pb2.EngineSnapshotHashStatusRequest.SerializeToString,
+                response_deserializer=imrpc_dot_proxy__pb2.EngineSnapshotHashStatusProxyResponse.FromString,
+                )
+        self.SnapshotBackup = channel.unary_unary(
+                '/imrpc.ProxyEngineService/SnapshotBackup',
+                request_serializer=imrpc_dot_proxy__pb2.EngineSnapshotBackupRequest.SerializeToString,
+                response_deserializer=imrpc_dot_proxy__pb2.EngineSnapshotBackupProxyResponse.FromString,
+                )
+        self.SnapshotBackupStatus = channel.unary_unary(
+                '/imrpc.ProxyEngineService/SnapshotBackupStatus',
+                request_serializer=imrpc_dot_proxy__pb2.EngineSnapshotBackupStatusRequest.SerializeToString,
+                response_deserializer=imrpc_dot_proxy__pb2.EngineSnapshotBackupStatusProxyResponse.FromString,
+                )
+        self.BackupRestore = channel.unary_unary(
+                '/imrpc.ProxyEngineService/BackupRestore',
+                request_serializer=imrpc_dot_proxy__pb2.EngineBackupRestoreRequest.SerializeToString,
+                response_deserializer=imrpc_dot_proxy__pb2.EngineBackupRestoreProxyResponse.FromString,
+                )
+        self.BackupRestoreStatus = channel.unary_unary(
+                '/imrpc.ProxyEngineService/BackupRestoreStatus',
+                request_serializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+                response_deserializer=imrpc_dot_proxy__pb2.EngineBackupRestoreStatusProxyResponse.FromString,
+                )
+        self.BackupRestoreFinish = channel.unary_unary(
+                '/imrpc.ProxyEngineService/BackupRestoreFinish',
+                request_serializer=imrpc_dot_proxy__pb2.EngineBackupRestoreFinishRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.CleanupBackupMountPoints = channel.unary_unary(
+                '/imrpc.ProxyEngineService/CleanupBackupMountPoints',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaAdd = channel.unary_unary(
+                '/imrpc.ProxyEngineService/ReplicaAdd',
+                request_serializer=imrpc_dot_proxy__pb2.EngineReplicaAddRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaList = channel.unary_unary(
+                '/imrpc.ProxyEngineService/ReplicaList',
+                request_serializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+                response_deserializer=imrpc_dot_proxy__pb2.EngineReplicaListProxyResponse.FromString,
+                )
+        self.ReplicaRebuildingStatus = channel.unary_unary(
+                '/imrpc.ProxyEngineService/ReplicaRebuildingStatus',
+                request_serializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+                response_deserializer=imrpc_dot_proxy__pb2.EngineReplicaRebuildStatusProxyResponse.FromString,
+                )
+        self.ReplicaVerifyRebuild = channel.unary_unary(
+                '/imrpc.ProxyEngineService/ReplicaVerifyRebuild',
+                request_serializer=imrpc_dot_proxy__pb2.EngineReplicaVerifyRebuildRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaRemove = channel.unary_unary(
+                '/imrpc.ProxyEngineService/ReplicaRemove',
+                request_serializer=imrpc_dot_proxy__pb2.EngineReplicaRemoveRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaModeUpdate = channel.unary_unary(
+                '/imrpc.ProxyEngineService/ReplicaModeUpdate',
+                request_serializer=imrpc_dot_proxy__pb2.EngineReplicaModeUpdateRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.MetricsGet = channel.unary_unary(
+                '/imrpc.ProxyEngineService/MetricsGet',
+                request_serializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+                response_deserializer=imrpc_dot_proxy__pb2.EngineMetricsGetProxyResponse.FromString,
+                )
+        self.RemountReadOnlyVolume = channel.unary_unary(
+                '/imrpc.ProxyEngineService/RemountReadOnlyVolume',
+                request_serializer=imrpc_dot_proxy__pb2.RemountVolumeRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class ProxyEngineServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def ServerVersionGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeExpand(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeFrontendStart(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeFrontendShutdown(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeUnmapMarkSnapChainRemovedSet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeSnapshotMaxCountSet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeSnapshotMaxSizeSet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeSnapshot(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotList(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotRevert(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotPurge(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotPurgeStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotClone(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotCloneStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotRemove(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotHash(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotHashStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotBackup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotBackupStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def BackupRestore(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def BackupRestoreStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def BackupRestoreFinish(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def CleanupBackupMountPoints(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaAdd(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaList(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaRebuildingStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaVerifyRebuild(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaRemove(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaModeUpdate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def MetricsGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def RemountReadOnlyVolume(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ProxyEngineServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'ServerVersionGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.ServerVersionGet,
+                    request_deserializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.FromString,
+                    response_serializer=imrpc_dot_proxy__pb2.EngineVersionProxyResponse.SerializeToString,
+            ),
+            'VolumeGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeGet,
+                    request_deserializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.FromString,
+                    response_serializer=imrpc_dot_proxy__pb2.EngineVolumeGetProxyResponse.SerializeToString,
+            ),
+            'VolumeExpand': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeExpand,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineVolumeExpandRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'VolumeFrontendStart': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeFrontendStart,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineVolumeFrontendStartRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'VolumeFrontendShutdown': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeFrontendShutdown,
+                    request_deserializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'VolumeUnmapMarkSnapChainRemovedSet': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeUnmapMarkSnapChainRemovedSet,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineVolumeUnmapMarkSnapChainRemovedSetRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'VolumeSnapshotMaxCountSet': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeSnapshotMaxCountSet,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineVolumeSnapshotMaxCountSetRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'VolumeSnapshotMaxSizeSet': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeSnapshotMaxSizeSet,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineVolumeSnapshotMaxSizeSetRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'VolumeSnapshot': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeSnapshot,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineVolumeSnapshotRequest.FromString,
+                    response_serializer=imrpc_dot_proxy__pb2.EngineVolumeSnapshotProxyResponse.SerializeToString,
+            ),
+            'SnapshotList': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotList,
+                    request_deserializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.FromString,
+                    response_serializer=imrpc_dot_proxy__pb2.EngineSnapshotListProxyResponse.SerializeToString,
+            ),
+            'SnapshotRevert': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotRevert,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineSnapshotRevertRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'SnapshotPurge': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotPurge,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineSnapshotPurgeRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'SnapshotPurgeStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotPurgeStatus,
+                    request_deserializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.FromString,
+                    response_serializer=imrpc_dot_proxy__pb2.EngineSnapshotPurgeStatusProxyResponse.SerializeToString,
+            ),
+            'SnapshotClone': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotClone,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineSnapshotCloneRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'SnapshotCloneStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotCloneStatus,
+                    request_deserializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.FromString,
+                    response_serializer=imrpc_dot_proxy__pb2.EngineSnapshotCloneStatusProxyResponse.SerializeToString,
+            ),
+            'SnapshotRemove': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotRemove,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineSnapshotRemoveRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'SnapshotHash': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotHash,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineSnapshotHashRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'SnapshotHashStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotHashStatus,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineSnapshotHashStatusRequest.FromString,
+                    response_serializer=imrpc_dot_proxy__pb2.EngineSnapshotHashStatusProxyResponse.SerializeToString,
+            ),
+            'SnapshotBackup': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotBackup,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineSnapshotBackupRequest.FromString,
+                    response_serializer=imrpc_dot_proxy__pb2.EngineSnapshotBackupProxyResponse.SerializeToString,
+            ),
+            'SnapshotBackupStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotBackupStatus,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineSnapshotBackupStatusRequest.FromString,
+                    response_serializer=imrpc_dot_proxy__pb2.EngineSnapshotBackupStatusProxyResponse.SerializeToString,
+            ),
+            'BackupRestore': grpc.unary_unary_rpc_method_handler(
+                    servicer.BackupRestore,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineBackupRestoreRequest.FromString,
+                    response_serializer=imrpc_dot_proxy__pb2.EngineBackupRestoreProxyResponse.SerializeToString,
+            ),
+            'BackupRestoreStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.BackupRestoreStatus,
+                    request_deserializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.FromString,
+                    response_serializer=imrpc_dot_proxy__pb2.EngineBackupRestoreStatusProxyResponse.SerializeToString,
+            ),
+            'BackupRestoreFinish': grpc.unary_unary_rpc_method_handler(
+                    servicer.BackupRestoreFinish,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineBackupRestoreFinishRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'CleanupBackupMountPoints': grpc.unary_unary_rpc_method_handler(
+                    servicer.CleanupBackupMountPoints,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaAdd': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaAdd,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineReplicaAddRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaList': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaList,
+                    request_deserializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.FromString,
+                    response_serializer=imrpc_dot_proxy__pb2.EngineReplicaListProxyResponse.SerializeToString,
+            ),
+            'ReplicaRebuildingStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaRebuildingStatus,
+                    request_deserializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.FromString,
+                    response_serializer=imrpc_dot_proxy__pb2.EngineReplicaRebuildStatusProxyResponse.SerializeToString,
+            ),
+            'ReplicaVerifyRebuild': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaVerifyRebuild,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineReplicaVerifyRebuildRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaRemove': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaRemove,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineReplicaRemoveRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaModeUpdate': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaModeUpdate,
+                    request_deserializer=imrpc_dot_proxy__pb2.EngineReplicaModeUpdateRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'MetricsGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.MetricsGet,
+                    request_deserializer=imrpc_dot_proxy__pb2.ProxyEngineRequest.FromString,
+                    response_serializer=imrpc_dot_proxy__pb2.EngineMetricsGetProxyResponse.SerializeToString,
+            ),
+            'RemountReadOnlyVolume': grpc.unary_unary_rpc_method_handler(
+                    servicer.RemountReadOnlyVolume,
+                    request_deserializer=imrpc_dot_proxy__pb2.RemountVolumeRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'imrpc.ProxyEngineService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ProxyEngineService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def ServerVersionGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/ServerVersionGet',
+            imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+            imrpc_dot_proxy__pb2.EngineVersionProxyResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/VolumeGet',
+            imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+            imrpc_dot_proxy__pb2.EngineVolumeGetProxyResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeExpand(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/VolumeExpand',
+            imrpc_dot_proxy__pb2.EngineVolumeExpandRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeFrontendStart(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/VolumeFrontendStart',
+            imrpc_dot_proxy__pb2.EngineVolumeFrontendStartRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeFrontendShutdown(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/VolumeFrontendShutdown',
+            imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeUnmapMarkSnapChainRemovedSet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/VolumeUnmapMarkSnapChainRemovedSet',
+            imrpc_dot_proxy__pb2.EngineVolumeUnmapMarkSnapChainRemovedSetRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeSnapshotMaxCountSet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/VolumeSnapshotMaxCountSet',
+            imrpc_dot_proxy__pb2.EngineVolumeSnapshotMaxCountSetRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeSnapshotMaxSizeSet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/VolumeSnapshotMaxSizeSet',
+            imrpc_dot_proxy__pb2.EngineVolumeSnapshotMaxSizeSetRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeSnapshot(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/VolumeSnapshot',
+            imrpc_dot_proxy__pb2.EngineVolumeSnapshotRequest.SerializeToString,
+            imrpc_dot_proxy__pb2.EngineVolumeSnapshotProxyResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotList(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/SnapshotList',
+            imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+            imrpc_dot_proxy__pb2.EngineSnapshotListProxyResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotRevert(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/SnapshotRevert',
+            imrpc_dot_proxy__pb2.EngineSnapshotRevertRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotPurge(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/SnapshotPurge',
+            imrpc_dot_proxy__pb2.EngineSnapshotPurgeRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotPurgeStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/SnapshotPurgeStatus',
+            imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+            imrpc_dot_proxy__pb2.EngineSnapshotPurgeStatusProxyResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotClone(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/SnapshotClone',
+            imrpc_dot_proxy__pb2.EngineSnapshotCloneRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotCloneStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/SnapshotCloneStatus',
+            imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+            imrpc_dot_proxy__pb2.EngineSnapshotCloneStatusProxyResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotRemove(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/SnapshotRemove',
+            imrpc_dot_proxy__pb2.EngineSnapshotRemoveRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotHash(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/SnapshotHash',
+            imrpc_dot_proxy__pb2.EngineSnapshotHashRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotHashStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/SnapshotHashStatus',
+            imrpc_dot_proxy__pb2.EngineSnapshotHashStatusRequest.SerializeToString,
+            imrpc_dot_proxy__pb2.EngineSnapshotHashStatusProxyResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotBackup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/SnapshotBackup',
+            imrpc_dot_proxy__pb2.EngineSnapshotBackupRequest.SerializeToString,
+            imrpc_dot_proxy__pb2.EngineSnapshotBackupProxyResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotBackupStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/SnapshotBackupStatus',
+            imrpc_dot_proxy__pb2.EngineSnapshotBackupStatusRequest.SerializeToString,
+            imrpc_dot_proxy__pb2.EngineSnapshotBackupStatusProxyResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def BackupRestore(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/BackupRestore',
+            imrpc_dot_proxy__pb2.EngineBackupRestoreRequest.SerializeToString,
+            imrpc_dot_proxy__pb2.EngineBackupRestoreProxyResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def BackupRestoreStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/BackupRestoreStatus',
+            imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+            imrpc_dot_proxy__pb2.EngineBackupRestoreStatusProxyResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def BackupRestoreFinish(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/BackupRestoreFinish',
+            imrpc_dot_proxy__pb2.EngineBackupRestoreFinishRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def CleanupBackupMountPoints(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/CleanupBackupMountPoints',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaAdd(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/ReplicaAdd',
+            imrpc_dot_proxy__pb2.EngineReplicaAddRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaList(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/ReplicaList',
+            imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+            imrpc_dot_proxy__pb2.EngineReplicaListProxyResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaRebuildingStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/ReplicaRebuildingStatus',
+            imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+            imrpc_dot_proxy__pb2.EngineReplicaRebuildStatusProxyResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaVerifyRebuild(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/ReplicaVerifyRebuild',
+            imrpc_dot_proxy__pb2.EngineReplicaVerifyRebuildRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaRemove(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/ReplicaRemove',
+            imrpc_dot_proxy__pb2.EngineReplicaRemoveRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaModeUpdate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/ReplicaModeUpdate',
+            imrpc_dot_proxy__pb2.EngineReplicaModeUpdateRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def MetricsGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/MetricsGet',
+            imrpc_dot_proxy__pb2.ProxyEngineRequest.SerializeToString,
+            imrpc_dot_proxy__pb2.EngineMetricsGetProxyResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def RemountReadOnlyVolume(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/imrpc.ProxyEngineService/RemountReadOnlyVolume',
+            imrpc_dot_proxy__pb2.RemountVolumeRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/generated-py/ptypes/common_pb2.py b/generated-py/ptypes/common_pb2.py
new file mode 100644
index 0000000..90c7ef6
--- /dev/null
+++ b/generated-py/ptypes/common_pb2.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: ptypes/common.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13ptypes/common.proto\x12\x06ptypes\"Q\n\x0cSyncFileInfo\x12\x16\n\x0e\x66rom_file_name\x18\x01 \x01(\t\x12\x14\n\x0cto_file_name\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tual_size\x18\x03 \x01(\x03\x42\x33Z1github.com/longhorn/types/pkg/generated/enginerpcb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'ptypes.common_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z1github.com/longhorn/types/pkg/generated/enginerpc'
+  _globals['_SYNCFILEINFO']._serialized_start=31
+  _globals['_SYNCFILEINFO']._serialized_end=112
+# @@protoc_insertion_point(module_scope)
diff --git a/generated-py/ptypes/common_pb2_grpc.py b/generated-py/ptypes/common_pb2_grpc.py
new file mode 100644
index 0000000..2daafff
--- /dev/null
+++ b/generated-py/ptypes/common_pb2_grpc.py
@@ -0,0 +1,4 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
diff --git a/generated-py/ptypes/controller_pb2.py b/generated-py/ptypes/controller_pb2.py
new file mode 100644
index 0000000..6ad8a6b
--- /dev/null
+++ b/generated-py/ptypes/controller_pb2.py
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: ptypes/controller.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from ptypes import common_pb2 as ptypes_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17ptypes/controller.proto\x12\x06ptypes\x1a\x1bgoogle/protobuf/empty.proto\x1a\x13ptypes/common.proto\"\xa8\x02\n\x06Volume\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04size\x18\x02 \x01(\x03\x12\x14\n\x0creplicaCount\x18\x03 \x01(\x05\x12\x10\n\x08\x65ndpoint\x18\x04 \x01(\t\x12\x10\n\x08\x66rontend\x18\x05 \x01(\t\x12\x15\n\rfrontendState\x18\x06 \x01(\t\x12\x13\n\x0bisExpanding\x18\x07 \x01(\x08\x12\x1c\n\x14last_expansion_error\x18\x08 \x01(\t\x12 \n\x18last_expansion_failed_at\x18\t \x01(\t\x12%\n\x1dunmap_mark_snap_chain_removed\x18\n \x01(\x08\x12\x1a\n\x12snapshot_max_count\x18\x0b \x01(\x05\x12\x19\n\x11snapshot_max_size\x18\x0c \x01(\x03\"7\n\x0eReplicaAddress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x14\n\x0cinstanceName\x18\x02 \x01(\t\"_\n\x11\x43ontrollerReplica\x12\'\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0b\x32\x16.ptypes.ReplicaAddress\x12!\n\x04mode\x18\x02 \x01(\x0e\x32\x13.ptypes.ReplicaMode\"Q\n\x12VolumeStartRequest\x12\x18\n\x10replicaAddresses\x18\x01 \x03(\t\x12\x0c\n\x04size\x18\x02 \x01(\x03\x12\x13\n\x0b\x63urrentSize\x18\x03 \x01(\x03\"\x8f\x01\n\x15VolumeSnapshotRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x39\n\x06labels\x18\x02 \x03(\x0b\x32).ptypes.VolumeSnapshotRequest.LabelsEntry\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"#\n\x13VolumeSnapshotReply\x12\x0c\n\x04name\x18\x01 \x01(\t\"#\n\x13VolumeRevertRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"#\n\x13VolumeExpandRequest\x12\x0c\n\x04size\x18\x01 \x01(\x03\".\n\x1aVolumeFrontendStartRequest\x12\x10\n\x08\x66rontend\x18\x01 \x01(\t\"<\n)VolumeUnmapMarkSnapChainRemovedSetRequest\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\"1\n VolumeSnapshotMaxCountSetRequest\x12\r\n\x05\x63ount\x18\x01 \x01(\x05\"/\n\x1fVolumeSnapshotMaxSizeSetRequest\x12\x0c\n\x04size\x18\x01 \x01(\x03\"3\n\x1bVolumePrepareRestoreRequest\x12\x14\n\x0clastRestored\x18\x01 \x01(\t\"5\n\x1aVolumeFinishRestoreRequest\x12\x17\n\x0f\x63urrentRestored\x18\x01 \x01(\t\"?\n\x10ReplicaListReply\x12+\n\x08replicas\x18\x01 \x03(\x0b\x32\x19.ptypes.ControllerReplica\"o\n\x1e\x43ontrollerReplicaCreateRequest\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x19\n\x11snapshot_required\x18\x02 \x01(\x08\x12!\n\x04mode\x18\x03 \x01(\x0e\x32\x13.ptypes.ReplicaMode\"{\n\x1aReplicaPrepareRebuildReply\x12*\n\x07replica\x18\x01 \x01(\x0b\x32\x19.ptypes.ControllerReplica\x12\x31\n\x13sync_file_info_list\x18\x02 \x03(\x0b\x32\x14.ptypes.SyncFileInfo\"#\n\x12JournalListRequest\x12\r\n\x05limit\x18\x01 \x01(\x03\"\xef\x01\n\rVersionOutput\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x11\n\tgitCommit\x18\x02 \x01(\t\x12\x11\n\tbuildDate\x18\x03 \x01(\t\x12\x15\n\rcliAPIVersion\x18\x04 \x01(\x03\x12\x18\n\x10\x63liAPIMinVersion\x18\x05 \x01(\x03\x12\x1c\n\x14\x63ontrollerAPIVersion\x18\x06 \x01(\x03\x12\x1f\n\x17\x63ontrollerAPIMinVersion\x18\x07 \x01(\x03\x12\x19\n\x11\x64\x61taFormatVersion\x18\x08 \x01(\x03\x12\x1c\n\x14\x64\x61taFormatMinVersion\x18\t \x01(\x03\"?\n\x15VersionDetailGetReply\x12&\n\x07version\x18\x01 \x01(\x0b\x32\x15.ptypes.VersionOutput\"\x8a\x01\n\x07Metrics\x12\x16\n\x0ereadThroughput\x18\x01 \x01(\x04\x12\x17\n\x0fwriteThroughput\x18\x02 \x01(\x04\x12\x13\n\x0breadLatency\x18\x03 \x01(\x04\x12\x14\n\x0cwriteLatency\x18\x04 \x01(\x04\x12\x10\n\x08readIOPS\x18\x05 \x01(\x04\x12\x11\n\twriteIOPS\x18\x06 \x01(\x04\"3\n\x0fMetricsGetReply\x12 \n\x07metrics\x18\x01 \x01(\x0b\x32\x0f.ptypes.Metrics*&\n\x0bReplicaMode\x12\x06\n\x02WO\x10\x00\x12\x06\n\x02RW\x10\x01\x12\x07\n\x03\x45RR\x10\x02\x32\xfc\x0b\n\x11\x43ontrollerService\x12\x33\n\tVolumeGet\x12\x16.google.protobuf.Empty\x1a\x0e.ptypes.Volume\x12\x39\n\x0bVolumeStart\x12\x1a.ptypes.VolumeStartRequest\x1a\x0e.ptypes.Volume\x12\x38\n\x0eVolumeShutdown\x12\x16.google.protobuf.Empty\x1a\x0e.ptypes.Volume\x12L\n\x0eVolumeSnapshot\x12\x1d.ptypes.VolumeSnapshotRequest\x1a\x1b.ptypes.VolumeSnapshotReply\x12;\n\x0cVolumeRevert\x12\x1b.ptypes.VolumeRevertRequest\x1a\x0e.ptypes.Volume\x12;\n\x0cVolumeExpand\x12\x1b.ptypes.VolumeExpandRequest\x1a\x0e.ptypes.Volume\x12I\n\x13VolumeFrontendStart\x12\".ptypes.VolumeFrontendStartRequest\x1a\x0e.ptypes.Volume\x12@\n\x16VolumeFrontendShutdown\x12\x16.google.protobuf.Empty\x1a\x0e.ptypes.Volume\x12g\n\"VolumeUnmapMarkSnapChainRemovedSet\x12\x31.ptypes.VolumeUnmapMarkSnapChainRemovedSetRequest\x1a\x0e.ptypes.Volume\x12U\n\x19VolumeSnapshotMaxCountSet\x12(.ptypes.VolumeSnapshotMaxCountSetRequest\x1a\x0e.ptypes.Volume\x12S\n\x18VolumeSnapshotMaxSizeSet\x12\'.ptypes.VolumeSnapshotMaxSizeSetRequest\x1a\x0e.ptypes.Volume\x12?\n\x0bReplicaList\x12\x16.google.protobuf.Empty\x1a\x18.ptypes.ReplicaListReply\x12?\n\nReplicaGet\x12\x16.ptypes.ReplicaAddress\x1a\x19.ptypes.ControllerReplica\x12\\\n\x17\x43ontrollerReplicaCreate\x12&.ptypes.ControllerReplicaCreateRequest\x1a\x19.ptypes.ControllerReplica\x12?\n\rReplicaDelete\x12\x16.ptypes.ReplicaAddress\x1a\x16.google.protobuf.Empty\x12\x45\n\rReplicaUpdate\x12\x19.ptypes.ControllerReplica\x1a\x19.ptypes.ControllerReplica\x12S\n\x15ReplicaPrepareRebuild\x12\x16.ptypes.ReplicaAddress\x1a\".ptypes.ReplicaPrepareRebuildReply\x12I\n\x14ReplicaVerifyRebuild\x12\x16.ptypes.ReplicaAddress\x1a\x19.ptypes.ControllerReplica\x12\x41\n\x0bJournalList\x12\x1a.ptypes.JournalListRequest\x1a\x16.google.protobuf.Empty\x12I\n\x10VersionDetailGet\x12\x16.google.protobuf.Empty\x1a\x1d.ptypes.VersionDetailGetReply\x12=\n\nMetricsGet\x12\x16.google.protobuf.Empty\x1a\x17.ptypes.MetricsGetReplyB3Z1github.com/longhorn/types/pkg/generated/enginerpcb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'ptypes.controller_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z1github.com/longhorn/types/pkg/generated/enginerpc'
+  _VOLUMESNAPSHOTREQUEST_LABELSENTRY._options = None
+  _VOLUMESNAPSHOTREQUEST_LABELSENTRY._serialized_options = b'8\001'
+  _globals['_REPLICAMODE']._serialized_start=2037
+  _globals['_REPLICAMODE']._serialized_end=2075
+  _globals['_VOLUME']._serialized_start=86
+  _globals['_VOLUME']._serialized_end=382
+  _globals['_REPLICAADDRESS']._serialized_start=384
+  _globals['_REPLICAADDRESS']._serialized_end=439
+  _globals['_CONTROLLERREPLICA']._serialized_start=441
+  _globals['_CONTROLLERREPLICA']._serialized_end=536
+  _globals['_VOLUMESTARTREQUEST']._serialized_start=538
+  _globals['_VOLUMESTARTREQUEST']._serialized_end=619
+  _globals['_VOLUMESNAPSHOTREQUEST']._serialized_start=622
+  _globals['_VOLUMESNAPSHOTREQUEST']._serialized_end=765
+  _globals['_VOLUMESNAPSHOTREQUEST_LABELSENTRY']._serialized_start=720
+  _globals['_VOLUMESNAPSHOTREQUEST_LABELSENTRY']._serialized_end=765
+  _globals['_VOLUMESNAPSHOTREPLY']._serialized_start=767
+  _globals['_VOLUMESNAPSHOTREPLY']._serialized_end=802
+  _globals['_VOLUMEREVERTREQUEST']._serialized_start=804
+  _globals['_VOLUMEREVERTREQUEST']._serialized_end=839
+  _globals['_VOLUMEEXPANDREQUEST']._serialized_start=841
+  _globals['_VOLUMEEXPANDREQUEST']._serialized_end=876
+  _globals['_VOLUMEFRONTENDSTARTREQUEST']._serialized_start=878
+  _globals['_VOLUMEFRONTENDSTARTREQUEST']._serialized_end=924
+  _globals['_VOLUMEUNMAPMARKSNAPCHAINREMOVEDSETREQUEST']._serialized_start=926
+  _globals['_VOLUMEUNMAPMARKSNAPCHAINREMOVEDSETREQUEST']._serialized_end=986
+  _globals['_VOLUMESNAPSHOTMAXCOUNTSETREQUEST']._serialized_start=988
+  _globals['_VOLUMESNAPSHOTMAXCOUNTSETREQUEST']._serialized_end=1037
+  _globals['_VOLUMESNAPSHOTMAXSIZESETREQUEST']._serialized_start=1039
+  _globals['_VOLUMESNAPSHOTMAXSIZESETREQUEST']._serialized_end=1086
+  _globals['_VOLUMEPREPARERESTOREREQUEST']._serialized_start=1088
+  _globals['_VOLUMEPREPARERESTOREREQUEST']._serialized_end=1139
+  _globals['_VOLUMEFINISHRESTOREREQUEST']._serialized_start=1141
+  _globals['_VOLUMEFINISHRESTOREREQUEST']._serialized_end=1194
+  _globals['_REPLICALISTREPLY']._serialized_start=1196
+  _globals['_REPLICALISTREPLY']._serialized_end=1259
+  _globals['_CONTROLLERREPLICACREATEREQUEST']._serialized_start=1261
+  _globals['_CONTROLLERREPLICACREATEREQUEST']._serialized_end=1372
+  _globals['_REPLICAPREPAREREBUILDREPLY']._serialized_start=1374
+  _globals['_REPLICAPREPAREREBUILDREPLY']._serialized_end=1497
+  _globals['_JOURNALLISTREQUEST']._serialized_start=1499
+  _globals['_JOURNALLISTREQUEST']._serialized_end=1534
+  _globals['_VERSIONOUTPUT']._serialized_start=1537
+  _globals['_VERSIONOUTPUT']._serialized_end=1776
+  _globals['_VERSIONDETAILGETREPLY']._serialized_start=1778
+  _globals['_VERSIONDETAILGETREPLY']._serialized_end=1841
+  _globals['_METRICS']._serialized_start=1844
+  _globals['_METRICS']._serialized_end=1982
+  _globals['_METRICSGETREPLY']._serialized_start=1984
+  _globals['_METRICSGETREPLY']._serialized_end=2035
+  _globals['_CONTROLLERSERVICE']._serialized_start=2078
+  _globals['_CONTROLLERSERVICE']._serialized_end=3610
+# @@protoc_insertion_point(module_scope)
diff --git a/generated-py/ptypes/controller_pb2_grpc.py b/generated-py/ptypes/controller_pb2_grpc.py
new file mode 100644
index 0000000..c385576
--- /dev/null
+++ b/generated-py/ptypes/controller_pb2_grpc.py
@@ -0,0 +1,727 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from ptypes import controller_pb2 as ptypes_dot_controller__pb2
+
+
+class ControllerServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.VolumeGet = channel.unary_unary(
+                '/ptypes.ControllerService/VolumeGet',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.Volume.FromString,
+                )
+        self.VolumeStart = channel.unary_unary(
+                '/ptypes.ControllerService/VolumeStart',
+                request_serializer=ptypes_dot_controller__pb2.VolumeStartRequest.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.Volume.FromString,
+                )
+        self.VolumeShutdown = channel.unary_unary(
+                '/ptypes.ControllerService/VolumeShutdown',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.Volume.FromString,
+                )
+        self.VolumeSnapshot = channel.unary_unary(
+                '/ptypes.ControllerService/VolumeSnapshot',
+                request_serializer=ptypes_dot_controller__pb2.VolumeSnapshotRequest.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.VolumeSnapshotReply.FromString,
+                )
+        self.VolumeRevert = channel.unary_unary(
+                '/ptypes.ControllerService/VolumeRevert',
+                request_serializer=ptypes_dot_controller__pb2.VolumeRevertRequest.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.Volume.FromString,
+                )
+        self.VolumeExpand = channel.unary_unary(
+                '/ptypes.ControllerService/VolumeExpand',
+                request_serializer=ptypes_dot_controller__pb2.VolumeExpandRequest.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.Volume.FromString,
+                )
+        self.VolumeFrontendStart = channel.unary_unary(
+                '/ptypes.ControllerService/VolumeFrontendStart',
+                request_serializer=ptypes_dot_controller__pb2.VolumeFrontendStartRequest.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.Volume.FromString,
+                )
+        self.VolumeFrontendShutdown = channel.unary_unary(
+                '/ptypes.ControllerService/VolumeFrontendShutdown',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.Volume.FromString,
+                )
+        self.VolumeUnmapMarkSnapChainRemovedSet = channel.unary_unary(
+                '/ptypes.ControllerService/VolumeUnmapMarkSnapChainRemovedSet',
+                request_serializer=ptypes_dot_controller__pb2.VolumeUnmapMarkSnapChainRemovedSetRequest.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.Volume.FromString,
+                )
+        self.VolumeSnapshotMaxCountSet = channel.unary_unary(
+                '/ptypes.ControllerService/VolumeSnapshotMaxCountSet',
+                request_serializer=ptypes_dot_controller__pb2.VolumeSnapshotMaxCountSetRequest.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.Volume.FromString,
+                )
+        self.VolumeSnapshotMaxSizeSet = channel.unary_unary(
+                '/ptypes.ControllerService/VolumeSnapshotMaxSizeSet',
+                request_serializer=ptypes_dot_controller__pb2.VolumeSnapshotMaxSizeSetRequest.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.Volume.FromString,
+                )
+        self.ReplicaList = channel.unary_unary(
+                '/ptypes.ControllerService/ReplicaList',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.ReplicaListReply.FromString,
+                )
+        self.ReplicaGet = channel.unary_unary(
+                '/ptypes.ControllerService/ReplicaGet',
+                request_serializer=ptypes_dot_controller__pb2.ReplicaAddress.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.ControllerReplica.FromString,
+                )
+        self.ControllerReplicaCreate = channel.unary_unary(
+                '/ptypes.ControllerService/ControllerReplicaCreate',
+                request_serializer=ptypes_dot_controller__pb2.ControllerReplicaCreateRequest.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.ControllerReplica.FromString,
+                )
+        self.ReplicaDelete = channel.unary_unary(
+                '/ptypes.ControllerService/ReplicaDelete',
+                request_serializer=ptypes_dot_controller__pb2.ReplicaAddress.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaUpdate = channel.unary_unary(
+                '/ptypes.ControllerService/ReplicaUpdate',
+                request_serializer=ptypes_dot_controller__pb2.ControllerReplica.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.ControllerReplica.FromString,
+                )
+        self.ReplicaPrepareRebuild = channel.unary_unary(
+                '/ptypes.ControllerService/ReplicaPrepareRebuild',
+                request_serializer=ptypes_dot_controller__pb2.ReplicaAddress.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.ReplicaPrepareRebuildReply.FromString,
+                )
+        self.ReplicaVerifyRebuild = channel.unary_unary(
+                '/ptypes.ControllerService/ReplicaVerifyRebuild',
+                request_serializer=ptypes_dot_controller__pb2.ReplicaAddress.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.ControllerReplica.FromString,
+                )
+        self.JournalList = channel.unary_unary(
+                '/ptypes.ControllerService/JournalList',
+                request_serializer=ptypes_dot_controller__pb2.JournalListRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.VersionDetailGet = channel.unary_unary(
+                '/ptypes.ControllerService/VersionDetailGet',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.VersionDetailGetReply.FromString,
+                )
+        self.MetricsGet = channel.unary_unary(
+                '/ptypes.ControllerService/MetricsGet',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_controller__pb2.MetricsGetReply.FromString,
+                )
+
+
+class ControllerServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def VolumeGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeStart(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeShutdown(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeSnapshot(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeRevert(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeExpand(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeFrontendStart(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeFrontendShutdown(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeUnmapMarkSnapChainRemovedSet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeSnapshotMaxCountSet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeSnapshotMaxSizeSet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaList(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ControllerReplicaCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaDelete(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaUpdate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaPrepareRebuild(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaVerifyRebuild(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def JournalList(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VersionDetailGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def MetricsGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ControllerServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'VolumeGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeGet,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.Volume.SerializeToString,
+            ),
+            'VolumeStart': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeStart,
+                    request_deserializer=ptypes_dot_controller__pb2.VolumeStartRequest.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.Volume.SerializeToString,
+            ),
+            'VolumeShutdown': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeShutdown,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.Volume.SerializeToString,
+            ),
+            'VolumeSnapshot': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeSnapshot,
+                    request_deserializer=ptypes_dot_controller__pb2.VolumeSnapshotRequest.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.VolumeSnapshotReply.SerializeToString,
+            ),
+            'VolumeRevert': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeRevert,
+                    request_deserializer=ptypes_dot_controller__pb2.VolumeRevertRequest.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.Volume.SerializeToString,
+            ),
+            'VolumeExpand': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeExpand,
+                    request_deserializer=ptypes_dot_controller__pb2.VolumeExpandRequest.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.Volume.SerializeToString,
+            ),
+            'VolumeFrontendStart': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeFrontendStart,
+                    request_deserializer=ptypes_dot_controller__pb2.VolumeFrontendStartRequest.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.Volume.SerializeToString,
+            ),
+            'VolumeFrontendShutdown': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeFrontendShutdown,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.Volume.SerializeToString,
+            ),
+            'VolumeUnmapMarkSnapChainRemovedSet': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeUnmapMarkSnapChainRemovedSet,
+                    request_deserializer=ptypes_dot_controller__pb2.VolumeUnmapMarkSnapChainRemovedSetRequest.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.Volume.SerializeToString,
+            ),
+            'VolumeSnapshotMaxCountSet': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeSnapshotMaxCountSet,
+                    request_deserializer=ptypes_dot_controller__pb2.VolumeSnapshotMaxCountSetRequest.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.Volume.SerializeToString,
+            ),
+            'VolumeSnapshotMaxSizeSet': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeSnapshotMaxSizeSet,
+                    request_deserializer=ptypes_dot_controller__pb2.VolumeSnapshotMaxSizeSetRequest.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.Volume.SerializeToString,
+            ),
+            'ReplicaList': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaList,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.ReplicaListReply.SerializeToString,
+            ),
+            'ReplicaGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaGet,
+                    request_deserializer=ptypes_dot_controller__pb2.ReplicaAddress.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.ControllerReplica.SerializeToString,
+            ),
+            'ControllerReplicaCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.ControllerReplicaCreate,
+                    request_deserializer=ptypes_dot_controller__pb2.ControllerReplicaCreateRequest.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.ControllerReplica.SerializeToString,
+            ),
+            'ReplicaDelete': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaDelete,
+                    request_deserializer=ptypes_dot_controller__pb2.ReplicaAddress.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaUpdate': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaUpdate,
+                    request_deserializer=ptypes_dot_controller__pb2.ControllerReplica.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.ControllerReplica.SerializeToString,
+            ),
+            'ReplicaPrepareRebuild': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaPrepareRebuild,
+                    request_deserializer=ptypes_dot_controller__pb2.ReplicaAddress.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.ReplicaPrepareRebuildReply.SerializeToString,
+            ),
+            'ReplicaVerifyRebuild': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaVerifyRebuild,
+                    request_deserializer=ptypes_dot_controller__pb2.ReplicaAddress.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.ControllerReplica.SerializeToString,
+            ),
+            'JournalList': grpc.unary_unary_rpc_method_handler(
+                    servicer.JournalList,
+                    request_deserializer=ptypes_dot_controller__pb2.JournalListRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'VersionDetailGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.VersionDetailGet,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.VersionDetailGetReply.SerializeToString,
+            ),
+            'MetricsGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.MetricsGet,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_controller__pb2.MetricsGetReply.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'ptypes.ControllerService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ControllerService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def VolumeGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/VolumeGet',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_controller__pb2.Volume.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeStart(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/VolumeStart',
+            ptypes_dot_controller__pb2.VolumeStartRequest.SerializeToString,
+            ptypes_dot_controller__pb2.Volume.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeShutdown(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/VolumeShutdown',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_controller__pb2.Volume.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeSnapshot(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/VolumeSnapshot',
+            ptypes_dot_controller__pb2.VolumeSnapshotRequest.SerializeToString,
+            ptypes_dot_controller__pb2.VolumeSnapshotReply.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeRevert(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/VolumeRevert',
+            ptypes_dot_controller__pb2.VolumeRevertRequest.SerializeToString,
+            ptypes_dot_controller__pb2.Volume.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeExpand(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/VolumeExpand',
+            ptypes_dot_controller__pb2.VolumeExpandRequest.SerializeToString,
+            ptypes_dot_controller__pb2.Volume.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeFrontendStart(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/VolumeFrontendStart',
+            ptypes_dot_controller__pb2.VolumeFrontendStartRequest.SerializeToString,
+            ptypes_dot_controller__pb2.Volume.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeFrontendShutdown(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/VolumeFrontendShutdown',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_controller__pb2.Volume.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeUnmapMarkSnapChainRemovedSet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/VolumeUnmapMarkSnapChainRemovedSet',
+            ptypes_dot_controller__pb2.VolumeUnmapMarkSnapChainRemovedSetRequest.SerializeToString,
+            ptypes_dot_controller__pb2.Volume.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeSnapshotMaxCountSet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/VolumeSnapshotMaxCountSet',
+            ptypes_dot_controller__pb2.VolumeSnapshotMaxCountSetRequest.SerializeToString,
+            ptypes_dot_controller__pb2.Volume.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeSnapshotMaxSizeSet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/VolumeSnapshotMaxSizeSet',
+            ptypes_dot_controller__pb2.VolumeSnapshotMaxSizeSetRequest.SerializeToString,
+            ptypes_dot_controller__pb2.Volume.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaList(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/ReplicaList',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_controller__pb2.ReplicaListReply.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/ReplicaGet',
+            ptypes_dot_controller__pb2.ReplicaAddress.SerializeToString,
+            ptypes_dot_controller__pb2.ControllerReplica.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ControllerReplicaCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/ControllerReplicaCreate',
+            ptypes_dot_controller__pb2.ControllerReplicaCreateRequest.SerializeToString,
+            ptypes_dot_controller__pb2.ControllerReplica.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaDelete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/ReplicaDelete',
+            ptypes_dot_controller__pb2.ReplicaAddress.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaUpdate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/ReplicaUpdate',
+            ptypes_dot_controller__pb2.ControllerReplica.SerializeToString,
+            ptypes_dot_controller__pb2.ControllerReplica.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaPrepareRebuild(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/ReplicaPrepareRebuild',
+            ptypes_dot_controller__pb2.ReplicaAddress.SerializeToString,
+            ptypes_dot_controller__pb2.ReplicaPrepareRebuildReply.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaVerifyRebuild(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/ReplicaVerifyRebuild',
+            ptypes_dot_controller__pb2.ReplicaAddress.SerializeToString,
+            ptypes_dot_controller__pb2.ControllerReplica.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def JournalList(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/JournalList',
+            ptypes_dot_controller__pb2.JournalListRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VersionDetailGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/VersionDetailGet',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_controller__pb2.VersionDetailGetReply.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def MetricsGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ControllerService/MetricsGet',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_controller__pb2.MetricsGetReply.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/generated-py/ptypes/replica_pb2.py b/generated-py/ptypes/replica_pb2.py
new file mode 100644
index 0000000..ea2d41e
--- /dev/null
+++ b/generated-py/ptypes/replica_pb2.py
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: ptypes/replica.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14ptypes/replica.proto\x12\x06ptypes\x1a\x1bgoogle/protobuf/empty.proto\"$\n\x14ReplicaCreateRequest\x12\x0c\n\x04size\x18\x01 \x01(\t\"9\n\x15ReplicaCreateResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\"6\n\x12ReplicaGetResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\"7\n\x13ReplicaOpenResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\"8\n\x14ReplicaCloseResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\"9\n\x15ReplicaReloadResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\"5\n\x14ReplicaRevertRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x63reated\x18\x02 \x01(\t\"9\n\x15ReplicaRevertResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\"\xb8\x01\n\x16ReplicaSnapshotRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0cuser_created\x18\x02 \x01(\x08\x12\x0f\n\x07\x63reated\x18\x03 \x01(\t\x12:\n\x06labels\x18\x04 \x03(\x0b\x32*.ptypes.ReplicaSnapshotRequest.LabelsEntry\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\";\n\x17ReplicaSnapshotResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\"$\n\x14ReplicaExpandRequest\x12\x0c\n\x04size\x18\x01 \x01(\x03\"9\n\x15ReplicaExpandResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\"0\n\x11\x44iskRemoveRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\"6\n\x12\x44iskRemoveResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\"4\n\x12\x44iskReplaceRequest\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"7\n\x13\x44iskReplaceResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\"(\n\x18\x44iskPrepareRemoveRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"L\n\x19\x44iskPrepareRemoveResponse\x12/\n\noperations\x18\x01 \x03(\x0b\x32\x1b.ptypes.PrepareRemoveAction\"(\n\x18\x44iskMarkAsRemovedRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"=\n\x19\x44iskMarkAsRemovedResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\"*\n\x14RebuildingSetRequest\x12\x12\n\nrebuilding\x18\x01 \x01(\x08\"9\n\x15RebuildingSetResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\",\n\x19RevisionCounterSetRequest\x12\x0f\n\x07\x63ounter\x18\x01 \x01(\x03\">\n\x1aRevisionCounterSetResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\"6\n#UnmapMarkDiskChainRemovedSetRequest\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\"H\n$UnmapMarkDiskChainRemovedSetResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\"+\n\x1aSnapshotMaxCountSetRequest\x12\r\n\x05\x63ount\x18\x01 \x01(\x05\"?\n\x1bSnapshotMaxCountSetResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\")\n\x19SnapshotMaxSizeSetRequest\x12\x0c\n\x04size\x18\x01 \x01(\x03\">\n\x1aSnapshotMaxSizeSetResponse\x12 \n\x07replica\x18\x01 \x01(\x0b\x32\x0f.ptypes.Replica\"\xae\x02\n\x08\x44iskInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06parent\x18\x02 \x01(\t\x12\x30\n\x08\x63hildren\x18\x03 \x03(\x0b\x32\x1e.ptypes.DiskInfo.ChildrenEntry\x12\x0f\n\x07removed\x18\x04 \x01(\x08\x12\x14\n\x0cuser_created\x18\x05 \x01(\x08\x12\x0f\n\x07\x63reated\x18\x06 \x01(\t\x12\x0c\n\x04size\x18\x07 \x01(\t\x12,\n\x06labels\x18\x08 \x03(\x0b\x32\x1c.ptypes.DiskInfo.LabelsEntry\x1a/\n\rChildrenEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xf7\x03\n\x07Replica\x12\r\n\x05\x64irty\x18\x01 \x01(\x08\x12\x12\n\nrebuilding\x18\x02 \x01(\x08\x12\x0c\n\x04head\x18\x03 \x01(\t\x12\x0e\n\x06parent\x18\x04 \x01(\t\x12\x0c\n\x04size\x18\x05 \x01(\t\x12\x13\n\x0bsector_size\x18\x06 \x01(\x03\x12\x14\n\x0c\x62\x61\x63king_file\x18\x07 \x01(\t\x12\r\n\x05state\x18\x08 \x01(\t\x12\r\n\x05\x63hain\x18\t \x03(\t\x12)\n\x05\x64isks\x18\n \x03(\x0b\x32\x1a.ptypes.Replica.DisksEntry\x12\x18\n\x10remain_snapshots\x18\x0b \x01(\x05\x12\x18\n\x10revision_counter\x18\x0c \x01(\x03\x12\x18\n\x10last_modify_time\x18\r \x01(\x03\x12\x16\n\x0ehead_file_size\x18\x0e \x01(\x03\x12!\n\x19revision_counter_disabled\x18\x0f \x01(\x08\x12%\n\x1dunmap_mark_disk_chain_removed\x18\x10 \x01(\x08\x12\x1c\n\x14snapshot_count_usage\x18\x11 \x01(\x05\x12\x1b\n\x13snapshot_size_usage\x18\x12 \x01(\x03\x1a>\n\nDisksEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.ptypes.DiskInfo:\x02\x38\x01\"E\n\x13PrepareRemoveAction\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x0e\n\x06target\x18\x03 \x01(\t2\xeb\x0b\n\x0eReplicaService\x12N\n\rReplicaCreate\x12\x1c.ptypes.ReplicaCreateRequest\x1a\x1d.ptypes.ReplicaCreateResponse\"\x00\x12\x41\n\rReplicaDelete\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x00\x12\x42\n\nReplicaGet\x12\x16.google.protobuf.Empty\x1a\x1a.ptypes.ReplicaGetResponse\"\x00\x12\x44\n\x0bReplicaOpen\x12\x16.google.protobuf.Empty\x1a\x1b.ptypes.ReplicaOpenResponse\"\x00\x12\x46\n\x0cReplicaClose\x12\x16.google.protobuf.Empty\x1a\x1c.ptypes.ReplicaCloseResponse\"\x00\x12H\n\rReplicaReload\x12\x16.google.protobuf.Empty\x1a\x1d.ptypes.ReplicaReloadResponse\"\x00\x12N\n\rReplicaRevert\x12\x1c.ptypes.ReplicaRevertRequest\x1a\x1d.ptypes.ReplicaRevertResponse\"\x00\x12T\n\x0fReplicaSnapshot\x12\x1e.ptypes.ReplicaSnapshotRequest\x1a\x1f.ptypes.ReplicaSnapshotResponse\"\x00\x12N\n\rReplicaExpand\x12\x1c.ptypes.ReplicaExpandRequest\x1a\x1d.ptypes.ReplicaExpandResponse\"\x00\x12\x45\n\nDiskRemove\x12\x19.ptypes.DiskRemoveRequest\x1a\x1a.ptypes.DiskRemoveResponse\"\x00\x12H\n\x0b\x44iskReplace\x12\x1a.ptypes.DiskReplaceRequest\x1a\x1b.ptypes.DiskReplaceResponse\"\x00\x12Z\n\x11\x44iskPrepareRemove\x12 .ptypes.DiskPrepareRemoveRequest\x1a!.ptypes.DiskPrepareRemoveResponse\"\x00\x12Z\n\x11\x44iskMarkAsRemoved\x12 .ptypes.DiskMarkAsRemovedRequest\x1a!.ptypes.DiskMarkAsRemovedResponse\"\x00\x12N\n\rRebuildingSet\x12\x1c.ptypes.RebuildingSetRequest\x1a\x1d.ptypes.RebuildingSetResponse\"\x00\x12]\n\x12RevisionCounterSet\x12!.ptypes.RevisionCounterSetRequest\x1a\".ptypes.RevisionCounterSetResponse\"\x00\x12{\n\x1cUnmapMarkDiskChainRemovedSet\x12+.ptypes.UnmapMarkDiskChainRemovedSetRequest\x1a,.ptypes.UnmapMarkDiskChainRemovedSetResponse\"\x00\x12`\n\x13SnapshotMaxCountSet\x12\".ptypes.SnapshotMaxCountSetRequest\x1a#.ptypes.SnapshotMaxCountSetResponse\"\x00\x12]\n\x12SnapshotMaxSizeSet\x12!.ptypes.SnapshotMaxSizeSetRequest\x1a\".ptypes.SnapshotMaxSizeSetResponse\"\x00\x42\x33Z1github.com/longhorn/types/pkg/generated/enginerpcb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'ptypes.replica_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z1github.com/longhorn/types/pkg/generated/enginerpc'
+  _REPLICASNAPSHOTREQUEST_LABELSENTRY._options = None
+  _REPLICASNAPSHOTREQUEST_LABELSENTRY._serialized_options = b'8\001'
+  _DISKINFO_CHILDRENENTRY._options = None
+  _DISKINFO_CHILDRENENTRY._serialized_options = b'8\001'
+  _DISKINFO_LABELSENTRY._options = None
+  _DISKINFO_LABELSENTRY._serialized_options = b'8\001'
+  _REPLICA_DISKSENTRY._options = None
+  _REPLICA_DISKSENTRY._serialized_options = b'8\001'
+  _globals['_REPLICACREATEREQUEST']._serialized_start=61
+  _globals['_REPLICACREATEREQUEST']._serialized_end=97
+  _globals['_REPLICACREATERESPONSE']._serialized_start=99
+  _globals['_REPLICACREATERESPONSE']._serialized_end=156
+  _globals['_REPLICAGETRESPONSE']._serialized_start=158
+  _globals['_REPLICAGETRESPONSE']._serialized_end=212
+  _globals['_REPLICAOPENRESPONSE']._serialized_start=214
+  _globals['_REPLICAOPENRESPONSE']._serialized_end=269
+  _globals['_REPLICACLOSERESPONSE']._serialized_start=271
+  _globals['_REPLICACLOSERESPONSE']._serialized_end=327
+  _globals['_REPLICARELOADRESPONSE']._serialized_start=329
+  _globals['_REPLICARELOADRESPONSE']._serialized_end=386
+  _globals['_REPLICAREVERTREQUEST']._serialized_start=388
+  _globals['_REPLICAREVERTREQUEST']._serialized_end=441
+  _globals['_REPLICAREVERTRESPONSE']._serialized_start=443
+  _globals['_REPLICAREVERTRESPONSE']._serialized_end=500
+  _globals['_REPLICASNAPSHOTREQUEST']._serialized_start=503
+  _globals['_REPLICASNAPSHOTREQUEST']._serialized_end=687
+  _globals['_REPLICASNAPSHOTREQUEST_LABELSENTRY']._serialized_start=642
+  _globals['_REPLICASNAPSHOTREQUEST_LABELSENTRY']._serialized_end=687
+  _globals['_REPLICASNAPSHOTRESPONSE']._serialized_start=689
+  _globals['_REPLICASNAPSHOTRESPONSE']._serialized_end=748
+  _globals['_REPLICAEXPANDREQUEST']._serialized_start=750
+  _globals['_REPLICAEXPANDREQUEST']._serialized_end=786
+  _globals['_REPLICAEXPANDRESPONSE']._serialized_start=788
+  _globals['_REPLICAEXPANDRESPONSE']._serialized_end=845
+  _globals['_DISKREMOVEREQUEST']._serialized_start=847
+  _globals['_DISKREMOVEREQUEST']._serialized_end=895
+  _globals['_DISKREMOVERESPONSE']._serialized_start=897
+  _globals['_DISKREMOVERESPONSE']._serialized_end=951
+  _globals['_DISKREPLACEREQUEST']._serialized_start=953
+  _globals['_DISKREPLACEREQUEST']._serialized_end=1005
+  _globals['_DISKREPLACERESPONSE']._serialized_start=1007
+  _globals['_DISKREPLACERESPONSE']._serialized_end=1062
+  _globals['_DISKPREPAREREMOVEREQUEST']._serialized_start=1064
+  _globals['_DISKPREPAREREMOVEREQUEST']._serialized_end=1104
+  _globals['_DISKPREPAREREMOVERESPONSE']._serialized_start=1106
+  _globals['_DISKPREPAREREMOVERESPONSE']._serialized_end=1182
+  _globals['_DISKMARKASREMOVEDREQUEST']._serialized_start=1184
+  _globals['_DISKMARKASREMOVEDREQUEST']._serialized_end=1224
+  _globals['_DISKMARKASREMOVEDRESPONSE']._serialized_start=1226
+  _globals['_DISKMARKASREMOVEDRESPONSE']._serialized_end=1287
+  _globals['_REBUILDINGSETREQUEST']._serialized_start=1289
+  _globals['_REBUILDINGSETREQUEST']._serialized_end=1331
+  _globals['_REBUILDINGSETRESPONSE']._serialized_start=1333
+  _globals['_REBUILDINGSETRESPONSE']._serialized_end=1390
+  _globals['_REVISIONCOUNTERSETREQUEST']._serialized_start=1392
+  _globals['_REVISIONCOUNTERSETREQUEST']._serialized_end=1436
+  _globals['_REVISIONCOUNTERSETRESPONSE']._serialized_start=1438
+  _globals['_REVISIONCOUNTERSETRESPONSE']._serialized_end=1500
+  _globals['_UNMAPMARKDISKCHAINREMOVEDSETREQUEST']._serialized_start=1502
+  _globals['_UNMAPMARKDISKCHAINREMOVEDSETREQUEST']._serialized_end=1556
+  _globals['_UNMAPMARKDISKCHAINREMOVEDSETRESPONSE']._serialized_start=1558
+  _globals['_UNMAPMARKDISKCHAINREMOVEDSETRESPONSE']._serialized_end=1630
+  _globals['_SNAPSHOTMAXCOUNTSETREQUEST']._serialized_start=1632
+  _globals['_SNAPSHOTMAXCOUNTSETREQUEST']._serialized_end=1675
+  _globals['_SNAPSHOTMAXCOUNTSETRESPONSE']._serialized_start=1677
+  _globals['_SNAPSHOTMAXCOUNTSETRESPONSE']._serialized_end=1740
+  _globals['_SNAPSHOTMAXSIZESETREQUEST']._serialized_start=1742
+  _globals['_SNAPSHOTMAXSIZESETREQUEST']._serialized_end=1783
+  _globals['_SNAPSHOTMAXSIZESETRESPONSE']._serialized_start=1785
+  _globals['_SNAPSHOTMAXSIZESETRESPONSE']._serialized_end=1847
+  _globals['_DISKINFO']._serialized_start=1850
+  _globals['_DISKINFO']._serialized_end=2152
+  _globals['_DISKINFO_CHILDRENENTRY']._serialized_start=2058
+  _globals['_DISKINFO_CHILDRENENTRY']._serialized_end=2105
+  _globals['_DISKINFO_LABELSENTRY']._serialized_start=642
+  _globals['_DISKINFO_LABELSENTRY']._serialized_end=687
+  _globals['_REPLICA']._serialized_start=2155
+  _globals['_REPLICA']._serialized_end=2658
+  _globals['_REPLICA_DISKSENTRY']._serialized_start=2596
+  _globals['_REPLICA_DISKSENTRY']._serialized_end=2658
+  _globals['_PREPAREREMOVEACTION']._serialized_start=2660
+  _globals['_PREPAREREMOVEACTION']._serialized_end=2729
+  _globals['_REPLICASERVICE']._serialized_start=2732
+  _globals['_REPLICASERVICE']._serialized_end=4247
+# @@protoc_insertion_point(module_scope)
diff --git a/generated-py/ptypes/replica_pb2_grpc.py b/generated-py/ptypes/replica_pb2_grpc.py
new file mode 100644
index 0000000..2571df3
--- /dev/null
+++ b/generated-py/ptypes/replica_pb2_grpc.py
@@ -0,0 +1,628 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from ptypes import replica_pb2 as ptypes_dot_replica__pb2
+
+
+class ReplicaServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.ReplicaCreate = channel.unary_unary(
+                '/ptypes.ReplicaService/ReplicaCreate',
+                request_serializer=ptypes_dot_replica__pb2.ReplicaCreateRequest.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.ReplicaCreateResponse.FromString,
+                )
+        self.ReplicaDelete = channel.unary_unary(
+                '/ptypes.ReplicaService/ReplicaDelete',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaGet = channel.unary_unary(
+                '/ptypes.ReplicaService/ReplicaGet',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.ReplicaGetResponse.FromString,
+                )
+        self.ReplicaOpen = channel.unary_unary(
+                '/ptypes.ReplicaService/ReplicaOpen',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.ReplicaOpenResponse.FromString,
+                )
+        self.ReplicaClose = channel.unary_unary(
+                '/ptypes.ReplicaService/ReplicaClose',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.ReplicaCloseResponse.FromString,
+                )
+        self.ReplicaReload = channel.unary_unary(
+                '/ptypes.ReplicaService/ReplicaReload',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.ReplicaReloadResponse.FromString,
+                )
+        self.ReplicaRevert = channel.unary_unary(
+                '/ptypes.ReplicaService/ReplicaRevert',
+                request_serializer=ptypes_dot_replica__pb2.ReplicaRevertRequest.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.ReplicaRevertResponse.FromString,
+                )
+        self.ReplicaSnapshot = channel.unary_unary(
+                '/ptypes.ReplicaService/ReplicaSnapshot',
+                request_serializer=ptypes_dot_replica__pb2.ReplicaSnapshotRequest.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.ReplicaSnapshotResponse.FromString,
+                )
+        self.ReplicaExpand = channel.unary_unary(
+                '/ptypes.ReplicaService/ReplicaExpand',
+                request_serializer=ptypes_dot_replica__pb2.ReplicaExpandRequest.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.ReplicaExpandResponse.FromString,
+                )
+        self.DiskRemove = channel.unary_unary(
+                '/ptypes.ReplicaService/DiskRemove',
+                request_serializer=ptypes_dot_replica__pb2.DiskRemoveRequest.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.DiskRemoveResponse.FromString,
+                )
+        self.DiskReplace = channel.unary_unary(
+                '/ptypes.ReplicaService/DiskReplace',
+                request_serializer=ptypes_dot_replica__pb2.DiskReplaceRequest.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.DiskReplaceResponse.FromString,
+                )
+        self.DiskPrepareRemove = channel.unary_unary(
+                '/ptypes.ReplicaService/DiskPrepareRemove',
+                request_serializer=ptypes_dot_replica__pb2.DiskPrepareRemoveRequest.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.DiskPrepareRemoveResponse.FromString,
+                )
+        self.DiskMarkAsRemoved = channel.unary_unary(
+                '/ptypes.ReplicaService/DiskMarkAsRemoved',
+                request_serializer=ptypes_dot_replica__pb2.DiskMarkAsRemovedRequest.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.DiskMarkAsRemovedResponse.FromString,
+                )
+        self.RebuildingSet = channel.unary_unary(
+                '/ptypes.ReplicaService/RebuildingSet',
+                request_serializer=ptypes_dot_replica__pb2.RebuildingSetRequest.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.RebuildingSetResponse.FromString,
+                )
+        self.RevisionCounterSet = channel.unary_unary(
+                '/ptypes.ReplicaService/RevisionCounterSet',
+                request_serializer=ptypes_dot_replica__pb2.RevisionCounterSetRequest.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.RevisionCounterSetResponse.FromString,
+                )
+        self.UnmapMarkDiskChainRemovedSet = channel.unary_unary(
+                '/ptypes.ReplicaService/UnmapMarkDiskChainRemovedSet',
+                request_serializer=ptypes_dot_replica__pb2.UnmapMarkDiskChainRemovedSetRequest.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.UnmapMarkDiskChainRemovedSetResponse.FromString,
+                )
+        self.SnapshotMaxCountSet = channel.unary_unary(
+                '/ptypes.ReplicaService/SnapshotMaxCountSet',
+                request_serializer=ptypes_dot_replica__pb2.SnapshotMaxCountSetRequest.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.SnapshotMaxCountSetResponse.FromString,
+                )
+        self.SnapshotMaxSizeSet = channel.unary_unary(
+                '/ptypes.ReplicaService/SnapshotMaxSizeSet',
+                request_serializer=ptypes_dot_replica__pb2.SnapshotMaxSizeSetRequest.SerializeToString,
+                response_deserializer=ptypes_dot_replica__pb2.SnapshotMaxSizeSetResponse.FromString,
+                )
+
+
+class ReplicaServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def ReplicaCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaDelete(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaOpen(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaClose(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaReload(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaRevert(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaSnapshot(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaExpand(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DiskRemove(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DiskReplace(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DiskPrepareRemove(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DiskMarkAsRemoved(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def RebuildingSet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def RevisionCounterSet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def UnmapMarkDiskChainRemovedSet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotMaxCountSet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotMaxSizeSet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ReplicaServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'ReplicaCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaCreate,
+                    request_deserializer=ptypes_dot_replica__pb2.ReplicaCreateRequest.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.ReplicaCreateResponse.SerializeToString,
+            ),
+            'ReplicaDelete': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaDelete,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaGet,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.ReplicaGetResponse.SerializeToString,
+            ),
+            'ReplicaOpen': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaOpen,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.ReplicaOpenResponse.SerializeToString,
+            ),
+            'ReplicaClose': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaClose,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.ReplicaCloseResponse.SerializeToString,
+            ),
+            'ReplicaReload': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaReload,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.ReplicaReloadResponse.SerializeToString,
+            ),
+            'ReplicaRevert': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaRevert,
+                    request_deserializer=ptypes_dot_replica__pb2.ReplicaRevertRequest.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.ReplicaRevertResponse.SerializeToString,
+            ),
+            'ReplicaSnapshot': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaSnapshot,
+                    request_deserializer=ptypes_dot_replica__pb2.ReplicaSnapshotRequest.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.ReplicaSnapshotResponse.SerializeToString,
+            ),
+            'ReplicaExpand': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaExpand,
+                    request_deserializer=ptypes_dot_replica__pb2.ReplicaExpandRequest.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.ReplicaExpandResponse.SerializeToString,
+            ),
+            'DiskRemove': grpc.unary_unary_rpc_method_handler(
+                    servicer.DiskRemove,
+                    request_deserializer=ptypes_dot_replica__pb2.DiskRemoveRequest.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.DiskRemoveResponse.SerializeToString,
+            ),
+            'DiskReplace': grpc.unary_unary_rpc_method_handler(
+                    servicer.DiskReplace,
+                    request_deserializer=ptypes_dot_replica__pb2.DiskReplaceRequest.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.DiskReplaceResponse.SerializeToString,
+            ),
+            'DiskPrepareRemove': grpc.unary_unary_rpc_method_handler(
+                    servicer.DiskPrepareRemove,
+                    request_deserializer=ptypes_dot_replica__pb2.DiskPrepareRemoveRequest.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.DiskPrepareRemoveResponse.SerializeToString,
+            ),
+            'DiskMarkAsRemoved': grpc.unary_unary_rpc_method_handler(
+                    servicer.DiskMarkAsRemoved,
+                    request_deserializer=ptypes_dot_replica__pb2.DiskMarkAsRemovedRequest.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.DiskMarkAsRemovedResponse.SerializeToString,
+            ),
+            'RebuildingSet': grpc.unary_unary_rpc_method_handler(
+                    servicer.RebuildingSet,
+                    request_deserializer=ptypes_dot_replica__pb2.RebuildingSetRequest.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.RebuildingSetResponse.SerializeToString,
+            ),
+            'RevisionCounterSet': grpc.unary_unary_rpc_method_handler(
+                    servicer.RevisionCounterSet,
+                    request_deserializer=ptypes_dot_replica__pb2.RevisionCounterSetRequest.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.RevisionCounterSetResponse.SerializeToString,
+            ),
+            'UnmapMarkDiskChainRemovedSet': grpc.unary_unary_rpc_method_handler(
+                    servicer.UnmapMarkDiskChainRemovedSet,
+                    request_deserializer=ptypes_dot_replica__pb2.UnmapMarkDiskChainRemovedSetRequest.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.UnmapMarkDiskChainRemovedSetResponse.SerializeToString,
+            ),
+            'SnapshotMaxCountSet': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotMaxCountSet,
+                    request_deserializer=ptypes_dot_replica__pb2.SnapshotMaxCountSetRequest.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.SnapshotMaxCountSetResponse.SerializeToString,
+            ),
+            'SnapshotMaxSizeSet': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotMaxSizeSet,
+                    request_deserializer=ptypes_dot_replica__pb2.SnapshotMaxSizeSetRequest.FromString,
+                    response_serializer=ptypes_dot_replica__pb2.SnapshotMaxSizeSetResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'ptypes.ReplicaService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ReplicaService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def ReplicaCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/ReplicaCreate',
+            ptypes_dot_replica__pb2.ReplicaCreateRequest.SerializeToString,
+            ptypes_dot_replica__pb2.ReplicaCreateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaDelete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/ReplicaDelete',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/ReplicaGet',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_replica__pb2.ReplicaGetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaOpen(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/ReplicaOpen',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_replica__pb2.ReplicaOpenResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaClose(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/ReplicaClose',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_replica__pb2.ReplicaCloseResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaReload(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/ReplicaReload',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_replica__pb2.ReplicaReloadResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaRevert(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/ReplicaRevert',
+            ptypes_dot_replica__pb2.ReplicaRevertRequest.SerializeToString,
+            ptypes_dot_replica__pb2.ReplicaRevertResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaSnapshot(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/ReplicaSnapshot',
+            ptypes_dot_replica__pb2.ReplicaSnapshotRequest.SerializeToString,
+            ptypes_dot_replica__pb2.ReplicaSnapshotResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaExpand(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/ReplicaExpand',
+            ptypes_dot_replica__pb2.ReplicaExpandRequest.SerializeToString,
+            ptypes_dot_replica__pb2.ReplicaExpandResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DiskRemove(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/DiskRemove',
+            ptypes_dot_replica__pb2.DiskRemoveRequest.SerializeToString,
+            ptypes_dot_replica__pb2.DiskRemoveResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DiskReplace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/DiskReplace',
+            ptypes_dot_replica__pb2.DiskReplaceRequest.SerializeToString,
+            ptypes_dot_replica__pb2.DiskReplaceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DiskPrepareRemove(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/DiskPrepareRemove',
+            ptypes_dot_replica__pb2.DiskPrepareRemoveRequest.SerializeToString,
+            ptypes_dot_replica__pb2.DiskPrepareRemoveResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DiskMarkAsRemoved(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/DiskMarkAsRemoved',
+            ptypes_dot_replica__pb2.DiskMarkAsRemovedRequest.SerializeToString,
+            ptypes_dot_replica__pb2.DiskMarkAsRemovedResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def RebuildingSet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/RebuildingSet',
+            ptypes_dot_replica__pb2.RebuildingSetRequest.SerializeToString,
+            ptypes_dot_replica__pb2.RebuildingSetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def RevisionCounterSet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/RevisionCounterSet',
+            ptypes_dot_replica__pb2.RevisionCounterSetRequest.SerializeToString,
+            ptypes_dot_replica__pb2.RevisionCounterSetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UnmapMarkDiskChainRemovedSet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/UnmapMarkDiskChainRemovedSet',
+            ptypes_dot_replica__pb2.UnmapMarkDiskChainRemovedSetRequest.SerializeToString,
+            ptypes_dot_replica__pb2.UnmapMarkDiskChainRemovedSetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotMaxCountSet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/SnapshotMaxCountSet',
+            ptypes_dot_replica__pb2.SnapshotMaxCountSetRequest.SerializeToString,
+            ptypes_dot_replica__pb2.SnapshotMaxCountSetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotMaxSizeSet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.ReplicaService/SnapshotMaxSizeSet',
+            ptypes_dot_replica__pb2.SnapshotMaxSizeSetRequest.SerializeToString,
+            ptypes_dot_replica__pb2.SnapshotMaxSizeSetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/generated-py/ptypes/syncagent_pb2.py b/generated-py/ptypes/syncagent_pb2.py
new file mode 100644
index 0000000..e230ae0
--- /dev/null
+++ b/generated-py/ptypes/syncagent_pb2.py
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: ptypes/syncagent.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from ptypes import common_pb2 as ptypes_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16ptypes/syncagent.proto\x12\x06ptypes\x1a\x1bgoogle/protobuf/empty.proto\x1a\x13ptypes/common.proto\"&\n\x11\x46ileRemoveRequest\x12\x11\n\tfile_name\x18\x01 \x01(\t\"A\n\x11\x46ileRenameRequest\x12\x15\n\rold_file_name\x18\x01 \x01(\t\x12\x15\n\rnew_file_name\x18\x02 \x01(\t\"-\n\x15ReceiverLaunchRequest\x12\x14\n\x0cto_file_name\x18\x01 \x01(\t\"&\n\x16ReceiverLaunchResponse\x12\x0c\n\x04port\x18\x01 \x01(\x05\"\x7f\n\x0f\x46ileSendRequest\x12\x16\n\x0e\x66rom_file_name\x18\x01 \x01(\t\x12\x0c\n\x04host\x18\x02 \x01(\t\x12\x0c\n\x04port\x18\x03 \x01(\x05\x12\x11\n\tfast_sync\x18\x04 \x01(\x08\x12%\n\x1d\x66ile_sync_http_client_timeout\x18\x05 \x01(\x05\"\xa6\x01\n\x10\x46ilesSyncRequest\x12\x14\n\x0c\x66rom_address\x18\x01 \x01(\t\x12\x0f\n\x07to_host\x18\x02 \x01(\t\x12\x31\n\x13sync_file_info_list\x18\x03 \x03(\x0b\x32\x14.ptypes.SyncFileInfo\x12\x11\n\tfast_sync\x18\x04 \x01(\x08\x12%\n\x1d\x66ile_sync_http_client_timeout\x18\x05 \x01(\x05\"\xc1\x01\n\x14SnapshotCloneRequest\x12\x14\n\x0c\x66rom_address\x18\x01 \x01(\t\x12\x0f\n\x07to_host\x18\x02 \x01(\t\x12\x1a\n\x12snapshot_file_name\x18\x03 \x01(\t\x12%\n\x1d\x65xport_backing_image_if_exist\x18\x04 \x01(\x08\x12%\n\x1d\x66ile_sync_http_client_timeout\x18\x05 \x01(\x05\x12\x18\n\x10\x66rom_volume_name\x18\x06 \x01(\t\"\x9b\x01\n\x13VolumeExportRequest\x12\x1a\n\x12snapshot_file_name\x18\x01 \x01(\t\x12\x0c\n\x04host\x18\x02 \x01(\t\x12\x0c\n\x04port\x18\x03 \x01(\x05\x12%\n\x1d\x65xport_backing_image_if_exist\x18\x04 \x01(\x08\x12%\n\x1d\x66ile_sync_http_client_timeout\x18\x05 \x01(\x05\"\x84\x03\n\x13\x42\x61\x63kupCreateRequest\x12\x1a\n\x12snapshot_file_name\x18\x01 \x01(\t\x12\x15\n\rbackup_target\x18\x02 \x01(\t\x12\x13\n\x0bvolume_name\x18\x03 \x01(\t\x12\x0e\n\x06labels\x18\x04 \x03(\t\x12?\n\ncredential\x18\x05 \x03(\x0b\x32+.ptypes.BackupCreateRequest.CredentialEntry\x12\x1a\n\x12\x62\x61\x63king_image_name\x18\x06 \x01(\t\x12\x1e\n\x16\x62\x61\x63king_image_checksum\x18\x07 \x01(\t\x12\x13\n\x0b\x62\x61\x63kup_name\x18\x08 \x01(\t\x12\x1a\n\x12\x63ompression_method\x18\t \x01(\t\x12\x18\n\x10\x63oncurrent_limit\x18\n \x01(\x05\x12\x1a\n\x12storage_class_name\x18\x0b \x01(\t\x1a\x31\n\x0f\x43redentialEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\">\n\x14\x42\x61\x63kupCreateResponse\x12\x0e\n\x06\x62\x61\x63kup\x18\x01 \x01(\t\x12\x16\n\x0eis_incremental\x18\x02 \x01(\x08\"%\n\x13\x42\x61\x63kupRemoveRequest\x12\x0e\n\x06\x62\x61\x63kup\x18\x01 \x01(\t\"%\n\x13\x42\x61\x63kupStatusRequest\x12\x0e\n\x06\x62\x61\x63kup\x18\x01 \x01(\t\"q\n\x14\x42\x61\x63kupStatusResponse\x12\x10\n\x08progress\x18\x01 \x01(\x05\x12\x12\n\nbackup_url\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12\x15\n\rsnapshot_name\x18\x04 \x01(\t\x12\r\n\x05state\x18\x05 \x01(\t\"\xd1\x01\n\x14\x42\x61\x63kupRestoreRequest\x12\x0e\n\x06\x62\x61\x63kup\x18\x01 \x01(\t\x12\x1a\n\x12snapshot_disk_name\x18\x02 \x01(\t\x12@\n\ncredential\x18\x03 \x03(\x0b\x32,.ptypes.BackupRestoreRequest.CredentialEntry\x12\x18\n\x10\x63oncurrent_limit\x18\x04 \x01(\x05\x1a\x31\n\x0f\x43redentialEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xa7\x02\n!BackupRestoreIncrementallyRequest\x12\x0e\n\x06\x62\x61\x63kup\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65lta_file_name\x18\x02 \x01(\t\x12!\n\x19last_restored_backup_name\x18\x03 \x01(\t\x12\x1a\n\x12snapshot_disk_name\x18\x04 \x01(\t\x12M\n\ncredential\x18\x05 \x03(\x0b\x32\x39.ptypes.BackupRestoreIncrementallyRequest.CredentialEntry\x12\x18\n\x10\x63oncurrent_limit\x18\x06 \x01(\x05\x1a\x31\n\x0f\x43redentialEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xc2\x01\n\x15RestoreStatusResponse\x12\x14\n\x0cis_restoring\x18\x01 \x01(\x08\x12\x15\n\rlast_restored\x18\x02 \x01(\t\x12\x10\n\x08progress\x18\x03 \x01(\x05\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x16\n\x0e\x64\x65st_file_name\x18\x05 \x01(\t\x12\r\n\x05state\x18\x06 \x01(\t\x12\x12\n\nbackup_url\x18\x07 \x01(\t\x12 \n\x18\x63urrent_restoring_backup\x18\x08 \x01(\t\"a\n\x1bSnapshotPurgeStatusResponse\x12\x12\n\nis_purging\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x10\n\x08progress\x18\x03 \x01(\x05\x12\r\n\x05state\x18\x04 \x01(\t\"\x83\x01\n\x1cReplicaRebuildStatusResponse\x12\x15\n\ris_rebuilding\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x10\n\x08progress\x18\x03 \x01(\x05\x12\r\n\x05state\x18\x04 \x01(\t\x12\x1c\n\x14\x66rom_replica_address\x18\x05 \x01(\t\"\x96\x01\n\x1bSnapshotCloneStatusResponse\x12\x12\n\nis_cloning\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x10\n\x08progress\x18\x03 \x01(\x05\x12\r\n\x05state\x18\x04 \x01(\t\x12\x1c\n\x14\x66rom_replica_address\x18\x05 \x01(\t\x12\x15\n\rsnapshot_name\x18\x06 \x01(\t\"<\n\x13SnapshotHashRequest\x12\x15\n\rsnapshot_name\x18\x01 \x01(\t\x12\x0e\n\x06rehash\x18\x02 \x01(\x08\"2\n\x19SnapshotHashStatusRequest\x12\x15\n\rsnapshot_name\x18\x01 \x01(\t\"h\n\x1aSnapshotHashStatusResponse\x12\r\n\x05state\x18\x01 \x01(\t\x12\x10\n\x08\x63hecksum\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12\x1a\n\x12silently_corrupted\x18\x04 \x01(\x08\"2\n\x19SnapshotHashCancelRequest\x12\x15\n\rsnapshot_name\x18\x01 \x01(\t\"2\n\x1dSnapshotHashLockStateResponse\x12\x11\n\tis_locked\x18\x01 \x01(\x08\x32\xc4\x0c\n\x10SyncAgentService\x12\x41\n\nFileRemove\x12\x19.ptypes.FileRemoveRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x41\n\nFileRename\x12\x19.ptypes.FileRenameRequest\x1a\x16.google.protobuf.Empty\"\x00\x12=\n\x08\x46ileSend\x12\x17.ptypes.FileSendRequest\x1a\x16.google.protobuf.Empty\"\x00\x12?\n\tFilesSync\x12\x18.ptypes.FilesSyncRequest\x1a\x16.google.protobuf.Empty\"\x00\x12G\n\rSnapshotClone\x12\x1c.ptypes.SnapshotCloneRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x45\n\x0cVolumeExport\x12\x1b.ptypes.VolumeExportRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Q\n\x0eReceiverLaunch\x12\x1d.ptypes.ReceiverLaunchRequest\x1a\x1e.ptypes.ReceiverLaunchResponse\"\x00\x12K\n\x0c\x42\x61\x63kupCreate\x12\x1b.ptypes.BackupCreateRequest\x1a\x1c.ptypes.BackupCreateResponse\"\x00\x12\x45\n\x0c\x42\x61\x63kupRemove\x12\x1b.ptypes.BackupRemoveRequest\x1a\x16.google.protobuf.Empty\"\x00\x12G\n\rBackupRestore\x12\x1c.ptypes.BackupRestoreRequest\x1a\x16.google.protobuf.Empty\"\x00\x12K\n\x0c\x42\x61\x63kupStatus\x12\x1b.ptypes.BackupStatusRequest\x1a\x1c.ptypes.BackupStatusResponse\"\x00\x12\x39\n\x05Reset\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x00\x12H\n\rRestoreStatus\x12\x16.google.protobuf.Empty\x1a\x1d.ptypes.RestoreStatusResponse\"\x00\x12\x41\n\rSnapshotPurge\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x00\x12T\n\x13SnapshotPurgeStatus\x12\x16.google.protobuf.Empty\x1a#.ptypes.SnapshotPurgeStatusResponse\"\x00\x12V\n\x14ReplicaRebuildStatus\x12\x16.google.protobuf.Empty\x1a$.ptypes.ReplicaRebuildStatusResponse\"\x00\x12T\n\x13SnapshotCloneStatus\x12\x16.google.protobuf.Empty\x1a#.ptypes.SnapshotCloneStatusResponse\"\x00\x12\x45\n\x0cSnapshotHash\x12\x1b.ptypes.SnapshotHashRequest\x1a\x16.google.protobuf.Empty\"\x00\x12]\n\x12SnapshotHashStatus\x12!.ptypes.SnapshotHashStatusRequest\x1a\".ptypes.SnapshotHashStatusResponse\"\x00\x12Q\n\x12SnapshotHashCancel\x12!.ptypes.SnapshotHashCancelRequest\x1a\x16.google.protobuf.Empty\"\x00\x12X\n\x15SnapshotHashLockState\x12\x16.google.protobuf.Empty\x1a%.ptypes.SnapshotHashLockStateResponse\"\x00\x42\x33Z1github.com/longhorn/types/pkg/generated/enginerpcb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'ptypes.syncagent_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z1github.com/longhorn/types/pkg/generated/enginerpc'
+  _BACKUPCREATEREQUEST_CREDENTIALENTRY._options = None
+  _BACKUPCREATEREQUEST_CREDENTIALENTRY._serialized_options = b'8\001'
+  _BACKUPRESTOREREQUEST_CREDENTIALENTRY._options = None
+  _BACKUPRESTOREREQUEST_CREDENTIALENTRY._serialized_options = b'8\001'
+  _BACKUPRESTOREINCREMENTALLYREQUEST_CREDENTIALENTRY._options = None
+  _BACKUPRESTOREINCREMENTALLYREQUEST_CREDENTIALENTRY._serialized_options = b'8\001'
+  _globals['_FILEREMOVEREQUEST']._serialized_start=84
+  _globals['_FILEREMOVEREQUEST']._serialized_end=122
+  _globals['_FILERENAMEREQUEST']._serialized_start=124
+  _globals['_FILERENAMEREQUEST']._serialized_end=189
+  _globals['_RECEIVERLAUNCHREQUEST']._serialized_start=191
+  _globals['_RECEIVERLAUNCHREQUEST']._serialized_end=236
+  _globals['_RECEIVERLAUNCHRESPONSE']._serialized_start=238
+  _globals['_RECEIVERLAUNCHRESPONSE']._serialized_end=276
+  _globals['_FILESENDREQUEST']._serialized_start=278
+  _globals['_FILESENDREQUEST']._serialized_end=405
+  _globals['_FILESSYNCREQUEST']._serialized_start=408
+  _globals['_FILESSYNCREQUEST']._serialized_end=574
+  _globals['_SNAPSHOTCLONEREQUEST']._serialized_start=577
+  _globals['_SNAPSHOTCLONEREQUEST']._serialized_end=770
+  _globals['_VOLUMEEXPORTREQUEST']._serialized_start=773
+  _globals['_VOLUMEEXPORTREQUEST']._serialized_end=928
+  _globals['_BACKUPCREATEREQUEST']._serialized_start=931
+  _globals['_BACKUPCREATEREQUEST']._serialized_end=1319
+  _globals['_BACKUPCREATEREQUEST_CREDENTIALENTRY']._serialized_start=1270
+  _globals['_BACKUPCREATEREQUEST_CREDENTIALENTRY']._serialized_end=1319
+  _globals['_BACKUPCREATERESPONSE']._serialized_start=1321
+  _globals['_BACKUPCREATERESPONSE']._serialized_end=1383
+  _globals['_BACKUPREMOVEREQUEST']._serialized_start=1385
+  _globals['_BACKUPREMOVEREQUEST']._serialized_end=1422
+  _globals['_BACKUPSTATUSREQUEST']._serialized_start=1424
+  _globals['_BACKUPSTATUSREQUEST']._serialized_end=1461
+  _globals['_BACKUPSTATUSRESPONSE']._serialized_start=1463
+  _globals['_BACKUPSTATUSRESPONSE']._serialized_end=1576
+  _globals['_BACKUPRESTOREREQUEST']._serialized_start=1579
+  _globals['_BACKUPRESTOREREQUEST']._serialized_end=1788
+  _globals['_BACKUPRESTOREREQUEST_CREDENTIALENTRY']._serialized_start=1270
+  _globals['_BACKUPRESTOREREQUEST_CREDENTIALENTRY']._serialized_end=1319
+  _globals['_BACKUPRESTOREINCREMENTALLYREQUEST']._serialized_start=1791
+  _globals['_BACKUPRESTOREINCREMENTALLYREQUEST']._serialized_end=2086
+  _globals['_BACKUPRESTOREINCREMENTALLYREQUEST_CREDENTIALENTRY']._serialized_start=1270
+  _globals['_BACKUPRESTOREINCREMENTALLYREQUEST_CREDENTIALENTRY']._serialized_end=1319
+  _globals['_RESTORESTATUSRESPONSE']._serialized_start=2089
+  _globals['_RESTORESTATUSRESPONSE']._serialized_end=2283
+  _globals['_SNAPSHOTPURGESTATUSRESPONSE']._serialized_start=2285
+  _globals['_SNAPSHOTPURGESTATUSRESPONSE']._serialized_end=2382
+  _globals['_REPLICAREBUILDSTATUSRESPONSE']._serialized_start=2385
+  _globals['_REPLICAREBUILDSTATUSRESPONSE']._serialized_end=2516
+  _globals['_SNAPSHOTCLONESTATUSRESPONSE']._serialized_start=2519
+  _globals['_SNAPSHOTCLONESTATUSRESPONSE']._serialized_end=2669
+  _globals['_SNAPSHOTHASHREQUEST']._serialized_start=2671
+  _globals['_SNAPSHOTHASHREQUEST']._serialized_end=2731
+  _globals['_SNAPSHOTHASHSTATUSREQUEST']._serialized_start=2733
+  _globals['_SNAPSHOTHASHSTATUSREQUEST']._serialized_end=2783
+  _globals['_SNAPSHOTHASHSTATUSRESPONSE']._serialized_start=2785
+  _globals['_SNAPSHOTHASHSTATUSRESPONSE']._serialized_end=2889
+  _globals['_SNAPSHOTHASHCANCELREQUEST']._serialized_start=2891
+  _globals['_SNAPSHOTHASHCANCELREQUEST']._serialized_end=2941
+  _globals['_SNAPSHOTHASHLOCKSTATERESPONSE']._serialized_start=2943
+  _globals['_SNAPSHOTHASHLOCKSTATERESPONSE']._serialized_end=2993
+  _globals['_SYNCAGENTSERVICE']._serialized_start=2996
+  _globals['_SYNCAGENTSERVICE']._serialized_end=4600
+# @@protoc_insertion_point(module_scope)
diff --git a/generated-py/ptypes/syncagent_pb2_grpc.py b/generated-py/ptypes/syncagent_pb2_grpc.py
new file mode 100644
index 0000000..fbbcaa8
--- /dev/null
+++ b/generated-py/ptypes/syncagent_pb2_grpc.py
@@ -0,0 +1,727 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from ptypes import syncagent_pb2 as ptypes_dot_syncagent__pb2
+
+
+class SyncAgentServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.FileRemove = channel.unary_unary(
+                '/ptypes.SyncAgentService/FileRemove',
+                request_serializer=ptypes_dot_syncagent__pb2.FileRemoveRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.FileRename = channel.unary_unary(
+                '/ptypes.SyncAgentService/FileRename',
+                request_serializer=ptypes_dot_syncagent__pb2.FileRenameRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.FileSend = channel.unary_unary(
+                '/ptypes.SyncAgentService/FileSend',
+                request_serializer=ptypes_dot_syncagent__pb2.FileSendRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.FilesSync = channel.unary_unary(
+                '/ptypes.SyncAgentService/FilesSync',
+                request_serializer=ptypes_dot_syncagent__pb2.FilesSyncRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.SnapshotClone = channel.unary_unary(
+                '/ptypes.SyncAgentService/SnapshotClone',
+                request_serializer=ptypes_dot_syncagent__pb2.SnapshotCloneRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.VolumeExport = channel.unary_unary(
+                '/ptypes.SyncAgentService/VolumeExport',
+                request_serializer=ptypes_dot_syncagent__pb2.VolumeExportRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReceiverLaunch = channel.unary_unary(
+                '/ptypes.SyncAgentService/ReceiverLaunch',
+                request_serializer=ptypes_dot_syncagent__pb2.ReceiverLaunchRequest.SerializeToString,
+                response_deserializer=ptypes_dot_syncagent__pb2.ReceiverLaunchResponse.FromString,
+                )
+        self.BackupCreate = channel.unary_unary(
+                '/ptypes.SyncAgentService/BackupCreate',
+                request_serializer=ptypes_dot_syncagent__pb2.BackupCreateRequest.SerializeToString,
+                response_deserializer=ptypes_dot_syncagent__pb2.BackupCreateResponse.FromString,
+                )
+        self.BackupRemove = channel.unary_unary(
+                '/ptypes.SyncAgentService/BackupRemove',
+                request_serializer=ptypes_dot_syncagent__pb2.BackupRemoveRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.BackupRestore = channel.unary_unary(
+                '/ptypes.SyncAgentService/BackupRestore',
+                request_serializer=ptypes_dot_syncagent__pb2.BackupRestoreRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.BackupStatus = channel.unary_unary(
+                '/ptypes.SyncAgentService/BackupStatus',
+                request_serializer=ptypes_dot_syncagent__pb2.BackupStatusRequest.SerializeToString,
+                response_deserializer=ptypes_dot_syncagent__pb2.BackupStatusResponse.FromString,
+                )
+        self.Reset = channel.unary_unary(
+                '/ptypes.SyncAgentService/Reset',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.RestoreStatus = channel.unary_unary(
+                '/ptypes.SyncAgentService/RestoreStatus',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_syncagent__pb2.RestoreStatusResponse.FromString,
+                )
+        self.SnapshotPurge = channel.unary_unary(
+                '/ptypes.SyncAgentService/SnapshotPurge',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.SnapshotPurgeStatus = channel.unary_unary(
+                '/ptypes.SyncAgentService/SnapshotPurgeStatus',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_syncagent__pb2.SnapshotPurgeStatusResponse.FromString,
+                )
+        self.ReplicaRebuildStatus = channel.unary_unary(
+                '/ptypes.SyncAgentService/ReplicaRebuildStatus',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_syncagent__pb2.ReplicaRebuildStatusResponse.FromString,
+                )
+        self.SnapshotCloneStatus = channel.unary_unary(
+                '/ptypes.SyncAgentService/SnapshotCloneStatus',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_syncagent__pb2.SnapshotCloneStatusResponse.FromString,
+                )
+        self.SnapshotHash = channel.unary_unary(
+                '/ptypes.SyncAgentService/SnapshotHash',
+                request_serializer=ptypes_dot_syncagent__pb2.SnapshotHashRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.SnapshotHashStatus = channel.unary_unary(
+                '/ptypes.SyncAgentService/SnapshotHashStatus',
+                request_serializer=ptypes_dot_syncagent__pb2.SnapshotHashStatusRequest.SerializeToString,
+                response_deserializer=ptypes_dot_syncagent__pb2.SnapshotHashStatusResponse.FromString,
+                )
+        self.SnapshotHashCancel = channel.unary_unary(
+                '/ptypes.SyncAgentService/SnapshotHashCancel',
+                request_serializer=ptypes_dot_syncagent__pb2.SnapshotHashCancelRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.SnapshotHashLockState = channel.unary_unary(
+                '/ptypes.SyncAgentService/SnapshotHashLockState',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=ptypes_dot_syncagent__pb2.SnapshotHashLockStateResponse.FromString,
+                )
+
+
+class SyncAgentServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def FileRemove(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def FileRename(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def FileSend(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def FilesSync(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotClone(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VolumeExport(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReceiverLaunch(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def BackupCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def BackupRemove(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def BackupRestore(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def BackupStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Reset(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def RestoreStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotPurge(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotPurgeStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaRebuildStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotCloneStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotHash(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotHashStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotHashCancel(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SnapshotHashLockState(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_SyncAgentServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'FileRemove': grpc.unary_unary_rpc_method_handler(
+                    servicer.FileRemove,
+                    request_deserializer=ptypes_dot_syncagent__pb2.FileRemoveRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'FileRename': grpc.unary_unary_rpc_method_handler(
+                    servicer.FileRename,
+                    request_deserializer=ptypes_dot_syncagent__pb2.FileRenameRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'FileSend': grpc.unary_unary_rpc_method_handler(
+                    servicer.FileSend,
+                    request_deserializer=ptypes_dot_syncagent__pb2.FileSendRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'FilesSync': grpc.unary_unary_rpc_method_handler(
+                    servicer.FilesSync,
+                    request_deserializer=ptypes_dot_syncagent__pb2.FilesSyncRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'SnapshotClone': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotClone,
+                    request_deserializer=ptypes_dot_syncagent__pb2.SnapshotCloneRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'VolumeExport': grpc.unary_unary_rpc_method_handler(
+                    servicer.VolumeExport,
+                    request_deserializer=ptypes_dot_syncagent__pb2.VolumeExportRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReceiverLaunch': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReceiverLaunch,
+                    request_deserializer=ptypes_dot_syncagent__pb2.ReceiverLaunchRequest.FromString,
+                    response_serializer=ptypes_dot_syncagent__pb2.ReceiverLaunchResponse.SerializeToString,
+            ),
+            'BackupCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.BackupCreate,
+                    request_deserializer=ptypes_dot_syncagent__pb2.BackupCreateRequest.FromString,
+                    response_serializer=ptypes_dot_syncagent__pb2.BackupCreateResponse.SerializeToString,
+            ),
+            'BackupRemove': grpc.unary_unary_rpc_method_handler(
+                    servicer.BackupRemove,
+                    request_deserializer=ptypes_dot_syncagent__pb2.BackupRemoveRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'BackupRestore': grpc.unary_unary_rpc_method_handler(
+                    servicer.BackupRestore,
+                    request_deserializer=ptypes_dot_syncagent__pb2.BackupRestoreRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'BackupStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.BackupStatus,
+                    request_deserializer=ptypes_dot_syncagent__pb2.BackupStatusRequest.FromString,
+                    response_serializer=ptypes_dot_syncagent__pb2.BackupStatusResponse.SerializeToString,
+            ),
+            'Reset': grpc.unary_unary_rpc_method_handler(
+                    servicer.Reset,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'RestoreStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.RestoreStatus,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_syncagent__pb2.RestoreStatusResponse.SerializeToString,
+            ),
+            'SnapshotPurge': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotPurge,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'SnapshotPurgeStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotPurgeStatus,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_syncagent__pb2.SnapshotPurgeStatusResponse.SerializeToString,
+            ),
+            'ReplicaRebuildStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaRebuildStatus,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_syncagent__pb2.ReplicaRebuildStatusResponse.SerializeToString,
+            ),
+            'SnapshotCloneStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotCloneStatus,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_syncagent__pb2.SnapshotCloneStatusResponse.SerializeToString,
+            ),
+            'SnapshotHash': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotHash,
+                    request_deserializer=ptypes_dot_syncagent__pb2.SnapshotHashRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'SnapshotHashStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotHashStatus,
+                    request_deserializer=ptypes_dot_syncagent__pb2.SnapshotHashStatusRequest.FromString,
+                    response_serializer=ptypes_dot_syncagent__pb2.SnapshotHashStatusResponse.SerializeToString,
+            ),
+            'SnapshotHashCancel': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotHashCancel,
+                    request_deserializer=ptypes_dot_syncagent__pb2.SnapshotHashCancelRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'SnapshotHashLockState': grpc.unary_unary_rpc_method_handler(
+                    servicer.SnapshotHashLockState,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=ptypes_dot_syncagent__pb2.SnapshotHashLockStateResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'ptypes.SyncAgentService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class SyncAgentService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def FileRemove(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/FileRemove',
+            ptypes_dot_syncagent__pb2.FileRemoveRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def FileRename(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/FileRename',
+            ptypes_dot_syncagent__pb2.FileRenameRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def FileSend(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/FileSend',
+            ptypes_dot_syncagent__pb2.FileSendRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def FilesSync(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/FilesSync',
+            ptypes_dot_syncagent__pb2.FilesSyncRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotClone(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/SnapshotClone',
+            ptypes_dot_syncagent__pb2.SnapshotCloneRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VolumeExport(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/VolumeExport',
+            ptypes_dot_syncagent__pb2.VolumeExportRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReceiverLaunch(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/ReceiverLaunch',
+            ptypes_dot_syncagent__pb2.ReceiverLaunchRequest.SerializeToString,
+            ptypes_dot_syncagent__pb2.ReceiverLaunchResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def BackupCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/BackupCreate',
+            ptypes_dot_syncagent__pb2.BackupCreateRequest.SerializeToString,
+            ptypes_dot_syncagent__pb2.BackupCreateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def BackupRemove(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/BackupRemove',
+            ptypes_dot_syncagent__pb2.BackupRemoveRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def BackupRestore(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/BackupRestore',
+            ptypes_dot_syncagent__pb2.BackupRestoreRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def BackupStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/BackupStatus',
+            ptypes_dot_syncagent__pb2.BackupStatusRequest.SerializeToString,
+            ptypes_dot_syncagent__pb2.BackupStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Reset(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/Reset',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def RestoreStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/RestoreStatus',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_syncagent__pb2.RestoreStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotPurge(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/SnapshotPurge',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotPurgeStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/SnapshotPurgeStatus',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_syncagent__pb2.SnapshotPurgeStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaRebuildStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/ReplicaRebuildStatus',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_syncagent__pb2.ReplicaRebuildStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotCloneStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/SnapshotCloneStatus',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_syncagent__pb2.SnapshotCloneStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotHash(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/SnapshotHash',
+            ptypes_dot_syncagent__pb2.SnapshotHashRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotHashStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/SnapshotHashStatus',
+            ptypes_dot_syncagent__pb2.SnapshotHashStatusRequest.SerializeToString,
+            ptypes_dot_syncagent__pb2.SnapshotHashStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotHashCancel(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/SnapshotHashCancel',
+            ptypes_dot_syncagent__pb2.SnapshotHashCancelRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SnapshotHashLockState(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ptypes.SyncAgentService/SnapshotHashLockState',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ptypes_dot_syncagent__pb2.SnapshotHashLockStateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/generated-py/smrpc/smrpc_pb2.py b/generated-py/smrpc/smrpc_pb2.py
new file mode 100644
index 0000000..28e541e
--- /dev/null
+++ b/generated-py/smrpc/smrpc_pb2.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: smrpc/smrpc.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11smrpc/smrpc.proto\x1a\x1bgoogle/protobuf/empty.proto\"1\n\x15\x46ilesystemTrimRequest\x12\x18\n\x10\x65ncrypted_device\x18\x01 \x01(\x08\x32\xd1\x01\n\x13ShareManagerService\x12\x42\n\x0e\x46ilesystemTrim\x12\x16.FilesystemTrimRequest\x1a\x16.google.protobuf.Empty\"\x00\x12;\n\x07Unmount\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x00\x12\x39\n\x05Mount\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x00\x42/Z-github.com/longhorn/types/pkg/generated/smrpcb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'smrpc.smrpc_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z-github.com/longhorn/types/pkg/generated/smrpc'
+  _globals['_FILESYSTEMTRIMREQUEST']._serialized_start=50
+  _globals['_FILESYSTEMTRIMREQUEST']._serialized_end=99
+  _globals['_SHAREMANAGERSERVICE']._serialized_start=102
+  _globals['_SHAREMANAGERSERVICE']._serialized_end=311
+# @@protoc_insertion_point(module_scope)
diff --git a/generated-py/smrpc/smrpc_pb2_grpc.py b/generated-py/smrpc/smrpc_pb2_grpc.py
new file mode 100644
index 0000000..ec4df58
--- /dev/null
+++ b/generated-py/smrpc/smrpc_pb2_grpc.py
@@ -0,0 +1,133 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from smrpc import smrpc_pb2 as smrpc_dot_smrpc__pb2
+
+
+class ShareManagerServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.FilesystemTrim = channel.unary_unary(
+                '/ShareManagerService/FilesystemTrim',
+                request_serializer=smrpc_dot_smrpc__pb2.FilesystemTrimRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Unmount = channel.unary_unary(
+                '/ShareManagerService/Unmount',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Mount = channel.unary_unary(
+                '/ShareManagerService/Mount',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class ShareManagerServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def FilesystemTrim(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Unmount(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Mount(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ShareManagerServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'FilesystemTrim': grpc.unary_unary_rpc_method_handler(
+                    servicer.FilesystemTrim,
+                    request_deserializer=smrpc_dot_smrpc__pb2.FilesystemTrimRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Unmount': grpc.unary_unary_rpc_method_handler(
+                    servicer.Unmount,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Mount': grpc.unary_unary_rpc_method_handler(
+                    servicer.Mount,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'ShareManagerService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ShareManagerService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def FilesystemTrim(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ShareManagerService/FilesystemTrim',
+            smrpc_dot_smrpc__pb2.FilesystemTrimRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Unmount(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ShareManagerService/Unmount',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Mount(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/ShareManagerService/Mount',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/generated-py/spdkrpc/spdk_pb2.py b/generated-py/spdkrpc/spdk_pb2.py
new file mode 100644
index 0000000..879c109
--- /dev/null
+++ b/generated-py/spdkrpc/spdk_pb2.py
@@ -0,0 +1,180 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: spdkrpc/spdk.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12spdkrpc/spdk.proto\x12\x07spdkrpc\x1a\x1bgoogle/protobuf/empty.proto\"\xe7\x01\n\x04Lvol\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04uuid\x18\x02 \x01(\t\x12\x11\n\tspec_size\x18\x03 \x01(\x04\x12\x13\n\x0b\x61\x63tual_size\x18\x04 \x01(\x04\x12\x0e\n\x06parent\x18\x05 \x01(\t\x12-\n\x08\x63hildren\x18\x06 \x03(\x0b\x32\x1b.spdkrpc.Lvol.ChildrenEntry\x12\x15\n\rcreation_time\x18\x07 \x01(\t\x12\x14\n\x0cuser_created\x18\x08 \x01(\x08\x1a/\n\rChildrenEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\"\xdd\x02\n\x07Replica\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08lvs_name\x18\x02 \x01(\t\x12\x10\n\x08lvs_uuid\x18\x03 \x01(\t\x12\x11\n\tspec_size\x18\x04 \x01(\x04\x12\x13\n\x0b\x61\x63tual_size\x18\x05 \x01(\x04\x12\n\n\x02ip\x18\x06 \x01(\t\x12\x12\n\nport_start\x18\x07 \x01(\x05\x12\x10\n\x08port_end\x18\x08 \x01(\x05\x12\x1b\n\x04head\x18\t \x01(\x0b\x32\r.spdkrpc.Lvol\x12\x32\n\tsnapshots\x18\n \x03(\x0b\x32\x1f.spdkrpc.Replica.SnapshotsEntry\x12\x12\n\nrebuilding\x18\x0b \x01(\x08\x12\r\n\x05state\x18\x0c \x01(\t\x12\x11\n\terror_msg\x18\r \x01(\t\x1a?\n\x0eSnapshotsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1c\n\x05value\x18\x02 \x01(\x0b\x32\r.spdkrpc.Lvol:\x02\x38\x01\"\x88\x01\n\x14ReplicaCreateRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08lvs_name\x18\x02 \x01(\t\x12\x10\n\x08lvs_uuid\x18\x03 \x01(\t\x12\x11\n\tspec_size\x18\x04 \x01(\x04\x12\x17\n\x0f\x65xpose_required\x18\x05 \x01(\x08\x12\x12\n\nport_count\x18\x06 \x01(\x05\">\n\x14ReplicaDeleteRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x10\x63leanup_required\x18\x02 \x01(\x08\"!\n\x11ReplicaGetRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x96\x01\n\x13ReplicaListResponse\x12<\n\x08replicas\x18\x01 \x03(\x0b\x32*.spdkrpc.ReplicaListResponse.ReplicasEntry\x1a\x41\n\rReplicasEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.spdkrpc.Replica:\x02\x38\x01\"o\n ReplicaRebuildingSrcStartRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x10\x64st_replica_name\x18\x02 \x01(\t\x12#\n\x1b\x64st_rebuilding_lvol_address\x18\x03 \x01(\t\"K\n!ReplicaRebuildingSrcFinishRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x10\x64st_replica_name\x18\x02 \x01(\t\"p\n!ReplicaRebuildingSrcAttachRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x10\x64st_replica_name\x18\x02 \x01(\t\x12#\n\x1b\x64st_rebuilding_lvol_address\x18\x03 \x01(\t\"K\n!ReplicaRebuildingSrcDetachRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x10\x64st_replica_name\x18\x02 \x01(\t\"H\n!ReplicaSnapshotShallowCopyRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\rsnapshot_name\x18\x02 \x01(\t\"I\n ReplicaRebuildingDstStartRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x17\n\x0f\x65xpose_required\x18\x02 \x01(\x08\"4\n!ReplicaRebuildingDstStartResponse\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\"L\n!ReplicaRebuildingDstFinishRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x19\n\x11unexpose_required\x18\x02 \x01(\x08\"\xcf\x04\n\x06\x45ngine\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0bvolume_name\x18\x02 \x01(\t\x12\x11\n\tspec_size\x18\x03 \x01(\x04\x12\x13\n\x0b\x61\x63tual_size\x18\x04 \x01(\x04\x12\n\n\x02ip\x18\x05 \x01(\t\x12\x0c\n\x04port\x18\x06 \x01(\x05\x12\x43\n\x13replica_address_map\x18\x07 \x03(\x0b\x32&.spdkrpc.Engine.ReplicaAddressMapEntry\x12=\n\x10replica_mode_map\x18\x08 \x03(\x0b\x32#.spdkrpc.Engine.ReplicaModeMapEntry\x12\x1b\n\x04head\x18\t \x01(\x0b\x32\r.spdkrpc.Lvol\x12\x31\n\tsnapshots\x18\n \x03(\x0b\x32\x1e.spdkrpc.Engine.SnapshotsEntry\x12\x10\n\x08\x66rontend\x18\x0b \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x0c \x01(\t\x12\r\n\x05state\x18\r \x01(\t\x12\x11\n\terror_msg\x18\x0e \x01(\t\x1a\x38\n\x16ReplicaAddressMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1aK\n\x13ReplicaModeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0e\x32\x14.spdkrpc.ReplicaMode:\x02\x38\x01\x1a?\n\x0eSnapshotsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1c\n\x05value\x18\x02 \x01(\x0b\x32\r.spdkrpc.Lvol:\x02\x38\x01\"\xfd\x01\n\x13\x45ngineCreateRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0bvolume_name\x18\x02 \x01(\t\x12\x11\n\tspec_size\x18\x03 \x01(\x04\x12P\n\x13replica_address_map\x18\x04 \x03(\x0b\x32\x33.spdkrpc.EngineCreateRequest.ReplicaAddressMapEntry\x12\x10\n\x08\x66rontend\x18\x05 \x01(\t\x12\x12\n\nport_count\x18\x06 \x01(\x05\x1a\x38\n\x16ReplicaAddressMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"#\n\x13\x45ngineDeleteRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\" \n\x10\x45ngineGetRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x90\x01\n\x12\x45ngineListResponse\x12\x39\n\x07\x65ngines\x18\x01 \x03(\x0b\x32(.spdkrpc.EngineListResponse.EnginesEntry\x1a?\n\x0c\x45nginesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.spdkrpc.Engine:\x02\x38\x01\"]\n\x17\x45ngineReplicaAddRequest\x12\x13\n\x0b\x65ngine_name\x18\x01 \x01(\t\x12\x14\n\x0creplica_name\x18\x02 \x01(\t\x12\x17\n\x0freplica_address\x18\x03 \x01(\t\"/\n\x18\x45ngineReplicaListRequest\x12\x13\n\x0b\x65ngine_name\x18\x01 \x01(\t\"\xa2\x01\n\x19\x45ngineReplicaListResponse\x12\x42\n\x08replicas\x18\x01 \x03(\x0b\x32\x30.spdkrpc.EngineReplicaListResponse.ReplicasEntry\x1a\x41\n\rReplicasEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.spdkrpc.Replica:\x02\x38\x01\"`\n\x1a\x45ngineReplicaDeleteRequest\x12\x13\n\x0b\x65ngine_name\x18\x01 \x01(\t\x12\x14\n\x0creplica_name\x18\x02 \x01(\t\x12\x17\n\x0freplica_address\x18\x03 \x01(\t\"L\n\x0fSnapshotRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\rsnapshot_name\x18\x02 \x01(\t\x12\x14\n\x0cuser_created\x18\x03 \x01(\x08\")\n\x10SnapshotResponse\x12\x15\n\rsnapshot_name\x18\x01 \x01(\t\"\xef\x01\n\rVersionOutput\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x11\n\tgitCommit\x18\x02 \x01(\t\x12\x11\n\tbuildDate\x18\x03 \x01(\t\x12\x15\n\rcliAPIVersion\x18\x04 \x01(\x03\x12\x18\n\x10\x63liAPIMinVersion\x18\x05 \x01(\x03\x12\x1c\n\x14\x63ontrollerAPIVersion\x18\x06 \x01(\x03\x12\x1f\n\x17\x63ontrollerAPIMinVersion\x18\x07 \x01(\x03\x12\x19\n\x11\x64\x61taFormatVersion\x18\x08 \x01(\x03\x12\x1c\n\x14\x64\x61taFormatMinVersion\x18\t \x01(\x03\"@\n\x15VersionDetailGetReply\x12\'\n\x07version\x18\x01 \x01(\x0b\x32\x16.spdkrpc.VersionOutput\"\xb9\x03\n\x13\x42\x61\x63kupCreateRequest\x12\x15\n\rsnapshot_name\x18\x01 \x01(\t\x12\x15\n\rbackup_target\x18\x02 \x01(\t\x12\x13\n\x0bvolume_name\x18\x03 \x01(\t\x12\x0c\n\x04size\x18\x04 \x01(\x03\x12\x13\n\x0b\x65ngine_name\x18\x05 \x01(\t\x12\x14\n\x0creplica_name\x18\x06 \x01(\t\x12\x0e\n\x06labels\x18\x07 \x03(\t\x12@\n\ncredential\x18\x08 \x03(\x0b\x32,.spdkrpc.BackupCreateRequest.CredentialEntry\x12\x1a\n\x12\x62\x61\x63king_image_name\x18\t \x01(\t\x12\x1e\n\x16\x62\x61\x63king_image_checksum\x18\n \x01(\t\x12\x13\n\x0b\x62\x61\x63kup_name\x18\x0b \x01(\t\x12\x1a\n\x12\x63ompression_method\x18\x0c \x01(\t\x12\x18\n\x10\x63oncurrent_limit\x18\r \x01(\x05\x12\x1a\n\x12storage_class_name\x18\x0e \x01(\t\x1a\x31\n\x0f\x43redentialEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"W\n\x14\x42\x61\x63kupCreateResponse\x12\x0e\n\x06\x62\x61\x63kup\x18\x01 \x01(\t\x12\x16\n\x0eis_incremental\x18\x02 \x01(\x08\x12\x17\n\x0freplica_address\x18\x03 \x01(\t\"S\n\x13\x42\x61\x63kupStatusRequest\x12\x0e\n\x06\x62\x61\x63kup\x18\x01 \x01(\t\x12\x13\n\x0b\x65ngine_name\x18\x02 \x01(\t\x12\x17\n\x0freplica_address\x18\x03 \x01(\t\"\x8a\x01\n\x14\x42\x61\x63kupStatusResponse\x12\x10\n\x08progress\x18\x01 \x01(\x05\x12\x12\n\nbackup_url\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12\x15\n\rsnapshot_name\x18\x04 \x01(\t\x12\r\n\x05state\x18\x05 \x01(\t\x12\x17\n\x0freplica_address\x18\x06 \x01(\t\"\xf2\x01\n\x1a\x45ngineBackupRestoreRequest\x12\x12\n\nbackup_url\x18\x01 \x01(\t\x12\x13\n\x0b\x65ngine_name\x18\x02 \x01(\t\x12\x15\n\rsnapshot_name\x18\x03 \x01(\t\x12G\n\ncredential\x18\x04 \x03(\x0b\x32\x33.spdkrpc.EngineBackupRestoreRequest.CredentialEntry\x12\x18\n\x10\x63oncurrent_limit\x18\x05 \x01(\x05\x1a\x31\n\x0f\x43redentialEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x8e\x01\n\x1b\x45ngineBackupRestoreResponse\x12@\n\x06\x65rrors\x18\x04 \x03(\x0b\x32\x30.spdkrpc.EngineBackupRestoreResponse.ErrorsEntry\x1a-\n\x0b\x45rrorsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"7\n EngineBackupRestoreFinishRequest\x12\x13\n\x0b\x65ngine_name\x18\x01 \x01(\t\"\xf5\x01\n\x1bReplicaBackupRestoreRequest\x12\x12\n\nbackup_url\x18\x01 \x01(\t\x12\x14\n\x0creplica_name\x18\x02 \x01(\t\x12\x15\n\rsnapshot_name\x18\x03 \x01(\t\x12H\n\ncredential\x18\x04 \x03(\x0b\x32\x34.spdkrpc.ReplicaBackupRestoreRequest.CredentialEntry\x12\x18\n\x10\x63oncurrent_limit\x18\x05 \x01(\x05\x1a\x31\n\x0f\x43redentialEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"+\n\x14RestoreStatusRequest\x12\x13\n\x0b\x65ngine_name\x18\x01 \x01(\t\"3\n\x1bReplicaRestoreStatusRequest\x12\x14\n\x0creplica_name\x18\x02 \x01(\t\"\xf8\x01\n\x1cReplicaRestoreStatusResponse\x12\x14\n\x0creplica_name\x18\x01 \x01(\t\x12\x17\n\x0freplica_address\x18\x02 \x01(\t\x12\x14\n\x0cis_restoring\x18\x03 \x01(\x08\x12\x15\n\rlast_restored\x18\x04 \x01(\t\x12\x10\n\x08progress\x18\x05 \x01(\x05\x12\r\n\x05\x65rror\x18\x06 \x01(\t\x12\x16\n\x0e\x64\x65st_file_name\x18\x07 \x01(\t\x12\r\n\x05state\x18\x08 \x01(\t\x12\x12\n\nbackup_url\x18\t \x01(\t\x12 \n\x18\x63urrent_restoring_backup\x18\n \x01(\t\"\xa9\x01\n\x15RestoreStatusResponse\x12:\n\x06status\x18\x01 \x03(\x0b\x32*.spdkrpc.RestoreStatusResponse.StatusEntry\x1aT\n\x0bStatusEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x34\n\x05value\x18\x02 \x01(\x0b\x32%.spdkrpc.ReplicaRestoreStatusResponse:\x02\x38\x01\"\xd6\x01\n\x04\x44isk\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04uuid\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\t\x12\x12\n\ntotal_size\x18\x05 \x01(\x03\x12\x11\n\tfree_size\x18\x06 \x01(\x03\x12\x14\n\x0ctotal_blocks\x18\x07 \x01(\x03\x12\x13\n\x0b\x66ree_blocks\x18\x08 \x01(\x03\x12\x12\n\nblock_size\x18\t \x01(\x03\x12\x14\n\x0c\x63luster_size\x18\n \x01(\x03\x12\x0e\n\x06\x64river\x18\x0b \x01(\t\x12\x0c\n\x04name\x18\x0c \x01(\t\"u\n\x11\x44iskCreateRequest\x12\x11\n\tdisk_name\x18\x01 \x01(\t\x12\x11\n\tdisk_uuid\x18\x02 \x01(\t\x12\x11\n\tdisk_path\x18\x03 \x01(\t\x12\x12\n\nblock_size\x18\x04 \x01(\x03\x12\x13\n\x0b\x64isk_driver\x18\x05 \x01(\t\"K\n\x0e\x44iskGetRequest\x12\x11\n\tdisk_name\x18\x01 \x01(\t\x12\x13\n\x0b\x64isk_driver\x18\x02 \x01(\t\x12\x11\n\tdisk_path\x18\x03 \x01(\t\"a\n\x11\x44iskDeleteRequest\x12\x11\n\tdisk_name\x18\x01 \x01(\t\x12\x11\n\tdisk_uuid\x18\x02 \x01(\t\x12\x11\n\tdisk_path\x18\x03 \x01(\t\x12\x13\n\x0b\x64isk_driver\x18\x04 \x01(\t\"#\n\x12LogSetLevelRequest\x12\r\n\x05level\x18\x01 \x01(\t\"#\n\x12LogSetFlagsRequest\x12\r\n\x05\x66lags\x18\x01 \x01(\t\"$\n\x13LogGetLevelResponse\x12\r\n\x05level\x18\x01 \x01(\t\"$\n\x13LogGetFlagsResponse\x12\r\n\x05\x66lags\x18\x01 \x01(\t*&\n\x0bReplicaMode\x12\x06\n\x02WO\x10\x00\x12\x06\n\x02RW\x10\x01\x12\x07\n\x03\x45RR\x10\x02\x32\x99\x1c\n\x0bSPDKService\x12@\n\rReplicaCreate\x12\x1d.spdkrpc.ReplicaCreateRequest\x1a\x10.spdkrpc.Replica\x12\x46\n\rReplicaDelete\x12\x1d.spdkrpc.ReplicaDeleteRequest\x1a\x16.google.protobuf.Empty\x12:\n\nReplicaGet\x12\x1a.spdkrpc.ReplicaGetRequest\x1a\x10.spdkrpc.Replica\x12\x43\n\x15ReplicaSnapshotCreate\x12\x18.spdkrpc.SnapshotRequest\x1a\x10.spdkrpc.Replica\x12I\n\x15ReplicaSnapshotDelete\x12\x18.spdkrpc.SnapshotRequest\x1a\x16.google.protobuf.Empty\x12I\n\x15ReplicaSnapshotRevert\x12\x18.spdkrpc.SnapshotRequest\x1a\x16.google.protobuf.Empty\x12\x43\n\x0bReplicaList\x12\x16.google.protobuf.Empty\x1a\x1c.spdkrpc.ReplicaListResponse\x12\x42\n\x0cReplicaWatch\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x00\x30\x01\x12`\n\x19ReplicaRebuildingSrcStart\x12).spdkrpc.ReplicaRebuildingSrcStartRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x62\n\x1aReplicaRebuildingSrcFinish\x12*.spdkrpc.ReplicaRebuildingSrcFinishRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x62\n\x1aReplicaRebuildingSrcAttach\x12*.spdkrpc.ReplicaRebuildingSrcAttachRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x62\n\x1aReplicaRebuildingSrcDetach\x12*.spdkrpc.ReplicaRebuildingSrcDetachRequest\x1a\x16.google.protobuf.Empty\"\x00\x12`\n\x1aReplicaSnapshotShallowCopy\x12*.spdkrpc.ReplicaSnapshotShallowCopyRequest\x1a\x16.google.protobuf.Empty\x12t\n\x19ReplicaRebuildingDstStart\x12).spdkrpc.ReplicaRebuildingDstStartRequest\x1a*.spdkrpc.ReplicaRebuildingDstStartResponse\"\x00\x12\x62\n\x1aReplicaRebuildingDstFinish\x12*.spdkrpc.ReplicaRebuildingDstFinishRequest\x1a\x16.google.protobuf.Empty\"\x00\x12V\n\"ReplicaRebuildingDstSnapshotCreate\x12\x18.spdkrpc.SnapshotRequest\x1a\x16.google.protobuf.Empty\x12V\n\"ReplicaRebuildingDstSnapshotRevert\x12\x18.spdkrpc.SnapshotRequest\x1a\x16.google.protobuf.Empty\x12T\n\x13ReplicaBackupCreate\x12\x1c.spdkrpc.BackupCreateRequest\x1a\x1d.spdkrpc.BackupCreateResponse\"\x00\x12T\n\x13ReplicaBackupStatus\x12\x1c.spdkrpc.BackupStatusRequest\x1a\x1d.spdkrpc.BackupStatusResponse\"\x00\x12V\n\x14ReplicaBackupRestore\x12$.spdkrpc.ReplicaBackupRestoreRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x65\n\x14ReplicaRestoreStatus\x12$.spdkrpc.ReplicaRestoreStatusRequest\x1a%.spdkrpc.ReplicaRestoreStatusResponse\"\x00\x12=\n\x0c\x45ngineCreate\x12\x1c.spdkrpc.EngineCreateRequest\x1a\x0f.spdkrpc.Engine\x12\x44\n\x0c\x45ngineDelete\x12\x1c.spdkrpc.EngineDeleteRequest\x1a\x16.google.protobuf.Empty\x12\x37\n\tEngineGet\x12\x19.spdkrpc.EngineGetRequest\x1a\x0f.spdkrpc.Engine\x12K\n\x14\x45ngineSnapshotCreate\x12\x18.spdkrpc.SnapshotRequest\x1a\x19.spdkrpc.SnapshotResponse\x12H\n\x14\x45ngineSnapshotDelete\x12\x18.spdkrpc.SnapshotRequest\x1a\x16.google.protobuf.Empty\x12H\n\x14\x45ngineSnapshotRevert\x12\x18.spdkrpc.SnapshotRequest\x1a\x16.google.protobuf.Empty\x12\x41\n\nEngineList\x12\x16.google.protobuf.Empty\x1a\x1b.spdkrpc.EngineListResponse\x12\x41\n\x0b\x45ngineWatch\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x00\x30\x01\x12\\\n\x11\x45ngineReplicaList\x12!.spdkrpc.EngineReplicaListRequest\x1a\".spdkrpc.EngineReplicaListResponse\"\x00\x12N\n\x10\x45ngineReplicaAdd\x12 .spdkrpc.EngineReplicaAddRequest\x1a\x16.google.protobuf.Empty\"\x00\x12T\n\x13\x45ngineReplicaDelete\x12#.spdkrpc.EngineReplicaDeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x12S\n\x12\x45ngineBackupCreate\x12\x1c.spdkrpc.BackupCreateRequest\x1a\x1d.spdkrpc.BackupCreateResponse\"\x00\x12S\n\x12\x45ngineBackupStatus\x12\x1c.spdkrpc.BackupStatusRequest\x1a\x1d.spdkrpc.BackupStatusResponse\"\x00\x12\x62\n\x13\x45ngineBackupRestore\x12#.spdkrpc.EngineBackupRestoreRequest\x1a$.spdkrpc.EngineBackupRestoreResponse\"\x00\x12`\n\x19\x45ngineBackupRestoreFinish\x12).spdkrpc.EngineBackupRestoreFinishRequest\x1a\x16.google.protobuf.Empty\"\x00\x12V\n\x13\x45ngineRestoreStatus\x12\x1d.spdkrpc.RestoreStatusRequest\x1a\x1e.spdkrpc.RestoreStatusResponse\"\x00\x12\x37\n\nDiskCreate\x12\x1a.spdkrpc.DiskCreateRequest\x1a\r.spdkrpc.Disk\x12@\n\nDiskDelete\x12\x1a.spdkrpc.DiskDeleteRequest\x1a\x16.google.protobuf.Empty\x12\x31\n\x07\x44iskGet\x12\x17.spdkrpc.DiskGetRequest\x1a\r.spdkrpc.Disk\x12\x42\n\x0bLogSetLevel\x12\x1b.spdkrpc.LogSetLevelRequest\x1a\x16.google.protobuf.Empty\x12\x42\n\x0bLogSetFlags\x12\x1b.spdkrpc.LogSetFlagsRequest\x1a\x16.google.protobuf.Empty\x12\x43\n\x0bLogGetLevel\x12\x16.google.protobuf.Empty\x1a\x1c.spdkrpc.LogGetLevelResponse\x12\x43\n\x0bLogGetFlags\x12\x16.google.protobuf.Empty\x1a\x1c.spdkrpc.LogGetFlagsResponse\x12J\n\x10VersionDetailGet\x12\x16.google.protobuf.Empty\x1a\x1e.spdkrpc.VersionDetailGetReplyB1Z/github.com/longhorn/types/pkg/generated/spdkrpcb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'spdkrpc.spdk_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z/github.com/longhorn/types/pkg/generated/spdkrpc'
+  _LVOL_CHILDRENENTRY._options = None
+  _LVOL_CHILDRENENTRY._serialized_options = b'8\001'
+  _REPLICA_SNAPSHOTSENTRY._options = None
+  _REPLICA_SNAPSHOTSENTRY._serialized_options = b'8\001'
+  _REPLICALISTRESPONSE_REPLICASENTRY._options = None
+  _REPLICALISTRESPONSE_REPLICASENTRY._serialized_options = b'8\001'
+  _ENGINE_REPLICAADDRESSMAPENTRY._options = None
+  _ENGINE_REPLICAADDRESSMAPENTRY._serialized_options = b'8\001'
+  _ENGINE_REPLICAMODEMAPENTRY._options = None
+  _ENGINE_REPLICAMODEMAPENTRY._serialized_options = b'8\001'
+  _ENGINE_SNAPSHOTSENTRY._options = None
+  _ENGINE_SNAPSHOTSENTRY._serialized_options = b'8\001'
+  _ENGINECREATEREQUEST_REPLICAADDRESSMAPENTRY._options = None
+  _ENGINECREATEREQUEST_REPLICAADDRESSMAPENTRY._serialized_options = b'8\001'
+  _ENGINELISTRESPONSE_ENGINESENTRY._options = None
+  _ENGINELISTRESPONSE_ENGINESENTRY._serialized_options = b'8\001'
+  _ENGINEREPLICALISTRESPONSE_REPLICASENTRY._options = None
+  _ENGINEREPLICALISTRESPONSE_REPLICASENTRY._serialized_options = b'8\001'
+  _BACKUPCREATEREQUEST_CREDENTIALENTRY._options = None
+  _BACKUPCREATEREQUEST_CREDENTIALENTRY._serialized_options = b'8\001'
+  _ENGINEBACKUPRESTOREREQUEST_CREDENTIALENTRY._options = None
+  _ENGINEBACKUPRESTOREREQUEST_CREDENTIALENTRY._serialized_options = b'8\001'
+  _ENGINEBACKUPRESTORERESPONSE_ERRORSENTRY._options = None
+  _ENGINEBACKUPRESTORERESPONSE_ERRORSENTRY._serialized_options = b'8\001'
+  _REPLICABACKUPRESTOREREQUEST_CREDENTIALENTRY._options = None
+  _REPLICABACKUPRESTOREREQUEST_CREDENTIALENTRY._serialized_options = b'8\001'
+  _RESTORESTATUSRESPONSE_STATUSENTRY._options = None
+  _RESTORESTATUSRESPONSE_STATUSENTRY._serialized_options = b'8\001'
+  _globals['_REPLICAMODE']._serialized_start=6240
+  _globals['_REPLICAMODE']._serialized_end=6278
+  _globals['_LVOL']._serialized_start=61
+  _globals['_LVOL']._serialized_end=292
+  _globals['_LVOL_CHILDRENENTRY']._serialized_start=245
+  _globals['_LVOL_CHILDRENENTRY']._serialized_end=292
+  _globals['_REPLICA']._serialized_start=295
+  _globals['_REPLICA']._serialized_end=644
+  _globals['_REPLICA_SNAPSHOTSENTRY']._serialized_start=581
+  _globals['_REPLICA_SNAPSHOTSENTRY']._serialized_end=644
+  _globals['_REPLICACREATEREQUEST']._serialized_start=647
+  _globals['_REPLICACREATEREQUEST']._serialized_end=783
+  _globals['_REPLICADELETEREQUEST']._serialized_start=785
+  _globals['_REPLICADELETEREQUEST']._serialized_end=847
+  _globals['_REPLICAGETREQUEST']._serialized_start=849
+  _globals['_REPLICAGETREQUEST']._serialized_end=882
+  _globals['_REPLICALISTRESPONSE']._serialized_start=885
+  _globals['_REPLICALISTRESPONSE']._serialized_end=1035
+  _globals['_REPLICALISTRESPONSE_REPLICASENTRY']._serialized_start=970
+  _globals['_REPLICALISTRESPONSE_REPLICASENTRY']._serialized_end=1035
+  _globals['_REPLICAREBUILDINGSRCSTARTREQUEST']._serialized_start=1037
+  _globals['_REPLICAREBUILDINGSRCSTARTREQUEST']._serialized_end=1148
+  _globals['_REPLICAREBUILDINGSRCFINISHREQUEST']._serialized_start=1150
+  _globals['_REPLICAREBUILDINGSRCFINISHREQUEST']._serialized_end=1225
+  _globals['_REPLICAREBUILDINGSRCATTACHREQUEST']._serialized_start=1227
+  _globals['_REPLICAREBUILDINGSRCATTACHREQUEST']._serialized_end=1339
+  _globals['_REPLICAREBUILDINGSRCDETACHREQUEST']._serialized_start=1341
+  _globals['_REPLICAREBUILDINGSRCDETACHREQUEST']._serialized_end=1416
+  _globals['_REPLICASNAPSHOTSHALLOWCOPYREQUEST']._serialized_start=1418
+  _globals['_REPLICASNAPSHOTSHALLOWCOPYREQUEST']._serialized_end=1490
+  _globals['_REPLICAREBUILDINGDSTSTARTREQUEST']._serialized_start=1492
+  _globals['_REPLICAREBUILDINGDSTSTARTREQUEST']._serialized_end=1565
+  _globals['_REPLICAREBUILDINGDSTSTARTRESPONSE']._serialized_start=1567
+  _globals['_REPLICAREBUILDINGDSTSTARTRESPONSE']._serialized_end=1619
+  _globals['_REPLICAREBUILDINGDSTFINISHREQUEST']._serialized_start=1621
+  _globals['_REPLICAREBUILDINGDSTFINISHREQUEST']._serialized_end=1697
+  _globals['_ENGINE']._serialized_start=1700
+  _globals['_ENGINE']._serialized_end=2291
+  _globals['_ENGINE_REPLICAADDRESSMAPENTRY']._serialized_start=2093
+  _globals['_ENGINE_REPLICAADDRESSMAPENTRY']._serialized_end=2149
+  _globals['_ENGINE_REPLICAMODEMAPENTRY']._serialized_start=2151
+  _globals['_ENGINE_REPLICAMODEMAPENTRY']._serialized_end=2226
+  _globals['_ENGINE_SNAPSHOTSENTRY']._serialized_start=581
+  _globals['_ENGINE_SNAPSHOTSENTRY']._serialized_end=644
+  _globals['_ENGINECREATEREQUEST']._serialized_start=2294
+  _globals['_ENGINECREATEREQUEST']._serialized_end=2547
+  _globals['_ENGINECREATEREQUEST_REPLICAADDRESSMAPENTRY']._serialized_start=2093
+  _globals['_ENGINECREATEREQUEST_REPLICAADDRESSMAPENTRY']._serialized_end=2149
+  _globals['_ENGINEDELETEREQUEST']._serialized_start=2549
+  _globals['_ENGINEDELETEREQUEST']._serialized_end=2584
+  _globals['_ENGINEGETREQUEST']._serialized_start=2586
+  _globals['_ENGINEGETREQUEST']._serialized_end=2618
+  _globals['_ENGINELISTRESPONSE']._serialized_start=2621
+  _globals['_ENGINELISTRESPONSE']._serialized_end=2765
+  _globals['_ENGINELISTRESPONSE_ENGINESENTRY']._serialized_start=2702
+  _globals['_ENGINELISTRESPONSE_ENGINESENTRY']._serialized_end=2765
+  _globals['_ENGINEREPLICAADDREQUEST']._serialized_start=2767
+  _globals['_ENGINEREPLICAADDREQUEST']._serialized_end=2860
+  _globals['_ENGINEREPLICALISTREQUEST']._serialized_start=2862
+  _globals['_ENGINEREPLICALISTREQUEST']._serialized_end=2909
+  _globals['_ENGINEREPLICALISTRESPONSE']._serialized_start=2912
+  _globals['_ENGINEREPLICALISTRESPONSE']._serialized_end=3074
+  _globals['_ENGINEREPLICALISTRESPONSE_REPLICASENTRY']._serialized_start=970
+  _globals['_ENGINEREPLICALISTRESPONSE_REPLICASENTRY']._serialized_end=1035
+  _globals['_ENGINEREPLICADELETEREQUEST']._serialized_start=3076
+  _globals['_ENGINEREPLICADELETEREQUEST']._serialized_end=3172
+  _globals['_SNAPSHOTREQUEST']._serialized_start=3174
+  _globals['_SNAPSHOTREQUEST']._serialized_end=3250
+  _globals['_SNAPSHOTRESPONSE']._serialized_start=3252
+  _globals['_SNAPSHOTRESPONSE']._serialized_end=3293
+  _globals['_VERSIONOUTPUT']._serialized_start=3296
+  _globals['_VERSIONOUTPUT']._serialized_end=3535
+  _globals['_VERSIONDETAILGETREPLY']._serialized_start=3537
+  _globals['_VERSIONDETAILGETREPLY']._serialized_end=3601
+  _globals['_BACKUPCREATEREQUEST']._serialized_start=3604
+  _globals['_BACKUPCREATEREQUEST']._serialized_end=4045
+  _globals['_BACKUPCREATEREQUEST_CREDENTIALENTRY']._serialized_start=3996
+  _globals['_BACKUPCREATEREQUEST_CREDENTIALENTRY']._serialized_end=4045
+  _globals['_BACKUPCREATERESPONSE']._serialized_start=4047
+  _globals['_BACKUPCREATERESPONSE']._serialized_end=4134
+  _globals['_BACKUPSTATUSREQUEST']._serialized_start=4136
+  _globals['_BACKUPSTATUSREQUEST']._serialized_end=4219
+  _globals['_BACKUPSTATUSRESPONSE']._serialized_start=4222
+  _globals['_BACKUPSTATUSRESPONSE']._serialized_end=4360
+  _globals['_ENGINEBACKUPRESTOREREQUEST']._serialized_start=4363
+  _globals['_ENGINEBACKUPRESTOREREQUEST']._serialized_end=4605
+  _globals['_ENGINEBACKUPRESTOREREQUEST_CREDENTIALENTRY']._serialized_start=3996
+  _globals['_ENGINEBACKUPRESTOREREQUEST_CREDENTIALENTRY']._serialized_end=4045
+  _globals['_ENGINEBACKUPRESTORERESPONSE']._serialized_start=4608
+  _globals['_ENGINEBACKUPRESTORERESPONSE']._serialized_end=4750
+  _globals['_ENGINEBACKUPRESTORERESPONSE_ERRORSENTRY']._serialized_start=4705
+  _globals['_ENGINEBACKUPRESTORERESPONSE_ERRORSENTRY']._serialized_end=4750
+  _globals['_ENGINEBACKUPRESTOREFINISHREQUEST']._serialized_start=4752
+  _globals['_ENGINEBACKUPRESTOREFINISHREQUEST']._serialized_end=4807
+  _globals['_REPLICABACKUPRESTOREREQUEST']._serialized_start=4810
+  _globals['_REPLICABACKUPRESTOREREQUEST']._serialized_end=5055
+  _globals['_REPLICABACKUPRESTOREREQUEST_CREDENTIALENTRY']._serialized_start=3996
+  _globals['_REPLICABACKUPRESTOREREQUEST_CREDENTIALENTRY']._serialized_end=4045
+  _globals['_RESTORESTATUSREQUEST']._serialized_start=5057
+  _globals['_RESTORESTATUSREQUEST']._serialized_end=5100
+  _globals['_REPLICARESTORESTATUSREQUEST']._serialized_start=5102
+  _globals['_REPLICARESTORESTATUSREQUEST']._serialized_end=5153
+  _globals['_REPLICARESTORESTATUSRESPONSE']._serialized_start=5156
+  _globals['_REPLICARESTORESTATUSRESPONSE']._serialized_end=5404
+  _globals['_RESTORESTATUSRESPONSE']._serialized_start=5407
+  _globals['_RESTORESTATUSRESPONSE']._serialized_end=5576
+  _globals['_RESTORESTATUSRESPONSE_STATUSENTRY']._serialized_start=5492
+  _globals['_RESTORESTATUSRESPONSE_STATUSENTRY']._serialized_end=5576
+  _globals['_DISK']._serialized_start=5579
+  _globals['_DISK']._serialized_end=5793
+  _globals['_DISKCREATEREQUEST']._serialized_start=5795
+  _globals['_DISKCREATEREQUEST']._serialized_end=5912
+  _globals['_DISKGETREQUEST']._serialized_start=5914
+  _globals['_DISKGETREQUEST']._serialized_end=5989
+  _globals['_DISKDELETEREQUEST']._serialized_start=5991
+  _globals['_DISKDELETEREQUEST']._serialized_end=6088
+  _globals['_LOGSETLEVELREQUEST']._serialized_start=6090
+  _globals['_LOGSETLEVELREQUEST']._serialized_end=6125
+  _globals['_LOGSETFLAGSREQUEST']._serialized_start=6127
+  _globals['_LOGSETFLAGSREQUEST']._serialized_end=6162
+  _globals['_LOGGETLEVELRESPONSE']._serialized_start=6164
+  _globals['_LOGGETLEVELRESPONSE']._serialized_end=6200
+  _globals['_LOGGETFLAGSRESPONSE']._serialized_start=6202
+  _globals['_LOGGETFLAGSRESPONSE']._serialized_end=6238
+  _globals['_SPDKSERVICE']._serialized_start=6281
+  _globals['_SPDKSERVICE']._serialized_end=9890
+# @@protoc_insertion_point(module_scope)
diff --git a/generated-py/spdkrpc/spdk_pb2_grpc.py b/generated-py/spdkrpc/spdk_pb2_grpc.py
new file mode 100644
index 0000000..787c3ca
--- /dev/null
+++ b/generated-py/spdkrpc/spdk_pb2_grpc.py
@@ -0,0 +1,1519 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from spdkrpc import spdk_pb2 as spdkrpc_dot_spdk__pb2
+
+
+class SPDKServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.ReplicaCreate = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaCreate',
+                request_serializer=spdkrpc_dot_spdk__pb2.ReplicaCreateRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.Replica.FromString,
+                )
+        self.ReplicaDelete = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaDelete',
+                request_serializer=spdkrpc_dot_spdk__pb2.ReplicaDeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaGet = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaGet',
+                request_serializer=spdkrpc_dot_spdk__pb2.ReplicaGetRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.Replica.FromString,
+                )
+        self.ReplicaSnapshotCreate = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaSnapshotCreate',
+                request_serializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.Replica.FromString,
+                )
+        self.ReplicaSnapshotDelete = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaSnapshotDelete',
+                request_serializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaSnapshotRevert = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaSnapshotRevert',
+                request_serializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaList = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaList',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.ReplicaListResponse.FromString,
+                )
+        self.ReplicaWatch = channel.unary_stream(
+                '/spdkrpc.SPDKService/ReplicaWatch',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaRebuildingSrcStart = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaRebuildingSrcStart',
+                request_serializer=spdkrpc_dot_spdk__pb2.ReplicaRebuildingSrcStartRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaRebuildingSrcFinish = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaRebuildingSrcFinish',
+                request_serializer=spdkrpc_dot_spdk__pb2.ReplicaRebuildingSrcFinishRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaRebuildingSrcAttach = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaRebuildingSrcAttach',
+                request_serializer=spdkrpc_dot_spdk__pb2.ReplicaRebuildingSrcAttachRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaRebuildingSrcDetach = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaRebuildingSrcDetach',
+                request_serializer=spdkrpc_dot_spdk__pb2.ReplicaRebuildingSrcDetachRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaSnapshotShallowCopy = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaSnapshotShallowCopy',
+                request_serializer=spdkrpc_dot_spdk__pb2.ReplicaSnapshotShallowCopyRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaRebuildingDstStart = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaRebuildingDstStart',
+                request_serializer=spdkrpc_dot_spdk__pb2.ReplicaRebuildingDstStartRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.ReplicaRebuildingDstStartResponse.FromString,
+                )
+        self.ReplicaRebuildingDstFinish = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaRebuildingDstFinish',
+                request_serializer=spdkrpc_dot_spdk__pb2.ReplicaRebuildingDstFinishRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaRebuildingDstSnapshotCreate = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaRebuildingDstSnapshotCreate',
+                request_serializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaRebuildingDstSnapshotRevert = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaRebuildingDstSnapshotRevert',
+                request_serializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaBackupCreate = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaBackupCreate',
+                request_serializer=spdkrpc_dot_spdk__pb2.BackupCreateRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.BackupCreateResponse.FromString,
+                )
+        self.ReplicaBackupStatus = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaBackupStatus',
+                request_serializer=spdkrpc_dot_spdk__pb2.BackupStatusRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.BackupStatusResponse.FromString,
+                )
+        self.ReplicaBackupRestore = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaBackupRestore',
+                request_serializer=spdkrpc_dot_spdk__pb2.ReplicaBackupRestoreRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ReplicaRestoreStatus = channel.unary_unary(
+                '/spdkrpc.SPDKService/ReplicaRestoreStatus',
+                request_serializer=spdkrpc_dot_spdk__pb2.ReplicaRestoreStatusRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.ReplicaRestoreStatusResponse.FromString,
+                )
+        self.EngineCreate = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineCreate',
+                request_serializer=spdkrpc_dot_spdk__pb2.EngineCreateRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.Engine.FromString,
+                )
+        self.EngineDelete = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineDelete',
+                request_serializer=spdkrpc_dot_spdk__pb2.EngineDeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.EngineGet = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineGet',
+                request_serializer=spdkrpc_dot_spdk__pb2.EngineGetRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.Engine.FromString,
+                )
+        self.EngineSnapshotCreate = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineSnapshotCreate',
+                request_serializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.SnapshotResponse.FromString,
+                )
+        self.EngineSnapshotDelete = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineSnapshotDelete',
+                request_serializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.EngineSnapshotRevert = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineSnapshotRevert',
+                request_serializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.EngineList = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineList',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.EngineListResponse.FromString,
+                )
+        self.EngineWatch = channel.unary_stream(
+                '/spdkrpc.SPDKService/EngineWatch',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.EngineReplicaList = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineReplicaList',
+                request_serializer=spdkrpc_dot_spdk__pb2.EngineReplicaListRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.EngineReplicaListResponse.FromString,
+                )
+        self.EngineReplicaAdd = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineReplicaAdd',
+                request_serializer=spdkrpc_dot_spdk__pb2.EngineReplicaAddRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.EngineReplicaDelete = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineReplicaDelete',
+                request_serializer=spdkrpc_dot_spdk__pb2.EngineReplicaDeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.EngineBackupCreate = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineBackupCreate',
+                request_serializer=spdkrpc_dot_spdk__pb2.BackupCreateRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.BackupCreateResponse.FromString,
+                )
+        self.EngineBackupStatus = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineBackupStatus',
+                request_serializer=spdkrpc_dot_spdk__pb2.BackupStatusRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.BackupStatusResponse.FromString,
+                )
+        self.EngineBackupRestore = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineBackupRestore',
+                request_serializer=spdkrpc_dot_spdk__pb2.EngineBackupRestoreRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.EngineBackupRestoreResponse.FromString,
+                )
+        self.EngineBackupRestoreFinish = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineBackupRestoreFinish',
+                request_serializer=spdkrpc_dot_spdk__pb2.EngineBackupRestoreFinishRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.EngineRestoreStatus = channel.unary_unary(
+                '/spdkrpc.SPDKService/EngineRestoreStatus',
+                request_serializer=spdkrpc_dot_spdk__pb2.RestoreStatusRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.RestoreStatusResponse.FromString,
+                )
+        self.DiskCreate = channel.unary_unary(
+                '/spdkrpc.SPDKService/DiskCreate',
+                request_serializer=spdkrpc_dot_spdk__pb2.DiskCreateRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.Disk.FromString,
+                )
+        self.DiskDelete = channel.unary_unary(
+                '/spdkrpc.SPDKService/DiskDelete',
+                request_serializer=spdkrpc_dot_spdk__pb2.DiskDeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.DiskGet = channel.unary_unary(
+                '/spdkrpc.SPDKService/DiskGet',
+                request_serializer=spdkrpc_dot_spdk__pb2.DiskGetRequest.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.Disk.FromString,
+                )
+        self.LogSetLevel = channel.unary_unary(
+                '/spdkrpc.SPDKService/LogSetLevel',
+                request_serializer=spdkrpc_dot_spdk__pb2.LogSetLevelRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.LogSetFlags = channel.unary_unary(
+                '/spdkrpc.SPDKService/LogSetFlags',
+                request_serializer=spdkrpc_dot_spdk__pb2.LogSetFlagsRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.LogGetLevel = channel.unary_unary(
+                '/spdkrpc.SPDKService/LogGetLevel',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.LogGetLevelResponse.FromString,
+                )
+        self.LogGetFlags = channel.unary_unary(
+                '/spdkrpc.SPDKService/LogGetFlags',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.LogGetFlagsResponse.FromString,
+                )
+        self.VersionDetailGet = channel.unary_unary(
+                '/spdkrpc.SPDKService/VersionDetailGet',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=spdkrpc_dot_spdk__pb2.VersionDetailGetReply.FromString,
+                )
+
+
+class SPDKServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def ReplicaCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaDelete(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaSnapshotCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaSnapshotDelete(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaSnapshotRevert(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaList(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaWatch(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaRebuildingSrcStart(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaRebuildingSrcFinish(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaRebuildingSrcAttach(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaRebuildingSrcDetach(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaSnapshotShallowCopy(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaRebuildingDstStart(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaRebuildingDstFinish(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaRebuildingDstSnapshotCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaRebuildingDstSnapshotRevert(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaBackupCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaBackupStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaBackupRestore(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ReplicaRestoreStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineDelete(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineSnapshotCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineSnapshotDelete(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineSnapshotRevert(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineList(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineWatch(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineReplicaList(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineReplicaAdd(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineReplicaDelete(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineBackupCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineBackupStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineBackupRestore(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineBackupRestoreFinish(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EngineRestoreStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DiskCreate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DiskDelete(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DiskGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def LogSetLevel(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def LogSetFlags(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def LogGetLevel(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def LogGetFlags(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def VersionDetailGet(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_SPDKServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'ReplicaCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaCreate,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.ReplicaCreateRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.Replica.SerializeToString,
+            ),
+            'ReplicaDelete': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaDelete,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.ReplicaDeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaGet,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.ReplicaGetRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.Replica.SerializeToString,
+            ),
+            'ReplicaSnapshotCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaSnapshotCreate,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.Replica.SerializeToString,
+            ),
+            'ReplicaSnapshotDelete': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaSnapshotDelete,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaSnapshotRevert': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaSnapshotRevert,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaList': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaList,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.ReplicaListResponse.SerializeToString,
+            ),
+            'ReplicaWatch': grpc.unary_stream_rpc_method_handler(
+                    servicer.ReplicaWatch,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaRebuildingSrcStart': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaRebuildingSrcStart,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.ReplicaRebuildingSrcStartRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaRebuildingSrcFinish': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaRebuildingSrcFinish,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.ReplicaRebuildingSrcFinishRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaRebuildingSrcAttach': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaRebuildingSrcAttach,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.ReplicaRebuildingSrcAttachRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaRebuildingSrcDetach': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaRebuildingSrcDetach,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.ReplicaRebuildingSrcDetachRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaSnapshotShallowCopy': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaSnapshotShallowCopy,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.ReplicaSnapshotShallowCopyRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaRebuildingDstStart': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaRebuildingDstStart,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.ReplicaRebuildingDstStartRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.ReplicaRebuildingDstStartResponse.SerializeToString,
+            ),
+            'ReplicaRebuildingDstFinish': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaRebuildingDstFinish,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.ReplicaRebuildingDstFinishRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaRebuildingDstSnapshotCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaRebuildingDstSnapshotCreate,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaRebuildingDstSnapshotRevert': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaRebuildingDstSnapshotRevert,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaBackupCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaBackupCreate,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.BackupCreateRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.BackupCreateResponse.SerializeToString,
+            ),
+            'ReplicaBackupStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaBackupStatus,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.BackupStatusRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.BackupStatusResponse.SerializeToString,
+            ),
+            'ReplicaBackupRestore': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaBackupRestore,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.ReplicaBackupRestoreRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ReplicaRestoreStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.ReplicaRestoreStatus,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.ReplicaRestoreStatusRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.ReplicaRestoreStatusResponse.SerializeToString,
+            ),
+            'EngineCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineCreate,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.EngineCreateRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.Engine.SerializeToString,
+            ),
+            'EngineDelete': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineDelete,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.EngineDeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'EngineGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineGet,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.EngineGetRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.Engine.SerializeToString,
+            ),
+            'EngineSnapshotCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineSnapshotCreate,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.SnapshotResponse.SerializeToString,
+            ),
+            'EngineSnapshotDelete': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineSnapshotDelete,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'EngineSnapshotRevert': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineSnapshotRevert,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.SnapshotRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'EngineList': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineList,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.EngineListResponse.SerializeToString,
+            ),
+            'EngineWatch': grpc.unary_stream_rpc_method_handler(
+                    servicer.EngineWatch,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'EngineReplicaList': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineReplicaList,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.EngineReplicaListRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.EngineReplicaListResponse.SerializeToString,
+            ),
+            'EngineReplicaAdd': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineReplicaAdd,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.EngineReplicaAddRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'EngineReplicaDelete': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineReplicaDelete,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.EngineReplicaDeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'EngineBackupCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineBackupCreate,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.BackupCreateRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.BackupCreateResponse.SerializeToString,
+            ),
+            'EngineBackupStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineBackupStatus,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.BackupStatusRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.BackupStatusResponse.SerializeToString,
+            ),
+            'EngineBackupRestore': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineBackupRestore,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.EngineBackupRestoreRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.EngineBackupRestoreResponse.SerializeToString,
+            ),
+            'EngineBackupRestoreFinish': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineBackupRestoreFinish,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.EngineBackupRestoreFinishRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'EngineRestoreStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.EngineRestoreStatus,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.RestoreStatusRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.RestoreStatusResponse.SerializeToString,
+            ),
+            'DiskCreate': grpc.unary_unary_rpc_method_handler(
+                    servicer.DiskCreate,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.DiskCreateRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.Disk.SerializeToString,
+            ),
+            'DiskDelete': grpc.unary_unary_rpc_method_handler(
+                    servicer.DiskDelete,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.DiskDeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'DiskGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.DiskGet,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.DiskGetRequest.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.Disk.SerializeToString,
+            ),
+            'LogSetLevel': grpc.unary_unary_rpc_method_handler(
+                    servicer.LogSetLevel,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.LogSetLevelRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'LogSetFlags': grpc.unary_unary_rpc_method_handler(
+                    servicer.LogSetFlags,
+                    request_deserializer=spdkrpc_dot_spdk__pb2.LogSetFlagsRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'LogGetLevel': grpc.unary_unary_rpc_method_handler(
+                    servicer.LogGetLevel,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.LogGetLevelResponse.SerializeToString,
+            ),
+            'LogGetFlags': grpc.unary_unary_rpc_method_handler(
+                    servicer.LogGetFlags,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.LogGetFlagsResponse.SerializeToString,
+            ),
+            'VersionDetailGet': grpc.unary_unary_rpc_method_handler(
+                    servicer.VersionDetailGet,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=spdkrpc_dot_spdk__pb2.VersionDetailGetReply.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'spdkrpc.SPDKService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class SPDKService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def ReplicaCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaCreate',
+            spdkrpc_dot_spdk__pb2.ReplicaCreateRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.Replica.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaDelete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaDelete',
+            spdkrpc_dot_spdk__pb2.ReplicaDeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaGet',
+            spdkrpc_dot_spdk__pb2.ReplicaGetRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.Replica.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaSnapshotCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaSnapshotCreate',
+            spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.Replica.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaSnapshotDelete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaSnapshotDelete',
+            spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaSnapshotRevert(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaSnapshotRevert',
+            spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaList(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaList',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            spdkrpc_dot_spdk__pb2.ReplicaListResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaWatch(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/spdkrpc.SPDKService/ReplicaWatch',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaRebuildingSrcStart(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaRebuildingSrcStart',
+            spdkrpc_dot_spdk__pb2.ReplicaRebuildingSrcStartRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaRebuildingSrcFinish(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaRebuildingSrcFinish',
+            spdkrpc_dot_spdk__pb2.ReplicaRebuildingSrcFinishRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaRebuildingSrcAttach(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaRebuildingSrcAttach',
+            spdkrpc_dot_spdk__pb2.ReplicaRebuildingSrcAttachRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaRebuildingSrcDetach(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaRebuildingSrcDetach',
+            spdkrpc_dot_spdk__pb2.ReplicaRebuildingSrcDetachRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaSnapshotShallowCopy(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaSnapshotShallowCopy',
+            spdkrpc_dot_spdk__pb2.ReplicaSnapshotShallowCopyRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaRebuildingDstStart(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaRebuildingDstStart',
+            spdkrpc_dot_spdk__pb2.ReplicaRebuildingDstStartRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.ReplicaRebuildingDstStartResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaRebuildingDstFinish(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaRebuildingDstFinish',
+            spdkrpc_dot_spdk__pb2.ReplicaRebuildingDstFinishRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaRebuildingDstSnapshotCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaRebuildingDstSnapshotCreate',
+            spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaRebuildingDstSnapshotRevert(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaRebuildingDstSnapshotRevert',
+            spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaBackupCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaBackupCreate',
+            spdkrpc_dot_spdk__pb2.BackupCreateRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.BackupCreateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaBackupStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaBackupStatus',
+            spdkrpc_dot_spdk__pb2.BackupStatusRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.BackupStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaBackupRestore(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaBackupRestore',
+            spdkrpc_dot_spdk__pb2.ReplicaBackupRestoreRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ReplicaRestoreStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/ReplicaRestoreStatus',
+            spdkrpc_dot_spdk__pb2.ReplicaRestoreStatusRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.ReplicaRestoreStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineCreate',
+            spdkrpc_dot_spdk__pb2.EngineCreateRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.Engine.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineDelete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineDelete',
+            spdkrpc_dot_spdk__pb2.EngineDeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineGet',
+            spdkrpc_dot_spdk__pb2.EngineGetRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.Engine.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineSnapshotCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineSnapshotCreate',
+            spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.SnapshotResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineSnapshotDelete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineSnapshotDelete',
+            spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineSnapshotRevert(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineSnapshotRevert',
+            spdkrpc_dot_spdk__pb2.SnapshotRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineList(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineList',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            spdkrpc_dot_spdk__pb2.EngineListResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineWatch(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/spdkrpc.SPDKService/EngineWatch',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineReplicaList(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineReplicaList',
+            spdkrpc_dot_spdk__pb2.EngineReplicaListRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.EngineReplicaListResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineReplicaAdd(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineReplicaAdd',
+            spdkrpc_dot_spdk__pb2.EngineReplicaAddRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineReplicaDelete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineReplicaDelete',
+            spdkrpc_dot_spdk__pb2.EngineReplicaDeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineBackupCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineBackupCreate',
+            spdkrpc_dot_spdk__pb2.BackupCreateRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.BackupCreateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineBackupStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineBackupStatus',
+            spdkrpc_dot_spdk__pb2.BackupStatusRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.BackupStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineBackupRestore(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineBackupRestore',
+            spdkrpc_dot_spdk__pb2.EngineBackupRestoreRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.EngineBackupRestoreResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineBackupRestoreFinish(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineBackupRestoreFinish',
+            spdkrpc_dot_spdk__pb2.EngineBackupRestoreFinishRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EngineRestoreStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/EngineRestoreStatus',
+            spdkrpc_dot_spdk__pb2.RestoreStatusRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.RestoreStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DiskCreate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/DiskCreate',
+            spdkrpc_dot_spdk__pb2.DiskCreateRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.Disk.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DiskDelete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/DiskDelete',
+            spdkrpc_dot_spdk__pb2.DiskDeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DiskGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/DiskGet',
+            spdkrpc_dot_spdk__pb2.DiskGetRequest.SerializeToString,
+            spdkrpc_dot_spdk__pb2.Disk.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def LogSetLevel(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/LogSetLevel',
+            spdkrpc_dot_spdk__pb2.LogSetLevelRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def LogSetFlags(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/LogSetFlags',
+            spdkrpc_dot_spdk__pb2.LogSetFlagsRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def LogGetLevel(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/LogGetLevel',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            spdkrpc_dot_spdk__pb2.LogGetLevelResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def LogGetFlags(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/LogGetFlags',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            spdkrpc_dot_spdk__pb2.LogGetFlagsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def VersionDetailGet(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/spdkrpc.SPDKService/VersionDetailGet',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            spdkrpc_dot_spdk__pb2.VersionDetailGetReply.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..4468ea7
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,16 @@
+module github.com/longhorn/types
+
+go 1.21
+
+require (
+	google.golang.org/grpc v1.61.1
+	google.golang.org/protobuf v1.32.0
+)
+
+require (
+	github.com/golang/protobuf v1.5.3 // indirect
+	golang.org/x/net v0.18.0 // indirect
+	golang.org/x/sys v0.14.0 // indirect
+	golang.org/x/text v0.14.0 // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect
+)
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..27ee041
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,21 @@
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg=
+golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
+golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
+golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA=
+google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY=
+google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
+google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
diff --git a/pkg/generated/bimrpc/bimrpc.pb.go b/pkg/generated/bimrpc/bimrpc.pb.go
new file mode 100644
index 0000000..24d8f87
--- /dev/null
+++ b/pkg/generated/bimrpc/bimrpc.pb.go
@@ -0,0 +1,1448 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
+// source: bimrpc/bimrpc.proto
+
+package bimrpc
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type BackingImageSpec struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name        string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Uuid        string `protobuf:"bytes,2,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	Size        int64  `protobuf:"varint,3,opt,name=size,proto3" json:"size,omitempty"`
+	Checksum    string `protobuf:"bytes,4,opt,name=checksum,proto3" json:"checksum,omitempty"`
+	VirtualSize int64  `protobuf:"varint,5,opt,name=virtualSize,proto3" json:"virtualSize,omitempty"`
+}
+
+func (x *BackingImageSpec) Reset() {
+	*x = BackingImageSpec{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackingImageSpec) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackingImageSpec) ProtoMessage() {}
+
+func (x *BackingImageSpec) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackingImageSpec.ProtoReflect.Descriptor instead.
+func (*BackingImageSpec) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *BackingImageSpec) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *BackingImageSpec) GetUuid() string {
+	if x != nil {
+		return x.Uuid
+	}
+	return ""
+}
+
+func (x *BackingImageSpec) GetSize() int64 {
+	if x != nil {
+		return x.Size
+	}
+	return 0
+}
+
+func (x *BackingImageSpec) GetChecksum() string {
+	if x != nil {
+		return x.Checksum
+	}
+	return ""
+}
+
+func (x *BackingImageSpec) GetVirtualSize() int64 {
+	if x != nil {
+		return x.VirtualSize
+	}
+	return 0
+}
+
+type BackingImageStatus struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	State                string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"`
+	ErrorMsg             string `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"`
+	SendingReference     int32  `protobuf:"varint,3,opt,name=sending_reference,json=sendingReference,proto3" json:"sending_reference,omitempty"`
+	SenderManagerAddress string `protobuf:"bytes,4,opt,name=sender_manager_address,json=senderManagerAddress,proto3" json:"sender_manager_address,omitempty"`
+	Progress             int32  `protobuf:"varint,5,opt,name=progress,proto3" json:"progress,omitempty"`
+	Checksum             string `protobuf:"bytes,6,opt,name=checksum,proto3" json:"checksum,omitempty"`
+}
+
+func (x *BackingImageStatus) Reset() {
+	*x = BackingImageStatus{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackingImageStatus) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackingImageStatus) ProtoMessage() {}
+
+func (x *BackingImageStatus) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackingImageStatus.ProtoReflect.Descriptor instead.
+func (*BackingImageStatus) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *BackingImageStatus) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+func (x *BackingImageStatus) GetErrorMsg() string {
+	if x != nil {
+		return x.ErrorMsg
+	}
+	return ""
+}
+
+func (x *BackingImageStatus) GetSendingReference() int32 {
+	if x != nil {
+		return x.SendingReference
+	}
+	return 0
+}
+
+func (x *BackingImageStatus) GetSenderManagerAddress() string {
+	if x != nil {
+		return x.SenderManagerAddress
+	}
+	return ""
+}
+
+func (x *BackingImageStatus) GetProgress() int32 {
+	if x != nil {
+		return x.Progress
+	}
+	return 0
+}
+
+func (x *BackingImageStatus) GetChecksum() string {
+	if x != nil {
+		return x.Checksum
+	}
+	return ""
+}
+
+type BackingImageResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Spec   *BackingImageSpec   `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"`
+	Status *BackingImageStatus `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
+}
+
+func (x *BackingImageResponse) Reset() {
+	*x = BackingImageResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackingImageResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackingImageResponse) ProtoMessage() {}
+
+func (x *BackingImageResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackingImageResponse.ProtoReflect.Descriptor instead.
+func (*BackingImageResponse) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *BackingImageResponse) GetSpec() *BackingImageSpec {
+	if x != nil {
+		return x.Spec
+	}
+	return nil
+}
+
+func (x *BackingImageResponse) GetStatus() *BackingImageStatus {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+type DeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Uuid string `protobuf:"bytes,2,opt,name=uuid,proto3" json:"uuid,omitempty"`
+}
+
+func (x *DeleteRequest) Reset() {
+	*x = DeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteRequest) ProtoMessage() {}
+
+func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteRequest.ProtoReflect.Descriptor instead.
+func (*DeleteRequest) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *DeleteRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *DeleteRequest) GetUuid() string {
+	if x != nil {
+		return x.Uuid
+	}
+	return ""
+}
+
+type GetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Uuid string `protobuf:"bytes,2,opt,name=uuid,proto3" json:"uuid,omitempty"`
+}
+
+func (x *GetRequest) Reset() {
+	*x = GetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetRequest) ProtoMessage() {}
+
+func (x *GetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.
+func (*GetRequest) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *GetRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *GetRequest) GetUuid() string {
+	if x != nil {
+		return x.Uuid
+	}
+	return ""
+}
+
+type ListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BackingImages map[string]*BackingImageResponse `protobuf:"bytes,1,rep,name=backing_images,json=backingImages,proto3" json:"backing_images,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *ListResponse) Reset() {
+	*x = ListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListResponse) ProtoMessage() {}
+
+func (x *ListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListResponse.ProtoReflect.Descriptor instead.
+func (*ListResponse) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *ListResponse) GetBackingImages() map[string]*BackingImageResponse {
+	if x != nil {
+		return x.BackingImages
+	}
+	return nil
+}
+
+type VersionResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Version                          string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
+	GitCommit                        string `protobuf:"bytes,2,opt,name=gitCommit,proto3" json:"gitCommit,omitempty"`
+	BuildDate                        string `protobuf:"bytes,3,opt,name=buildDate,proto3" json:"buildDate,omitempty"`
+	BackingImageManagerApiVersion    int64  `protobuf:"varint,4,opt,name=backing_image_manager_api_version,json=backingImageManagerApiVersion,proto3" json:"backing_image_manager_api_version,omitempty"`
+	BackingImageManagerApiMinVersion int64  `protobuf:"varint,5,opt,name=backing_image_manager_api_min_version,json=backingImageManagerApiMinVersion,proto3" json:"backing_image_manager_api_min_version,omitempty"`
+}
+
+func (x *VersionResponse) Reset() {
+	*x = VersionResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VersionResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VersionResponse) ProtoMessage() {}
+
+func (x *VersionResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VersionResponse.ProtoReflect.Descriptor instead.
+func (*VersionResponse) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *VersionResponse) GetVersion() string {
+	if x != nil {
+		return x.Version
+	}
+	return ""
+}
+
+func (x *VersionResponse) GetGitCommit() string {
+	if x != nil {
+		return x.GitCommit
+	}
+	return ""
+}
+
+func (x *VersionResponse) GetBuildDate() string {
+	if x != nil {
+		return x.BuildDate
+	}
+	return ""
+}
+
+func (x *VersionResponse) GetBackingImageManagerApiVersion() int64 {
+	if x != nil {
+		return x.BackingImageManagerApiVersion
+	}
+	return 0
+}
+
+func (x *VersionResponse) GetBackingImageManagerApiMinVersion() int64 {
+	if x != nil {
+		return x.BackingImageManagerApiMinVersion
+	}
+	return 0
+}
+
+type SyncRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Spec        *BackingImageSpec `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"`
+	FromAddress string            `protobuf:"bytes,2,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty"`
+}
+
+func (x *SyncRequest) Reset() {
+	*x = SyncRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SyncRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SyncRequest) ProtoMessage() {}
+
+func (x *SyncRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SyncRequest.ProtoReflect.Descriptor instead.
+func (*SyncRequest) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *SyncRequest) GetSpec() *BackingImageSpec {
+	if x != nil {
+		return x.Spec
+	}
+	return nil
+}
+
+func (x *SyncRequest) GetFromAddress() string {
+	if x != nil {
+		return x.FromAddress
+	}
+	return ""
+}
+
+type SendRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name      string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Uuid      string `protobuf:"bytes,2,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	ToAddress string `protobuf:"bytes,3,opt,name=to_address,json=toAddress,proto3" json:"to_address,omitempty"`
+}
+
+func (x *SendRequest) Reset() {
+	*x = SendRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SendRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SendRequest) ProtoMessage() {}
+
+func (x *SendRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SendRequest.ProtoReflect.Descriptor instead.
+func (*SendRequest) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *SendRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *SendRequest) GetUuid() string {
+	if x != nil {
+		return x.Uuid
+	}
+	return ""
+}
+
+func (x *SendRequest) GetToAddress() string {
+	if x != nil {
+		return x.ToAddress
+	}
+	return ""
+}
+
+type FetchRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Spec              *BackingImageSpec `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"`
+	DataSourceAddress string            `protobuf:"bytes,2,opt,name=data_source_address,json=dataSourceAddress,proto3" json:"data_source_address,omitempty"`
+}
+
+func (x *FetchRequest) Reset() {
+	*x = FetchRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FetchRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FetchRequest) ProtoMessage() {}
+
+func (x *FetchRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FetchRequest.ProtoReflect.Descriptor instead.
+func (*FetchRequest) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *FetchRequest) GetSpec() *BackingImageSpec {
+	if x != nil {
+		return x.Spec
+	}
+	return nil
+}
+
+func (x *FetchRequest) GetDataSourceAddress() string {
+	if x != nil {
+		return x.DataSourceAddress
+	}
+	return ""
+}
+
+type PrepareDownloadRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Uuid string `protobuf:"bytes,2,opt,name=uuid,proto3" json:"uuid,omitempty"`
+}
+
+func (x *PrepareDownloadRequest) Reset() {
+	*x = PrepareDownloadRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PrepareDownloadRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PrepareDownloadRequest) ProtoMessage() {}
+
+func (x *PrepareDownloadRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PrepareDownloadRequest.ProtoReflect.Descriptor instead.
+func (*PrepareDownloadRequest) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *PrepareDownloadRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *PrepareDownloadRequest) GetUuid() string {
+	if x != nil {
+		return x.Uuid
+	}
+	return ""
+}
+
+type PrepareDownloadResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SrcFilePath string `protobuf:"bytes,1,opt,name=src_file_path,json=srcFilePath,proto3" json:"src_file_path,omitempty"`
+	Address     string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"`
+}
+
+func (x *PrepareDownloadResponse) Reset() {
+	*x = PrepareDownloadResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PrepareDownloadResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PrepareDownloadResponse) ProtoMessage() {}
+
+func (x *PrepareDownloadResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PrepareDownloadResponse.ProtoReflect.Descriptor instead.
+func (*PrepareDownloadResponse) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *PrepareDownloadResponse) GetSrcFilePath() string {
+	if x != nil {
+		return x.SrcFilePath
+	}
+	return ""
+}
+
+func (x *PrepareDownloadResponse) GetAddress() string {
+	if x != nil {
+		return x.Address
+	}
+	return ""
+}
+
+type BackupCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name              string            `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Uuid              string            `protobuf:"bytes,2,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	Checksum          string            `protobuf:"bytes,3,opt,name=checksum,proto3" json:"checksum,omitempty"`
+	BackupTarget      string            `protobuf:"bytes,4,opt,name=backup_target,json=backupTarget,proto3" json:"backup_target,omitempty"`
+	Labels            []string          `protobuf:"bytes,5,rep,name=labels,proto3" json:"labels,omitempty"`
+	Credential        map[string]string `protobuf:"bytes,6,rep,name=credential,proto3" json:"credential,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	CompressionMethod string            `protobuf:"bytes,7,opt,name=compression_method,json=compressionMethod,proto3" json:"compression_method,omitempty"`
+	ConcurrentLimit   int32             `protobuf:"varint,8,opt,name=concurrent_limit,json=concurrentLimit,proto3" json:"concurrent_limit,omitempty"`
+}
+
+func (x *BackupCreateRequest) Reset() {
+	*x = BackupCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackupCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackupCreateRequest) ProtoMessage() {}
+
+func (x *BackupCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackupCreateRequest.ProtoReflect.Descriptor instead.
+func (*BackupCreateRequest) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *BackupCreateRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetUuid() string {
+	if x != nil {
+		return x.Uuid
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetChecksum() string {
+	if x != nil {
+		return x.Checksum
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetBackupTarget() string {
+	if x != nil {
+		return x.BackupTarget
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetLabels() []string {
+	if x != nil {
+		return x.Labels
+	}
+	return nil
+}
+
+func (x *BackupCreateRequest) GetCredential() map[string]string {
+	if x != nil {
+		return x.Credential
+	}
+	return nil
+}
+
+func (x *BackupCreateRequest) GetCompressionMethod() string {
+	if x != nil {
+		return x.CompressionMethod
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetConcurrentLimit() int32 {
+	if x != nil {
+		return x.ConcurrentLimit
+	}
+	return 0
+}
+
+type BackupStatusRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *BackupStatusRequest) Reset() {
+	*x = BackupStatusRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackupStatusRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackupStatusRequest) ProtoMessage() {}
+
+func (x *BackupStatusRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackupStatusRequest.ProtoReflect.Descriptor instead.
+func (*BackupStatusRequest) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *BackupStatusRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type BackupStatusResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Progress  int32  `protobuf:"varint,1,opt,name=progress,proto3" json:"progress,omitempty"`
+	BackupUrl string `protobuf:"bytes,2,opt,name=backup_url,json=backupUrl,proto3" json:"backup_url,omitempty"`
+	Error     string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"`
+	State     string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"`
+}
+
+func (x *BackupStatusResponse) Reset() {
+	*x = BackupStatusResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bimrpc_bimrpc_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackupStatusResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackupStatusResponse) ProtoMessage() {}
+
+func (x *BackupStatusResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_bimrpc_bimrpc_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackupStatusResponse.ProtoReflect.Descriptor instead.
+func (*BackupStatusResponse) Descriptor() ([]byte, []int) {
+	return file_bimrpc_bimrpc_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *BackupStatusResponse) GetProgress() int32 {
+	if x != nil {
+		return x.Progress
+	}
+	return 0
+}
+
+func (x *BackupStatusResponse) GetBackupUrl() string {
+	if x != nil {
+		return x.BackupUrl
+	}
+	return ""
+}
+
+func (x *BackupStatusResponse) GetError() string {
+	if x != nil {
+		return x.Error
+	}
+	return ""
+}
+
+func (x *BackupStatusResponse) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+var File_bimrpc_bimrpc_proto protoreflect.FileDescriptor
+
+var file_bimrpc_bimrpc_proto_rawDesc = []byte{
+	0x0a, 0x13, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2f, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x1a, 0x1b, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65,
+	0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8c, 0x01, 0x0a, 0x10, 0x42,
+	0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12,
+	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
+	0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63,
+	0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63,
+	0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x12, 0x20, 0x0a, 0x0b, 0x76, 0x69, 0x72, 0x74, 0x75,
+	0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x76, 0x69,
+	0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x12, 0x42, 0x61,
+	0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f,
+	0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72,
+	0x4d, 0x73, 0x67, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72,
+	0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10,
+	0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+	0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67,
+	0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x14, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x41,
+	0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65,
+	0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65,
+	0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x06,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x22, 0x78,
+	0x0a, 0x14, 0x42, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61,
+	0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04,
+	0x73, 0x70, 0x65, 0x63, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61,
+	0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x37, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 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, 0x12, 0x0a,
+	0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69,
+	0x64, 0x22, 0x34, 0x0a, 0x0a, 0x47, 0x65, 0x74, 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, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xbe, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0e, 0x62, 0x61, 0x63, 0x6b,
+	0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x27, 0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d,
+	0x61, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x62, 0x61, 0x63, 0x6b, 0x69,
+	0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x1a, 0x5e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b,
+	0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 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, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1c, 0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+	0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x82, 0x02, 0x0a, 0x0f, 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, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d,
+	0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f,
+	0x6d, 0x6d, 0x69, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74,
+	0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61,
+	0x74, 0x65, 0x12, 0x48, 0x0a, 0x21, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6d,
+	0x61, 0x67, 0x65, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x5f,
+	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1d, 0x62,
+	0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67,
+	0x65, 0x72, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x25,
+	0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x61,
+	0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x65,
+	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x20, 0x62, 0x61, 0x63,
+	0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72,
+	0x41, 0x70, 0x69, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5e, 0x0a,
+	0x0b, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x04,
+	0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x69, 0x6d,
+	0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65,
+	0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72,
+	0x6f, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x54, 0x0a,
+	0x0b, 0x53, 0x65, 0x6e, 0x64, 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, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x75, 0x75, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65,
+	0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x41, 0x64, 0x64, 0x72,
+	0x65, 0x73, 0x73, 0x22, 0x6c, 0x0a, 0x0c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x18, 0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x69,
+	0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65,
+	0x63, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+	0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11,
+	0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
+	0x73, 0x22, 0x40, 0x0a, 0x16, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x6f, 0x77, 0x6e,
+	0x6c, 0x6f, 0x61, 0x64, 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,
+	0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75,
+	0x75, 0x69, 0x64, 0x22, 0x57, 0x0a, 0x17, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x6f,
+	0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22,
+	0x0a, 0x0d, 0x73, 0x72, 0x63, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x72, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61,
+	0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xfc, 0x02, 0x0a,
+	0x13, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 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, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08,
+	0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x63, 0x6b,
+	0x75, 0x70, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0c, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x16, 0x0a,
+	0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6c,
+	0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x4b, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74,
+	0x69, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x62, 0x69, 0x6d, 0x72,
+	0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61,
+	0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69,
+	0x61, 0x6c, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f,
+	0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11,
+	0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f,
+	0x64, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f,
+	0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x63, 0x6f, 0x6e,
+	0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x3d, 0x0a, 0x0f,
+	0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 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, 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, 0x29, 0x0a, 0x13, 0x42,
+	0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 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, 0x7d, 0x0a, 0x14, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70,
+	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a,
+	0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,
+	0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61,
+	0x63, 0x6b, 0x75, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+	0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72,
+	0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12,
+	0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x32, 0xe3, 0x05, 0x0a, 0x1a, 0x42, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+	0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x15,
+	0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12,
+	0x39, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x12, 0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e,
+	0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x62, 0x69, 0x6d,
+	0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x04, 0x4c, 0x69,
+	0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x62, 0x69, 0x6d,
+	0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x12, 0x3d, 0x0a, 0x0a, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74,
+	0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70,
+	0x63, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x3b, 0x0a, 0x04, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x13, 0x2e, 0x62, 0x69, 0x6d, 0x72,
+	0x70, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c,
+	0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49,
+	0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x35,
+	0x0a, 0x04, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x13, 0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e,
+	0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
+	0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x05, 0x46, 0x65, 0x74, 0x63, 0x68, 0x12, 0x14,
+	0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61,
+	0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0f, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44,
+	0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1e, 0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63,
+	0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63,
+	0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0c, 0x42, 0x61,
+	0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x62, 0x69, 0x6d,
+	0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
+	0x00, 0x12, 0x4b, 0x0a, 0x0c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x12, 0x1b, 0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75,
+	0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c,
+	0x2e, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b,
+	0x0a, 0x05, 0x57, 0x61, 0x74, 0x63, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x30, 0x01, 0x42, 0x30, 0x5a, 0x2e, 0x67,
+	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x68, 0x6f,
+	0x72, 0x6e, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67, 0x65, 0x6e,
+	0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2f, 0x62, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_bimrpc_bimrpc_proto_rawDescOnce sync.Once
+	file_bimrpc_bimrpc_proto_rawDescData = file_bimrpc_bimrpc_proto_rawDesc
+)
+
+func file_bimrpc_bimrpc_proto_rawDescGZIP() []byte {
+	file_bimrpc_bimrpc_proto_rawDescOnce.Do(func() {
+		file_bimrpc_bimrpc_proto_rawDescData = protoimpl.X.CompressGZIP(file_bimrpc_bimrpc_proto_rawDescData)
+	})
+	return file_bimrpc_bimrpc_proto_rawDescData
+}
+
+var file_bimrpc_bimrpc_proto_msgTypes = make([]protoimpl.MessageInfo, 17)
+var file_bimrpc_bimrpc_proto_goTypes = []interface{}{
+	(*BackingImageSpec)(nil),        // 0: bimrpc.BackingImageSpec
+	(*BackingImageStatus)(nil),      // 1: bimrpc.BackingImageStatus
+	(*BackingImageResponse)(nil),    // 2: bimrpc.BackingImageResponse
+	(*DeleteRequest)(nil),           // 3: bimrpc.DeleteRequest
+	(*GetRequest)(nil),              // 4: bimrpc.GetRequest
+	(*ListResponse)(nil),            // 5: bimrpc.ListResponse
+	(*VersionResponse)(nil),         // 6: bimrpc.VersionResponse
+	(*SyncRequest)(nil),             // 7: bimrpc.SyncRequest
+	(*SendRequest)(nil),             // 8: bimrpc.SendRequest
+	(*FetchRequest)(nil),            // 9: bimrpc.FetchRequest
+	(*PrepareDownloadRequest)(nil),  // 10: bimrpc.PrepareDownloadRequest
+	(*PrepareDownloadResponse)(nil), // 11: bimrpc.PrepareDownloadResponse
+	(*BackupCreateRequest)(nil),     // 12: bimrpc.BackupCreateRequest
+	(*BackupStatusRequest)(nil),     // 13: bimrpc.BackupStatusRequest
+	(*BackupStatusResponse)(nil),    // 14: bimrpc.BackupStatusResponse
+	nil,                             // 15: bimrpc.ListResponse.BackingImagesEntry
+	nil,                             // 16: bimrpc.BackupCreateRequest.CredentialEntry
+	(*emptypb.Empty)(nil),           // 17: google.protobuf.Empty
+}
+var file_bimrpc_bimrpc_proto_depIdxs = []int32{
+	0,  // 0: bimrpc.BackingImageResponse.spec:type_name -> bimrpc.BackingImageSpec
+	1,  // 1: bimrpc.BackingImageResponse.status:type_name -> bimrpc.BackingImageStatus
+	15, // 2: bimrpc.ListResponse.backing_images:type_name -> bimrpc.ListResponse.BackingImagesEntry
+	0,  // 3: bimrpc.SyncRequest.spec:type_name -> bimrpc.BackingImageSpec
+	0,  // 4: bimrpc.FetchRequest.spec:type_name -> bimrpc.BackingImageSpec
+	16, // 5: bimrpc.BackupCreateRequest.credential:type_name -> bimrpc.BackupCreateRequest.CredentialEntry
+	2,  // 6: bimrpc.ListResponse.BackingImagesEntry.value:type_name -> bimrpc.BackingImageResponse
+	3,  // 7: bimrpc.BackingImageManagerService.Delete:input_type -> bimrpc.DeleteRequest
+	4,  // 8: bimrpc.BackingImageManagerService.Get:input_type -> bimrpc.GetRequest
+	17, // 9: bimrpc.BackingImageManagerService.List:input_type -> google.protobuf.Empty
+	17, // 10: bimrpc.BackingImageManagerService.VersionGet:input_type -> google.protobuf.Empty
+	7,  // 11: bimrpc.BackingImageManagerService.Sync:input_type -> bimrpc.SyncRequest
+	8,  // 12: bimrpc.BackingImageManagerService.Send:input_type -> bimrpc.SendRequest
+	9,  // 13: bimrpc.BackingImageManagerService.Fetch:input_type -> bimrpc.FetchRequest
+	10, // 14: bimrpc.BackingImageManagerService.PrepareDownload:input_type -> bimrpc.PrepareDownloadRequest
+	12, // 15: bimrpc.BackingImageManagerService.BackupCreate:input_type -> bimrpc.BackupCreateRequest
+	13, // 16: bimrpc.BackingImageManagerService.BackupStatus:input_type -> bimrpc.BackupStatusRequest
+	17, // 17: bimrpc.BackingImageManagerService.Watch:input_type -> google.protobuf.Empty
+	17, // 18: bimrpc.BackingImageManagerService.Delete:output_type -> google.protobuf.Empty
+	2,  // 19: bimrpc.BackingImageManagerService.Get:output_type -> bimrpc.BackingImageResponse
+	5,  // 20: bimrpc.BackingImageManagerService.List:output_type -> bimrpc.ListResponse
+	6,  // 21: bimrpc.BackingImageManagerService.VersionGet:output_type -> bimrpc.VersionResponse
+	2,  // 22: bimrpc.BackingImageManagerService.Sync:output_type -> bimrpc.BackingImageResponse
+	17, // 23: bimrpc.BackingImageManagerService.Send:output_type -> google.protobuf.Empty
+	2,  // 24: bimrpc.BackingImageManagerService.Fetch:output_type -> bimrpc.BackingImageResponse
+	11, // 25: bimrpc.BackingImageManagerService.PrepareDownload:output_type -> bimrpc.PrepareDownloadResponse
+	17, // 26: bimrpc.BackingImageManagerService.BackupCreate:output_type -> google.protobuf.Empty
+	14, // 27: bimrpc.BackingImageManagerService.BackupStatus:output_type -> bimrpc.BackupStatusResponse
+	17, // 28: bimrpc.BackingImageManagerService.Watch:output_type -> google.protobuf.Empty
+	18, // [18:29] is the sub-list for method output_type
+	7,  // [7:18] is the sub-list for method input_type
+	7,  // [7:7] is the sub-list for extension type_name
+	7,  // [7:7] is the sub-list for extension extendee
+	0,  // [0:7] is the sub-list for field type_name
+}
+
+func init() { file_bimrpc_bimrpc_proto_init() }
+func file_bimrpc_bimrpc_proto_init() {
+	if File_bimrpc_bimrpc_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_bimrpc_bimrpc_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackingImageSpec); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bimrpc_bimrpc_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackingImageStatus); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bimrpc_bimrpc_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackingImageResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bimrpc_bimrpc_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bimrpc_bimrpc_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bimrpc_bimrpc_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bimrpc_bimrpc_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VersionResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bimrpc_bimrpc_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SyncRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bimrpc_bimrpc_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SendRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bimrpc_bimrpc_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FetchRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bimrpc_bimrpc_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PrepareDownloadRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bimrpc_bimrpc_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PrepareDownloadResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bimrpc_bimrpc_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackupCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bimrpc_bimrpc_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackupStatusRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bimrpc_bimrpc_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackupStatusResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_bimrpc_bimrpc_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   17,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_bimrpc_bimrpc_proto_goTypes,
+		DependencyIndexes: file_bimrpc_bimrpc_proto_depIdxs,
+		MessageInfos:      file_bimrpc_bimrpc_proto_msgTypes,
+	}.Build()
+	File_bimrpc_bimrpc_proto = out.File
+	file_bimrpc_bimrpc_proto_rawDesc = nil
+	file_bimrpc_bimrpc_proto_goTypes = nil
+	file_bimrpc_bimrpc_proto_depIdxs = nil
+}
diff --git a/pkg/generated/bimrpc/bimrpc_grpc.pb.go b/pkg/generated/bimrpc/bimrpc_grpc.pb.go
new file mode 100644
index 0000000..e2ce0c9
--- /dev/null
+++ b/pkg/generated/bimrpc/bimrpc_grpc.pb.go
@@ -0,0 +1,509 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v4.24.3
+// source: bimrpc/bimrpc.proto
+
+package bimrpc
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+	BackingImageManagerService_Delete_FullMethodName          = "/bimrpc.BackingImageManagerService/Delete"
+	BackingImageManagerService_Get_FullMethodName             = "/bimrpc.BackingImageManagerService/Get"
+	BackingImageManagerService_List_FullMethodName            = "/bimrpc.BackingImageManagerService/List"
+	BackingImageManagerService_VersionGet_FullMethodName      = "/bimrpc.BackingImageManagerService/VersionGet"
+	BackingImageManagerService_Sync_FullMethodName            = "/bimrpc.BackingImageManagerService/Sync"
+	BackingImageManagerService_Send_FullMethodName            = "/bimrpc.BackingImageManagerService/Send"
+	BackingImageManagerService_Fetch_FullMethodName           = "/bimrpc.BackingImageManagerService/Fetch"
+	BackingImageManagerService_PrepareDownload_FullMethodName = "/bimrpc.BackingImageManagerService/PrepareDownload"
+	BackingImageManagerService_BackupCreate_FullMethodName    = "/bimrpc.BackingImageManagerService/BackupCreate"
+	BackingImageManagerService_BackupStatus_FullMethodName    = "/bimrpc.BackingImageManagerService/BackupStatus"
+	BackingImageManagerService_Watch_FullMethodName           = "/bimrpc.BackingImageManagerService/Watch"
+)
+
+// BackingImageManagerServiceClient is the client API for BackingImageManagerService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type BackingImageManagerServiceClient interface {
+	Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*BackingImageResponse, error)
+	List(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListResponse, error)
+	VersionGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionResponse, error)
+	Sync(ctx context.Context, in *SyncRequest, opts ...grpc.CallOption) (*BackingImageResponse, error)
+	Send(ctx context.Context, in *SendRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	Fetch(ctx context.Context, in *FetchRequest, opts ...grpc.CallOption) (*BackingImageResponse, error)
+	PrepareDownload(ctx context.Context, in *PrepareDownloadRequest, opts ...grpc.CallOption) (*PrepareDownloadResponse, error)
+	BackupCreate(ctx context.Context, in *BackupCreateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	BackupStatus(ctx context.Context, in *BackupStatusRequest, opts ...grpc.CallOption) (*BackupStatusResponse, error)
+	Watch(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (BackingImageManagerService_WatchClient, error)
+}
+
+type backingImageManagerServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewBackingImageManagerServiceClient(cc grpc.ClientConnInterface) BackingImageManagerServiceClient {
+	return &backingImageManagerServiceClient{cc}
+}
+
+func (c *backingImageManagerServiceClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, BackingImageManagerService_Delete_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *backingImageManagerServiceClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*BackingImageResponse, error) {
+	out := new(BackingImageResponse)
+	err := c.cc.Invoke(ctx, BackingImageManagerService_Get_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *backingImageManagerServiceClient) List(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListResponse, error) {
+	out := new(ListResponse)
+	err := c.cc.Invoke(ctx, BackingImageManagerService_List_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *backingImageManagerServiceClient) VersionGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionResponse, error) {
+	out := new(VersionResponse)
+	err := c.cc.Invoke(ctx, BackingImageManagerService_VersionGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *backingImageManagerServiceClient) Sync(ctx context.Context, in *SyncRequest, opts ...grpc.CallOption) (*BackingImageResponse, error) {
+	out := new(BackingImageResponse)
+	err := c.cc.Invoke(ctx, BackingImageManagerService_Sync_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *backingImageManagerServiceClient) Send(ctx context.Context, in *SendRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, BackingImageManagerService_Send_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *backingImageManagerServiceClient) Fetch(ctx context.Context, in *FetchRequest, opts ...grpc.CallOption) (*BackingImageResponse, error) {
+	out := new(BackingImageResponse)
+	err := c.cc.Invoke(ctx, BackingImageManagerService_Fetch_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *backingImageManagerServiceClient) PrepareDownload(ctx context.Context, in *PrepareDownloadRequest, opts ...grpc.CallOption) (*PrepareDownloadResponse, error) {
+	out := new(PrepareDownloadResponse)
+	err := c.cc.Invoke(ctx, BackingImageManagerService_PrepareDownload_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *backingImageManagerServiceClient) BackupCreate(ctx context.Context, in *BackupCreateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, BackingImageManagerService_BackupCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *backingImageManagerServiceClient) BackupStatus(ctx context.Context, in *BackupStatusRequest, opts ...grpc.CallOption) (*BackupStatusResponse, error) {
+	out := new(BackupStatusResponse)
+	err := c.cc.Invoke(ctx, BackingImageManagerService_BackupStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *backingImageManagerServiceClient) Watch(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (BackingImageManagerService_WatchClient, error) {
+	stream, err := c.cc.NewStream(ctx, &BackingImageManagerService_ServiceDesc.Streams[0], BackingImageManagerService_Watch_FullMethodName, opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &backingImageManagerServiceWatchClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type BackingImageManagerService_WatchClient interface {
+	Recv() (*emptypb.Empty, error)
+	grpc.ClientStream
+}
+
+type backingImageManagerServiceWatchClient struct {
+	grpc.ClientStream
+}
+
+func (x *backingImageManagerServiceWatchClient) Recv() (*emptypb.Empty, error) {
+	m := new(emptypb.Empty)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+// BackingImageManagerServiceServer is the server API for BackingImageManagerService service.
+// All implementations must embed UnimplementedBackingImageManagerServiceServer
+// for forward compatibility
+type BackingImageManagerServiceServer interface {
+	Delete(context.Context, *DeleteRequest) (*emptypb.Empty, error)
+	Get(context.Context, *GetRequest) (*BackingImageResponse, error)
+	List(context.Context, *emptypb.Empty) (*ListResponse, error)
+	VersionGet(context.Context, *emptypb.Empty) (*VersionResponse, error)
+	Sync(context.Context, *SyncRequest) (*BackingImageResponse, error)
+	Send(context.Context, *SendRequest) (*emptypb.Empty, error)
+	Fetch(context.Context, *FetchRequest) (*BackingImageResponse, error)
+	PrepareDownload(context.Context, *PrepareDownloadRequest) (*PrepareDownloadResponse, error)
+	BackupCreate(context.Context, *BackupCreateRequest) (*emptypb.Empty, error)
+	BackupStatus(context.Context, *BackupStatusRequest) (*BackupStatusResponse, error)
+	Watch(*emptypb.Empty, BackingImageManagerService_WatchServer) error
+	mustEmbedUnimplementedBackingImageManagerServiceServer()
+}
+
+// UnimplementedBackingImageManagerServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedBackingImageManagerServiceServer struct {
+}
+
+func (UnimplementedBackingImageManagerServiceServer) Delete(context.Context, *DeleteRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented")
+}
+func (UnimplementedBackingImageManagerServiceServer) Get(context.Context, *GetRequest) (*BackingImageResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
+}
+func (UnimplementedBackingImageManagerServiceServer) List(context.Context, *emptypb.Empty) (*ListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method List not implemented")
+}
+func (UnimplementedBackingImageManagerServiceServer) VersionGet(context.Context, *emptypb.Empty) (*VersionResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VersionGet not implemented")
+}
+func (UnimplementedBackingImageManagerServiceServer) Sync(context.Context, *SyncRequest) (*BackingImageResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Sync not implemented")
+}
+func (UnimplementedBackingImageManagerServiceServer) Send(context.Context, *SendRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Send not implemented")
+}
+func (UnimplementedBackingImageManagerServiceServer) Fetch(context.Context, *FetchRequest) (*BackingImageResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Fetch not implemented")
+}
+func (UnimplementedBackingImageManagerServiceServer) PrepareDownload(context.Context, *PrepareDownloadRequest) (*PrepareDownloadResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method PrepareDownload not implemented")
+}
+func (UnimplementedBackingImageManagerServiceServer) BackupCreate(context.Context, *BackupCreateRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method BackupCreate not implemented")
+}
+func (UnimplementedBackingImageManagerServiceServer) BackupStatus(context.Context, *BackupStatusRequest) (*BackupStatusResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method BackupStatus not implemented")
+}
+func (UnimplementedBackingImageManagerServiceServer) Watch(*emptypb.Empty, BackingImageManagerService_WatchServer) error {
+	return status.Errorf(codes.Unimplemented, "method Watch not implemented")
+}
+func (UnimplementedBackingImageManagerServiceServer) mustEmbedUnimplementedBackingImageManagerServiceServer() {
+}
+
+// UnsafeBackingImageManagerServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to BackingImageManagerServiceServer will
+// result in compilation errors.
+type UnsafeBackingImageManagerServiceServer interface {
+	mustEmbedUnimplementedBackingImageManagerServiceServer()
+}
+
+func RegisterBackingImageManagerServiceServer(s grpc.ServiceRegistrar, srv BackingImageManagerServiceServer) {
+	s.RegisterService(&BackingImageManagerService_ServiceDesc, srv)
+}
+
+func _BackingImageManagerService_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BackingImageManagerServiceServer).Delete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BackingImageManagerService_Delete_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BackingImageManagerServiceServer).Delete(ctx, req.(*DeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BackingImageManagerService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BackingImageManagerServiceServer).Get(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BackingImageManagerService_Get_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BackingImageManagerServiceServer).Get(ctx, req.(*GetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BackingImageManagerService_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BackingImageManagerServiceServer).List(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BackingImageManagerService_List_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BackingImageManagerServiceServer).List(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BackingImageManagerService_VersionGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BackingImageManagerServiceServer).VersionGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BackingImageManagerService_VersionGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BackingImageManagerServiceServer).VersionGet(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BackingImageManagerService_Sync_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SyncRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BackingImageManagerServiceServer).Sync(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BackingImageManagerService_Sync_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BackingImageManagerServiceServer).Sync(ctx, req.(*SyncRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BackingImageManagerService_Send_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SendRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BackingImageManagerServiceServer).Send(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BackingImageManagerService_Send_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BackingImageManagerServiceServer).Send(ctx, req.(*SendRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BackingImageManagerService_Fetch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(FetchRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BackingImageManagerServiceServer).Fetch(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BackingImageManagerService_Fetch_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BackingImageManagerServiceServer).Fetch(ctx, req.(*FetchRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BackingImageManagerService_PrepareDownload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(PrepareDownloadRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BackingImageManagerServiceServer).PrepareDownload(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BackingImageManagerService_PrepareDownload_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BackingImageManagerServiceServer).PrepareDownload(ctx, req.(*PrepareDownloadRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BackingImageManagerService_BackupCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(BackupCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BackingImageManagerServiceServer).BackupCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BackingImageManagerService_BackupCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BackingImageManagerServiceServer).BackupCreate(ctx, req.(*BackupCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BackingImageManagerService_BackupStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(BackupStatusRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BackingImageManagerServiceServer).BackupStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BackingImageManagerService_BackupStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BackingImageManagerServiceServer).BackupStatus(ctx, req.(*BackupStatusRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BackingImageManagerService_Watch_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(emptypb.Empty)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(BackingImageManagerServiceServer).Watch(m, &backingImageManagerServiceWatchServer{stream})
+}
+
+type BackingImageManagerService_WatchServer interface {
+	Send(*emptypb.Empty) error
+	grpc.ServerStream
+}
+
+type backingImageManagerServiceWatchServer struct {
+	grpc.ServerStream
+}
+
+func (x *backingImageManagerServiceWatchServer) Send(m *emptypb.Empty) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+// BackingImageManagerService_ServiceDesc is the grpc.ServiceDesc for BackingImageManagerService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var BackingImageManagerService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "bimrpc.BackingImageManagerService",
+	HandlerType: (*BackingImageManagerServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "Delete",
+			Handler:    _BackingImageManagerService_Delete_Handler,
+		},
+		{
+			MethodName: "Get",
+			Handler:    _BackingImageManagerService_Get_Handler,
+		},
+		{
+			MethodName: "List",
+			Handler:    _BackingImageManagerService_List_Handler,
+		},
+		{
+			MethodName: "VersionGet",
+			Handler:    _BackingImageManagerService_VersionGet_Handler,
+		},
+		{
+			MethodName: "Sync",
+			Handler:    _BackingImageManagerService_Sync_Handler,
+		},
+		{
+			MethodName: "Send",
+			Handler:    _BackingImageManagerService_Send_Handler,
+		},
+		{
+			MethodName: "Fetch",
+			Handler:    _BackingImageManagerService_Fetch_Handler,
+		},
+		{
+			MethodName: "PrepareDownload",
+			Handler:    _BackingImageManagerService_PrepareDownload_Handler,
+		},
+		{
+			MethodName: "BackupCreate",
+			Handler:    _BackingImageManagerService_BackupCreate_Handler,
+		},
+		{
+			MethodName: "BackupStatus",
+			Handler:    _BackingImageManagerService_BackupStatus_Handler,
+		},
+	},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "Watch",
+			Handler:       _BackingImageManagerService_Watch_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "bimrpc/bimrpc.proto",
+}
diff --git a/pkg/generated/enginerpc/common.pb.go b/pkg/generated/enginerpc/common.pb.go
new file mode 100644
index 0000000..2f7898a
--- /dev/null
+++ b/pkg/generated/enginerpc/common.pb.go
@@ -0,0 +1,166 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
+// source: ptypes/common.proto
+
+package enginerpc
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type SyncFileInfo struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	FromFileName string `protobuf:"bytes,1,opt,name=from_file_name,json=fromFileName,proto3" json:"from_file_name,omitempty"`
+	ToFileName   string `protobuf:"bytes,2,opt,name=to_file_name,json=toFileName,proto3" json:"to_file_name,omitempty"`
+	ActualSize   int64  `protobuf:"varint,3,opt,name=actual_size,json=actualSize,proto3" json:"actual_size,omitempty"`
+}
+
+func (x *SyncFileInfo) Reset() {
+	*x = SyncFileInfo{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_common_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SyncFileInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SyncFileInfo) ProtoMessage() {}
+
+func (x *SyncFileInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_common_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SyncFileInfo.ProtoReflect.Descriptor instead.
+func (*SyncFileInfo) Descriptor() ([]byte, []int) {
+	return file_ptypes_common_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *SyncFileInfo) GetFromFileName() string {
+	if x != nil {
+		return x.FromFileName
+	}
+	return ""
+}
+
+func (x *SyncFileInfo) GetToFileName() string {
+	if x != nil {
+		return x.ToFileName
+	}
+	return ""
+}
+
+func (x *SyncFileInfo) GetActualSize() int64 {
+	if x != nil {
+		return x.ActualSize
+	}
+	return 0
+}
+
+var File_ptypes_common_proto protoreflect.FileDescriptor
+
+var file_ptypes_common_proto_rawDesc = []byte{
+	0x0a, 0x13, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0x77, 0x0a,
+	0x0c, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x0a,
+	0x0e, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x6c, 0x65, 0x4e,
+	0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x74, 0x6f, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x46, 0x69, 0x6c,
+	0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f,
+	0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x75,
+	0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x68, 0x6f, 0x72, 0x6e, 0x2f, 0x74, 0x79,
+	0x70, 0x65, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
+	0x64, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x33,
+}
+
+var (
+	file_ptypes_common_proto_rawDescOnce sync.Once
+	file_ptypes_common_proto_rawDescData = file_ptypes_common_proto_rawDesc
+)
+
+func file_ptypes_common_proto_rawDescGZIP() []byte {
+	file_ptypes_common_proto_rawDescOnce.Do(func() {
+		file_ptypes_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_ptypes_common_proto_rawDescData)
+	})
+	return file_ptypes_common_proto_rawDescData
+}
+
+var file_ptypes_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_ptypes_common_proto_goTypes = []interface{}{
+	(*SyncFileInfo)(nil), // 0: ptypes.SyncFileInfo
+}
+var file_ptypes_common_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] 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
+}
+
+func init() { file_ptypes_common_proto_init() }
+func file_ptypes_common_proto_init() {
+	if File_ptypes_common_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_ptypes_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SyncFileInfo); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_ptypes_common_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_ptypes_common_proto_goTypes,
+		DependencyIndexes: file_ptypes_common_proto_depIdxs,
+		MessageInfos:      file_ptypes_common_proto_msgTypes,
+	}.Build()
+	File_ptypes_common_proto = out.File
+	file_ptypes_common_proto_rawDesc = nil
+	file_ptypes_common_proto_goTypes = nil
+	file_ptypes_common_proto_depIdxs = nil
+}
diff --git a/pkg/generated/enginerpc/controller.pb.go b/pkg/generated/enginerpc/controller.pb.go
new file mode 100644
index 0000000..7df606d
--- /dev/null
+++ b/pkg/generated/enginerpc/controller.pb.go
@@ -0,0 +1,2033 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
+// source: ptypes/controller.proto
+
+package enginerpc
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type ReplicaMode int32
+
+const (
+	ReplicaMode_WO  ReplicaMode = 0
+	ReplicaMode_RW  ReplicaMode = 1
+	ReplicaMode_ERR ReplicaMode = 2
+)
+
+// Enum value maps for ReplicaMode.
+var (
+	ReplicaMode_name = map[int32]string{
+		0: "WO",
+		1: "RW",
+		2: "ERR",
+	}
+	ReplicaMode_value = map[string]int32{
+		"WO":  0,
+		"RW":  1,
+		"ERR": 2,
+	}
+)
+
+func (x ReplicaMode) Enum() *ReplicaMode {
+	p := new(ReplicaMode)
+	*p = x
+	return p
+}
+
+func (x ReplicaMode) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ReplicaMode) Descriptor() protoreflect.EnumDescriptor {
+	return file_ptypes_controller_proto_enumTypes[0].Descriptor()
+}
+
+func (ReplicaMode) Type() protoreflect.EnumType {
+	return &file_ptypes_controller_proto_enumTypes[0]
+}
+
+func (x ReplicaMode) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ReplicaMode.Descriptor instead.
+func (ReplicaMode) EnumDescriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{0}
+}
+
+type Volume struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name                      string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Size                      int64  `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"`
+	ReplicaCount              int32  `protobuf:"varint,3,opt,name=replicaCount,proto3" json:"replicaCount,omitempty"`
+	Endpoint                  string `protobuf:"bytes,4,opt,name=endpoint,proto3" json:"endpoint,omitempty"`
+	Frontend                  string `protobuf:"bytes,5,opt,name=frontend,proto3" json:"frontend,omitempty"`
+	FrontendState             string `protobuf:"bytes,6,opt,name=frontendState,proto3" json:"frontendState,omitempty"`
+	IsExpanding               bool   `protobuf:"varint,7,opt,name=isExpanding,proto3" json:"isExpanding,omitempty"`
+	LastExpansionError        string `protobuf:"bytes,8,opt,name=last_expansion_error,json=lastExpansionError,proto3" json:"last_expansion_error,omitempty"`
+	LastExpansionFailedAt     string `protobuf:"bytes,9,opt,name=last_expansion_failed_at,json=lastExpansionFailedAt,proto3" json:"last_expansion_failed_at,omitempty"`
+	UnmapMarkSnapChainRemoved bool   `protobuf:"varint,10,opt,name=unmap_mark_snap_chain_removed,json=unmapMarkSnapChainRemoved,proto3" json:"unmap_mark_snap_chain_removed,omitempty"`
+	SnapshotMaxCount          int32  `protobuf:"varint,11,opt,name=snapshot_max_count,json=snapshotMaxCount,proto3" json:"snapshot_max_count,omitempty"`
+	SnapshotMaxSize           int64  `protobuf:"varint,12,opt,name=snapshot_max_size,json=snapshotMaxSize,proto3" json:"snapshot_max_size,omitempty"`
+}
+
+func (x *Volume) Reset() {
+	*x = Volume{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Volume) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Volume) ProtoMessage() {}
+
+func (x *Volume) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Volume.ProtoReflect.Descriptor instead.
+func (*Volume) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Volume) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Volume) GetSize() int64 {
+	if x != nil {
+		return x.Size
+	}
+	return 0
+}
+
+func (x *Volume) GetReplicaCount() int32 {
+	if x != nil {
+		return x.ReplicaCount
+	}
+	return 0
+}
+
+func (x *Volume) GetEndpoint() string {
+	if x != nil {
+		return x.Endpoint
+	}
+	return ""
+}
+
+func (x *Volume) GetFrontend() string {
+	if x != nil {
+		return x.Frontend
+	}
+	return ""
+}
+
+func (x *Volume) GetFrontendState() string {
+	if x != nil {
+		return x.FrontendState
+	}
+	return ""
+}
+
+func (x *Volume) GetIsExpanding() bool {
+	if x != nil {
+		return x.IsExpanding
+	}
+	return false
+}
+
+func (x *Volume) GetLastExpansionError() string {
+	if x != nil {
+		return x.LastExpansionError
+	}
+	return ""
+}
+
+func (x *Volume) GetLastExpansionFailedAt() string {
+	if x != nil {
+		return x.LastExpansionFailedAt
+	}
+	return ""
+}
+
+func (x *Volume) GetUnmapMarkSnapChainRemoved() bool {
+	if x != nil {
+		return x.UnmapMarkSnapChainRemoved
+	}
+	return false
+}
+
+func (x *Volume) GetSnapshotMaxCount() int32 {
+	if x != nil {
+		return x.SnapshotMaxCount
+	}
+	return 0
+}
+
+func (x *Volume) GetSnapshotMaxSize() int64 {
+	if x != nil {
+		return x.SnapshotMaxSize
+	}
+	return 0
+}
+
+type ReplicaAddress struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Address      string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+	InstanceName string `protobuf:"bytes,2,opt,name=instanceName,proto3" json:"instanceName,omitempty"`
+}
+
+func (x *ReplicaAddress) Reset() {
+	*x = ReplicaAddress{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaAddress) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaAddress) ProtoMessage() {}
+
+func (x *ReplicaAddress) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaAddress.ProtoReflect.Descriptor instead.
+func (*ReplicaAddress) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *ReplicaAddress) GetAddress() string {
+	if x != nil {
+		return x.Address
+	}
+	return ""
+}
+
+func (x *ReplicaAddress) GetInstanceName() string {
+	if x != nil {
+		return x.InstanceName
+	}
+	return ""
+}
+
+type ControllerReplica struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Address *ReplicaAddress `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+	Mode    ReplicaMode     `protobuf:"varint,2,opt,name=mode,proto3,enum=ptypes.ReplicaMode" json:"mode,omitempty"`
+}
+
+func (x *ControllerReplica) Reset() {
+	*x = ControllerReplica{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ControllerReplica) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ControllerReplica) ProtoMessage() {}
+
+func (x *ControllerReplica) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ControllerReplica.ProtoReflect.Descriptor instead.
+func (*ControllerReplica) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *ControllerReplica) GetAddress() *ReplicaAddress {
+	if x != nil {
+		return x.Address
+	}
+	return nil
+}
+
+func (x *ControllerReplica) GetMode() ReplicaMode {
+	if x != nil {
+		return x.Mode
+	}
+	return ReplicaMode_WO
+}
+
+type VolumeStartRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ReplicaAddresses []string `protobuf:"bytes,1,rep,name=replicaAddresses,proto3" json:"replicaAddresses,omitempty"`
+	Size             int64    `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"`
+	CurrentSize      int64    `protobuf:"varint,3,opt,name=currentSize,proto3" json:"currentSize,omitempty"`
+}
+
+func (x *VolumeStartRequest) Reset() {
+	*x = VolumeStartRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VolumeStartRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VolumeStartRequest) ProtoMessage() {}
+
+func (x *VolumeStartRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VolumeStartRequest.ProtoReflect.Descriptor instead.
+func (*VolumeStartRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *VolumeStartRequest) GetReplicaAddresses() []string {
+	if x != nil {
+		return x.ReplicaAddresses
+	}
+	return nil
+}
+
+func (x *VolumeStartRequest) GetSize() int64 {
+	if x != nil {
+		return x.Size
+	}
+	return 0
+}
+
+func (x *VolumeStartRequest) GetCurrentSize() int64 {
+	if x != nil {
+		return x.CurrentSize
+	}
+	return 0
+}
+
+type VolumeSnapshotRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name   string            `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Labels map[string]string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *VolumeSnapshotRequest) Reset() {
+	*x = VolumeSnapshotRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VolumeSnapshotRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VolumeSnapshotRequest) ProtoMessage() {}
+
+func (x *VolumeSnapshotRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VolumeSnapshotRequest.ProtoReflect.Descriptor instead.
+func (*VolumeSnapshotRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *VolumeSnapshotRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *VolumeSnapshotRequest) GetLabels() map[string]string {
+	if x != nil {
+		return x.Labels
+	}
+	return nil
+}
+
+type VolumeSnapshotReply struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *VolumeSnapshotReply) Reset() {
+	*x = VolumeSnapshotReply{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VolumeSnapshotReply) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VolumeSnapshotReply) ProtoMessage() {}
+
+func (x *VolumeSnapshotReply) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VolumeSnapshotReply.ProtoReflect.Descriptor instead.
+func (*VolumeSnapshotReply) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *VolumeSnapshotReply) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type VolumeRevertRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *VolumeRevertRequest) Reset() {
+	*x = VolumeRevertRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VolumeRevertRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VolumeRevertRequest) ProtoMessage() {}
+
+func (x *VolumeRevertRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VolumeRevertRequest.ProtoReflect.Descriptor instead.
+func (*VolumeRevertRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *VolumeRevertRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type VolumeExpandRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Size int64 `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"`
+}
+
+func (x *VolumeExpandRequest) Reset() {
+	*x = VolumeExpandRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VolumeExpandRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VolumeExpandRequest) ProtoMessage() {}
+
+func (x *VolumeExpandRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VolumeExpandRequest.ProtoReflect.Descriptor instead.
+func (*VolumeExpandRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *VolumeExpandRequest) GetSize() int64 {
+	if x != nil {
+		return x.Size
+	}
+	return 0
+}
+
+type VolumeFrontendStartRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Frontend string `protobuf:"bytes,1,opt,name=frontend,proto3" json:"frontend,omitempty"`
+}
+
+func (x *VolumeFrontendStartRequest) Reset() {
+	*x = VolumeFrontendStartRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VolumeFrontendStartRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VolumeFrontendStartRequest) ProtoMessage() {}
+
+func (x *VolumeFrontendStartRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VolumeFrontendStartRequest.ProtoReflect.Descriptor instead.
+func (*VolumeFrontendStartRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *VolumeFrontendStartRequest) GetFrontend() string {
+	if x != nil {
+		return x.Frontend
+	}
+	return ""
+}
+
+type VolumeUnmapMarkSnapChainRemovedSetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"`
+}
+
+func (x *VolumeUnmapMarkSnapChainRemovedSetRequest) Reset() {
+	*x = VolumeUnmapMarkSnapChainRemovedSetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VolumeUnmapMarkSnapChainRemovedSetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VolumeUnmapMarkSnapChainRemovedSetRequest) ProtoMessage() {}
+
+func (x *VolumeUnmapMarkSnapChainRemovedSetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VolumeUnmapMarkSnapChainRemovedSetRequest.ProtoReflect.Descriptor instead.
+func (*VolumeUnmapMarkSnapChainRemovedSetRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *VolumeUnmapMarkSnapChainRemovedSetRequest) GetEnabled() bool {
+	if x != nil {
+		return x.Enabled
+	}
+	return false
+}
+
+type VolumeSnapshotMaxCountSetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Count int32 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
+}
+
+func (x *VolumeSnapshotMaxCountSetRequest) Reset() {
+	*x = VolumeSnapshotMaxCountSetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VolumeSnapshotMaxCountSetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VolumeSnapshotMaxCountSetRequest) ProtoMessage() {}
+
+func (x *VolumeSnapshotMaxCountSetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VolumeSnapshotMaxCountSetRequest.ProtoReflect.Descriptor instead.
+func (*VolumeSnapshotMaxCountSetRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *VolumeSnapshotMaxCountSetRequest) GetCount() int32 {
+	if x != nil {
+		return x.Count
+	}
+	return 0
+}
+
+type VolumeSnapshotMaxSizeSetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Size int64 `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"`
+}
+
+func (x *VolumeSnapshotMaxSizeSetRequest) Reset() {
+	*x = VolumeSnapshotMaxSizeSetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VolumeSnapshotMaxSizeSetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VolumeSnapshotMaxSizeSetRequest) ProtoMessage() {}
+
+func (x *VolumeSnapshotMaxSizeSetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VolumeSnapshotMaxSizeSetRequest.ProtoReflect.Descriptor instead.
+func (*VolumeSnapshotMaxSizeSetRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *VolumeSnapshotMaxSizeSetRequest) GetSize() int64 {
+	if x != nil {
+		return x.Size
+	}
+	return 0
+}
+
+type VolumePrepareRestoreRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	LastRestored string `protobuf:"bytes,1,opt,name=lastRestored,proto3" json:"lastRestored,omitempty"`
+}
+
+func (x *VolumePrepareRestoreRequest) Reset() {
+	*x = VolumePrepareRestoreRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VolumePrepareRestoreRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VolumePrepareRestoreRequest) ProtoMessage() {}
+
+func (x *VolumePrepareRestoreRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VolumePrepareRestoreRequest.ProtoReflect.Descriptor instead.
+func (*VolumePrepareRestoreRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *VolumePrepareRestoreRequest) GetLastRestored() string {
+	if x != nil {
+		return x.LastRestored
+	}
+	return ""
+}
+
+type VolumeFinishRestoreRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	CurrentRestored string `protobuf:"bytes,1,opt,name=currentRestored,proto3" json:"currentRestored,omitempty"`
+}
+
+func (x *VolumeFinishRestoreRequest) Reset() {
+	*x = VolumeFinishRestoreRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VolumeFinishRestoreRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VolumeFinishRestoreRequest) ProtoMessage() {}
+
+func (x *VolumeFinishRestoreRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VolumeFinishRestoreRequest.ProtoReflect.Descriptor instead.
+func (*VolumeFinishRestoreRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *VolumeFinishRestoreRequest) GetCurrentRestored() string {
+	if x != nil {
+		return x.CurrentRestored
+	}
+	return ""
+}
+
+type ReplicaListReply struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replicas []*ControllerReplica `protobuf:"bytes,1,rep,name=replicas,proto3" json:"replicas,omitempty"`
+}
+
+func (x *ReplicaListReply) Reset() {
+	*x = ReplicaListReply{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaListReply) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaListReply) ProtoMessage() {}
+
+func (x *ReplicaListReply) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaListReply.ProtoReflect.Descriptor instead.
+func (*ReplicaListReply) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *ReplicaListReply) GetReplicas() []*ControllerReplica {
+	if x != nil {
+		return x.Replicas
+	}
+	return nil
+}
+
+type ControllerReplicaCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Address          string      `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+	SnapshotRequired bool        `protobuf:"varint,2,opt,name=snapshot_required,json=snapshotRequired,proto3" json:"snapshot_required,omitempty"`
+	Mode             ReplicaMode `protobuf:"varint,3,opt,name=mode,proto3,enum=ptypes.ReplicaMode" json:"mode,omitempty"`
+}
+
+func (x *ControllerReplicaCreateRequest) Reset() {
+	*x = ControllerReplicaCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ControllerReplicaCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ControllerReplicaCreateRequest) ProtoMessage() {}
+
+func (x *ControllerReplicaCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ControllerReplicaCreateRequest.ProtoReflect.Descriptor instead.
+func (*ControllerReplicaCreateRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *ControllerReplicaCreateRequest) GetAddress() string {
+	if x != nil {
+		return x.Address
+	}
+	return ""
+}
+
+func (x *ControllerReplicaCreateRequest) GetSnapshotRequired() bool {
+	if x != nil {
+		return x.SnapshotRequired
+	}
+	return false
+}
+
+func (x *ControllerReplicaCreateRequest) GetMode() ReplicaMode {
+	if x != nil {
+		return x.Mode
+	}
+	return ReplicaMode_WO
+}
+
+type ReplicaPrepareRebuildReply struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica          *ControllerReplica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+	SyncFileInfoList []*SyncFileInfo    `protobuf:"bytes,2,rep,name=sync_file_info_list,json=syncFileInfoList,proto3" json:"sync_file_info_list,omitempty"`
+}
+
+func (x *ReplicaPrepareRebuildReply) Reset() {
+	*x = ReplicaPrepareRebuildReply{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaPrepareRebuildReply) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaPrepareRebuildReply) ProtoMessage() {}
+
+func (x *ReplicaPrepareRebuildReply) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaPrepareRebuildReply.ProtoReflect.Descriptor instead.
+func (*ReplicaPrepareRebuildReply) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *ReplicaPrepareRebuildReply) GetReplica() *ControllerReplica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+func (x *ReplicaPrepareRebuildReply) GetSyncFileInfoList() []*SyncFileInfo {
+	if x != nil {
+		return x.SyncFileInfoList
+	}
+	return nil
+}
+
+type JournalListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Limit int64 `protobuf:"varint,1,opt,name=limit,proto3" json:"limit,omitempty"`
+}
+
+func (x *JournalListRequest) Reset() {
+	*x = JournalListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *JournalListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*JournalListRequest) ProtoMessage() {}
+
+func (x *JournalListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use JournalListRequest.ProtoReflect.Descriptor instead.
+func (*JournalListRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *JournalListRequest) GetLimit() int64 {
+	if x != nil {
+		return x.Limit
+	}
+	return 0
+}
+
+type VersionOutput struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Version                 string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
+	GitCommit               string `protobuf:"bytes,2,opt,name=gitCommit,proto3" json:"gitCommit,omitempty"`
+	BuildDate               string `protobuf:"bytes,3,opt,name=buildDate,proto3" json:"buildDate,omitempty"`
+	CliAPIVersion           int64  `protobuf:"varint,4,opt,name=cliAPIVersion,proto3" json:"cliAPIVersion,omitempty"`
+	CliAPIMinVersion        int64  `protobuf:"varint,5,opt,name=cliAPIMinVersion,proto3" json:"cliAPIMinVersion,omitempty"`
+	ControllerAPIVersion    int64  `protobuf:"varint,6,opt,name=controllerAPIVersion,proto3" json:"controllerAPIVersion,omitempty"`
+	ControllerAPIMinVersion int64  `protobuf:"varint,7,opt,name=controllerAPIMinVersion,proto3" json:"controllerAPIMinVersion,omitempty"`
+	DataFormatVersion       int64  `protobuf:"varint,8,opt,name=dataFormatVersion,proto3" json:"dataFormatVersion,omitempty"`
+	DataFormatMinVersion    int64  `protobuf:"varint,9,opt,name=dataFormatMinVersion,proto3" json:"dataFormatMinVersion,omitempty"`
+}
+
+func (x *VersionOutput) Reset() {
+	*x = VersionOutput{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VersionOutput) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VersionOutput) ProtoMessage() {}
+
+func (x *VersionOutput) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VersionOutput.ProtoReflect.Descriptor instead.
+func (*VersionOutput) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *VersionOutput) GetVersion() string {
+	if x != nil {
+		return x.Version
+	}
+	return ""
+}
+
+func (x *VersionOutput) GetGitCommit() string {
+	if x != nil {
+		return x.GitCommit
+	}
+	return ""
+}
+
+func (x *VersionOutput) GetBuildDate() string {
+	if x != nil {
+		return x.BuildDate
+	}
+	return ""
+}
+
+func (x *VersionOutput) GetCliAPIVersion() int64 {
+	if x != nil {
+		return x.CliAPIVersion
+	}
+	return 0
+}
+
+func (x *VersionOutput) GetCliAPIMinVersion() int64 {
+	if x != nil {
+		return x.CliAPIMinVersion
+	}
+	return 0
+}
+
+func (x *VersionOutput) GetControllerAPIVersion() int64 {
+	if x != nil {
+		return x.ControllerAPIVersion
+	}
+	return 0
+}
+
+func (x *VersionOutput) GetControllerAPIMinVersion() int64 {
+	if x != nil {
+		return x.ControllerAPIMinVersion
+	}
+	return 0
+}
+
+func (x *VersionOutput) GetDataFormatVersion() int64 {
+	if x != nil {
+		return x.DataFormatVersion
+	}
+	return 0
+}
+
+func (x *VersionOutput) GetDataFormatMinVersion() int64 {
+	if x != nil {
+		return x.DataFormatMinVersion
+	}
+	return 0
+}
+
+type VersionDetailGetReply struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Version *VersionOutput `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
+}
+
+func (x *VersionDetailGetReply) Reset() {
+	*x = VersionDetailGetReply{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VersionDetailGetReply) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VersionDetailGetReply) ProtoMessage() {}
+
+func (x *VersionDetailGetReply) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VersionDetailGetReply.ProtoReflect.Descriptor instead.
+func (*VersionDetailGetReply) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *VersionDetailGetReply) GetVersion() *VersionOutput {
+	if x != nil {
+		return x.Version
+	}
+	return nil
+}
+
+type Metrics struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ReadThroughput  uint64 `protobuf:"varint,1,opt,name=readThroughput,proto3" json:"readThroughput,omitempty"`
+	WriteThroughput uint64 `protobuf:"varint,2,opt,name=writeThroughput,proto3" json:"writeThroughput,omitempty"`
+	ReadLatency     uint64 `protobuf:"varint,3,opt,name=readLatency,proto3" json:"readLatency,omitempty"`
+	WriteLatency    uint64 `protobuf:"varint,4,opt,name=writeLatency,proto3" json:"writeLatency,omitempty"`
+	ReadIOPS        uint64 `protobuf:"varint,5,opt,name=readIOPS,proto3" json:"readIOPS,omitempty"`
+	WriteIOPS       uint64 `protobuf:"varint,6,opt,name=writeIOPS,proto3" json:"writeIOPS,omitempty"`
+}
+
+func (x *Metrics) Reset() {
+	*x = Metrics{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Metrics) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Metrics) ProtoMessage() {}
+
+func (x *Metrics) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Metrics.ProtoReflect.Descriptor instead.
+func (*Metrics) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *Metrics) GetReadThroughput() uint64 {
+	if x != nil {
+		return x.ReadThroughput
+	}
+	return 0
+}
+
+func (x *Metrics) GetWriteThroughput() uint64 {
+	if x != nil {
+		return x.WriteThroughput
+	}
+	return 0
+}
+
+func (x *Metrics) GetReadLatency() uint64 {
+	if x != nil {
+		return x.ReadLatency
+	}
+	return 0
+}
+
+func (x *Metrics) GetWriteLatency() uint64 {
+	if x != nil {
+		return x.WriteLatency
+	}
+	return 0
+}
+
+func (x *Metrics) GetReadIOPS() uint64 {
+	if x != nil {
+		return x.ReadIOPS
+	}
+	return 0
+}
+
+func (x *Metrics) GetWriteIOPS() uint64 {
+	if x != nil {
+		return x.WriteIOPS
+	}
+	return 0
+}
+
+type MetricsGetReply struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Metrics *Metrics `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
+}
+
+func (x *MetricsGetReply) Reset() {
+	*x = MetricsGetReply{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_controller_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MetricsGetReply) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MetricsGetReply) ProtoMessage() {}
+
+func (x *MetricsGetReply) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_controller_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MetricsGetReply.ProtoReflect.Descriptor instead.
+func (*MetricsGetReply) Descriptor() ([]byte, []int) {
+	return file_ptypes_controller_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *MetricsGetReply) GetMetrics() *Metrics {
+	if x != nil {
+		return x.Metrics
+	}
+	return nil
+}
+
+var File_ptypes_controller_proto protoreflect.FileDescriptor
+
+var file_ptypes_controller_proto_rawDesc = []byte{
+	0x0a, 0x17, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c,
+	0x6c, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x70, 0x74, 0x79, 0x70, 0x65,
+	0x73, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13,
+	0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x22, 0xdb, 0x03, 0x0a, 0x06, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x12,
+	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x72, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e,
+	0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e,
+	0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x53, 0x74,
+	0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x45, 0x78,
+	0x70, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69,
+	0x73, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61,
+	0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72,
+	0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x78,
+	0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x37, 0x0a, 0x18,
+	0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x66,
+	0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15,
+	0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69,
+	0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x40, 0x0a, 0x1d, 0x75, 0x6e, 0x6d, 0x61, 0x70, 0x5f, 0x6d,
+	0x61, 0x72, 0x6b, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x72,
+	0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x6e,
+	0x6d, 0x61, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x53, 0x6e, 0x61, 0x70, 0x43, 0x68, 0x61, 0x69, 0x6e,
+	0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x6e, 0x61, 0x70, 0x73,
+	0x68, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20,
+	0x01, 0x28, 0x05, 0x52, 0x10, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78,
+	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x0f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a,
+	0x65, 0x22, 0x4e, 0x0a, 0x0e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72,
+	0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x22, 0x0a,
+	0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d,
+	0x65, 0x22, 0x6e, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x52,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
+	0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73,
+	0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52,
+	0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64,
+	0x65, 0x22, 0x76, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x09, 0x52, 0x10, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
+	0x73, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65,
+	0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x75,
+	0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x15, 0x56, 0x6f,
+	0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 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, 0x41, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c,
+	0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73,
+	0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74,
+	0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61,
+	0x62, 0x65, 0x6c, 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, 0x29, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53,
+	0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04,
+	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x22, 0x29, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74,
+	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, 0x29, 0x0a, 0x13, 0x56,
+	0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x38, 0x0a, 0x1a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65,
+	0x46, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64,
+	0x22, 0x45, 0x0a, 0x29, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x55, 0x6e, 0x6d, 0x61, 0x70, 0x4d,
+	0x61, 0x72, 0x6b, 0x53, 0x6e, 0x61, 0x70, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x6d, 0x6f,
+	0x76, 0x65, 0x64, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a,
+	0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,
+	0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x38, 0x0a, 0x20, 0x56, 0x6f, 0x6c, 0x75, 0x6d,
+	0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e,
+	0x74, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x22, 0x35, 0x0a, 0x1f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73,
+	0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x41, 0x0a, 0x1b, 0x56, 0x6f, 0x6c, 0x75,
+	0x6d, 0x65, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x52,
+	0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c,
+	0x61, 0x73, 0x74, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x46, 0x0a, 0x1a, 0x56,
+	0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x74, 0x6f,
+	0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x75, 0x72,
+	0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x74, 0x6f,
+	0x72, 0x65, 0x64, 0x22, 0x49, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4c, 0x69,
+	0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x35, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x22, 0x90,
+	0x01, 0x0a, 0x1e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73,
+	0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64,
+	0x65, 0x22, 0x96, 0x01, 0x0a, 0x1a, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x50, 0x72, 0x65,
+	0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x79,
+	0x12, 0x33, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x19, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72,
+	0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x07, 0x72, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x43, 0x0a, 0x13, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x66, 0x69,
+	0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x79, 0x6e, 0x63,
+	0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x69,
+	0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x2a, 0x0a, 0x12, 0x4a, 0x6f,
+	0x75, 0x72, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x87, 0x03, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x73, 0x69,
+	0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 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, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74,
+	0x12, 0x1c, 0x0a, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x24,
+	0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x41, 0x50, 0x49, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x41, 0x50, 0x49, 0x56, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6c, 0x69, 0x41, 0x50, 0x49, 0x4d, 0x69,
+	0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10,
+	0x63, 0x6c, 0x69, 0x41, 0x50, 0x49, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+	0x12, 0x32, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x41, 0x50,
+	0x49, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14,
+	0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x41, 0x50, 0x49, 0x56, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c,
+	0x65, 0x72, 0x41, 0x50, 0x49, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18,
+	0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65,
+	0x72, 0x41, 0x50, 0x49, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2c,
+	0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73,
+	0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, 0x46,
+	0x6f, 0x72, 0x6d, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x14,
+	0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x64, 0x61, 0x74, 0x61,
+	0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+	0x22, 0x48, 0x0a, 0x15, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69,
+	0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2f, 0x0a, 0x07, 0x76, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x74, 0x79,
+	0x70, 0x65, 0x73, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75,
+	0x74, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xdb, 0x01, 0x0a, 0x07, 0x4d,
+	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x68,
+	0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e,
+	0x72, 0x65, 0x61, 0x64, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x12, 0x28,
+	0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75,
+	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x68,
+	0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64,
+	0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x72,
+	0x65, 0x61, 0x64, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x77, 0x72,
+	0x69, 0x74, 0x65, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x1a,
+	0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x49, 0x4f, 0x50, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x49, 0x4f, 0x50, 0x53, 0x12, 0x1c, 0x0a, 0x09, 0x77, 0x72,
+	0x69, 0x74, 0x65, 0x49, 0x4f, 0x50, 0x53, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x77,
+	0x72, 0x69, 0x74, 0x65, 0x49, 0x4f, 0x50, 0x53, 0x22, 0x3c, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x72,
+	0x69, 0x63, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x07, 0x6d,
+	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x07, 0x6d,
+	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2a, 0x26, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x06, 0x0a, 0x02, 0x57, 0x4f, 0x10, 0x00, 0x12, 0x06, 0x0a,
+	0x02, 0x52, 0x57, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x52, 0x52, 0x10, 0x02, 0x32, 0xfc,
+	0x0b, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x65,
+	0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x70, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0b, 0x56, 0x6f, 0x6c,
+	0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1a, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65,
+	0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f,
+	0x6c, 0x75, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x68,
+	0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e,
+	0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x4c,
+	0x0a, 0x0e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
+	0x12, 0x1d, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65,
+	0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x1b, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53,
+	0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3b, 0x0a, 0x0c,
+	0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x12, 0x1b, 0x2e, 0x70,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x76, 0x65,
+	0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x56, 0x6f, 0x6c,
+	0x75, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x12, 0x1b, 0x2e, 0x70, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65,
+	0x46, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x22, 0x2e,
+	0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x46, 0x72, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d,
+	0x65, 0x12, 0x40, 0x0a, 0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x46, 0x72, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x64, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
+	0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c,
+	0x75, 0x6d, 0x65, 0x12, 0x67, 0x0a, 0x22, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x55, 0x6e, 0x6d,
+	0x61, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x53, 0x6e, 0x61, 0x70, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52,
+	0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x53, 0x65, 0x74, 0x12, 0x31, 0x2e, 0x70, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x55, 0x6e, 0x6d, 0x61, 0x70, 0x4d, 0x61,
+	0x72, 0x6b, 0x53, 0x6e, 0x61, 0x70, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76,
+	0x65, 0x64, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x55, 0x0a, 0x19,
+	0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61,
+	0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x70, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c,
+	0x75, 0x6d, 0x65, 0x12, 0x53, 0x0a, 0x18, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x12,
+	0x27, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53,
+	0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x65,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65,
+	0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a,
+	0x18, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3f, 0x0a, 0x0a, 0x52, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73,
+	0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a,
+	0x19, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c,
+	0x6c, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x5c, 0x0a, 0x17, 0x43, 0x6f,
+	0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x26, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43,
+	0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e,
+	0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65,
+	0x72, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x3f, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x70, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
+	0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x45, 0x0a, 0x0d, 0x52, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x70, 0x74, 0x79,
+	0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x52, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x1a, 0x19, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43,
+	0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x12, 0x53, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x50, 0x72, 0x65, 0x70, 0x61,
+	0x72, 0x65, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x16, 0x2e, 0x70, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
+	0x73, 0x1a, 0x22, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x49, 0x0a, 0x14, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x16, 0x2e,
+	0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64,
+	0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43,
+	0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x12, 0x41, 0x0a, 0x0b, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x12,
+	0x1a, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
+	0x70, 0x74, 0x79, 0x12, 0x49, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65,
+	0x74, 0x61, 0x69, 0x6c, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a,
+	0x1d, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+	0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3d,
+	0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
+	0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x65,
+	0x74, 0x72, 0x69, 0x63, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x33, 0x5a,
+	0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6f, 0x6e, 0x67,
+	0x68, 0x6f, 0x72, 0x6e, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67,
+	0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x72,
+	0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_ptypes_controller_proto_rawDescOnce sync.Once
+	file_ptypes_controller_proto_rawDescData = file_ptypes_controller_proto_rawDesc
+)
+
+func file_ptypes_controller_proto_rawDescGZIP() []byte {
+	file_ptypes_controller_proto_rawDescOnce.Do(func() {
+		file_ptypes_controller_proto_rawDescData = protoimpl.X.CompressGZIP(file_ptypes_controller_proto_rawDescData)
+	})
+	return file_ptypes_controller_proto_rawDescData
+}
+
+var file_ptypes_controller_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_ptypes_controller_proto_msgTypes = make([]protoimpl.MessageInfo, 23)
+var file_ptypes_controller_proto_goTypes = []interface{}{
+	(ReplicaMode)(0),                                  // 0: ptypes.ReplicaMode
+	(*Volume)(nil),                                    // 1: ptypes.Volume
+	(*ReplicaAddress)(nil),                            // 2: ptypes.ReplicaAddress
+	(*ControllerReplica)(nil),                         // 3: ptypes.ControllerReplica
+	(*VolumeStartRequest)(nil),                        // 4: ptypes.VolumeStartRequest
+	(*VolumeSnapshotRequest)(nil),                     // 5: ptypes.VolumeSnapshotRequest
+	(*VolumeSnapshotReply)(nil),                       // 6: ptypes.VolumeSnapshotReply
+	(*VolumeRevertRequest)(nil),                       // 7: ptypes.VolumeRevertRequest
+	(*VolumeExpandRequest)(nil),                       // 8: ptypes.VolumeExpandRequest
+	(*VolumeFrontendStartRequest)(nil),                // 9: ptypes.VolumeFrontendStartRequest
+	(*VolumeUnmapMarkSnapChainRemovedSetRequest)(nil), // 10: ptypes.VolumeUnmapMarkSnapChainRemovedSetRequest
+	(*VolumeSnapshotMaxCountSetRequest)(nil),          // 11: ptypes.VolumeSnapshotMaxCountSetRequest
+	(*VolumeSnapshotMaxSizeSetRequest)(nil),           // 12: ptypes.VolumeSnapshotMaxSizeSetRequest
+	(*VolumePrepareRestoreRequest)(nil),               // 13: ptypes.VolumePrepareRestoreRequest
+	(*VolumeFinishRestoreRequest)(nil),                // 14: ptypes.VolumeFinishRestoreRequest
+	(*ReplicaListReply)(nil),                          // 15: ptypes.ReplicaListReply
+	(*ControllerReplicaCreateRequest)(nil),            // 16: ptypes.ControllerReplicaCreateRequest
+	(*ReplicaPrepareRebuildReply)(nil),                // 17: ptypes.ReplicaPrepareRebuildReply
+	(*JournalListRequest)(nil),                        // 18: ptypes.JournalListRequest
+	(*VersionOutput)(nil),                             // 19: ptypes.VersionOutput
+	(*VersionDetailGetReply)(nil),                     // 20: ptypes.VersionDetailGetReply
+	(*Metrics)(nil),                                   // 21: ptypes.Metrics
+	(*MetricsGetReply)(nil),                           // 22: ptypes.MetricsGetReply
+	nil,                                               // 23: ptypes.VolumeSnapshotRequest.LabelsEntry
+	(*SyncFileInfo)(nil),                              // 24: ptypes.SyncFileInfo
+	(*emptypb.Empty)(nil),                             // 25: google.protobuf.Empty
+}
+var file_ptypes_controller_proto_depIdxs = []int32{
+	2,  // 0: ptypes.ControllerReplica.address:type_name -> ptypes.ReplicaAddress
+	0,  // 1: ptypes.ControllerReplica.mode:type_name -> ptypes.ReplicaMode
+	23, // 2: ptypes.VolumeSnapshotRequest.labels:type_name -> ptypes.VolumeSnapshotRequest.LabelsEntry
+	3,  // 3: ptypes.ReplicaListReply.replicas:type_name -> ptypes.ControllerReplica
+	0,  // 4: ptypes.ControllerReplicaCreateRequest.mode:type_name -> ptypes.ReplicaMode
+	3,  // 5: ptypes.ReplicaPrepareRebuildReply.replica:type_name -> ptypes.ControllerReplica
+	24, // 6: ptypes.ReplicaPrepareRebuildReply.sync_file_info_list:type_name -> ptypes.SyncFileInfo
+	19, // 7: ptypes.VersionDetailGetReply.version:type_name -> ptypes.VersionOutput
+	21, // 8: ptypes.MetricsGetReply.metrics:type_name -> ptypes.Metrics
+	25, // 9: ptypes.ControllerService.VolumeGet:input_type -> google.protobuf.Empty
+	4,  // 10: ptypes.ControllerService.VolumeStart:input_type -> ptypes.VolumeStartRequest
+	25, // 11: ptypes.ControllerService.VolumeShutdown:input_type -> google.protobuf.Empty
+	5,  // 12: ptypes.ControllerService.VolumeSnapshot:input_type -> ptypes.VolumeSnapshotRequest
+	7,  // 13: ptypes.ControllerService.VolumeRevert:input_type -> ptypes.VolumeRevertRequest
+	8,  // 14: ptypes.ControllerService.VolumeExpand:input_type -> ptypes.VolumeExpandRequest
+	9,  // 15: ptypes.ControllerService.VolumeFrontendStart:input_type -> ptypes.VolumeFrontendStartRequest
+	25, // 16: ptypes.ControllerService.VolumeFrontendShutdown:input_type -> google.protobuf.Empty
+	10, // 17: ptypes.ControllerService.VolumeUnmapMarkSnapChainRemovedSet:input_type -> ptypes.VolumeUnmapMarkSnapChainRemovedSetRequest
+	11, // 18: ptypes.ControllerService.VolumeSnapshotMaxCountSet:input_type -> ptypes.VolumeSnapshotMaxCountSetRequest
+	12, // 19: ptypes.ControllerService.VolumeSnapshotMaxSizeSet:input_type -> ptypes.VolumeSnapshotMaxSizeSetRequest
+	25, // 20: ptypes.ControllerService.ReplicaList:input_type -> google.protobuf.Empty
+	2,  // 21: ptypes.ControllerService.ReplicaGet:input_type -> ptypes.ReplicaAddress
+	16, // 22: ptypes.ControllerService.ControllerReplicaCreate:input_type -> ptypes.ControllerReplicaCreateRequest
+	2,  // 23: ptypes.ControllerService.ReplicaDelete:input_type -> ptypes.ReplicaAddress
+	3,  // 24: ptypes.ControllerService.ReplicaUpdate:input_type -> ptypes.ControllerReplica
+	2,  // 25: ptypes.ControllerService.ReplicaPrepareRebuild:input_type -> ptypes.ReplicaAddress
+	2,  // 26: ptypes.ControllerService.ReplicaVerifyRebuild:input_type -> ptypes.ReplicaAddress
+	18, // 27: ptypes.ControllerService.JournalList:input_type -> ptypes.JournalListRequest
+	25, // 28: ptypes.ControllerService.VersionDetailGet:input_type -> google.protobuf.Empty
+	25, // 29: ptypes.ControllerService.MetricsGet:input_type -> google.protobuf.Empty
+	1,  // 30: ptypes.ControllerService.VolumeGet:output_type -> ptypes.Volume
+	1,  // 31: ptypes.ControllerService.VolumeStart:output_type -> ptypes.Volume
+	1,  // 32: ptypes.ControllerService.VolumeShutdown:output_type -> ptypes.Volume
+	6,  // 33: ptypes.ControllerService.VolumeSnapshot:output_type -> ptypes.VolumeSnapshotReply
+	1,  // 34: ptypes.ControllerService.VolumeRevert:output_type -> ptypes.Volume
+	1,  // 35: ptypes.ControllerService.VolumeExpand:output_type -> ptypes.Volume
+	1,  // 36: ptypes.ControllerService.VolumeFrontendStart:output_type -> ptypes.Volume
+	1,  // 37: ptypes.ControllerService.VolumeFrontendShutdown:output_type -> ptypes.Volume
+	1,  // 38: ptypes.ControllerService.VolumeUnmapMarkSnapChainRemovedSet:output_type -> ptypes.Volume
+	1,  // 39: ptypes.ControllerService.VolumeSnapshotMaxCountSet:output_type -> ptypes.Volume
+	1,  // 40: ptypes.ControllerService.VolumeSnapshotMaxSizeSet:output_type -> ptypes.Volume
+	15, // 41: ptypes.ControllerService.ReplicaList:output_type -> ptypes.ReplicaListReply
+	3,  // 42: ptypes.ControllerService.ReplicaGet:output_type -> ptypes.ControllerReplica
+	3,  // 43: ptypes.ControllerService.ControllerReplicaCreate:output_type -> ptypes.ControllerReplica
+	25, // 44: ptypes.ControllerService.ReplicaDelete:output_type -> google.protobuf.Empty
+	3,  // 45: ptypes.ControllerService.ReplicaUpdate:output_type -> ptypes.ControllerReplica
+	17, // 46: ptypes.ControllerService.ReplicaPrepareRebuild:output_type -> ptypes.ReplicaPrepareRebuildReply
+	3,  // 47: ptypes.ControllerService.ReplicaVerifyRebuild:output_type -> ptypes.ControllerReplica
+	25, // 48: ptypes.ControllerService.JournalList:output_type -> google.protobuf.Empty
+	20, // 49: ptypes.ControllerService.VersionDetailGet:output_type -> ptypes.VersionDetailGetReply
+	22, // 50: ptypes.ControllerService.MetricsGet:output_type -> ptypes.MetricsGetReply
+	30, // [30:51] is the sub-list for method output_type
+	9,  // [9:30] is the sub-list for method input_type
+	9,  // [9:9] is the sub-list for extension type_name
+	9,  // [9:9] is the sub-list for extension extendee
+	0,  // [0:9] is the sub-list for field type_name
+}
+
+func init() { file_ptypes_controller_proto_init() }
+func file_ptypes_controller_proto_init() {
+	if File_ptypes_controller_proto != nil {
+		return
+	}
+	file_ptypes_common_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_ptypes_controller_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Volume); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaAddress); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ControllerReplica); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VolumeStartRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VolumeSnapshotRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VolumeSnapshotReply); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VolumeRevertRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VolumeExpandRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VolumeFrontendStartRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VolumeUnmapMarkSnapChainRemovedSetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VolumeSnapshotMaxCountSetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VolumeSnapshotMaxSizeSetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VolumePrepareRestoreRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VolumeFinishRestoreRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaListReply); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ControllerReplicaCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaPrepareRebuildReply); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*JournalListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VersionOutput); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VersionDetailGetReply); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Metrics); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_controller_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MetricsGetReply); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_ptypes_controller_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   23,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_ptypes_controller_proto_goTypes,
+		DependencyIndexes: file_ptypes_controller_proto_depIdxs,
+		EnumInfos:         file_ptypes_controller_proto_enumTypes,
+		MessageInfos:      file_ptypes_controller_proto_msgTypes,
+	}.Build()
+	File_ptypes_controller_proto = out.File
+	file_ptypes_controller_proto_rawDesc = nil
+	file_ptypes_controller_proto_goTypes = nil
+	file_ptypes_controller_proto_depIdxs = nil
+}
diff --git a/pkg/generated/enginerpc/controller_grpc.pb.go b/pkg/generated/enginerpc/controller_grpc.pb.go
new file mode 100644
index 0000000..69b4f62
--- /dev/null
+++ b/pkg/generated/enginerpc/controller_grpc.pb.go
@@ -0,0 +1,850 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v4.24.3
+// source: ptypes/controller.proto
+
+package enginerpc
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+	ControllerService_VolumeGet_FullMethodName                          = "/ptypes.ControllerService/VolumeGet"
+	ControllerService_VolumeStart_FullMethodName                        = "/ptypes.ControllerService/VolumeStart"
+	ControllerService_VolumeShutdown_FullMethodName                     = "/ptypes.ControllerService/VolumeShutdown"
+	ControllerService_VolumeSnapshot_FullMethodName                     = "/ptypes.ControllerService/VolumeSnapshot"
+	ControllerService_VolumeRevert_FullMethodName                       = "/ptypes.ControllerService/VolumeRevert"
+	ControllerService_VolumeExpand_FullMethodName                       = "/ptypes.ControllerService/VolumeExpand"
+	ControllerService_VolumeFrontendStart_FullMethodName                = "/ptypes.ControllerService/VolumeFrontendStart"
+	ControllerService_VolumeFrontendShutdown_FullMethodName             = "/ptypes.ControllerService/VolumeFrontendShutdown"
+	ControllerService_VolumeUnmapMarkSnapChainRemovedSet_FullMethodName = "/ptypes.ControllerService/VolumeUnmapMarkSnapChainRemovedSet"
+	ControllerService_VolumeSnapshotMaxCountSet_FullMethodName          = "/ptypes.ControllerService/VolumeSnapshotMaxCountSet"
+	ControllerService_VolumeSnapshotMaxSizeSet_FullMethodName           = "/ptypes.ControllerService/VolumeSnapshotMaxSizeSet"
+	ControllerService_ReplicaList_FullMethodName                        = "/ptypes.ControllerService/ReplicaList"
+	ControllerService_ReplicaGet_FullMethodName                         = "/ptypes.ControllerService/ReplicaGet"
+	ControllerService_ControllerReplicaCreate_FullMethodName            = "/ptypes.ControllerService/ControllerReplicaCreate"
+	ControllerService_ReplicaDelete_FullMethodName                      = "/ptypes.ControllerService/ReplicaDelete"
+	ControllerService_ReplicaUpdate_FullMethodName                      = "/ptypes.ControllerService/ReplicaUpdate"
+	ControllerService_ReplicaPrepareRebuild_FullMethodName              = "/ptypes.ControllerService/ReplicaPrepareRebuild"
+	ControllerService_ReplicaVerifyRebuild_FullMethodName               = "/ptypes.ControllerService/ReplicaVerifyRebuild"
+	ControllerService_JournalList_FullMethodName                        = "/ptypes.ControllerService/JournalList"
+	ControllerService_VersionDetailGet_FullMethodName                   = "/ptypes.ControllerService/VersionDetailGet"
+	ControllerService_MetricsGet_FullMethodName                         = "/ptypes.ControllerService/MetricsGet"
+)
+
+// ControllerServiceClient is the client API for ControllerService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type ControllerServiceClient interface {
+	VolumeGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*Volume, error)
+	VolumeStart(ctx context.Context, in *VolumeStartRequest, opts ...grpc.CallOption) (*Volume, error)
+	VolumeShutdown(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*Volume, error)
+	VolumeSnapshot(ctx context.Context, in *VolumeSnapshotRequest, opts ...grpc.CallOption) (*VolumeSnapshotReply, error)
+	VolumeRevert(ctx context.Context, in *VolumeRevertRequest, opts ...grpc.CallOption) (*Volume, error)
+	VolumeExpand(ctx context.Context, in *VolumeExpandRequest, opts ...grpc.CallOption) (*Volume, error)
+	VolumeFrontendStart(ctx context.Context, in *VolumeFrontendStartRequest, opts ...grpc.CallOption) (*Volume, error)
+	VolumeFrontendShutdown(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*Volume, error)
+	VolumeUnmapMarkSnapChainRemovedSet(ctx context.Context, in *VolumeUnmapMarkSnapChainRemovedSetRequest, opts ...grpc.CallOption) (*Volume, error)
+	VolumeSnapshotMaxCountSet(ctx context.Context, in *VolumeSnapshotMaxCountSetRequest, opts ...grpc.CallOption) (*Volume, error)
+	VolumeSnapshotMaxSizeSet(ctx context.Context, in *VolumeSnapshotMaxSizeSetRequest, opts ...grpc.CallOption) (*Volume, error)
+	ReplicaList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ReplicaListReply, error)
+	ReplicaGet(ctx context.Context, in *ReplicaAddress, opts ...grpc.CallOption) (*ControllerReplica, error)
+	ControllerReplicaCreate(ctx context.Context, in *ControllerReplicaCreateRequest, opts ...grpc.CallOption) (*ControllerReplica, error)
+	ReplicaDelete(ctx context.Context, in *ReplicaAddress, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaUpdate(ctx context.Context, in *ControllerReplica, opts ...grpc.CallOption) (*ControllerReplica, error)
+	ReplicaPrepareRebuild(ctx context.Context, in *ReplicaAddress, opts ...grpc.CallOption) (*ReplicaPrepareRebuildReply, error)
+	ReplicaVerifyRebuild(ctx context.Context, in *ReplicaAddress, opts ...grpc.CallOption) (*ControllerReplica, error)
+	JournalList(ctx context.Context, in *JournalListRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	VersionDetailGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionDetailGetReply, error)
+	MetricsGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*MetricsGetReply, error)
+}
+
+type controllerServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewControllerServiceClient(cc grpc.ClientConnInterface) ControllerServiceClient {
+	return &controllerServiceClient{cc}
+}
+
+func (c *controllerServiceClient) VolumeGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*Volume, error) {
+	out := new(Volume)
+	err := c.cc.Invoke(ctx, ControllerService_VolumeGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) VolumeStart(ctx context.Context, in *VolumeStartRequest, opts ...grpc.CallOption) (*Volume, error) {
+	out := new(Volume)
+	err := c.cc.Invoke(ctx, ControllerService_VolumeStart_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) VolumeShutdown(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*Volume, error) {
+	out := new(Volume)
+	err := c.cc.Invoke(ctx, ControllerService_VolumeShutdown_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) VolumeSnapshot(ctx context.Context, in *VolumeSnapshotRequest, opts ...grpc.CallOption) (*VolumeSnapshotReply, error) {
+	out := new(VolumeSnapshotReply)
+	err := c.cc.Invoke(ctx, ControllerService_VolumeSnapshot_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) VolumeRevert(ctx context.Context, in *VolumeRevertRequest, opts ...grpc.CallOption) (*Volume, error) {
+	out := new(Volume)
+	err := c.cc.Invoke(ctx, ControllerService_VolumeRevert_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) VolumeExpand(ctx context.Context, in *VolumeExpandRequest, opts ...grpc.CallOption) (*Volume, error) {
+	out := new(Volume)
+	err := c.cc.Invoke(ctx, ControllerService_VolumeExpand_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) VolumeFrontendStart(ctx context.Context, in *VolumeFrontendStartRequest, opts ...grpc.CallOption) (*Volume, error) {
+	out := new(Volume)
+	err := c.cc.Invoke(ctx, ControllerService_VolumeFrontendStart_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) VolumeFrontendShutdown(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*Volume, error) {
+	out := new(Volume)
+	err := c.cc.Invoke(ctx, ControllerService_VolumeFrontendShutdown_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) VolumeUnmapMarkSnapChainRemovedSet(ctx context.Context, in *VolumeUnmapMarkSnapChainRemovedSetRequest, opts ...grpc.CallOption) (*Volume, error) {
+	out := new(Volume)
+	err := c.cc.Invoke(ctx, ControllerService_VolumeUnmapMarkSnapChainRemovedSet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) VolumeSnapshotMaxCountSet(ctx context.Context, in *VolumeSnapshotMaxCountSetRequest, opts ...grpc.CallOption) (*Volume, error) {
+	out := new(Volume)
+	err := c.cc.Invoke(ctx, ControllerService_VolumeSnapshotMaxCountSet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) VolumeSnapshotMaxSizeSet(ctx context.Context, in *VolumeSnapshotMaxSizeSetRequest, opts ...grpc.CallOption) (*Volume, error) {
+	out := new(Volume)
+	err := c.cc.Invoke(ctx, ControllerService_VolumeSnapshotMaxSizeSet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) ReplicaList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ReplicaListReply, error) {
+	out := new(ReplicaListReply)
+	err := c.cc.Invoke(ctx, ControllerService_ReplicaList_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) ReplicaGet(ctx context.Context, in *ReplicaAddress, opts ...grpc.CallOption) (*ControllerReplica, error) {
+	out := new(ControllerReplica)
+	err := c.cc.Invoke(ctx, ControllerService_ReplicaGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) ControllerReplicaCreate(ctx context.Context, in *ControllerReplicaCreateRequest, opts ...grpc.CallOption) (*ControllerReplica, error) {
+	out := new(ControllerReplica)
+	err := c.cc.Invoke(ctx, ControllerService_ControllerReplicaCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) ReplicaDelete(ctx context.Context, in *ReplicaAddress, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ControllerService_ReplicaDelete_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) ReplicaUpdate(ctx context.Context, in *ControllerReplica, opts ...grpc.CallOption) (*ControllerReplica, error) {
+	out := new(ControllerReplica)
+	err := c.cc.Invoke(ctx, ControllerService_ReplicaUpdate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) ReplicaPrepareRebuild(ctx context.Context, in *ReplicaAddress, opts ...grpc.CallOption) (*ReplicaPrepareRebuildReply, error) {
+	out := new(ReplicaPrepareRebuildReply)
+	err := c.cc.Invoke(ctx, ControllerService_ReplicaPrepareRebuild_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) ReplicaVerifyRebuild(ctx context.Context, in *ReplicaAddress, opts ...grpc.CallOption) (*ControllerReplica, error) {
+	out := new(ControllerReplica)
+	err := c.cc.Invoke(ctx, ControllerService_ReplicaVerifyRebuild_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) JournalList(ctx context.Context, in *JournalListRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ControllerService_JournalList_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) VersionDetailGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionDetailGetReply, error) {
+	out := new(VersionDetailGetReply)
+	err := c.cc.Invoke(ctx, ControllerService_VersionDetailGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *controllerServiceClient) MetricsGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*MetricsGetReply, error) {
+	out := new(MetricsGetReply)
+	err := c.cc.Invoke(ctx, ControllerService_MetricsGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ControllerServiceServer is the server API for ControllerService service.
+// All implementations must embed UnimplementedControllerServiceServer
+// for forward compatibility
+type ControllerServiceServer interface {
+	VolumeGet(context.Context, *emptypb.Empty) (*Volume, error)
+	VolumeStart(context.Context, *VolumeStartRequest) (*Volume, error)
+	VolumeShutdown(context.Context, *emptypb.Empty) (*Volume, error)
+	VolumeSnapshot(context.Context, *VolumeSnapshotRequest) (*VolumeSnapshotReply, error)
+	VolumeRevert(context.Context, *VolumeRevertRequest) (*Volume, error)
+	VolumeExpand(context.Context, *VolumeExpandRequest) (*Volume, error)
+	VolumeFrontendStart(context.Context, *VolumeFrontendStartRequest) (*Volume, error)
+	VolumeFrontendShutdown(context.Context, *emptypb.Empty) (*Volume, error)
+	VolumeUnmapMarkSnapChainRemovedSet(context.Context, *VolumeUnmapMarkSnapChainRemovedSetRequest) (*Volume, error)
+	VolumeSnapshotMaxCountSet(context.Context, *VolumeSnapshotMaxCountSetRequest) (*Volume, error)
+	VolumeSnapshotMaxSizeSet(context.Context, *VolumeSnapshotMaxSizeSetRequest) (*Volume, error)
+	ReplicaList(context.Context, *emptypb.Empty) (*ReplicaListReply, error)
+	ReplicaGet(context.Context, *ReplicaAddress) (*ControllerReplica, error)
+	ControllerReplicaCreate(context.Context, *ControllerReplicaCreateRequest) (*ControllerReplica, error)
+	ReplicaDelete(context.Context, *ReplicaAddress) (*emptypb.Empty, error)
+	ReplicaUpdate(context.Context, *ControllerReplica) (*ControllerReplica, error)
+	ReplicaPrepareRebuild(context.Context, *ReplicaAddress) (*ReplicaPrepareRebuildReply, error)
+	ReplicaVerifyRebuild(context.Context, *ReplicaAddress) (*ControllerReplica, error)
+	JournalList(context.Context, *JournalListRequest) (*emptypb.Empty, error)
+	VersionDetailGet(context.Context, *emptypb.Empty) (*VersionDetailGetReply, error)
+	MetricsGet(context.Context, *emptypb.Empty) (*MetricsGetReply, error)
+	mustEmbedUnimplementedControllerServiceServer()
+}
+
+// UnimplementedControllerServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedControllerServiceServer struct {
+}
+
+func (UnimplementedControllerServiceServer) VolumeGet(context.Context, *emptypb.Empty) (*Volume, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeGet not implemented")
+}
+func (UnimplementedControllerServiceServer) VolumeStart(context.Context, *VolumeStartRequest) (*Volume, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeStart not implemented")
+}
+func (UnimplementedControllerServiceServer) VolumeShutdown(context.Context, *emptypb.Empty) (*Volume, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeShutdown not implemented")
+}
+func (UnimplementedControllerServiceServer) VolumeSnapshot(context.Context, *VolumeSnapshotRequest) (*VolumeSnapshotReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeSnapshot not implemented")
+}
+func (UnimplementedControllerServiceServer) VolumeRevert(context.Context, *VolumeRevertRequest) (*Volume, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeRevert not implemented")
+}
+func (UnimplementedControllerServiceServer) VolumeExpand(context.Context, *VolumeExpandRequest) (*Volume, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeExpand not implemented")
+}
+func (UnimplementedControllerServiceServer) VolumeFrontendStart(context.Context, *VolumeFrontendStartRequest) (*Volume, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeFrontendStart not implemented")
+}
+func (UnimplementedControllerServiceServer) VolumeFrontendShutdown(context.Context, *emptypb.Empty) (*Volume, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeFrontendShutdown not implemented")
+}
+func (UnimplementedControllerServiceServer) VolumeUnmapMarkSnapChainRemovedSet(context.Context, *VolumeUnmapMarkSnapChainRemovedSetRequest) (*Volume, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeUnmapMarkSnapChainRemovedSet not implemented")
+}
+func (UnimplementedControllerServiceServer) VolumeSnapshotMaxCountSet(context.Context, *VolumeSnapshotMaxCountSetRequest) (*Volume, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeSnapshotMaxCountSet not implemented")
+}
+func (UnimplementedControllerServiceServer) VolumeSnapshotMaxSizeSet(context.Context, *VolumeSnapshotMaxSizeSetRequest) (*Volume, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeSnapshotMaxSizeSet not implemented")
+}
+func (UnimplementedControllerServiceServer) ReplicaList(context.Context, *emptypb.Empty) (*ReplicaListReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaList not implemented")
+}
+func (UnimplementedControllerServiceServer) ReplicaGet(context.Context, *ReplicaAddress) (*ControllerReplica, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaGet not implemented")
+}
+func (UnimplementedControllerServiceServer) ControllerReplicaCreate(context.Context, *ControllerReplicaCreateRequest) (*ControllerReplica, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ControllerReplicaCreate not implemented")
+}
+func (UnimplementedControllerServiceServer) ReplicaDelete(context.Context, *ReplicaAddress) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaDelete not implemented")
+}
+func (UnimplementedControllerServiceServer) ReplicaUpdate(context.Context, *ControllerReplica) (*ControllerReplica, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaUpdate not implemented")
+}
+func (UnimplementedControllerServiceServer) ReplicaPrepareRebuild(context.Context, *ReplicaAddress) (*ReplicaPrepareRebuildReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaPrepareRebuild not implemented")
+}
+func (UnimplementedControllerServiceServer) ReplicaVerifyRebuild(context.Context, *ReplicaAddress) (*ControllerReplica, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaVerifyRebuild not implemented")
+}
+func (UnimplementedControllerServiceServer) JournalList(context.Context, *JournalListRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method JournalList not implemented")
+}
+func (UnimplementedControllerServiceServer) VersionDetailGet(context.Context, *emptypb.Empty) (*VersionDetailGetReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VersionDetailGet not implemented")
+}
+func (UnimplementedControllerServiceServer) MetricsGet(context.Context, *emptypb.Empty) (*MetricsGetReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MetricsGet not implemented")
+}
+func (UnimplementedControllerServiceServer) mustEmbedUnimplementedControllerServiceServer() {}
+
+// UnsafeControllerServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to ControllerServiceServer will
+// result in compilation errors.
+type UnsafeControllerServiceServer interface {
+	mustEmbedUnimplementedControllerServiceServer()
+}
+
+func RegisterControllerServiceServer(s grpc.ServiceRegistrar, srv ControllerServiceServer) {
+	s.RegisterService(&ControllerService_ServiceDesc, srv)
+}
+
+func _ControllerService_VolumeGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).VolumeGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_VolumeGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).VolumeGet(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_VolumeStart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(VolumeStartRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).VolumeStart(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_VolumeStart_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).VolumeStart(ctx, req.(*VolumeStartRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_VolumeShutdown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).VolumeShutdown(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_VolumeShutdown_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).VolumeShutdown(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_VolumeSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(VolumeSnapshotRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).VolumeSnapshot(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_VolumeSnapshot_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).VolumeSnapshot(ctx, req.(*VolumeSnapshotRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_VolumeRevert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(VolumeRevertRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).VolumeRevert(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_VolumeRevert_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).VolumeRevert(ctx, req.(*VolumeRevertRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_VolumeExpand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(VolumeExpandRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).VolumeExpand(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_VolumeExpand_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).VolumeExpand(ctx, req.(*VolumeExpandRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_VolumeFrontendStart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(VolumeFrontendStartRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).VolumeFrontendStart(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_VolumeFrontendStart_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).VolumeFrontendStart(ctx, req.(*VolumeFrontendStartRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_VolumeFrontendShutdown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).VolumeFrontendShutdown(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_VolumeFrontendShutdown_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).VolumeFrontendShutdown(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_VolumeUnmapMarkSnapChainRemovedSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(VolumeUnmapMarkSnapChainRemovedSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).VolumeUnmapMarkSnapChainRemovedSet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_VolumeUnmapMarkSnapChainRemovedSet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).VolumeUnmapMarkSnapChainRemovedSet(ctx, req.(*VolumeUnmapMarkSnapChainRemovedSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_VolumeSnapshotMaxCountSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(VolumeSnapshotMaxCountSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).VolumeSnapshotMaxCountSet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_VolumeSnapshotMaxCountSet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).VolumeSnapshotMaxCountSet(ctx, req.(*VolumeSnapshotMaxCountSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_VolumeSnapshotMaxSizeSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(VolumeSnapshotMaxSizeSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).VolumeSnapshotMaxSizeSet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_VolumeSnapshotMaxSizeSet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).VolumeSnapshotMaxSizeSet(ctx, req.(*VolumeSnapshotMaxSizeSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_ReplicaList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).ReplicaList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_ReplicaList_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).ReplicaList(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_ReplicaGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaAddress)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).ReplicaGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_ReplicaGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).ReplicaGet(ctx, req.(*ReplicaAddress))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_ControllerReplicaCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ControllerReplicaCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).ControllerReplicaCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_ControllerReplicaCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).ControllerReplicaCreate(ctx, req.(*ControllerReplicaCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_ReplicaDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaAddress)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).ReplicaDelete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_ReplicaDelete_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).ReplicaDelete(ctx, req.(*ReplicaAddress))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_ReplicaUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ControllerReplica)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).ReplicaUpdate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_ReplicaUpdate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).ReplicaUpdate(ctx, req.(*ControllerReplica))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_ReplicaPrepareRebuild_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaAddress)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).ReplicaPrepareRebuild(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_ReplicaPrepareRebuild_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).ReplicaPrepareRebuild(ctx, req.(*ReplicaAddress))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_ReplicaVerifyRebuild_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaAddress)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).ReplicaVerifyRebuild(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_ReplicaVerifyRebuild_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).ReplicaVerifyRebuild(ctx, req.(*ReplicaAddress))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_JournalList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(JournalListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).JournalList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_JournalList_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).JournalList(ctx, req.(*JournalListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_VersionDetailGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).VersionDetailGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_VersionDetailGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).VersionDetailGet(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ControllerService_MetricsGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ControllerServiceServer).MetricsGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ControllerService_MetricsGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ControllerServiceServer).MetricsGet(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// ControllerService_ServiceDesc is the grpc.ServiceDesc for ControllerService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var ControllerService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "ptypes.ControllerService",
+	HandlerType: (*ControllerServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "VolumeGet",
+			Handler:    _ControllerService_VolumeGet_Handler,
+		},
+		{
+			MethodName: "VolumeStart",
+			Handler:    _ControllerService_VolumeStart_Handler,
+		},
+		{
+			MethodName: "VolumeShutdown",
+			Handler:    _ControllerService_VolumeShutdown_Handler,
+		},
+		{
+			MethodName: "VolumeSnapshot",
+			Handler:    _ControllerService_VolumeSnapshot_Handler,
+		},
+		{
+			MethodName: "VolumeRevert",
+			Handler:    _ControllerService_VolumeRevert_Handler,
+		},
+		{
+			MethodName: "VolumeExpand",
+			Handler:    _ControllerService_VolumeExpand_Handler,
+		},
+		{
+			MethodName: "VolumeFrontendStart",
+			Handler:    _ControllerService_VolumeFrontendStart_Handler,
+		},
+		{
+			MethodName: "VolumeFrontendShutdown",
+			Handler:    _ControllerService_VolumeFrontendShutdown_Handler,
+		},
+		{
+			MethodName: "VolumeUnmapMarkSnapChainRemovedSet",
+			Handler:    _ControllerService_VolumeUnmapMarkSnapChainRemovedSet_Handler,
+		},
+		{
+			MethodName: "VolumeSnapshotMaxCountSet",
+			Handler:    _ControllerService_VolumeSnapshotMaxCountSet_Handler,
+		},
+		{
+			MethodName: "VolumeSnapshotMaxSizeSet",
+			Handler:    _ControllerService_VolumeSnapshotMaxSizeSet_Handler,
+		},
+		{
+			MethodName: "ReplicaList",
+			Handler:    _ControllerService_ReplicaList_Handler,
+		},
+		{
+			MethodName: "ReplicaGet",
+			Handler:    _ControllerService_ReplicaGet_Handler,
+		},
+		{
+			MethodName: "ControllerReplicaCreate",
+			Handler:    _ControllerService_ControllerReplicaCreate_Handler,
+		},
+		{
+			MethodName: "ReplicaDelete",
+			Handler:    _ControllerService_ReplicaDelete_Handler,
+		},
+		{
+			MethodName: "ReplicaUpdate",
+			Handler:    _ControllerService_ReplicaUpdate_Handler,
+		},
+		{
+			MethodName: "ReplicaPrepareRebuild",
+			Handler:    _ControllerService_ReplicaPrepareRebuild_Handler,
+		},
+		{
+			MethodName: "ReplicaVerifyRebuild",
+			Handler:    _ControllerService_ReplicaVerifyRebuild_Handler,
+		},
+		{
+			MethodName: "JournalList",
+			Handler:    _ControllerService_JournalList_Handler,
+		},
+		{
+			MethodName: "VersionDetailGet",
+			Handler:    _ControllerService_VersionDetailGet_Handler,
+		},
+		{
+			MethodName: "MetricsGet",
+			Handler:    _ControllerService_MetricsGet_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "ptypes/controller.proto",
+}
diff --git a/pkg/generated/enginerpc/replica.pb.go b/pkg/generated/enginerpc/replica.pb.go
new file mode 100644
index 0000000..f8fba93
--- /dev/null
+++ b/pkg/generated/enginerpc/replica.pb.go
@@ -0,0 +1,2688 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
+// source: ptypes/replica.proto
+
+package enginerpc
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type ReplicaCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Size string `protobuf:"bytes,1,opt,name=size,proto3" json:"size,omitempty"`
+}
+
+func (x *ReplicaCreateRequest) Reset() {
+	*x = ReplicaCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaCreateRequest) ProtoMessage() {}
+
+func (x *ReplicaCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaCreateRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaCreateRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *ReplicaCreateRequest) GetSize() string {
+	if x != nil {
+		return x.Size
+	}
+	return ""
+}
+
+type ReplicaCreateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *ReplicaCreateResponse) Reset() {
+	*x = ReplicaCreateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaCreateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaCreateResponse) ProtoMessage() {}
+
+func (x *ReplicaCreateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaCreateResponse.ProtoReflect.Descriptor instead.
+func (*ReplicaCreateResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *ReplicaCreateResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type ReplicaGetResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *ReplicaGetResponse) Reset() {
+	*x = ReplicaGetResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaGetResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaGetResponse) ProtoMessage() {}
+
+func (x *ReplicaGetResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaGetResponse.ProtoReflect.Descriptor instead.
+func (*ReplicaGetResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *ReplicaGetResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type ReplicaOpenResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *ReplicaOpenResponse) Reset() {
+	*x = ReplicaOpenResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaOpenResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaOpenResponse) ProtoMessage() {}
+
+func (x *ReplicaOpenResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaOpenResponse.ProtoReflect.Descriptor instead.
+func (*ReplicaOpenResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *ReplicaOpenResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type ReplicaCloseResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *ReplicaCloseResponse) Reset() {
+	*x = ReplicaCloseResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaCloseResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaCloseResponse) ProtoMessage() {}
+
+func (x *ReplicaCloseResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaCloseResponse.ProtoReflect.Descriptor instead.
+func (*ReplicaCloseResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *ReplicaCloseResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type ReplicaReloadResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *ReplicaReloadResponse) Reset() {
+	*x = ReplicaReloadResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaReloadResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaReloadResponse) ProtoMessage() {}
+
+func (x *ReplicaReloadResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaReloadResponse.ProtoReflect.Descriptor instead.
+func (*ReplicaReloadResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *ReplicaReloadResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type ReplicaRevertRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name    string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Created string `protobuf:"bytes,2,opt,name=created,proto3" json:"created,omitempty"`
+}
+
+func (x *ReplicaRevertRequest) Reset() {
+	*x = ReplicaRevertRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaRevertRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaRevertRequest) ProtoMessage() {}
+
+func (x *ReplicaRevertRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaRevertRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaRevertRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *ReplicaRevertRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *ReplicaRevertRequest) GetCreated() string {
+	if x != nil {
+		return x.Created
+	}
+	return ""
+}
+
+type ReplicaRevertResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *ReplicaRevertResponse) Reset() {
+	*x = ReplicaRevertResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaRevertResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaRevertResponse) ProtoMessage() {}
+
+func (x *ReplicaRevertResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaRevertResponse.ProtoReflect.Descriptor instead.
+func (*ReplicaRevertResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *ReplicaRevertResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type ReplicaSnapshotRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name        string            `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	UserCreated bool              `protobuf:"varint,2,opt,name=user_created,json=userCreated,proto3" json:"user_created,omitempty"`
+	Created     string            `protobuf:"bytes,3,opt,name=created,proto3" json:"created,omitempty"`
+	Labels      map[string]string `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *ReplicaSnapshotRequest) Reset() {
+	*x = ReplicaSnapshotRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaSnapshotRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaSnapshotRequest) ProtoMessage() {}
+
+func (x *ReplicaSnapshotRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaSnapshotRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaSnapshotRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *ReplicaSnapshotRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *ReplicaSnapshotRequest) GetUserCreated() bool {
+	if x != nil {
+		return x.UserCreated
+	}
+	return false
+}
+
+func (x *ReplicaSnapshotRequest) GetCreated() string {
+	if x != nil {
+		return x.Created
+	}
+	return ""
+}
+
+func (x *ReplicaSnapshotRequest) GetLabels() map[string]string {
+	if x != nil {
+		return x.Labels
+	}
+	return nil
+}
+
+type ReplicaSnapshotResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *ReplicaSnapshotResponse) Reset() {
+	*x = ReplicaSnapshotResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaSnapshotResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaSnapshotResponse) ProtoMessage() {}
+
+func (x *ReplicaSnapshotResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaSnapshotResponse.ProtoReflect.Descriptor instead.
+func (*ReplicaSnapshotResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *ReplicaSnapshotResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type ReplicaExpandRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Size int64 `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"`
+}
+
+func (x *ReplicaExpandRequest) Reset() {
+	*x = ReplicaExpandRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaExpandRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaExpandRequest) ProtoMessage() {}
+
+func (x *ReplicaExpandRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaExpandRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaExpandRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *ReplicaExpandRequest) GetSize() int64 {
+	if x != nil {
+		return x.Size
+	}
+	return 0
+}
+
+type ReplicaExpandResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *ReplicaExpandResponse) Reset() {
+	*x = ReplicaExpandResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaExpandResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaExpandResponse) ProtoMessage() {}
+
+func (x *ReplicaExpandResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaExpandResponse.ProtoReflect.Descriptor instead.
+func (*ReplicaExpandResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *ReplicaExpandResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type DiskRemoveRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name  string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Force bool   `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"`
+}
+
+func (x *DiskRemoveRequest) Reset() {
+	*x = DiskRemoveRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskRemoveRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskRemoveRequest) ProtoMessage() {}
+
+func (x *DiskRemoveRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskRemoveRequest.ProtoReflect.Descriptor instead.
+func (*DiskRemoveRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *DiskRemoveRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *DiskRemoveRequest) GetForce() bool {
+	if x != nil {
+		return x.Force
+	}
+	return false
+}
+
+type DiskRemoveResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *DiskRemoveResponse) Reset() {
+	*x = DiskRemoveResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskRemoveResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskRemoveResponse) ProtoMessage() {}
+
+func (x *DiskRemoveResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskRemoveResponse.ProtoReflect.Descriptor instead.
+func (*DiskRemoveResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *DiskRemoveResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type DiskReplaceRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Target string `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"`
+	Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"`
+}
+
+func (x *DiskReplaceRequest) Reset() {
+	*x = DiskReplaceRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskReplaceRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskReplaceRequest) ProtoMessage() {}
+
+func (x *DiskReplaceRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskReplaceRequest.ProtoReflect.Descriptor instead.
+func (*DiskReplaceRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *DiskReplaceRequest) GetTarget() string {
+	if x != nil {
+		return x.Target
+	}
+	return ""
+}
+
+func (x *DiskReplaceRequest) GetSource() string {
+	if x != nil {
+		return x.Source
+	}
+	return ""
+}
+
+type DiskReplaceResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *DiskReplaceResponse) Reset() {
+	*x = DiskReplaceResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskReplaceResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskReplaceResponse) ProtoMessage() {}
+
+func (x *DiskReplaceResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskReplaceResponse.ProtoReflect.Descriptor instead.
+func (*DiskReplaceResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *DiskReplaceResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type DiskPrepareRemoveRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *DiskPrepareRemoveRequest) Reset() {
+	*x = DiskPrepareRemoveRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskPrepareRemoveRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskPrepareRemoveRequest) ProtoMessage() {}
+
+func (x *DiskPrepareRemoveRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskPrepareRemoveRequest.ProtoReflect.Descriptor instead.
+func (*DiskPrepareRemoveRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *DiskPrepareRemoveRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type DiskPrepareRemoveResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Operations []*PrepareRemoveAction `protobuf:"bytes,1,rep,name=operations,proto3" json:"operations,omitempty"`
+}
+
+func (x *DiskPrepareRemoveResponse) Reset() {
+	*x = DiskPrepareRemoveResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskPrepareRemoveResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskPrepareRemoveResponse) ProtoMessage() {}
+
+func (x *DiskPrepareRemoveResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskPrepareRemoveResponse.ProtoReflect.Descriptor instead.
+func (*DiskPrepareRemoveResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *DiskPrepareRemoveResponse) GetOperations() []*PrepareRemoveAction {
+	if x != nil {
+		return x.Operations
+	}
+	return nil
+}
+
+type DiskMarkAsRemovedRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *DiskMarkAsRemovedRequest) Reset() {
+	*x = DiskMarkAsRemovedRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskMarkAsRemovedRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskMarkAsRemovedRequest) ProtoMessage() {}
+
+func (x *DiskMarkAsRemovedRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskMarkAsRemovedRequest.ProtoReflect.Descriptor instead.
+func (*DiskMarkAsRemovedRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *DiskMarkAsRemovedRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type DiskMarkAsRemovedResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *DiskMarkAsRemovedResponse) Reset() {
+	*x = DiskMarkAsRemovedResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskMarkAsRemovedResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskMarkAsRemovedResponse) ProtoMessage() {}
+
+func (x *DiskMarkAsRemovedResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskMarkAsRemovedResponse.ProtoReflect.Descriptor instead.
+func (*DiskMarkAsRemovedResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *DiskMarkAsRemovedResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type RebuildingSetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Rebuilding bool `protobuf:"varint,1,opt,name=rebuilding,proto3" json:"rebuilding,omitempty"`
+}
+
+func (x *RebuildingSetRequest) Reset() {
+	*x = RebuildingSetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RebuildingSetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RebuildingSetRequest) ProtoMessage() {}
+
+func (x *RebuildingSetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RebuildingSetRequest.ProtoReflect.Descriptor instead.
+func (*RebuildingSetRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *RebuildingSetRequest) GetRebuilding() bool {
+	if x != nil {
+		return x.Rebuilding
+	}
+	return false
+}
+
+type RebuildingSetResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *RebuildingSetResponse) Reset() {
+	*x = RebuildingSetResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RebuildingSetResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RebuildingSetResponse) ProtoMessage() {}
+
+func (x *RebuildingSetResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RebuildingSetResponse.ProtoReflect.Descriptor instead.
+func (*RebuildingSetResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *RebuildingSetResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type RevisionCounterSetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Counter int64 `protobuf:"varint,1,opt,name=counter,proto3" json:"counter,omitempty"`
+}
+
+func (x *RevisionCounterSetRequest) Reset() {
+	*x = RevisionCounterSetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RevisionCounterSetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RevisionCounterSetRequest) ProtoMessage() {}
+
+func (x *RevisionCounterSetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RevisionCounterSetRequest.ProtoReflect.Descriptor instead.
+func (*RevisionCounterSetRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *RevisionCounterSetRequest) GetCounter() int64 {
+	if x != nil {
+		return x.Counter
+	}
+	return 0
+}
+
+type RevisionCounterSetResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *RevisionCounterSetResponse) Reset() {
+	*x = RevisionCounterSetResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[23]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RevisionCounterSetResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RevisionCounterSetResponse) ProtoMessage() {}
+
+func (x *RevisionCounterSetResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RevisionCounterSetResponse.ProtoReflect.Descriptor instead.
+func (*RevisionCounterSetResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *RevisionCounterSetResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type UnmapMarkDiskChainRemovedSetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"`
+}
+
+func (x *UnmapMarkDiskChainRemovedSetRequest) Reset() {
+	*x = UnmapMarkDiskChainRemovedSetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[24]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UnmapMarkDiskChainRemovedSetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UnmapMarkDiskChainRemovedSetRequest) ProtoMessage() {}
+
+func (x *UnmapMarkDiskChainRemovedSetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use UnmapMarkDiskChainRemovedSetRequest.ProtoReflect.Descriptor instead.
+func (*UnmapMarkDiskChainRemovedSetRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{24}
+}
+
+func (x *UnmapMarkDiskChainRemovedSetRequest) GetEnabled() bool {
+	if x != nil {
+		return x.Enabled
+	}
+	return false
+}
+
+type UnmapMarkDiskChainRemovedSetResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *UnmapMarkDiskChainRemovedSetResponse) Reset() {
+	*x = UnmapMarkDiskChainRemovedSetResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[25]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UnmapMarkDiskChainRemovedSetResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UnmapMarkDiskChainRemovedSetResponse) ProtoMessage() {}
+
+func (x *UnmapMarkDiskChainRemovedSetResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use UnmapMarkDiskChainRemovedSetResponse.ProtoReflect.Descriptor instead.
+func (*UnmapMarkDiskChainRemovedSetResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *UnmapMarkDiskChainRemovedSetResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type SnapshotMaxCountSetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Count int32 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
+}
+
+func (x *SnapshotMaxCountSetRequest) Reset() {
+	*x = SnapshotMaxCountSetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[26]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SnapshotMaxCountSetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SnapshotMaxCountSetRequest) ProtoMessage() {}
+
+func (x *SnapshotMaxCountSetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SnapshotMaxCountSetRequest.ProtoReflect.Descriptor instead.
+func (*SnapshotMaxCountSetRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{26}
+}
+
+func (x *SnapshotMaxCountSetRequest) GetCount() int32 {
+	if x != nil {
+		return x.Count
+	}
+	return 0
+}
+
+type SnapshotMaxCountSetResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *SnapshotMaxCountSetResponse) Reset() {
+	*x = SnapshotMaxCountSetResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[27]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SnapshotMaxCountSetResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SnapshotMaxCountSetResponse) ProtoMessage() {}
+
+func (x *SnapshotMaxCountSetResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SnapshotMaxCountSetResponse.ProtoReflect.Descriptor instead.
+func (*SnapshotMaxCountSetResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *SnapshotMaxCountSetResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type SnapshotMaxSizeSetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Size int64 `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"`
+}
+
+func (x *SnapshotMaxSizeSetRequest) Reset() {
+	*x = SnapshotMaxSizeSetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[28]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SnapshotMaxSizeSetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SnapshotMaxSizeSetRequest) ProtoMessage() {}
+
+func (x *SnapshotMaxSizeSetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SnapshotMaxSizeSetRequest.ProtoReflect.Descriptor instead.
+func (*SnapshotMaxSizeSetRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{28}
+}
+
+func (x *SnapshotMaxSizeSetRequest) GetSize() int64 {
+	if x != nil {
+		return x.Size
+	}
+	return 0
+}
+
+type SnapshotMaxSizeSetResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replica *Replica `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"`
+}
+
+func (x *SnapshotMaxSizeSetResponse) Reset() {
+	*x = SnapshotMaxSizeSetResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[29]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SnapshotMaxSizeSetResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SnapshotMaxSizeSetResponse) ProtoMessage() {}
+
+func (x *SnapshotMaxSizeSetResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SnapshotMaxSizeSetResponse.ProtoReflect.Descriptor instead.
+func (*SnapshotMaxSizeSetResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{29}
+}
+
+func (x *SnapshotMaxSizeSetResponse) GetReplica() *Replica {
+	if x != nil {
+		return x.Replica
+	}
+	return nil
+}
+
+type DiskInfo struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name        string            `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Parent      string            `protobuf:"bytes,2,opt,name=parent,proto3" json:"parent,omitempty"`
+	Children    map[string]bool   `protobuf:"bytes,3,rep,name=children,proto3" json:"children,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
+	Removed     bool              `protobuf:"varint,4,opt,name=removed,proto3" json:"removed,omitempty"`
+	UserCreated bool              `protobuf:"varint,5,opt,name=user_created,json=userCreated,proto3" json:"user_created,omitempty"`
+	Created     string            `protobuf:"bytes,6,opt,name=created,proto3" json:"created,omitempty"`
+	Size        string            `protobuf:"bytes,7,opt,name=size,proto3" json:"size,omitempty"`
+	Labels      map[string]string `protobuf:"bytes,8,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *DiskInfo) Reset() {
+	*x = DiskInfo{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[30]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskInfo) ProtoMessage() {}
+
+func (x *DiskInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskInfo.ProtoReflect.Descriptor instead.
+func (*DiskInfo) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{30}
+}
+
+func (x *DiskInfo) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *DiskInfo) GetParent() string {
+	if x != nil {
+		return x.Parent
+	}
+	return ""
+}
+
+func (x *DiskInfo) GetChildren() map[string]bool {
+	if x != nil {
+		return x.Children
+	}
+	return nil
+}
+
+func (x *DiskInfo) GetRemoved() bool {
+	if x != nil {
+		return x.Removed
+	}
+	return false
+}
+
+func (x *DiskInfo) GetUserCreated() bool {
+	if x != nil {
+		return x.UserCreated
+	}
+	return false
+}
+
+func (x *DiskInfo) GetCreated() string {
+	if x != nil {
+		return x.Created
+	}
+	return ""
+}
+
+func (x *DiskInfo) GetSize() string {
+	if x != nil {
+		return x.Size
+	}
+	return ""
+}
+
+func (x *DiskInfo) GetLabels() map[string]string {
+	if x != nil {
+		return x.Labels
+	}
+	return nil
+}
+
+type Replica struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Dirty                     bool                 `protobuf:"varint,1,opt,name=dirty,proto3" json:"dirty,omitempty"`
+	Rebuilding                bool                 `protobuf:"varint,2,opt,name=rebuilding,proto3" json:"rebuilding,omitempty"`
+	Head                      string               `protobuf:"bytes,3,opt,name=head,proto3" json:"head,omitempty"`
+	Parent                    string               `protobuf:"bytes,4,opt,name=parent,proto3" json:"parent,omitempty"`
+	Size                      string               `protobuf:"bytes,5,opt,name=size,proto3" json:"size,omitempty"`
+	SectorSize                int64                `protobuf:"varint,6,opt,name=sector_size,json=sectorSize,proto3" json:"sector_size,omitempty"`
+	BackingFile               string               `protobuf:"bytes,7,opt,name=backing_file,json=backingFile,proto3" json:"backing_file,omitempty"`
+	State                     string               `protobuf:"bytes,8,opt,name=state,proto3" json:"state,omitempty"`
+	Chain                     []string             `protobuf:"bytes,9,rep,name=chain,proto3" json:"chain,omitempty"`
+	Disks                     map[string]*DiskInfo `protobuf:"bytes,10,rep,name=disks,proto3" json:"disks,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	RemainSnapshots           int32                `protobuf:"varint,11,opt,name=remain_snapshots,json=remainSnapshots,proto3" json:"remain_snapshots,omitempty"`
+	RevisionCounter           int64                `protobuf:"varint,12,opt,name=revision_counter,json=revisionCounter,proto3" json:"revision_counter,omitempty"`
+	LastModifyTime            int64                `protobuf:"varint,13,opt,name=last_modify_time,json=lastModifyTime,proto3" json:"last_modify_time,omitempty"`
+	HeadFileSize              int64                `protobuf:"varint,14,opt,name=head_file_size,json=headFileSize,proto3" json:"head_file_size,omitempty"`
+	RevisionCounterDisabled   bool                 `protobuf:"varint,15,opt,name=revision_counter_disabled,json=revisionCounterDisabled,proto3" json:"revision_counter_disabled,omitempty"`
+	UnmapMarkDiskChainRemoved bool                 `protobuf:"varint,16,opt,name=unmap_mark_disk_chain_removed,json=unmapMarkDiskChainRemoved,proto3" json:"unmap_mark_disk_chain_removed,omitempty"`
+	SnapshotCountUsage        int32                `protobuf:"varint,17,opt,name=snapshot_count_usage,json=snapshotCountUsage,proto3" json:"snapshot_count_usage,omitempty"`
+	SnapshotSizeUsage         int64                `protobuf:"varint,18,opt,name=snapshot_size_usage,json=snapshotSizeUsage,proto3" json:"snapshot_size_usage,omitempty"`
+}
+
+func (x *Replica) Reset() {
+	*x = Replica{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[31]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Replica) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Replica) ProtoMessage() {}
+
+func (x *Replica) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Replica.ProtoReflect.Descriptor instead.
+func (*Replica) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{31}
+}
+
+func (x *Replica) GetDirty() bool {
+	if x != nil {
+		return x.Dirty
+	}
+	return false
+}
+
+func (x *Replica) GetRebuilding() bool {
+	if x != nil {
+		return x.Rebuilding
+	}
+	return false
+}
+
+func (x *Replica) GetHead() string {
+	if x != nil {
+		return x.Head
+	}
+	return ""
+}
+
+func (x *Replica) GetParent() string {
+	if x != nil {
+		return x.Parent
+	}
+	return ""
+}
+
+func (x *Replica) GetSize() string {
+	if x != nil {
+		return x.Size
+	}
+	return ""
+}
+
+func (x *Replica) GetSectorSize() int64 {
+	if x != nil {
+		return x.SectorSize
+	}
+	return 0
+}
+
+func (x *Replica) GetBackingFile() string {
+	if x != nil {
+		return x.BackingFile
+	}
+	return ""
+}
+
+func (x *Replica) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+func (x *Replica) GetChain() []string {
+	if x != nil {
+		return x.Chain
+	}
+	return nil
+}
+
+func (x *Replica) GetDisks() map[string]*DiskInfo {
+	if x != nil {
+		return x.Disks
+	}
+	return nil
+}
+
+func (x *Replica) GetRemainSnapshots() int32 {
+	if x != nil {
+		return x.RemainSnapshots
+	}
+	return 0
+}
+
+func (x *Replica) GetRevisionCounter() int64 {
+	if x != nil {
+		return x.RevisionCounter
+	}
+	return 0
+}
+
+func (x *Replica) GetLastModifyTime() int64 {
+	if x != nil {
+		return x.LastModifyTime
+	}
+	return 0
+}
+
+func (x *Replica) GetHeadFileSize() int64 {
+	if x != nil {
+		return x.HeadFileSize
+	}
+	return 0
+}
+
+func (x *Replica) GetRevisionCounterDisabled() bool {
+	if x != nil {
+		return x.RevisionCounterDisabled
+	}
+	return false
+}
+
+func (x *Replica) GetUnmapMarkDiskChainRemoved() bool {
+	if x != nil {
+		return x.UnmapMarkDiskChainRemoved
+	}
+	return false
+}
+
+func (x *Replica) GetSnapshotCountUsage() int32 {
+	if x != nil {
+		return x.SnapshotCountUsage
+	}
+	return 0
+}
+
+func (x *Replica) GetSnapshotSizeUsage() int64 {
+	if x != nil {
+		return x.SnapshotSizeUsage
+	}
+	return 0
+}
+
+type PrepareRemoveAction struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Action string `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"`
+	Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"`
+	Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"`
+}
+
+func (x *PrepareRemoveAction) Reset() {
+	*x = PrepareRemoveAction{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_replica_proto_msgTypes[32]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PrepareRemoveAction) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PrepareRemoveAction) ProtoMessage() {}
+
+func (x *PrepareRemoveAction) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_replica_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PrepareRemoveAction.ProtoReflect.Descriptor instead.
+func (*PrepareRemoveAction) Descriptor() ([]byte, []int) {
+	return file_ptypes_replica_proto_rawDescGZIP(), []int{32}
+}
+
+func (x *PrepareRemoveAction) GetAction() string {
+	if x != nil {
+		return x.Action
+	}
+	return ""
+}
+
+func (x *PrepareRemoveAction) GetSource() string {
+	if x != nil {
+		return x.Source
+	}
+	return ""
+}
+
+func (x *PrepareRemoveAction) GetTarget() string {
+	if x != nil {
+		return x.Target
+	}
+	return ""
+}
+
+var File_ptypes_replica_proto protoreflect.FileDescriptor
+
+var file_ptypes_replica_proto_rawDesc = []byte{
+	0x0a, 0x14, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x1b,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f,
+	0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x2a, 0x0a, 0x14, 0x52,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x42, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x29, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x22, 0x3f, 0x0a, 0x12, 0x52,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x29, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x22, 0x40, 0x0a, 0x13,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4f, 0x70, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x22, 0x41,
+	0x0a, 0x14, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73,
+	0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x22, 0x42, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x6c, 0x6f,
+	0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x72, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x07, 0x72, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x22, 0x44, 0x0a, 0x14, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 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, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x42, 0x0a, 0x15, 0x52,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x22,
+	0xe8, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x6e, 0x61, 0x70, 0x73,
+	0x68, 0x6f, 0x74, 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, 0x21,
+	0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x06, 0x6c,
+	0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x6e, 0x61, 0x70,
+	0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65,
+	0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a,
+	0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 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, 0x44, 0x0a, 0x17, 0x52, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x22, 0x2a, 0x0a, 0x14, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x45, 0x78, 0x70, 0x61, 0x6e,
+	0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x42, 0x0a, 0x15,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x22, 0x3d, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 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, 0x22,
+	0x3f, 0x0a, 0x12, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x22, 0x44, 0x0a, 0x12, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x16,
+	0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x40, 0x0a, 0x13, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65,
+	0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a,
+	0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f,
+	0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52,
+	0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x22, 0x2e, 0x0a, 0x18, 0x44, 0x69, 0x73, 0x6b,
+	0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 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, 0x22, 0x58, 0x0a, 0x19, 0x44, 0x69, 0x73, 0x6b,
+	0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65,
+	0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x22, 0x2e, 0x0a, 0x18, 0x44, 0x69, 0x73, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x41, 0x73,
+	0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 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, 0x46, 0x0a, 0x19, 0x44, 0x69, 0x73, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x41, 0x73,
+	0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x29, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x0f, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x22, 0x36, 0x0a, 0x14, 0x52, 0x65,
+	0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69,
+	0x6e, 0x67, 0x22, 0x42, 0x0a, 0x15, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67,
+	0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x72,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x07, 0x72,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x22, 0x35, 0x0a, 0x19, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69,
+	0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x47, 0x0a,
+	0x1a, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72,
+	0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x72,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x07, 0x72,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x22, 0x3f, 0x0a, 0x23, 0x55, 0x6e, 0x6d, 0x61, 0x70, 0x4d,
+	0x61, 0x72, 0x6b, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x6d, 0x6f,
+	0x76, 0x65, 0x64, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a,
+	0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,
+	0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x51, 0x0a, 0x24, 0x55, 0x6e, 0x6d, 0x61, 0x70,
+	0x4d, 0x61, 0x72, 0x6b, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x6d,
+	0x6f, 0x76, 0x65, 0x64, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x29, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x0f, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x22, 0x32, 0x0a, 0x1a, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x65,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x48,
+	0x0a, 0x1b, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x75,
+	0x6e, 0x74, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a,
+	0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f,
+	0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52,
+	0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x22, 0x2f, 0x0a, 0x19, 0x53, 0x6e, 0x61, 0x70,
+	0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x47, 0x0a, 0x1a, 0x53, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65,
+	0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x22, 0x8b, 0x03, 0x0a, 0x08, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12,
+	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
+	0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x63,
+	0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e,
+	0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e,
+	0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x63,
+	0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76,
+	0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65,
+	0x64, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x12,
+	0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69,
+	0x7a, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x69, 0x73, 0x6b,
+	0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x43, 0x68, 0x69, 0x6c,
+	0x64, 0x72, 0x65, 0x6e, 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, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 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, 0xf3, 0x05, 0x0a, 0x07, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x14, 0x0a, 0x05,
+	0x64, 0x69, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x64, 0x69, 0x72,
+	0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69,
+	0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x12,
+	0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69,
+	0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x69, 0x7a,
+	0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53,
+	0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x66,
+	0x69, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x69,
+	0x6e, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18,
+	0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05,
+	0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x68, 0x61,
+	0x69, 0x6e, 0x12, 0x30, 0x0a, 0x05, 0x64, 0x69, 0x73, 0x6b, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x64,
+	0x69, 0x73, 0x6b, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x73,
+	0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f,
+	0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12,
+	0x29, 0x0a, 0x10, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73,
+	0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61,
+	0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79,
+	0x54, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c,
+	0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x68, 0x65,
+	0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65,
+	0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x64,
+	0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x72,
+	0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x44, 0x69,
+	0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x1d, 0x75, 0x6e, 0x6d, 0x61, 0x70, 0x5f,
+	0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f,
+	0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x75,
+	0x6e, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x68, 0x61, 0x69,
+	0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x6e, 0x61, 0x70,
+	0x73, 0x68, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65,
+	0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
+	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x75, 0x73, 0x61, 0x67,
+	0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x53, 0x69, 0x7a, 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x4a, 0x0a, 0x0a, 0x44, 0x69,
+	0x73, 0x6b, 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, 0x70, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5d, 0x0a, 0x13, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72,
+	0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a,
+	0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a,
+	0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74,
+	0x61, 0x72, 0x67, 0x65, 0x74, 0x32, 0xeb, 0x0b, 0x0a, 0x0e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x70, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73,
+	0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0a, 0x52,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x1a, 0x1a, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x44, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x16,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4f, 0x70, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e,
+	0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6c,
+	0x6f, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a,
+	0x0d, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x16,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x12, 0x1c, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65,
+	0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1e, 0x2e, 0x70, 0x74, 0x79,
+	0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x6e, 0x61, 0x70, 0x73,
+	0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x70, 0x74, 0x79,
+	0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x6e, 0x61, 0x70, 0x73,
+	0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a,
+	0x0d, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x12, 0x1c,
+	0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x45,
+	0x78, 0x70, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x70,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x45, 0x78, 0x70,
+	0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a,
+	0x0a, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x19, 0x2e, 0x70, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0b, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c,
+	0x61, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x69, 0x73,
+	0x6b, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x1b, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x70,
+	0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a,
+	0x0a, 0x11, 0x44, 0x69, 0x73, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x6d,
+	0x6f, 0x76, 0x65, 0x12, 0x20, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x69, 0x73,
+	0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44,
+	0x69, 0x73, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x11, 0x44, 0x69,
+	0x73, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x41, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12,
+	0x20, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x4d, 0x61, 0x72,
+	0x6b, 0x41, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x21, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x4d,
+	0x61, 0x72, 0x6b, 0x41, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0d, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x12, 0x1c, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73,
+	0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52,
+	0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69,
+	0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x12, 0x21, 0x2e, 0x70,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f,
+	0x75, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x22, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f,
+	0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x1c, 0x55, 0x6e, 0x6d, 0x61, 0x70, 0x4d, 0x61,
+	0x72, 0x6b, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76,
+	0x65, 0x64, 0x53, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55,
+	0x6e, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x68, 0x61, 0x69,
+	0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61,
+	0x70, 0x4d, 0x61, 0x72, 0x6b, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65,
+	0x6d, 0x6f, 0x76, 0x65, 0x64, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x12, 0x60, 0x0a, 0x13, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61,
+	0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x70, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x43, 0x6f,
+	0x75, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e,
+	0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d,
+	0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
+	0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x12, 0x21, 0x2e, 0x70, 0x74, 0x79,
+	0x70, 0x65, 0x73, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x53,
+	0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e,
+	0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d,
+	0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x00, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
+	0x6d, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x68, 0x6f, 0x72, 0x6e, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73,
+	0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2f, 0x65,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_ptypes_replica_proto_rawDescOnce sync.Once
+	file_ptypes_replica_proto_rawDescData = file_ptypes_replica_proto_rawDesc
+)
+
+func file_ptypes_replica_proto_rawDescGZIP() []byte {
+	file_ptypes_replica_proto_rawDescOnce.Do(func() {
+		file_ptypes_replica_proto_rawDescData = protoimpl.X.CompressGZIP(file_ptypes_replica_proto_rawDescData)
+	})
+	return file_ptypes_replica_proto_rawDescData
+}
+
+var file_ptypes_replica_proto_msgTypes = make([]protoimpl.MessageInfo, 37)
+var file_ptypes_replica_proto_goTypes = []interface{}{
+	(*ReplicaCreateRequest)(nil),                 // 0: ptypes.ReplicaCreateRequest
+	(*ReplicaCreateResponse)(nil),                // 1: ptypes.ReplicaCreateResponse
+	(*ReplicaGetResponse)(nil),                   // 2: ptypes.ReplicaGetResponse
+	(*ReplicaOpenResponse)(nil),                  // 3: ptypes.ReplicaOpenResponse
+	(*ReplicaCloseResponse)(nil),                 // 4: ptypes.ReplicaCloseResponse
+	(*ReplicaReloadResponse)(nil),                // 5: ptypes.ReplicaReloadResponse
+	(*ReplicaRevertRequest)(nil),                 // 6: ptypes.ReplicaRevertRequest
+	(*ReplicaRevertResponse)(nil),                // 7: ptypes.ReplicaRevertResponse
+	(*ReplicaSnapshotRequest)(nil),               // 8: ptypes.ReplicaSnapshotRequest
+	(*ReplicaSnapshotResponse)(nil),              // 9: ptypes.ReplicaSnapshotResponse
+	(*ReplicaExpandRequest)(nil),                 // 10: ptypes.ReplicaExpandRequest
+	(*ReplicaExpandResponse)(nil),                // 11: ptypes.ReplicaExpandResponse
+	(*DiskRemoveRequest)(nil),                    // 12: ptypes.DiskRemoveRequest
+	(*DiskRemoveResponse)(nil),                   // 13: ptypes.DiskRemoveResponse
+	(*DiskReplaceRequest)(nil),                   // 14: ptypes.DiskReplaceRequest
+	(*DiskReplaceResponse)(nil),                  // 15: ptypes.DiskReplaceResponse
+	(*DiskPrepareRemoveRequest)(nil),             // 16: ptypes.DiskPrepareRemoveRequest
+	(*DiskPrepareRemoveResponse)(nil),            // 17: ptypes.DiskPrepareRemoveResponse
+	(*DiskMarkAsRemovedRequest)(nil),             // 18: ptypes.DiskMarkAsRemovedRequest
+	(*DiskMarkAsRemovedResponse)(nil),            // 19: ptypes.DiskMarkAsRemovedResponse
+	(*RebuildingSetRequest)(nil),                 // 20: ptypes.RebuildingSetRequest
+	(*RebuildingSetResponse)(nil),                // 21: ptypes.RebuildingSetResponse
+	(*RevisionCounterSetRequest)(nil),            // 22: ptypes.RevisionCounterSetRequest
+	(*RevisionCounterSetResponse)(nil),           // 23: ptypes.RevisionCounterSetResponse
+	(*UnmapMarkDiskChainRemovedSetRequest)(nil),  // 24: ptypes.UnmapMarkDiskChainRemovedSetRequest
+	(*UnmapMarkDiskChainRemovedSetResponse)(nil), // 25: ptypes.UnmapMarkDiskChainRemovedSetResponse
+	(*SnapshotMaxCountSetRequest)(nil),           // 26: ptypes.SnapshotMaxCountSetRequest
+	(*SnapshotMaxCountSetResponse)(nil),          // 27: ptypes.SnapshotMaxCountSetResponse
+	(*SnapshotMaxSizeSetRequest)(nil),            // 28: ptypes.SnapshotMaxSizeSetRequest
+	(*SnapshotMaxSizeSetResponse)(nil),           // 29: ptypes.SnapshotMaxSizeSetResponse
+	(*DiskInfo)(nil),                             // 30: ptypes.DiskInfo
+	(*Replica)(nil),                              // 31: ptypes.Replica
+	(*PrepareRemoveAction)(nil),                  // 32: ptypes.PrepareRemoveAction
+	nil,                                          // 33: ptypes.ReplicaSnapshotRequest.LabelsEntry
+	nil,                                          // 34: ptypes.DiskInfo.ChildrenEntry
+	nil,                                          // 35: ptypes.DiskInfo.LabelsEntry
+	nil,                                          // 36: ptypes.Replica.DisksEntry
+	(*emptypb.Empty)(nil),                        // 37: google.protobuf.Empty
+}
+var file_ptypes_replica_proto_depIdxs = []int32{
+	31, // 0: ptypes.ReplicaCreateResponse.replica:type_name -> ptypes.Replica
+	31, // 1: ptypes.ReplicaGetResponse.replica:type_name -> ptypes.Replica
+	31, // 2: ptypes.ReplicaOpenResponse.replica:type_name -> ptypes.Replica
+	31, // 3: ptypes.ReplicaCloseResponse.replica:type_name -> ptypes.Replica
+	31, // 4: ptypes.ReplicaReloadResponse.replica:type_name -> ptypes.Replica
+	31, // 5: ptypes.ReplicaRevertResponse.replica:type_name -> ptypes.Replica
+	33, // 6: ptypes.ReplicaSnapshotRequest.labels:type_name -> ptypes.ReplicaSnapshotRequest.LabelsEntry
+	31, // 7: ptypes.ReplicaSnapshotResponse.replica:type_name -> ptypes.Replica
+	31, // 8: ptypes.ReplicaExpandResponse.replica:type_name -> ptypes.Replica
+	31, // 9: ptypes.DiskRemoveResponse.replica:type_name -> ptypes.Replica
+	31, // 10: ptypes.DiskReplaceResponse.replica:type_name -> ptypes.Replica
+	32, // 11: ptypes.DiskPrepareRemoveResponse.operations:type_name -> ptypes.PrepareRemoveAction
+	31, // 12: ptypes.DiskMarkAsRemovedResponse.replica:type_name -> ptypes.Replica
+	31, // 13: ptypes.RebuildingSetResponse.replica:type_name -> ptypes.Replica
+	31, // 14: ptypes.RevisionCounterSetResponse.replica:type_name -> ptypes.Replica
+	31, // 15: ptypes.UnmapMarkDiskChainRemovedSetResponse.replica:type_name -> ptypes.Replica
+	31, // 16: ptypes.SnapshotMaxCountSetResponse.replica:type_name -> ptypes.Replica
+	31, // 17: ptypes.SnapshotMaxSizeSetResponse.replica:type_name -> ptypes.Replica
+	34, // 18: ptypes.DiskInfo.children:type_name -> ptypes.DiskInfo.ChildrenEntry
+	35, // 19: ptypes.DiskInfo.labels:type_name -> ptypes.DiskInfo.LabelsEntry
+	36, // 20: ptypes.Replica.disks:type_name -> ptypes.Replica.DisksEntry
+	30, // 21: ptypes.Replica.DisksEntry.value:type_name -> ptypes.DiskInfo
+	0,  // 22: ptypes.ReplicaService.ReplicaCreate:input_type -> ptypes.ReplicaCreateRequest
+	37, // 23: ptypes.ReplicaService.ReplicaDelete:input_type -> google.protobuf.Empty
+	37, // 24: ptypes.ReplicaService.ReplicaGet:input_type -> google.protobuf.Empty
+	37, // 25: ptypes.ReplicaService.ReplicaOpen:input_type -> google.protobuf.Empty
+	37, // 26: ptypes.ReplicaService.ReplicaClose:input_type -> google.protobuf.Empty
+	37, // 27: ptypes.ReplicaService.ReplicaReload:input_type -> google.protobuf.Empty
+	6,  // 28: ptypes.ReplicaService.ReplicaRevert:input_type -> ptypes.ReplicaRevertRequest
+	8,  // 29: ptypes.ReplicaService.ReplicaSnapshot:input_type -> ptypes.ReplicaSnapshotRequest
+	10, // 30: ptypes.ReplicaService.ReplicaExpand:input_type -> ptypes.ReplicaExpandRequest
+	12, // 31: ptypes.ReplicaService.DiskRemove:input_type -> ptypes.DiskRemoveRequest
+	14, // 32: ptypes.ReplicaService.DiskReplace:input_type -> ptypes.DiskReplaceRequest
+	16, // 33: ptypes.ReplicaService.DiskPrepareRemove:input_type -> ptypes.DiskPrepareRemoveRequest
+	18, // 34: ptypes.ReplicaService.DiskMarkAsRemoved:input_type -> ptypes.DiskMarkAsRemovedRequest
+	20, // 35: ptypes.ReplicaService.RebuildingSet:input_type -> ptypes.RebuildingSetRequest
+	22, // 36: ptypes.ReplicaService.RevisionCounterSet:input_type -> ptypes.RevisionCounterSetRequest
+	24, // 37: ptypes.ReplicaService.UnmapMarkDiskChainRemovedSet:input_type -> ptypes.UnmapMarkDiskChainRemovedSetRequest
+	26, // 38: ptypes.ReplicaService.SnapshotMaxCountSet:input_type -> ptypes.SnapshotMaxCountSetRequest
+	28, // 39: ptypes.ReplicaService.SnapshotMaxSizeSet:input_type -> ptypes.SnapshotMaxSizeSetRequest
+	1,  // 40: ptypes.ReplicaService.ReplicaCreate:output_type -> ptypes.ReplicaCreateResponse
+	37, // 41: ptypes.ReplicaService.ReplicaDelete:output_type -> google.protobuf.Empty
+	2,  // 42: ptypes.ReplicaService.ReplicaGet:output_type -> ptypes.ReplicaGetResponse
+	3,  // 43: ptypes.ReplicaService.ReplicaOpen:output_type -> ptypes.ReplicaOpenResponse
+	4,  // 44: ptypes.ReplicaService.ReplicaClose:output_type -> ptypes.ReplicaCloseResponse
+	5,  // 45: ptypes.ReplicaService.ReplicaReload:output_type -> ptypes.ReplicaReloadResponse
+	7,  // 46: ptypes.ReplicaService.ReplicaRevert:output_type -> ptypes.ReplicaRevertResponse
+	9,  // 47: ptypes.ReplicaService.ReplicaSnapshot:output_type -> ptypes.ReplicaSnapshotResponse
+	11, // 48: ptypes.ReplicaService.ReplicaExpand:output_type -> ptypes.ReplicaExpandResponse
+	13, // 49: ptypes.ReplicaService.DiskRemove:output_type -> ptypes.DiskRemoveResponse
+	15, // 50: ptypes.ReplicaService.DiskReplace:output_type -> ptypes.DiskReplaceResponse
+	17, // 51: ptypes.ReplicaService.DiskPrepareRemove:output_type -> ptypes.DiskPrepareRemoveResponse
+	19, // 52: ptypes.ReplicaService.DiskMarkAsRemoved:output_type -> ptypes.DiskMarkAsRemovedResponse
+	21, // 53: ptypes.ReplicaService.RebuildingSet:output_type -> ptypes.RebuildingSetResponse
+	23, // 54: ptypes.ReplicaService.RevisionCounterSet:output_type -> ptypes.RevisionCounterSetResponse
+	25, // 55: ptypes.ReplicaService.UnmapMarkDiskChainRemovedSet:output_type -> ptypes.UnmapMarkDiskChainRemovedSetResponse
+	27, // 56: ptypes.ReplicaService.SnapshotMaxCountSet:output_type -> ptypes.SnapshotMaxCountSetResponse
+	29, // 57: ptypes.ReplicaService.SnapshotMaxSizeSet:output_type -> ptypes.SnapshotMaxSizeSetResponse
+	40, // [40:58] is the sub-list for method output_type
+	22, // [22:40] is the sub-list for method input_type
+	22, // [22:22] is the sub-list for extension type_name
+	22, // [22:22] is the sub-list for extension extendee
+	0,  // [0:22] is the sub-list for field type_name
+}
+
+func init() { file_ptypes_replica_proto_init() }
+func file_ptypes_replica_proto_init() {
+	if File_ptypes_replica_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_ptypes_replica_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaCreateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaGetResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaOpenResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaCloseResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaReloadResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaRevertRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaRevertResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaSnapshotRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaSnapshotResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaExpandRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaExpandResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskRemoveRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskRemoveResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskReplaceRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskReplaceResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskPrepareRemoveRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskPrepareRemoveResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskMarkAsRemovedRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskMarkAsRemovedResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RebuildingSetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RebuildingSetResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RevisionCounterSetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RevisionCounterSetResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UnmapMarkDiskChainRemovedSetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UnmapMarkDiskChainRemovedSetResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SnapshotMaxCountSetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SnapshotMaxCountSetResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SnapshotMaxSizeSetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SnapshotMaxSizeSetResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskInfo); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Replica); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_replica_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PrepareRemoveAction); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_ptypes_replica_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   37,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_ptypes_replica_proto_goTypes,
+		DependencyIndexes: file_ptypes_replica_proto_depIdxs,
+		MessageInfos:      file_ptypes_replica_proto_msgTypes,
+	}.Build()
+	File_ptypes_replica_proto = out.File
+	file_ptypes_replica_proto_rawDesc = nil
+	file_ptypes_replica_proto_goTypes = nil
+	file_ptypes_replica_proto_depIdxs = nil
+}
diff --git a/pkg/generated/enginerpc/replica_grpc.pb.go b/pkg/generated/enginerpc/replica_grpc.pb.go
new file mode 100644
index 0000000..31305f8
--- /dev/null
+++ b/pkg/generated/enginerpc/replica_grpc.pb.go
@@ -0,0 +1,739 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v4.24.3
+// source: ptypes/replica.proto
+
+package enginerpc
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+	ReplicaService_ReplicaCreate_FullMethodName                = "/ptypes.ReplicaService/ReplicaCreate"
+	ReplicaService_ReplicaDelete_FullMethodName                = "/ptypes.ReplicaService/ReplicaDelete"
+	ReplicaService_ReplicaGet_FullMethodName                   = "/ptypes.ReplicaService/ReplicaGet"
+	ReplicaService_ReplicaOpen_FullMethodName                  = "/ptypes.ReplicaService/ReplicaOpen"
+	ReplicaService_ReplicaClose_FullMethodName                 = "/ptypes.ReplicaService/ReplicaClose"
+	ReplicaService_ReplicaReload_FullMethodName                = "/ptypes.ReplicaService/ReplicaReload"
+	ReplicaService_ReplicaRevert_FullMethodName                = "/ptypes.ReplicaService/ReplicaRevert"
+	ReplicaService_ReplicaSnapshot_FullMethodName              = "/ptypes.ReplicaService/ReplicaSnapshot"
+	ReplicaService_ReplicaExpand_FullMethodName                = "/ptypes.ReplicaService/ReplicaExpand"
+	ReplicaService_DiskRemove_FullMethodName                   = "/ptypes.ReplicaService/DiskRemove"
+	ReplicaService_DiskReplace_FullMethodName                  = "/ptypes.ReplicaService/DiskReplace"
+	ReplicaService_DiskPrepareRemove_FullMethodName            = "/ptypes.ReplicaService/DiskPrepareRemove"
+	ReplicaService_DiskMarkAsRemoved_FullMethodName            = "/ptypes.ReplicaService/DiskMarkAsRemoved"
+	ReplicaService_RebuildingSet_FullMethodName                = "/ptypes.ReplicaService/RebuildingSet"
+	ReplicaService_RevisionCounterSet_FullMethodName           = "/ptypes.ReplicaService/RevisionCounterSet"
+	ReplicaService_UnmapMarkDiskChainRemovedSet_FullMethodName = "/ptypes.ReplicaService/UnmapMarkDiskChainRemovedSet"
+	ReplicaService_SnapshotMaxCountSet_FullMethodName          = "/ptypes.ReplicaService/SnapshotMaxCountSet"
+	ReplicaService_SnapshotMaxSizeSet_FullMethodName           = "/ptypes.ReplicaService/SnapshotMaxSizeSet"
+)
+
+// ReplicaServiceClient is the client API for ReplicaService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type ReplicaServiceClient interface {
+	ReplicaCreate(ctx context.Context, in *ReplicaCreateRequest, opts ...grpc.CallOption) (*ReplicaCreateResponse, error)
+	ReplicaDelete(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ReplicaGetResponse, error)
+	ReplicaOpen(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ReplicaOpenResponse, error)
+	ReplicaClose(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ReplicaCloseResponse, error)
+	ReplicaReload(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ReplicaReloadResponse, error)
+	ReplicaRevert(ctx context.Context, in *ReplicaRevertRequest, opts ...grpc.CallOption) (*ReplicaRevertResponse, error)
+	ReplicaSnapshot(ctx context.Context, in *ReplicaSnapshotRequest, opts ...grpc.CallOption) (*ReplicaSnapshotResponse, error)
+	ReplicaExpand(ctx context.Context, in *ReplicaExpandRequest, opts ...grpc.CallOption) (*ReplicaExpandResponse, error)
+	DiskRemove(ctx context.Context, in *DiskRemoveRequest, opts ...grpc.CallOption) (*DiskRemoveResponse, error)
+	DiskReplace(ctx context.Context, in *DiskReplaceRequest, opts ...grpc.CallOption) (*DiskReplaceResponse, error)
+	DiskPrepareRemove(ctx context.Context, in *DiskPrepareRemoveRequest, opts ...grpc.CallOption) (*DiskPrepareRemoveResponse, error)
+	DiskMarkAsRemoved(ctx context.Context, in *DiskMarkAsRemovedRequest, opts ...grpc.CallOption) (*DiskMarkAsRemovedResponse, error)
+	RebuildingSet(ctx context.Context, in *RebuildingSetRequest, opts ...grpc.CallOption) (*RebuildingSetResponse, error)
+	RevisionCounterSet(ctx context.Context, in *RevisionCounterSetRequest, opts ...grpc.CallOption) (*RevisionCounterSetResponse, error)
+	UnmapMarkDiskChainRemovedSet(ctx context.Context, in *UnmapMarkDiskChainRemovedSetRequest, opts ...grpc.CallOption) (*UnmapMarkDiskChainRemovedSetResponse, error)
+	SnapshotMaxCountSet(ctx context.Context, in *SnapshotMaxCountSetRequest, opts ...grpc.CallOption) (*SnapshotMaxCountSetResponse, error)
+	SnapshotMaxSizeSet(ctx context.Context, in *SnapshotMaxSizeSetRequest, opts ...grpc.CallOption) (*SnapshotMaxSizeSetResponse, error)
+}
+
+type replicaServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewReplicaServiceClient(cc grpc.ClientConnInterface) ReplicaServiceClient {
+	return &replicaServiceClient{cc}
+}
+
+func (c *replicaServiceClient) ReplicaCreate(ctx context.Context, in *ReplicaCreateRequest, opts ...grpc.CallOption) (*ReplicaCreateResponse, error) {
+	out := new(ReplicaCreateResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_ReplicaCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) ReplicaDelete(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ReplicaService_ReplicaDelete_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) ReplicaGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ReplicaGetResponse, error) {
+	out := new(ReplicaGetResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_ReplicaGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) ReplicaOpen(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ReplicaOpenResponse, error) {
+	out := new(ReplicaOpenResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_ReplicaOpen_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) ReplicaClose(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ReplicaCloseResponse, error) {
+	out := new(ReplicaCloseResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_ReplicaClose_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) ReplicaReload(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ReplicaReloadResponse, error) {
+	out := new(ReplicaReloadResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_ReplicaReload_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) ReplicaRevert(ctx context.Context, in *ReplicaRevertRequest, opts ...grpc.CallOption) (*ReplicaRevertResponse, error) {
+	out := new(ReplicaRevertResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_ReplicaRevert_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) ReplicaSnapshot(ctx context.Context, in *ReplicaSnapshotRequest, opts ...grpc.CallOption) (*ReplicaSnapshotResponse, error) {
+	out := new(ReplicaSnapshotResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_ReplicaSnapshot_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) ReplicaExpand(ctx context.Context, in *ReplicaExpandRequest, opts ...grpc.CallOption) (*ReplicaExpandResponse, error) {
+	out := new(ReplicaExpandResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_ReplicaExpand_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) DiskRemove(ctx context.Context, in *DiskRemoveRequest, opts ...grpc.CallOption) (*DiskRemoveResponse, error) {
+	out := new(DiskRemoveResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_DiskRemove_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) DiskReplace(ctx context.Context, in *DiskReplaceRequest, opts ...grpc.CallOption) (*DiskReplaceResponse, error) {
+	out := new(DiskReplaceResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_DiskReplace_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) DiskPrepareRemove(ctx context.Context, in *DiskPrepareRemoveRequest, opts ...grpc.CallOption) (*DiskPrepareRemoveResponse, error) {
+	out := new(DiskPrepareRemoveResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_DiskPrepareRemove_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) DiskMarkAsRemoved(ctx context.Context, in *DiskMarkAsRemovedRequest, opts ...grpc.CallOption) (*DiskMarkAsRemovedResponse, error) {
+	out := new(DiskMarkAsRemovedResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_DiskMarkAsRemoved_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) RebuildingSet(ctx context.Context, in *RebuildingSetRequest, opts ...grpc.CallOption) (*RebuildingSetResponse, error) {
+	out := new(RebuildingSetResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_RebuildingSet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) RevisionCounterSet(ctx context.Context, in *RevisionCounterSetRequest, opts ...grpc.CallOption) (*RevisionCounterSetResponse, error) {
+	out := new(RevisionCounterSetResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_RevisionCounterSet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) UnmapMarkDiskChainRemovedSet(ctx context.Context, in *UnmapMarkDiskChainRemovedSetRequest, opts ...grpc.CallOption) (*UnmapMarkDiskChainRemovedSetResponse, error) {
+	out := new(UnmapMarkDiskChainRemovedSetResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_UnmapMarkDiskChainRemovedSet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) SnapshotMaxCountSet(ctx context.Context, in *SnapshotMaxCountSetRequest, opts ...grpc.CallOption) (*SnapshotMaxCountSetResponse, error) {
+	out := new(SnapshotMaxCountSetResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_SnapshotMaxCountSet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *replicaServiceClient) SnapshotMaxSizeSet(ctx context.Context, in *SnapshotMaxSizeSetRequest, opts ...grpc.CallOption) (*SnapshotMaxSizeSetResponse, error) {
+	out := new(SnapshotMaxSizeSetResponse)
+	err := c.cc.Invoke(ctx, ReplicaService_SnapshotMaxSizeSet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ReplicaServiceServer is the server API for ReplicaService service.
+// All implementations must embed UnimplementedReplicaServiceServer
+// for forward compatibility
+type ReplicaServiceServer interface {
+	ReplicaCreate(context.Context, *ReplicaCreateRequest) (*ReplicaCreateResponse, error)
+	ReplicaDelete(context.Context, *emptypb.Empty) (*emptypb.Empty, error)
+	ReplicaGet(context.Context, *emptypb.Empty) (*ReplicaGetResponse, error)
+	ReplicaOpen(context.Context, *emptypb.Empty) (*ReplicaOpenResponse, error)
+	ReplicaClose(context.Context, *emptypb.Empty) (*ReplicaCloseResponse, error)
+	ReplicaReload(context.Context, *emptypb.Empty) (*ReplicaReloadResponse, error)
+	ReplicaRevert(context.Context, *ReplicaRevertRequest) (*ReplicaRevertResponse, error)
+	ReplicaSnapshot(context.Context, *ReplicaSnapshotRequest) (*ReplicaSnapshotResponse, error)
+	ReplicaExpand(context.Context, *ReplicaExpandRequest) (*ReplicaExpandResponse, error)
+	DiskRemove(context.Context, *DiskRemoveRequest) (*DiskRemoveResponse, error)
+	DiskReplace(context.Context, *DiskReplaceRequest) (*DiskReplaceResponse, error)
+	DiskPrepareRemove(context.Context, *DiskPrepareRemoveRequest) (*DiskPrepareRemoveResponse, error)
+	DiskMarkAsRemoved(context.Context, *DiskMarkAsRemovedRequest) (*DiskMarkAsRemovedResponse, error)
+	RebuildingSet(context.Context, *RebuildingSetRequest) (*RebuildingSetResponse, error)
+	RevisionCounterSet(context.Context, *RevisionCounterSetRequest) (*RevisionCounterSetResponse, error)
+	UnmapMarkDiskChainRemovedSet(context.Context, *UnmapMarkDiskChainRemovedSetRequest) (*UnmapMarkDiskChainRemovedSetResponse, error)
+	SnapshotMaxCountSet(context.Context, *SnapshotMaxCountSetRequest) (*SnapshotMaxCountSetResponse, error)
+	SnapshotMaxSizeSet(context.Context, *SnapshotMaxSizeSetRequest) (*SnapshotMaxSizeSetResponse, error)
+	mustEmbedUnimplementedReplicaServiceServer()
+}
+
+// UnimplementedReplicaServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedReplicaServiceServer struct {
+}
+
+func (UnimplementedReplicaServiceServer) ReplicaCreate(context.Context, *ReplicaCreateRequest) (*ReplicaCreateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaCreate not implemented")
+}
+func (UnimplementedReplicaServiceServer) ReplicaDelete(context.Context, *emptypb.Empty) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaDelete not implemented")
+}
+func (UnimplementedReplicaServiceServer) ReplicaGet(context.Context, *emptypb.Empty) (*ReplicaGetResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaGet not implemented")
+}
+func (UnimplementedReplicaServiceServer) ReplicaOpen(context.Context, *emptypb.Empty) (*ReplicaOpenResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaOpen not implemented")
+}
+func (UnimplementedReplicaServiceServer) ReplicaClose(context.Context, *emptypb.Empty) (*ReplicaCloseResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaClose not implemented")
+}
+func (UnimplementedReplicaServiceServer) ReplicaReload(context.Context, *emptypb.Empty) (*ReplicaReloadResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaReload not implemented")
+}
+func (UnimplementedReplicaServiceServer) ReplicaRevert(context.Context, *ReplicaRevertRequest) (*ReplicaRevertResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaRevert not implemented")
+}
+func (UnimplementedReplicaServiceServer) ReplicaSnapshot(context.Context, *ReplicaSnapshotRequest) (*ReplicaSnapshotResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaSnapshot not implemented")
+}
+func (UnimplementedReplicaServiceServer) ReplicaExpand(context.Context, *ReplicaExpandRequest) (*ReplicaExpandResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaExpand not implemented")
+}
+func (UnimplementedReplicaServiceServer) DiskRemove(context.Context, *DiskRemoveRequest) (*DiskRemoveResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DiskRemove not implemented")
+}
+func (UnimplementedReplicaServiceServer) DiskReplace(context.Context, *DiskReplaceRequest) (*DiskReplaceResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DiskReplace not implemented")
+}
+func (UnimplementedReplicaServiceServer) DiskPrepareRemove(context.Context, *DiskPrepareRemoveRequest) (*DiskPrepareRemoveResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DiskPrepareRemove not implemented")
+}
+func (UnimplementedReplicaServiceServer) DiskMarkAsRemoved(context.Context, *DiskMarkAsRemovedRequest) (*DiskMarkAsRemovedResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DiskMarkAsRemoved not implemented")
+}
+func (UnimplementedReplicaServiceServer) RebuildingSet(context.Context, *RebuildingSetRequest) (*RebuildingSetResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method RebuildingSet not implemented")
+}
+func (UnimplementedReplicaServiceServer) RevisionCounterSet(context.Context, *RevisionCounterSetRequest) (*RevisionCounterSetResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method RevisionCounterSet not implemented")
+}
+func (UnimplementedReplicaServiceServer) UnmapMarkDiskChainRemovedSet(context.Context, *UnmapMarkDiskChainRemovedSetRequest) (*UnmapMarkDiskChainRemovedSetResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UnmapMarkDiskChainRemovedSet not implemented")
+}
+func (UnimplementedReplicaServiceServer) SnapshotMaxCountSet(context.Context, *SnapshotMaxCountSetRequest) (*SnapshotMaxCountSetResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotMaxCountSet not implemented")
+}
+func (UnimplementedReplicaServiceServer) SnapshotMaxSizeSet(context.Context, *SnapshotMaxSizeSetRequest) (*SnapshotMaxSizeSetResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotMaxSizeSet not implemented")
+}
+func (UnimplementedReplicaServiceServer) mustEmbedUnimplementedReplicaServiceServer() {}
+
+// UnsafeReplicaServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to ReplicaServiceServer will
+// result in compilation errors.
+type UnsafeReplicaServiceServer interface {
+	mustEmbedUnimplementedReplicaServiceServer()
+}
+
+func RegisterReplicaServiceServer(s grpc.ServiceRegistrar, srv ReplicaServiceServer) {
+	s.RegisterService(&ReplicaService_ServiceDesc, srv)
+}
+
+func _ReplicaService_ReplicaCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).ReplicaCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_ReplicaCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).ReplicaCreate(ctx, req.(*ReplicaCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_ReplicaDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).ReplicaDelete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_ReplicaDelete_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).ReplicaDelete(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_ReplicaGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).ReplicaGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_ReplicaGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).ReplicaGet(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_ReplicaOpen_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).ReplicaOpen(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_ReplicaOpen_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).ReplicaOpen(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_ReplicaClose_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).ReplicaClose(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_ReplicaClose_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).ReplicaClose(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_ReplicaReload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).ReplicaReload(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_ReplicaReload_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).ReplicaReload(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_ReplicaRevert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaRevertRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).ReplicaRevert(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_ReplicaRevert_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).ReplicaRevert(ctx, req.(*ReplicaRevertRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_ReplicaSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaSnapshotRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).ReplicaSnapshot(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_ReplicaSnapshot_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).ReplicaSnapshot(ctx, req.(*ReplicaSnapshotRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_ReplicaExpand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaExpandRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).ReplicaExpand(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_ReplicaExpand_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).ReplicaExpand(ctx, req.(*ReplicaExpandRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_DiskRemove_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DiskRemoveRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).DiskRemove(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_DiskRemove_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).DiskRemove(ctx, req.(*DiskRemoveRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_DiskReplace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DiskReplaceRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).DiskReplace(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_DiskReplace_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).DiskReplace(ctx, req.(*DiskReplaceRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_DiskPrepareRemove_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DiskPrepareRemoveRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).DiskPrepareRemove(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_DiskPrepareRemove_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).DiskPrepareRemove(ctx, req.(*DiskPrepareRemoveRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_DiskMarkAsRemoved_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DiskMarkAsRemovedRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).DiskMarkAsRemoved(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_DiskMarkAsRemoved_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).DiskMarkAsRemoved(ctx, req.(*DiskMarkAsRemovedRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_RebuildingSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(RebuildingSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).RebuildingSet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_RebuildingSet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).RebuildingSet(ctx, req.(*RebuildingSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_RevisionCounterSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(RevisionCounterSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).RevisionCounterSet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_RevisionCounterSet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).RevisionCounterSet(ctx, req.(*RevisionCounterSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_UnmapMarkDiskChainRemovedSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UnmapMarkDiskChainRemovedSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).UnmapMarkDiskChainRemovedSet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_UnmapMarkDiskChainRemovedSet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).UnmapMarkDiskChainRemovedSet(ctx, req.(*UnmapMarkDiskChainRemovedSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_SnapshotMaxCountSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SnapshotMaxCountSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).SnapshotMaxCountSet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_SnapshotMaxCountSet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).SnapshotMaxCountSet(ctx, req.(*SnapshotMaxCountSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReplicaService_SnapshotMaxSizeSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SnapshotMaxSizeSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReplicaServiceServer).SnapshotMaxSizeSet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ReplicaService_SnapshotMaxSizeSet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReplicaServiceServer).SnapshotMaxSizeSet(ctx, req.(*SnapshotMaxSizeSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// ReplicaService_ServiceDesc is the grpc.ServiceDesc for ReplicaService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var ReplicaService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "ptypes.ReplicaService",
+	HandlerType: (*ReplicaServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ReplicaCreate",
+			Handler:    _ReplicaService_ReplicaCreate_Handler,
+		},
+		{
+			MethodName: "ReplicaDelete",
+			Handler:    _ReplicaService_ReplicaDelete_Handler,
+		},
+		{
+			MethodName: "ReplicaGet",
+			Handler:    _ReplicaService_ReplicaGet_Handler,
+		},
+		{
+			MethodName: "ReplicaOpen",
+			Handler:    _ReplicaService_ReplicaOpen_Handler,
+		},
+		{
+			MethodName: "ReplicaClose",
+			Handler:    _ReplicaService_ReplicaClose_Handler,
+		},
+		{
+			MethodName: "ReplicaReload",
+			Handler:    _ReplicaService_ReplicaReload_Handler,
+		},
+		{
+			MethodName: "ReplicaRevert",
+			Handler:    _ReplicaService_ReplicaRevert_Handler,
+		},
+		{
+			MethodName: "ReplicaSnapshot",
+			Handler:    _ReplicaService_ReplicaSnapshot_Handler,
+		},
+		{
+			MethodName: "ReplicaExpand",
+			Handler:    _ReplicaService_ReplicaExpand_Handler,
+		},
+		{
+			MethodName: "DiskRemove",
+			Handler:    _ReplicaService_DiskRemove_Handler,
+		},
+		{
+			MethodName: "DiskReplace",
+			Handler:    _ReplicaService_DiskReplace_Handler,
+		},
+		{
+			MethodName: "DiskPrepareRemove",
+			Handler:    _ReplicaService_DiskPrepareRemove_Handler,
+		},
+		{
+			MethodName: "DiskMarkAsRemoved",
+			Handler:    _ReplicaService_DiskMarkAsRemoved_Handler,
+		},
+		{
+			MethodName: "RebuildingSet",
+			Handler:    _ReplicaService_RebuildingSet_Handler,
+		},
+		{
+			MethodName: "RevisionCounterSet",
+			Handler:    _ReplicaService_RevisionCounterSet_Handler,
+		},
+		{
+			MethodName: "UnmapMarkDiskChainRemovedSet",
+			Handler:    _ReplicaService_UnmapMarkDiskChainRemovedSet_Handler,
+		},
+		{
+			MethodName: "SnapshotMaxCountSet",
+			Handler:    _ReplicaService_SnapshotMaxCountSet_Handler,
+		},
+		{
+			MethodName: "SnapshotMaxSizeSet",
+			Handler:    _ReplicaService_SnapshotMaxSizeSet_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "ptypes/replica.proto",
+}
diff --git a/pkg/generated/enginerpc/syncagent.pb.go b/pkg/generated/enginerpc/syncagent.pb.go
new file mode 100644
index 0000000..2511648
--- /dev/null
+++ b/pkg/generated/enginerpc/syncagent.pb.go
@@ -0,0 +1,2448 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
+// source: ptypes/syncagent.proto
+
+package enginerpc
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type FileRemoveRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	FileName string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"`
+}
+
+func (x *FileRemoveRequest) Reset() {
+	*x = FileRemoveRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FileRemoveRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FileRemoveRequest) ProtoMessage() {}
+
+func (x *FileRemoveRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FileRemoveRequest.ProtoReflect.Descriptor instead.
+func (*FileRemoveRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *FileRemoveRequest) GetFileName() string {
+	if x != nil {
+		return x.FileName
+	}
+	return ""
+}
+
+type FileRenameRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	OldFileName string `protobuf:"bytes,1,opt,name=old_file_name,json=oldFileName,proto3" json:"old_file_name,omitempty"`
+	NewFileName string `protobuf:"bytes,2,opt,name=new_file_name,json=newFileName,proto3" json:"new_file_name,omitempty"`
+}
+
+func (x *FileRenameRequest) Reset() {
+	*x = FileRenameRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FileRenameRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FileRenameRequest) ProtoMessage() {}
+
+func (x *FileRenameRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FileRenameRequest.ProtoReflect.Descriptor instead.
+func (*FileRenameRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *FileRenameRequest) GetOldFileName() string {
+	if x != nil {
+		return x.OldFileName
+	}
+	return ""
+}
+
+func (x *FileRenameRequest) GetNewFileName() string {
+	if x != nil {
+		return x.NewFileName
+	}
+	return ""
+}
+
+type ReceiverLaunchRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ToFileName string `protobuf:"bytes,1,opt,name=to_file_name,json=toFileName,proto3" json:"to_file_name,omitempty"`
+}
+
+func (x *ReceiverLaunchRequest) Reset() {
+	*x = ReceiverLaunchRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReceiverLaunchRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReceiverLaunchRequest) ProtoMessage() {}
+
+func (x *ReceiverLaunchRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReceiverLaunchRequest.ProtoReflect.Descriptor instead.
+func (*ReceiverLaunchRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *ReceiverLaunchRequest) GetToFileName() string {
+	if x != nil {
+		return x.ToFileName
+	}
+	return ""
+}
+
+type ReceiverLaunchResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Port int32 `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"`
+}
+
+func (x *ReceiverLaunchResponse) Reset() {
+	*x = ReceiverLaunchResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReceiverLaunchResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReceiverLaunchResponse) ProtoMessage() {}
+
+func (x *ReceiverLaunchResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReceiverLaunchResponse.ProtoReflect.Descriptor instead.
+func (*ReceiverLaunchResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *ReceiverLaunchResponse) GetPort() int32 {
+	if x != nil {
+		return x.Port
+	}
+	return 0
+}
+
+type FileSendRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	FromFileName              string `protobuf:"bytes,1,opt,name=from_file_name,json=fromFileName,proto3" json:"from_file_name,omitempty"`
+	Host                      string `protobuf:"bytes,2,opt,name=host,proto3" json:"host,omitempty"`
+	Port                      int32  `protobuf:"varint,3,opt,name=port,proto3" json:"port,omitempty"`
+	FastSync                  bool   `protobuf:"varint,4,opt,name=fast_sync,json=fastSync,proto3" json:"fast_sync,omitempty"`
+	FileSyncHttpClientTimeout int32  `protobuf:"varint,5,opt,name=file_sync_http_client_timeout,json=fileSyncHttpClientTimeout,proto3" json:"file_sync_http_client_timeout,omitempty"`
+}
+
+func (x *FileSendRequest) Reset() {
+	*x = FileSendRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FileSendRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FileSendRequest) ProtoMessage() {}
+
+func (x *FileSendRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FileSendRequest.ProtoReflect.Descriptor instead.
+func (*FileSendRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *FileSendRequest) GetFromFileName() string {
+	if x != nil {
+		return x.FromFileName
+	}
+	return ""
+}
+
+func (x *FileSendRequest) GetHost() string {
+	if x != nil {
+		return x.Host
+	}
+	return ""
+}
+
+func (x *FileSendRequest) GetPort() int32 {
+	if x != nil {
+		return x.Port
+	}
+	return 0
+}
+
+func (x *FileSendRequest) GetFastSync() bool {
+	if x != nil {
+		return x.FastSync
+	}
+	return false
+}
+
+func (x *FileSendRequest) GetFileSyncHttpClientTimeout() int32 {
+	if x != nil {
+		return x.FileSyncHttpClientTimeout
+	}
+	return 0
+}
+
+type FilesSyncRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	FromAddress               string          `protobuf:"bytes,1,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty"`
+	ToHost                    string          `protobuf:"bytes,2,opt,name=to_host,json=toHost,proto3" json:"to_host,omitempty"`
+	SyncFileInfoList          []*SyncFileInfo `protobuf:"bytes,3,rep,name=sync_file_info_list,json=syncFileInfoList,proto3" json:"sync_file_info_list,omitempty"`
+	FastSync                  bool            `protobuf:"varint,4,opt,name=fast_sync,json=fastSync,proto3" json:"fast_sync,omitempty"`
+	FileSyncHttpClientTimeout int32           `protobuf:"varint,5,opt,name=file_sync_http_client_timeout,json=fileSyncHttpClientTimeout,proto3" json:"file_sync_http_client_timeout,omitempty"`
+}
+
+func (x *FilesSyncRequest) Reset() {
+	*x = FilesSyncRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FilesSyncRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FilesSyncRequest) ProtoMessage() {}
+
+func (x *FilesSyncRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FilesSyncRequest.ProtoReflect.Descriptor instead.
+func (*FilesSyncRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *FilesSyncRequest) GetFromAddress() string {
+	if x != nil {
+		return x.FromAddress
+	}
+	return ""
+}
+
+func (x *FilesSyncRequest) GetToHost() string {
+	if x != nil {
+		return x.ToHost
+	}
+	return ""
+}
+
+func (x *FilesSyncRequest) GetSyncFileInfoList() []*SyncFileInfo {
+	if x != nil {
+		return x.SyncFileInfoList
+	}
+	return nil
+}
+
+func (x *FilesSyncRequest) GetFastSync() bool {
+	if x != nil {
+		return x.FastSync
+	}
+	return false
+}
+
+func (x *FilesSyncRequest) GetFileSyncHttpClientTimeout() int32 {
+	if x != nil {
+		return x.FileSyncHttpClientTimeout
+	}
+	return 0
+}
+
+type SnapshotCloneRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	FromAddress               string `protobuf:"bytes,1,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty"`
+	ToHost                    string `protobuf:"bytes,2,opt,name=to_host,json=toHost,proto3" json:"to_host,omitempty"`
+	SnapshotFileName          string `protobuf:"bytes,3,opt,name=snapshot_file_name,json=snapshotFileName,proto3" json:"snapshot_file_name,omitempty"`
+	ExportBackingImageIfExist bool   `protobuf:"varint,4,opt,name=export_backing_image_if_exist,json=exportBackingImageIfExist,proto3" json:"export_backing_image_if_exist,omitempty"`
+	FileSyncHttpClientTimeout int32  `protobuf:"varint,5,opt,name=file_sync_http_client_timeout,json=fileSyncHttpClientTimeout,proto3" json:"file_sync_http_client_timeout,omitempty"`
+	FromVolumeName            string `protobuf:"bytes,6,opt,name=from_volume_name,json=fromVolumeName,proto3" json:"from_volume_name,omitempty"`
+}
+
+func (x *SnapshotCloneRequest) Reset() {
+	*x = SnapshotCloneRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SnapshotCloneRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SnapshotCloneRequest) ProtoMessage() {}
+
+func (x *SnapshotCloneRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SnapshotCloneRequest.ProtoReflect.Descriptor instead.
+func (*SnapshotCloneRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *SnapshotCloneRequest) GetFromAddress() string {
+	if x != nil {
+		return x.FromAddress
+	}
+	return ""
+}
+
+func (x *SnapshotCloneRequest) GetToHost() string {
+	if x != nil {
+		return x.ToHost
+	}
+	return ""
+}
+
+func (x *SnapshotCloneRequest) GetSnapshotFileName() string {
+	if x != nil {
+		return x.SnapshotFileName
+	}
+	return ""
+}
+
+func (x *SnapshotCloneRequest) GetExportBackingImageIfExist() bool {
+	if x != nil {
+		return x.ExportBackingImageIfExist
+	}
+	return false
+}
+
+func (x *SnapshotCloneRequest) GetFileSyncHttpClientTimeout() int32 {
+	if x != nil {
+		return x.FileSyncHttpClientTimeout
+	}
+	return 0
+}
+
+func (x *SnapshotCloneRequest) GetFromVolumeName() string {
+	if x != nil {
+		return x.FromVolumeName
+	}
+	return ""
+}
+
+type VolumeExportRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SnapshotFileName          string `protobuf:"bytes,1,opt,name=snapshot_file_name,json=snapshotFileName,proto3" json:"snapshot_file_name,omitempty"`
+	Host                      string `protobuf:"bytes,2,opt,name=host,proto3" json:"host,omitempty"`
+	Port                      int32  `protobuf:"varint,3,opt,name=port,proto3" json:"port,omitempty"`
+	ExportBackingImageIfExist bool   `protobuf:"varint,4,opt,name=export_backing_image_if_exist,json=exportBackingImageIfExist,proto3" json:"export_backing_image_if_exist,omitempty"`
+	FileSyncHttpClientTimeout int32  `protobuf:"varint,5,opt,name=file_sync_http_client_timeout,json=fileSyncHttpClientTimeout,proto3" json:"file_sync_http_client_timeout,omitempty"`
+}
+
+func (x *VolumeExportRequest) Reset() {
+	*x = VolumeExportRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VolumeExportRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VolumeExportRequest) ProtoMessage() {}
+
+func (x *VolumeExportRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VolumeExportRequest.ProtoReflect.Descriptor instead.
+func (*VolumeExportRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *VolumeExportRequest) GetSnapshotFileName() string {
+	if x != nil {
+		return x.SnapshotFileName
+	}
+	return ""
+}
+
+func (x *VolumeExportRequest) GetHost() string {
+	if x != nil {
+		return x.Host
+	}
+	return ""
+}
+
+func (x *VolumeExportRequest) GetPort() int32 {
+	if x != nil {
+		return x.Port
+	}
+	return 0
+}
+
+func (x *VolumeExportRequest) GetExportBackingImageIfExist() bool {
+	if x != nil {
+		return x.ExportBackingImageIfExist
+	}
+	return false
+}
+
+func (x *VolumeExportRequest) GetFileSyncHttpClientTimeout() int32 {
+	if x != nil {
+		return x.FileSyncHttpClientTimeout
+	}
+	return 0
+}
+
+type BackupCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SnapshotFileName     string            `protobuf:"bytes,1,opt,name=snapshot_file_name,json=snapshotFileName,proto3" json:"snapshot_file_name,omitempty"`
+	BackupTarget         string            `protobuf:"bytes,2,opt,name=backup_target,json=backupTarget,proto3" json:"backup_target,omitempty"`
+	VolumeName           string            `protobuf:"bytes,3,opt,name=volume_name,json=volumeName,proto3" json:"volume_name,omitempty"`
+	Labels               []string          `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"`
+	Credential           map[string]string `protobuf:"bytes,5,rep,name=credential,proto3" json:"credential,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	BackingImageName     string            `protobuf:"bytes,6,opt,name=backing_image_name,json=backingImageName,proto3" json:"backing_image_name,omitempty"`
+	BackingImageChecksum string            `protobuf:"bytes,7,opt,name=backing_image_checksum,json=backingImageChecksum,proto3" json:"backing_image_checksum,omitempty"`
+	BackupName           string            `protobuf:"bytes,8,opt,name=backup_name,json=backupName,proto3" json:"backup_name,omitempty"`
+	CompressionMethod    string            `protobuf:"bytes,9,opt,name=compression_method,json=compressionMethod,proto3" json:"compression_method,omitempty"`
+	ConcurrentLimit      int32             `protobuf:"varint,10,opt,name=concurrent_limit,json=concurrentLimit,proto3" json:"concurrent_limit,omitempty"`
+	StorageClassName     string            `protobuf:"bytes,11,opt,name=storage_class_name,json=storageClassName,proto3" json:"storage_class_name,omitempty"`
+}
+
+func (x *BackupCreateRequest) Reset() {
+	*x = BackupCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackupCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackupCreateRequest) ProtoMessage() {}
+
+func (x *BackupCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackupCreateRequest.ProtoReflect.Descriptor instead.
+func (*BackupCreateRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *BackupCreateRequest) GetSnapshotFileName() string {
+	if x != nil {
+		return x.SnapshotFileName
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetBackupTarget() string {
+	if x != nil {
+		return x.BackupTarget
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetVolumeName() string {
+	if x != nil {
+		return x.VolumeName
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetLabels() []string {
+	if x != nil {
+		return x.Labels
+	}
+	return nil
+}
+
+func (x *BackupCreateRequest) GetCredential() map[string]string {
+	if x != nil {
+		return x.Credential
+	}
+	return nil
+}
+
+func (x *BackupCreateRequest) GetBackingImageName() string {
+	if x != nil {
+		return x.BackingImageName
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetBackingImageChecksum() string {
+	if x != nil {
+		return x.BackingImageChecksum
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetBackupName() string {
+	if x != nil {
+		return x.BackupName
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetCompressionMethod() string {
+	if x != nil {
+		return x.CompressionMethod
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetConcurrentLimit() int32 {
+	if x != nil {
+		return x.ConcurrentLimit
+	}
+	return 0
+}
+
+func (x *BackupCreateRequest) GetStorageClassName() string {
+	if x != nil {
+		return x.StorageClassName
+	}
+	return ""
+}
+
+type BackupCreateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Backup        string `protobuf:"bytes,1,opt,name=backup,proto3" json:"backup,omitempty"`
+	IsIncremental bool   `protobuf:"varint,2,opt,name=is_incremental,json=isIncremental,proto3" json:"is_incremental,omitempty"`
+}
+
+func (x *BackupCreateResponse) Reset() {
+	*x = BackupCreateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackupCreateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackupCreateResponse) ProtoMessage() {}
+
+func (x *BackupCreateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackupCreateResponse.ProtoReflect.Descriptor instead.
+func (*BackupCreateResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *BackupCreateResponse) GetBackup() string {
+	if x != nil {
+		return x.Backup
+	}
+	return ""
+}
+
+func (x *BackupCreateResponse) GetIsIncremental() bool {
+	if x != nil {
+		return x.IsIncremental
+	}
+	return false
+}
+
+type BackupRemoveRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Backup string `protobuf:"bytes,1,opt,name=backup,proto3" json:"backup,omitempty"`
+}
+
+func (x *BackupRemoveRequest) Reset() {
+	*x = BackupRemoveRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackupRemoveRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackupRemoveRequest) ProtoMessage() {}
+
+func (x *BackupRemoveRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackupRemoveRequest.ProtoReflect.Descriptor instead.
+func (*BackupRemoveRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *BackupRemoveRequest) GetBackup() string {
+	if x != nil {
+		return x.Backup
+	}
+	return ""
+}
+
+type BackupStatusRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Backup string `protobuf:"bytes,1,opt,name=backup,proto3" json:"backup,omitempty"`
+}
+
+func (x *BackupStatusRequest) Reset() {
+	*x = BackupStatusRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackupStatusRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackupStatusRequest) ProtoMessage() {}
+
+func (x *BackupStatusRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackupStatusRequest.ProtoReflect.Descriptor instead.
+func (*BackupStatusRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *BackupStatusRequest) GetBackup() string {
+	if x != nil {
+		return x.Backup
+	}
+	return ""
+}
+
+type BackupStatusResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Progress     int32  `protobuf:"varint,1,opt,name=progress,proto3" json:"progress,omitempty"`
+	BackupUrl    string `protobuf:"bytes,2,opt,name=backup_url,json=backupUrl,proto3" json:"backup_url,omitempty"`
+	Error        string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"`
+	SnapshotName string `protobuf:"bytes,4,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+	State        string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"`
+}
+
+func (x *BackupStatusResponse) Reset() {
+	*x = BackupStatusResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackupStatusResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackupStatusResponse) ProtoMessage() {}
+
+func (x *BackupStatusResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackupStatusResponse.ProtoReflect.Descriptor instead.
+func (*BackupStatusResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *BackupStatusResponse) GetProgress() int32 {
+	if x != nil {
+		return x.Progress
+	}
+	return 0
+}
+
+func (x *BackupStatusResponse) GetBackupUrl() string {
+	if x != nil {
+		return x.BackupUrl
+	}
+	return ""
+}
+
+func (x *BackupStatusResponse) GetError() string {
+	if x != nil {
+		return x.Error
+	}
+	return ""
+}
+
+func (x *BackupStatusResponse) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+func (x *BackupStatusResponse) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+type BackupRestoreRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Backup           string            `protobuf:"bytes,1,opt,name=backup,proto3" json:"backup,omitempty"`
+	SnapshotDiskName string            `protobuf:"bytes,2,opt,name=snapshot_disk_name,json=snapshotDiskName,proto3" json:"snapshot_disk_name,omitempty"`
+	Credential       map[string]string `protobuf:"bytes,3,rep,name=credential,proto3" json:"credential,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	ConcurrentLimit  int32             `protobuf:"varint,4,opt,name=concurrent_limit,json=concurrentLimit,proto3" json:"concurrent_limit,omitempty"`
+}
+
+func (x *BackupRestoreRequest) Reset() {
+	*x = BackupRestoreRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackupRestoreRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackupRestoreRequest) ProtoMessage() {}
+
+func (x *BackupRestoreRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackupRestoreRequest.ProtoReflect.Descriptor instead.
+func (*BackupRestoreRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *BackupRestoreRequest) GetBackup() string {
+	if x != nil {
+		return x.Backup
+	}
+	return ""
+}
+
+func (x *BackupRestoreRequest) GetSnapshotDiskName() string {
+	if x != nil {
+		return x.SnapshotDiskName
+	}
+	return ""
+}
+
+func (x *BackupRestoreRequest) GetCredential() map[string]string {
+	if x != nil {
+		return x.Credential
+	}
+	return nil
+}
+
+func (x *BackupRestoreRequest) GetConcurrentLimit() int32 {
+	if x != nil {
+		return x.ConcurrentLimit
+	}
+	return 0
+}
+
+type BackupRestoreIncrementallyRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Backup                 string            `protobuf:"bytes,1,opt,name=backup,proto3" json:"backup,omitempty"`
+	DeltaFileName          string            `protobuf:"bytes,2,opt,name=delta_file_name,json=deltaFileName,proto3" json:"delta_file_name,omitempty"`
+	LastRestoredBackupName string            `protobuf:"bytes,3,opt,name=last_restored_backup_name,json=lastRestoredBackupName,proto3" json:"last_restored_backup_name,omitempty"`
+	SnapshotDiskName       string            `protobuf:"bytes,4,opt,name=snapshot_disk_name,json=snapshotDiskName,proto3" json:"snapshot_disk_name,omitempty"`
+	Credential             map[string]string `protobuf:"bytes,5,rep,name=credential,proto3" json:"credential,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	ConcurrentLimit        int32             `protobuf:"varint,6,opt,name=concurrent_limit,json=concurrentLimit,proto3" json:"concurrent_limit,omitempty"`
+}
+
+func (x *BackupRestoreIncrementallyRequest) Reset() {
+	*x = BackupRestoreIncrementallyRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackupRestoreIncrementallyRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackupRestoreIncrementallyRequest) ProtoMessage() {}
+
+func (x *BackupRestoreIncrementallyRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackupRestoreIncrementallyRequest.ProtoReflect.Descriptor instead.
+func (*BackupRestoreIncrementallyRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *BackupRestoreIncrementallyRequest) GetBackup() string {
+	if x != nil {
+		return x.Backup
+	}
+	return ""
+}
+
+func (x *BackupRestoreIncrementallyRequest) GetDeltaFileName() string {
+	if x != nil {
+		return x.DeltaFileName
+	}
+	return ""
+}
+
+func (x *BackupRestoreIncrementallyRequest) GetLastRestoredBackupName() string {
+	if x != nil {
+		return x.LastRestoredBackupName
+	}
+	return ""
+}
+
+func (x *BackupRestoreIncrementallyRequest) GetSnapshotDiskName() string {
+	if x != nil {
+		return x.SnapshotDiskName
+	}
+	return ""
+}
+
+func (x *BackupRestoreIncrementallyRequest) GetCredential() map[string]string {
+	if x != nil {
+		return x.Credential
+	}
+	return nil
+}
+
+func (x *BackupRestoreIncrementallyRequest) GetConcurrentLimit() int32 {
+	if x != nil {
+		return x.ConcurrentLimit
+	}
+	return 0
+}
+
+type RestoreStatusResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IsRestoring            bool   `protobuf:"varint,1,opt,name=is_restoring,json=isRestoring,proto3" json:"is_restoring,omitempty"`
+	LastRestored           string `protobuf:"bytes,2,opt,name=last_restored,json=lastRestored,proto3" json:"last_restored,omitempty"`
+	Progress               int32  `protobuf:"varint,3,opt,name=progress,proto3" json:"progress,omitempty"`
+	Error                  string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"`
+	DestFileName           string `protobuf:"bytes,5,opt,name=dest_file_name,json=destFileName,proto3" json:"dest_file_name,omitempty"`
+	State                  string `protobuf:"bytes,6,opt,name=state,proto3" json:"state,omitempty"`
+	BackupUrl              string `protobuf:"bytes,7,opt,name=backup_url,json=backupUrl,proto3" json:"backup_url,omitempty"`
+	CurrentRestoringBackup string `protobuf:"bytes,8,opt,name=current_restoring_backup,json=currentRestoringBackup,proto3" json:"current_restoring_backup,omitempty"`
+}
+
+func (x *RestoreStatusResponse) Reset() {
+	*x = RestoreStatusResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RestoreStatusResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RestoreStatusResponse) ProtoMessage() {}
+
+func (x *RestoreStatusResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RestoreStatusResponse.ProtoReflect.Descriptor instead.
+func (*RestoreStatusResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *RestoreStatusResponse) GetIsRestoring() bool {
+	if x != nil {
+		return x.IsRestoring
+	}
+	return false
+}
+
+func (x *RestoreStatusResponse) GetLastRestored() string {
+	if x != nil {
+		return x.LastRestored
+	}
+	return ""
+}
+
+func (x *RestoreStatusResponse) GetProgress() int32 {
+	if x != nil {
+		return x.Progress
+	}
+	return 0
+}
+
+func (x *RestoreStatusResponse) GetError() string {
+	if x != nil {
+		return x.Error
+	}
+	return ""
+}
+
+func (x *RestoreStatusResponse) GetDestFileName() string {
+	if x != nil {
+		return x.DestFileName
+	}
+	return ""
+}
+
+func (x *RestoreStatusResponse) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+func (x *RestoreStatusResponse) GetBackupUrl() string {
+	if x != nil {
+		return x.BackupUrl
+	}
+	return ""
+}
+
+func (x *RestoreStatusResponse) GetCurrentRestoringBackup() string {
+	if x != nil {
+		return x.CurrentRestoringBackup
+	}
+	return ""
+}
+
+type SnapshotPurgeStatusResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IsPurging bool   `protobuf:"varint,1,opt,name=is_purging,json=isPurging,proto3" json:"is_purging,omitempty"`
+	Error     string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"`
+	Progress  int32  `protobuf:"varint,3,opt,name=progress,proto3" json:"progress,omitempty"`
+	State     string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"`
+}
+
+func (x *SnapshotPurgeStatusResponse) Reset() {
+	*x = SnapshotPurgeStatusResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SnapshotPurgeStatusResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SnapshotPurgeStatusResponse) ProtoMessage() {}
+
+func (x *SnapshotPurgeStatusResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SnapshotPurgeStatusResponse.ProtoReflect.Descriptor instead.
+func (*SnapshotPurgeStatusResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *SnapshotPurgeStatusResponse) GetIsPurging() bool {
+	if x != nil {
+		return x.IsPurging
+	}
+	return false
+}
+
+func (x *SnapshotPurgeStatusResponse) GetError() string {
+	if x != nil {
+		return x.Error
+	}
+	return ""
+}
+
+func (x *SnapshotPurgeStatusResponse) GetProgress() int32 {
+	if x != nil {
+		return x.Progress
+	}
+	return 0
+}
+
+func (x *SnapshotPurgeStatusResponse) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+type ReplicaRebuildStatusResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IsRebuilding       bool   `protobuf:"varint,1,opt,name=is_rebuilding,json=isRebuilding,proto3" json:"is_rebuilding,omitempty"`
+	Error              string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"`
+	Progress           int32  `protobuf:"varint,3,opt,name=progress,proto3" json:"progress,omitempty"`
+	State              string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"`
+	FromReplicaAddress string `protobuf:"bytes,5,opt,name=from_replica_address,json=fromReplicaAddress,proto3" json:"from_replica_address,omitempty"`
+}
+
+func (x *ReplicaRebuildStatusResponse) Reset() {
+	*x = ReplicaRebuildStatusResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaRebuildStatusResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaRebuildStatusResponse) ProtoMessage() {}
+
+func (x *ReplicaRebuildStatusResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaRebuildStatusResponse.ProtoReflect.Descriptor instead.
+func (*ReplicaRebuildStatusResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *ReplicaRebuildStatusResponse) GetIsRebuilding() bool {
+	if x != nil {
+		return x.IsRebuilding
+	}
+	return false
+}
+
+func (x *ReplicaRebuildStatusResponse) GetError() string {
+	if x != nil {
+		return x.Error
+	}
+	return ""
+}
+
+func (x *ReplicaRebuildStatusResponse) GetProgress() int32 {
+	if x != nil {
+		return x.Progress
+	}
+	return 0
+}
+
+func (x *ReplicaRebuildStatusResponse) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+func (x *ReplicaRebuildStatusResponse) GetFromReplicaAddress() string {
+	if x != nil {
+		return x.FromReplicaAddress
+	}
+	return ""
+}
+
+type SnapshotCloneStatusResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IsCloning          bool   `protobuf:"varint,1,opt,name=is_cloning,json=isCloning,proto3" json:"is_cloning,omitempty"`
+	Error              string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"`
+	Progress           int32  `protobuf:"varint,3,opt,name=progress,proto3" json:"progress,omitempty"`
+	State              string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"`
+	FromReplicaAddress string `protobuf:"bytes,5,opt,name=from_replica_address,json=fromReplicaAddress,proto3" json:"from_replica_address,omitempty"`
+	SnapshotName       string `protobuf:"bytes,6,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+}
+
+func (x *SnapshotCloneStatusResponse) Reset() {
+	*x = SnapshotCloneStatusResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SnapshotCloneStatusResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SnapshotCloneStatusResponse) ProtoMessage() {}
+
+func (x *SnapshotCloneStatusResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SnapshotCloneStatusResponse.ProtoReflect.Descriptor instead.
+func (*SnapshotCloneStatusResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *SnapshotCloneStatusResponse) GetIsCloning() bool {
+	if x != nil {
+		return x.IsCloning
+	}
+	return false
+}
+
+func (x *SnapshotCloneStatusResponse) GetError() string {
+	if x != nil {
+		return x.Error
+	}
+	return ""
+}
+
+func (x *SnapshotCloneStatusResponse) GetProgress() int32 {
+	if x != nil {
+		return x.Progress
+	}
+	return 0
+}
+
+func (x *SnapshotCloneStatusResponse) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+func (x *SnapshotCloneStatusResponse) GetFromReplicaAddress() string {
+	if x != nil {
+		return x.FromReplicaAddress
+	}
+	return ""
+}
+
+func (x *SnapshotCloneStatusResponse) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+type SnapshotHashRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SnapshotName string `protobuf:"bytes,1,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+	Rehash       bool   `protobuf:"varint,2,opt,name=rehash,proto3" json:"rehash,omitempty"`
+}
+
+func (x *SnapshotHashRequest) Reset() {
+	*x = SnapshotHashRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SnapshotHashRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SnapshotHashRequest) ProtoMessage() {}
+
+func (x *SnapshotHashRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SnapshotHashRequest.ProtoReflect.Descriptor instead.
+func (*SnapshotHashRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *SnapshotHashRequest) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+func (x *SnapshotHashRequest) GetRehash() bool {
+	if x != nil {
+		return x.Rehash
+	}
+	return false
+}
+
+type SnapshotHashStatusRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SnapshotName string `protobuf:"bytes,1,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+}
+
+func (x *SnapshotHashStatusRequest) Reset() {
+	*x = SnapshotHashStatusRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SnapshotHashStatusRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SnapshotHashStatusRequest) ProtoMessage() {}
+
+func (x *SnapshotHashStatusRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SnapshotHashStatusRequest.ProtoReflect.Descriptor instead.
+func (*SnapshotHashStatusRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *SnapshotHashStatusRequest) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+type SnapshotHashStatusResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	State             string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"`
+	Checksum          string `protobuf:"bytes,2,opt,name=checksum,proto3" json:"checksum,omitempty"`
+	Error             string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"`
+	SilentlyCorrupted bool   `protobuf:"varint,4,opt,name=silently_corrupted,json=silentlyCorrupted,proto3" json:"silently_corrupted,omitempty"`
+}
+
+func (x *SnapshotHashStatusResponse) Reset() {
+	*x = SnapshotHashStatusResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SnapshotHashStatusResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SnapshotHashStatusResponse) ProtoMessage() {}
+
+func (x *SnapshotHashStatusResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SnapshotHashStatusResponse.ProtoReflect.Descriptor instead.
+func (*SnapshotHashStatusResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *SnapshotHashStatusResponse) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+func (x *SnapshotHashStatusResponse) GetChecksum() string {
+	if x != nil {
+		return x.Checksum
+	}
+	return ""
+}
+
+func (x *SnapshotHashStatusResponse) GetError() string {
+	if x != nil {
+		return x.Error
+	}
+	return ""
+}
+
+func (x *SnapshotHashStatusResponse) GetSilentlyCorrupted() bool {
+	if x != nil {
+		return x.SilentlyCorrupted
+	}
+	return false
+}
+
+type SnapshotHashCancelRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SnapshotName string `protobuf:"bytes,1,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+}
+
+func (x *SnapshotHashCancelRequest) Reset() {
+	*x = SnapshotHashCancelRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SnapshotHashCancelRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SnapshotHashCancelRequest) ProtoMessage() {}
+
+func (x *SnapshotHashCancelRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SnapshotHashCancelRequest.ProtoReflect.Descriptor instead.
+func (*SnapshotHashCancelRequest) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *SnapshotHashCancelRequest) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+type SnapshotHashLockStateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IsLocked bool `protobuf:"varint,1,opt,name=is_locked,json=isLocked,proto3" json:"is_locked,omitempty"`
+}
+
+func (x *SnapshotHashLockStateResponse) Reset() {
+	*x = SnapshotHashLockStateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_ptypes_syncagent_proto_msgTypes[23]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SnapshotHashLockStateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SnapshotHashLockStateResponse) ProtoMessage() {}
+
+func (x *SnapshotHashLockStateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_ptypes_syncagent_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SnapshotHashLockStateResponse.ProtoReflect.Descriptor instead.
+func (*SnapshotHashLockStateResponse) Descriptor() ([]byte, []int) {
+	return file_ptypes_syncagent_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *SnapshotHashLockStateResponse) GetIsLocked() bool {
+	if x != nil {
+		return x.IsLocked
+	}
+	return false
+}
+
+var File_ptypes_syncagent_proto protoreflect.FileDescriptor
+
+var file_ptypes_syncagent_proto_rawDesc = []byte{
+	0x0a, 0x16, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x61, 0x67, 0x65,
+	0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73,
+	0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x70,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x22, 0x30, 0x0a, 0x11, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f,
+	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65,
+	0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5b, 0x0a, 0x11, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x6e, 0x61,
+	0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x6f, 0x6c, 0x64,
+	0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a,
+	0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d,
+	0x65, 0x22, 0x39, 0x0a, 0x15, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x4c, 0x61, 0x75,
+	0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x74, 0x6f,
+	0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0a, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x0a, 0x16,
+	0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xbe, 0x01, 0x0a, 0x0f, 0x46,
+	0x69, 0x6c, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24,
+	0x0a, 0x0e, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x6c, 0x65,
+	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09,
+	0x66, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52,
+	0x08, 0x66, 0x61, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x40, 0x0a, 0x1d, 0x66, 0x69, 0x6c,
+	0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6c, 0x69, 0x65,
+	0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05,
+	0x52, 0x19, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6c,
+	0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xf2, 0x01, 0x0a, 0x10,
+	0x46, 0x69, 0x6c, 0x65, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x64, 0x64, 0x72,
+	0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x13,
+	0x73, 0x79, 0x6e, 0x63, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6c,
+	0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52,
+	0x10, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x4c, 0x69, 0x73,
+	0x74, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x66, 0x61, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x40,
+	0x0a, 0x1d, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x68, 0x74, 0x74, 0x70,
+	0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x48,
+	0x74, 0x74, 0x70, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,
+	0x22, 0xae, 0x02, 0x0a, 0x14, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x6f,
+	0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x6f,
+	0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07,
+	0x74, 0x6f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74,
+	0x6f, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x10, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4e,
+	0x61, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x62, 0x61,
+	0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x66, 0x5f, 0x65,
+	0x78, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x65, 0x78, 0x70, 0x6f,
+	0x72, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x66,
+	0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x1d, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79,
+	0x6e, 0x63, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74,
+	0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x66, 0x69,
+	0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74,
+	0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x72, 0x6f, 0x6d, 0x5f,
+	0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0e, 0x66, 0x72, 0x6f, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d,
+	0x65, 0x22, 0xef, 0x01, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x6f,
+	0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x46,
+	0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70,
+	0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12,
+	0x40, 0x0a, 0x1d, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+	0x67, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x66, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x61,
+	0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x66, 0x45, 0x78, 0x69, 0x73,
+	0x74, 0x12, 0x40, 0x0a, 0x1d, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x68,
+	0x74, 0x74, 0x70, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f,
+	0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x79,
+	0x6e, 0x63, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65,
+	0x6f, 0x75, 0x74, 0x22, 0xba, 0x04, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73,
+	0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x63,
+	0x6b, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1f,
+	0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12,
+	0x16, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52,
+	0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x4b, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65,
+	0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74,
+	0x69, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e,
+	0x74, 0x69, 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f,
+	0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x10, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x61,
+	0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6d,
+	0x61, 0x67, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x14, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65,
+	0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b,
+	0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62,
+	0x61, 0x63, 0x6b, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x6f, 0x6d,
+	0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18,
+	0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69,
+	0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x63,
+	0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, 0x01,
+	0x28, 0x05, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x69,
+	0x6d, 0x69, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63,
+	0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x10, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d,
+	0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 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, 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, 0x55, 0x0a, 0x14, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x61, 0x63, 0x6b,
+	0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70,
+	0x12, 0x25, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+	0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x49, 0x6e, 0x63, 0x72,
+	0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x22, 0x2d, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x75,
+	0x70, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16,
+	0x0a, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+	0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x22, 0x2d, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70,
+	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a,
+	0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62,
+	0x61, 0x63, 0x6b, 0x75, 0x70, 0x22, 0xa2, 0x01, 0x0a, 0x14, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70,
+	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a,
+	0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,
+	0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61,
+	0x63, 0x6b, 0x75, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+	0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72,
+	0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12,
+	0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
+	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x94, 0x02, 0x0a, 0x14, 0x42,
+	0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2c, 0x0a, 0x12, 0x73,
+	0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x44, 0x69, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x72, 0x65,
+	0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e,
+	0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73,
+	0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x64,
+	0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x63, 0x72, 0x65,
+	0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x63, 0x75,
+	0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x05, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6d,
+	0x69, 0x74, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 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, 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, 0x91, 0x03, 0x0a, 0x21, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74,
+	0x6f, 0x72, 0x65, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x79,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75,
+	0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12,
+	0x26, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x46,
+	0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x19, 0x6c, 0x61, 0x73, 0x74, 0x5f,
+	0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f,
+	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74,
+	0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4e, 0x61,
+	0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x64,
+	0x69, 0x73, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10,
+	0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65,
+	0x12, 0x59, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x05,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x42, 0x61,
+	0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x63, 0x72, 0x65,
+	0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e,
+	0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
+	0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x63,
+	0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e,
+	0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e,
+	0x74, 0x69, 0x61, 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, 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, 0xa6, 0x02, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72,
+	0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x69,
+	0x6e, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f,
+	0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x52,
+	0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72,
+	0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72,
+	0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x65, 0x73,
+	0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12,
+	0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f,
+	0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x75,
+	0x70, 0x55, 0x72, 0x6c, 0x12, 0x38, 0x0a, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f,
+	0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70,
+	0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52,
+	0x65, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x22, 0x84,
+	0x01, 0x0a, 0x1b, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x75, 0x72, 0x67, 0x65,
+	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d,
+	0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x75, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x75, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a,
+	0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72,
+	0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12,
+	0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69,
+	0x73, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x65,
+	0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f,
+	0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a,
+	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x12, 0x66, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64,
+	0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xdb, 0x01, 0x0a, 0x1b, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68,
+	0x6f, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x63, 0x6c, 0x6f, 0x6e,
+	0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x43, 0x6c, 0x6f,
+	0x6e, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72,
+	0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72,
+	0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x14,
+	0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x61, 0x64, 0x64,
+	0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x72, 0x6f, 0x6d,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x23,
+	0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e,
+	0x61, 0x6d, 0x65, 0x22, 0x52, 0x0a, 0x13, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48,
+	0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12,
+	0x16, 0x0a, 0x06, 0x72, 0x65, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52,
+	0x06, 0x72, 0x65, 0x68, 0x61, 0x73, 0x68, 0x22, 0x40, 0x0a, 0x19, 0x53, 0x6e, 0x61, 0x70, 0x73,
+	0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
+	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x1a, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a,
+	0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72,
+	0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
+	0x12, 0x2d, 0x0a, 0x12, 0x73, 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x72,
+	0x72, 0x75, 0x70, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x73, 0x69,
+	0x6c, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x43, 0x6f, 0x72, 0x72, 0x75, 0x70, 0x74, 0x65, 0x64, 0x22,
+	0x40, 0x0a, 0x19, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x43,
+	0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d,
+	0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d,
+	0x65, 0x22, 0x3c, 0x0a, 0x1d, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73,
+	0x68, 0x4c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x32,
+	0xc4, 0x0c, 0x0a, 0x10, 0x53, 0x79, 0x6e, 0x63, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x6d, 0x6f,
+	0x76, 0x65, 0x12, 0x19, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65,
+	0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x52,
+	0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x46,
+	0x69, 0x6c, 0x65, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x08, 0x46, 0x69,
+	0x6c, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x09, 0x46, 0x69, 0x6c,
+	0x65, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x18, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x46, 0x69, 0x6c, 0x65, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0d, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x12, 0x1c, 0x2e, 0x70, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x6f,
+	0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x78, 0x70,
+	0x6f, 0x72, 0x74, 0x12, 0x1b, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c,
+	0x75, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0e, 0x52, 0x65,
+	0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x12, 0x1d, 0x2e, 0x70,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x4c, 0x61,
+	0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x70, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x4c, 0x61, 0x75,
+	0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a,
+	0x0c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x2e,
+	0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x70, 0x74, 0x79,
+	0x70, 0x65, 0x73, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0c, 0x42, 0x61,
+	0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x1b, 0x2e, 0x70, 0x74, 0x79,
+	0x70, 0x65, 0x73, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
+	0x00, 0x12, 0x47, 0x0a, 0x0d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f,
+	0x72, 0x65, 0x12, 0x1c, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x42, 0x61, 0x63, 0x6b,
+	0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0c, 0x42, 0x61,
+	0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x2e, 0x70, 0x74, 0x79,
+	0x70, 0x65, 0x73, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73,
+	0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x39, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74,
+	0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
+	0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x70, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0d,
+	0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x75, 0x72, 0x67, 0x65, 0x12, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12,
+	0x54, 0x0a, 0x13, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x75, 0x72, 0x67, 0x65,
+	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23,
+	0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
+	0x50, 0x75, 0x72, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x14, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x24, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a,
+	0x13, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x70,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6c,
+	0x6f, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48,
+	0x61, 0x73, 0x68, 0x12, 0x1b, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x21, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68,
+	0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x12, 0x53, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x12,
+	0x21, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x48, 0x61, 0x73, 0x68, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x15,
+	0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x4c, 0x6f, 0x63, 0x6b,
+	0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e,
+	0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48,
+	0x61, 0x73, 0x68, 0x4c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x68, 0x6f, 0x72, 0x6e, 0x2f, 0x74, 0x79,
+	0x70, 0x65, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
+	0x64, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x33,
+}
+
+var (
+	file_ptypes_syncagent_proto_rawDescOnce sync.Once
+	file_ptypes_syncagent_proto_rawDescData = file_ptypes_syncagent_proto_rawDesc
+)
+
+func file_ptypes_syncagent_proto_rawDescGZIP() []byte {
+	file_ptypes_syncagent_proto_rawDescOnce.Do(func() {
+		file_ptypes_syncagent_proto_rawDescData = protoimpl.X.CompressGZIP(file_ptypes_syncagent_proto_rawDescData)
+	})
+	return file_ptypes_syncagent_proto_rawDescData
+}
+
+var file_ptypes_syncagent_proto_msgTypes = make([]protoimpl.MessageInfo, 27)
+var file_ptypes_syncagent_proto_goTypes = []interface{}{
+	(*FileRemoveRequest)(nil),                 // 0: ptypes.FileRemoveRequest
+	(*FileRenameRequest)(nil),                 // 1: ptypes.FileRenameRequest
+	(*ReceiverLaunchRequest)(nil),             // 2: ptypes.ReceiverLaunchRequest
+	(*ReceiverLaunchResponse)(nil),            // 3: ptypes.ReceiverLaunchResponse
+	(*FileSendRequest)(nil),                   // 4: ptypes.FileSendRequest
+	(*FilesSyncRequest)(nil),                  // 5: ptypes.FilesSyncRequest
+	(*SnapshotCloneRequest)(nil),              // 6: ptypes.SnapshotCloneRequest
+	(*VolumeExportRequest)(nil),               // 7: ptypes.VolumeExportRequest
+	(*BackupCreateRequest)(nil),               // 8: ptypes.BackupCreateRequest
+	(*BackupCreateResponse)(nil),              // 9: ptypes.BackupCreateResponse
+	(*BackupRemoveRequest)(nil),               // 10: ptypes.BackupRemoveRequest
+	(*BackupStatusRequest)(nil),               // 11: ptypes.BackupStatusRequest
+	(*BackupStatusResponse)(nil),              // 12: ptypes.BackupStatusResponse
+	(*BackupRestoreRequest)(nil),              // 13: ptypes.BackupRestoreRequest
+	(*BackupRestoreIncrementallyRequest)(nil), // 14: ptypes.BackupRestoreIncrementallyRequest
+	(*RestoreStatusResponse)(nil),             // 15: ptypes.RestoreStatusResponse
+	(*SnapshotPurgeStatusResponse)(nil),       // 16: ptypes.SnapshotPurgeStatusResponse
+	(*ReplicaRebuildStatusResponse)(nil),      // 17: ptypes.ReplicaRebuildStatusResponse
+	(*SnapshotCloneStatusResponse)(nil),       // 18: ptypes.SnapshotCloneStatusResponse
+	(*SnapshotHashRequest)(nil),               // 19: ptypes.SnapshotHashRequest
+	(*SnapshotHashStatusRequest)(nil),         // 20: ptypes.SnapshotHashStatusRequest
+	(*SnapshotHashStatusResponse)(nil),        // 21: ptypes.SnapshotHashStatusResponse
+	(*SnapshotHashCancelRequest)(nil),         // 22: ptypes.SnapshotHashCancelRequest
+	(*SnapshotHashLockStateResponse)(nil),     // 23: ptypes.SnapshotHashLockStateResponse
+	nil,                                       // 24: ptypes.BackupCreateRequest.CredentialEntry
+	nil,                                       // 25: ptypes.BackupRestoreRequest.CredentialEntry
+	nil,                                       // 26: ptypes.BackupRestoreIncrementallyRequest.CredentialEntry
+	(*SyncFileInfo)(nil),                      // 27: ptypes.SyncFileInfo
+	(*emptypb.Empty)(nil),                     // 28: google.protobuf.Empty
+}
+var file_ptypes_syncagent_proto_depIdxs = []int32{
+	27, // 0: ptypes.FilesSyncRequest.sync_file_info_list:type_name -> ptypes.SyncFileInfo
+	24, // 1: ptypes.BackupCreateRequest.credential:type_name -> ptypes.BackupCreateRequest.CredentialEntry
+	25, // 2: ptypes.BackupRestoreRequest.credential:type_name -> ptypes.BackupRestoreRequest.CredentialEntry
+	26, // 3: ptypes.BackupRestoreIncrementallyRequest.credential:type_name -> ptypes.BackupRestoreIncrementallyRequest.CredentialEntry
+	0,  // 4: ptypes.SyncAgentService.FileRemove:input_type -> ptypes.FileRemoveRequest
+	1,  // 5: ptypes.SyncAgentService.FileRename:input_type -> ptypes.FileRenameRequest
+	4,  // 6: ptypes.SyncAgentService.FileSend:input_type -> ptypes.FileSendRequest
+	5,  // 7: ptypes.SyncAgentService.FilesSync:input_type -> ptypes.FilesSyncRequest
+	6,  // 8: ptypes.SyncAgentService.SnapshotClone:input_type -> ptypes.SnapshotCloneRequest
+	7,  // 9: ptypes.SyncAgentService.VolumeExport:input_type -> ptypes.VolumeExportRequest
+	2,  // 10: ptypes.SyncAgentService.ReceiverLaunch:input_type -> ptypes.ReceiverLaunchRequest
+	8,  // 11: ptypes.SyncAgentService.BackupCreate:input_type -> ptypes.BackupCreateRequest
+	10, // 12: ptypes.SyncAgentService.BackupRemove:input_type -> ptypes.BackupRemoveRequest
+	13, // 13: ptypes.SyncAgentService.BackupRestore:input_type -> ptypes.BackupRestoreRequest
+	11, // 14: ptypes.SyncAgentService.BackupStatus:input_type -> ptypes.BackupStatusRequest
+	28, // 15: ptypes.SyncAgentService.Reset:input_type -> google.protobuf.Empty
+	28, // 16: ptypes.SyncAgentService.RestoreStatus:input_type -> google.protobuf.Empty
+	28, // 17: ptypes.SyncAgentService.SnapshotPurge:input_type -> google.protobuf.Empty
+	28, // 18: ptypes.SyncAgentService.SnapshotPurgeStatus:input_type -> google.protobuf.Empty
+	28, // 19: ptypes.SyncAgentService.ReplicaRebuildStatus:input_type -> google.protobuf.Empty
+	28, // 20: ptypes.SyncAgentService.SnapshotCloneStatus:input_type -> google.protobuf.Empty
+	19, // 21: ptypes.SyncAgentService.SnapshotHash:input_type -> ptypes.SnapshotHashRequest
+	20, // 22: ptypes.SyncAgentService.SnapshotHashStatus:input_type -> ptypes.SnapshotHashStatusRequest
+	22, // 23: ptypes.SyncAgentService.SnapshotHashCancel:input_type -> ptypes.SnapshotHashCancelRequest
+	28, // 24: ptypes.SyncAgentService.SnapshotHashLockState:input_type -> google.protobuf.Empty
+	28, // 25: ptypes.SyncAgentService.FileRemove:output_type -> google.protobuf.Empty
+	28, // 26: ptypes.SyncAgentService.FileRename:output_type -> google.protobuf.Empty
+	28, // 27: ptypes.SyncAgentService.FileSend:output_type -> google.protobuf.Empty
+	28, // 28: ptypes.SyncAgentService.FilesSync:output_type -> google.protobuf.Empty
+	28, // 29: ptypes.SyncAgentService.SnapshotClone:output_type -> google.protobuf.Empty
+	28, // 30: ptypes.SyncAgentService.VolumeExport:output_type -> google.protobuf.Empty
+	3,  // 31: ptypes.SyncAgentService.ReceiverLaunch:output_type -> ptypes.ReceiverLaunchResponse
+	9,  // 32: ptypes.SyncAgentService.BackupCreate:output_type -> ptypes.BackupCreateResponse
+	28, // 33: ptypes.SyncAgentService.BackupRemove:output_type -> google.protobuf.Empty
+	28, // 34: ptypes.SyncAgentService.BackupRestore:output_type -> google.protobuf.Empty
+	12, // 35: ptypes.SyncAgentService.BackupStatus:output_type -> ptypes.BackupStatusResponse
+	28, // 36: ptypes.SyncAgentService.Reset:output_type -> google.protobuf.Empty
+	15, // 37: ptypes.SyncAgentService.RestoreStatus:output_type -> ptypes.RestoreStatusResponse
+	28, // 38: ptypes.SyncAgentService.SnapshotPurge:output_type -> google.protobuf.Empty
+	16, // 39: ptypes.SyncAgentService.SnapshotPurgeStatus:output_type -> ptypes.SnapshotPurgeStatusResponse
+	17, // 40: ptypes.SyncAgentService.ReplicaRebuildStatus:output_type -> ptypes.ReplicaRebuildStatusResponse
+	18, // 41: ptypes.SyncAgentService.SnapshotCloneStatus:output_type -> ptypes.SnapshotCloneStatusResponse
+	28, // 42: ptypes.SyncAgentService.SnapshotHash:output_type -> google.protobuf.Empty
+	21, // 43: ptypes.SyncAgentService.SnapshotHashStatus:output_type -> ptypes.SnapshotHashStatusResponse
+	28, // 44: ptypes.SyncAgentService.SnapshotHashCancel:output_type -> google.protobuf.Empty
+	23, // 45: ptypes.SyncAgentService.SnapshotHashLockState:output_type -> ptypes.SnapshotHashLockStateResponse
+	25, // [25:46] is the sub-list for method output_type
+	4,  // [4:25] is the sub-list for method input_type
+	4,  // [4:4] is the sub-list for extension type_name
+	4,  // [4:4] is the sub-list for extension extendee
+	0,  // [0:4] is the sub-list for field type_name
+}
+
+func init() { file_ptypes_syncagent_proto_init() }
+func file_ptypes_syncagent_proto_init() {
+	if File_ptypes_syncagent_proto != nil {
+		return
+	}
+	file_ptypes_common_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_ptypes_syncagent_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FileRemoveRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FileRenameRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReceiverLaunchRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReceiverLaunchResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FileSendRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FilesSyncRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SnapshotCloneRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VolumeExportRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackupCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackupCreateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackupRemoveRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackupStatusRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackupStatusResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackupRestoreRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackupRestoreIncrementallyRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RestoreStatusResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SnapshotPurgeStatusResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaRebuildStatusResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SnapshotCloneStatusResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SnapshotHashRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SnapshotHashStatusRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SnapshotHashStatusResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SnapshotHashCancelRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_ptypes_syncagent_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SnapshotHashLockStateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_ptypes_syncagent_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   27,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_ptypes_syncagent_proto_goTypes,
+		DependencyIndexes: file_ptypes_syncagent_proto_depIdxs,
+		MessageInfos:      file_ptypes_syncagent_proto_msgTypes,
+	}.Build()
+	File_ptypes_syncagent_proto = out.File
+	file_ptypes_syncagent_proto_rawDesc = nil
+	file_ptypes_syncagent_proto_goTypes = nil
+	file_ptypes_syncagent_proto_depIdxs = nil
+}
diff --git a/pkg/generated/enginerpc/syncagent_grpc.pb.go b/pkg/generated/enginerpc/syncagent_grpc.pb.go
new file mode 100644
index 0000000..4d2bc84
--- /dev/null
+++ b/pkg/generated/enginerpc/syncagent_grpc.pb.go
@@ -0,0 +1,850 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v4.24.3
+// source: ptypes/syncagent.proto
+
+package enginerpc
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+	SyncAgentService_FileRemove_FullMethodName            = "/ptypes.SyncAgentService/FileRemove"
+	SyncAgentService_FileRename_FullMethodName            = "/ptypes.SyncAgentService/FileRename"
+	SyncAgentService_FileSend_FullMethodName              = "/ptypes.SyncAgentService/FileSend"
+	SyncAgentService_FilesSync_FullMethodName             = "/ptypes.SyncAgentService/FilesSync"
+	SyncAgentService_SnapshotClone_FullMethodName         = "/ptypes.SyncAgentService/SnapshotClone"
+	SyncAgentService_VolumeExport_FullMethodName          = "/ptypes.SyncAgentService/VolumeExport"
+	SyncAgentService_ReceiverLaunch_FullMethodName        = "/ptypes.SyncAgentService/ReceiverLaunch"
+	SyncAgentService_BackupCreate_FullMethodName          = "/ptypes.SyncAgentService/BackupCreate"
+	SyncAgentService_BackupRemove_FullMethodName          = "/ptypes.SyncAgentService/BackupRemove"
+	SyncAgentService_BackupRestore_FullMethodName         = "/ptypes.SyncAgentService/BackupRestore"
+	SyncAgentService_BackupStatus_FullMethodName          = "/ptypes.SyncAgentService/BackupStatus"
+	SyncAgentService_Reset_FullMethodName                 = "/ptypes.SyncAgentService/Reset"
+	SyncAgentService_RestoreStatus_FullMethodName         = "/ptypes.SyncAgentService/RestoreStatus"
+	SyncAgentService_SnapshotPurge_FullMethodName         = "/ptypes.SyncAgentService/SnapshotPurge"
+	SyncAgentService_SnapshotPurgeStatus_FullMethodName   = "/ptypes.SyncAgentService/SnapshotPurgeStatus"
+	SyncAgentService_ReplicaRebuildStatus_FullMethodName  = "/ptypes.SyncAgentService/ReplicaRebuildStatus"
+	SyncAgentService_SnapshotCloneStatus_FullMethodName   = "/ptypes.SyncAgentService/SnapshotCloneStatus"
+	SyncAgentService_SnapshotHash_FullMethodName          = "/ptypes.SyncAgentService/SnapshotHash"
+	SyncAgentService_SnapshotHashStatus_FullMethodName    = "/ptypes.SyncAgentService/SnapshotHashStatus"
+	SyncAgentService_SnapshotHashCancel_FullMethodName    = "/ptypes.SyncAgentService/SnapshotHashCancel"
+	SyncAgentService_SnapshotHashLockState_FullMethodName = "/ptypes.SyncAgentService/SnapshotHashLockState"
+)
+
+// SyncAgentServiceClient is the client API for SyncAgentService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type SyncAgentServiceClient interface {
+	FileRemove(ctx context.Context, in *FileRemoveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	FileRename(ctx context.Context, in *FileRenameRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	FileSend(ctx context.Context, in *FileSendRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	FilesSync(ctx context.Context, in *FilesSyncRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	SnapshotClone(ctx context.Context, in *SnapshotCloneRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	VolumeExport(ctx context.Context, in *VolumeExportRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReceiverLaunch(ctx context.Context, in *ReceiverLaunchRequest, opts ...grpc.CallOption) (*ReceiverLaunchResponse, error)
+	BackupCreate(ctx context.Context, in *BackupCreateRequest, opts ...grpc.CallOption) (*BackupCreateResponse, error)
+	BackupRemove(ctx context.Context, in *BackupRemoveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	BackupRestore(ctx context.Context, in *BackupRestoreRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	BackupStatus(ctx context.Context, in *BackupStatusRequest, opts ...grpc.CallOption) (*BackupStatusResponse, error)
+	Reset(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	RestoreStatus(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*RestoreStatusResponse, error)
+	SnapshotPurge(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	SnapshotPurgeStatus(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SnapshotPurgeStatusResponse, error)
+	ReplicaRebuildStatus(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ReplicaRebuildStatusResponse, error)
+	SnapshotCloneStatus(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SnapshotCloneStatusResponse, error)
+	SnapshotHash(ctx context.Context, in *SnapshotHashRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	SnapshotHashStatus(ctx context.Context, in *SnapshotHashStatusRequest, opts ...grpc.CallOption) (*SnapshotHashStatusResponse, error)
+	SnapshotHashCancel(ctx context.Context, in *SnapshotHashCancelRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	SnapshotHashLockState(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SnapshotHashLockStateResponse, error)
+}
+
+type syncAgentServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewSyncAgentServiceClient(cc grpc.ClientConnInterface) SyncAgentServiceClient {
+	return &syncAgentServiceClient{cc}
+}
+
+func (c *syncAgentServiceClient) FileRemove(ctx context.Context, in *FileRemoveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SyncAgentService_FileRemove_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) FileRename(ctx context.Context, in *FileRenameRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SyncAgentService_FileRename_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) FileSend(ctx context.Context, in *FileSendRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SyncAgentService_FileSend_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) FilesSync(ctx context.Context, in *FilesSyncRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SyncAgentService_FilesSync_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) SnapshotClone(ctx context.Context, in *SnapshotCloneRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SyncAgentService_SnapshotClone_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) VolumeExport(ctx context.Context, in *VolumeExportRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SyncAgentService_VolumeExport_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) ReceiverLaunch(ctx context.Context, in *ReceiverLaunchRequest, opts ...grpc.CallOption) (*ReceiverLaunchResponse, error) {
+	out := new(ReceiverLaunchResponse)
+	err := c.cc.Invoke(ctx, SyncAgentService_ReceiverLaunch_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) BackupCreate(ctx context.Context, in *BackupCreateRequest, opts ...grpc.CallOption) (*BackupCreateResponse, error) {
+	out := new(BackupCreateResponse)
+	err := c.cc.Invoke(ctx, SyncAgentService_BackupCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) BackupRemove(ctx context.Context, in *BackupRemoveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SyncAgentService_BackupRemove_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) BackupRestore(ctx context.Context, in *BackupRestoreRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SyncAgentService_BackupRestore_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) BackupStatus(ctx context.Context, in *BackupStatusRequest, opts ...grpc.CallOption) (*BackupStatusResponse, error) {
+	out := new(BackupStatusResponse)
+	err := c.cc.Invoke(ctx, SyncAgentService_BackupStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) Reset(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SyncAgentService_Reset_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) RestoreStatus(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*RestoreStatusResponse, error) {
+	out := new(RestoreStatusResponse)
+	err := c.cc.Invoke(ctx, SyncAgentService_RestoreStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) SnapshotPurge(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SyncAgentService_SnapshotPurge_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) SnapshotPurgeStatus(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SnapshotPurgeStatusResponse, error) {
+	out := new(SnapshotPurgeStatusResponse)
+	err := c.cc.Invoke(ctx, SyncAgentService_SnapshotPurgeStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) ReplicaRebuildStatus(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ReplicaRebuildStatusResponse, error) {
+	out := new(ReplicaRebuildStatusResponse)
+	err := c.cc.Invoke(ctx, SyncAgentService_ReplicaRebuildStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) SnapshotCloneStatus(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SnapshotCloneStatusResponse, error) {
+	out := new(SnapshotCloneStatusResponse)
+	err := c.cc.Invoke(ctx, SyncAgentService_SnapshotCloneStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) SnapshotHash(ctx context.Context, in *SnapshotHashRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SyncAgentService_SnapshotHash_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) SnapshotHashStatus(ctx context.Context, in *SnapshotHashStatusRequest, opts ...grpc.CallOption) (*SnapshotHashStatusResponse, error) {
+	out := new(SnapshotHashStatusResponse)
+	err := c.cc.Invoke(ctx, SyncAgentService_SnapshotHashStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) SnapshotHashCancel(ctx context.Context, in *SnapshotHashCancelRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SyncAgentService_SnapshotHashCancel_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *syncAgentServiceClient) SnapshotHashLockState(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SnapshotHashLockStateResponse, error) {
+	out := new(SnapshotHashLockStateResponse)
+	err := c.cc.Invoke(ctx, SyncAgentService_SnapshotHashLockState_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// SyncAgentServiceServer is the server API for SyncAgentService service.
+// All implementations must embed UnimplementedSyncAgentServiceServer
+// for forward compatibility
+type SyncAgentServiceServer interface {
+	FileRemove(context.Context, *FileRemoveRequest) (*emptypb.Empty, error)
+	FileRename(context.Context, *FileRenameRequest) (*emptypb.Empty, error)
+	FileSend(context.Context, *FileSendRequest) (*emptypb.Empty, error)
+	FilesSync(context.Context, *FilesSyncRequest) (*emptypb.Empty, error)
+	SnapshotClone(context.Context, *SnapshotCloneRequest) (*emptypb.Empty, error)
+	VolumeExport(context.Context, *VolumeExportRequest) (*emptypb.Empty, error)
+	ReceiverLaunch(context.Context, *ReceiverLaunchRequest) (*ReceiverLaunchResponse, error)
+	BackupCreate(context.Context, *BackupCreateRequest) (*BackupCreateResponse, error)
+	BackupRemove(context.Context, *BackupRemoveRequest) (*emptypb.Empty, error)
+	BackupRestore(context.Context, *BackupRestoreRequest) (*emptypb.Empty, error)
+	BackupStatus(context.Context, *BackupStatusRequest) (*BackupStatusResponse, error)
+	Reset(context.Context, *emptypb.Empty) (*emptypb.Empty, error)
+	RestoreStatus(context.Context, *emptypb.Empty) (*RestoreStatusResponse, error)
+	SnapshotPurge(context.Context, *emptypb.Empty) (*emptypb.Empty, error)
+	SnapshotPurgeStatus(context.Context, *emptypb.Empty) (*SnapshotPurgeStatusResponse, error)
+	ReplicaRebuildStatus(context.Context, *emptypb.Empty) (*ReplicaRebuildStatusResponse, error)
+	SnapshotCloneStatus(context.Context, *emptypb.Empty) (*SnapshotCloneStatusResponse, error)
+	SnapshotHash(context.Context, *SnapshotHashRequest) (*emptypb.Empty, error)
+	SnapshotHashStatus(context.Context, *SnapshotHashStatusRequest) (*SnapshotHashStatusResponse, error)
+	SnapshotHashCancel(context.Context, *SnapshotHashCancelRequest) (*emptypb.Empty, error)
+	SnapshotHashLockState(context.Context, *emptypb.Empty) (*SnapshotHashLockStateResponse, error)
+	mustEmbedUnimplementedSyncAgentServiceServer()
+}
+
+// UnimplementedSyncAgentServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedSyncAgentServiceServer struct {
+}
+
+func (UnimplementedSyncAgentServiceServer) FileRemove(context.Context, *FileRemoveRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method FileRemove not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) FileRename(context.Context, *FileRenameRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method FileRename not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) FileSend(context.Context, *FileSendRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method FileSend not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) FilesSync(context.Context, *FilesSyncRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method FilesSync not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) SnapshotClone(context.Context, *SnapshotCloneRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotClone not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) VolumeExport(context.Context, *VolumeExportRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeExport not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) ReceiverLaunch(context.Context, *ReceiverLaunchRequest) (*ReceiverLaunchResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReceiverLaunch not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) BackupCreate(context.Context, *BackupCreateRequest) (*BackupCreateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method BackupCreate not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) BackupRemove(context.Context, *BackupRemoveRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method BackupRemove not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) BackupRestore(context.Context, *BackupRestoreRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method BackupRestore not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) BackupStatus(context.Context, *BackupStatusRequest) (*BackupStatusResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method BackupStatus not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) Reset(context.Context, *emptypb.Empty) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Reset not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) RestoreStatus(context.Context, *emptypb.Empty) (*RestoreStatusResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method RestoreStatus not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) SnapshotPurge(context.Context, *emptypb.Empty) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotPurge not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) SnapshotPurgeStatus(context.Context, *emptypb.Empty) (*SnapshotPurgeStatusResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotPurgeStatus not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) ReplicaRebuildStatus(context.Context, *emptypb.Empty) (*ReplicaRebuildStatusResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaRebuildStatus not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) SnapshotCloneStatus(context.Context, *emptypb.Empty) (*SnapshotCloneStatusResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotCloneStatus not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) SnapshotHash(context.Context, *SnapshotHashRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotHash not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) SnapshotHashStatus(context.Context, *SnapshotHashStatusRequest) (*SnapshotHashStatusResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotHashStatus not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) SnapshotHashCancel(context.Context, *SnapshotHashCancelRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotHashCancel not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) SnapshotHashLockState(context.Context, *emptypb.Empty) (*SnapshotHashLockStateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotHashLockState not implemented")
+}
+func (UnimplementedSyncAgentServiceServer) mustEmbedUnimplementedSyncAgentServiceServer() {}
+
+// UnsafeSyncAgentServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to SyncAgentServiceServer will
+// result in compilation errors.
+type UnsafeSyncAgentServiceServer interface {
+	mustEmbedUnimplementedSyncAgentServiceServer()
+}
+
+func RegisterSyncAgentServiceServer(s grpc.ServiceRegistrar, srv SyncAgentServiceServer) {
+	s.RegisterService(&SyncAgentService_ServiceDesc, srv)
+}
+
+func _SyncAgentService_FileRemove_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(FileRemoveRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).FileRemove(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_FileRemove_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).FileRemove(ctx, req.(*FileRemoveRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_FileRename_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(FileRenameRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).FileRename(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_FileRename_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).FileRename(ctx, req.(*FileRenameRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_FileSend_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(FileSendRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).FileSend(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_FileSend_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).FileSend(ctx, req.(*FileSendRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_FilesSync_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(FilesSyncRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).FilesSync(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_FilesSync_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).FilesSync(ctx, req.(*FilesSyncRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_SnapshotClone_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SnapshotCloneRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).SnapshotClone(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_SnapshotClone_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).SnapshotClone(ctx, req.(*SnapshotCloneRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_VolumeExport_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(VolumeExportRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).VolumeExport(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_VolumeExport_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).VolumeExport(ctx, req.(*VolumeExportRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_ReceiverLaunch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReceiverLaunchRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).ReceiverLaunch(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_ReceiverLaunch_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).ReceiverLaunch(ctx, req.(*ReceiverLaunchRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_BackupCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(BackupCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).BackupCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_BackupCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).BackupCreate(ctx, req.(*BackupCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_BackupRemove_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(BackupRemoveRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).BackupRemove(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_BackupRemove_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).BackupRemove(ctx, req.(*BackupRemoveRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_BackupRestore_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(BackupRestoreRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).BackupRestore(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_BackupRestore_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).BackupRestore(ctx, req.(*BackupRestoreRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_BackupStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(BackupStatusRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).BackupStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_BackupStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).BackupStatus(ctx, req.(*BackupStatusRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_Reset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).Reset(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_Reset_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).Reset(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_RestoreStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).RestoreStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_RestoreStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).RestoreStatus(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_SnapshotPurge_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).SnapshotPurge(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_SnapshotPurge_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).SnapshotPurge(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_SnapshotPurgeStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).SnapshotPurgeStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_SnapshotPurgeStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).SnapshotPurgeStatus(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_ReplicaRebuildStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).ReplicaRebuildStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_ReplicaRebuildStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).ReplicaRebuildStatus(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_SnapshotCloneStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).SnapshotCloneStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_SnapshotCloneStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).SnapshotCloneStatus(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_SnapshotHash_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SnapshotHashRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).SnapshotHash(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_SnapshotHash_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).SnapshotHash(ctx, req.(*SnapshotHashRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_SnapshotHashStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SnapshotHashStatusRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).SnapshotHashStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_SnapshotHashStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).SnapshotHashStatus(ctx, req.(*SnapshotHashStatusRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_SnapshotHashCancel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SnapshotHashCancelRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).SnapshotHashCancel(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_SnapshotHashCancel_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).SnapshotHashCancel(ctx, req.(*SnapshotHashCancelRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SyncAgentService_SnapshotHashLockState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SyncAgentServiceServer).SnapshotHashLockState(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SyncAgentService_SnapshotHashLockState_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SyncAgentServiceServer).SnapshotHashLockState(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// SyncAgentService_ServiceDesc is the grpc.ServiceDesc for SyncAgentService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var SyncAgentService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "ptypes.SyncAgentService",
+	HandlerType: (*SyncAgentServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "FileRemove",
+			Handler:    _SyncAgentService_FileRemove_Handler,
+		},
+		{
+			MethodName: "FileRename",
+			Handler:    _SyncAgentService_FileRename_Handler,
+		},
+		{
+			MethodName: "FileSend",
+			Handler:    _SyncAgentService_FileSend_Handler,
+		},
+		{
+			MethodName: "FilesSync",
+			Handler:    _SyncAgentService_FilesSync_Handler,
+		},
+		{
+			MethodName: "SnapshotClone",
+			Handler:    _SyncAgentService_SnapshotClone_Handler,
+		},
+		{
+			MethodName: "VolumeExport",
+			Handler:    _SyncAgentService_VolumeExport_Handler,
+		},
+		{
+			MethodName: "ReceiverLaunch",
+			Handler:    _SyncAgentService_ReceiverLaunch_Handler,
+		},
+		{
+			MethodName: "BackupCreate",
+			Handler:    _SyncAgentService_BackupCreate_Handler,
+		},
+		{
+			MethodName: "BackupRemove",
+			Handler:    _SyncAgentService_BackupRemove_Handler,
+		},
+		{
+			MethodName: "BackupRestore",
+			Handler:    _SyncAgentService_BackupRestore_Handler,
+		},
+		{
+			MethodName: "BackupStatus",
+			Handler:    _SyncAgentService_BackupStatus_Handler,
+		},
+		{
+			MethodName: "Reset",
+			Handler:    _SyncAgentService_Reset_Handler,
+		},
+		{
+			MethodName: "RestoreStatus",
+			Handler:    _SyncAgentService_RestoreStatus_Handler,
+		},
+		{
+			MethodName: "SnapshotPurge",
+			Handler:    _SyncAgentService_SnapshotPurge_Handler,
+		},
+		{
+			MethodName: "SnapshotPurgeStatus",
+			Handler:    _SyncAgentService_SnapshotPurgeStatus_Handler,
+		},
+		{
+			MethodName: "ReplicaRebuildStatus",
+			Handler:    _SyncAgentService_ReplicaRebuildStatus_Handler,
+		},
+		{
+			MethodName: "SnapshotCloneStatus",
+			Handler:    _SyncAgentService_SnapshotCloneStatus_Handler,
+		},
+		{
+			MethodName: "SnapshotHash",
+			Handler:    _SyncAgentService_SnapshotHash_Handler,
+		},
+		{
+			MethodName: "SnapshotHashStatus",
+			Handler:    _SyncAgentService_SnapshotHashStatus_Handler,
+		},
+		{
+			MethodName: "SnapshotHashCancel",
+			Handler:    _SyncAgentService_SnapshotHashCancel_Handler,
+		},
+		{
+			MethodName: "SnapshotHashLockState",
+			Handler:    _SyncAgentService_SnapshotHashLockState_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "ptypes/syncagent.proto",
+}
diff --git a/pkg/generated/imrpc/common.pb.go b/pkg/generated/imrpc/common.pb.go
new file mode 100644
index 0000000..fa45b61
--- /dev/null
+++ b/pkg/generated/imrpc/common.pb.go
@@ -0,0 +1,180 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
+// source: imrpc/common.proto
+
+package imrpc
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// Deprecated: Use DataEngine instead.
+type BackendStoreDriver int32
+
+const (
+	BackendStoreDriver_v1 BackendStoreDriver = 0
+	BackendStoreDriver_v2 BackendStoreDriver = 1
+)
+
+// Enum value maps for BackendStoreDriver.
+var (
+	BackendStoreDriver_name = map[int32]string{
+		0: "v1",
+		1: "v2",
+	}
+	BackendStoreDriver_value = map[string]int32{
+		"v1": 0,
+		"v2": 1,
+	}
+)
+
+func (x BackendStoreDriver) Enum() *BackendStoreDriver {
+	p := new(BackendStoreDriver)
+	*p = x
+	return p
+}
+
+func (x BackendStoreDriver) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (BackendStoreDriver) Descriptor() protoreflect.EnumDescriptor {
+	return file_imrpc_common_proto_enumTypes[0].Descriptor()
+}
+
+func (BackendStoreDriver) Type() protoreflect.EnumType {
+	return &file_imrpc_common_proto_enumTypes[0]
+}
+
+func (x BackendStoreDriver) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use BackendStoreDriver.Descriptor instead.
+func (BackendStoreDriver) EnumDescriptor() ([]byte, []int) {
+	return file_imrpc_common_proto_rawDescGZIP(), []int{0}
+}
+
+type DataEngine int32
+
+const (
+	DataEngine_DATA_ENGINE_V1 DataEngine = 0
+	DataEngine_DATA_ENGINE_V2 DataEngine = 1
+)
+
+// Enum value maps for DataEngine.
+var (
+	DataEngine_name = map[int32]string{
+		0: "DATA_ENGINE_V1",
+		1: "DATA_ENGINE_V2",
+	}
+	DataEngine_value = map[string]int32{
+		"DATA_ENGINE_V1": 0,
+		"DATA_ENGINE_V2": 1,
+	}
+)
+
+func (x DataEngine) Enum() *DataEngine {
+	p := new(DataEngine)
+	*p = x
+	return p
+}
+
+func (x DataEngine) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (DataEngine) Descriptor() protoreflect.EnumDescriptor {
+	return file_imrpc_common_proto_enumTypes[1].Descriptor()
+}
+
+func (DataEngine) Type() protoreflect.EnumType {
+	return &file_imrpc_common_proto_enumTypes[1]
+}
+
+func (x DataEngine) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use DataEngine.Descriptor instead.
+func (DataEngine) EnumDescriptor() ([]byte, []int) {
+	return file_imrpc_common_proto_rawDescGZIP(), []int{1}
+}
+
+var File_imrpc_common_proto protoreflect.FileDescriptor
+
+var file_imrpc_common_proto_rawDesc = []byte{
+	0x0a, 0x12, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2a, 0x24, 0x0a, 0x12, 0x42,
+	0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x72, 0x69, 0x76, 0x65,
+	0x72, 0x12, 0x06, 0x0a, 0x02, 0x76, 0x31, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x76, 0x32, 0x10,
+	0x01, 0x2a, 0x34, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x12,
+	0x12, 0x0a, 0x0e, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x45, 0x4e, 0x47, 0x49, 0x4e, 0x45, 0x5f, 0x56,
+	0x31, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x45, 0x4e, 0x47, 0x49,
+	0x4e, 0x45, 0x5f, 0x56, 0x32, 0x10, 0x01, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75,
+	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x68, 0x6f, 0x72, 0x6e, 0x2f, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
+	0x65, 0x64, 0x2f, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_imrpc_common_proto_rawDescOnce sync.Once
+	file_imrpc_common_proto_rawDescData = file_imrpc_common_proto_rawDesc
+)
+
+func file_imrpc_common_proto_rawDescGZIP() []byte {
+	file_imrpc_common_proto_rawDescOnce.Do(func() {
+		file_imrpc_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_imrpc_common_proto_rawDescData)
+	})
+	return file_imrpc_common_proto_rawDescData
+}
+
+var file_imrpc_common_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_imrpc_common_proto_goTypes = []interface{}{
+	(BackendStoreDriver)(0), // 0: imrpc.BackendStoreDriver
+	(DataEngine)(0),         // 1: imrpc.DataEngine
+}
+var file_imrpc_common_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] 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
+}
+
+func init() { file_imrpc_common_proto_init() }
+func file_imrpc_common_proto_init() {
+	if File_imrpc_common_proto != nil {
+		return
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_imrpc_common_proto_rawDesc,
+			NumEnums:      2,
+			NumMessages:   0,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_imrpc_common_proto_goTypes,
+		DependencyIndexes: file_imrpc_common_proto_depIdxs,
+		EnumInfos:         file_imrpc_common_proto_enumTypes,
+	}.Build()
+	File_imrpc_common_proto = out.File
+	file_imrpc_common_proto_rawDesc = nil
+	file_imrpc_common_proto_goTypes = nil
+	file_imrpc_common_proto_depIdxs = nil
+}
diff --git a/pkg/generated/imrpc/disk.pb.go b/pkg/generated/imrpc/disk.pb.go
new file mode 100644
index 0000000..ccb66f4
--- /dev/null
+++ b/pkg/generated/imrpc/disk.pb.go
@@ -0,0 +1,1151 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
+// source: imrpc/disk.proto
+
+package imrpc
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type DiskType int32
+
+const (
+	DiskType_filesystem DiskType = 0
+	DiskType_block      DiskType = 1
+)
+
+// Enum value maps for DiskType.
+var (
+	DiskType_name = map[int32]string{
+		0: "filesystem",
+		1: "block",
+	}
+	DiskType_value = map[string]int32{
+		"filesystem": 0,
+		"block":      1,
+	}
+)
+
+func (x DiskType) Enum() *DiskType {
+	p := new(DiskType)
+	*p = x
+	return p
+}
+
+func (x DiskType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (DiskType) Descriptor() protoreflect.EnumDescriptor {
+	return file_imrpc_disk_proto_enumTypes[0].Descriptor()
+}
+
+func (DiskType) Type() protoreflect.EnumType {
+	return &file_imrpc_disk_proto_enumTypes[0]
+}
+
+func (x DiskType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use DiskType.Descriptor instead.
+func (DiskType) EnumDescriptor() ([]byte, []int) {
+	return file_imrpc_disk_proto_rawDescGZIP(), []int{0}
+}
+
+type Disk struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id          string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Uuid        string `protobuf:"bytes,2,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	Path        string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"`
+	Type        string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"`
+	TotalSize   int64  `protobuf:"varint,5,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"`
+	FreeSize    int64  `protobuf:"varint,6,opt,name=free_size,json=freeSize,proto3" json:"free_size,omitempty"`
+	TotalBlocks int64  `protobuf:"varint,7,opt,name=total_blocks,json=totalBlocks,proto3" json:"total_blocks,omitempty"`
+	FreeBlocks  int64  `protobuf:"varint,8,opt,name=free_blocks,json=freeBlocks,proto3" json:"free_blocks,omitempty"`
+	BlockSize   int64  `protobuf:"varint,9,opt,name=block_size,json=blockSize,proto3" json:"block_size,omitempty"`
+	ClusterSize int64  `protobuf:"varint,10,opt,name=cluster_size,json=clusterSize,proto3" json:"cluster_size,omitempty"`
+	Driver      string `protobuf:"bytes,11,opt,name=driver,proto3" json:"driver,omitempty"`
+	Name        string `protobuf:"bytes,12,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *Disk) Reset() {
+	*x = Disk{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_disk_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Disk) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Disk) ProtoMessage() {}
+
+func (x *Disk) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_disk_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Disk.ProtoReflect.Descriptor instead.
+func (*Disk) Descriptor() ([]byte, []int) {
+	return file_imrpc_disk_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Disk) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *Disk) GetUuid() string {
+	if x != nil {
+		return x.Uuid
+	}
+	return ""
+}
+
+func (x *Disk) GetPath() string {
+	if x != nil {
+		return x.Path
+	}
+	return ""
+}
+
+func (x *Disk) GetType() string {
+	if x != nil {
+		return x.Type
+	}
+	return ""
+}
+
+func (x *Disk) GetTotalSize() int64 {
+	if x != nil {
+		return x.TotalSize
+	}
+	return 0
+}
+
+func (x *Disk) GetFreeSize() int64 {
+	if x != nil {
+		return x.FreeSize
+	}
+	return 0
+}
+
+func (x *Disk) GetTotalBlocks() int64 {
+	if x != nil {
+		return x.TotalBlocks
+	}
+	return 0
+}
+
+func (x *Disk) GetFreeBlocks() int64 {
+	if x != nil {
+		return x.FreeBlocks
+	}
+	return 0
+}
+
+func (x *Disk) GetBlockSize() int64 {
+	if x != nil {
+		return x.BlockSize
+	}
+	return 0
+}
+
+func (x *Disk) GetClusterSize() int64 {
+	if x != nil {
+		return x.ClusterSize
+	}
+	return 0
+}
+
+func (x *Disk) GetDriver() string {
+	if x != nil {
+		return x.Driver
+	}
+	return ""
+}
+
+func (x *Disk) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type ReplicaInstance struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name       string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Uuid       string `protobuf:"bytes,2,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	DiskName   string `protobuf:"bytes,3,opt,name=disk_name,json=diskName,proto3" json:"disk_name,omitempty"`
+	DiskUuid   string `protobuf:"bytes,4,opt,name=disk_uuid,json=diskUuid,proto3" json:"disk_uuid,omitempty"`
+	SpecSize   uint64 `protobuf:"varint,5,opt,name=spec_size,json=specSize,proto3" json:"spec_size,omitempty"`
+	ActualSize uint64 `protobuf:"varint,6,opt,name=actual_size,json=actualSize,proto3" json:"actual_size,omitempty"`
+}
+
+func (x *ReplicaInstance) Reset() {
+	*x = ReplicaInstance{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_disk_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaInstance) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaInstance) ProtoMessage() {}
+
+func (x *ReplicaInstance) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_disk_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaInstance.ProtoReflect.Descriptor instead.
+func (*ReplicaInstance) Descriptor() ([]byte, []int) {
+	return file_imrpc_disk_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *ReplicaInstance) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *ReplicaInstance) GetUuid() string {
+	if x != nil {
+		return x.Uuid
+	}
+	return ""
+}
+
+func (x *ReplicaInstance) GetDiskName() string {
+	if x != nil {
+		return x.DiskName
+	}
+	return ""
+}
+
+func (x *ReplicaInstance) GetDiskUuid() string {
+	if x != nil {
+		return x.DiskUuid
+	}
+	return ""
+}
+
+func (x *ReplicaInstance) GetSpecSize() uint64 {
+	if x != nil {
+		return x.SpecSize
+	}
+	return 0
+}
+
+func (x *ReplicaInstance) GetActualSize() uint64 {
+	if x != nil {
+		return x.ActualSize
+	}
+	return 0
+}
+
+type DiskCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DiskType   DiskType `protobuf:"varint,1,opt,name=disk_type,json=diskType,proto3,enum=imrpc.DiskType" json:"disk_type,omitempty"`
+	DiskName   string   `protobuf:"bytes,2,opt,name=disk_name,json=diskName,proto3" json:"disk_name,omitempty"`
+	DiskUuid   string   `protobuf:"bytes,3,opt,name=disk_uuid,json=diskUuid,proto3" json:"disk_uuid,omitempty"`
+	DiskPath   string   `protobuf:"bytes,4,opt,name=disk_path,json=diskPath,proto3" json:"disk_path,omitempty"`
+	BlockSize  int64    `protobuf:"varint,5,opt,name=block_size,json=blockSize,proto3" json:"block_size,omitempty"`
+	DiskDriver string   `protobuf:"bytes,6,opt,name=disk_driver,json=diskDriver,proto3" json:"disk_driver,omitempty"`
+}
+
+func (x *DiskCreateRequest) Reset() {
+	*x = DiskCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_disk_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskCreateRequest) ProtoMessage() {}
+
+func (x *DiskCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_disk_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskCreateRequest.ProtoReflect.Descriptor instead.
+func (*DiskCreateRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_disk_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *DiskCreateRequest) GetDiskType() DiskType {
+	if x != nil {
+		return x.DiskType
+	}
+	return DiskType_filesystem
+}
+
+func (x *DiskCreateRequest) GetDiskName() string {
+	if x != nil {
+		return x.DiskName
+	}
+	return ""
+}
+
+func (x *DiskCreateRequest) GetDiskUuid() string {
+	if x != nil {
+		return x.DiskUuid
+	}
+	return ""
+}
+
+func (x *DiskCreateRequest) GetDiskPath() string {
+	if x != nil {
+		return x.DiskPath
+	}
+	return ""
+}
+
+func (x *DiskCreateRequest) GetBlockSize() int64 {
+	if x != nil {
+		return x.BlockSize
+	}
+	return 0
+}
+
+func (x *DiskCreateRequest) GetDiskDriver() string {
+	if x != nil {
+		return x.DiskDriver
+	}
+	return ""
+}
+
+type DiskGetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DiskType   DiskType `protobuf:"varint,1,opt,name=disk_type,json=diskType,proto3,enum=imrpc.DiskType" json:"disk_type,omitempty"`
+	DiskName   string   `protobuf:"bytes,2,opt,name=disk_name,json=diskName,proto3" json:"disk_name,omitempty"`
+	DiskPath   string   `protobuf:"bytes,3,opt,name=disk_path,json=diskPath,proto3" json:"disk_path,omitempty"`
+	DiskDriver string   `protobuf:"bytes,4,opt,name=disk_driver,json=diskDriver,proto3" json:"disk_driver,omitempty"`
+}
+
+func (x *DiskGetRequest) Reset() {
+	*x = DiskGetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_disk_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskGetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskGetRequest) ProtoMessage() {}
+
+func (x *DiskGetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_disk_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskGetRequest.ProtoReflect.Descriptor instead.
+func (*DiskGetRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_disk_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *DiskGetRequest) GetDiskType() DiskType {
+	if x != nil {
+		return x.DiskType
+	}
+	return DiskType_filesystem
+}
+
+func (x *DiskGetRequest) GetDiskName() string {
+	if x != nil {
+		return x.DiskName
+	}
+	return ""
+}
+
+func (x *DiskGetRequest) GetDiskPath() string {
+	if x != nil {
+		return x.DiskPath
+	}
+	return ""
+}
+
+func (x *DiskGetRequest) GetDiskDriver() string {
+	if x != nil {
+		return x.DiskDriver
+	}
+	return ""
+}
+
+type DiskDeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DiskType   DiskType `protobuf:"varint,1,opt,name=disk_type,json=diskType,proto3,enum=imrpc.DiskType" json:"disk_type,omitempty"`
+	DiskName   string   `protobuf:"bytes,2,opt,name=disk_name,json=diskName,proto3" json:"disk_name,omitempty"`
+	DiskUuid   string   `protobuf:"bytes,3,opt,name=disk_uuid,json=diskUuid,proto3" json:"disk_uuid,omitempty"`
+	DiskPath   string   `protobuf:"bytes,4,opt,name=disk_path,json=diskPath,proto3" json:"disk_path,omitempty"`
+	DiskDriver string   `protobuf:"bytes,5,opt,name=disk_driver,json=diskDriver,proto3" json:"disk_driver,omitempty"`
+}
+
+func (x *DiskDeleteRequest) Reset() {
+	*x = DiskDeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_disk_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskDeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskDeleteRequest) ProtoMessage() {}
+
+func (x *DiskDeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_disk_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskDeleteRequest.ProtoReflect.Descriptor instead.
+func (*DiskDeleteRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_disk_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *DiskDeleteRequest) GetDiskType() DiskType {
+	if x != nil {
+		return x.DiskType
+	}
+	return DiskType_filesystem
+}
+
+func (x *DiskDeleteRequest) GetDiskName() string {
+	if x != nil {
+		return x.DiskName
+	}
+	return ""
+}
+
+func (x *DiskDeleteRequest) GetDiskUuid() string {
+	if x != nil {
+		return x.DiskUuid
+	}
+	return ""
+}
+
+func (x *DiskDeleteRequest) GetDiskPath() string {
+	if x != nil {
+		return x.DiskPath
+	}
+	return ""
+}
+
+func (x *DiskDeleteRequest) GetDiskDriver() string {
+	if x != nil {
+		return x.DiskDriver
+	}
+	return ""
+}
+
+type DiskReplicaInstanceListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DiskType   DiskType `protobuf:"varint,1,opt,name=disk_type,json=diskType,proto3,enum=imrpc.DiskType" json:"disk_type,omitempty"`
+	DiskName   string   `protobuf:"bytes,2,opt,name=disk_name,json=diskName,proto3" json:"disk_name,omitempty"`
+	DiskDriver string   `protobuf:"bytes,3,opt,name=disk_driver,json=diskDriver,proto3" json:"disk_driver,omitempty"`
+}
+
+func (x *DiskReplicaInstanceListRequest) Reset() {
+	*x = DiskReplicaInstanceListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_disk_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskReplicaInstanceListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskReplicaInstanceListRequest) ProtoMessage() {}
+
+func (x *DiskReplicaInstanceListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_disk_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskReplicaInstanceListRequest.ProtoReflect.Descriptor instead.
+func (*DiskReplicaInstanceListRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_disk_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *DiskReplicaInstanceListRequest) GetDiskType() DiskType {
+	if x != nil {
+		return x.DiskType
+	}
+	return DiskType_filesystem
+}
+
+func (x *DiskReplicaInstanceListRequest) GetDiskName() string {
+	if x != nil {
+		return x.DiskName
+	}
+	return ""
+}
+
+func (x *DiskReplicaInstanceListRequest) GetDiskDriver() string {
+	if x != nil {
+		return x.DiskDriver
+	}
+	return ""
+}
+
+type DiskReplicaInstanceListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ReplicaInstances map[string]*ReplicaInstance `protobuf:"bytes,1,rep,name=replica_instances,json=replicaInstances,proto3" json:"replica_instances,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *DiskReplicaInstanceListResponse) Reset() {
+	*x = DiskReplicaInstanceListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_disk_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskReplicaInstanceListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskReplicaInstanceListResponse) ProtoMessage() {}
+
+func (x *DiskReplicaInstanceListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_disk_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskReplicaInstanceListResponse.ProtoReflect.Descriptor instead.
+func (*DiskReplicaInstanceListResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_disk_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *DiskReplicaInstanceListResponse) GetReplicaInstances() map[string]*ReplicaInstance {
+	if x != nil {
+		return x.ReplicaInstances
+	}
+	return nil
+}
+
+type DiskReplicaInstanceDeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DiskType            DiskType `protobuf:"varint,1,opt,name=disk_type,json=diskType,proto3,enum=imrpc.DiskType" json:"disk_type,omitempty"`
+	DiskName            string   `protobuf:"bytes,2,opt,name=disk_name,json=diskName,proto3" json:"disk_name,omitempty"`
+	DiskUuid            string   `protobuf:"bytes,3,opt,name=disk_uuid,json=diskUuid,proto3" json:"disk_uuid,omitempty"`
+	ReplciaInstanceName string   `protobuf:"bytes,4,opt,name=replcia_instance_name,json=replciaInstanceName,proto3" json:"replcia_instance_name,omitempty"`
+	DiskDriver          string   `protobuf:"bytes,5,opt,name=disk_driver,json=diskDriver,proto3" json:"disk_driver,omitempty"`
+}
+
+func (x *DiskReplicaInstanceDeleteRequest) Reset() {
+	*x = DiskReplicaInstanceDeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_disk_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskReplicaInstanceDeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskReplicaInstanceDeleteRequest) ProtoMessage() {}
+
+func (x *DiskReplicaInstanceDeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_disk_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskReplicaInstanceDeleteRequest.ProtoReflect.Descriptor instead.
+func (*DiskReplicaInstanceDeleteRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_disk_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *DiskReplicaInstanceDeleteRequest) GetDiskType() DiskType {
+	if x != nil {
+		return x.DiskType
+	}
+	return DiskType_filesystem
+}
+
+func (x *DiskReplicaInstanceDeleteRequest) GetDiskName() string {
+	if x != nil {
+		return x.DiskName
+	}
+	return ""
+}
+
+func (x *DiskReplicaInstanceDeleteRequest) GetDiskUuid() string {
+	if x != nil {
+		return x.DiskUuid
+	}
+	return ""
+}
+
+func (x *DiskReplicaInstanceDeleteRequest) GetReplciaInstanceName() string {
+	if x != nil {
+		return x.ReplciaInstanceName
+	}
+	return ""
+}
+
+func (x *DiskReplicaInstanceDeleteRequest) GetDiskDriver() string {
+	if x != nil {
+		return x.DiskDriver
+	}
+	return ""
+}
+
+type DiskVersionResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Version                                 string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
+	GitCommit                               string `protobuf:"bytes,2,opt,name=gitCommit,proto3" json:"gitCommit,omitempty"`
+	BuildDate                               string `protobuf:"bytes,3,opt,name=buildDate,proto3" json:"buildDate,omitempty"`
+	InstanceManagerDiskServiceAPIVersion    int64  `protobuf:"varint,4,opt,name=instanceManagerDiskServiceAPIVersion,proto3" json:"instanceManagerDiskServiceAPIVersion,omitempty"`
+	InstanceManagerDiskServiceAPIMinVersion int64  `protobuf:"varint,5,opt,name=instanceManagerDiskServiceAPIMinVersion,proto3" json:"instanceManagerDiskServiceAPIMinVersion,omitempty"`
+}
+
+func (x *DiskVersionResponse) Reset() {
+	*x = DiskVersionResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_disk_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskVersionResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskVersionResponse) ProtoMessage() {}
+
+func (x *DiskVersionResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_disk_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskVersionResponse.ProtoReflect.Descriptor instead.
+func (*DiskVersionResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_disk_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *DiskVersionResponse) GetVersion() string {
+	if x != nil {
+		return x.Version
+	}
+	return ""
+}
+
+func (x *DiskVersionResponse) GetGitCommit() string {
+	if x != nil {
+		return x.GitCommit
+	}
+	return ""
+}
+
+func (x *DiskVersionResponse) GetBuildDate() string {
+	if x != nil {
+		return x.BuildDate
+	}
+	return ""
+}
+
+func (x *DiskVersionResponse) GetInstanceManagerDiskServiceAPIVersion() int64 {
+	if x != nil {
+		return x.InstanceManagerDiskServiceAPIVersion
+	}
+	return 0
+}
+
+func (x *DiskVersionResponse) GetInstanceManagerDiskServiceAPIMinVersion() int64 {
+	if x != nil {
+		return x.InstanceManagerDiskServiceAPIMinVersion
+	}
+	return 0
+}
+
+var File_imrpc_disk_proto protoreflect.FileDescriptor
+
+var file_imrpc_disk_proto_rawDesc = []byte{
+	0x0a, 0x10, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2f, 0x64, 0x69, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x12, 0x05, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc0, 0x02, 0x0a, 0x04, 0x44, 0x69, 0x73, 0x6b, 0x12,
+	0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
+	0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75,
+	0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74,
+	0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x72,
+	0x65, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66,
+	0x72, 0x65, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c,
+	0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74,
+	0x6f, 0x74, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72,
+	0x65, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x0a, 0x66, 0x72, 0x65, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x62,
+	0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c,
+	0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a,
+	0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64,
+	0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xb1, 0x01, 0x0a, 0x0f, 0x52, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x4e, 0x61,
+	0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x75, 0x69, 0x64, 0x12,
+	0x1b, 0x0a, 0x09, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x08, 0x73, 0x70, 0x65, 0x63, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b,
+	0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xd8, 0x01,
+	0x0a, 0x11, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44,
+	0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70,
+	0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b,
+	0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64,
+	0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x64, 0x69, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63,
+	0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c,
+	0x6f, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x5f,
+	0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69,
+	0x73, 0x6b, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x22, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x69, 0x73,
+	0x6b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x64,
+	0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f,
+	0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x52,
+	0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73,
+	0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69,
+	0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x70,
+	0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x50,
+	0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x64, 0x72, 0x69, 0x76,
+	0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, 0x44, 0x72,
+	0x69, 0x76, 0x65, 0x72, 0x22, 0xb9, 0x01, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x6b, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x64, 0x69,
+	0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e,
+	0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08,
+	0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b,
+	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73,
+	0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x75,
+	0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x75,
+	0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12,
+	0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72,
+	0x22, 0x8c, 0x01, 0x0a, 0x1e, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44,
+	0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70,
+	0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f,
+	0x0a, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x22,
+	0xe9, 0x01, 0x0a, 0x1f, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49,
+	0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x69,
+	0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c,
+	0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x6e,
+	0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x72, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x5b,
+	0x0a, 0x15, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63,
+	0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63,
+	0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdf, 0x01, 0x0a, 0x20,
+	0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x6e, 0x73, 0x74, 0x61,
+	0x6e, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x2c, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b,
+	0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b,
+	0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64,
+	0x69, 0x73, 0x6b, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x64, 0x69, 0x73, 0x6b, 0x55, 0x75, 0x69, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x70, 0x6c,
+	0x63, 0x69, 0x61, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x63, 0x69, 0x61,
+	0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b,
+	0x64, 0x69, 0x73, 0x6b, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x22, 0x99, 0x02,
+	0x0a, 0x13, 0x44, 0x69, 0x73, 0x6b, 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, 0x12,
+	0x1c, 0x0a, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x1c, 0x0a,
+	0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x24, 0x69,
+	0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x44, 0x69,
+	0x73, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x50, 0x49, 0x56, 0x65, 0x72, 0x73,
+	0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x24, 0x69, 0x6e, 0x73, 0x74, 0x61,
+	0x6e, 0x63, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x50, 0x49, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
+	0x58, 0x0a, 0x27, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67,
+	0x65, 0x72, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x50, 0x49,
+	0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x27, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65,
+	0x72, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x50, 0x49, 0x4d,
+	0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2a, 0x25, 0x0a, 0x08, 0x44, 0x69, 0x73,
+	0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73,
+	0x74, 0x65, 0x6d, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x01,
+	0x32, 0xbb, 0x03, 0x0a, 0x0b, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x12, 0x33, 0x0a, 0x0a, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x18,
+	0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63,
+	0x2e, 0x44, 0x69, 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x0a, 0x44, 0x69, 0x73, 0x6b, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2d, 0x0a, 0x07, 0x44, 0x69, 0x73, 0x6b, 0x47, 0x65, 0x74,
+	0x12, 0x15, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x47, 0x65, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e,
+	0x44, 0x69, 0x73, 0x6b, 0x12, 0x68, 0x0a, 0x17, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12,
+	0x25, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44,
+	0x69, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e,
+	0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c,
+	0x0a, 0x19, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x6e, 0x73,
+	0x74, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x27, 0x2e, 0x69, 0x6d,
+	0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49,
+	0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x40, 0x0a, 0x0a,
+	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70,
+	0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x56,
+	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x2f,
+	0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6f, 0x6e,
+	0x67, 0x68, 0x6f, 0x72, 0x6e, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f,
+	0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2f, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x62,
+	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_imrpc_disk_proto_rawDescOnce sync.Once
+	file_imrpc_disk_proto_rawDescData = file_imrpc_disk_proto_rawDesc
+)
+
+func file_imrpc_disk_proto_rawDescGZIP() []byte {
+	file_imrpc_disk_proto_rawDescOnce.Do(func() {
+		file_imrpc_disk_proto_rawDescData = protoimpl.X.CompressGZIP(file_imrpc_disk_proto_rawDescData)
+	})
+	return file_imrpc_disk_proto_rawDescData
+}
+
+var file_imrpc_disk_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_imrpc_disk_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
+var file_imrpc_disk_proto_goTypes = []interface{}{
+	(DiskType)(0),                            // 0: imrpc.DiskType
+	(*Disk)(nil),                             // 1: imrpc.Disk
+	(*ReplicaInstance)(nil),                  // 2: imrpc.ReplicaInstance
+	(*DiskCreateRequest)(nil),                // 3: imrpc.DiskCreateRequest
+	(*DiskGetRequest)(nil),                   // 4: imrpc.DiskGetRequest
+	(*DiskDeleteRequest)(nil),                // 5: imrpc.DiskDeleteRequest
+	(*DiskReplicaInstanceListRequest)(nil),   // 6: imrpc.DiskReplicaInstanceListRequest
+	(*DiskReplicaInstanceListResponse)(nil),  // 7: imrpc.DiskReplicaInstanceListResponse
+	(*DiskReplicaInstanceDeleteRequest)(nil), // 8: imrpc.DiskReplicaInstanceDeleteRequest
+	(*DiskVersionResponse)(nil),              // 9: imrpc.DiskVersionResponse
+	nil,                                      // 10: imrpc.DiskReplicaInstanceListResponse.ReplicaInstancesEntry
+	(*emptypb.Empty)(nil),                    // 11: google.protobuf.Empty
+}
+var file_imrpc_disk_proto_depIdxs = []int32{
+	0,  // 0: imrpc.DiskCreateRequest.disk_type:type_name -> imrpc.DiskType
+	0,  // 1: imrpc.DiskGetRequest.disk_type:type_name -> imrpc.DiskType
+	0,  // 2: imrpc.DiskDeleteRequest.disk_type:type_name -> imrpc.DiskType
+	0,  // 3: imrpc.DiskReplicaInstanceListRequest.disk_type:type_name -> imrpc.DiskType
+	10, // 4: imrpc.DiskReplicaInstanceListResponse.replica_instances:type_name -> imrpc.DiskReplicaInstanceListResponse.ReplicaInstancesEntry
+	0,  // 5: imrpc.DiskReplicaInstanceDeleteRequest.disk_type:type_name -> imrpc.DiskType
+	2,  // 6: imrpc.DiskReplicaInstanceListResponse.ReplicaInstancesEntry.value:type_name -> imrpc.ReplicaInstance
+	3,  // 7: imrpc.DiskService.DiskCreate:input_type -> imrpc.DiskCreateRequest
+	5,  // 8: imrpc.DiskService.DiskDelete:input_type -> imrpc.DiskDeleteRequest
+	4,  // 9: imrpc.DiskService.DiskGet:input_type -> imrpc.DiskGetRequest
+	6,  // 10: imrpc.DiskService.DiskReplicaInstanceList:input_type -> imrpc.DiskReplicaInstanceListRequest
+	8,  // 11: imrpc.DiskService.DiskReplicaInstanceDelete:input_type -> imrpc.DiskReplicaInstanceDeleteRequest
+	11, // 12: imrpc.DiskService.VersionGet:input_type -> google.protobuf.Empty
+	1,  // 13: imrpc.DiskService.DiskCreate:output_type -> imrpc.Disk
+	11, // 14: imrpc.DiskService.DiskDelete:output_type -> google.protobuf.Empty
+	1,  // 15: imrpc.DiskService.DiskGet:output_type -> imrpc.Disk
+	7,  // 16: imrpc.DiskService.DiskReplicaInstanceList:output_type -> imrpc.DiskReplicaInstanceListResponse
+	11, // 17: imrpc.DiskService.DiskReplicaInstanceDelete:output_type -> google.protobuf.Empty
+	9,  // 18: imrpc.DiskService.VersionGet:output_type -> imrpc.DiskVersionResponse
+	13, // [13:19] is the sub-list for method output_type
+	7,  // [7:13] is the sub-list for method input_type
+	7,  // [7:7] is the sub-list for extension type_name
+	7,  // [7:7] is the sub-list for extension extendee
+	0,  // [0:7] is the sub-list for field type_name
+}
+
+func init() { file_imrpc_disk_proto_init() }
+func file_imrpc_disk_proto_init() {
+	if File_imrpc_disk_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_imrpc_disk_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Disk); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_disk_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaInstance); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_disk_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_disk_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskGetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_disk_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskDeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_disk_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskReplicaInstanceListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_disk_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskReplicaInstanceListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_disk_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskReplicaInstanceDeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_disk_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskVersionResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_imrpc_disk_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   10,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_imrpc_disk_proto_goTypes,
+		DependencyIndexes: file_imrpc_disk_proto_depIdxs,
+		EnumInfos:         file_imrpc_disk_proto_enumTypes,
+		MessageInfos:      file_imrpc_disk_proto_msgTypes,
+	}.Build()
+	File_imrpc_disk_proto = out.File
+	file_imrpc_disk_proto_rawDesc = nil
+	file_imrpc_disk_proto_goTypes = nil
+	file_imrpc_disk_proto_depIdxs = nil
+}
diff --git a/pkg/generated/imrpc/disk_grpc.pb.go b/pkg/generated/imrpc/disk_grpc.pb.go
new file mode 100644
index 0000000..866a21b
--- /dev/null
+++ b/pkg/generated/imrpc/disk_grpc.pb.go
@@ -0,0 +1,295 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v4.24.3
+// source: imrpc/disk.proto
+
+package imrpc
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+	DiskService_DiskCreate_FullMethodName                = "/imrpc.DiskService/DiskCreate"
+	DiskService_DiskDelete_FullMethodName                = "/imrpc.DiskService/DiskDelete"
+	DiskService_DiskGet_FullMethodName                   = "/imrpc.DiskService/DiskGet"
+	DiskService_DiskReplicaInstanceList_FullMethodName   = "/imrpc.DiskService/DiskReplicaInstanceList"
+	DiskService_DiskReplicaInstanceDelete_FullMethodName = "/imrpc.DiskService/DiskReplicaInstanceDelete"
+	DiskService_VersionGet_FullMethodName                = "/imrpc.DiskService/VersionGet"
+)
+
+// DiskServiceClient is the client API for DiskService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type DiskServiceClient interface {
+	DiskCreate(ctx context.Context, in *DiskCreateRequest, opts ...grpc.CallOption) (*Disk, error)
+	DiskDelete(ctx context.Context, in *DiskDeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	DiskGet(ctx context.Context, in *DiskGetRequest, opts ...grpc.CallOption) (*Disk, error)
+	DiskReplicaInstanceList(ctx context.Context, in *DiskReplicaInstanceListRequest, opts ...grpc.CallOption) (*DiskReplicaInstanceListResponse, error)
+	DiskReplicaInstanceDelete(ctx context.Context, in *DiskReplicaInstanceDeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	VersionGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DiskVersionResponse, error)
+}
+
+type diskServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewDiskServiceClient(cc grpc.ClientConnInterface) DiskServiceClient {
+	return &diskServiceClient{cc}
+}
+
+func (c *diskServiceClient) DiskCreate(ctx context.Context, in *DiskCreateRequest, opts ...grpc.CallOption) (*Disk, error) {
+	out := new(Disk)
+	err := c.cc.Invoke(ctx, DiskService_DiskCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *diskServiceClient) DiskDelete(ctx context.Context, in *DiskDeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, DiskService_DiskDelete_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *diskServiceClient) DiskGet(ctx context.Context, in *DiskGetRequest, opts ...grpc.CallOption) (*Disk, error) {
+	out := new(Disk)
+	err := c.cc.Invoke(ctx, DiskService_DiskGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *diskServiceClient) DiskReplicaInstanceList(ctx context.Context, in *DiskReplicaInstanceListRequest, opts ...grpc.CallOption) (*DiskReplicaInstanceListResponse, error) {
+	out := new(DiskReplicaInstanceListResponse)
+	err := c.cc.Invoke(ctx, DiskService_DiskReplicaInstanceList_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *diskServiceClient) DiskReplicaInstanceDelete(ctx context.Context, in *DiskReplicaInstanceDeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, DiskService_DiskReplicaInstanceDelete_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *diskServiceClient) VersionGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DiskVersionResponse, error) {
+	out := new(DiskVersionResponse)
+	err := c.cc.Invoke(ctx, DiskService_VersionGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// DiskServiceServer is the server API for DiskService service.
+// All implementations must embed UnimplementedDiskServiceServer
+// for forward compatibility
+type DiskServiceServer interface {
+	DiskCreate(context.Context, *DiskCreateRequest) (*Disk, error)
+	DiskDelete(context.Context, *DiskDeleteRequest) (*emptypb.Empty, error)
+	DiskGet(context.Context, *DiskGetRequest) (*Disk, error)
+	DiskReplicaInstanceList(context.Context, *DiskReplicaInstanceListRequest) (*DiskReplicaInstanceListResponse, error)
+	DiskReplicaInstanceDelete(context.Context, *DiskReplicaInstanceDeleteRequest) (*emptypb.Empty, error)
+	VersionGet(context.Context, *emptypb.Empty) (*DiskVersionResponse, error)
+	mustEmbedUnimplementedDiskServiceServer()
+}
+
+// UnimplementedDiskServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedDiskServiceServer struct {
+}
+
+func (UnimplementedDiskServiceServer) DiskCreate(context.Context, *DiskCreateRequest) (*Disk, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DiskCreate not implemented")
+}
+func (UnimplementedDiskServiceServer) DiskDelete(context.Context, *DiskDeleteRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DiskDelete not implemented")
+}
+func (UnimplementedDiskServiceServer) DiskGet(context.Context, *DiskGetRequest) (*Disk, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DiskGet not implemented")
+}
+func (UnimplementedDiskServiceServer) DiskReplicaInstanceList(context.Context, *DiskReplicaInstanceListRequest) (*DiskReplicaInstanceListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DiskReplicaInstanceList not implemented")
+}
+func (UnimplementedDiskServiceServer) DiskReplicaInstanceDelete(context.Context, *DiskReplicaInstanceDeleteRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DiskReplicaInstanceDelete not implemented")
+}
+func (UnimplementedDiskServiceServer) VersionGet(context.Context, *emptypb.Empty) (*DiskVersionResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VersionGet not implemented")
+}
+func (UnimplementedDiskServiceServer) mustEmbedUnimplementedDiskServiceServer() {}
+
+// UnsafeDiskServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to DiskServiceServer will
+// result in compilation errors.
+type UnsafeDiskServiceServer interface {
+	mustEmbedUnimplementedDiskServiceServer()
+}
+
+func RegisterDiskServiceServer(s grpc.ServiceRegistrar, srv DiskServiceServer) {
+	s.RegisterService(&DiskService_ServiceDesc, srv)
+}
+
+func _DiskService_DiskCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DiskCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DiskServiceServer).DiskCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: DiskService_DiskCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DiskServiceServer).DiskCreate(ctx, req.(*DiskCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _DiskService_DiskDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DiskDeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DiskServiceServer).DiskDelete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: DiskService_DiskDelete_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DiskServiceServer).DiskDelete(ctx, req.(*DiskDeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _DiskService_DiskGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DiskGetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DiskServiceServer).DiskGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: DiskService_DiskGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DiskServiceServer).DiskGet(ctx, req.(*DiskGetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _DiskService_DiskReplicaInstanceList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DiskReplicaInstanceListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DiskServiceServer).DiskReplicaInstanceList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: DiskService_DiskReplicaInstanceList_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DiskServiceServer).DiskReplicaInstanceList(ctx, req.(*DiskReplicaInstanceListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _DiskService_DiskReplicaInstanceDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DiskReplicaInstanceDeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DiskServiceServer).DiskReplicaInstanceDelete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: DiskService_DiskReplicaInstanceDelete_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DiskServiceServer).DiskReplicaInstanceDelete(ctx, req.(*DiskReplicaInstanceDeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _DiskService_VersionGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DiskServiceServer).VersionGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: DiskService_VersionGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DiskServiceServer).VersionGet(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// DiskService_ServiceDesc is the grpc.ServiceDesc for DiskService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var DiskService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "imrpc.DiskService",
+	HandlerType: (*DiskServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "DiskCreate",
+			Handler:    _DiskService_DiskCreate_Handler,
+		},
+		{
+			MethodName: "DiskDelete",
+			Handler:    _DiskService_DiskDelete_Handler,
+		},
+		{
+			MethodName: "DiskGet",
+			Handler:    _DiskService_DiskGet_Handler,
+		},
+		{
+			MethodName: "DiskReplicaInstanceList",
+			Handler:    _DiskService_DiskReplicaInstanceList_Handler,
+		},
+		{
+			MethodName: "DiskReplicaInstanceDelete",
+			Handler:    _DiskService_DiskReplicaInstanceDelete_Handler,
+		},
+		{
+			MethodName: "VersionGet",
+			Handler:    _DiskService_VersionGet_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "imrpc/disk.proto",
+}
diff --git a/pkg/generated/imrpc/imrpc.pb.go b/pkg/generated/imrpc/imrpc.pb.go
new file mode 100644
index 0000000..3960165
--- /dev/null
+++ b/pkg/generated/imrpc/imrpc.pb.go
@@ -0,0 +1,1075 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
+// source: imrpc/imrpc.proto
+
+package imrpc
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type ProcessSpec struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name      string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Binary    string   `protobuf:"bytes,2,opt,name=binary,proto3" json:"binary,omitempty"`
+	Args      []string `protobuf:"bytes,3,rep,name=args,proto3" json:"args,omitempty"`
+	PortCount int32    `protobuf:"varint,4,opt,name=port_count,json=portCount,proto3" json:"port_count,omitempty"`
+	PortArgs  []string `protobuf:"bytes,5,rep,name=port_args,json=portArgs,proto3" json:"port_args,omitempty"`
+}
+
+func (x *ProcessSpec) Reset() {
+	*x = ProcessSpec{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_imrpc_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ProcessSpec) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ProcessSpec) ProtoMessage() {}
+
+func (x *ProcessSpec) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_imrpc_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ProcessSpec.ProtoReflect.Descriptor instead.
+func (*ProcessSpec) Descriptor() ([]byte, []int) {
+	return file_imrpc_imrpc_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *ProcessSpec) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *ProcessSpec) GetBinary() string {
+	if x != nil {
+		return x.Binary
+	}
+	return ""
+}
+
+func (x *ProcessSpec) GetArgs() []string {
+	if x != nil {
+		return x.Args
+	}
+	return nil
+}
+
+func (x *ProcessSpec) GetPortCount() int32 {
+	if x != nil {
+		return x.PortCount
+	}
+	return 0
+}
+
+func (x *ProcessSpec) GetPortArgs() []string {
+	if x != nil {
+		return x.PortArgs
+	}
+	return nil
+}
+
+type ProcessStatus struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	State      string          `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"`
+	ErrorMsg   string          `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"`
+	PortStart  int32           `protobuf:"varint,3,opt,name=port_start,json=portStart,proto3" json:"port_start,omitempty"`
+	PortEnd    int32           `protobuf:"varint,4,opt,name=port_end,json=portEnd,proto3" json:"port_end,omitempty"`
+	Conditions map[string]bool `protobuf:"bytes,5,rep,name=conditions,proto3" json:"conditions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
+}
+
+func (x *ProcessStatus) Reset() {
+	*x = ProcessStatus{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_imrpc_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ProcessStatus) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ProcessStatus) ProtoMessage() {}
+
+func (x *ProcessStatus) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_imrpc_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ProcessStatus.ProtoReflect.Descriptor instead.
+func (*ProcessStatus) Descriptor() ([]byte, []int) {
+	return file_imrpc_imrpc_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *ProcessStatus) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+func (x *ProcessStatus) GetErrorMsg() string {
+	if x != nil {
+		return x.ErrorMsg
+	}
+	return ""
+}
+
+func (x *ProcessStatus) GetPortStart() int32 {
+	if x != nil {
+		return x.PortStart
+	}
+	return 0
+}
+
+func (x *ProcessStatus) GetPortEnd() int32 {
+	if x != nil {
+		return x.PortEnd
+	}
+	return 0
+}
+
+func (x *ProcessStatus) GetConditions() map[string]bool {
+	if x != nil {
+		return x.Conditions
+	}
+	return nil
+}
+
+type ProcessCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Spec *ProcessSpec `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"`
+}
+
+func (x *ProcessCreateRequest) Reset() {
+	*x = ProcessCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_imrpc_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ProcessCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ProcessCreateRequest) ProtoMessage() {}
+
+func (x *ProcessCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_imrpc_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ProcessCreateRequest.ProtoReflect.Descriptor instead.
+func (*ProcessCreateRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_imrpc_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *ProcessCreateRequest) GetSpec() *ProcessSpec {
+	if x != nil {
+		return x.Spec
+	}
+	return nil
+}
+
+type ProcessDeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *ProcessDeleteRequest) Reset() {
+	*x = ProcessDeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_imrpc_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ProcessDeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ProcessDeleteRequest) ProtoMessage() {}
+
+func (x *ProcessDeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_imrpc_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ProcessDeleteRequest.ProtoReflect.Descriptor instead.
+func (*ProcessDeleteRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_imrpc_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *ProcessDeleteRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type ProcessGetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *ProcessGetRequest) Reset() {
+	*x = ProcessGetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_imrpc_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ProcessGetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ProcessGetRequest) ProtoMessage() {}
+
+func (x *ProcessGetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_imrpc_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ProcessGetRequest.ProtoReflect.Descriptor instead.
+func (*ProcessGetRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_imrpc_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *ProcessGetRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type ProcessResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Spec    *ProcessSpec   `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"`
+	Status  *ProcessStatus `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
+	Deleted bool           `protobuf:"varint,3,opt,name=deleted,proto3" json:"deleted,omitempty"`
+}
+
+func (x *ProcessResponse) Reset() {
+	*x = ProcessResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_imrpc_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ProcessResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ProcessResponse) ProtoMessage() {}
+
+func (x *ProcessResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_imrpc_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ProcessResponse.ProtoReflect.Descriptor instead.
+func (*ProcessResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_imrpc_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *ProcessResponse) GetSpec() *ProcessSpec {
+	if x != nil {
+		return x.Spec
+	}
+	return nil
+}
+
+func (x *ProcessResponse) GetStatus() *ProcessStatus {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+func (x *ProcessResponse) GetDeleted() bool {
+	if x != nil {
+		return x.Deleted
+	}
+	return false
+}
+
+type ProcessListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ProcessListRequest) Reset() {
+	*x = ProcessListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_imrpc_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ProcessListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ProcessListRequest) ProtoMessage() {}
+
+func (x *ProcessListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_imrpc_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ProcessListRequest.ProtoReflect.Descriptor instead.
+func (*ProcessListRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_imrpc_proto_rawDescGZIP(), []int{6}
+}
+
+type ProcessListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Processes map[string]*ProcessResponse `protobuf:"bytes,1,rep,name=processes,proto3" json:"processes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *ProcessListResponse) Reset() {
+	*x = ProcessListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_imrpc_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ProcessListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ProcessListResponse) ProtoMessage() {}
+
+func (x *ProcessListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_imrpc_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ProcessListResponse.ProtoReflect.Descriptor instead.
+func (*ProcessListResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_imrpc_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *ProcessListResponse) GetProcesses() map[string]*ProcessResponse {
+	if x != nil {
+		return x.Processes
+	}
+	return nil
+}
+
+type LogRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *LogRequest) Reset() {
+	*x = LogRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_imrpc_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LogRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogRequest) ProtoMessage() {}
+
+func (x *LogRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_imrpc_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LogRequest.ProtoReflect.Descriptor instead.
+func (*LogRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_imrpc_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *LogRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type ProcessReplaceRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Spec            *ProcessSpec `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"`
+	TerminateSignal string       `protobuf:"bytes,2,opt,name=terminate_signal,json=terminateSignal,proto3" json:"terminate_signal,omitempty"`
+}
+
+func (x *ProcessReplaceRequest) Reset() {
+	*x = ProcessReplaceRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_imrpc_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ProcessReplaceRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ProcessReplaceRequest) ProtoMessage() {}
+
+func (x *ProcessReplaceRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_imrpc_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ProcessReplaceRequest.ProtoReflect.Descriptor instead.
+func (*ProcessReplaceRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_imrpc_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *ProcessReplaceRequest) GetSpec() *ProcessSpec {
+	if x != nil {
+		return x.Spec
+	}
+	return nil
+}
+
+func (x *ProcessReplaceRequest) GetTerminateSignal() string {
+	if x != nil {
+		return x.TerminateSignal
+	}
+	return ""
+}
+
+type LogResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Line string `protobuf:"bytes,2,opt,name=line,proto3" json:"line,omitempty"`
+}
+
+func (x *LogResponse) Reset() {
+	*x = LogResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_imrpc_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LogResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogResponse) ProtoMessage() {}
+
+func (x *LogResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_imrpc_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LogResponse.ProtoReflect.Descriptor instead.
+func (*LogResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_imrpc_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *LogResponse) GetLine() string {
+	if x != nil {
+		return x.Line
+	}
+	return ""
+}
+
+type VersionResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Version                           string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
+	GitCommit                         string `protobuf:"bytes,2,opt,name=gitCommit,proto3" json:"gitCommit,omitempty"`
+	BuildDate                         string `protobuf:"bytes,3,opt,name=buildDate,proto3" json:"buildDate,omitempty"`
+	InstanceManagerAPIVersion         int64  `protobuf:"varint,4,opt,name=instanceManagerAPIVersion,proto3" json:"instanceManagerAPIVersion,omitempty"`
+	InstanceManagerAPIMinVersion      int64  `protobuf:"varint,5,opt,name=instanceManagerAPIMinVersion,proto3" json:"instanceManagerAPIMinVersion,omitempty"`
+	InstanceManagerProxyAPIVersion    int64  `protobuf:"varint,6,opt,name=instanceManagerProxyAPIVersion,proto3" json:"instanceManagerProxyAPIVersion,omitempty"`
+	InstanceManagerProxyAPIMinVersion int64  `protobuf:"varint,7,opt,name=instanceManagerProxyAPIMinVersion,proto3" json:"instanceManagerProxyAPIMinVersion,omitempty"`
+}
+
+func (x *VersionResponse) Reset() {
+	*x = VersionResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_imrpc_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VersionResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VersionResponse) ProtoMessage() {}
+
+func (x *VersionResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_imrpc_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VersionResponse.ProtoReflect.Descriptor instead.
+func (*VersionResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_imrpc_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *VersionResponse) GetVersion() string {
+	if x != nil {
+		return x.Version
+	}
+	return ""
+}
+
+func (x *VersionResponse) GetGitCommit() string {
+	if x != nil {
+		return x.GitCommit
+	}
+	return ""
+}
+
+func (x *VersionResponse) GetBuildDate() string {
+	if x != nil {
+		return x.BuildDate
+	}
+	return ""
+}
+
+func (x *VersionResponse) GetInstanceManagerAPIVersion() int64 {
+	if x != nil {
+		return x.InstanceManagerAPIVersion
+	}
+	return 0
+}
+
+func (x *VersionResponse) GetInstanceManagerAPIMinVersion() int64 {
+	if x != nil {
+		return x.InstanceManagerAPIMinVersion
+	}
+	return 0
+}
+
+func (x *VersionResponse) GetInstanceManagerProxyAPIVersion() int64 {
+	if x != nil {
+		return x.InstanceManagerProxyAPIVersion
+	}
+	return 0
+}
+
+func (x *VersionResponse) GetInstanceManagerProxyAPIMinVersion() int64 {
+	if x != nil {
+		return x.InstanceManagerProxyAPIMinVersion
+	}
+	return 0
+}
+
+var File_imrpc_imrpc_proto protoreflect.FileDescriptor
+
+var file_imrpc_imrpc_proto_rawDesc = []byte{
+	0x0a, 0x11, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2f, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x22, 0x89, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63,
+	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04,
+	0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73,
+	0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12,
+	0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03,
+	0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x72, 0x67, 0x73, 0x22, 0xfb, 0x01, 0x0a,
+	0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14,
+	0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73,
+	0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73,
+	0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74,
+	0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x05, 0x52, 0x07, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x6e, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x63,
+	0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x1e, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e,
+	0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
+	0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x43,
+	0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 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, 0x08, 0x52,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x38, 0x0a, 0x14, 0x50, 0x72,
+	0x6f, 0x63, 0x65, 0x73, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x0c, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04,
+	0x73, 0x70, 0x65, 0x63, 0x22, 0x2a, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 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,
+	0x22, 0x27, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x47, 0x65, 0x74, 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, 0x75, 0x0a, 0x0f, 0x50, 0x72, 0x6f,
+	0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x04,
+	0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x50, 0x72, 0x6f,
+	0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x26,
+	0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e,
+	0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06,
+	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64,
+	0x22, 0x14, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa8, 0x01, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x63, 0x65,
+	0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41,
+	0x0a, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x23, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65,
+	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65,
+	0x73, 0x1a, 0x4e, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 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, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
+	0x01, 0x22, 0x20, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 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, 0x64, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65,
+	0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x04,
+	0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x50, 0x72, 0x6f,
+	0x63, 0x65, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x29,
+	0x0a, 0x10, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e,
+	0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e,
+	0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x22, 0x21, 0x0a, 0x0b, 0x4c, 0x6f, 0x67,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0xff, 0x02, 0x0a,
+	0x0f, 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, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x69,
+	0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67,
+	0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x44, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x75, 0x69,
+	0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x19, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e,
+	0x63, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x41, 0x50, 0x49, 0x56, 0x65, 0x72, 0x73,
+	0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x69, 0x6e, 0x73, 0x74, 0x61,
+	0x6e, 0x63, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x41, 0x50, 0x49, 0x56, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x1c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x41, 0x50, 0x49, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1c, 0x69, 0x6e, 0x73, 0x74,
+	0x61, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x41, 0x50, 0x49, 0x4d, 0x69,
+	0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x1e, 0x69, 0x6e, 0x73, 0x74,
+	0x61, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79,
+	0x41, 0x50, 0x49, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x1e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65,
+	0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x41, 0x50, 0x49, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+	0x12, 0x4c, 0x0a, 0x21, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x6e, 0x61,
+	0x67, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x41, 0x50, 0x49, 0x4d, 0x69, 0x6e, 0x56, 0x65,
+	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x21, 0x69, 0x6e, 0x73,
+	0x74, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x78,
+	0x79, 0x41, 0x50, 0x49, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0xe2,
+	0x03, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65,
+	0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63,
+	0x65, 0x73, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x50, 0x72, 0x6f, 0x63,
+	0x65, 0x73, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x10, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x50,
+	0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
+	0x12, 0x34, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x47, 0x65, 0x74, 0x12, 0x12,
+	0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x10, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73,
+	0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x50, 0x72, 0x6f,
+	0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x12, 0x2b, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67,
+	0x12, 0x0b, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e,
+	0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12,
+	0x3c, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x57, 0x61, 0x74, 0x63, 0x68, 0x12,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x10, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3c, 0x0a,
+	0x0e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12,
+	0x16, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0a, 0x56,
+	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x1a, 0x10, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
+	0x6d, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x68, 0x6f, 0x72, 0x6e, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73,
+	0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2f, 0x69,
+	0x6d, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_imrpc_imrpc_proto_rawDescOnce sync.Once
+	file_imrpc_imrpc_proto_rawDescData = file_imrpc_imrpc_proto_rawDesc
+)
+
+func file_imrpc_imrpc_proto_rawDescGZIP() []byte {
+	file_imrpc_imrpc_proto_rawDescOnce.Do(func() {
+		file_imrpc_imrpc_proto_rawDescData = protoimpl.X.CompressGZIP(file_imrpc_imrpc_proto_rawDescData)
+	})
+	return file_imrpc_imrpc_proto_rawDescData
+}
+
+var file_imrpc_imrpc_proto_msgTypes = make([]protoimpl.MessageInfo, 14)
+var file_imrpc_imrpc_proto_goTypes = []interface{}{
+	(*ProcessSpec)(nil),           // 0: ProcessSpec
+	(*ProcessStatus)(nil),         // 1: ProcessStatus
+	(*ProcessCreateRequest)(nil),  // 2: ProcessCreateRequest
+	(*ProcessDeleteRequest)(nil),  // 3: ProcessDeleteRequest
+	(*ProcessGetRequest)(nil),     // 4: ProcessGetRequest
+	(*ProcessResponse)(nil),       // 5: ProcessResponse
+	(*ProcessListRequest)(nil),    // 6: ProcessListRequest
+	(*ProcessListResponse)(nil),   // 7: ProcessListResponse
+	(*LogRequest)(nil),            // 8: LogRequest
+	(*ProcessReplaceRequest)(nil), // 9: ProcessReplaceRequest
+	(*LogResponse)(nil),           // 10: LogResponse
+	(*VersionResponse)(nil),       // 11: VersionResponse
+	nil,                           // 12: ProcessStatus.ConditionsEntry
+	nil,                           // 13: ProcessListResponse.ProcessesEntry
+	(*emptypb.Empty)(nil),         // 14: google.protobuf.Empty
+}
+var file_imrpc_imrpc_proto_depIdxs = []int32{
+	12, // 0: ProcessStatus.conditions:type_name -> ProcessStatus.ConditionsEntry
+	0,  // 1: ProcessCreateRequest.spec:type_name -> ProcessSpec
+	0,  // 2: ProcessResponse.spec:type_name -> ProcessSpec
+	1,  // 3: ProcessResponse.status:type_name -> ProcessStatus
+	13, // 4: ProcessListResponse.processes:type_name -> ProcessListResponse.ProcessesEntry
+	0,  // 5: ProcessReplaceRequest.spec:type_name -> ProcessSpec
+	5,  // 6: ProcessListResponse.ProcessesEntry.value:type_name -> ProcessResponse
+	2,  // 7: ProcessManagerService.ProcessCreate:input_type -> ProcessCreateRequest
+	3,  // 8: ProcessManagerService.ProcessDelete:input_type -> ProcessDeleteRequest
+	4,  // 9: ProcessManagerService.ProcessGet:input_type -> ProcessGetRequest
+	6,  // 10: ProcessManagerService.ProcessList:input_type -> ProcessListRequest
+	8,  // 11: ProcessManagerService.ProcessLog:input_type -> LogRequest
+	14, // 12: ProcessManagerService.ProcessWatch:input_type -> google.protobuf.Empty
+	9,  // 13: ProcessManagerService.ProcessReplace:input_type -> ProcessReplaceRequest
+	14, // 14: ProcessManagerService.VersionGet:input_type -> google.protobuf.Empty
+	5,  // 15: ProcessManagerService.ProcessCreate:output_type -> ProcessResponse
+	5,  // 16: ProcessManagerService.ProcessDelete:output_type -> ProcessResponse
+	5,  // 17: ProcessManagerService.ProcessGet:output_type -> ProcessResponse
+	7,  // 18: ProcessManagerService.ProcessList:output_type -> ProcessListResponse
+	10, // 19: ProcessManagerService.ProcessLog:output_type -> LogResponse
+	5,  // 20: ProcessManagerService.ProcessWatch:output_type -> ProcessResponse
+	5,  // 21: ProcessManagerService.ProcessReplace:output_type -> ProcessResponse
+	11, // 22: ProcessManagerService.VersionGet:output_type -> VersionResponse
+	15, // [15:23] is the sub-list for method output_type
+	7,  // [7:15] is the sub-list for method input_type
+	7,  // [7:7] is the sub-list for extension type_name
+	7,  // [7:7] is the sub-list for extension extendee
+	0,  // [0:7] is the sub-list for field type_name
+}
+
+func init() { file_imrpc_imrpc_proto_init() }
+func file_imrpc_imrpc_proto_init() {
+	if File_imrpc_imrpc_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_imrpc_imrpc_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ProcessSpec); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_imrpc_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ProcessStatus); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_imrpc_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ProcessCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_imrpc_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ProcessDeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_imrpc_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ProcessGetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_imrpc_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ProcessResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_imrpc_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ProcessListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_imrpc_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ProcessListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_imrpc_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LogRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_imrpc_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ProcessReplaceRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_imrpc_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LogResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_imrpc_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VersionResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_imrpc_imrpc_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   14,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_imrpc_imrpc_proto_goTypes,
+		DependencyIndexes: file_imrpc_imrpc_proto_depIdxs,
+		MessageInfos:      file_imrpc_imrpc_proto_msgTypes,
+	}.Build()
+	File_imrpc_imrpc_proto = out.File
+	file_imrpc_imrpc_proto_rawDesc = nil
+	file_imrpc_imrpc_proto_goTypes = nil
+	file_imrpc_imrpc_proto_depIdxs = nil
+}
diff --git a/pkg/generated/imrpc/imrpc_grpc.pb.go b/pkg/generated/imrpc/imrpc_grpc.pb.go
new file mode 100644
index 0000000..d60e02d
--- /dev/null
+++ b/pkg/generated/imrpc/imrpc_grpc.pb.go
@@ -0,0 +1,424 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v4.24.3
+// source: imrpc/imrpc.proto
+
+package imrpc
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+	ProcessManagerService_ProcessCreate_FullMethodName  = "/ProcessManagerService/ProcessCreate"
+	ProcessManagerService_ProcessDelete_FullMethodName  = "/ProcessManagerService/ProcessDelete"
+	ProcessManagerService_ProcessGet_FullMethodName     = "/ProcessManagerService/ProcessGet"
+	ProcessManagerService_ProcessList_FullMethodName    = "/ProcessManagerService/ProcessList"
+	ProcessManagerService_ProcessLog_FullMethodName     = "/ProcessManagerService/ProcessLog"
+	ProcessManagerService_ProcessWatch_FullMethodName   = "/ProcessManagerService/ProcessWatch"
+	ProcessManagerService_ProcessReplace_FullMethodName = "/ProcessManagerService/ProcessReplace"
+	ProcessManagerService_VersionGet_FullMethodName     = "/ProcessManagerService/VersionGet"
+)
+
+// ProcessManagerServiceClient is the client API for ProcessManagerService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type ProcessManagerServiceClient interface {
+	ProcessCreate(ctx context.Context, in *ProcessCreateRequest, opts ...grpc.CallOption) (*ProcessResponse, error)
+	ProcessDelete(ctx context.Context, in *ProcessDeleteRequest, opts ...grpc.CallOption) (*ProcessResponse, error)
+	ProcessGet(ctx context.Context, in *ProcessGetRequest, opts ...grpc.CallOption) (*ProcessResponse, error)
+	ProcessList(ctx context.Context, in *ProcessListRequest, opts ...grpc.CallOption) (*ProcessListResponse, error)
+	ProcessLog(ctx context.Context, in *LogRequest, opts ...grpc.CallOption) (ProcessManagerService_ProcessLogClient, error)
+	ProcessWatch(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (ProcessManagerService_ProcessWatchClient, error)
+	ProcessReplace(ctx context.Context, in *ProcessReplaceRequest, opts ...grpc.CallOption) (*ProcessResponse, error)
+	VersionGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionResponse, error)
+}
+
+type processManagerServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewProcessManagerServiceClient(cc grpc.ClientConnInterface) ProcessManagerServiceClient {
+	return &processManagerServiceClient{cc}
+}
+
+func (c *processManagerServiceClient) ProcessCreate(ctx context.Context, in *ProcessCreateRequest, opts ...grpc.CallOption) (*ProcessResponse, error) {
+	out := new(ProcessResponse)
+	err := c.cc.Invoke(ctx, ProcessManagerService_ProcessCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *processManagerServiceClient) ProcessDelete(ctx context.Context, in *ProcessDeleteRequest, opts ...grpc.CallOption) (*ProcessResponse, error) {
+	out := new(ProcessResponse)
+	err := c.cc.Invoke(ctx, ProcessManagerService_ProcessDelete_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *processManagerServiceClient) ProcessGet(ctx context.Context, in *ProcessGetRequest, opts ...grpc.CallOption) (*ProcessResponse, error) {
+	out := new(ProcessResponse)
+	err := c.cc.Invoke(ctx, ProcessManagerService_ProcessGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *processManagerServiceClient) ProcessList(ctx context.Context, in *ProcessListRequest, opts ...grpc.CallOption) (*ProcessListResponse, error) {
+	out := new(ProcessListResponse)
+	err := c.cc.Invoke(ctx, ProcessManagerService_ProcessList_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *processManagerServiceClient) ProcessLog(ctx context.Context, in *LogRequest, opts ...grpc.CallOption) (ProcessManagerService_ProcessLogClient, error) {
+	stream, err := c.cc.NewStream(ctx, &ProcessManagerService_ServiceDesc.Streams[0], ProcessManagerService_ProcessLog_FullMethodName, opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &processManagerServiceProcessLogClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type ProcessManagerService_ProcessLogClient interface {
+	Recv() (*LogResponse, error)
+	grpc.ClientStream
+}
+
+type processManagerServiceProcessLogClient struct {
+	grpc.ClientStream
+}
+
+func (x *processManagerServiceProcessLogClient) Recv() (*LogResponse, error) {
+	m := new(LogResponse)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *processManagerServiceClient) ProcessWatch(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (ProcessManagerService_ProcessWatchClient, error) {
+	stream, err := c.cc.NewStream(ctx, &ProcessManagerService_ServiceDesc.Streams[1], ProcessManagerService_ProcessWatch_FullMethodName, opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &processManagerServiceProcessWatchClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type ProcessManagerService_ProcessWatchClient interface {
+	Recv() (*ProcessResponse, error)
+	grpc.ClientStream
+}
+
+type processManagerServiceProcessWatchClient struct {
+	grpc.ClientStream
+}
+
+func (x *processManagerServiceProcessWatchClient) Recv() (*ProcessResponse, error) {
+	m := new(ProcessResponse)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *processManagerServiceClient) ProcessReplace(ctx context.Context, in *ProcessReplaceRequest, opts ...grpc.CallOption) (*ProcessResponse, error) {
+	out := new(ProcessResponse)
+	err := c.cc.Invoke(ctx, ProcessManagerService_ProcessReplace_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *processManagerServiceClient) VersionGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionResponse, error) {
+	out := new(VersionResponse)
+	err := c.cc.Invoke(ctx, ProcessManagerService_VersionGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ProcessManagerServiceServer is the server API for ProcessManagerService service.
+// All implementations must embed UnimplementedProcessManagerServiceServer
+// for forward compatibility
+type ProcessManagerServiceServer interface {
+	ProcessCreate(context.Context, *ProcessCreateRequest) (*ProcessResponse, error)
+	ProcessDelete(context.Context, *ProcessDeleteRequest) (*ProcessResponse, error)
+	ProcessGet(context.Context, *ProcessGetRequest) (*ProcessResponse, error)
+	ProcessList(context.Context, *ProcessListRequest) (*ProcessListResponse, error)
+	ProcessLog(*LogRequest, ProcessManagerService_ProcessLogServer) error
+	ProcessWatch(*emptypb.Empty, ProcessManagerService_ProcessWatchServer) error
+	ProcessReplace(context.Context, *ProcessReplaceRequest) (*ProcessResponse, error)
+	VersionGet(context.Context, *emptypb.Empty) (*VersionResponse, error)
+	mustEmbedUnimplementedProcessManagerServiceServer()
+}
+
+// UnimplementedProcessManagerServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedProcessManagerServiceServer struct {
+}
+
+func (UnimplementedProcessManagerServiceServer) ProcessCreate(context.Context, *ProcessCreateRequest) (*ProcessResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ProcessCreate not implemented")
+}
+func (UnimplementedProcessManagerServiceServer) ProcessDelete(context.Context, *ProcessDeleteRequest) (*ProcessResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ProcessDelete not implemented")
+}
+func (UnimplementedProcessManagerServiceServer) ProcessGet(context.Context, *ProcessGetRequest) (*ProcessResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ProcessGet not implemented")
+}
+func (UnimplementedProcessManagerServiceServer) ProcessList(context.Context, *ProcessListRequest) (*ProcessListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ProcessList not implemented")
+}
+func (UnimplementedProcessManagerServiceServer) ProcessLog(*LogRequest, ProcessManagerService_ProcessLogServer) error {
+	return status.Errorf(codes.Unimplemented, "method ProcessLog not implemented")
+}
+func (UnimplementedProcessManagerServiceServer) ProcessWatch(*emptypb.Empty, ProcessManagerService_ProcessWatchServer) error {
+	return status.Errorf(codes.Unimplemented, "method ProcessWatch not implemented")
+}
+func (UnimplementedProcessManagerServiceServer) ProcessReplace(context.Context, *ProcessReplaceRequest) (*ProcessResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ProcessReplace not implemented")
+}
+func (UnimplementedProcessManagerServiceServer) VersionGet(context.Context, *emptypb.Empty) (*VersionResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VersionGet not implemented")
+}
+func (UnimplementedProcessManagerServiceServer) mustEmbedUnimplementedProcessManagerServiceServer() {}
+
+// UnsafeProcessManagerServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to ProcessManagerServiceServer will
+// result in compilation errors.
+type UnsafeProcessManagerServiceServer interface {
+	mustEmbedUnimplementedProcessManagerServiceServer()
+}
+
+func RegisterProcessManagerServiceServer(s grpc.ServiceRegistrar, srv ProcessManagerServiceServer) {
+	s.RegisterService(&ProcessManagerService_ServiceDesc, srv)
+}
+
+func _ProcessManagerService_ProcessCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProcessCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProcessManagerServiceServer).ProcessCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProcessManagerService_ProcessCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProcessManagerServiceServer).ProcessCreate(ctx, req.(*ProcessCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProcessManagerService_ProcessDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProcessDeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProcessManagerServiceServer).ProcessDelete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProcessManagerService_ProcessDelete_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProcessManagerServiceServer).ProcessDelete(ctx, req.(*ProcessDeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProcessManagerService_ProcessGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProcessGetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProcessManagerServiceServer).ProcessGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProcessManagerService_ProcessGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProcessManagerServiceServer).ProcessGet(ctx, req.(*ProcessGetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProcessManagerService_ProcessList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProcessListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProcessManagerServiceServer).ProcessList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProcessManagerService_ProcessList_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProcessManagerServiceServer).ProcessList(ctx, req.(*ProcessListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProcessManagerService_ProcessLog_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(LogRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(ProcessManagerServiceServer).ProcessLog(m, &processManagerServiceProcessLogServer{stream})
+}
+
+type ProcessManagerService_ProcessLogServer interface {
+	Send(*LogResponse) error
+	grpc.ServerStream
+}
+
+type processManagerServiceProcessLogServer struct {
+	grpc.ServerStream
+}
+
+func (x *processManagerServiceProcessLogServer) Send(m *LogResponse) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _ProcessManagerService_ProcessWatch_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(emptypb.Empty)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(ProcessManagerServiceServer).ProcessWatch(m, &processManagerServiceProcessWatchServer{stream})
+}
+
+type ProcessManagerService_ProcessWatchServer interface {
+	Send(*ProcessResponse) error
+	grpc.ServerStream
+}
+
+type processManagerServiceProcessWatchServer struct {
+	grpc.ServerStream
+}
+
+func (x *processManagerServiceProcessWatchServer) Send(m *ProcessResponse) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _ProcessManagerService_ProcessReplace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProcessReplaceRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProcessManagerServiceServer).ProcessReplace(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProcessManagerService_ProcessReplace_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProcessManagerServiceServer).ProcessReplace(ctx, req.(*ProcessReplaceRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProcessManagerService_VersionGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProcessManagerServiceServer).VersionGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProcessManagerService_VersionGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProcessManagerServiceServer).VersionGet(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// ProcessManagerService_ServiceDesc is the grpc.ServiceDesc for ProcessManagerService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var ProcessManagerService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "ProcessManagerService",
+	HandlerType: (*ProcessManagerServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ProcessCreate",
+			Handler:    _ProcessManagerService_ProcessCreate_Handler,
+		},
+		{
+			MethodName: "ProcessDelete",
+			Handler:    _ProcessManagerService_ProcessDelete_Handler,
+		},
+		{
+			MethodName: "ProcessGet",
+			Handler:    _ProcessManagerService_ProcessGet_Handler,
+		},
+		{
+			MethodName: "ProcessList",
+			Handler:    _ProcessManagerService_ProcessList_Handler,
+		},
+		{
+			MethodName: "ProcessReplace",
+			Handler:    _ProcessManagerService_ProcessReplace_Handler,
+		},
+		{
+			MethodName: "VersionGet",
+			Handler:    _ProcessManagerService_VersionGet_Handler,
+		},
+	},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "ProcessLog",
+			Handler:       _ProcessManagerService_ProcessLog_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "ProcessWatch",
+			Handler:       _ProcessManagerService_ProcessWatch_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "imrpc/imrpc.proto",
+}
diff --git a/pkg/generated/imrpc/instance.pb.go b/pkg/generated/imrpc/instance.pb.go
new file mode 100644
index 0000000..c6e74e5
--- /dev/null
+++ b/pkg/generated/imrpc/instance.pb.go
@@ -0,0 +1,1672 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
+// source: imrpc/instance.proto
+
+package imrpc
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type ProcessInstanceSpec struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Binary string   `protobuf:"bytes,1,opt,name=binary,proto3" json:"binary,omitempty"`
+	Args   []string `protobuf:"bytes,2,rep,name=args,proto3" json:"args,omitempty"`
+}
+
+func (x *ProcessInstanceSpec) Reset() {
+	*x = ProcessInstanceSpec{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ProcessInstanceSpec) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ProcessInstanceSpec) ProtoMessage() {}
+
+func (x *ProcessInstanceSpec) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ProcessInstanceSpec.ProtoReflect.Descriptor instead.
+func (*ProcessInstanceSpec) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *ProcessInstanceSpec) GetBinary() string {
+	if x != nil {
+		return x.Binary
+	}
+	return ""
+}
+
+func (x *ProcessInstanceSpec) GetArgs() []string {
+	if x != nil {
+		return x.Args
+	}
+	return nil
+}
+
+type SpdkInstanceSpec struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ReplicaAddressMap map[string]string `protobuf:"bytes,1,rep,name=replica_address_map,json=replicaAddressMap,proto3" json:"replica_address_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	DiskName          string            `protobuf:"bytes,2,opt,name=disk_name,json=diskName,proto3" json:"disk_name,omitempty"`
+	DiskUuid          string            `protobuf:"bytes,3,opt,name=disk_uuid,json=diskUuid,proto3" json:"disk_uuid,omitempty"`
+	Size              uint64            `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"`
+	ExposeRequired    bool              `protobuf:"varint,5,opt,name=expose_required,json=exposeRequired,proto3" json:"expose_required,omitempty"`
+	Frontend          string            `protobuf:"bytes,6,opt,name=frontend,proto3" json:"frontend,omitempty"`
+}
+
+func (x *SpdkInstanceSpec) Reset() {
+	*x = SpdkInstanceSpec{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SpdkInstanceSpec) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SpdkInstanceSpec) ProtoMessage() {}
+
+func (x *SpdkInstanceSpec) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SpdkInstanceSpec.ProtoReflect.Descriptor instead.
+func (*SpdkInstanceSpec) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *SpdkInstanceSpec) GetReplicaAddressMap() map[string]string {
+	if x != nil {
+		return x.ReplicaAddressMap
+	}
+	return nil
+}
+
+func (x *SpdkInstanceSpec) GetDiskName() string {
+	if x != nil {
+		return x.DiskName
+	}
+	return ""
+}
+
+func (x *SpdkInstanceSpec) GetDiskUuid() string {
+	if x != nil {
+		return x.DiskUuid
+	}
+	return ""
+}
+
+func (x *SpdkInstanceSpec) GetSize() uint64 {
+	if x != nil {
+		return x.Size
+	}
+	return 0
+}
+
+func (x *SpdkInstanceSpec) GetExposeRequired() bool {
+	if x != nil {
+		return x.ExposeRequired
+	}
+	return false
+}
+
+func (x *SpdkInstanceSpec) GetFrontend() string {
+	if x != nil {
+		return x.Frontend
+	}
+	return ""
+}
+
+type InstanceSpec struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Deprecated: Replaced by `data_engine`.
+	//
+	// Deprecated: Marked as deprecated in imrpc/instance.proto.
+	BackendStoreDriver  BackendStoreDriver   `protobuf:"varint,1,opt,name=backend_store_driver,json=backendStoreDriver,proto3,enum=imrpc.BackendStoreDriver" json:"backend_store_driver,omitempty"`
+	Name                string               `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	Type                string               `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"`
+	VolumeName          string               `protobuf:"bytes,4,opt,name=volume_name,json=volumeName,proto3" json:"volume_name,omitempty"`
+	PortCount           int32                `protobuf:"varint,5,opt,name=port_count,json=portCount,proto3" json:"port_count,omitempty"`
+	PortArgs            []string             `protobuf:"bytes,6,rep,name=port_args,json=portArgs,proto3" json:"port_args,omitempty"`
+	ProcessInstanceSpec *ProcessInstanceSpec `protobuf:"bytes,7,opt,name=process_instance_spec,json=processInstanceSpec,proto3" json:"process_instance_spec,omitempty"`
+	SpdkInstanceSpec    *SpdkInstanceSpec    `protobuf:"bytes,8,opt,name=spdk_instance_spec,json=spdkInstanceSpec,proto3" json:"spdk_instance_spec,omitempty"`
+	DataEngine          DataEngine           `protobuf:"varint,9,opt,name=data_engine,json=dataEngine,proto3,enum=imrpc.DataEngine" json:"data_engine,omitempty"`
+}
+
+func (x *InstanceSpec) Reset() {
+	*x = InstanceSpec{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *InstanceSpec) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InstanceSpec) ProtoMessage() {}
+
+func (x *InstanceSpec) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use InstanceSpec.ProtoReflect.Descriptor instead.
+func (*InstanceSpec) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{2}
+}
+
+// Deprecated: Marked as deprecated in imrpc/instance.proto.
+func (x *InstanceSpec) GetBackendStoreDriver() BackendStoreDriver {
+	if x != nil {
+		return x.BackendStoreDriver
+	}
+	return BackendStoreDriver_v1
+}
+
+func (x *InstanceSpec) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *InstanceSpec) GetType() string {
+	if x != nil {
+		return x.Type
+	}
+	return ""
+}
+
+func (x *InstanceSpec) GetVolumeName() string {
+	if x != nil {
+		return x.VolumeName
+	}
+	return ""
+}
+
+func (x *InstanceSpec) GetPortCount() int32 {
+	if x != nil {
+		return x.PortCount
+	}
+	return 0
+}
+
+func (x *InstanceSpec) GetPortArgs() []string {
+	if x != nil {
+		return x.PortArgs
+	}
+	return nil
+}
+
+func (x *InstanceSpec) GetProcessInstanceSpec() *ProcessInstanceSpec {
+	if x != nil {
+		return x.ProcessInstanceSpec
+	}
+	return nil
+}
+
+func (x *InstanceSpec) GetSpdkInstanceSpec() *SpdkInstanceSpec {
+	if x != nil {
+		return x.SpdkInstanceSpec
+	}
+	return nil
+}
+
+func (x *InstanceSpec) GetDataEngine() DataEngine {
+	if x != nil {
+		return x.DataEngine
+	}
+	return DataEngine_DATA_ENGINE_V1
+}
+
+type InstanceStatus struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	State      string          `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"`
+	ErrorMsg   string          `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"`
+	PortStart  int32           `protobuf:"varint,3,opt,name=port_start,json=portStart,proto3" json:"port_start,omitempty"`
+	PortEnd    int32           `protobuf:"varint,4,opt,name=port_end,json=portEnd,proto3" json:"port_end,omitempty"`
+	Conditions map[string]bool `protobuf:"bytes,5,rep,name=conditions,proto3" json:"conditions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
+}
+
+func (x *InstanceStatus) Reset() {
+	*x = InstanceStatus{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *InstanceStatus) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InstanceStatus) ProtoMessage() {}
+
+func (x *InstanceStatus) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use InstanceStatus.ProtoReflect.Descriptor instead.
+func (*InstanceStatus) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *InstanceStatus) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+func (x *InstanceStatus) GetErrorMsg() string {
+	if x != nil {
+		return x.ErrorMsg
+	}
+	return ""
+}
+
+func (x *InstanceStatus) GetPortStart() int32 {
+	if x != nil {
+		return x.PortStart
+	}
+	return 0
+}
+
+func (x *InstanceStatus) GetPortEnd() int32 {
+	if x != nil {
+		return x.PortEnd
+	}
+	return 0
+}
+
+func (x *InstanceStatus) GetConditions() map[string]bool {
+	if x != nil {
+		return x.Conditions
+	}
+	return nil
+}
+
+type InstanceCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Spec *InstanceSpec `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"`
+}
+
+func (x *InstanceCreateRequest) Reset() {
+	*x = InstanceCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *InstanceCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InstanceCreateRequest) ProtoMessage() {}
+
+func (x *InstanceCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use InstanceCreateRequest.ProtoReflect.Descriptor instead.
+func (*InstanceCreateRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *InstanceCreateRequest) GetSpec() *InstanceSpec {
+	if x != nil {
+		return x.Spec
+	}
+	return nil
+}
+
+type InstanceDeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Deprecated: Replaced by `data_engine`.
+	//
+	// Deprecated: Marked as deprecated in imrpc/instance.proto.
+	BackendStoreDriver BackendStoreDriver `protobuf:"varint,1,opt,name=backend_store_driver,json=backendStoreDriver,proto3,enum=imrpc.BackendStoreDriver" json:"backend_store_driver,omitempty"`
+	Name               string             `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	Type               string             `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"`
+	DiskUuid           string             `protobuf:"bytes,4,opt,name=disk_uuid,json=diskUuid,proto3" json:"disk_uuid,omitempty"`
+	CleanupRequired    bool               `protobuf:"varint,5,opt,name=cleanup_required,json=cleanupRequired,proto3" json:"cleanup_required,omitempty"`
+	DataEngine         DataEngine         `protobuf:"varint,6,opt,name=data_engine,json=dataEngine,proto3,enum=imrpc.DataEngine" json:"data_engine,omitempty"`
+}
+
+func (x *InstanceDeleteRequest) Reset() {
+	*x = InstanceDeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *InstanceDeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InstanceDeleteRequest) ProtoMessage() {}
+
+func (x *InstanceDeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use InstanceDeleteRequest.ProtoReflect.Descriptor instead.
+func (*InstanceDeleteRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{5}
+}
+
+// Deprecated: Marked as deprecated in imrpc/instance.proto.
+func (x *InstanceDeleteRequest) GetBackendStoreDriver() BackendStoreDriver {
+	if x != nil {
+		return x.BackendStoreDriver
+	}
+	return BackendStoreDriver_v1
+}
+
+func (x *InstanceDeleteRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *InstanceDeleteRequest) GetType() string {
+	if x != nil {
+		return x.Type
+	}
+	return ""
+}
+
+func (x *InstanceDeleteRequest) GetDiskUuid() string {
+	if x != nil {
+		return x.DiskUuid
+	}
+	return ""
+}
+
+func (x *InstanceDeleteRequest) GetCleanupRequired() bool {
+	if x != nil {
+		return x.CleanupRequired
+	}
+	return false
+}
+
+func (x *InstanceDeleteRequest) GetDataEngine() DataEngine {
+	if x != nil {
+		return x.DataEngine
+	}
+	return DataEngine_DATA_ENGINE_V1
+}
+
+type InstanceGetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Deprecated: Replaced by `data_engine`.
+	//
+	// Deprecated: Marked as deprecated in imrpc/instance.proto.
+	BackendStoreDriver BackendStoreDriver `protobuf:"varint,1,opt,name=backend_store_driver,json=backendStoreDriver,proto3,enum=imrpc.BackendStoreDriver" json:"backend_store_driver,omitempty"`
+	Name               string             `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	Type               string             `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"`
+	DataEngine         DataEngine         `protobuf:"varint,4,opt,name=data_engine,json=dataEngine,proto3,enum=imrpc.DataEngine" json:"data_engine,omitempty"`
+}
+
+func (x *InstanceGetRequest) Reset() {
+	*x = InstanceGetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *InstanceGetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InstanceGetRequest) ProtoMessage() {}
+
+func (x *InstanceGetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use InstanceGetRequest.ProtoReflect.Descriptor instead.
+func (*InstanceGetRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{6}
+}
+
+// Deprecated: Marked as deprecated in imrpc/instance.proto.
+func (x *InstanceGetRequest) GetBackendStoreDriver() BackendStoreDriver {
+	if x != nil {
+		return x.BackendStoreDriver
+	}
+	return BackendStoreDriver_v1
+}
+
+func (x *InstanceGetRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *InstanceGetRequest) GetType() string {
+	if x != nil {
+		return x.Type
+	}
+	return ""
+}
+
+func (x *InstanceGetRequest) GetDataEngine() DataEngine {
+	if x != nil {
+		return x.DataEngine
+	}
+	return DataEngine_DATA_ENGINE_V1
+}
+
+type InstanceResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Spec    *InstanceSpec   `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"`
+	Status  *InstanceStatus `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
+	Deleted bool            `protobuf:"varint,3,opt,name=deleted,proto3" json:"deleted,omitempty"`
+}
+
+func (x *InstanceResponse) Reset() {
+	*x = InstanceResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *InstanceResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InstanceResponse) ProtoMessage() {}
+
+func (x *InstanceResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use InstanceResponse.ProtoReflect.Descriptor instead.
+func (*InstanceResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *InstanceResponse) GetSpec() *InstanceSpec {
+	if x != nil {
+		return x.Spec
+	}
+	return nil
+}
+
+func (x *InstanceResponse) GetStatus() *InstanceStatus {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+func (x *InstanceResponse) GetDeleted() bool {
+	if x != nil {
+		return x.Deleted
+	}
+	return false
+}
+
+type InstanceListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Instances map[string]*InstanceResponse `protobuf:"bytes,1,rep,name=instances,proto3" json:"instances,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *InstanceListResponse) Reset() {
+	*x = InstanceListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *InstanceListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InstanceListResponse) ProtoMessage() {}
+
+func (x *InstanceListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use InstanceListResponse.ProtoReflect.Descriptor instead.
+func (*InstanceListResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *InstanceListResponse) GetInstances() map[string]*InstanceResponse {
+	if x != nil {
+		return x.Instances
+	}
+	return nil
+}
+
+type InstanceLogRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Deprecated: Replaced by `data_engine`.
+	//
+	// Deprecated: Marked as deprecated in imrpc/instance.proto.
+	BackendStoreDriver BackendStoreDriver `protobuf:"varint,1,opt,name=backend_store_driver,json=backendStoreDriver,proto3,enum=imrpc.BackendStoreDriver" json:"backend_store_driver,omitempty"`
+	Name               string             `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	Type               string             `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"`
+	DataEngine         DataEngine         `protobuf:"varint,4,opt,name=data_engine,json=dataEngine,proto3,enum=imrpc.DataEngine" json:"data_engine,omitempty"`
+}
+
+func (x *InstanceLogRequest) Reset() {
+	*x = InstanceLogRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *InstanceLogRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InstanceLogRequest) ProtoMessage() {}
+
+func (x *InstanceLogRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use InstanceLogRequest.ProtoReflect.Descriptor instead.
+func (*InstanceLogRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{9}
+}
+
+// Deprecated: Marked as deprecated in imrpc/instance.proto.
+func (x *InstanceLogRequest) GetBackendStoreDriver() BackendStoreDriver {
+	if x != nil {
+		return x.BackendStoreDriver
+	}
+	return BackendStoreDriver_v1
+}
+
+func (x *InstanceLogRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *InstanceLogRequest) GetType() string {
+	if x != nil {
+		return x.Type
+	}
+	return ""
+}
+
+func (x *InstanceLogRequest) GetDataEngine() DataEngine {
+	if x != nil {
+		return x.DataEngine
+	}
+	return DataEngine_DATA_ENGINE_V1
+}
+
+type InstanceReplaceRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Spec            *InstanceSpec `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"`
+	TerminateSignal string        `protobuf:"bytes,2,opt,name=terminate_signal,json=terminateSignal,proto3" json:"terminate_signal,omitempty"`
+}
+
+func (x *InstanceReplaceRequest) Reset() {
+	*x = InstanceReplaceRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *InstanceReplaceRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InstanceReplaceRequest) ProtoMessage() {}
+
+func (x *InstanceReplaceRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use InstanceReplaceRequest.ProtoReflect.Descriptor instead.
+func (*InstanceReplaceRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *InstanceReplaceRequest) GetSpec() *InstanceSpec {
+	if x != nil {
+		return x.Spec
+	}
+	return nil
+}
+
+func (x *InstanceReplaceRequest) GetTerminateSignal() string {
+	if x != nil {
+		return x.TerminateSignal
+	}
+	return ""
+}
+
+type LogSetLevelRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DataEngine DataEngine `protobuf:"varint,1,opt,name=data_engine,json=dataEngine,proto3,enum=imrpc.DataEngine" json:"data_engine,omitempty"`
+	Level      string     `protobuf:"bytes,2,opt,name=level,proto3" json:"level,omitempty"`
+}
+
+func (x *LogSetLevelRequest) Reset() {
+	*x = LogSetLevelRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LogSetLevelRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogSetLevelRequest) ProtoMessage() {}
+
+func (x *LogSetLevelRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LogSetLevelRequest.ProtoReflect.Descriptor instead.
+func (*LogSetLevelRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *LogSetLevelRequest) GetDataEngine() DataEngine {
+	if x != nil {
+		return x.DataEngine
+	}
+	return DataEngine_DATA_ENGINE_V1
+}
+
+func (x *LogSetLevelRequest) GetLevel() string {
+	if x != nil {
+		return x.Level
+	}
+	return ""
+}
+
+type LogSetFlagsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DataEngine DataEngine `protobuf:"varint,1,opt,name=data_engine,json=dataEngine,proto3,enum=imrpc.DataEngine" json:"data_engine,omitempty"`
+	Flags      string     `protobuf:"bytes,2,opt,name=flags,proto3" json:"flags,omitempty"`
+}
+
+func (x *LogSetFlagsRequest) Reset() {
+	*x = LogSetFlagsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LogSetFlagsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogSetFlagsRequest) ProtoMessage() {}
+
+func (x *LogSetFlagsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LogSetFlagsRequest.ProtoReflect.Descriptor instead.
+func (*LogSetFlagsRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *LogSetFlagsRequest) GetDataEngine() DataEngine {
+	if x != nil {
+		return x.DataEngine
+	}
+	return DataEngine_DATA_ENGINE_V1
+}
+
+func (x *LogSetFlagsRequest) GetFlags() string {
+	if x != nil {
+		return x.Flags
+	}
+	return ""
+}
+
+type LogGetLevelRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DataEngine DataEngine `protobuf:"varint,1,opt,name=data_engine,json=dataEngine,proto3,enum=imrpc.DataEngine" json:"data_engine,omitempty"`
+}
+
+func (x *LogGetLevelRequest) Reset() {
+	*x = LogGetLevelRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LogGetLevelRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogGetLevelRequest) ProtoMessage() {}
+
+func (x *LogGetLevelRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LogGetLevelRequest.ProtoReflect.Descriptor instead.
+func (*LogGetLevelRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *LogGetLevelRequest) GetDataEngine() DataEngine {
+	if x != nil {
+		return x.DataEngine
+	}
+	return DataEngine_DATA_ENGINE_V1
+}
+
+type LogGetLevelResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Level string `protobuf:"bytes,1,opt,name=level,proto3" json:"level,omitempty"`
+}
+
+func (x *LogGetLevelResponse) Reset() {
+	*x = LogGetLevelResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LogGetLevelResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogGetLevelResponse) ProtoMessage() {}
+
+func (x *LogGetLevelResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LogGetLevelResponse.ProtoReflect.Descriptor instead.
+func (*LogGetLevelResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *LogGetLevelResponse) GetLevel() string {
+	if x != nil {
+		return x.Level
+	}
+	return ""
+}
+
+type LogGetFlagsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DataEngine DataEngine `protobuf:"varint,1,opt,name=data_engine,json=dataEngine,proto3,enum=imrpc.DataEngine" json:"data_engine,omitempty"`
+}
+
+func (x *LogGetFlagsRequest) Reset() {
+	*x = LogGetFlagsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LogGetFlagsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogGetFlagsRequest) ProtoMessage() {}
+
+func (x *LogGetFlagsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LogGetFlagsRequest.ProtoReflect.Descriptor instead.
+func (*LogGetFlagsRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *LogGetFlagsRequest) GetDataEngine() DataEngine {
+	if x != nil {
+		return x.DataEngine
+	}
+	return DataEngine_DATA_ENGINE_V1
+}
+
+type LogGetFlagsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Flags string `protobuf:"bytes,1,opt,name=flags,proto3" json:"flags,omitempty"`
+}
+
+func (x *LogGetFlagsResponse) Reset() {
+	*x = LogGetFlagsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_instance_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LogGetFlagsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogGetFlagsResponse) ProtoMessage() {}
+
+func (x *LogGetFlagsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_instance_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LogGetFlagsResponse.ProtoReflect.Descriptor instead.
+func (*LogGetFlagsResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_instance_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *LogGetFlagsResponse) GetFlags() string {
+	if x != nil {
+		return x.Flags
+	}
+	return ""
+}
+
+var File_imrpc_instance_proto protoreflect.FileDescriptor
+
+var file_imrpc_instance_proto_rawDesc = []byte{
+	0x0a, 0x14, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x1a, 0x1b, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65,
+	0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x69, 0x6d, 0x72, 0x70,
+	0x63, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11,
+	0x69, 0x6d, 0x72, 0x70, 0x63, 0x2f, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x22, 0x41, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x73, 0x74,
+	0x61, 0x6e, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x69, 0x6e, 0x61,
+	0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79,
+	0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04,
+	0x61, 0x72, 0x67, 0x73, 0x22, 0xcb, 0x02, 0x0a, 0x10, 0x53, 0x70, 0x64, 0x6b, 0x49, 0x6e, 0x73,
+	0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x5e, 0x0a, 0x13, 0x72, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x61, 0x70,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x53,
+	0x70, 0x64, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4d, 0x61,
+	0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41,
+	0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4d, 0x61, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73,
+	0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69,
+	0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75,
+	0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x55,
+	0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73,
+	0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,
+	0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x1a, 0x44, 0x0a, 0x16,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 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, 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, 0xaf, 0x03, 0x0a, 0x0c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53,
+	0x70, 0x65, 0x63, 0x12, 0x4f, 0x0a, 0x14, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x73,
+	0x74, 0x6f, 0x72, 0x65, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e,
+	0x64, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x42, 0x02, 0x18, 0x01,
+	0x52, 0x12, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x72,
+	0x69, 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b,
+	0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a,
+	0x0a, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x05, 0x52, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09,
+	0x70, 0x6f, 0x72, 0x74, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52,
+	0x08, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x4e, 0x0a, 0x15, 0x70, 0x72, 0x6f,
+	0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x70,
+	0x65, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63,
+	0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x53, 0x70, 0x65, 0x63, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x73,
+	0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x45, 0x0a, 0x12, 0x73, 0x70, 0x64,
+	0x6b, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18,
+	0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x70,
+	0x64, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x10,
+	0x73, 0x70, 0x64, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63,
+	0x12, 0x32, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18,
+	0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x61,
+	0x74, 0x61, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x22, 0x83, 0x02, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63,
+	0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a,
+	0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f,
+	0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09,
+	0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x72,
+	0x74, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x70, 0x6f, 0x72,
+	0x74, 0x45, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63,
+	0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e,
+	0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
+	0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x43,
+	0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 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, 0x08, 0x52,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x15, 0x49, 0x6e,
+	0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e,
+	0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x8c, 0x02, 0x0a,
+	0x15, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x14, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e,
+	0x64, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63,
+	0x6b, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x42,
+	0x02, 0x18, 0x01, 0x52, 0x12, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x6f, 0x72,
+	0x65, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74,
+	0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12,
+	0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x75, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x10,
+	0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x52,
+	0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f,
+	0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x69,
+	0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52,
+	0x0a, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x12,
+	0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x4f, 0x0a, 0x14, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x74,
+	0x6f, 0x72, 0x65, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64,
+	0x53, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x42, 0x02, 0x18, 0x01, 0x52,
+	0x12, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x72, 0x69,
+	0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x0b, 0x64,
+	0x61, 0x74, 0x61, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x11, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x22,
+	0x84, 0x01, 0x0a, 0x10, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61,
+	0x6e, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2d, 0x0a,
+	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e,
+	0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07,
+	0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0xb7, 0x01, 0x0a, 0x14, 0x49, 0x6e, 0x73, 0x74, 0x61,
+	0x6e, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x48, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61,
+	0x6e, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e,
+	0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09,
+	0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x55, 0x0a, 0x0e, 0x49, 0x6e, 0x73,
+	0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
+	0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69,
+	0x6d, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01,
+	0x22, 0xc1, 0x01, 0x0a, 0x12, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x6f, 0x67,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x14, 0x62, 0x61, 0x63, 0x6b, 0x65,
+	0x6e, 0x64, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61,
+	0x63, 0x6b, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72,
+	0x42, 0x02, 0x18, 0x01, 0x52, 0x12, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x6f,
+	0x72, 0x65, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04,
+	0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,
+	0x12, 0x32, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x61,
+	0x74, 0x61, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x22, 0x6c, 0x0a, 0x16, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27,
+	0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69,
+	0x6d, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x70, 0x65,
+	0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x65, 0x72, 0x6d, 0x69,
+	0x6e, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e,
+	0x61, 0x6c, 0x22, 0x5e, 0x0a, 0x12, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65,
+	0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61,
+	0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e,
+	0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x12, 0x14, 0x0a, 0x05,
+	0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x65, 0x76,
+	0x65, 0x6c, 0x22, 0x5e, 0x0a, 0x12, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61,
+	0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e,
+	0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x12, 0x14, 0x0a, 0x05,
+	0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x6c, 0x61,
+	0x67, 0x73, 0x22, 0x48, 0x0a, 0x12, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65,
+	0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61,
+	0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e,
+	0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x22, 0x2b, 0x0a, 0x13,
+	0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x48, 0x0a, 0x12, 0x4c, 0x6f, 0x67,
+	0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x32, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x61, 0x74,
+	0x61, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x22, 0x2b, 0x0a, 0x13, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61,
+	0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c,
+	0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73,
+	0x32, 0xc9, 0x06, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x49,
+	0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x73,
+	0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x49, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e,
+	0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x17, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0b, 0x49, 0x6e,
+	0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70,
+	0x63, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x73,
+	0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x45, 0x0a, 0x0c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e,
+	0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e,
+	0x63, 0x65, 0x4c, 0x6f, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e,
+	0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x0c, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
+	0x30, 0x01, 0x12, 0x43, 0x0a, 0x0d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x57, 0x61,
+	0x74, 0x63, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
+	0x70, 0x74, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4b, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x74, 0x61,
+	0x6e, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x72,
+	0x70, 0x63, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x61,
+	0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x72, 0x70,
+	0x63, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c, 0x65,
+	0x76, 0x65, 0x6c, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x53,
+	0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x40, 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x74,
+	0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f,
+	0x67, 0x53, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x44, 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x47,
+	0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e,
+	0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x47, 0x65,
+	0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44,
+	0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x19, 0x2e,
+	0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63,
+	0x2e, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0a, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47,
+	0x65, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x10, 0x2e, 0x56, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x2f, 0x5a, 0x2d,
+	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x68,
+	0x6f, 0x72, 0x6e, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67, 0x65,
+	0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2f, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_imrpc_instance_proto_rawDescOnce sync.Once
+	file_imrpc_instance_proto_rawDescData = file_imrpc_instance_proto_rawDesc
+)
+
+func file_imrpc_instance_proto_rawDescGZIP() []byte {
+	file_imrpc_instance_proto_rawDescOnce.Do(func() {
+		file_imrpc_instance_proto_rawDescData = protoimpl.X.CompressGZIP(file_imrpc_instance_proto_rawDescData)
+	})
+	return file_imrpc_instance_proto_rawDescData
+}
+
+var file_imrpc_instance_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
+var file_imrpc_instance_proto_goTypes = []interface{}{
+	(*ProcessInstanceSpec)(nil),    // 0: imrpc.ProcessInstanceSpec
+	(*SpdkInstanceSpec)(nil),       // 1: imrpc.SpdkInstanceSpec
+	(*InstanceSpec)(nil),           // 2: imrpc.InstanceSpec
+	(*InstanceStatus)(nil),         // 3: imrpc.InstanceStatus
+	(*InstanceCreateRequest)(nil),  // 4: imrpc.InstanceCreateRequest
+	(*InstanceDeleteRequest)(nil),  // 5: imrpc.InstanceDeleteRequest
+	(*InstanceGetRequest)(nil),     // 6: imrpc.InstanceGetRequest
+	(*InstanceResponse)(nil),       // 7: imrpc.InstanceResponse
+	(*InstanceListResponse)(nil),   // 8: imrpc.InstanceListResponse
+	(*InstanceLogRequest)(nil),     // 9: imrpc.InstanceLogRequest
+	(*InstanceReplaceRequest)(nil), // 10: imrpc.InstanceReplaceRequest
+	(*LogSetLevelRequest)(nil),     // 11: imrpc.LogSetLevelRequest
+	(*LogSetFlagsRequest)(nil),     // 12: imrpc.LogSetFlagsRequest
+	(*LogGetLevelRequest)(nil),     // 13: imrpc.LogGetLevelRequest
+	(*LogGetLevelResponse)(nil),    // 14: imrpc.LogGetLevelResponse
+	(*LogGetFlagsRequest)(nil),     // 15: imrpc.LogGetFlagsRequest
+	(*LogGetFlagsResponse)(nil),    // 16: imrpc.LogGetFlagsResponse
+	nil,                            // 17: imrpc.SpdkInstanceSpec.ReplicaAddressMapEntry
+	nil,                            // 18: imrpc.InstanceStatus.ConditionsEntry
+	nil,                            // 19: imrpc.InstanceListResponse.InstancesEntry
+	(BackendStoreDriver)(0),        // 20: imrpc.BackendStoreDriver
+	(DataEngine)(0),                // 21: imrpc.DataEngine
+	(*emptypb.Empty)(nil),          // 22: google.protobuf.Empty
+	(*LogResponse)(nil),            // 23: LogResponse
+	(*VersionResponse)(nil),        // 24: VersionResponse
+}
+var file_imrpc_instance_proto_depIdxs = []int32{
+	17, // 0: imrpc.SpdkInstanceSpec.replica_address_map:type_name -> imrpc.SpdkInstanceSpec.ReplicaAddressMapEntry
+	20, // 1: imrpc.InstanceSpec.backend_store_driver:type_name -> imrpc.BackendStoreDriver
+	0,  // 2: imrpc.InstanceSpec.process_instance_spec:type_name -> imrpc.ProcessInstanceSpec
+	1,  // 3: imrpc.InstanceSpec.spdk_instance_spec:type_name -> imrpc.SpdkInstanceSpec
+	21, // 4: imrpc.InstanceSpec.data_engine:type_name -> imrpc.DataEngine
+	18, // 5: imrpc.InstanceStatus.conditions:type_name -> imrpc.InstanceStatus.ConditionsEntry
+	2,  // 6: imrpc.InstanceCreateRequest.spec:type_name -> imrpc.InstanceSpec
+	20, // 7: imrpc.InstanceDeleteRequest.backend_store_driver:type_name -> imrpc.BackendStoreDriver
+	21, // 8: imrpc.InstanceDeleteRequest.data_engine:type_name -> imrpc.DataEngine
+	20, // 9: imrpc.InstanceGetRequest.backend_store_driver:type_name -> imrpc.BackendStoreDriver
+	21, // 10: imrpc.InstanceGetRequest.data_engine:type_name -> imrpc.DataEngine
+	2,  // 11: imrpc.InstanceResponse.spec:type_name -> imrpc.InstanceSpec
+	3,  // 12: imrpc.InstanceResponse.status:type_name -> imrpc.InstanceStatus
+	19, // 13: imrpc.InstanceListResponse.instances:type_name -> imrpc.InstanceListResponse.InstancesEntry
+	20, // 14: imrpc.InstanceLogRequest.backend_store_driver:type_name -> imrpc.BackendStoreDriver
+	21, // 15: imrpc.InstanceLogRequest.data_engine:type_name -> imrpc.DataEngine
+	2,  // 16: imrpc.InstanceReplaceRequest.spec:type_name -> imrpc.InstanceSpec
+	21, // 17: imrpc.LogSetLevelRequest.data_engine:type_name -> imrpc.DataEngine
+	21, // 18: imrpc.LogSetFlagsRequest.data_engine:type_name -> imrpc.DataEngine
+	21, // 19: imrpc.LogGetLevelRequest.data_engine:type_name -> imrpc.DataEngine
+	21, // 20: imrpc.LogGetFlagsRequest.data_engine:type_name -> imrpc.DataEngine
+	7,  // 21: imrpc.InstanceListResponse.InstancesEntry.value:type_name -> imrpc.InstanceResponse
+	4,  // 22: imrpc.InstanceService.InstanceCreate:input_type -> imrpc.InstanceCreateRequest
+	5,  // 23: imrpc.InstanceService.InstanceDelete:input_type -> imrpc.InstanceDeleteRequest
+	6,  // 24: imrpc.InstanceService.InstanceGet:input_type -> imrpc.InstanceGetRequest
+	22, // 25: imrpc.InstanceService.InstanceList:input_type -> google.protobuf.Empty
+	9,  // 26: imrpc.InstanceService.InstanceLog:input_type -> imrpc.InstanceLogRequest
+	22, // 27: imrpc.InstanceService.InstanceWatch:input_type -> google.protobuf.Empty
+	10, // 28: imrpc.InstanceService.InstanceReplace:input_type -> imrpc.InstanceReplaceRequest
+	11, // 29: imrpc.InstanceService.LogSetLevel:input_type -> imrpc.LogSetLevelRequest
+	12, // 30: imrpc.InstanceService.LogSetFlags:input_type -> imrpc.LogSetFlagsRequest
+	13, // 31: imrpc.InstanceService.LogGetLevel:input_type -> imrpc.LogGetLevelRequest
+	15, // 32: imrpc.InstanceService.LogGetFlags:input_type -> imrpc.LogGetFlagsRequest
+	22, // 33: imrpc.InstanceService.VersionGet:input_type -> google.protobuf.Empty
+	7,  // 34: imrpc.InstanceService.InstanceCreate:output_type -> imrpc.InstanceResponse
+	7,  // 35: imrpc.InstanceService.InstanceDelete:output_type -> imrpc.InstanceResponse
+	7,  // 36: imrpc.InstanceService.InstanceGet:output_type -> imrpc.InstanceResponse
+	8,  // 37: imrpc.InstanceService.InstanceList:output_type -> imrpc.InstanceListResponse
+	23, // 38: imrpc.InstanceService.InstanceLog:output_type -> LogResponse
+	22, // 39: imrpc.InstanceService.InstanceWatch:output_type -> google.protobuf.Empty
+	7,  // 40: imrpc.InstanceService.InstanceReplace:output_type -> imrpc.InstanceResponse
+	22, // 41: imrpc.InstanceService.LogSetLevel:output_type -> google.protobuf.Empty
+	22, // 42: imrpc.InstanceService.LogSetFlags:output_type -> google.protobuf.Empty
+	14, // 43: imrpc.InstanceService.LogGetLevel:output_type -> imrpc.LogGetLevelResponse
+	16, // 44: imrpc.InstanceService.LogGetFlags:output_type -> imrpc.LogGetFlagsResponse
+	24, // 45: imrpc.InstanceService.VersionGet:output_type -> VersionResponse
+	34, // [34:46] is the sub-list for method output_type
+	22, // [22:34] is the sub-list for method input_type
+	22, // [22:22] is the sub-list for extension type_name
+	22, // [22:22] is the sub-list for extension extendee
+	0,  // [0:22] is the sub-list for field type_name
+}
+
+func init() { file_imrpc_instance_proto_init() }
+func file_imrpc_instance_proto_init() {
+	if File_imrpc_instance_proto != nil {
+		return
+	}
+	file_imrpc_common_proto_init()
+	file_imrpc_imrpc_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_imrpc_instance_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ProcessInstanceSpec); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SpdkInstanceSpec); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InstanceSpec); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InstanceStatus); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InstanceCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InstanceDeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InstanceGetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InstanceResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InstanceListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InstanceLogRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InstanceReplaceRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LogSetLevelRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LogSetFlagsRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LogGetLevelRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LogGetLevelResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LogGetFlagsRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_instance_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LogGetFlagsResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_imrpc_instance_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   20,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_imrpc_instance_proto_goTypes,
+		DependencyIndexes: file_imrpc_instance_proto_depIdxs,
+		MessageInfos:      file_imrpc_instance_proto_msgTypes,
+	}.Build()
+	File_imrpc_instance_proto = out.File
+	file_imrpc_instance_proto_rawDesc = nil
+	file_imrpc_instance_proto_goTypes = nil
+	file_imrpc_instance_proto_depIdxs = nil
+}
diff --git a/pkg/generated/imrpc/instance_grpc.pb.go b/pkg/generated/imrpc/instance_grpc.pb.go
new file mode 100644
index 0000000..35ac732
--- /dev/null
+++ b/pkg/generated/imrpc/instance_grpc.pb.go
@@ -0,0 +1,572 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v4.24.3
+// source: imrpc/instance.proto
+
+package imrpc
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+	InstanceService_InstanceCreate_FullMethodName  = "/imrpc.InstanceService/InstanceCreate"
+	InstanceService_InstanceDelete_FullMethodName  = "/imrpc.InstanceService/InstanceDelete"
+	InstanceService_InstanceGet_FullMethodName     = "/imrpc.InstanceService/InstanceGet"
+	InstanceService_InstanceList_FullMethodName    = "/imrpc.InstanceService/InstanceList"
+	InstanceService_InstanceLog_FullMethodName     = "/imrpc.InstanceService/InstanceLog"
+	InstanceService_InstanceWatch_FullMethodName   = "/imrpc.InstanceService/InstanceWatch"
+	InstanceService_InstanceReplace_FullMethodName = "/imrpc.InstanceService/InstanceReplace"
+	InstanceService_LogSetLevel_FullMethodName     = "/imrpc.InstanceService/LogSetLevel"
+	InstanceService_LogSetFlags_FullMethodName     = "/imrpc.InstanceService/LogSetFlags"
+	InstanceService_LogGetLevel_FullMethodName     = "/imrpc.InstanceService/LogGetLevel"
+	InstanceService_LogGetFlags_FullMethodName     = "/imrpc.InstanceService/LogGetFlags"
+	InstanceService_VersionGet_FullMethodName      = "/imrpc.InstanceService/VersionGet"
+)
+
+// InstanceServiceClient is the client API for InstanceService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type InstanceServiceClient interface {
+	InstanceCreate(ctx context.Context, in *InstanceCreateRequest, opts ...grpc.CallOption) (*InstanceResponse, error)
+	InstanceDelete(ctx context.Context, in *InstanceDeleteRequest, opts ...grpc.CallOption) (*InstanceResponse, error)
+	InstanceGet(ctx context.Context, in *InstanceGetRequest, opts ...grpc.CallOption) (*InstanceResponse, error)
+	InstanceList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*InstanceListResponse, error)
+	InstanceLog(ctx context.Context, in *InstanceLogRequest, opts ...grpc.CallOption) (InstanceService_InstanceLogClient, error)
+	InstanceWatch(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (InstanceService_InstanceWatchClient, error)
+	InstanceReplace(ctx context.Context, in *InstanceReplaceRequest, opts ...grpc.CallOption) (*InstanceResponse, error)
+	LogSetLevel(ctx context.Context, in *LogSetLevelRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	LogSetFlags(ctx context.Context, in *LogSetFlagsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	LogGetLevel(ctx context.Context, in *LogGetLevelRequest, opts ...grpc.CallOption) (*LogGetLevelResponse, error)
+	LogGetFlags(ctx context.Context, in *LogGetFlagsRequest, opts ...grpc.CallOption) (*LogGetFlagsResponse, error)
+	VersionGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionResponse, error)
+}
+
+type instanceServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewInstanceServiceClient(cc grpc.ClientConnInterface) InstanceServiceClient {
+	return &instanceServiceClient{cc}
+}
+
+func (c *instanceServiceClient) InstanceCreate(ctx context.Context, in *InstanceCreateRequest, opts ...grpc.CallOption) (*InstanceResponse, error) {
+	out := new(InstanceResponse)
+	err := c.cc.Invoke(ctx, InstanceService_InstanceCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *instanceServiceClient) InstanceDelete(ctx context.Context, in *InstanceDeleteRequest, opts ...grpc.CallOption) (*InstanceResponse, error) {
+	out := new(InstanceResponse)
+	err := c.cc.Invoke(ctx, InstanceService_InstanceDelete_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *instanceServiceClient) InstanceGet(ctx context.Context, in *InstanceGetRequest, opts ...grpc.CallOption) (*InstanceResponse, error) {
+	out := new(InstanceResponse)
+	err := c.cc.Invoke(ctx, InstanceService_InstanceGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *instanceServiceClient) InstanceList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*InstanceListResponse, error) {
+	out := new(InstanceListResponse)
+	err := c.cc.Invoke(ctx, InstanceService_InstanceList_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *instanceServiceClient) InstanceLog(ctx context.Context, in *InstanceLogRequest, opts ...grpc.CallOption) (InstanceService_InstanceLogClient, error) {
+	stream, err := c.cc.NewStream(ctx, &InstanceService_ServiceDesc.Streams[0], InstanceService_InstanceLog_FullMethodName, opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &instanceServiceInstanceLogClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type InstanceService_InstanceLogClient interface {
+	Recv() (*LogResponse, error)
+	grpc.ClientStream
+}
+
+type instanceServiceInstanceLogClient struct {
+	grpc.ClientStream
+}
+
+func (x *instanceServiceInstanceLogClient) Recv() (*LogResponse, error) {
+	m := new(LogResponse)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *instanceServiceClient) InstanceWatch(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (InstanceService_InstanceWatchClient, error) {
+	stream, err := c.cc.NewStream(ctx, &InstanceService_ServiceDesc.Streams[1], InstanceService_InstanceWatch_FullMethodName, opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &instanceServiceInstanceWatchClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type InstanceService_InstanceWatchClient interface {
+	Recv() (*emptypb.Empty, error)
+	grpc.ClientStream
+}
+
+type instanceServiceInstanceWatchClient struct {
+	grpc.ClientStream
+}
+
+func (x *instanceServiceInstanceWatchClient) Recv() (*emptypb.Empty, error) {
+	m := new(emptypb.Empty)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *instanceServiceClient) InstanceReplace(ctx context.Context, in *InstanceReplaceRequest, opts ...grpc.CallOption) (*InstanceResponse, error) {
+	out := new(InstanceResponse)
+	err := c.cc.Invoke(ctx, InstanceService_InstanceReplace_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *instanceServiceClient) LogSetLevel(ctx context.Context, in *LogSetLevelRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, InstanceService_LogSetLevel_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *instanceServiceClient) LogSetFlags(ctx context.Context, in *LogSetFlagsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, InstanceService_LogSetFlags_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *instanceServiceClient) LogGetLevel(ctx context.Context, in *LogGetLevelRequest, opts ...grpc.CallOption) (*LogGetLevelResponse, error) {
+	out := new(LogGetLevelResponse)
+	err := c.cc.Invoke(ctx, InstanceService_LogGetLevel_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *instanceServiceClient) LogGetFlags(ctx context.Context, in *LogGetFlagsRequest, opts ...grpc.CallOption) (*LogGetFlagsResponse, error) {
+	out := new(LogGetFlagsResponse)
+	err := c.cc.Invoke(ctx, InstanceService_LogGetFlags_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *instanceServiceClient) VersionGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionResponse, error) {
+	out := new(VersionResponse)
+	err := c.cc.Invoke(ctx, InstanceService_VersionGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// InstanceServiceServer is the server API for InstanceService service.
+// All implementations must embed UnimplementedInstanceServiceServer
+// for forward compatibility
+type InstanceServiceServer interface {
+	InstanceCreate(context.Context, *InstanceCreateRequest) (*InstanceResponse, error)
+	InstanceDelete(context.Context, *InstanceDeleteRequest) (*InstanceResponse, error)
+	InstanceGet(context.Context, *InstanceGetRequest) (*InstanceResponse, error)
+	InstanceList(context.Context, *emptypb.Empty) (*InstanceListResponse, error)
+	InstanceLog(*InstanceLogRequest, InstanceService_InstanceLogServer) error
+	InstanceWatch(*emptypb.Empty, InstanceService_InstanceWatchServer) error
+	InstanceReplace(context.Context, *InstanceReplaceRequest) (*InstanceResponse, error)
+	LogSetLevel(context.Context, *LogSetLevelRequest) (*emptypb.Empty, error)
+	LogSetFlags(context.Context, *LogSetFlagsRequest) (*emptypb.Empty, error)
+	LogGetLevel(context.Context, *LogGetLevelRequest) (*LogGetLevelResponse, error)
+	LogGetFlags(context.Context, *LogGetFlagsRequest) (*LogGetFlagsResponse, error)
+	VersionGet(context.Context, *emptypb.Empty) (*VersionResponse, error)
+	mustEmbedUnimplementedInstanceServiceServer()
+}
+
+// UnimplementedInstanceServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedInstanceServiceServer struct {
+}
+
+func (UnimplementedInstanceServiceServer) InstanceCreate(context.Context, *InstanceCreateRequest) (*InstanceResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method InstanceCreate not implemented")
+}
+func (UnimplementedInstanceServiceServer) InstanceDelete(context.Context, *InstanceDeleteRequest) (*InstanceResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method InstanceDelete not implemented")
+}
+func (UnimplementedInstanceServiceServer) InstanceGet(context.Context, *InstanceGetRequest) (*InstanceResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method InstanceGet not implemented")
+}
+func (UnimplementedInstanceServiceServer) InstanceList(context.Context, *emptypb.Empty) (*InstanceListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method InstanceList not implemented")
+}
+func (UnimplementedInstanceServiceServer) InstanceLog(*InstanceLogRequest, InstanceService_InstanceLogServer) error {
+	return status.Errorf(codes.Unimplemented, "method InstanceLog not implemented")
+}
+func (UnimplementedInstanceServiceServer) InstanceWatch(*emptypb.Empty, InstanceService_InstanceWatchServer) error {
+	return status.Errorf(codes.Unimplemented, "method InstanceWatch not implemented")
+}
+func (UnimplementedInstanceServiceServer) InstanceReplace(context.Context, *InstanceReplaceRequest) (*InstanceResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method InstanceReplace not implemented")
+}
+func (UnimplementedInstanceServiceServer) LogSetLevel(context.Context, *LogSetLevelRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method LogSetLevel not implemented")
+}
+func (UnimplementedInstanceServiceServer) LogSetFlags(context.Context, *LogSetFlagsRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method LogSetFlags not implemented")
+}
+func (UnimplementedInstanceServiceServer) LogGetLevel(context.Context, *LogGetLevelRequest) (*LogGetLevelResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method LogGetLevel not implemented")
+}
+func (UnimplementedInstanceServiceServer) LogGetFlags(context.Context, *LogGetFlagsRequest) (*LogGetFlagsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method LogGetFlags not implemented")
+}
+func (UnimplementedInstanceServiceServer) VersionGet(context.Context, *emptypb.Empty) (*VersionResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VersionGet not implemented")
+}
+func (UnimplementedInstanceServiceServer) mustEmbedUnimplementedInstanceServiceServer() {}
+
+// UnsafeInstanceServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to InstanceServiceServer will
+// result in compilation errors.
+type UnsafeInstanceServiceServer interface {
+	mustEmbedUnimplementedInstanceServiceServer()
+}
+
+func RegisterInstanceServiceServer(s grpc.ServiceRegistrar, srv InstanceServiceServer) {
+	s.RegisterService(&InstanceService_ServiceDesc, srv)
+}
+
+func _InstanceService_InstanceCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(InstanceCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(InstanceServiceServer).InstanceCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: InstanceService_InstanceCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(InstanceServiceServer).InstanceCreate(ctx, req.(*InstanceCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _InstanceService_InstanceDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(InstanceDeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(InstanceServiceServer).InstanceDelete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: InstanceService_InstanceDelete_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(InstanceServiceServer).InstanceDelete(ctx, req.(*InstanceDeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _InstanceService_InstanceGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(InstanceGetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(InstanceServiceServer).InstanceGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: InstanceService_InstanceGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(InstanceServiceServer).InstanceGet(ctx, req.(*InstanceGetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _InstanceService_InstanceList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(InstanceServiceServer).InstanceList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: InstanceService_InstanceList_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(InstanceServiceServer).InstanceList(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _InstanceService_InstanceLog_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(InstanceLogRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(InstanceServiceServer).InstanceLog(m, &instanceServiceInstanceLogServer{stream})
+}
+
+type InstanceService_InstanceLogServer interface {
+	Send(*LogResponse) error
+	grpc.ServerStream
+}
+
+type instanceServiceInstanceLogServer struct {
+	grpc.ServerStream
+}
+
+func (x *instanceServiceInstanceLogServer) Send(m *LogResponse) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _InstanceService_InstanceWatch_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(emptypb.Empty)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(InstanceServiceServer).InstanceWatch(m, &instanceServiceInstanceWatchServer{stream})
+}
+
+type InstanceService_InstanceWatchServer interface {
+	Send(*emptypb.Empty) error
+	grpc.ServerStream
+}
+
+type instanceServiceInstanceWatchServer struct {
+	grpc.ServerStream
+}
+
+func (x *instanceServiceInstanceWatchServer) Send(m *emptypb.Empty) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _InstanceService_InstanceReplace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(InstanceReplaceRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(InstanceServiceServer).InstanceReplace(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: InstanceService_InstanceReplace_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(InstanceServiceServer).InstanceReplace(ctx, req.(*InstanceReplaceRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _InstanceService_LogSetLevel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(LogSetLevelRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(InstanceServiceServer).LogSetLevel(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: InstanceService_LogSetLevel_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(InstanceServiceServer).LogSetLevel(ctx, req.(*LogSetLevelRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _InstanceService_LogSetFlags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(LogSetFlagsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(InstanceServiceServer).LogSetFlags(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: InstanceService_LogSetFlags_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(InstanceServiceServer).LogSetFlags(ctx, req.(*LogSetFlagsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _InstanceService_LogGetLevel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(LogGetLevelRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(InstanceServiceServer).LogGetLevel(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: InstanceService_LogGetLevel_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(InstanceServiceServer).LogGetLevel(ctx, req.(*LogGetLevelRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _InstanceService_LogGetFlags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(LogGetFlagsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(InstanceServiceServer).LogGetFlags(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: InstanceService_LogGetFlags_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(InstanceServiceServer).LogGetFlags(ctx, req.(*LogGetFlagsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _InstanceService_VersionGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(InstanceServiceServer).VersionGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: InstanceService_VersionGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(InstanceServiceServer).VersionGet(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// InstanceService_ServiceDesc is the grpc.ServiceDesc for InstanceService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var InstanceService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "imrpc.InstanceService",
+	HandlerType: (*InstanceServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "InstanceCreate",
+			Handler:    _InstanceService_InstanceCreate_Handler,
+		},
+		{
+			MethodName: "InstanceDelete",
+			Handler:    _InstanceService_InstanceDelete_Handler,
+		},
+		{
+			MethodName: "InstanceGet",
+			Handler:    _InstanceService_InstanceGet_Handler,
+		},
+		{
+			MethodName: "InstanceList",
+			Handler:    _InstanceService_InstanceList_Handler,
+		},
+		{
+			MethodName: "InstanceReplace",
+			Handler:    _InstanceService_InstanceReplace_Handler,
+		},
+		{
+			MethodName: "LogSetLevel",
+			Handler:    _InstanceService_LogSetLevel_Handler,
+		},
+		{
+			MethodName: "LogSetFlags",
+			Handler:    _InstanceService_LogSetFlags_Handler,
+		},
+		{
+			MethodName: "LogGetLevel",
+			Handler:    _InstanceService_LogGetLevel_Handler,
+		},
+		{
+			MethodName: "LogGetFlags",
+			Handler:    _InstanceService_LogGetFlags_Handler,
+		},
+		{
+			MethodName: "VersionGet",
+			Handler:    _InstanceService_VersionGet_Handler,
+		},
+	},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "InstanceLog",
+			Handler:       _InstanceService_InstanceLog_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "InstanceWatch",
+			Handler:       _InstanceService_InstanceWatch_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "imrpc/instance.proto",
+}
diff --git a/pkg/generated/imrpc/proxy.pb.go b/pkg/generated/imrpc/proxy.pb.go
new file mode 100644
index 0000000..2e2eec1
--- /dev/null
+++ b/pkg/generated/imrpc/proxy.pb.go
@@ -0,0 +1,3756 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
+// source: imrpc/proxy.proto
+
+package imrpc
+
+import (
+	enginerpc "github.com/longhorn/types/pkg/generated/enginerpc"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type ProxyEngineRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+	// Deprecated: Replaced by `data_engine`.
+	//
+	// Deprecated: Marked as deprecated in imrpc/proxy.proto.
+	BackendStoreDriver BackendStoreDriver `protobuf:"varint,2,opt,name=backend_store_driver,json=backendStoreDriver,proto3,enum=imrpc.BackendStoreDriver" json:"backend_store_driver,omitempty"`
+	EngineName         string             `protobuf:"bytes,3,opt,name=engine_name,json=engineName,proto3" json:"engine_name,omitempty"`
+	VolumeName         string             `protobuf:"bytes,4,opt,name=volume_name,json=volumeName,proto3" json:"volume_name,omitempty"`
+	DataEngine         DataEngine         `protobuf:"varint,5,opt,name=data_engine,json=dataEngine,proto3,enum=imrpc.DataEngine" json:"data_engine,omitempty"`
+}
+
+func (x *ProxyEngineRequest) Reset() {
+	*x = ProxyEngineRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ProxyEngineRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ProxyEngineRequest) ProtoMessage() {}
+
+func (x *ProxyEngineRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ProxyEngineRequest.ProtoReflect.Descriptor instead.
+func (*ProxyEngineRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *ProxyEngineRequest) GetAddress() string {
+	if x != nil {
+		return x.Address
+	}
+	return ""
+}
+
+// Deprecated: Marked as deprecated in imrpc/proxy.proto.
+func (x *ProxyEngineRequest) GetBackendStoreDriver() BackendStoreDriver {
+	if x != nil {
+		return x.BackendStoreDriver
+	}
+	return BackendStoreDriver_v1
+}
+
+func (x *ProxyEngineRequest) GetEngineName() string {
+	if x != nil {
+		return x.EngineName
+	}
+	return ""
+}
+
+func (x *ProxyEngineRequest) GetVolumeName() string {
+	if x != nil {
+		return x.VolumeName
+	}
+	return ""
+}
+
+func (x *ProxyEngineRequest) GetDataEngine() DataEngine {
+	if x != nil {
+		return x.DataEngine
+	}
+	return DataEngine_DATA_ENGINE_V1
+}
+
+type EngineVersionProxyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Version *enginerpc.VersionOutput `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
+}
+
+func (x *EngineVersionProxyResponse) Reset() {
+	*x = EngineVersionProxyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineVersionProxyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineVersionProxyResponse) ProtoMessage() {}
+
+func (x *EngineVersionProxyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineVersionProxyResponse.ProtoReflect.Descriptor instead.
+func (*EngineVersionProxyResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *EngineVersionProxyResponse) GetVersion() *enginerpc.VersionOutput {
+	if x != nil {
+		return x.Version
+	}
+	return nil
+}
+
+type EngineVolumeGetProxyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Volume *enginerpc.Volume `protobuf:"bytes,1,opt,name=volume,proto3" json:"volume,omitempty"`
+}
+
+func (x *EngineVolumeGetProxyResponse) Reset() {
+	*x = EngineVolumeGetProxyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineVolumeGetProxyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineVolumeGetProxyResponse) ProtoMessage() {}
+
+func (x *EngineVolumeGetProxyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineVolumeGetProxyResponse.ProtoReflect.Descriptor instead.
+func (*EngineVolumeGetProxyResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *EngineVolumeGetProxyResponse) GetVolume() *enginerpc.Volume {
+	if x != nil {
+		return x.Volume
+	}
+	return nil
+}
+
+type EngineVolumeExpandRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest            `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	Expand             *enginerpc.VolumeExpandRequest `protobuf:"bytes,2,opt,name=expand,proto3" json:"expand,omitempty"`
+}
+
+func (x *EngineVolumeExpandRequest) Reset() {
+	*x = EngineVolumeExpandRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineVolumeExpandRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineVolumeExpandRequest) ProtoMessage() {}
+
+func (x *EngineVolumeExpandRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineVolumeExpandRequest.ProtoReflect.Descriptor instead.
+func (*EngineVolumeExpandRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *EngineVolumeExpandRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineVolumeExpandRequest) GetExpand() *enginerpc.VolumeExpandRequest {
+	if x != nil {
+		return x.Expand
+	}
+	return nil
+}
+
+type EngineVolumeFrontendStartRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest                   `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	FrontendStart      *enginerpc.VolumeFrontendStartRequest `protobuf:"bytes,2,opt,name=frontend_start,json=frontendStart,proto3" json:"frontend_start,omitempty"`
+}
+
+func (x *EngineVolumeFrontendStartRequest) Reset() {
+	*x = EngineVolumeFrontendStartRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineVolumeFrontendStartRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineVolumeFrontendStartRequest) ProtoMessage() {}
+
+func (x *EngineVolumeFrontendStartRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineVolumeFrontendStartRequest.ProtoReflect.Descriptor instead.
+func (*EngineVolumeFrontendStartRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *EngineVolumeFrontendStartRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineVolumeFrontendStartRequest) GetFrontendStart() *enginerpc.VolumeFrontendStartRequest {
+	if x != nil {
+		return x.FrontendStart
+	}
+	return nil
+}
+
+type EngineVolumeSnapshotRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest              `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	SnapshotVolume     *enginerpc.VolumeSnapshotRequest `protobuf:"bytes,2,opt,name=snapshot_volume,json=snapshotVolume,proto3" json:"snapshot_volume,omitempty"`
+}
+
+func (x *EngineVolumeSnapshotRequest) Reset() {
+	*x = EngineVolumeSnapshotRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineVolumeSnapshotRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineVolumeSnapshotRequest) ProtoMessage() {}
+
+func (x *EngineVolumeSnapshotRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineVolumeSnapshotRequest.ProtoReflect.Descriptor instead.
+func (*EngineVolumeSnapshotRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *EngineVolumeSnapshotRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineVolumeSnapshotRequest) GetSnapshotVolume() *enginerpc.VolumeSnapshotRequest {
+	if x != nil {
+		return x.SnapshotVolume
+	}
+	return nil
+}
+
+type EngineVolumeSnapshotProxyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Snapshot *enginerpc.VolumeSnapshotReply `protobuf:"bytes,1,opt,name=snapshot,proto3" json:"snapshot,omitempty"`
+}
+
+func (x *EngineVolumeSnapshotProxyResponse) Reset() {
+	*x = EngineVolumeSnapshotProxyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineVolumeSnapshotProxyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineVolumeSnapshotProxyResponse) ProtoMessage() {}
+
+func (x *EngineVolumeSnapshotProxyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineVolumeSnapshotProxyResponse.ProtoReflect.Descriptor instead.
+func (*EngineVolumeSnapshotProxyResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *EngineVolumeSnapshotProxyResponse) GetSnapshot() *enginerpc.VolumeSnapshotReply {
+	if x != nil {
+		return x.Snapshot
+	}
+	return nil
+}
+
+type EngineVolumeUnmapMarkSnapChainRemovedSetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest                                  `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	UnmapMarkSnap      *enginerpc.VolumeUnmapMarkSnapChainRemovedSetRequest `protobuf:"bytes,2,opt,name=unmap_mark_snap,json=unmapMarkSnap,proto3" json:"unmap_mark_snap,omitempty"`
+}
+
+func (x *EngineVolumeUnmapMarkSnapChainRemovedSetRequest) Reset() {
+	*x = EngineVolumeUnmapMarkSnapChainRemovedSetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineVolumeUnmapMarkSnapChainRemovedSetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineVolumeUnmapMarkSnapChainRemovedSetRequest) ProtoMessage() {}
+
+func (x *EngineVolumeUnmapMarkSnapChainRemovedSetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineVolumeUnmapMarkSnapChainRemovedSetRequest.ProtoReflect.Descriptor instead.
+func (*EngineVolumeUnmapMarkSnapChainRemovedSetRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *EngineVolumeUnmapMarkSnapChainRemovedSetRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineVolumeUnmapMarkSnapChainRemovedSetRequest) GetUnmapMarkSnap() *enginerpc.VolumeUnmapMarkSnapChainRemovedSetRequest {
+	if x != nil {
+		return x.UnmapMarkSnap
+	}
+	return nil
+}
+
+type EngineVolumeSnapshotMaxCountSetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest                         `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	Count              *enginerpc.VolumeSnapshotMaxCountSetRequest `protobuf:"bytes,2,opt,name=count,proto3" json:"count,omitempty"`
+}
+
+func (x *EngineVolumeSnapshotMaxCountSetRequest) Reset() {
+	*x = EngineVolumeSnapshotMaxCountSetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineVolumeSnapshotMaxCountSetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineVolumeSnapshotMaxCountSetRequest) ProtoMessage() {}
+
+func (x *EngineVolumeSnapshotMaxCountSetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineVolumeSnapshotMaxCountSetRequest.ProtoReflect.Descriptor instead.
+func (*EngineVolumeSnapshotMaxCountSetRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *EngineVolumeSnapshotMaxCountSetRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineVolumeSnapshotMaxCountSetRequest) GetCount() *enginerpc.VolumeSnapshotMaxCountSetRequest {
+	if x != nil {
+		return x.Count
+	}
+	return nil
+}
+
+type EngineVolumeSnapshotMaxSizeSetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest                        `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	Size               *enginerpc.VolumeSnapshotMaxSizeSetRequest `protobuf:"bytes,2,opt,name=size,proto3" json:"size,omitempty"`
+}
+
+func (x *EngineVolumeSnapshotMaxSizeSetRequest) Reset() {
+	*x = EngineVolumeSnapshotMaxSizeSetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineVolumeSnapshotMaxSizeSetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineVolumeSnapshotMaxSizeSetRequest) ProtoMessage() {}
+
+func (x *EngineVolumeSnapshotMaxSizeSetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineVolumeSnapshotMaxSizeSetRequest.ProtoReflect.Descriptor instead.
+func (*EngineVolumeSnapshotMaxSizeSetRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *EngineVolumeSnapshotMaxSizeSetRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineVolumeSnapshotMaxSizeSetRequest) GetSize() *enginerpc.VolumeSnapshotMaxSizeSetRequest {
+	if x != nil {
+		return x.Size
+	}
+	return nil
+}
+
+type EngineSnapshotListProxyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Disks map[string]*EngineSnapshotDiskInfo `protobuf:"bytes,1,rep,name=disks,proto3" json:"disks,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *EngineSnapshotListProxyResponse) Reset() {
+	*x = EngineSnapshotListProxyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotListProxyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotListProxyResponse) ProtoMessage() {}
+
+func (x *EngineSnapshotListProxyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotListProxyResponse.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotListProxyResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *EngineSnapshotListProxyResponse) GetDisks() map[string]*EngineSnapshotDiskInfo {
+	if x != nil {
+		return x.Disks
+	}
+	return nil
+}
+
+type EngineSnapshotDiskInfo struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name        string            `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Parent      string            `protobuf:"bytes,2,opt,name=parent,proto3" json:"parent,omitempty"`
+	Children    map[string]bool   `protobuf:"bytes,3,rep,name=children,proto3" json:"children,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
+	Removed     bool              `protobuf:"varint,4,opt,name=removed,proto3" json:"removed,omitempty"`
+	UserCreated bool              `protobuf:"varint,5,opt,name=user_created,json=userCreated,proto3" json:"user_created,omitempty"`
+	Created     string            `protobuf:"bytes,6,opt,name=created,proto3" json:"created,omitempty"`
+	Size        string            `protobuf:"bytes,7,opt,name=size,proto3" json:"size,omitempty"`
+	Labels      map[string]string `protobuf:"bytes,8,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *EngineSnapshotDiskInfo) Reset() {
+	*x = EngineSnapshotDiskInfo{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotDiskInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotDiskInfo) ProtoMessage() {}
+
+func (x *EngineSnapshotDiskInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotDiskInfo.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotDiskInfo) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *EngineSnapshotDiskInfo) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *EngineSnapshotDiskInfo) GetParent() string {
+	if x != nil {
+		return x.Parent
+	}
+	return ""
+}
+
+func (x *EngineSnapshotDiskInfo) GetChildren() map[string]bool {
+	if x != nil {
+		return x.Children
+	}
+	return nil
+}
+
+func (x *EngineSnapshotDiskInfo) GetRemoved() bool {
+	if x != nil {
+		return x.Removed
+	}
+	return false
+}
+
+func (x *EngineSnapshotDiskInfo) GetUserCreated() bool {
+	if x != nil {
+		return x.UserCreated
+	}
+	return false
+}
+
+func (x *EngineSnapshotDiskInfo) GetCreated() string {
+	if x != nil {
+		return x.Created
+	}
+	return ""
+}
+
+func (x *EngineSnapshotDiskInfo) GetSize() string {
+	if x != nil {
+		return x.Size
+	}
+	return ""
+}
+
+func (x *EngineSnapshotDiskInfo) GetLabels() map[string]string {
+	if x != nil {
+		return x.Labels
+	}
+	return nil
+}
+
+type EngineSnapshotRevertRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	Name               string              `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *EngineSnapshotRevertRequest) Reset() {
+	*x = EngineSnapshotRevertRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotRevertRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotRevertRequest) ProtoMessage() {}
+
+func (x *EngineSnapshotRevertRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotRevertRequest.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotRevertRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *EngineSnapshotRevertRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineSnapshotRevertRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type EngineSnapshotPurgeRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	SkipIfInProgress   bool                `protobuf:"varint,2,opt,name=skip_if_in_progress,json=skipIfInProgress,proto3" json:"skip_if_in_progress,omitempty"`
+}
+
+func (x *EngineSnapshotPurgeRequest) Reset() {
+	*x = EngineSnapshotPurgeRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotPurgeRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotPurgeRequest) ProtoMessage() {}
+
+func (x *EngineSnapshotPurgeRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotPurgeRequest.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotPurgeRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *EngineSnapshotPurgeRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineSnapshotPurgeRequest) GetSkipIfInProgress() bool {
+	if x != nil {
+		return x.SkipIfInProgress
+	}
+	return false
+}
+
+type EngineSnapshotPurgeStatusProxyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Status map[string]*enginerpc.SnapshotPurgeStatusResponse `protobuf:"bytes,1,rep,name=status,proto3" json:"status,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *EngineSnapshotPurgeStatusProxyResponse) Reset() {
+	*x = EngineSnapshotPurgeStatusProxyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotPurgeStatusProxyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotPurgeStatusProxyResponse) ProtoMessage() {}
+
+func (x *EngineSnapshotPurgeStatusProxyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotPurgeStatusProxyResponse.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotPurgeStatusProxyResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *EngineSnapshotPurgeStatusProxyResponse) GetStatus() map[string]*enginerpc.SnapshotPurgeStatusResponse {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+type EngineSnapshotCloneRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest        *ProxyEngineRequest `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	FromEngineAddress         string              `protobuf:"bytes,2,opt,name=from_engine_address,json=fromEngineAddress,proto3" json:"from_engine_address,omitempty"`
+	SnapshotName              string              `protobuf:"bytes,3,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+	ExportBackingImageIfExist bool                `protobuf:"varint,4,opt,name=export_backing_image_if_exist,json=exportBackingImageIfExist,proto3" json:"export_backing_image_if_exist,omitempty"`
+	FileSyncHttpClientTimeout int32               `protobuf:"varint,5,opt,name=file_sync_http_client_timeout,json=fileSyncHttpClientTimeout,proto3" json:"file_sync_http_client_timeout,omitempty"`
+	FromEngineName            string              `protobuf:"bytes,6,opt,name=from_engine_name,json=fromEngineName,proto3" json:"from_engine_name,omitempty"`
+	FromVolumeName            string              `protobuf:"bytes,7,opt,name=from_volume_name,json=fromVolumeName,proto3" json:"from_volume_name,omitempty"`
+}
+
+func (x *EngineSnapshotCloneRequest) Reset() {
+	*x = EngineSnapshotCloneRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotCloneRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotCloneRequest) ProtoMessage() {}
+
+func (x *EngineSnapshotCloneRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotCloneRequest.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotCloneRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *EngineSnapshotCloneRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineSnapshotCloneRequest) GetFromEngineAddress() string {
+	if x != nil {
+		return x.FromEngineAddress
+	}
+	return ""
+}
+
+func (x *EngineSnapshotCloneRequest) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+func (x *EngineSnapshotCloneRequest) GetExportBackingImageIfExist() bool {
+	if x != nil {
+		return x.ExportBackingImageIfExist
+	}
+	return false
+}
+
+func (x *EngineSnapshotCloneRequest) GetFileSyncHttpClientTimeout() int32 {
+	if x != nil {
+		return x.FileSyncHttpClientTimeout
+	}
+	return 0
+}
+
+func (x *EngineSnapshotCloneRequest) GetFromEngineName() string {
+	if x != nil {
+		return x.FromEngineName
+	}
+	return ""
+}
+
+func (x *EngineSnapshotCloneRequest) GetFromVolumeName() string {
+	if x != nil {
+		return x.FromVolumeName
+	}
+	return ""
+}
+
+type EngineSnapshotCloneStatusProxyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Status map[string]*enginerpc.SnapshotCloneStatusResponse `protobuf:"bytes,1,rep,name=status,proto3" json:"status,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *EngineSnapshotCloneStatusProxyResponse) Reset() {
+	*x = EngineSnapshotCloneStatusProxyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotCloneStatusProxyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotCloneStatusProxyResponse) ProtoMessage() {}
+
+func (x *EngineSnapshotCloneStatusProxyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotCloneStatusProxyResponse.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotCloneStatusProxyResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *EngineSnapshotCloneStatusProxyResponse) GetStatus() map[string]*enginerpc.SnapshotCloneStatusResponse {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+type EngineSnapshotRemoveRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	Names              []string            `protobuf:"bytes,2,rep,name=names,proto3" json:"names,omitempty"`
+}
+
+func (x *EngineSnapshotRemoveRequest) Reset() {
+	*x = EngineSnapshotRemoveRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotRemoveRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotRemoveRequest) ProtoMessage() {}
+
+func (x *EngineSnapshotRemoveRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotRemoveRequest.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotRemoveRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *EngineSnapshotRemoveRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineSnapshotRemoveRequest) GetNames() []string {
+	if x != nil {
+		return x.Names
+	}
+	return nil
+}
+
+type EngineSnapshotBackupRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest   *ProxyEngineRequest `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	Envs                 []string            `protobuf:"bytes,8,rep,name=envs,proto3" json:"envs,omitempty"`
+	BackupName           string              `protobuf:"bytes,2,opt,name=backup_name,json=backupName,proto3" json:"backup_name,omitempty"`
+	SnapshotName         string              `protobuf:"bytes,3,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+	BackupTarget         string              `protobuf:"bytes,4,opt,name=backup_target,json=backupTarget,proto3" json:"backup_target,omitempty"`
+	BackingImageName     string              `protobuf:"bytes,5,opt,name=backing_image_name,json=backingImageName,proto3" json:"backing_image_name,omitempty"`
+	BackingImageChecksum string              `protobuf:"bytes,6,opt,name=backing_image_checksum,json=backingImageChecksum,proto3" json:"backing_image_checksum,omitempty"`
+	Labels               map[string]string   `protobuf:"bytes,7,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	CompressionMethod    string              `protobuf:"bytes,9,opt,name=compression_method,json=compressionMethod,proto3" json:"compression_method,omitempty"`
+	ConcurrentLimit      int32               `protobuf:"varint,10,opt,name=concurrent_limit,json=concurrentLimit,proto3" json:"concurrent_limit,omitempty"`
+	StorageClassName     string              `protobuf:"bytes,11,opt,name=storage_class_name,json=storageClassName,proto3" json:"storage_class_name,omitempty"`
+}
+
+func (x *EngineSnapshotBackupRequest) Reset() {
+	*x = EngineSnapshotBackupRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotBackupRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotBackupRequest) ProtoMessage() {}
+
+func (x *EngineSnapshotBackupRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotBackupRequest.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotBackupRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *EngineSnapshotBackupRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineSnapshotBackupRequest) GetEnvs() []string {
+	if x != nil {
+		return x.Envs
+	}
+	return nil
+}
+
+func (x *EngineSnapshotBackupRequest) GetBackupName() string {
+	if x != nil {
+		return x.BackupName
+	}
+	return ""
+}
+
+func (x *EngineSnapshotBackupRequest) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+func (x *EngineSnapshotBackupRequest) GetBackupTarget() string {
+	if x != nil {
+		return x.BackupTarget
+	}
+	return ""
+}
+
+func (x *EngineSnapshotBackupRequest) GetBackingImageName() string {
+	if x != nil {
+		return x.BackingImageName
+	}
+	return ""
+}
+
+func (x *EngineSnapshotBackupRequest) GetBackingImageChecksum() string {
+	if x != nil {
+		return x.BackingImageChecksum
+	}
+	return ""
+}
+
+func (x *EngineSnapshotBackupRequest) GetLabels() map[string]string {
+	if x != nil {
+		return x.Labels
+	}
+	return nil
+}
+
+func (x *EngineSnapshotBackupRequest) GetCompressionMethod() string {
+	if x != nil {
+		return x.CompressionMethod
+	}
+	return ""
+}
+
+func (x *EngineSnapshotBackupRequest) GetConcurrentLimit() int32 {
+	if x != nil {
+		return x.ConcurrentLimit
+	}
+	return 0
+}
+
+func (x *EngineSnapshotBackupRequest) GetStorageClassName() string {
+	if x != nil {
+		return x.StorageClassName
+	}
+	return ""
+}
+
+type EngineSnapshotBackupProxyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BackupId      string `protobuf:"bytes,1,opt,name=backup_id,json=backupId,proto3" json:"backup_id,omitempty"`
+	Replica       string `protobuf:"bytes,2,opt,name=replica,proto3" json:"replica,omitempty"`
+	IsIncremental bool   `protobuf:"varint,3,opt,name=is_incremental,json=isIncremental,proto3" json:"is_incremental,omitempty"`
+}
+
+func (x *EngineSnapshotBackupProxyResponse) Reset() {
+	*x = EngineSnapshotBackupProxyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotBackupProxyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotBackupProxyResponse) ProtoMessage() {}
+
+func (x *EngineSnapshotBackupProxyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotBackupProxyResponse.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotBackupProxyResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *EngineSnapshotBackupProxyResponse) GetBackupId() string {
+	if x != nil {
+		return x.BackupId
+	}
+	return ""
+}
+
+func (x *EngineSnapshotBackupProxyResponse) GetReplica() string {
+	if x != nil {
+		return x.Replica
+	}
+	return ""
+}
+
+func (x *EngineSnapshotBackupProxyResponse) GetIsIncremental() bool {
+	if x != nil {
+		return x.IsIncremental
+	}
+	return false
+}
+
+type EngineSnapshotBackupStatusRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	BackupName         string              `protobuf:"bytes,2,opt,name=backup_name,json=backupName,proto3" json:"backup_name,omitempty"`
+	ReplicaAddress     string              `protobuf:"bytes,3,opt,name=replica_address,json=replicaAddress,proto3" json:"replica_address,omitempty"`
+	ReplicaName        string              `protobuf:"bytes,4,opt,name=replica_name,json=replicaName,proto3" json:"replica_name,omitempty"`
+}
+
+func (x *EngineSnapshotBackupStatusRequest) Reset() {
+	*x = EngineSnapshotBackupStatusRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotBackupStatusRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotBackupStatusRequest) ProtoMessage() {}
+
+func (x *EngineSnapshotBackupStatusRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotBackupStatusRequest.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotBackupStatusRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *EngineSnapshotBackupStatusRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineSnapshotBackupStatusRequest) GetBackupName() string {
+	if x != nil {
+		return x.BackupName
+	}
+	return ""
+}
+
+func (x *EngineSnapshotBackupStatusRequest) GetReplicaAddress() string {
+	if x != nil {
+		return x.ReplicaAddress
+	}
+	return ""
+}
+
+func (x *EngineSnapshotBackupStatusRequest) GetReplicaName() string {
+	if x != nil {
+		return x.ReplicaName
+	}
+	return ""
+}
+
+type EngineSnapshotBackupStatusProxyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BackupUrl      string `protobuf:"bytes,1,opt,name=backup_url,json=backupUrl,proto3" json:"backup_url,omitempty"`
+	Error          string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"`
+	Progress       int32  `protobuf:"varint,3,opt,name=progress,proto3" json:"progress,omitempty"`
+	SnapshotName   string `protobuf:"bytes,4,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+	State          string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"`
+	ReplicaAddress string `protobuf:"bytes,6,opt,name=replica_address,json=replicaAddress,proto3" json:"replica_address,omitempty"`
+}
+
+func (x *EngineSnapshotBackupStatusProxyResponse) Reset() {
+	*x = EngineSnapshotBackupStatusProxyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotBackupStatusProxyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotBackupStatusProxyResponse) ProtoMessage() {}
+
+func (x *EngineSnapshotBackupStatusProxyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotBackupStatusProxyResponse.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotBackupStatusProxyResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *EngineSnapshotBackupStatusProxyResponse) GetBackupUrl() string {
+	if x != nil {
+		return x.BackupUrl
+	}
+	return ""
+}
+
+func (x *EngineSnapshotBackupStatusProxyResponse) GetError() string {
+	if x != nil {
+		return x.Error
+	}
+	return ""
+}
+
+func (x *EngineSnapshotBackupStatusProxyResponse) GetProgress() int32 {
+	if x != nil {
+		return x.Progress
+	}
+	return 0
+}
+
+func (x *EngineSnapshotBackupStatusProxyResponse) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+func (x *EngineSnapshotBackupStatusProxyResponse) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+func (x *EngineSnapshotBackupStatusProxyResponse) GetReplicaAddress() string {
+	if x != nil {
+		return x.ReplicaAddress
+	}
+	return ""
+}
+
+type EngineBackupRestoreRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	Envs               []string            `protobuf:"bytes,2,rep,name=envs,proto3" json:"envs,omitempty"`
+	Url                string              `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"`
+	Target             string              `protobuf:"bytes,4,opt,name=target,proto3" json:"target,omitempty"`
+	VolumeName         string              `protobuf:"bytes,5,opt,name=volume_name,json=volumeName,proto3" json:"volume_name,omitempty"`
+	ConcurrentLimit    int32               `protobuf:"varint,6,opt,name=concurrent_limit,json=concurrentLimit,proto3" json:"concurrent_limit,omitempty"`
+}
+
+func (x *EngineBackupRestoreRequest) Reset() {
+	*x = EngineBackupRestoreRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineBackupRestoreRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineBackupRestoreRequest) ProtoMessage() {}
+
+func (x *EngineBackupRestoreRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineBackupRestoreRequest.ProtoReflect.Descriptor instead.
+func (*EngineBackupRestoreRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *EngineBackupRestoreRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineBackupRestoreRequest) GetEnvs() []string {
+	if x != nil {
+		return x.Envs
+	}
+	return nil
+}
+
+func (x *EngineBackupRestoreRequest) GetUrl() string {
+	if x != nil {
+		return x.Url
+	}
+	return ""
+}
+
+func (x *EngineBackupRestoreRequest) GetTarget() string {
+	if x != nil {
+		return x.Target
+	}
+	return ""
+}
+
+func (x *EngineBackupRestoreRequest) GetVolumeName() string {
+	if x != nil {
+		return x.VolumeName
+	}
+	return ""
+}
+
+func (x *EngineBackupRestoreRequest) GetConcurrentLimit() int32 {
+	if x != nil {
+		return x.ConcurrentLimit
+	}
+	return 0
+}
+
+type EngineBackupRestoreProxyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	TaskError []byte `protobuf:"bytes,1,opt,name=taskError,proto3" json:"taskError,omitempty"`
+}
+
+func (x *EngineBackupRestoreProxyResponse) Reset() {
+	*x = EngineBackupRestoreProxyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[23]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineBackupRestoreProxyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineBackupRestoreProxyResponse) ProtoMessage() {}
+
+func (x *EngineBackupRestoreProxyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineBackupRestoreProxyResponse.ProtoReflect.Descriptor instead.
+func (*EngineBackupRestoreProxyResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *EngineBackupRestoreProxyResponse) GetTaskError() []byte {
+	if x != nil {
+		return x.TaskError
+	}
+	return nil
+}
+
+type EngineBackupRestoreStatusProxyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Status map[string]*EngineBackupRestoreStatus `protobuf:"bytes,1,rep,name=status,proto3" json:"status,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *EngineBackupRestoreStatusProxyResponse) Reset() {
+	*x = EngineBackupRestoreStatusProxyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[24]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineBackupRestoreStatusProxyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineBackupRestoreStatusProxyResponse) ProtoMessage() {}
+
+func (x *EngineBackupRestoreStatusProxyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineBackupRestoreStatusProxyResponse.ProtoReflect.Descriptor instead.
+func (*EngineBackupRestoreStatusProxyResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{24}
+}
+
+func (x *EngineBackupRestoreStatusProxyResponse) GetStatus() map[string]*EngineBackupRestoreStatus {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+type EngineBackupRestoreStatus struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IsRestoring            bool   `protobuf:"varint,1,opt,name=is_restoring,json=isRestoring,proto3" json:"is_restoring,omitempty"`
+	LastRestored           string `protobuf:"bytes,2,opt,name=last_restored,json=lastRestored,proto3" json:"last_restored,omitempty"`
+	CurrentRestoringBackup string `protobuf:"bytes,3,opt,name=current_restoring_backup,json=currentRestoringBackup,proto3" json:"current_restoring_backup,omitempty"`
+	Progress               int32  `protobuf:"varint,4,opt,name=progress,proto3" json:"progress,omitempty"`
+	Error                  string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"`
+	Filename               string `protobuf:"bytes,6,opt,name=filename,proto3" json:"filename,omitempty"`
+	State                  string `protobuf:"bytes,7,opt,name=state,proto3" json:"state,omitempty"`
+	BackupUrl              string `protobuf:"bytes,8,opt,name=backup_url,json=backupUrl,proto3" json:"backup_url,omitempty"`
+}
+
+func (x *EngineBackupRestoreStatus) Reset() {
+	*x = EngineBackupRestoreStatus{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[25]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineBackupRestoreStatus) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineBackupRestoreStatus) ProtoMessage() {}
+
+func (x *EngineBackupRestoreStatus) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineBackupRestoreStatus.ProtoReflect.Descriptor instead.
+func (*EngineBackupRestoreStatus) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *EngineBackupRestoreStatus) GetIsRestoring() bool {
+	if x != nil {
+		return x.IsRestoring
+	}
+	return false
+}
+
+func (x *EngineBackupRestoreStatus) GetLastRestored() string {
+	if x != nil {
+		return x.LastRestored
+	}
+	return ""
+}
+
+func (x *EngineBackupRestoreStatus) GetCurrentRestoringBackup() string {
+	if x != nil {
+		return x.CurrentRestoringBackup
+	}
+	return ""
+}
+
+func (x *EngineBackupRestoreStatus) GetProgress() int32 {
+	if x != nil {
+		return x.Progress
+	}
+	return 0
+}
+
+func (x *EngineBackupRestoreStatus) GetError() string {
+	if x != nil {
+		return x.Error
+	}
+	return ""
+}
+
+func (x *EngineBackupRestoreStatus) GetFilename() string {
+	if x != nil {
+		return x.Filename
+	}
+	return ""
+}
+
+func (x *EngineBackupRestoreStatus) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+func (x *EngineBackupRestoreStatus) GetBackupUrl() string {
+	if x != nil {
+		return x.BackupUrl
+	}
+	return ""
+}
+
+type EngineBackupRestoreFinishRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+}
+
+func (x *EngineBackupRestoreFinishRequest) Reset() {
+	*x = EngineBackupRestoreFinishRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[26]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineBackupRestoreFinishRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineBackupRestoreFinishRequest) ProtoMessage() {}
+
+func (x *EngineBackupRestoreFinishRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineBackupRestoreFinishRequest.ProtoReflect.Descriptor instead.
+func (*EngineBackupRestoreFinishRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{26}
+}
+
+func (x *EngineBackupRestoreFinishRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+type EngineReplicaAddRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest        *ProxyEngineRequest `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	ReplicaAddress            string              `protobuf:"bytes,2,opt,name=replica_address,json=replicaAddress,proto3" json:"replica_address,omitempty"`
+	Restore                   bool                `protobuf:"varint,3,opt,name=restore,proto3" json:"restore,omitempty"`
+	Size                      int64               `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"`
+	CurrentSize               int64               `protobuf:"varint,5,opt,name=current_size,json=currentSize,proto3" json:"current_size,omitempty"`
+	FastSync                  bool                `protobuf:"varint,6,opt,name=fast_sync,json=fastSync,proto3" json:"fast_sync,omitempty"`
+	FileSyncHttpClientTimeout int32               `protobuf:"varint,7,opt,name=file_sync_http_client_timeout,json=fileSyncHttpClientTimeout,proto3" json:"file_sync_http_client_timeout,omitempty"`
+	ReplicaName               string              `protobuf:"bytes,8,opt,name=replica_name,json=replicaName,proto3" json:"replica_name,omitempty"`
+}
+
+func (x *EngineReplicaAddRequest) Reset() {
+	*x = EngineReplicaAddRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[27]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineReplicaAddRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineReplicaAddRequest) ProtoMessage() {}
+
+func (x *EngineReplicaAddRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineReplicaAddRequest.ProtoReflect.Descriptor instead.
+func (*EngineReplicaAddRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *EngineReplicaAddRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineReplicaAddRequest) GetReplicaAddress() string {
+	if x != nil {
+		return x.ReplicaAddress
+	}
+	return ""
+}
+
+func (x *EngineReplicaAddRequest) GetRestore() bool {
+	if x != nil {
+		return x.Restore
+	}
+	return false
+}
+
+func (x *EngineReplicaAddRequest) GetSize() int64 {
+	if x != nil {
+		return x.Size
+	}
+	return 0
+}
+
+func (x *EngineReplicaAddRequest) GetCurrentSize() int64 {
+	if x != nil {
+		return x.CurrentSize
+	}
+	return 0
+}
+
+func (x *EngineReplicaAddRequest) GetFastSync() bool {
+	if x != nil {
+		return x.FastSync
+	}
+	return false
+}
+
+func (x *EngineReplicaAddRequest) GetFileSyncHttpClientTimeout() int32 {
+	if x != nil {
+		return x.FileSyncHttpClientTimeout
+	}
+	return 0
+}
+
+func (x *EngineReplicaAddRequest) GetReplicaName() string {
+	if x != nil {
+		return x.ReplicaName
+	}
+	return ""
+}
+
+type EngineReplicaListProxyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ReplicaList *enginerpc.ReplicaListReply `protobuf:"bytes,1,opt,name=replica_list,json=replicaList,proto3" json:"replica_list,omitempty"`
+}
+
+func (x *EngineReplicaListProxyResponse) Reset() {
+	*x = EngineReplicaListProxyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[28]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineReplicaListProxyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineReplicaListProxyResponse) ProtoMessage() {}
+
+func (x *EngineReplicaListProxyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineReplicaListProxyResponse.ProtoReflect.Descriptor instead.
+func (*EngineReplicaListProxyResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{28}
+}
+
+func (x *EngineReplicaListProxyResponse) GetReplicaList() *enginerpc.ReplicaListReply {
+	if x != nil {
+		return x.ReplicaList
+	}
+	return nil
+}
+
+type EngineReplicaVerifyRebuildRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	ReplicaAddress     string              `protobuf:"bytes,2,opt,name=replica_address,json=replicaAddress,proto3" json:"replica_address,omitempty"`
+	ReplicaName        string              `protobuf:"bytes,3,opt,name=replica_name,json=replicaName,proto3" json:"replica_name,omitempty"`
+}
+
+func (x *EngineReplicaVerifyRebuildRequest) Reset() {
+	*x = EngineReplicaVerifyRebuildRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[29]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineReplicaVerifyRebuildRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineReplicaVerifyRebuildRequest) ProtoMessage() {}
+
+func (x *EngineReplicaVerifyRebuildRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineReplicaVerifyRebuildRequest.ProtoReflect.Descriptor instead.
+func (*EngineReplicaVerifyRebuildRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{29}
+}
+
+func (x *EngineReplicaVerifyRebuildRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineReplicaVerifyRebuildRequest) GetReplicaAddress() string {
+	if x != nil {
+		return x.ReplicaAddress
+	}
+	return ""
+}
+
+func (x *EngineReplicaVerifyRebuildRequest) GetReplicaName() string {
+	if x != nil {
+		return x.ReplicaName
+	}
+	return ""
+}
+
+type EngineReplicaRebuildStatusProxyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Status map[string]*enginerpc.ReplicaRebuildStatusResponse `protobuf:"bytes,1,rep,name=status,proto3" json:"status,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *EngineReplicaRebuildStatusProxyResponse) Reset() {
+	*x = EngineReplicaRebuildStatusProxyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[30]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineReplicaRebuildStatusProxyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineReplicaRebuildStatusProxyResponse) ProtoMessage() {}
+
+func (x *EngineReplicaRebuildStatusProxyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineReplicaRebuildStatusProxyResponse.ProtoReflect.Descriptor instead.
+func (*EngineReplicaRebuildStatusProxyResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{30}
+}
+
+func (x *EngineReplicaRebuildStatusProxyResponse) GetStatus() map[string]*enginerpc.ReplicaRebuildStatusResponse {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+type EngineReplicaRemoveRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	ReplicaAddress     string              `protobuf:"bytes,2,opt,name=replica_address,json=replicaAddress,proto3" json:"replica_address,omitempty"`
+	ReplicaName        string              `protobuf:"bytes,3,opt,name=replica_name,json=replicaName,proto3" json:"replica_name,omitempty"`
+}
+
+func (x *EngineReplicaRemoveRequest) Reset() {
+	*x = EngineReplicaRemoveRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[31]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineReplicaRemoveRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineReplicaRemoveRequest) ProtoMessage() {}
+
+func (x *EngineReplicaRemoveRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineReplicaRemoveRequest.ProtoReflect.Descriptor instead.
+func (*EngineReplicaRemoveRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{31}
+}
+
+func (x *EngineReplicaRemoveRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineReplicaRemoveRequest) GetReplicaAddress() string {
+	if x != nil {
+		return x.ReplicaAddress
+	}
+	return ""
+}
+
+func (x *EngineReplicaRemoveRequest) GetReplicaName() string {
+	if x != nil {
+		return x.ReplicaName
+	}
+	return ""
+}
+
+type EngineReplicaModeUpdateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest   `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	ReplicaAddress     string                `protobuf:"bytes,2,opt,name=replica_address,json=replicaAddress,proto3" json:"replica_address,omitempty"`
+	Mode               enginerpc.ReplicaMode `protobuf:"varint,3,opt,name=mode,proto3,enum=ptypes.ReplicaMode" json:"mode,omitempty"`
+}
+
+func (x *EngineReplicaModeUpdateRequest) Reset() {
+	*x = EngineReplicaModeUpdateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[32]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineReplicaModeUpdateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineReplicaModeUpdateRequest) ProtoMessage() {}
+
+func (x *EngineReplicaModeUpdateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineReplicaModeUpdateRequest.ProtoReflect.Descriptor instead.
+func (*EngineReplicaModeUpdateRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{32}
+}
+
+func (x *EngineReplicaModeUpdateRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineReplicaModeUpdateRequest) GetReplicaAddress() string {
+	if x != nil {
+		return x.ReplicaAddress
+	}
+	return ""
+}
+
+func (x *EngineReplicaModeUpdateRequest) GetMode() enginerpc.ReplicaMode {
+	if x != nil {
+		return x.Mode
+	}
+	return enginerpc.ReplicaMode(0)
+}
+
+type EngineSnapshotHashRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	SnapshotName       string              `protobuf:"bytes,2,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+	Rehash             bool                `protobuf:"varint,3,opt,name=rehash,proto3" json:"rehash,omitempty"`
+}
+
+func (x *EngineSnapshotHashRequest) Reset() {
+	*x = EngineSnapshotHashRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[33]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotHashRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotHashRequest) ProtoMessage() {}
+
+func (x *EngineSnapshotHashRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[33]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotHashRequest.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotHashRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{33}
+}
+
+func (x *EngineSnapshotHashRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineSnapshotHashRequest) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+func (x *EngineSnapshotHashRequest) GetRehash() bool {
+	if x != nil {
+		return x.Rehash
+	}
+	return false
+}
+
+type EngineSnapshotHashStatusRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ProxyEngineRequest *ProxyEngineRequest `protobuf:"bytes,1,opt,name=proxy_engine_request,json=proxyEngineRequest,proto3" json:"proxy_engine_request,omitempty"`
+	SnapshotName       string              `protobuf:"bytes,2,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+}
+
+func (x *EngineSnapshotHashStatusRequest) Reset() {
+	*x = EngineSnapshotHashStatusRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[34]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotHashStatusRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotHashStatusRequest) ProtoMessage() {}
+
+func (x *EngineSnapshotHashStatusRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[34]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotHashStatusRequest.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotHashStatusRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{34}
+}
+
+func (x *EngineSnapshotHashStatusRequest) GetProxyEngineRequest() *ProxyEngineRequest {
+	if x != nil {
+		return x.ProxyEngineRequest
+	}
+	return nil
+}
+
+func (x *EngineSnapshotHashStatusRequest) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+type EngineSnapshotHashStatusProxyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Status map[string]*enginerpc.SnapshotHashStatusResponse `protobuf:"bytes,1,rep,name=status,proto3" json:"status,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *EngineSnapshotHashStatusProxyResponse) Reset() {
+	*x = EngineSnapshotHashStatusProxyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[35]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineSnapshotHashStatusProxyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineSnapshotHashStatusProxyResponse) ProtoMessage() {}
+
+func (x *EngineSnapshotHashStatusProxyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[35]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineSnapshotHashStatusProxyResponse.ProtoReflect.Descriptor instead.
+func (*EngineSnapshotHashStatusProxyResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{35}
+}
+
+func (x *EngineSnapshotHashStatusProxyResponse) GetStatus() map[string]*enginerpc.SnapshotHashStatusResponse {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+type EngineMetricsGetProxyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Metrics *enginerpc.Metrics `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
+}
+
+func (x *EngineMetricsGetProxyResponse) Reset() {
+	*x = EngineMetricsGetProxyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[36]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineMetricsGetProxyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineMetricsGetProxyResponse) ProtoMessage() {}
+
+func (x *EngineMetricsGetProxyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[36]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineMetricsGetProxyResponse.ProtoReflect.Descriptor instead.
+func (*EngineMetricsGetProxyResponse) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{36}
+}
+
+func (x *EngineMetricsGetProxyResponse) GetMetrics() *enginerpc.Metrics {
+	if x != nil {
+		return x.Metrics
+	}
+	return nil
+}
+
+type RemountVolumeRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	VolumeName string `protobuf:"bytes,1,opt,name=volume_name,json=volumeName,proto3" json:"volume_name,omitempty"`
+}
+
+func (x *RemountVolumeRequest) Reset() {
+	*x = RemountVolumeRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_imrpc_proxy_proto_msgTypes[37]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RemountVolumeRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RemountVolumeRequest) ProtoMessage() {}
+
+func (x *RemountVolumeRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_imrpc_proxy_proto_msgTypes[37]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RemountVolumeRequest.ProtoReflect.Descriptor instead.
+func (*RemountVolumeRequest) Descriptor() ([]byte, []int) {
+	return file_imrpc_proxy_proto_rawDescGZIP(), []int{37}
+}
+
+func (x *RemountVolumeRequest) GetVolumeName() string {
+	if x != nil {
+		return x.VolumeName
+	}
+	return ""
+}
+
+var File_imrpc_proxy_proto protoreflect.FileDescriptor
+
+var file_imrpc_proxy_proto_rawDesc = []byte{
+	0x0a, 0x11, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x12, 0x05, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74,
+	0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f,
+	0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x1a, 0x16, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x61, 0x67, 0x65,
+	0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2f,
+	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf5, 0x01, 0x0a,
+	0x12, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4f, 0x0a,
+	0x14, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x64,
+	0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6d,
+	0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x65,
+	0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x42, 0x02, 0x18, 0x01, 0x52, 0x12, 0x62, 0x61, 0x63, 0x6b,
+	0x65, 0x6e, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x1f,
+	0x0a, 0x0b, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12,
+	0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65,
+	0x12, 0x32, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x61,
+	0x74, 0x61, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x22, 0x4d, 0x0a, 0x1a, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56, 0x65,
+	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73,
+	0x69, 0x6f, 0x6e, 0x22, 0x46, 0x0a, 0x1c, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56, 0x6f, 0x6c,
+	0x75, 0x6d, 0x65, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c,
+	0x75, 0x6d, 0x65, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x9d, 0x01, 0x0a, 0x19,
+	0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x61,
+	0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f,
+	0x78, 0x79, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e,
+	0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x52, 0x06, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x22, 0xba, 0x01, 0x0a, 0x20,
+	0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x46, 0x72, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
+	0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69,
+	0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79,
+	0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a,
+	0x0e, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56,
+	0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61,
+	0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x66, 0x72, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x22, 0xb2, 0x01, 0x0a, 0x1b, 0x45, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78,
+	0x79, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50,
+	0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d,
+	0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0e, 0x73,
+	0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x5c, 0x0a,
+	0x21, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f,
+	0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x70, 0x6c,
+	0x79, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0xd9, 0x01, 0x0a, 0x2f,
+	0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x55, 0x6e, 0x6d, 0x61,
+	0x70, 0x4d, 0x61, 0x72, 0x6b, 0x53, 0x6e, 0x61, 0x70, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65,
+	0x6d, 0x6f, 0x76, 0x65, 0x64, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f,
+	0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
+	0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x45,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x0f,
+	0x75, 0x6e, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56,
+	0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x55, 0x6e, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x53, 0x6e,
+	0x61, 0x70, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x53, 0x65,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x75, 0x6e, 0x6d, 0x61, 0x70, 0x4d,
+	0x61, 0x72, 0x6b, 0x53, 0x6e, 0x61, 0x70, 0x22, 0xb5, 0x01, 0x0a, 0x26, 0x45, 0x6e, 0x67, 0x69,
+	0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
+	0x4d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65, 0x6e, 0x67, 0x69,
+	0x6e, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x70, 0x72, 0x6f,
+	0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x3e, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28,
+	0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x65,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22,
+	0xb1, 0x01, 0x0a, 0x25, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65,
+	0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x53,
+	0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f,
+	0x78, 0x79, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e,
+	0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x6f,
+	0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x53,
+	0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x73,
+	0x69, 0x7a, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x1f, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x64, 0x69, 0x73, 0x6b, 0x73,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4c, 0x69, 0x73,
+	0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44,
+	0x69, 0x73, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x64, 0x69, 0x73, 0x6b, 0x73,
+	0x1a, 0x57, 0x0a, 0x0a, 0x44, 0x69, 0x73, 0x6b, 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, 0x33, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1d, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb3, 0x03, 0x0a, 0x16, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x44, 0x69, 0x73, 0x6b,
+	0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65,
+	0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74,
+	0x12, 0x47, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e,
+	0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66,
+	0x6f, 0x2e, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
+	0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d,
+	0x6f, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f,
+	0x76, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+	0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x73, 0x69, 0x7a, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x49,
+	0x6e, 0x66, 0x6f, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
+	0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x43, 0x68, 0x69, 0x6c, 0x64,
+	0x72, 0x65, 0x6e, 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, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 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,
+	0x7e, 0x0a, 0x1b, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b,
+	0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x72,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69,
+	0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22,
+	0x98, 0x01, 0x0a, 0x1a, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68,
+	0x6f, 0x74, 0x50, 0x75, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b,
+	0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x72,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69,
+	0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x73,
+	0x6b, 0x69, 0x70, 0x5f, 0x69, 0x66, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65,
+	0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x66,
+	0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0xdb, 0x01, 0x0a, 0x26, 0x45,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x75, 0x72,
+	0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x75, 0x72, 0x67,
+	0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x5e, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74,
+	0x75, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65,
+	0x73, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x75, 0x72, 0x67, 0x65, 0x53,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x96, 0x03, 0x0a, 0x1a, 0x45, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78, 0x79,
+	0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72,
+	0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x52, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x11, 0x66, 0x72, 0x6f, 0x6d, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x41, 0x64, 0x64,
+	0x72, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
+	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x65, 0x78, 0x70,
+	0x6f, 0x72, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6d, 0x61, 0x67,
+	0x65, 0x5f, 0x69, 0x66, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x19, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49,
+	0x6d, 0x61, 0x67, 0x65, 0x49, 0x66, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x1d, 0x66,
+	0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6c,
+	0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x05, 0x52, 0x19, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x48, 0x74, 0x74, 0x70,
+	0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x28, 0x0a,
+	0x10, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x72, 0x6f, 0x6d, 0x45, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x72, 0x6f, 0x6d, 0x5f,
+	0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0e, 0x66, 0x72, 0x6f, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d,
+	0x65, 0x22, 0xdb, 0x01, 0x0a, 0x26, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70,
+	0x73, 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50,
+	0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x06,
+	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69,
+	0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73,
+	0x68, 0x6f, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72,
+	0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a,
+	0x5e, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x23, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22,
+	0x80, 0x01, 0x0a, 0x1b, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68,
+	0x6f, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f,
+	0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
+	0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x45,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05,
+	0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d,
+	0x65, 0x73, 0x22, 0xd8, 0x04, 0x0a, 0x1b, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65, 0x6e, 0x67, 0x69,
+	0x6e, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x70, 0x72, 0x6f,
+	0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x12, 0x0a, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x65,
+	0x6e, 0x76, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70,
+	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
+	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x63,
+	0x6b, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2c,
+	0x0a, 0x12, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f,
+	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x62, 0x61, 0x63, 0x6b,
+	0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16,
+	0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x68,
+	0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x61,
+	0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73,
+	0x75, 0x6d, 0x12, 0x46, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e,
+	0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74,
+	0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x6f,
+	0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64,
+	0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73,
+	0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e,
+	0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20,
+	0x01, 0x28, 0x05, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4c,
+	0x69, 0x6d, 0x69, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f,
+	0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x10, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61,
+	0x6d, 0x65, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 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, 0x81, 0x01,
+	0x0a, 0x21, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
+	0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x64,
+	0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x73,
+	0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61,
+	0x6c, 0x22, 0xdd, 0x01, 0x0a, 0x21, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70,
+	0x73, 0x68, 0x6f, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78, 0x79,
+	0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72,
+	0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x52, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75,
+	0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e,
+	0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21,
+	0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4e, 0x61, 0x6d,
+	0x65, 0x22, 0xde, 0x01, 0x0a, 0x27, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70,
+	0x73, 0x68, 0x6f, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a,
+	0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05,
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72,
+	0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x23,
+	0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e,
+	0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65,
+	0x73, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x1a, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x63,
+	0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e,
+	0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x78,
+	0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12,
+	0x0a, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x65, 0x6e,
+	0x76, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x03, 0x75, 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b,
+	0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a,
+	0x10, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69,
+	0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72,
+	0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x40, 0x0a, 0x20, 0x45, 0x6e, 0x67, 0x69,
+	0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x50,
+	0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09,
+	0x74, 0x61, 0x73, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52,
+	0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xd8, 0x01, 0x0a, 0x26, 0x45,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f,
+	0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72,
+	0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x5b, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74,
+	0x75, 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, 0x69, 0x6d, 0x72, 0x70, 0x63,
+	0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73,
+	0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa0, 0x02, 0x0a, 0x19, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72,
+	0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x52, 0x65, 0x73,
+	0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72,
+	0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c,
+	0x61, 0x73, 0x74, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x63,
+	0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,
+	0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x63,
+	0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x42,
+	0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73,
+	0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73,
+	0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e,
+	0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x63,
+	0x6b, 0x75, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62,
+	0x61, 0x63, 0x6b, 0x75, 0x70, 0x55, 0x72, 0x6c, 0x22, 0x6f, 0x0a, 0x20, 0x45, 0x6e, 0x67, 0x69,
+	0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46,
+	0x69, 0x6e, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x14,
+	0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72,
+	0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69,
+	0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe2, 0x02, 0x0a, 0x17, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78,
+	0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12,
+	0x70, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x61, 0x64,
+	0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72,
+	0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65,
+	0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x72,
+	0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09,
+	0x66, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52,
+	0x08, 0x66, 0x61, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x40, 0x0a, 0x1d, 0x66, 0x69, 0x6c,
+	0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6c, 0x69, 0x65,
+	0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05,
+	0x52, 0x19, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6c,
+	0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x72,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5d,
+	0x0a, 0x1e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4c,
+	0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x3b, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6c, 0x69, 0x73, 0x74,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79,
+	0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x22, 0xbc, 0x01,
+	0x0a, 0x21, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x56,
+	0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x70, 0x72,
+	0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x61, 0x64, 0x64, 0x72,
+	0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xde, 0x01, 0x0a,
+	0x27, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65,
+	0x62, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63,
+	0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65,
+	0x62, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45,
+	0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x5f, 0x0a, 0x0b,
+	0x53, 0x74, 0x61, 0x74, 0x75, 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, 0x3a, 0x0a,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb5, 0x01,
+	0x0a, 0x1a, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52,
+	0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x14,
+	0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72,
+	0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69,
+	0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65,
+	0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xbf, 0x01, 0x0a, 0x1e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78,
+	0x79, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50,
+	0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e,
+	0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x27,
+	0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x70,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4d, 0x6f, 0x64,
+	0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xa5, 0x01, 0x0a, 0x19, 0x45, 0x6e, 0x67, 0x69,
+	0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78,
+	0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12,
+	0x70, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73,
+	0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x68, 0x61, 0x73,
+	0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x68, 0x61, 0x73, 0x68, 0x22,
+	0x93, 0x01, 0x0a, 0x1f, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68,
+	0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x65, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x12, 0x70, 0x72,
+	0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xd8, 0x01, 0x0a, 0x25, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x50, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x38, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x1a, 0x5d, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x22, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73,
+	0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01,
+	0x22, 0x4a, 0x0a, 0x1d, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,
+	0x73, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x29, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x72,
+	0x69, 0x63, 0x73, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x37, 0x0a, 0x14,
+	0x52, 0x65, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d,
+	0x65, 0x4e, 0x61, 0x6d, 0x65, 0x32, 0x85, 0x16, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x10,
+	0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74,
+	0x12, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d,
+	0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
+	0x6e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b,
+	0x0a, 0x09, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d,
+	0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x65, 0x74, 0x50, 0x72,
+	0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0c, 0x56,
+	0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x12, 0x20, 0x2e, 0x69, 0x6d,
+	0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65,
+	0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x56, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x46,
+	0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x27, 0x2e, 0x69,
+	0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d,
+	0x65, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4b, 0x0a,
+	0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x53,
+	0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e,
+	0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x74, 0x0a, 0x22, 0x56, 0x6f,
+	0x6c, 0x75, 0x6d, 0x65, 0x55, 0x6e, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x53, 0x6e, 0x61,
+	0x70, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x53, 0x65, 0x74,
+	0x12, 0x36, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56,
+	0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x55, 0x6e, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x53, 0x6e,
+	0x61, 0x70, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x53, 0x65,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
+	0x12, 0x62, 0x0a, 0x19, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68,
+	0x6f, 0x74, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x12, 0x2d, 0x2e,
+	0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75,
+	0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x75,
+	0x6e, 0x74, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
+	0x6d, 0x70, 0x74, 0x79, 0x12, 0x60, 0x0a, 0x18, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74,
+	0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56,
+	0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x61, 0x78,
+	0x53, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x5e, 0x0a, 0x0e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65,
+	0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63,
+	0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69,
+	0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d,
+	0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68,
+	0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50,
+	0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x78,
+	0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0e, 0x53, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d,
+	0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68,
+	0x6f, 0x74, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4a, 0x0a, 0x0d, 0x53, 0x6e, 0x61, 0x70, 0x73,
+	0x68, 0x6f, 0x74, 0x50, 0x75, 0x72, 0x67, 0x65, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63,
+	0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50,
+	0x75, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
+	0x70, 0x74, 0x79, 0x12, 0x5f, 0x0a, 0x13, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50,
+	0x75, 0x72, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x72,
+	0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x75, 0x72, 0x67,
+	0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0d, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
+	0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x6f, 0x6e,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
+	0x12, 0x5f, 0x0a, 0x13, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x6f, 0x6e,
+	0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e,
+	0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e,
+	0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x4c, 0x0a, 0x0e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6d,
+	0x6f, 0x76, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69,
+	0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12,
+	0x48, 0x0a, 0x0c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12,
+	0x20, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x6a, 0x0a, 0x12, 0x53, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x26, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e,
+	0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61,
+	0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e,
+	0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x42, 0x61,
+	0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d,
+	0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68,
+	0x6f, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x14, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x2e,
+	0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70,
+	0x73, 0x68, 0x6f, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e,
+	0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x42, 0x61,
+	0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x0d, 0x42, 0x61, 0x63, 0x6b, 0x75,
+	0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63,
+	0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73,
+	0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d,
+	0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70,
+	0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65,
+	0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x69, 0x6d,
+	0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f,
+	0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52,
+	0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x12, 0x27, 0x2e, 0x69,
+	0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75,
+	0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4a, 0x0a,
+	0x18, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4d, 0x6f,
+	0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x44, 0x0a, 0x0a, 0x52, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e,
+	0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12,
+	0x4f, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19,
+	0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69,
+	0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x72, 0x70,
+	0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4c,
+	0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x64, 0x0a, 0x17, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69,
+	0x6c, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x69, 0x6d,
+	0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75,
+	0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x14, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x28,
+	0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
+	0x12, 0x4a, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x6d, 0x6f, 0x76,
+	0x65, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x52, 0x0a, 0x11,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
+	0x12, 0x4d, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x47, 0x65, 0x74, 0x12, 0x19,
+	0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x6e, 0x67, 0x69,
+	0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x72, 0x70,
+	0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x47,
+	0x65, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x4c, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e,
+	0x6c, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x72, 0x70, 0x63,
+	0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x2f, 0x5a,
+	0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6f, 0x6e, 0x67,
+	0x68, 0x6f, 0x72, 0x6e, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67,
+	0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2f, 0x69, 0x6d, 0x72, 0x70, 0x63, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_imrpc_proxy_proto_rawDescOnce sync.Once
+	file_imrpc_proxy_proto_rawDescData = file_imrpc_proxy_proto_rawDesc
+)
+
+func file_imrpc_proxy_proto_rawDescGZIP() []byte {
+	file_imrpc_proxy_proto_rawDescOnce.Do(func() {
+		file_imrpc_proxy_proto_rawDescData = protoimpl.X.CompressGZIP(file_imrpc_proxy_proto_rawDescData)
+	})
+	return file_imrpc_proxy_proto_rawDescData
+}
+
+var file_imrpc_proxy_proto_msgTypes = make([]protoimpl.MessageInfo, 47)
+var file_imrpc_proxy_proto_goTypes = []interface{}{
+	(*ProxyEngineRequest)(nil),                                  // 0: imrpc.ProxyEngineRequest
+	(*EngineVersionProxyResponse)(nil),                          // 1: imrpc.EngineVersionProxyResponse
+	(*EngineVolumeGetProxyResponse)(nil),                        // 2: imrpc.EngineVolumeGetProxyResponse
+	(*EngineVolumeExpandRequest)(nil),                           // 3: imrpc.EngineVolumeExpandRequest
+	(*EngineVolumeFrontendStartRequest)(nil),                    // 4: imrpc.EngineVolumeFrontendStartRequest
+	(*EngineVolumeSnapshotRequest)(nil),                         // 5: imrpc.EngineVolumeSnapshotRequest
+	(*EngineVolumeSnapshotProxyResponse)(nil),                   // 6: imrpc.EngineVolumeSnapshotProxyResponse
+	(*EngineVolumeUnmapMarkSnapChainRemovedSetRequest)(nil),     // 7: imrpc.EngineVolumeUnmapMarkSnapChainRemovedSetRequest
+	(*EngineVolumeSnapshotMaxCountSetRequest)(nil),              // 8: imrpc.EngineVolumeSnapshotMaxCountSetRequest
+	(*EngineVolumeSnapshotMaxSizeSetRequest)(nil),               // 9: imrpc.EngineVolumeSnapshotMaxSizeSetRequest
+	(*EngineSnapshotListProxyResponse)(nil),                     // 10: imrpc.EngineSnapshotListProxyResponse
+	(*EngineSnapshotDiskInfo)(nil),                              // 11: imrpc.EngineSnapshotDiskInfo
+	(*EngineSnapshotRevertRequest)(nil),                         // 12: imrpc.EngineSnapshotRevertRequest
+	(*EngineSnapshotPurgeRequest)(nil),                          // 13: imrpc.EngineSnapshotPurgeRequest
+	(*EngineSnapshotPurgeStatusProxyResponse)(nil),              // 14: imrpc.EngineSnapshotPurgeStatusProxyResponse
+	(*EngineSnapshotCloneRequest)(nil),                          // 15: imrpc.EngineSnapshotCloneRequest
+	(*EngineSnapshotCloneStatusProxyResponse)(nil),              // 16: imrpc.EngineSnapshotCloneStatusProxyResponse
+	(*EngineSnapshotRemoveRequest)(nil),                         // 17: imrpc.EngineSnapshotRemoveRequest
+	(*EngineSnapshotBackupRequest)(nil),                         // 18: imrpc.EngineSnapshotBackupRequest
+	(*EngineSnapshotBackupProxyResponse)(nil),                   // 19: imrpc.EngineSnapshotBackupProxyResponse
+	(*EngineSnapshotBackupStatusRequest)(nil),                   // 20: imrpc.EngineSnapshotBackupStatusRequest
+	(*EngineSnapshotBackupStatusProxyResponse)(nil),             // 21: imrpc.EngineSnapshotBackupStatusProxyResponse
+	(*EngineBackupRestoreRequest)(nil),                          // 22: imrpc.EngineBackupRestoreRequest
+	(*EngineBackupRestoreProxyResponse)(nil),                    // 23: imrpc.EngineBackupRestoreProxyResponse
+	(*EngineBackupRestoreStatusProxyResponse)(nil),              // 24: imrpc.EngineBackupRestoreStatusProxyResponse
+	(*EngineBackupRestoreStatus)(nil),                           // 25: imrpc.EngineBackupRestoreStatus
+	(*EngineBackupRestoreFinishRequest)(nil),                    // 26: imrpc.EngineBackupRestoreFinishRequest
+	(*EngineReplicaAddRequest)(nil),                             // 27: imrpc.EngineReplicaAddRequest
+	(*EngineReplicaListProxyResponse)(nil),                      // 28: imrpc.EngineReplicaListProxyResponse
+	(*EngineReplicaVerifyRebuildRequest)(nil),                   // 29: imrpc.EngineReplicaVerifyRebuildRequest
+	(*EngineReplicaRebuildStatusProxyResponse)(nil),             // 30: imrpc.EngineReplicaRebuildStatusProxyResponse
+	(*EngineReplicaRemoveRequest)(nil),                          // 31: imrpc.EngineReplicaRemoveRequest
+	(*EngineReplicaModeUpdateRequest)(nil),                      // 32: imrpc.EngineReplicaModeUpdateRequest
+	(*EngineSnapshotHashRequest)(nil),                           // 33: imrpc.EngineSnapshotHashRequest
+	(*EngineSnapshotHashStatusRequest)(nil),                     // 34: imrpc.EngineSnapshotHashStatusRequest
+	(*EngineSnapshotHashStatusProxyResponse)(nil),               // 35: imrpc.EngineSnapshotHashStatusProxyResponse
+	(*EngineMetricsGetProxyResponse)(nil),                       // 36: imrpc.EngineMetricsGetProxyResponse
+	(*RemountVolumeRequest)(nil),                                // 37: imrpc.RemountVolumeRequest
+	nil,                                                         // 38: imrpc.EngineSnapshotListProxyResponse.DisksEntry
+	nil,                                                         // 39: imrpc.EngineSnapshotDiskInfo.ChildrenEntry
+	nil,                                                         // 40: imrpc.EngineSnapshotDiskInfo.LabelsEntry
+	nil,                                                         // 41: imrpc.EngineSnapshotPurgeStatusProxyResponse.StatusEntry
+	nil,                                                         // 42: imrpc.EngineSnapshotCloneStatusProxyResponse.StatusEntry
+	nil,                                                         // 43: imrpc.EngineSnapshotBackupRequest.LabelsEntry
+	nil,                                                         // 44: imrpc.EngineBackupRestoreStatusProxyResponse.StatusEntry
+	nil,                                                         // 45: imrpc.EngineReplicaRebuildStatusProxyResponse.StatusEntry
+	nil,                                                         // 46: imrpc.EngineSnapshotHashStatusProxyResponse.StatusEntry
+	(BackendStoreDriver)(0),                                     // 47: imrpc.BackendStoreDriver
+	(DataEngine)(0),                                             // 48: imrpc.DataEngine
+	(*enginerpc.VersionOutput)(nil),                             // 49: ptypes.VersionOutput
+	(*enginerpc.Volume)(nil),                                    // 50: ptypes.Volume
+	(*enginerpc.VolumeExpandRequest)(nil),                       // 51: ptypes.VolumeExpandRequest
+	(*enginerpc.VolumeFrontendStartRequest)(nil),                // 52: ptypes.VolumeFrontendStartRequest
+	(*enginerpc.VolumeSnapshotRequest)(nil),                     // 53: ptypes.VolumeSnapshotRequest
+	(*enginerpc.VolumeSnapshotReply)(nil),                       // 54: ptypes.VolumeSnapshotReply
+	(*enginerpc.VolumeUnmapMarkSnapChainRemovedSetRequest)(nil), // 55: ptypes.VolumeUnmapMarkSnapChainRemovedSetRequest
+	(*enginerpc.VolumeSnapshotMaxCountSetRequest)(nil),          // 56: ptypes.VolumeSnapshotMaxCountSetRequest
+	(*enginerpc.VolumeSnapshotMaxSizeSetRequest)(nil),           // 57: ptypes.VolumeSnapshotMaxSizeSetRequest
+	(*enginerpc.ReplicaListReply)(nil),                          // 58: ptypes.ReplicaListReply
+	(enginerpc.ReplicaMode)(0),                                  // 59: ptypes.ReplicaMode
+	(*enginerpc.Metrics)(nil),                                   // 60: ptypes.Metrics
+	(*enginerpc.SnapshotPurgeStatusResponse)(nil),               // 61: ptypes.SnapshotPurgeStatusResponse
+	(*enginerpc.SnapshotCloneStatusResponse)(nil),               // 62: ptypes.SnapshotCloneStatusResponse
+	(*enginerpc.ReplicaRebuildStatusResponse)(nil),              // 63: ptypes.ReplicaRebuildStatusResponse
+	(*enginerpc.SnapshotHashStatusResponse)(nil),                // 64: ptypes.SnapshotHashStatusResponse
+	(*emptypb.Empty)(nil),                                       // 65: google.protobuf.Empty
+}
+var file_imrpc_proxy_proto_depIdxs = []int32{
+	47, // 0: imrpc.ProxyEngineRequest.backend_store_driver:type_name -> imrpc.BackendStoreDriver
+	48, // 1: imrpc.ProxyEngineRequest.data_engine:type_name -> imrpc.DataEngine
+	49, // 2: imrpc.EngineVersionProxyResponse.version:type_name -> ptypes.VersionOutput
+	50, // 3: imrpc.EngineVolumeGetProxyResponse.volume:type_name -> ptypes.Volume
+	0,  // 4: imrpc.EngineVolumeExpandRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	51, // 5: imrpc.EngineVolumeExpandRequest.expand:type_name -> ptypes.VolumeExpandRequest
+	0,  // 6: imrpc.EngineVolumeFrontendStartRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	52, // 7: imrpc.EngineVolumeFrontendStartRequest.frontend_start:type_name -> ptypes.VolumeFrontendStartRequest
+	0,  // 8: imrpc.EngineVolumeSnapshotRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	53, // 9: imrpc.EngineVolumeSnapshotRequest.snapshot_volume:type_name -> ptypes.VolumeSnapshotRequest
+	54, // 10: imrpc.EngineVolumeSnapshotProxyResponse.snapshot:type_name -> ptypes.VolumeSnapshotReply
+	0,  // 11: imrpc.EngineVolumeUnmapMarkSnapChainRemovedSetRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	55, // 12: imrpc.EngineVolumeUnmapMarkSnapChainRemovedSetRequest.unmap_mark_snap:type_name -> ptypes.VolumeUnmapMarkSnapChainRemovedSetRequest
+	0,  // 13: imrpc.EngineVolumeSnapshotMaxCountSetRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	56, // 14: imrpc.EngineVolumeSnapshotMaxCountSetRequest.count:type_name -> ptypes.VolumeSnapshotMaxCountSetRequest
+	0,  // 15: imrpc.EngineVolumeSnapshotMaxSizeSetRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	57, // 16: imrpc.EngineVolumeSnapshotMaxSizeSetRequest.size:type_name -> ptypes.VolumeSnapshotMaxSizeSetRequest
+	38, // 17: imrpc.EngineSnapshotListProxyResponse.disks:type_name -> imrpc.EngineSnapshotListProxyResponse.DisksEntry
+	39, // 18: imrpc.EngineSnapshotDiskInfo.children:type_name -> imrpc.EngineSnapshotDiskInfo.ChildrenEntry
+	40, // 19: imrpc.EngineSnapshotDiskInfo.labels:type_name -> imrpc.EngineSnapshotDiskInfo.LabelsEntry
+	0,  // 20: imrpc.EngineSnapshotRevertRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	0,  // 21: imrpc.EngineSnapshotPurgeRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	41, // 22: imrpc.EngineSnapshotPurgeStatusProxyResponse.status:type_name -> imrpc.EngineSnapshotPurgeStatusProxyResponse.StatusEntry
+	0,  // 23: imrpc.EngineSnapshotCloneRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	42, // 24: imrpc.EngineSnapshotCloneStatusProxyResponse.status:type_name -> imrpc.EngineSnapshotCloneStatusProxyResponse.StatusEntry
+	0,  // 25: imrpc.EngineSnapshotRemoveRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	0,  // 26: imrpc.EngineSnapshotBackupRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	43, // 27: imrpc.EngineSnapshotBackupRequest.labels:type_name -> imrpc.EngineSnapshotBackupRequest.LabelsEntry
+	0,  // 28: imrpc.EngineSnapshotBackupStatusRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	0,  // 29: imrpc.EngineBackupRestoreRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	44, // 30: imrpc.EngineBackupRestoreStatusProxyResponse.status:type_name -> imrpc.EngineBackupRestoreStatusProxyResponse.StatusEntry
+	0,  // 31: imrpc.EngineBackupRestoreFinishRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	0,  // 32: imrpc.EngineReplicaAddRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	58, // 33: imrpc.EngineReplicaListProxyResponse.replica_list:type_name -> ptypes.ReplicaListReply
+	0,  // 34: imrpc.EngineReplicaVerifyRebuildRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	45, // 35: imrpc.EngineReplicaRebuildStatusProxyResponse.status:type_name -> imrpc.EngineReplicaRebuildStatusProxyResponse.StatusEntry
+	0,  // 36: imrpc.EngineReplicaRemoveRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	0,  // 37: imrpc.EngineReplicaModeUpdateRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	59, // 38: imrpc.EngineReplicaModeUpdateRequest.mode:type_name -> ptypes.ReplicaMode
+	0,  // 39: imrpc.EngineSnapshotHashRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	0,  // 40: imrpc.EngineSnapshotHashStatusRequest.proxy_engine_request:type_name -> imrpc.ProxyEngineRequest
+	46, // 41: imrpc.EngineSnapshotHashStatusProxyResponse.status:type_name -> imrpc.EngineSnapshotHashStatusProxyResponse.StatusEntry
+	60, // 42: imrpc.EngineMetricsGetProxyResponse.metrics:type_name -> ptypes.Metrics
+	11, // 43: imrpc.EngineSnapshotListProxyResponse.DisksEntry.value:type_name -> imrpc.EngineSnapshotDiskInfo
+	61, // 44: imrpc.EngineSnapshotPurgeStatusProxyResponse.StatusEntry.value:type_name -> ptypes.SnapshotPurgeStatusResponse
+	62, // 45: imrpc.EngineSnapshotCloneStatusProxyResponse.StatusEntry.value:type_name -> ptypes.SnapshotCloneStatusResponse
+	25, // 46: imrpc.EngineBackupRestoreStatusProxyResponse.StatusEntry.value:type_name -> imrpc.EngineBackupRestoreStatus
+	63, // 47: imrpc.EngineReplicaRebuildStatusProxyResponse.StatusEntry.value:type_name -> ptypes.ReplicaRebuildStatusResponse
+	64, // 48: imrpc.EngineSnapshotHashStatusProxyResponse.StatusEntry.value:type_name -> ptypes.SnapshotHashStatusResponse
+	0,  // 49: imrpc.ProxyEngineService.ServerVersionGet:input_type -> imrpc.ProxyEngineRequest
+	0,  // 50: imrpc.ProxyEngineService.VolumeGet:input_type -> imrpc.ProxyEngineRequest
+	3,  // 51: imrpc.ProxyEngineService.VolumeExpand:input_type -> imrpc.EngineVolumeExpandRequest
+	4,  // 52: imrpc.ProxyEngineService.VolumeFrontendStart:input_type -> imrpc.EngineVolumeFrontendStartRequest
+	0,  // 53: imrpc.ProxyEngineService.VolumeFrontendShutdown:input_type -> imrpc.ProxyEngineRequest
+	7,  // 54: imrpc.ProxyEngineService.VolumeUnmapMarkSnapChainRemovedSet:input_type -> imrpc.EngineVolumeUnmapMarkSnapChainRemovedSetRequest
+	8,  // 55: imrpc.ProxyEngineService.VolumeSnapshotMaxCountSet:input_type -> imrpc.EngineVolumeSnapshotMaxCountSetRequest
+	9,  // 56: imrpc.ProxyEngineService.VolumeSnapshotMaxSizeSet:input_type -> imrpc.EngineVolumeSnapshotMaxSizeSetRequest
+	5,  // 57: imrpc.ProxyEngineService.VolumeSnapshot:input_type -> imrpc.EngineVolumeSnapshotRequest
+	0,  // 58: imrpc.ProxyEngineService.SnapshotList:input_type -> imrpc.ProxyEngineRequest
+	12, // 59: imrpc.ProxyEngineService.SnapshotRevert:input_type -> imrpc.EngineSnapshotRevertRequest
+	13, // 60: imrpc.ProxyEngineService.SnapshotPurge:input_type -> imrpc.EngineSnapshotPurgeRequest
+	0,  // 61: imrpc.ProxyEngineService.SnapshotPurgeStatus:input_type -> imrpc.ProxyEngineRequest
+	15, // 62: imrpc.ProxyEngineService.SnapshotClone:input_type -> imrpc.EngineSnapshotCloneRequest
+	0,  // 63: imrpc.ProxyEngineService.SnapshotCloneStatus:input_type -> imrpc.ProxyEngineRequest
+	17, // 64: imrpc.ProxyEngineService.SnapshotRemove:input_type -> imrpc.EngineSnapshotRemoveRequest
+	33, // 65: imrpc.ProxyEngineService.SnapshotHash:input_type -> imrpc.EngineSnapshotHashRequest
+	34, // 66: imrpc.ProxyEngineService.SnapshotHashStatus:input_type -> imrpc.EngineSnapshotHashStatusRequest
+	18, // 67: imrpc.ProxyEngineService.SnapshotBackup:input_type -> imrpc.EngineSnapshotBackupRequest
+	20, // 68: imrpc.ProxyEngineService.SnapshotBackupStatus:input_type -> imrpc.EngineSnapshotBackupStatusRequest
+	22, // 69: imrpc.ProxyEngineService.BackupRestore:input_type -> imrpc.EngineBackupRestoreRequest
+	0,  // 70: imrpc.ProxyEngineService.BackupRestoreStatus:input_type -> imrpc.ProxyEngineRequest
+	26, // 71: imrpc.ProxyEngineService.BackupRestoreFinish:input_type -> imrpc.EngineBackupRestoreFinishRequest
+	65, // 72: imrpc.ProxyEngineService.CleanupBackupMountPoints:input_type -> google.protobuf.Empty
+	27, // 73: imrpc.ProxyEngineService.ReplicaAdd:input_type -> imrpc.EngineReplicaAddRequest
+	0,  // 74: imrpc.ProxyEngineService.ReplicaList:input_type -> imrpc.ProxyEngineRequest
+	0,  // 75: imrpc.ProxyEngineService.ReplicaRebuildingStatus:input_type -> imrpc.ProxyEngineRequest
+	29, // 76: imrpc.ProxyEngineService.ReplicaVerifyRebuild:input_type -> imrpc.EngineReplicaVerifyRebuildRequest
+	31, // 77: imrpc.ProxyEngineService.ReplicaRemove:input_type -> imrpc.EngineReplicaRemoveRequest
+	32, // 78: imrpc.ProxyEngineService.ReplicaModeUpdate:input_type -> imrpc.EngineReplicaModeUpdateRequest
+	0,  // 79: imrpc.ProxyEngineService.MetricsGet:input_type -> imrpc.ProxyEngineRequest
+	37, // 80: imrpc.ProxyEngineService.RemountReadOnlyVolume:input_type -> imrpc.RemountVolumeRequest
+	1,  // 81: imrpc.ProxyEngineService.ServerVersionGet:output_type -> imrpc.EngineVersionProxyResponse
+	2,  // 82: imrpc.ProxyEngineService.VolumeGet:output_type -> imrpc.EngineVolumeGetProxyResponse
+	65, // 83: imrpc.ProxyEngineService.VolumeExpand:output_type -> google.protobuf.Empty
+	65, // 84: imrpc.ProxyEngineService.VolumeFrontendStart:output_type -> google.protobuf.Empty
+	65, // 85: imrpc.ProxyEngineService.VolumeFrontendShutdown:output_type -> google.protobuf.Empty
+	65, // 86: imrpc.ProxyEngineService.VolumeUnmapMarkSnapChainRemovedSet:output_type -> google.protobuf.Empty
+	65, // 87: imrpc.ProxyEngineService.VolumeSnapshotMaxCountSet:output_type -> google.protobuf.Empty
+	65, // 88: imrpc.ProxyEngineService.VolumeSnapshotMaxSizeSet:output_type -> google.protobuf.Empty
+	6,  // 89: imrpc.ProxyEngineService.VolumeSnapshot:output_type -> imrpc.EngineVolumeSnapshotProxyResponse
+	10, // 90: imrpc.ProxyEngineService.SnapshotList:output_type -> imrpc.EngineSnapshotListProxyResponse
+	65, // 91: imrpc.ProxyEngineService.SnapshotRevert:output_type -> google.protobuf.Empty
+	65, // 92: imrpc.ProxyEngineService.SnapshotPurge:output_type -> google.protobuf.Empty
+	14, // 93: imrpc.ProxyEngineService.SnapshotPurgeStatus:output_type -> imrpc.EngineSnapshotPurgeStatusProxyResponse
+	65, // 94: imrpc.ProxyEngineService.SnapshotClone:output_type -> google.protobuf.Empty
+	16, // 95: imrpc.ProxyEngineService.SnapshotCloneStatus:output_type -> imrpc.EngineSnapshotCloneStatusProxyResponse
+	65, // 96: imrpc.ProxyEngineService.SnapshotRemove:output_type -> google.protobuf.Empty
+	65, // 97: imrpc.ProxyEngineService.SnapshotHash:output_type -> google.protobuf.Empty
+	35, // 98: imrpc.ProxyEngineService.SnapshotHashStatus:output_type -> imrpc.EngineSnapshotHashStatusProxyResponse
+	19, // 99: imrpc.ProxyEngineService.SnapshotBackup:output_type -> imrpc.EngineSnapshotBackupProxyResponse
+	21, // 100: imrpc.ProxyEngineService.SnapshotBackupStatus:output_type -> imrpc.EngineSnapshotBackupStatusProxyResponse
+	23, // 101: imrpc.ProxyEngineService.BackupRestore:output_type -> imrpc.EngineBackupRestoreProxyResponse
+	24, // 102: imrpc.ProxyEngineService.BackupRestoreStatus:output_type -> imrpc.EngineBackupRestoreStatusProxyResponse
+	65, // 103: imrpc.ProxyEngineService.BackupRestoreFinish:output_type -> google.protobuf.Empty
+	65, // 104: imrpc.ProxyEngineService.CleanupBackupMountPoints:output_type -> google.protobuf.Empty
+	65, // 105: imrpc.ProxyEngineService.ReplicaAdd:output_type -> google.protobuf.Empty
+	28, // 106: imrpc.ProxyEngineService.ReplicaList:output_type -> imrpc.EngineReplicaListProxyResponse
+	30, // 107: imrpc.ProxyEngineService.ReplicaRebuildingStatus:output_type -> imrpc.EngineReplicaRebuildStatusProxyResponse
+	65, // 108: imrpc.ProxyEngineService.ReplicaVerifyRebuild:output_type -> google.protobuf.Empty
+	65, // 109: imrpc.ProxyEngineService.ReplicaRemove:output_type -> google.protobuf.Empty
+	65, // 110: imrpc.ProxyEngineService.ReplicaModeUpdate:output_type -> google.protobuf.Empty
+	36, // 111: imrpc.ProxyEngineService.MetricsGet:output_type -> imrpc.EngineMetricsGetProxyResponse
+	65, // 112: imrpc.ProxyEngineService.RemountReadOnlyVolume:output_type -> google.protobuf.Empty
+	81, // [81:113] is the sub-list for method output_type
+	49, // [49:81] is the sub-list for method input_type
+	49, // [49:49] is the sub-list for extension type_name
+	49, // [49:49] is the sub-list for extension extendee
+	0,  // [0:49] is the sub-list for field type_name
+}
+
+func init() { file_imrpc_proxy_proto_init() }
+func file_imrpc_proxy_proto_init() {
+	if File_imrpc_proxy_proto != nil {
+		return
+	}
+	file_imrpc_common_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_imrpc_proxy_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ProxyEngineRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineVersionProxyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineVolumeGetProxyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineVolumeExpandRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineVolumeFrontendStartRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineVolumeSnapshotRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineVolumeSnapshotProxyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineVolumeUnmapMarkSnapChainRemovedSetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineVolumeSnapshotMaxCountSetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineVolumeSnapshotMaxSizeSetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotListProxyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotDiskInfo); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotRevertRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotPurgeRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotPurgeStatusProxyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotCloneRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotCloneStatusProxyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotRemoveRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotBackupRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotBackupProxyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotBackupStatusRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotBackupStatusProxyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineBackupRestoreRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineBackupRestoreProxyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineBackupRestoreStatusProxyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineBackupRestoreStatus); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineBackupRestoreFinishRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineReplicaAddRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineReplicaListProxyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineReplicaVerifyRebuildRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineReplicaRebuildStatusProxyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineReplicaRemoveRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineReplicaModeUpdateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotHashRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotHashStatusRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineSnapshotHashStatusProxyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineMetricsGetProxyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_imrpc_proxy_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RemountVolumeRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_imrpc_proxy_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   47,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_imrpc_proxy_proto_goTypes,
+		DependencyIndexes: file_imrpc_proxy_proto_depIdxs,
+		MessageInfos:      file_imrpc_proxy_proto_msgTypes,
+	}.Build()
+	File_imrpc_proxy_proto = out.File
+	file_imrpc_proxy_proto_rawDesc = nil
+	file_imrpc_proxy_proto_goTypes = nil
+	file_imrpc_proxy_proto_depIdxs = nil
+}
diff --git a/pkg/generated/imrpc/proxy_grpc.pb.go b/pkg/generated/imrpc/proxy_grpc.pb.go
new file mode 100644
index 0000000..810d359
--- /dev/null
+++ b/pkg/generated/imrpc/proxy_grpc.pb.go
@@ -0,0 +1,1257 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v4.24.3
+// source: imrpc/proxy.proto
+
+package imrpc
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+	ProxyEngineService_ServerVersionGet_FullMethodName                   = "/imrpc.ProxyEngineService/ServerVersionGet"
+	ProxyEngineService_VolumeGet_FullMethodName                          = "/imrpc.ProxyEngineService/VolumeGet"
+	ProxyEngineService_VolumeExpand_FullMethodName                       = "/imrpc.ProxyEngineService/VolumeExpand"
+	ProxyEngineService_VolumeFrontendStart_FullMethodName                = "/imrpc.ProxyEngineService/VolumeFrontendStart"
+	ProxyEngineService_VolumeFrontendShutdown_FullMethodName             = "/imrpc.ProxyEngineService/VolumeFrontendShutdown"
+	ProxyEngineService_VolumeUnmapMarkSnapChainRemovedSet_FullMethodName = "/imrpc.ProxyEngineService/VolumeUnmapMarkSnapChainRemovedSet"
+	ProxyEngineService_VolumeSnapshotMaxCountSet_FullMethodName          = "/imrpc.ProxyEngineService/VolumeSnapshotMaxCountSet"
+	ProxyEngineService_VolumeSnapshotMaxSizeSet_FullMethodName           = "/imrpc.ProxyEngineService/VolumeSnapshotMaxSizeSet"
+	ProxyEngineService_VolumeSnapshot_FullMethodName                     = "/imrpc.ProxyEngineService/VolumeSnapshot"
+	ProxyEngineService_SnapshotList_FullMethodName                       = "/imrpc.ProxyEngineService/SnapshotList"
+	ProxyEngineService_SnapshotRevert_FullMethodName                     = "/imrpc.ProxyEngineService/SnapshotRevert"
+	ProxyEngineService_SnapshotPurge_FullMethodName                      = "/imrpc.ProxyEngineService/SnapshotPurge"
+	ProxyEngineService_SnapshotPurgeStatus_FullMethodName                = "/imrpc.ProxyEngineService/SnapshotPurgeStatus"
+	ProxyEngineService_SnapshotClone_FullMethodName                      = "/imrpc.ProxyEngineService/SnapshotClone"
+	ProxyEngineService_SnapshotCloneStatus_FullMethodName                = "/imrpc.ProxyEngineService/SnapshotCloneStatus"
+	ProxyEngineService_SnapshotRemove_FullMethodName                     = "/imrpc.ProxyEngineService/SnapshotRemove"
+	ProxyEngineService_SnapshotHash_FullMethodName                       = "/imrpc.ProxyEngineService/SnapshotHash"
+	ProxyEngineService_SnapshotHashStatus_FullMethodName                 = "/imrpc.ProxyEngineService/SnapshotHashStatus"
+	ProxyEngineService_SnapshotBackup_FullMethodName                     = "/imrpc.ProxyEngineService/SnapshotBackup"
+	ProxyEngineService_SnapshotBackupStatus_FullMethodName               = "/imrpc.ProxyEngineService/SnapshotBackupStatus"
+	ProxyEngineService_BackupRestore_FullMethodName                      = "/imrpc.ProxyEngineService/BackupRestore"
+	ProxyEngineService_BackupRestoreStatus_FullMethodName                = "/imrpc.ProxyEngineService/BackupRestoreStatus"
+	ProxyEngineService_BackupRestoreFinish_FullMethodName                = "/imrpc.ProxyEngineService/BackupRestoreFinish"
+	ProxyEngineService_CleanupBackupMountPoints_FullMethodName           = "/imrpc.ProxyEngineService/CleanupBackupMountPoints"
+	ProxyEngineService_ReplicaAdd_FullMethodName                         = "/imrpc.ProxyEngineService/ReplicaAdd"
+	ProxyEngineService_ReplicaList_FullMethodName                        = "/imrpc.ProxyEngineService/ReplicaList"
+	ProxyEngineService_ReplicaRebuildingStatus_FullMethodName            = "/imrpc.ProxyEngineService/ReplicaRebuildingStatus"
+	ProxyEngineService_ReplicaVerifyRebuild_FullMethodName               = "/imrpc.ProxyEngineService/ReplicaVerifyRebuild"
+	ProxyEngineService_ReplicaRemove_FullMethodName                      = "/imrpc.ProxyEngineService/ReplicaRemove"
+	ProxyEngineService_ReplicaModeUpdate_FullMethodName                  = "/imrpc.ProxyEngineService/ReplicaModeUpdate"
+	ProxyEngineService_MetricsGet_FullMethodName                         = "/imrpc.ProxyEngineService/MetricsGet"
+	ProxyEngineService_RemountReadOnlyVolume_FullMethodName              = "/imrpc.ProxyEngineService/RemountReadOnlyVolume"
+)
+
+// ProxyEngineServiceClient is the client API for ProxyEngineService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type ProxyEngineServiceClient interface {
+	ServerVersionGet(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineVersionProxyResponse, error)
+	VolumeGet(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineVolumeGetProxyResponse, error)
+	VolumeExpand(ctx context.Context, in *EngineVolumeExpandRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	VolumeFrontendStart(ctx context.Context, in *EngineVolumeFrontendStartRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	VolumeFrontendShutdown(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	VolumeUnmapMarkSnapChainRemovedSet(ctx context.Context, in *EngineVolumeUnmapMarkSnapChainRemovedSetRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	VolumeSnapshotMaxCountSet(ctx context.Context, in *EngineVolumeSnapshotMaxCountSetRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	VolumeSnapshotMaxSizeSet(ctx context.Context, in *EngineVolumeSnapshotMaxSizeSetRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	VolumeSnapshot(ctx context.Context, in *EngineVolumeSnapshotRequest, opts ...grpc.CallOption) (*EngineVolumeSnapshotProxyResponse, error)
+	SnapshotList(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineSnapshotListProxyResponse, error)
+	SnapshotRevert(ctx context.Context, in *EngineSnapshotRevertRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	SnapshotPurge(ctx context.Context, in *EngineSnapshotPurgeRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	SnapshotPurgeStatus(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineSnapshotPurgeStatusProxyResponse, error)
+	SnapshotClone(ctx context.Context, in *EngineSnapshotCloneRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	SnapshotCloneStatus(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineSnapshotCloneStatusProxyResponse, error)
+	SnapshotRemove(ctx context.Context, in *EngineSnapshotRemoveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	SnapshotHash(ctx context.Context, in *EngineSnapshotHashRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	SnapshotHashStatus(ctx context.Context, in *EngineSnapshotHashStatusRequest, opts ...grpc.CallOption) (*EngineSnapshotHashStatusProxyResponse, error)
+	SnapshotBackup(ctx context.Context, in *EngineSnapshotBackupRequest, opts ...grpc.CallOption) (*EngineSnapshotBackupProxyResponse, error)
+	SnapshotBackupStatus(ctx context.Context, in *EngineSnapshotBackupStatusRequest, opts ...grpc.CallOption) (*EngineSnapshotBackupStatusProxyResponse, error)
+	BackupRestore(ctx context.Context, in *EngineBackupRestoreRequest, opts ...grpc.CallOption) (*EngineBackupRestoreProxyResponse, error)
+	BackupRestoreStatus(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineBackupRestoreStatusProxyResponse, error)
+	BackupRestoreFinish(ctx context.Context, in *EngineBackupRestoreFinishRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	CleanupBackupMountPoints(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaAdd(ctx context.Context, in *EngineReplicaAddRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaList(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineReplicaListProxyResponse, error)
+	ReplicaRebuildingStatus(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineReplicaRebuildStatusProxyResponse, error)
+	ReplicaVerifyRebuild(ctx context.Context, in *EngineReplicaVerifyRebuildRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaRemove(ctx context.Context, in *EngineReplicaRemoveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaModeUpdate(ctx context.Context, in *EngineReplicaModeUpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	MetricsGet(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineMetricsGetProxyResponse, error)
+	RemountReadOnlyVolume(ctx context.Context, in *RemountVolumeRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+}
+
+type proxyEngineServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewProxyEngineServiceClient(cc grpc.ClientConnInterface) ProxyEngineServiceClient {
+	return &proxyEngineServiceClient{cc}
+}
+
+func (c *proxyEngineServiceClient) ServerVersionGet(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineVersionProxyResponse, error) {
+	out := new(EngineVersionProxyResponse)
+	err := c.cc.Invoke(ctx, ProxyEngineService_ServerVersionGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) VolumeGet(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineVolumeGetProxyResponse, error) {
+	out := new(EngineVolumeGetProxyResponse)
+	err := c.cc.Invoke(ctx, ProxyEngineService_VolumeGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) VolumeExpand(ctx context.Context, in *EngineVolumeExpandRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_VolumeExpand_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) VolumeFrontendStart(ctx context.Context, in *EngineVolumeFrontendStartRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_VolumeFrontendStart_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) VolumeFrontendShutdown(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_VolumeFrontendShutdown_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) VolumeUnmapMarkSnapChainRemovedSet(ctx context.Context, in *EngineVolumeUnmapMarkSnapChainRemovedSetRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_VolumeUnmapMarkSnapChainRemovedSet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) VolumeSnapshotMaxCountSet(ctx context.Context, in *EngineVolumeSnapshotMaxCountSetRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_VolumeSnapshotMaxCountSet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) VolumeSnapshotMaxSizeSet(ctx context.Context, in *EngineVolumeSnapshotMaxSizeSetRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_VolumeSnapshotMaxSizeSet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) VolumeSnapshot(ctx context.Context, in *EngineVolumeSnapshotRequest, opts ...grpc.CallOption) (*EngineVolumeSnapshotProxyResponse, error) {
+	out := new(EngineVolumeSnapshotProxyResponse)
+	err := c.cc.Invoke(ctx, ProxyEngineService_VolumeSnapshot_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) SnapshotList(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineSnapshotListProxyResponse, error) {
+	out := new(EngineSnapshotListProxyResponse)
+	err := c.cc.Invoke(ctx, ProxyEngineService_SnapshotList_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) SnapshotRevert(ctx context.Context, in *EngineSnapshotRevertRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_SnapshotRevert_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) SnapshotPurge(ctx context.Context, in *EngineSnapshotPurgeRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_SnapshotPurge_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) SnapshotPurgeStatus(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineSnapshotPurgeStatusProxyResponse, error) {
+	out := new(EngineSnapshotPurgeStatusProxyResponse)
+	err := c.cc.Invoke(ctx, ProxyEngineService_SnapshotPurgeStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) SnapshotClone(ctx context.Context, in *EngineSnapshotCloneRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_SnapshotClone_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) SnapshotCloneStatus(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineSnapshotCloneStatusProxyResponse, error) {
+	out := new(EngineSnapshotCloneStatusProxyResponse)
+	err := c.cc.Invoke(ctx, ProxyEngineService_SnapshotCloneStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) SnapshotRemove(ctx context.Context, in *EngineSnapshotRemoveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_SnapshotRemove_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) SnapshotHash(ctx context.Context, in *EngineSnapshotHashRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_SnapshotHash_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) SnapshotHashStatus(ctx context.Context, in *EngineSnapshotHashStatusRequest, opts ...grpc.CallOption) (*EngineSnapshotHashStatusProxyResponse, error) {
+	out := new(EngineSnapshotHashStatusProxyResponse)
+	err := c.cc.Invoke(ctx, ProxyEngineService_SnapshotHashStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) SnapshotBackup(ctx context.Context, in *EngineSnapshotBackupRequest, opts ...grpc.CallOption) (*EngineSnapshotBackupProxyResponse, error) {
+	out := new(EngineSnapshotBackupProxyResponse)
+	err := c.cc.Invoke(ctx, ProxyEngineService_SnapshotBackup_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) SnapshotBackupStatus(ctx context.Context, in *EngineSnapshotBackupStatusRequest, opts ...grpc.CallOption) (*EngineSnapshotBackupStatusProxyResponse, error) {
+	out := new(EngineSnapshotBackupStatusProxyResponse)
+	err := c.cc.Invoke(ctx, ProxyEngineService_SnapshotBackupStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) BackupRestore(ctx context.Context, in *EngineBackupRestoreRequest, opts ...grpc.CallOption) (*EngineBackupRestoreProxyResponse, error) {
+	out := new(EngineBackupRestoreProxyResponse)
+	err := c.cc.Invoke(ctx, ProxyEngineService_BackupRestore_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) BackupRestoreStatus(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineBackupRestoreStatusProxyResponse, error) {
+	out := new(EngineBackupRestoreStatusProxyResponse)
+	err := c.cc.Invoke(ctx, ProxyEngineService_BackupRestoreStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) BackupRestoreFinish(ctx context.Context, in *EngineBackupRestoreFinishRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_BackupRestoreFinish_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) CleanupBackupMountPoints(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_CleanupBackupMountPoints_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) ReplicaAdd(ctx context.Context, in *EngineReplicaAddRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_ReplicaAdd_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) ReplicaList(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineReplicaListProxyResponse, error) {
+	out := new(EngineReplicaListProxyResponse)
+	err := c.cc.Invoke(ctx, ProxyEngineService_ReplicaList_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) ReplicaRebuildingStatus(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineReplicaRebuildStatusProxyResponse, error) {
+	out := new(EngineReplicaRebuildStatusProxyResponse)
+	err := c.cc.Invoke(ctx, ProxyEngineService_ReplicaRebuildingStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) ReplicaVerifyRebuild(ctx context.Context, in *EngineReplicaVerifyRebuildRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_ReplicaVerifyRebuild_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) ReplicaRemove(ctx context.Context, in *EngineReplicaRemoveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_ReplicaRemove_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) ReplicaModeUpdate(ctx context.Context, in *EngineReplicaModeUpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_ReplicaModeUpdate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) MetricsGet(ctx context.Context, in *ProxyEngineRequest, opts ...grpc.CallOption) (*EngineMetricsGetProxyResponse, error) {
+	out := new(EngineMetricsGetProxyResponse)
+	err := c.cc.Invoke(ctx, ProxyEngineService_MetricsGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *proxyEngineServiceClient) RemountReadOnlyVolume(ctx context.Context, in *RemountVolumeRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ProxyEngineService_RemountReadOnlyVolume_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ProxyEngineServiceServer is the server API for ProxyEngineService service.
+// All implementations must embed UnimplementedProxyEngineServiceServer
+// for forward compatibility
+type ProxyEngineServiceServer interface {
+	ServerVersionGet(context.Context, *ProxyEngineRequest) (*EngineVersionProxyResponse, error)
+	VolumeGet(context.Context, *ProxyEngineRequest) (*EngineVolumeGetProxyResponse, error)
+	VolumeExpand(context.Context, *EngineVolumeExpandRequest) (*emptypb.Empty, error)
+	VolumeFrontendStart(context.Context, *EngineVolumeFrontendStartRequest) (*emptypb.Empty, error)
+	VolumeFrontendShutdown(context.Context, *ProxyEngineRequest) (*emptypb.Empty, error)
+	VolumeUnmapMarkSnapChainRemovedSet(context.Context, *EngineVolumeUnmapMarkSnapChainRemovedSetRequest) (*emptypb.Empty, error)
+	VolumeSnapshotMaxCountSet(context.Context, *EngineVolumeSnapshotMaxCountSetRequest) (*emptypb.Empty, error)
+	VolumeSnapshotMaxSizeSet(context.Context, *EngineVolumeSnapshotMaxSizeSetRequest) (*emptypb.Empty, error)
+	VolumeSnapshot(context.Context, *EngineVolumeSnapshotRequest) (*EngineVolumeSnapshotProxyResponse, error)
+	SnapshotList(context.Context, *ProxyEngineRequest) (*EngineSnapshotListProxyResponse, error)
+	SnapshotRevert(context.Context, *EngineSnapshotRevertRequest) (*emptypb.Empty, error)
+	SnapshotPurge(context.Context, *EngineSnapshotPurgeRequest) (*emptypb.Empty, error)
+	SnapshotPurgeStatus(context.Context, *ProxyEngineRequest) (*EngineSnapshotPurgeStatusProxyResponse, error)
+	SnapshotClone(context.Context, *EngineSnapshotCloneRequest) (*emptypb.Empty, error)
+	SnapshotCloneStatus(context.Context, *ProxyEngineRequest) (*EngineSnapshotCloneStatusProxyResponse, error)
+	SnapshotRemove(context.Context, *EngineSnapshotRemoveRequest) (*emptypb.Empty, error)
+	SnapshotHash(context.Context, *EngineSnapshotHashRequest) (*emptypb.Empty, error)
+	SnapshotHashStatus(context.Context, *EngineSnapshotHashStatusRequest) (*EngineSnapshotHashStatusProxyResponse, error)
+	SnapshotBackup(context.Context, *EngineSnapshotBackupRequest) (*EngineSnapshotBackupProxyResponse, error)
+	SnapshotBackupStatus(context.Context, *EngineSnapshotBackupStatusRequest) (*EngineSnapshotBackupStatusProxyResponse, error)
+	BackupRestore(context.Context, *EngineBackupRestoreRequest) (*EngineBackupRestoreProxyResponse, error)
+	BackupRestoreStatus(context.Context, *ProxyEngineRequest) (*EngineBackupRestoreStatusProxyResponse, error)
+	BackupRestoreFinish(context.Context, *EngineBackupRestoreFinishRequest) (*emptypb.Empty, error)
+	CleanupBackupMountPoints(context.Context, *emptypb.Empty) (*emptypb.Empty, error)
+	ReplicaAdd(context.Context, *EngineReplicaAddRequest) (*emptypb.Empty, error)
+	ReplicaList(context.Context, *ProxyEngineRequest) (*EngineReplicaListProxyResponse, error)
+	ReplicaRebuildingStatus(context.Context, *ProxyEngineRequest) (*EngineReplicaRebuildStatusProxyResponse, error)
+	ReplicaVerifyRebuild(context.Context, *EngineReplicaVerifyRebuildRequest) (*emptypb.Empty, error)
+	ReplicaRemove(context.Context, *EngineReplicaRemoveRequest) (*emptypb.Empty, error)
+	ReplicaModeUpdate(context.Context, *EngineReplicaModeUpdateRequest) (*emptypb.Empty, error)
+	MetricsGet(context.Context, *ProxyEngineRequest) (*EngineMetricsGetProxyResponse, error)
+	RemountReadOnlyVolume(context.Context, *RemountVolumeRequest) (*emptypb.Empty, error)
+	mustEmbedUnimplementedProxyEngineServiceServer()
+}
+
+// UnimplementedProxyEngineServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedProxyEngineServiceServer struct {
+}
+
+func (UnimplementedProxyEngineServiceServer) ServerVersionGet(context.Context, *ProxyEngineRequest) (*EngineVersionProxyResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ServerVersionGet not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) VolumeGet(context.Context, *ProxyEngineRequest) (*EngineVolumeGetProxyResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeGet not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) VolumeExpand(context.Context, *EngineVolumeExpandRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeExpand not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) VolumeFrontendStart(context.Context, *EngineVolumeFrontendStartRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeFrontendStart not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) VolumeFrontendShutdown(context.Context, *ProxyEngineRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeFrontendShutdown not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) VolumeUnmapMarkSnapChainRemovedSet(context.Context, *EngineVolumeUnmapMarkSnapChainRemovedSetRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeUnmapMarkSnapChainRemovedSet not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) VolumeSnapshotMaxCountSet(context.Context, *EngineVolumeSnapshotMaxCountSetRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeSnapshotMaxCountSet not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) VolumeSnapshotMaxSizeSet(context.Context, *EngineVolumeSnapshotMaxSizeSetRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeSnapshotMaxSizeSet not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) VolumeSnapshot(context.Context, *EngineVolumeSnapshotRequest) (*EngineVolumeSnapshotProxyResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VolumeSnapshot not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) SnapshotList(context.Context, *ProxyEngineRequest) (*EngineSnapshotListProxyResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotList not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) SnapshotRevert(context.Context, *EngineSnapshotRevertRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotRevert not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) SnapshotPurge(context.Context, *EngineSnapshotPurgeRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotPurge not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) SnapshotPurgeStatus(context.Context, *ProxyEngineRequest) (*EngineSnapshotPurgeStatusProxyResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotPurgeStatus not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) SnapshotClone(context.Context, *EngineSnapshotCloneRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotClone not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) SnapshotCloneStatus(context.Context, *ProxyEngineRequest) (*EngineSnapshotCloneStatusProxyResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotCloneStatus not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) SnapshotRemove(context.Context, *EngineSnapshotRemoveRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotRemove not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) SnapshotHash(context.Context, *EngineSnapshotHashRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotHash not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) SnapshotHashStatus(context.Context, *EngineSnapshotHashStatusRequest) (*EngineSnapshotHashStatusProxyResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotHashStatus not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) SnapshotBackup(context.Context, *EngineSnapshotBackupRequest) (*EngineSnapshotBackupProxyResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotBackup not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) SnapshotBackupStatus(context.Context, *EngineSnapshotBackupStatusRequest) (*EngineSnapshotBackupStatusProxyResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SnapshotBackupStatus not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) BackupRestore(context.Context, *EngineBackupRestoreRequest) (*EngineBackupRestoreProxyResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method BackupRestore not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) BackupRestoreStatus(context.Context, *ProxyEngineRequest) (*EngineBackupRestoreStatusProxyResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method BackupRestoreStatus not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) BackupRestoreFinish(context.Context, *EngineBackupRestoreFinishRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method BackupRestoreFinish not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) CleanupBackupMountPoints(context.Context, *emptypb.Empty) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CleanupBackupMountPoints not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) ReplicaAdd(context.Context, *EngineReplicaAddRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaAdd not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) ReplicaList(context.Context, *ProxyEngineRequest) (*EngineReplicaListProxyResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaList not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) ReplicaRebuildingStatus(context.Context, *ProxyEngineRequest) (*EngineReplicaRebuildStatusProxyResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaRebuildingStatus not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) ReplicaVerifyRebuild(context.Context, *EngineReplicaVerifyRebuildRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaVerifyRebuild not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) ReplicaRemove(context.Context, *EngineReplicaRemoveRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaRemove not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) ReplicaModeUpdate(context.Context, *EngineReplicaModeUpdateRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaModeUpdate not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) MetricsGet(context.Context, *ProxyEngineRequest) (*EngineMetricsGetProxyResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MetricsGet not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) RemountReadOnlyVolume(context.Context, *RemountVolumeRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method RemountReadOnlyVolume not implemented")
+}
+func (UnimplementedProxyEngineServiceServer) mustEmbedUnimplementedProxyEngineServiceServer() {}
+
+// UnsafeProxyEngineServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to ProxyEngineServiceServer will
+// result in compilation errors.
+type UnsafeProxyEngineServiceServer interface {
+	mustEmbedUnimplementedProxyEngineServiceServer()
+}
+
+func RegisterProxyEngineServiceServer(s grpc.ServiceRegistrar, srv ProxyEngineServiceServer) {
+	s.RegisterService(&ProxyEngineService_ServiceDesc, srv)
+}
+
+func _ProxyEngineService_ServerVersionGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProxyEngineRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).ServerVersionGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_ServerVersionGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).ServerVersionGet(ctx, req.(*ProxyEngineRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_VolumeGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProxyEngineRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).VolumeGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_VolumeGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).VolumeGet(ctx, req.(*ProxyEngineRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_VolumeExpand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineVolumeExpandRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).VolumeExpand(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_VolumeExpand_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).VolumeExpand(ctx, req.(*EngineVolumeExpandRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_VolumeFrontendStart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineVolumeFrontendStartRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).VolumeFrontendStart(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_VolumeFrontendStart_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).VolumeFrontendStart(ctx, req.(*EngineVolumeFrontendStartRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_VolumeFrontendShutdown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProxyEngineRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).VolumeFrontendShutdown(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_VolumeFrontendShutdown_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).VolumeFrontendShutdown(ctx, req.(*ProxyEngineRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_VolumeUnmapMarkSnapChainRemovedSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineVolumeUnmapMarkSnapChainRemovedSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).VolumeUnmapMarkSnapChainRemovedSet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_VolumeUnmapMarkSnapChainRemovedSet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).VolumeUnmapMarkSnapChainRemovedSet(ctx, req.(*EngineVolumeUnmapMarkSnapChainRemovedSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_VolumeSnapshotMaxCountSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineVolumeSnapshotMaxCountSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).VolumeSnapshotMaxCountSet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_VolumeSnapshotMaxCountSet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).VolumeSnapshotMaxCountSet(ctx, req.(*EngineVolumeSnapshotMaxCountSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_VolumeSnapshotMaxSizeSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineVolumeSnapshotMaxSizeSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).VolumeSnapshotMaxSizeSet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_VolumeSnapshotMaxSizeSet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).VolumeSnapshotMaxSizeSet(ctx, req.(*EngineVolumeSnapshotMaxSizeSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_VolumeSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineVolumeSnapshotRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).VolumeSnapshot(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_VolumeSnapshot_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).VolumeSnapshot(ctx, req.(*EngineVolumeSnapshotRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_SnapshotList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProxyEngineRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).SnapshotList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_SnapshotList_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).SnapshotList(ctx, req.(*ProxyEngineRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_SnapshotRevert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineSnapshotRevertRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).SnapshotRevert(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_SnapshotRevert_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).SnapshotRevert(ctx, req.(*EngineSnapshotRevertRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_SnapshotPurge_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineSnapshotPurgeRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).SnapshotPurge(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_SnapshotPurge_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).SnapshotPurge(ctx, req.(*EngineSnapshotPurgeRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_SnapshotPurgeStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProxyEngineRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).SnapshotPurgeStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_SnapshotPurgeStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).SnapshotPurgeStatus(ctx, req.(*ProxyEngineRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_SnapshotClone_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineSnapshotCloneRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).SnapshotClone(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_SnapshotClone_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).SnapshotClone(ctx, req.(*EngineSnapshotCloneRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_SnapshotCloneStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProxyEngineRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).SnapshotCloneStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_SnapshotCloneStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).SnapshotCloneStatus(ctx, req.(*ProxyEngineRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_SnapshotRemove_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineSnapshotRemoveRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).SnapshotRemove(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_SnapshotRemove_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).SnapshotRemove(ctx, req.(*EngineSnapshotRemoveRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_SnapshotHash_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineSnapshotHashRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).SnapshotHash(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_SnapshotHash_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).SnapshotHash(ctx, req.(*EngineSnapshotHashRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_SnapshotHashStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineSnapshotHashStatusRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).SnapshotHashStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_SnapshotHashStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).SnapshotHashStatus(ctx, req.(*EngineSnapshotHashStatusRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_SnapshotBackup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineSnapshotBackupRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).SnapshotBackup(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_SnapshotBackup_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).SnapshotBackup(ctx, req.(*EngineSnapshotBackupRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_SnapshotBackupStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineSnapshotBackupStatusRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).SnapshotBackupStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_SnapshotBackupStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).SnapshotBackupStatus(ctx, req.(*EngineSnapshotBackupStatusRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_BackupRestore_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineBackupRestoreRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).BackupRestore(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_BackupRestore_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).BackupRestore(ctx, req.(*EngineBackupRestoreRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_BackupRestoreStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProxyEngineRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).BackupRestoreStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_BackupRestoreStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).BackupRestoreStatus(ctx, req.(*ProxyEngineRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_BackupRestoreFinish_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineBackupRestoreFinishRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).BackupRestoreFinish(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_BackupRestoreFinish_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).BackupRestoreFinish(ctx, req.(*EngineBackupRestoreFinishRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_CleanupBackupMountPoints_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).CleanupBackupMountPoints(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_CleanupBackupMountPoints_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).CleanupBackupMountPoints(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_ReplicaAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineReplicaAddRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).ReplicaAdd(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_ReplicaAdd_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).ReplicaAdd(ctx, req.(*EngineReplicaAddRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_ReplicaList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProxyEngineRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).ReplicaList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_ReplicaList_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).ReplicaList(ctx, req.(*ProxyEngineRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_ReplicaRebuildingStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProxyEngineRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).ReplicaRebuildingStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_ReplicaRebuildingStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).ReplicaRebuildingStatus(ctx, req.(*ProxyEngineRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_ReplicaVerifyRebuild_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineReplicaVerifyRebuildRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).ReplicaVerifyRebuild(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_ReplicaVerifyRebuild_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).ReplicaVerifyRebuild(ctx, req.(*EngineReplicaVerifyRebuildRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_ReplicaRemove_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineReplicaRemoveRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).ReplicaRemove(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_ReplicaRemove_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).ReplicaRemove(ctx, req.(*EngineReplicaRemoveRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_ReplicaModeUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineReplicaModeUpdateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).ReplicaModeUpdate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_ReplicaModeUpdate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).ReplicaModeUpdate(ctx, req.(*EngineReplicaModeUpdateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_MetricsGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ProxyEngineRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).MetricsGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_MetricsGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).MetricsGet(ctx, req.(*ProxyEngineRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ProxyEngineService_RemountReadOnlyVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(RemountVolumeRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProxyEngineServiceServer).RemountReadOnlyVolume(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ProxyEngineService_RemountReadOnlyVolume_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProxyEngineServiceServer).RemountReadOnlyVolume(ctx, req.(*RemountVolumeRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// ProxyEngineService_ServiceDesc is the grpc.ServiceDesc for ProxyEngineService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var ProxyEngineService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "imrpc.ProxyEngineService",
+	HandlerType: (*ProxyEngineServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ServerVersionGet",
+			Handler:    _ProxyEngineService_ServerVersionGet_Handler,
+		},
+		{
+			MethodName: "VolumeGet",
+			Handler:    _ProxyEngineService_VolumeGet_Handler,
+		},
+		{
+			MethodName: "VolumeExpand",
+			Handler:    _ProxyEngineService_VolumeExpand_Handler,
+		},
+		{
+			MethodName: "VolumeFrontendStart",
+			Handler:    _ProxyEngineService_VolumeFrontendStart_Handler,
+		},
+		{
+			MethodName: "VolumeFrontendShutdown",
+			Handler:    _ProxyEngineService_VolumeFrontendShutdown_Handler,
+		},
+		{
+			MethodName: "VolumeUnmapMarkSnapChainRemovedSet",
+			Handler:    _ProxyEngineService_VolumeUnmapMarkSnapChainRemovedSet_Handler,
+		},
+		{
+			MethodName: "VolumeSnapshotMaxCountSet",
+			Handler:    _ProxyEngineService_VolumeSnapshotMaxCountSet_Handler,
+		},
+		{
+			MethodName: "VolumeSnapshotMaxSizeSet",
+			Handler:    _ProxyEngineService_VolumeSnapshotMaxSizeSet_Handler,
+		},
+		{
+			MethodName: "VolumeSnapshot",
+			Handler:    _ProxyEngineService_VolumeSnapshot_Handler,
+		},
+		{
+			MethodName: "SnapshotList",
+			Handler:    _ProxyEngineService_SnapshotList_Handler,
+		},
+		{
+			MethodName: "SnapshotRevert",
+			Handler:    _ProxyEngineService_SnapshotRevert_Handler,
+		},
+		{
+			MethodName: "SnapshotPurge",
+			Handler:    _ProxyEngineService_SnapshotPurge_Handler,
+		},
+		{
+			MethodName: "SnapshotPurgeStatus",
+			Handler:    _ProxyEngineService_SnapshotPurgeStatus_Handler,
+		},
+		{
+			MethodName: "SnapshotClone",
+			Handler:    _ProxyEngineService_SnapshotClone_Handler,
+		},
+		{
+			MethodName: "SnapshotCloneStatus",
+			Handler:    _ProxyEngineService_SnapshotCloneStatus_Handler,
+		},
+		{
+			MethodName: "SnapshotRemove",
+			Handler:    _ProxyEngineService_SnapshotRemove_Handler,
+		},
+		{
+			MethodName: "SnapshotHash",
+			Handler:    _ProxyEngineService_SnapshotHash_Handler,
+		},
+		{
+			MethodName: "SnapshotHashStatus",
+			Handler:    _ProxyEngineService_SnapshotHashStatus_Handler,
+		},
+		{
+			MethodName: "SnapshotBackup",
+			Handler:    _ProxyEngineService_SnapshotBackup_Handler,
+		},
+		{
+			MethodName: "SnapshotBackupStatus",
+			Handler:    _ProxyEngineService_SnapshotBackupStatus_Handler,
+		},
+		{
+			MethodName: "BackupRestore",
+			Handler:    _ProxyEngineService_BackupRestore_Handler,
+		},
+		{
+			MethodName: "BackupRestoreStatus",
+			Handler:    _ProxyEngineService_BackupRestoreStatus_Handler,
+		},
+		{
+			MethodName: "BackupRestoreFinish",
+			Handler:    _ProxyEngineService_BackupRestoreFinish_Handler,
+		},
+		{
+			MethodName: "CleanupBackupMountPoints",
+			Handler:    _ProxyEngineService_CleanupBackupMountPoints_Handler,
+		},
+		{
+			MethodName: "ReplicaAdd",
+			Handler:    _ProxyEngineService_ReplicaAdd_Handler,
+		},
+		{
+			MethodName: "ReplicaList",
+			Handler:    _ProxyEngineService_ReplicaList_Handler,
+		},
+		{
+			MethodName: "ReplicaRebuildingStatus",
+			Handler:    _ProxyEngineService_ReplicaRebuildingStatus_Handler,
+		},
+		{
+			MethodName: "ReplicaVerifyRebuild",
+			Handler:    _ProxyEngineService_ReplicaVerifyRebuild_Handler,
+		},
+		{
+			MethodName: "ReplicaRemove",
+			Handler:    _ProxyEngineService_ReplicaRemove_Handler,
+		},
+		{
+			MethodName: "ReplicaModeUpdate",
+			Handler:    _ProxyEngineService_ReplicaModeUpdate_Handler,
+		},
+		{
+			MethodName: "MetricsGet",
+			Handler:    _ProxyEngineService_MetricsGet_Handler,
+		},
+		{
+			MethodName: "RemountReadOnlyVolume",
+			Handler:    _ProxyEngineService_RemountReadOnlyVolume_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "imrpc/proxy.proto",
+}
diff --git a/pkg/generated/smrpc/smrpc.pb.go b/pkg/generated/smrpc/smrpc.pb.go
new file mode 100644
index 0000000..8e67a17
--- /dev/null
+++ b/pkg/generated/smrpc/smrpc.pb.go
@@ -0,0 +1,169 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
+// source: smrpc/smrpc.proto
+
+package smrpc
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type FilesystemTrimRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	EncryptedDevice bool `protobuf:"varint,1,opt,name=encrypted_device,json=encryptedDevice,proto3" json:"encrypted_device,omitempty"`
+}
+
+func (x *FilesystemTrimRequest) Reset() {
+	*x = FilesystemTrimRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_smrpc_smrpc_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FilesystemTrimRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FilesystemTrimRequest) ProtoMessage() {}
+
+func (x *FilesystemTrimRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_smrpc_smrpc_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FilesystemTrimRequest.ProtoReflect.Descriptor instead.
+func (*FilesystemTrimRequest) Descriptor() ([]byte, []int) {
+	return file_smrpc_smrpc_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *FilesystemTrimRequest) GetEncryptedDevice() bool {
+	if x != nil {
+		return x.EncryptedDevice
+	}
+	return false
+}
+
+var File_smrpc_smrpc_proto protoreflect.FileDescriptor
+
+var file_smrpc_smrpc_proto_rawDesc = []byte{
+	0x0a, 0x11, 0x73, 0x6d, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x22, 0x42, 0x0a, 0x15, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x54, 0x72,
+	0x69, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x6e, 0x63,
+	0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x08, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x44, 0x65,
+	0x76, 0x69, 0x63, 0x65, 0x32, 0xd1, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4d, 0x61,
+	0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x42, 0x0a, 0x0e,
+	0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x54, 0x72, 0x69, 0x6d, 0x12, 0x16,
+	0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x54, 0x72, 0x69, 0x6d, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00,
+	0x12, 0x3b, 0x0a, 0x07, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
+	0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x39, 0x0a,
+	0x05, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68,
+	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x68, 0x6f, 0x72, 0x6e, 0x2f,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+	0x74, 0x65, 0x64, 0x2f, 0x73, 0x6d, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x33,
+}
+
+var (
+	file_smrpc_smrpc_proto_rawDescOnce sync.Once
+	file_smrpc_smrpc_proto_rawDescData = file_smrpc_smrpc_proto_rawDesc
+)
+
+func file_smrpc_smrpc_proto_rawDescGZIP() []byte {
+	file_smrpc_smrpc_proto_rawDescOnce.Do(func() {
+		file_smrpc_smrpc_proto_rawDescData = protoimpl.X.CompressGZIP(file_smrpc_smrpc_proto_rawDescData)
+	})
+	return file_smrpc_smrpc_proto_rawDescData
+}
+
+var file_smrpc_smrpc_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_smrpc_smrpc_proto_goTypes = []interface{}{
+	(*FilesystemTrimRequest)(nil), // 0: FilesystemTrimRequest
+	(*emptypb.Empty)(nil),         // 1: google.protobuf.Empty
+}
+var file_smrpc_smrpc_proto_depIdxs = []int32{
+	0, // 0: ShareManagerService.FilesystemTrim:input_type -> FilesystemTrimRequest
+	1, // 1: ShareManagerService.Unmount:input_type -> google.protobuf.Empty
+	1, // 2: ShareManagerService.Mount:input_type -> google.protobuf.Empty
+	1, // 3: ShareManagerService.FilesystemTrim:output_type -> google.protobuf.Empty
+	1, // 4: ShareManagerService.Unmount:output_type -> google.protobuf.Empty
+	1, // 5: ShareManagerService.Mount:output_type -> google.protobuf.Empty
+	3, // [3:6] is the sub-list for method output_type
+	0, // [0:3] 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
+}
+
+func init() { file_smrpc_smrpc_proto_init() }
+func file_smrpc_smrpc_proto_init() {
+	if File_smrpc_smrpc_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_smrpc_smrpc_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FilesystemTrimRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_smrpc_smrpc_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_smrpc_smrpc_proto_goTypes,
+		DependencyIndexes: file_smrpc_smrpc_proto_depIdxs,
+		MessageInfos:      file_smrpc_smrpc_proto_msgTypes,
+	}.Build()
+	File_smrpc_smrpc_proto = out.File
+	file_smrpc_smrpc_proto_rawDesc = nil
+	file_smrpc_smrpc_proto_goTypes = nil
+	file_smrpc_smrpc_proto_depIdxs = nil
+}
diff --git a/pkg/generated/smrpc/smrpc_grpc.pb.go b/pkg/generated/smrpc/smrpc_grpc.pb.go
new file mode 100644
index 0000000..26492c8
--- /dev/null
+++ b/pkg/generated/smrpc/smrpc_grpc.pb.go
@@ -0,0 +1,184 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v4.24.3
+// source: smrpc/smrpc.proto
+
+package smrpc
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+	ShareManagerService_FilesystemTrim_FullMethodName = "/ShareManagerService/FilesystemTrim"
+	ShareManagerService_Unmount_FullMethodName        = "/ShareManagerService/Unmount"
+	ShareManagerService_Mount_FullMethodName          = "/ShareManagerService/Mount"
+)
+
+// ShareManagerServiceClient is the client API for ShareManagerService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type ShareManagerServiceClient interface {
+	FilesystemTrim(ctx context.Context, in *FilesystemTrimRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	Unmount(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	Mount(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error)
+}
+
+type shareManagerServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewShareManagerServiceClient(cc grpc.ClientConnInterface) ShareManagerServiceClient {
+	return &shareManagerServiceClient{cc}
+}
+
+func (c *shareManagerServiceClient) FilesystemTrim(ctx context.Context, in *FilesystemTrimRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ShareManagerService_FilesystemTrim_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *shareManagerServiceClient) Unmount(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ShareManagerService_Unmount_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *shareManagerServiceClient) Mount(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, ShareManagerService_Mount_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ShareManagerServiceServer is the server API for ShareManagerService service.
+// All implementations must embed UnimplementedShareManagerServiceServer
+// for forward compatibility
+type ShareManagerServiceServer interface {
+	FilesystemTrim(context.Context, *FilesystemTrimRequest) (*emptypb.Empty, error)
+	Unmount(context.Context, *emptypb.Empty) (*emptypb.Empty, error)
+	Mount(context.Context, *emptypb.Empty) (*emptypb.Empty, error)
+	mustEmbedUnimplementedShareManagerServiceServer()
+}
+
+// UnimplementedShareManagerServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedShareManagerServiceServer struct {
+}
+
+func (UnimplementedShareManagerServiceServer) FilesystemTrim(context.Context, *FilesystemTrimRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method FilesystemTrim not implemented")
+}
+func (UnimplementedShareManagerServiceServer) Unmount(context.Context, *emptypb.Empty) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Unmount not implemented")
+}
+func (UnimplementedShareManagerServiceServer) Mount(context.Context, *emptypb.Empty) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Mount not implemented")
+}
+func (UnimplementedShareManagerServiceServer) mustEmbedUnimplementedShareManagerServiceServer() {}
+
+// UnsafeShareManagerServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to ShareManagerServiceServer will
+// result in compilation errors.
+type UnsafeShareManagerServiceServer interface {
+	mustEmbedUnimplementedShareManagerServiceServer()
+}
+
+func RegisterShareManagerServiceServer(s grpc.ServiceRegistrar, srv ShareManagerServiceServer) {
+	s.RegisterService(&ShareManagerService_ServiceDesc, srv)
+}
+
+func _ShareManagerService_FilesystemTrim_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(FilesystemTrimRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ShareManagerServiceServer).FilesystemTrim(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ShareManagerService_FilesystemTrim_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ShareManagerServiceServer).FilesystemTrim(ctx, req.(*FilesystemTrimRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ShareManagerService_Unmount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ShareManagerServiceServer).Unmount(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ShareManagerService_Unmount_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ShareManagerServiceServer).Unmount(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ShareManagerService_Mount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ShareManagerServiceServer).Mount(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ShareManagerService_Mount_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ShareManagerServiceServer).Mount(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// ShareManagerService_ServiceDesc is the grpc.ServiceDesc for ShareManagerService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var ShareManagerService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "ShareManagerService",
+	HandlerType: (*ShareManagerServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "FilesystemTrim",
+			Handler:    _ShareManagerService_FilesystemTrim_Handler,
+		},
+		{
+			MethodName: "Unmount",
+			Handler:    _ShareManagerService_Unmount_Handler,
+		},
+		{
+			MethodName: "Mount",
+			Handler:    _ShareManagerService_Mount_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "smrpc/smrpc.proto",
+}
diff --git a/pkg/generated/spdkrpc/spdk.pb.go b/pkg/generated/spdkrpc/spdk.pb.go
new file mode 100644
index 0000000..ddaa26e
--- /dev/null
+++ b/pkg/generated/spdkrpc/spdk.pb.go
@@ -0,0 +1,4834 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
+// source: spdkrpc/spdk.proto
+
+package spdkrpc
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type ReplicaMode int32
+
+const (
+	ReplicaMode_WO  ReplicaMode = 0
+	ReplicaMode_RW  ReplicaMode = 1
+	ReplicaMode_ERR ReplicaMode = 2
+)
+
+// Enum value maps for ReplicaMode.
+var (
+	ReplicaMode_name = map[int32]string{
+		0: "WO",
+		1: "RW",
+		2: "ERR",
+	}
+	ReplicaMode_value = map[string]int32{
+		"WO":  0,
+		"RW":  1,
+		"ERR": 2,
+	}
+)
+
+func (x ReplicaMode) Enum() *ReplicaMode {
+	p := new(ReplicaMode)
+	*p = x
+	return p
+}
+
+func (x ReplicaMode) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ReplicaMode) Descriptor() protoreflect.EnumDescriptor {
+	return file_spdkrpc_spdk_proto_enumTypes[0].Descriptor()
+}
+
+func (ReplicaMode) Type() protoreflect.EnumType {
+	return &file_spdkrpc_spdk_proto_enumTypes[0]
+}
+
+func (x ReplicaMode) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ReplicaMode.Descriptor instead.
+func (ReplicaMode) EnumDescriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{0}
+}
+
+type Lvol struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name         string          `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Uuid         string          `protobuf:"bytes,2,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	SpecSize     uint64          `protobuf:"varint,3,opt,name=spec_size,json=specSize,proto3" json:"spec_size,omitempty"`
+	ActualSize   uint64          `protobuf:"varint,4,opt,name=actual_size,json=actualSize,proto3" json:"actual_size,omitempty"`
+	Parent       string          `protobuf:"bytes,5,opt,name=parent,proto3" json:"parent,omitempty"`
+	Children     map[string]bool `protobuf:"bytes,6,rep,name=children,proto3" json:"children,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
+	CreationTime string          `protobuf:"bytes,7,opt,name=creation_time,json=creationTime,proto3" json:"creation_time,omitempty"`
+	UserCreated  bool            `protobuf:"varint,8,opt,name=user_created,json=userCreated,proto3" json:"user_created,omitempty"`
+}
+
+func (x *Lvol) Reset() {
+	*x = Lvol{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Lvol) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Lvol) ProtoMessage() {}
+
+func (x *Lvol) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Lvol.ProtoReflect.Descriptor instead.
+func (*Lvol) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Lvol) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Lvol) GetUuid() string {
+	if x != nil {
+		return x.Uuid
+	}
+	return ""
+}
+
+func (x *Lvol) GetSpecSize() uint64 {
+	if x != nil {
+		return x.SpecSize
+	}
+	return 0
+}
+
+func (x *Lvol) GetActualSize() uint64 {
+	if x != nil {
+		return x.ActualSize
+	}
+	return 0
+}
+
+func (x *Lvol) GetParent() string {
+	if x != nil {
+		return x.Parent
+	}
+	return ""
+}
+
+func (x *Lvol) GetChildren() map[string]bool {
+	if x != nil {
+		return x.Children
+	}
+	return nil
+}
+
+func (x *Lvol) GetCreationTime() string {
+	if x != nil {
+		return x.CreationTime
+	}
+	return ""
+}
+
+func (x *Lvol) GetUserCreated() bool {
+	if x != nil {
+		return x.UserCreated
+	}
+	return false
+}
+
+type Replica struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name       string           `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	LvsName    string           `protobuf:"bytes,2,opt,name=lvs_name,json=lvsName,proto3" json:"lvs_name,omitempty"`
+	LvsUuid    string           `protobuf:"bytes,3,opt,name=lvs_uuid,json=lvsUuid,proto3" json:"lvs_uuid,omitempty"`
+	SpecSize   uint64           `protobuf:"varint,4,opt,name=spec_size,json=specSize,proto3" json:"spec_size,omitempty"`
+	ActualSize uint64           `protobuf:"varint,5,opt,name=actual_size,json=actualSize,proto3" json:"actual_size,omitempty"`
+	Ip         string           `protobuf:"bytes,6,opt,name=ip,proto3" json:"ip,omitempty"`
+	PortStart  int32            `protobuf:"varint,7,opt,name=port_start,json=portStart,proto3" json:"port_start,omitempty"`
+	PortEnd    int32            `protobuf:"varint,8,opt,name=port_end,json=portEnd,proto3" json:"port_end,omitempty"`
+	Head       *Lvol            `protobuf:"bytes,9,opt,name=head,proto3" json:"head,omitempty"`
+	Snapshots  map[string]*Lvol `protobuf:"bytes,10,rep,name=snapshots,proto3" json:"snapshots,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	Rebuilding bool             `protobuf:"varint,11,opt,name=rebuilding,proto3" json:"rebuilding,omitempty"`
+	State      string           `protobuf:"bytes,12,opt,name=state,proto3" json:"state,omitempty"`
+	ErrorMsg   string           `protobuf:"bytes,13,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"`
+}
+
+func (x *Replica) Reset() {
+	*x = Replica{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Replica) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Replica) ProtoMessage() {}
+
+func (x *Replica) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Replica.ProtoReflect.Descriptor instead.
+func (*Replica) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Replica) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Replica) GetLvsName() string {
+	if x != nil {
+		return x.LvsName
+	}
+	return ""
+}
+
+func (x *Replica) GetLvsUuid() string {
+	if x != nil {
+		return x.LvsUuid
+	}
+	return ""
+}
+
+func (x *Replica) GetSpecSize() uint64 {
+	if x != nil {
+		return x.SpecSize
+	}
+	return 0
+}
+
+func (x *Replica) GetActualSize() uint64 {
+	if x != nil {
+		return x.ActualSize
+	}
+	return 0
+}
+
+func (x *Replica) GetIp() string {
+	if x != nil {
+		return x.Ip
+	}
+	return ""
+}
+
+func (x *Replica) GetPortStart() int32 {
+	if x != nil {
+		return x.PortStart
+	}
+	return 0
+}
+
+func (x *Replica) GetPortEnd() int32 {
+	if x != nil {
+		return x.PortEnd
+	}
+	return 0
+}
+
+func (x *Replica) GetHead() *Lvol {
+	if x != nil {
+		return x.Head
+	}
+	return nil
+}
+
+func (x *Replica) GetSnapshots() map[string]*Lvol {
+	if x != nil {
+		return x.Snapshots
+	}
+	return nil
+}
+
+func (x *Replica) GetRebuilding() bool {
+	if x != nil {
+		return x.Rebuilding
+	}
+	return false
+}
+
+func (x *Replica) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+func (x *Replica) GetErrorMsg() string {
+	if x != nil {
+		return x.ErrorMsg
+	}
+	return ""
+}
+
+type ReplicaCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name           string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	LvsName        string `protobuf:"bytes,2,opt,name=lvs_name,json=lvsName,proto3" json:"lvs_name,omitempty"`
+	LvsUuid        string `protobuf:"bytes,3,opt,name=lvs_uuid,json=lvsUuid,proto3" json:"lvs_uuid,omitempty"`
+	SpecSize       uint64 `protobuf:"varint,4,opt,name=spec_size,json=specSize,proto3" json:"spec_size,omitempty"`
+	ExposeRequired bool   `protobuf:"varint,5,opt,name=expose_required,json=exposeRequired,proto3" json:"expose_required,omitempty"`
+	PortCount      int32  `protobuf:"varint,6,opt,name=port_count,json=portCount,proto3" json:"port_count,omitempty"`
+}
+
+func (x *ReplicaCreateRequest) Reset() {
+	*x = ReplicaCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaCreateRequest) ProtoMessage() {}
+
+func (x *ReplicaCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaCreateRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaCreateRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *ReplicaCreateRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *ReplicaCreateRequest) GetLvsName() string {
+	if x != nil {
+		return x.LvsName
+	}
+	return ""
+}
+
+func (x *ReplicaCreateRequest) GetLvsUuid() string {
+	if x != nil {
+		return x.LvsUuid
+	}
+	return ""
+}
+
+func (x *ReplicaCreateRequest) GetSpecSize() uint64 {
+	if x != nil {
+		return x.SpecSize
+	}
+	return 0
+}
+
+func (x *ReplicaCreateRequest) GetExposeRequired() bool {
+	if x != nil {
+		return x.ExposeRequired
+	}
+	return false
+}
+
+func (x *ReplicaCreateRequest) GetPortCount() int32 {
+	if x != nil {
+		return x.PortCount
+	}
+	return 0
+}
+
+type ReplicaDeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name            string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	CleanupRequired bool   `protobuf:"varint,2,opt,name=cleanup_required,json=cleanupRequired,proto3" json:"cleanup_required,omitempty"`
+}
+
+func (x *ReplicaDeleteRequest) Reset() {
+	*x = ReplicaDeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaDeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaDeleteRequest) ProtoMessage() {}
+
+func (x *ReplicaDeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaDeleteRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaDeleteRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *ReplicaDeleteRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *ReplicaDeleteRequest) GetCleanupRequired() bool {
+	if x != nil {
+		return x.CleanupRequired
+	}
+	return false
+}
+
+type ReplicaGetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *ReplicaGetRequest) Reset() {
+	*x = ReplicaGetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaGetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaGetRequest) ProtoMessage() {}
+
+func (x *ReplicaGetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaGetRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaGetRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *ReplicaGetRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type ReplicaListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replicas map[string]*Replica `protobuf:"bytes,1,rep,name=replicas,proto3" json:"replicas,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *ReplicaListResponse) Reset() {
+	*x = ReplicaListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaListResponse) ProtoMessage() {}
+
+func (x *ReplicaListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaListResponse.ProtoReflect.Descriptor instead.
+func (*ReplicaListResponse) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *ReplicaListResponse) GetReplicas() map[string]*Replica {
+	if x != nil {
+		return x.Replicas
+	}
+	return nil
+}
+
+type ReplicaRebuildingSrcStartRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name                     string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	DstReplicaName           string `protobuf:"bytes,2,opt,name=dst_replica_name,json=dstReplicaName,proto3" json:"dst_replica_name,omitempty"`
+	DstRebuildingLvolAddress string `protobuf:"bytes,3,opt,name=dst_rebuilding_lvol_address,json=dstRebuildingLvolAddress,proto3" json:"dst_rebuilding_lvol_address,omitempty"`
+}
+
+func (x *ReplicaRebuildingSrcStartRequest) Reset() {
+	*x = ReplicaRebuildingSrcStartRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaRebuildingSrcStartRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaRebuildingSrcStartRequest) ProtoMessage() {}
+
+func (x *ReplicaRebuildingSrcStartRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaRebuildingSrcStartRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaRebuildingSrcStartRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *ReplicaRebuildingSrcStartRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *ReplicaRebuildingSrcStartRequest) GetDstReplicaName() string {
+	if x != nil {
+		return x.DstReplicaName
+	}
+	return ""
+}
+
+func (x *ReplicaRebuildingSrcStartRequest) GetDstRebuildingLvolAddress() string {
+	if x != nil {
+		return x.DstRebuildingLvolAddress
+	}
+	return ""
+}
+
+type ReplicaRebuildingSrcFinishRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name           string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	DstReplicaName string `protobuf:"bytes,2,opt,name=dst_replica_name,json=dstReplicaName,proto3" json:"dst_replica_name,omitempty"`
+}
+
+func (x *ReplicaRebuildingSrcFinishRequest) Reset() {
+	*x = ReplicaRebuildingSrcFinishRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaRebuildingSrcFinishRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaRebuildingSrcFinishRequest) ProtoMessage() {}
+
+func (x *ReplicaRebuildingSrcFinishRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaRebuildingSrcFinishRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaRebuildingSrcFinishRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *ReplicaRebuildingSrcFinishRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *ReplicaRebuildingSrcFinishRequest) GetDstReplicaName() string {
+	if x != nil {
+		return x.DstReplicaName
+	}
+	return ""
+}
+
+type ReplicaRebuildingSrcAttachRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name                     string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	DstReplicaName           string `protobuf:"bytes,2,opt,name=dst_replica_name,json=dstReplicaName,proto3" json:"dst_replica_name,omitempty"`
+	DstRebuildingLvolAddress string `protobuf:"bytes,3,opt,name=dst_rebuilding_lvol_address,json=dstRebuildingLvolAddress,proto3" json:"dst_rebuilding_lvol_address,omitempty"`
+}
+
+func (x *ReplicaRebuildingSrcAttachRequest) Reset() {
+	*x = ReplicaRebuildingSrcAttachRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaRebuildingSrcAttachRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaRebuildingSrcAttachRequest) ProtoMessage() {}
+
+func (x *ReplicaRebuildingSrcAttachRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaRebuildingSrcAttachRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaRebuildingSrcAttachRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *ReplicaRebuildingSrcAttachRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *ReplicaRebuildingSrcAttachRequest) GetDstReplicaName() string {
+	if x != nil {
+		return x.DstReplicaName
+	}
+	return ""
+}
+
+func (x *ReplicaRebuildingSrcAttachRequest) GetDstRebuildingLvolAddress() string {
+	if x != nil {
+		return x.DstRebuildingLvolAddress
+	}
+	return ""
+}
+
+type ReplicaRebuildingSrcDetachRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name           string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	DstReplicaName string `protobuf:"bytes,2,opt,name=dst_replica_name,json=dstReplicaName,proto3" json:"dst_replica_name,omitempty"`
+}
+
+func (x *ReplicaRebuildingSrcDetachRequest) Reset() {
+	*x = ReplicaRebuildingSrcDetachRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaRebuildingSrcDetachRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaRebuildingSrcDetachRequest) ProtoMessage() {}
+
+func (x *ReplicaRebuildingSrcDetachRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaRebuildingSrcDetachRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaRebuildingSrcDetachRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *ReplicaRebuildingSrcDetachRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *ReplicaRebuildingSrcDetachRequest) GetDstReplicaName() string {
+	if x != nil {
+		return x.DstReplicaName
+	}
+	return ""
+}
+
+type ReplicaSnapshotShallowCopyRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name         string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	SnapshotName string `protobuf:"bytes,2,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+}
+
+func (x *ReplicaSnapshotShallowCopyRequest) Reset() {
+	*x = ReplicaSnapshotShallowCopyRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaSnapshotShallowCopyRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaSnapshotShallowCopyRequest) ProtoMessage() {}
+
+func (x *ReplicaSnapshotShallowCopyRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaSnapshotShallowCopyRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaSnapshotShallowCopyRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *ReplicaSnapshotShallowCopyRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *ReplicaSnapshotShallowCopyRequest) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+type ReplicaRebuildingDstStartRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name           string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	ExposeRequired bool   `protobuf:"varint,2,opt,name=expose_required,json=exposeRequired,proto3" json:"expose_required,omitempty"`
+}
+
+func (x *ReplicaRebuildingDstStartRequest) Reset() {
+	*x = ReplicaRebuildingDstStartRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaRebuildingDstStartRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaRebuildingDstStartRequest) ProtoMessage() {}
+
+func (x *ReplicaRebuildingDstStartRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaRebuildingDstStartRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaRebuildingDstStartRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *ReplicaRebuildingDstStartRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *ReplicaRebuildingDstStartRequest) GetExposeRequired() bool {
+	if x != nil {
+		return x.ExposeRequired
+	}
+	return false
+}
+
+type ReplicaRebuildingDstStartResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+}
+
+func (x *ReplicaRebuildingDstStartResponse) Reset() {
+	*x = ReplicaRebuildingDstStartResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaRebuildingDstStartResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaRebuildingDstStartResponse) ProtoMessage() {}
+
+func (x *ReplicaRebuildingDstStartResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaRebuildingDstStartResponse.ProtoReflect.Descriptor instead.
+func (*ReplicaRebuildingDstStartResponse) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *ReplicaRebuildingDstStartResponse) GetAddress() string {
+	if x != nil {
+		return x.Address
+	}
+	return ""
+}
+
+type ReplicaRebuildingDstFinishRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name             string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	UnexposeRequired bool   `protobuf:"varint,2,opt,name=unexpose_required,json=unexposeRequired,proto3" json:"unexpose_required,omitempty"`
+}
+
+func (x *ReplicaRebuildingDstFinishRequest) Reset() {
+	*x = ReplicaRebuildingDstFinishRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaRebuildingDstFinishRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaRebuildingDstFinishRequest) ProtoMessage() {}
+
+func (x *ReplicaRebuildingDstFinishRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaRebuildingDstFinishRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaRebuildingDstFinishRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *ReplicaRebuildingDstFinishRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *ReplicaRebuildingDstFinishRequest) GetUnexposeRequired() bool {
+	if x != nil {
+		return x.UnexposeRequired
+	}
+	return false
+}
+
+type Engine struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name              string                 `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	VolumeName        string                 `protobuf:"bytes,2,opt,name=volume_name,json=volumeName,proto3" json:"volume_name,omitempty"`
+	SpecSize          uint64                 `protobuf:"varint,3,opt,name=spec_size,json=specSize,proto3" json:"spec_size,omitempty"`
+	ActualSize        uint64                 `protobuf:"varint,4,opt,name=actual_size,json=actualSize,proto3" json:"actual_size,omitempty"`
+	Ip                string                 `protobuf:"bytes,5,opt,name=ip,proto3" json:"ip,omitempty"`
+	Port              int32                  `protobuf:"varint,6,opt,name=port,proto3" json:"port,omitempty"`
+	ReplicaAddressMap map[string]string      `protobuf:"bytes,7,rep,name=replica_address_map,json=replicaAddressMap,proto3" json:"replica_address_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	ReplicaModeMap    map[string]ReplicaMode `protobuf:"bytes,8,rep,name=replica_mode_map,json=replicaModeMap,proto3" json:"replica_mode_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=spdkrpc.ReplicaMode"`
+	Head              *Lvol                  `protobuf:"bytes,9,opt,name=head,proto3" json:"head,omitempty"`
+	Snapshots         map[string]*Lvol       `protobuf:"bytes,10,rep,name=snapshots,proto3" json:"snapshots,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	Frontend          string                 `protobuf:"bytes,11,opt,name=frontend,proto3" json:"frontend,omitempty"`
+	Endpoint          string                 `protobuf:"bytes,12,opt,name=endpoint,proto3" json:"endpoint,omitempty"`
+	State             string                 `protobuf:"bytes,13,opt,name=state,proto3" json:"state,omitempty"`
+	ErrorMsg          string                 `protobuf:"bytes,14,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"`
+}
+
+func (x *Engine) Reset() {
+	*x = Engine{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Engine) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Engine) ProtoMessage() {}
+
+func (x *Engine) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Engine.ProtoReflect.Descriptor instead.
+func (*Engine) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *Engine) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Engine) GetVolumeName() string {
+	if x != nil {
+		return x.VolumeName
+	}
+	return ""
+}
+
+func (x *Engine) GetSpecSize() uint64 {
+	if x != nil {
+		return x.SpecSize
+	}
+	return 0
+}
+
+func (x *Engine) GetActualSize() uint64 {
+	if x != nil {
+		return x.ActualSize
+	}
+	return 0
+}
+
+func (x *Engine) GetIp() string {
+	if x != nil {
+		return x.Ip
+	}
+	return ""
+}
+
+func (x *Engine) GetPort() int32 {
+	if x != nil {
+		return x.Port
+	}
+	return 0
+}
+
+func (x *Engine) GetReplicaAddressMap() map[string]string {
+	if x != nil {
+		return x.ReplicaAddressMap
+	}
+	return nil
+}
+
+func (x *Engine) GetReplicaModeMap() map[string]ReplicaMode {
+	if x != nil {
+		return x.ReplicaModeMap
+	}
+	return nil
+}
+
+func (x *Engine) GetHead() *Lvol {
+	if x != nil {
+		return x.Head
+	}
+	return nil
+}
+
+func (x *Engine) GetSnapshots() map[string]*Lvol {
+	if x != nil {
+		return x.Snapshots
+	}
+	return nil
+}
+
+func (x *Engine) GetFrontend() string {
+	if x != nil {
+		return x.Frontend
+	}
+	return ""
+}
+
+func (x *Engine) GetEndpoint() string {
+	if x != nil {
+		return x.Endpoint
+	}
+	return ""
+}
+
+func (x *Engine) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+func (x *Engine) GetErrorMsg() string {
+	if x != nil {
+		return x.ErrorMsg
+	}
+	return ""
+}
+
+type EngineCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name              string            `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	VolumeName        string            `protobuf:"bytes,2,opt,name=volume_name,json=volumeName,proto3" json:"volume_name,omitempty"`
+	SpecSize          uint64            `protobuf:"varint,3,opt,name=spec_size,json=specSize,proto3" json:"spec_size,omitempty"`
+	ReplicaAddressMap map[string]string `protobuf:"bytes,4,rep,name=replica_address_map,json=replicaAddressMap,proto3" json:"replica_address_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	Frontend          string            `protobuf:"bytes,5,opt,name=frontend,proto3" json:"frontend,omitempty"`
+	PortCount         int32             `protobuf:"varint,6,opt,name=port_count,json=portCount,proto3" json:"port_count,omitempty"`
+}
+
+func (x *EngineCreateRequest) Reset() {
+	*x = EngineCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineCreateRequest) ProtoMessage() {}
+
+func (x *EngineCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineCreateRequest.ProtoReflect.Descriptor instead.
+func (*EngineCreateRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *EngineCreateRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *EngineCreateRequest) GetVolumeName() string {
+	if x != nil {
+		return x.VolumeName
+	}
+	return ""
+}
+
+func (x *EngineCreateRequest) GetSpecSize() uint64 {
+	if x != nil {
+		return x.SpecSize
+	}
+	return 0
+}
+
+func (x *EngineCreateRequest) GetReplicaAddressMap() map[string]string {
+	if x != nil {
+		return x.ReplicaAddressMap
+	}
+	return nil
+}
+
+func (x *EngineCreateRequest) GetFrontend() string {
+	if x != nil {
+		return x.Frontend
+	}
+	return ""
+}
+
+func (x *EngineCreateRequest) GetPortCount() int32 {
+	if x != nil {
+		return x.PortCount
+	}
+	return 0
+}
+
+type EngineDeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *EngineDeleteRequest) Reset() {
+	*x = EngineDeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineDeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineDeleteRequest) ProtoMessage() {}
+
+func (x *EngineDeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineDeleteRequest.ProtoReflect.Descriptor instead.
+func (*EngineDeleteRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *EngineDeleteRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type EngineGetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *EngineGetRequest) Reset() {
+	*x = EngineGetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineGetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineGetRequest) ProtoMessage() {}
+
+func (x *EngineGetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineGetRequest.ProtoReflect.Descriptor instead.
+func (*EngineGetRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *EngineGetRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type EngineListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Engines map[string]*Engine `protobuf:"bytes,1,rep,name=engines,proto3" json:"engines,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *EngineListResponse) Reset() {
+	*x = EngineListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineListResponse) ProtoMessage() {}
+
+func (x *EngineListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineListResponse.ProtoReflect.Descriptor instead.
+func (*EngineListResponse) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *EngineListResponse) GetEngines() map[string]*Engine {
+	if x != nil {
+		return x.Engines
+	}
+	return nil
+}
+
+type EngineReplicaAddRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	EngineName     string `protobuf:"bytes,1,opt,name=engine_name,json=engineName,proto3" json:"engine_name,omitempty"`
+	ReplicaName    string `protobuf:"bytes,2,opt,name=replica_name,json=replicaName,proto3" json:"replica_name,omitempty"`
+	ReplicaAddress string `protobuf:"bytes,3,opt,name=replica_address,json=replicaAddress,proto3" json:"replica_address,omitempty"`
+}
+
+func (x *EngineReplicaAddRequest) Reset() {
+	*x = EngineReplicaAddRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineReplicaAddRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineReplicaAddRequest) ProtoMessage() {}
+
+func (x *EngineReplicaAddRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineReplicaAddRequest.ProtoReflect.Descriptor instead.
+func (*EngineReplicaAddRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *EngineReplicaAddRequest) GetEngineName() string {
+	if x != nil {
+		return x.EngineName
+	}
+	return ""
+}
+
+func (x *EngineReplicaAddRequest) GetReplicaName() string {
+	if x != nil {
+		return x.ReplicaName
+	}
+	return ""
+}
+
+func (x *EngineReplicaAddRequest) GetReplicaAddress() string {
+	if x != nil {
+		return x.ReplicaAddress
+	}
+	return ""
+}
+
+type EngineReplicaListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	EngineName string `protobuf:"bytes,1,opt,name=engine_name,json=engineName,proto3" json:"engine_name,omitempty"`
+}
+
+func (x *EngineReplicaListRequest) Reset() {
+	*x = EngineReplicaListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineReplicaListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineReplicaListRequest) ProtoMessage() {}
+
+func (x *EngineReplicaListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineReplicaListRequest.ProtoReflect.Descriptor instead.
+func (*EngineReplicaListRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *EngineReplicaListRequest) GetEngineName() string {
+	if x != nil {
+		return x.EngineName
+	}
+	return ""
+}
+
+type EngineReplicaListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Replicas map[string]*Replica `protobuf:"bytes,1,rep,name=replicas,proto3" json:"replicas,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *EngineReplicaListResponse) Reset() {
+	*x = EngineReplicaListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineReplicaListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineReplicaListResponse) ProtoMessage() {}
+
+func (x *EngineReplicaListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineReplicaListResponse.ProtoReflect.Descriptor instead.
+func (*EngineReplicaListResponse) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *EngineReplicaListResponse) GetReplicas() map[string]*Replica {
+	if x != nil {
+		return x.Replicas
+	}
+	return nil
+}
+
+type EngineReplicaDeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	EngineName     string `protobuf:"bytes,1,opt,name=engine_name,json=engineName,proto3" json:"engine_name,omitempty"`
+	ReplicaName    string `protobuf:"bytes,2,opt,name=replica_name,json=replicaName,proto3" json:"replica_name,omitempty"`
+	ReplicaAddress string `protobuf:"bytes,3,opt,name=replica_address,json=replicaAddress,proto3" json:"replica_address,omitempty"`
+}
+
+func (x *EngineReplicaDeleteRequest) Reset() {
+	*x = EngineReplicaDeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineReplicaDeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineReplicaDeleteRequest) ProtoMessage() {}
+
+func (x *EngineReplicaDeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineReplicaDeleteRequest.ProtoReflect.Descriptor instead.
+func (*EngineReplicaDeleteRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *EngineReplicaDeleteRequest) GetEngineName() string {
+	if x != nil {
+		return x.EngineName
+	}
+	return ""
+}
+
+func (x *EngineReplicaDeleteRequest) GetReplicaName() string {
+	if x != nil {
+		return x.ReplicaName
+	}
+	return ""
+}
+
+func (x *EngineReplicaDeleteRequest) GetReplicaAddress() string {
+	if x != nil {
+		return x.ReplicaAddress
+	}
+	return ""
+}
+
+type SnapshotRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name         string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	SnapshotName string `protobuf:"bytes,2,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+	UserCreated  bool   `protobuf:"varint,3,opt,name=user_created,json=userCreated,proto3" json:"user_created,omitempty"`
+}
+
+func (x *SnapshotRequest) Reset() {
+	*x = SnapshotRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[23]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SnapshotRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SnapshotRequest) ProtoMessage() {}
+
+func (x *SnapshotRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SnapshotRequest.ProtoReflect.Descriptor instead.
+func (*SnapshotRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *SnapshotRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *SnapshotRequest) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+func (x *SnapshotRequest) GetUserCreated() bool {
+	if x != nil {
+		return x.UserCreated
+	}
+	return false
+}
+
+type SnapshotResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SnapshotName string `protobuf:"bytes,1,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+}
+
+func (x *SnapshotResponse) Reset() {
+	*x = SnapshotResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[24]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SnapshotResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SnapshotResponse) ProtoMessage() {}
+
+func (x *SnapshotResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SnapshotResponse.ProtoReflect.Descriptor instead.
+func (*SnapshotResponse) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{24}
+}
+
+func (x *SnapshotResponse) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+type VersionOutput struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Version                 string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
+	GitCommit               string `protobuf:"bytes,2,opt,name=gitCommit,proto3" json:"gitCommit,omitempty"`
+	BuildDate               string `protobuf:"bytes,3,opt,name=buildDate,proto3" json:"buildDate,omitempty"`
+	CliAPIVersion           int64  `protobuf:"varint,4,opt,name=cliAPIVersion,proto3" json:"cliAPIVersion,omitempty"`
+	CliAPIMinVersion        int64  `protobuf:"varint,5,opt,name=cliAPIMinVersion,proto3" json:"cliAPIMinVersion,omitempty"`
+	ControllerAPIVersion    int64  `protobuf:"varint,6,opt,name=controllerAPIVersion,proto3" json:"controllerAPIVersion,omitempty"`
+	ControllerAPIMinVersion int64  `protobuf:"varint,7,opt,name=controllerAPIMinVersion,proto3" json:"controllerAPIMinVersion,omitempty"`
+	DataFormatVersion       int64  `protobuf:"varint,8,opt,name=dataFormatVersion,proto3" json:"dataFormatVersion,omitempty"`
+	DataFormatMinVersion    int64  `protobuf:"varint,9,opt,name=dataFormatMinVersion,proto3" json:"dataFormatMinVersion,omitempty"`
+}
+
+func (x *VersionOutput) Reset() {
+	*x = VersionOutput{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[25]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VersionOutput) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VersionOutput) ProtoMessage() {}
+
+func (x *VersionOutput) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VersionOutput.ProtoReflect.Descriptor instead.
+func (*VersionOutput) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *VersionOutput) GetVersion() string {
+	if x != nil {
+		return x.Version
+	}
+	return ""
+}
+
+func (x *VersionOutput) GetGitCommit() string {
+	if x != nil {
+		return x.GitCommit
+	}
+	return ""
+}
+
+func (x *VersionOutput) GetBuildDate() string {
+	if x != nil {
+		return x.BuildDate
+	}
+	return ""
+}
+
+func (x *VersionOutput) GetCliAPIVersion() int64 {
+	if x != nil {
+		return x.CliAPIVersion
+	}
+	return 0
+}
+
+func (x *VersionOutput) GetCliAPIMinVersion() int64 {
+	if x != nil {
+		return x.CliAPIMinVersion
+	}
+	return 0
+}
+
+func (x *VersionOutput) GetControllerAPIVersion() int64 {
+	if x != nil {
+		return x.ControllerAPIVersion
+	}
+	return 0
+}
+
+func (x *VersionOutput) GetControllerAPIMinVersion() int64 {
+	if x != nil {
+		return x.ControllerAPIMinVersion
+	}
+	return 0
+}
+
+func (x *VersionOutput) GetDataFormatVersion() int64 {
+	if x != nil {
+		return x.DataFormatVersion
+	}
+	return 0
+}
+
+func (x *VersionOutput) GetDataFormatMinVersion() int64 {
+	if x != nil {
+		return x.DataFormatMinVersion
+	}
+	return 0
+}
+
+type VersionDetailGetReply struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Version *VersionOutput `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
+}
+
+func (x *VersionDetailGetReply) Reset() {
+	*x = VersionDetailGetReply{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[26]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *VersionDetailGetReply) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VersionDetailGetReply) ProtoMessage() {}
+
+func (x *VersionDetailGetReply) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use VersionDetailGetReply.ProtoReflect.Descriptor instead.
+func (*VersionDetailGetReply) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{26}
+}
+
+func (x *VersionDetailGetReply) GetVersion() *VersionOutput {
+	if x != nil {
+		return x.Version
+	}
+	return nil
+}
+
+type BackupCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SnapshotName         string            `protobuf:"bytes,1,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+	BackupTarget         string            `protobuf:"bytes,2,opt,name=backup_target,json=backupTarget,proto3" json:"backup_target,omitempty"`
+	VolumeName           string            `protobuf:"bytes,3,opt,name=volume_name,json=volumeName,proto3" json:"volume_name,omitempty"`
+	Size                 int64             `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"`
+	EngineName           string            `protobuf:"bytes,5,opt,name=engine_name,json=engineName,proto3" json:"engine_name,omitempty"`
+	ReplicaName          string            `protobuf:"bytes,6,opt,name=replica_name,json=replicaName,proto3" json:"replica_name,omitempty"`
+	Labels               []string          `protobuf:"bytes,7,rep,name=labels,proto3" json:"labels,omitempty"`
+	Credential           map[string]string `protobuf:"bytes,8,rep,name=credential,proto3" json:"credential,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	BackingImageName     string            `protobuf:"bytes,9,opt,name=backing_image_name,json=backingImageName,proto3" json:"backing_image_name,omitempty"`
+	BackingImageChecksum string            `protobuf:"bytes,10,opt,name=backing_image_checksum,json=backingImageChecksum,proto3" json:"backing_image_checksum,omitempty"`
+	BackupName           string            `protobuf:"bytes,11,opt,name=backup_name,json=backupName,proto3" json:"backup_name,omitempty"`
+	CompressionMethod    string            `protobuf:"bytes,12,opt,name=compression_method,json=compressionMethod,proto3" json:"compression_method,omitempty"`
+	ConcurrentLimit      int32             `protobuf:"varint,13,opt,name=concurrent_limit,json=concurrentLimit,proto3" json:"concurrent_limit,omitempty"`
+	StorageClassName     string            `protobuf:"bytes,14,opt,name=storage_class_name,json=storageClassName,proto3" json:"storage_class_name,omitempty"`
+}
+
+func (x *BackupCreateRequest) Reset() {
+	*x = BackupCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[27]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackupCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackupCreateRequest) ProtoMessage() {}
+
+func (x *BackupCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackupCreateRequest.ProtoReflect.Descriptor instead.
+func (*BackupCreateRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *BackupCreateRequest) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetBackupTarget() string {
+	if x != nil {
+		return x.BackupTarget
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetVolumeName() string {
+	if x != nil {
+		return x.VolumeName
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetSize() int64 {
+	if x != nil {
+		return x.Size
+	}
+	return 0
+}
+
+func (x *BackupCreateRequest) GetEngineName() string {
+	if x != nil {
+		return x.EngineName
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetReplicaName() string {
+	if x != nil {
+		return x.ReplicaName
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetLabels() []string {
+	if x != nil {
+		return x.Labels
+	}
+	return nil
+}
+
+func (x *BackupCreateRequest) GetCredential() map[string]string {
+	if x != nil {
+		return x.Credential
+	}
+	return nil
+}
+
+func (x *BackupCreateRequest) GetBackingImageName() string {
+	if x != nil {
+		return x.BackingImageName
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetBackingImageChecksum() string {
+	if x != nil {
+		return x.BackingImageChecksum
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetBackupName() string {
+	if x != nil {
+		return x.BackupName
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetCompressionMethod() string {
+	if x != nil {
+		return x.CompressionMethod
+	}
+	return ""
+}
+
+func (x *BackupCreateRequest) GetConcurrentLimit() int32 {
+	if x != nil {
+		return x.ConcurrentLimit
+	}
+	return 0
+}
+
+func (x *BackupCreateRequest) GetStorageClassName() string {
+	if x != nil {
+		return x.StorageClassName
+	}
+	return ""
+}
+
+type BackupCreateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Backup         string `protobuf:"bytes,1,opt,name=backup,proto3" json:"backup,omitempty"`
+	IsIncremental  bool   `protobuf:"varint,2,opt,name=is_incremental,json=isIncremental,proto3" json:"is_incremental,omitempty"`
+	ReplicaAddress string `protobuf:"bytes,3,opt,name=replica_address,json=replicaAddress,proto3" json:"replica_address,omitempty"`
+}
+
+func (x *BackupCreateResponse) Reset() {
+	*x = BackupCreateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[28]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackupCreateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackupCreateResponse) ProtoMessage() {}
+
+func (x *BackupCreateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackupCreateResponse.ProtoReflect.Descriptor instead.
+func (*BackupCreateResponse) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{28}
+}
+
+func (x *BackupCreateResponse) GetBackup() string {
+	if x != nil {
+		return x.Backup
+	}
+	return ""
+}
+
+func (x *BackupCreateResponse) GetIsIncremental() bool {
+	if x != nil {
+		return x.IsIncremental
+	}
+	return false
+}
+
+func (x *BackupCreateResponse) GetReplicaAddress() string {
+	if x != nil {
+		return x.ReplicaAddress
+	}
+	return ""
+}
+
+type BackupStatusRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Backup         string `protobuf:"bytes,1,opt,name=backup,proto3" json:"backup,omitempty"`
+	EngineName     string `protobuf:"bytes,2,opt,name=engine_name,json=engineName,proto3" json:"engine_name,omitempty"`
+	ReplicaAddress string `protobuf:"bytes,3,opt,name=replica_address,json=replicaAddress,proto3" json:"replica_address,omitempty"`
+}
+
+func (x *BackupStatusRequest) Reset() {
+	*x = BackupStatusRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[29]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackupStatusRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackupStatusRequest) ProtoMessage() {}
+
+func (x *BackupStatusRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackupStatusRequest.ProtoReflect.Descriptor instead.
+func (*BackupStatusRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{29}
+}
+
+func (x *BackupStatusRequest) GetBackup() string {
+	if x != nil {
+		return x.Backup
+	}
+	return ""
+}
+
+func (x *BackupStatusRequest) GetEngineName() string {
+	if x != nil {
+		return x.EngineName
+	}
+	return ""
+}
+
+func (x *BackupStatusRequest) GetReplicaAddress() string {
+	if x != nil {
+		return x.ReplicaAddress
+	}
+	return ""
+}
+
+type BackupStatusResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Progress       int32  `protobuf:"varint,1,opt,name=progress,proto3" json:"progress,omitempty"`
+	BackupUrl      string `protobuf:"bytes,2,opt,name=backup_url,json=backupUrl,proto3" json:"backup_url,omitempty"`
+	Error          string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"`
+	SnapshotName   string `protobuf:"bytes,4,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+	State          string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"`
+	ReplicaAddress string `protobuf:"bytes,6,opt,name=replica_address,json=replicaAddress,proto3" json:"replica_address,omitempty"`
+}
+
+func (x *BackupStatusResponse) Reset() {
+	*x = BackupStatusResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[30]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BackupStatusResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BackupStatusResponse) ProtoMessage() {}
+
+func (x *BackupStatusResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BackupStatusResponse.ProtoReflect.Descriptor instead.
+func (*BackupStatusResponse) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{30}
+}
+
+func (x *BackupStatusResponse) GetProgress() int32 {
+	if x != nil {
+		return x.Progress
+	}
+	return 0
+}
+
+func (x *BackupStatusResponse) GetBackupUrl() string {
+	if x != nil {
+		return x.BackupUrl
+	}
+	return ""
+}
+
+func (x *BackupStatusResponse) GetError() string {
+	if x != nil {
+		return x.Error
+	}
+	return ""
+}
+
+func (x *BackupStatusResponse) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+func (x *BackupStatusResponse) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+func (x *BackupStatusResponse) GetReplicaAddress() string {
+	if x != nil {
+		return x.ReplicaAddress
+	}
+	return ""
+}
+
+type EngineBackupRestoreRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BackupUrl       string            `protobuf:"bytes,1,opt,name=backup_url,json=backupUrl,proto3" json:"backup_url,omitempty"`
+	EngineName      string            `protobuf:"bytes,2,opt,name=engine_name,json=engineName,proto3" json:"engine_name,omitempty"`
+	SnapshotName    string            `protobuf:"bytes,3,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+	Credential      map[string]string `protobuf:"bytes,4,rep,name=credential,proto3" json:"credential,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	ConcurrentLimit int32             `protobuf:"varint,5,opt,name=concurrent_limit,json=concurrentLimit,proto3" json:"concurrent_limit,omitempty"`
+}
+
+func (x *EngineBackupRestoreRequest) Reset() {
+	*x = EngineBackupRestoreRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[31]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineBackupRestoreRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineBackupRestoreRequest) ProtoMessage() {}
+
+func (x *EngineBackupRestoreRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineBackupRestoreRequest.ProtoReflect.Descriptor instead.
+func (*EngineBackupRestoreRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{31}
+}
+
+func (x *EngineBackupRestoreRequest) GetBackupUrl() string {
+	if x != nil {
+		return x.BackupUrl
+	}
+	return ""
+}
+
+func (x *EngineBackupRestoreRequest) GetEngineName() string {
+	if x != nil {
+		return x.EngineName
+	}
+	return ""
+}
+
+func (x *EngineBackupRestoreRequest) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+func (x *EngineBackupRestoreRequest) GetCredential() map[string]string {
+	if x != nil {
+		return x.Credential
+	}
+	return nil
+}
+
+func (x *EngineBackupRestoreRequest) GetConcurrentLimit() int32 {
+	if x != nil {
+		return x.ConcurrentLimit
+	}
+	return 0
+}
+
+type EngineBackupRestoreResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Errors map[string]string `protobuf:"bytes,4,rep,name=errors,proto3" json:"errors,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *EngineBackupRestoreResponse) Reset() {
+	*x = EngineBackupRestoreResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[32]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineBackupRestoreResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineBackupRestoreResponse) ProtoMessage() {}
+
+func (x *EngineBackupRestoreResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineBackupRestoreResponse.ProtoReflect.Descriptor instead.
+func (*EngineBackupRestoreResponse) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{32}
+}
+
+func (x *EngineBackupRestoreResponse) GetErrors() map[string]string {
+	if x != nil {
+		return x.Errors
+	}
+	return nil
+}
+
+type EngineBackupRestoreFinishRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	EngineName string `protobuf:"bytes,1,opt,name=engine_name,json=engineName,proto3" json:"engine_name,omitempty"`
+}
+
+func (x *EngineBackupRestoreFinishRequest) Reset() {
+	*x = EngineBackupRestoreFinishRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[33]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EngineBackupRestoreFinishRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EngineBackupRestoreFinishRequest) ProtoMessage() {}
+
+func (x *EngineBackupRestoreFinishRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[33]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EngineBackupRestoreFinishRequest.ProtoReflect.Descriptor instead.
+func (*EngineBackupRestoreFinishRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{33}
+}
+
+func (x *EngineBackupRestoreFinishRequest) GetEngineName() string {
+	if x != nil {
+		return x.EngineName
+	}
+	return ""
+}
+
+type ReplicaBackupRestoreRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BackupUrl       string            `protobuf:"bytes,1,opt,name=backup_url,json=backupUrl,proto3" json:"backup_url,omitempty"`
+	ReplicaName     string            `protobuf:"bytes,2,opt,name=replica_name,json=replicaName,proto3" json:"replica_name,omitempty"`
+	SnapshotName    string            `protobuf:"bytes,3,opt,name=snapshot_name,json=snapshotName,proto3" json:"snapshot_name,omitempty"`
+	Credential      map[string]string `protobuf:"bytes,4,rep,name=credential,proto3" json:"credential,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	ConcurrentLimit int32             `protobuf:"varint,5,opt,name=concurrent_limit,json=concurrentLimit,proto3" json:"concurrent_limit,omitempty"`
+}
+
+func (x *ReplicaBackupRestoreRequest) Reset() {
+	*x = ReplicaBackupRestoreRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[34]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaBackupRestoreRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaBackupRestoreRequest) ProtoMessage() {}
+
+func (x *ReplicaBackupRestoreRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[34]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaBackupRestoreRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaBackupRestoreRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{34}
+}
+
+func (x *ReplicaBackupRestoreRequest) GetBackupUrl() string {
+	if x != nil {
+		return x.BackupUrl
+	}
+	return ""
+}
+
+func (x *ReplicaBackupRestoreRequest) GetReplicaName() string {
+	if x != nil {
+		return x.ReplicaName
+	}
+	return ""
+}
+
+func (x *ReplicaBackupRestoreRequest) GetSnapshotName() string {
+	if x != nil {
+		return x.SnapshotName
+	}
+	return ""
+}
+
+func (x *ReplicaBackupRestoreRequest) GetCredential() map[string]string {
+	if x != nil {
+		return x.Credential
+	}
+	return nil
+}
+
+func (x *ReplicaBackupRestoreRequest) GetConcurrentLimit() int32 {
+	if x != nil {
+		return x.ConcurrentLimit
+	}
+	return 0
+}
+
+type RestoreStatusRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	EngineName string `protobuf:"bytes,1,opt,name=engine_name,json=engineName,proto3" json:"engine_name,omitempty"`
+}
+
+func (x *RestoreStatusRequest) Reset() {
+	*x = RestoreStatusRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[35]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RestoreStatusRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RestoreStatusRequest) ProtoMessage() {}
+
+func (x *RestoreStatusRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[35]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RestoreStatusRequest.ProtoReflect.Descriptor instead.
+func (*RestoreStatusRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{35}
+}
+
+func (x *RestoreStatusRequest) GetEngineName() string {
+	if x != nil {
+		return x.EngineName
+	}
+	return ""
+}
+
+type ReplicaRestoreStatusRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ReplicaName string `protobuf:"bytes,2,opt,name=replica_name,json=replicaName,proto3" json:"replica_name,omitempty"`
+}
+
+func (x *ReplicaRestoreStatusRequest) Reset() {
+	*x = ReplicaRestoreStatusRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[36]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaRestoreStatusRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaRestoreStatusRequest) ProtoMessage() {}
+
+func (x *ReplicaRestoreStatusRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[36]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaRestoreStatusRequest.ProtoReflect.Descriptor instead.
+func (*ReplicaRestoreStatusRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{36}
+}
+
+func (x *ReplicaRestoreStatusRequest) GetReplicaName() string {
+	if x != nil {
+		return x.ReplicaName
+	}
+	return ""
+}
+
+type ReplicaRestoreStatusResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ReplicaName            string `protobuf:"bytes,1,opt,name=replica_name,json=replicaName,proto3" json:"replica_name,omitempty"`
+	ReplicaAddress         string `protobuf:"bytes,2,opt,name=replica_address,json=replicaAddress,proto3" json:"replica_address,omitempty"`
+	IsRestoring            bool   `protobuf:"varint,3,opt,name=is_restoring,json=isRestoring,proto3" json:"is_restoring,omitempty"`
+	LastRestored           string `protobuf:"bytes,4,opt,name=last_restored,json=lastRestored,proto3" json:"last_restored,omitempty"`
+	Progress               int32  `protobuf:"varint,5,opt,name=progress,proto3" json:"progress,omitempty"`
+	Error                  string `protobuf:"bytes,6,opt,name=error,proto3" json:"error,omitempty"`
+	DestFileName           string `protobuf:"bytes,7,opt,name=dest_file_name,json=destFileName,proto3" json:"dest_file_name,omitempty"`
+	State                  string `protobuf:"bytes,8,opt,name=state,proto3" json:"state,omitempty"`
+	BackupUrl              string `protobuf:"bytes,9,opt,name=backup_url,json=backupUrl,proto3" json:"backup_url,omitempty"`
+	CurrentRestoringBackup string `protobuf:"bytes,10,opt,name=current_restoring_backup,json=currentRestoringBackup,proto3" json:"current_restoring_backup,omitempty"`
+}
+
+func (x *ReplicaRestoreStatusResponse) Reset() {
+	*x = ReplicaRestoreStatusResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[37]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReplicaRestoreStatusResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReplicaRestoreStatusResponse) ProtoMessage() {}
+
+func (x *ReplicaRestoreStatusResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[37]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ReplicaRestoreStatusResponse.ProtoReflect.Descriptor instead.
+func (*ReplicaRestoreStatusResponse) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{37}
+}
+
+func (x *ReplicaRestoreStatusResponse) GetReplicaName() string {
+	if x != nil {
+		return x.ReplicaName
+	}
+	return ""
+}
+
+func (x *ReplicaRestoreStatusResponse) GetReplicaAddress() string {
+	if x != nil {
+		return x.ReplicaAddress
+	}
+	return ""
+}
+
+func (x *ReplicaRestoreStatusResponse) GetIsRestoring() bool {
+	if x != nil {
+		return x.IsRestoring
+	}
+	return false
+}
+
+func (x *ReplicaRestoreStatusResponse) GetLastRestored() string {
+	if x != nil {
+		return x.LastRestored
+	}
+	return ""
+}
+
+func (x *ReplicaRestoreStatusResponse) GetProgress() int32 {
+	if x != nil {
+		return x.Progress
+	}
+	return 0
+}
+
+func (x *ReplicaRestoreStatusResponse) GetError() string {
+	if x != nil {
+		return x.Error
+	}
+	return ""
+}
+
+func (x *ReplicaRestoreStatusResponse) GetDestFileName() string {
+	if x != nil {
+		return x.DestFileName
+	}
+	return ""
+}
+
+func (x *ReplicaRestoreStatusResponse) GetState() string {
+	if x != nil {
+		return x.State
+	}
+	return ""
+}
+
+func (x *ReplicaRestoreStatusResponse) GetBackupUrl() string {
+	if x != nil {
+		return x.BackupUrl
+	}
+	return ""
+}
+
+func (x *ReplicaRestoreStatusResponse) GetCurrentRestoringBackup() string {
+	if x != nil {
+		return x.CurrentRestoringBackup
+	}
+	return ""
+}
+
+type RestoreStatusResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Status map[string]*ReplicaRestoreStatusResponse `protobuf:"bytes,1,rep,name=status,proto3" json:"status,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *RestoreStatusResponse) Reset() {
+	*x = RestoreStatusResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[38]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RestoreStatusResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RestoreStatusResponse) ProtoMessage() {}
+
+func (x *RestoreStatusResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[38]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RestoreStatusResponse.ProtoReflect.Descriptor instead.
+func (*RestoreStatusResponse) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{38}
+}
+
+func (x *RestoreStatusResponse) GetStatus() map[string]*ReplicaRestoreStatusResponse {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+type Disk struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id          string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Uuid        string `protobuf:"bytes,2,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	Path        string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"`
+	Type        string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"`
+	TotalSize   int64  `protobuf:"varint,5,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"`
+	FreeSize    int64  `protobuf:"varint,6,opt,name=free_size,json=freeSize,proto3" json:"free_size,omitempty"`
+	TotalBlocks int64  `protobuf:"varint,7,opt,name=total_blocks,json=totalBlocks,proto3" json:"total_blocks,omitempty"`
+	FreeBlocks  int64  `protobuf:"varint,8,opt,name=free_blocks,json=freeBlocks,proto3" json:"free_blocks,omitempty"`
+	BlockSize   int64  `protobuf:"varint,9,opt,name=block_size,json=blockSize,proto3" json:"block_size,omitempty"`
+	ClusterSize int64  `protobuf:"varint,10,opt,name=cluster_size,json=clusterSize,proto3" json:"cluster_size,omitempty"`
+	Driver      string `protobuf:"bytes,11,opt,name=driver,proto3" json:"driver,omitempty"`
+	Name        string `protobuf:"bytes,12,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *Disk) Reset() {
+	*x = Disk{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[39]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Disk) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Disk) ProtoMessage() {}
+
+func (x *Disk) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[39]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Disk.ProtoReflect.Descriptor instead.
+func (*Disk) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{39}
+}
+
+func (x *Disk) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *Disk) GetUuid() string {
+	if x != nil {
+		return x.Uuid
+	}
+	return ""
+}
+
+func (x *Disk) GetPath() string {
+	if x != nil {
+		return x.Path
+	}
+	return ""
+}
+
+func (x *Disk) GetType() string {
+	if x != nil {
+		return x.Type
+	}
+	return ""
+}
+
+func (x *Disk) GetTotalSize() int64 {
+	if x != nil {
+		return x.TotalSize
+	}
+	return 0
+}
+
+func (x *Disk) GetFreeSize() int64 {
+	if x != nil {
+		return x.FreeSize
+	}
+	return 0
+}
+
+func (x *Disk) GetTotalBlocks() int64 {
+	if x != nil {
+		return x.TotalBlocks
+	}
+	return 0
+}
+
+func (x *Disk) GetFreeBlocks() int64 {
+	if x != nil {
+		return x.FreeBlocks
+	}
+	return 0
+}
+
+func (x *Disk) GetBlockSize() int64 {
+	if x != nil {
+		return x.BlockSize
+	}
+	return 0
+}
+
+func (x *Disk) GetClusterSize() int64 {
+	if x != nil {
+		return x.ClusterSize
+	}
+	return 0
+}
+
+func (x *Disk) GetDriver() string {
+	if x != nil {
+		return x.Driver
+	}
+	return ""
+}
+
+func (x *Disk) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type DiskCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DiskName   string `protobuf:"bytes,1,opt,name=disk_name,json=diskName,proto3" json:"disk_name,omitempty"`
+	DiskUuid   string `protobuf:"bytes,2,opt,name=disk_uuid,json=diskUuid,proto3" json:"disk_uuid,omitempty"`
+	DiskPath   string `protobuf:"bytes,3,opt,name=disk_path,json=diskPath,proto3" json:"disk_path,omitempty"`
+	BlockSize  int64  `protobuf:"varint,4,opt,name=block_size,json=blockSize,proto3" json:"block_size,omitempty"`
+	DiskDriver string `protobuf:"bytes,5,opt,name=disk_driver,json=diskDriver,proto3" json:"disk_driver,omitempty"`
+}
+
+func (x *DiskCreateRequest) Reset() {
+	*x = DiskCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[40]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskCreateRequest) ProtoMessage() {}
+
+func (x *DiskCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[40]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskCreateRequest.ProtoReflect.Descriptor instead.
+func (*DiskCreateRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{40}
+}
+
+func (x *DiskCreateRequest) GetDiskName() string {
+	if x != nil {
+		return x.DiskName
+	}
+	return ""
+}
+
+func (x *DiskCreateRequest) GetDiskUuid() string {
+	if x != nil {
+		return x.DiskUuid
+	}
+	return ""
+}
+
+func (x *DiskCreateRequest) GetDiskPath() string {
+	if x != nil {
+		return x.DiskPath
+	}
+	return ""
+}
+
+func (x *DiskCreateRequest) GetBlockSize() int64 {
+	if x != nil {
+		return x.BlockSize
+	}
+	return 0
+}
+
+func (x *DiskCreateRequest) GetDiskDriver() string {
+	if x != nil {
+		return x.DiskDriver
+	}
+	return ""
+}
+
+type DiskGetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DiskName   string `protobuf:"bytes,1,opt,name=disk_name,json=diskName,proto3" json:"disk_name,omitempty"`
+	DiskDriver string `protobuf:"bytes,2,opt,name=disk_driver,json=diskDriver,proto3" json:"disk_driver,omitempty"`
+	DiskPath   string `protobuf:"bytes,3,opt,name=disk_path,json=diskPath,proto3" json:"disk_path,omitempty"`
+}
+
+func (x *DiskGetRequest) Reset() {
+	*x = DiskGetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[41]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskGetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskGetRequest) ProtoMessage() {}
+
+func (x *DiskGetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[41]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskGetRequest.ProtoReflect.Descriptor instead.
+func (*DiskGetRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{41}
+}
+
+func (x *DiskGetRequest) GetDiskName() string {
+	if x != nil {
+		return x.DiskName
+	}
+	return ""
+}
+
+func (x *DiskGetRequest) GetDiskDriver() string {
+	if x != nil {
+		return x.DiskDriver
+	}
+	return ""
+}
+
+func (x *DiskGetRequest) GetDiskPath() string {
+	if x != nil {
+		return x.DiskPath
+	}
+	return ""
+}
+
+type DiskDeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DiskName   string `protobuf:"bytes,1,opt,name=disk_name,json=diskName,proto3" json:"disk_name,omitempty"`
+	DiskUuid   string `protobuf:"bytes,2,opt,name=disk_uuid,json=diskUuid,proto3" json:"disk_uuid,omitempty"`
+	DiskPath   string `protobuf:"bytes,3,opt,name=disk_path,json=diskPath,proto3" json:"disk_path,omitempty"`
+	DiskDriver string `protobuf:"bytes,4,opt,name=disk_driver,json=diskDriver,proto3" json:"disk_driver,omitempty"`
+}
+
+func (x *DiskDeleteRequest) Reset() {
+	*x = DiskDeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[42]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DiskDeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DiskDeleteRequest) ProtoMessage() {}
+
+func (x *DiskDeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[42]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DiskDeleteRequest.ProtoReflect.Descriptor instead.
+func (*DiskDeleteRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{42}
+}
+
+func (x *DiskDeleteRequest) GetDiskName() string {
+	if x != nil {
+		return x.DiskName
+	}
+	return ""
+}
+
+func (x *DiskDeleteRequest) GetDiskUuid() string {
+	if x != nil {
+		return x.DiskUuid
+	}
+	return ""
+}
+
+func (x *DiskDeleteRequest) GetDiskPath() string {
+	if x != nil {
+		return x.DiskPath
+	}
+	return ""
+}
+
+func (x *DiskDeleteRequest) GetDiskDriver() string {
+	if x != nil {
+		return x.DiskDriver
+	}
+	return ""
+}
+
+type LogSetLevelRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Level string `protobuf:"bytes,1,opt,name=level,proto3" json:"level,omitempty"`
+}
+
+func (x *LogSetLevelRequest) Reset() {
+	*x = LogSetLevelRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[43]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LogSetLevelRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogSetLevelRequest) ProtoMessage() {}
+
+func (x *LogSetLevelRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[43]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LogSetLevelRequest.ProtoReflect.Descriptor instead.
+func (*LogSetLevelRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{43}
+}
+
+func (x *LogSetLevelRequest) GetLevel() string {
+	if x != nil {
+		return x.Level
+	}
+	return ""
+}
+
+type LogSetFlagsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Flags string `protobuf:"bytes,1,opt,name=flags,proto3" json:"flags,omitempty"`
+}
+
+func (x *LogSetFlagsRequest) Reset() {
+	*x = LogSetFlagsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[44]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LogSetFlagsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogSetFlagsRequest) ProtoMessage() {}
+
+func (x *LogSetFlagsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[44]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LogSetFlagsRequest.ProtoReflect.Descriptor instead.
+func (*LogSetFlagsRequest) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{44}
+}
+
+func (x *LogSetFlagsRequest) GetFlags() string {
+	if x != nil {
+		return x.Flags
+	}
+	return ""
+}
+
+type LogGetLevelResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Level string `protobuf:"bytes,1,opt,name=level,proto3" json:"level,omitempty"`
+}
+
+func (x *LogGetLevelResponse) Reset() {
+	*x = LogGetLevelResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[45]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LogGetLevelResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogGetLevelResponse) ProtoMessage() {}
+
+func (x *LogGetLevelResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[45]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LogGetLevelResponse.ProtoReflect.Descriptor instead.
+func (*LogGetLevelResponse) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{45}
+}
+
+func (x *LogGetLevelResponse) GetLevel() string {
+	if x != nil {
+		return x.Level
+	}
+	return ""
+}
+
+type LogGetFlagsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Flags string `protobuf:"bytes,1,opt,name=flags,proto3" json:"flags,omitempty"`
+}
+
+func (x *LogGetFlagsResponse) Reset() {
+	*x = LogGetFlagsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spdkrpc_spdk_proto_msgTypes[46]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LogGetFlagsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogGetFlagsResponse) ProtoMessage() {}
+
+func (x *LogGetFlagsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_spdkrpc_spdk_proto_msgTypes[46]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LogGetFlagsResponse.ProtoReflect.Descriptor instead.
+func (*LogGetFlagsResponse) Descriptor() ([]byte, []int) {
+	return file_spdkrpc_spdk_proto_rawDescGZIP(), []int{46}
+}
+
+func (x *LogGetFlagsResponse) GetFlags() string {
+	if x != nil {
+		return x.Flags
+	}
+	return ""
+}
+
+var File_spdkrpc_spdk_proto protoreflect.FileDescriptor
+
+var file_spdkrpc_spdk_proto_rawDesc = []byte{
+	0x0a, 0x12, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x70, 0x64, 0x6b, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x1a, 0x1b, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65,
+	0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc2, 0x02, 0x0a, 0x04, 0x4c,
+	0x76, 0x6f, 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, 0x75, 0x75, 0x69, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73,
+	0x70, 0x65, 0x63, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08,
+	0x73, 0x70, 0x65, 0x63, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x75,
+	0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61,
+	0x63, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72,
+	0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e,
+	0x74, 0x12, 0x37, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x06, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x76,
+	0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72,
+	0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12,
+	0x21, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18,
+	0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x64, 0x1a, 0x3b, 0x0a, 0x0d, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 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, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22,
+	0xdd, 0x03, 0x0a, 0x07, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
+	0x19, 0x0a, 0x08, 0x6c, 0x76, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x07, 0x6c, 0x76, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x76,
+	0x73, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x76,
+	0x73, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x73, 0x69,
+	0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x70, 0x65, 0x63, 0x53, 0x69,
+	0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a,
+	0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x53,
+	0x69, 0x7a, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x02, 0x69, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72,
+	0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61,
+	0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x08,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x6e, 0x64, 0x12, 0x21, 0x0a,
+	0x04, 0x68, 0x65, 0x61, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x70,
+	0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x76, 0x6f, 0x6c, 0x52, 0x04, 0x68, 0x65, 0x61, 0x64,
+	0x12, 0x3d, 0x0a, 0x09, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x0a, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x45,
+	0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12,
+	0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20,
+	0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x12,
+	0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d,
+	0x73, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d,
+	0x73, 0x67, 0x1a, 0x4b, 0x0a, 0x0e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x45,
+	0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e,
+	0x4c, 0x76, 0x6f, 0x6c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22,
+	0xc5, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x72, 0x65, 0x61, 0x74,
+	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, 0x19, 0x0a, 0x08,
+	0x6c, 0x76, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
+	0x6c, 0x76, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x76, 0x73, 0x5f, 0x75,
+	0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x76, 0x73, 0x55, 0x75,
+	0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x70, 0x65, 0x63, 0x53, 0x69, 0x7a, 0x65, 0x12,
+	0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,
+	0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, 0x72, 0x74,
+	0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x6f,
+	0x72, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x14, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x44, 0x65, 0x6c, 0x65, 0x74, 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, 0x29, 0x0a, 0x10, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x5f, 0x72,
+	0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63,
+	0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x27,
+	0x0a, 0x11, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x47, 0x65, 0x74, 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, 0xac, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x46, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x72,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x1a, 0x4d, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 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, 0x26, 0x0a, 0x05, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x70, 0x64, 0x6b,
+	0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x20, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x72, 0x63, 0x53,
+	0x74, 0x61, 0x72, 0x74, 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,
+	0x28, 0x0a, 0x10, 0x64, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x73, 0x74, 0x52, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x1b, 0x64, 0x73, 0x74,
+	0x5f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x76, 0x6f, 0x6c,
+	0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18,
+	0x64, 0x73, 0x74, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4c, 0x76, 0x6f,
+	0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x61, 0x0a, 0x21, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x72, 0x63,
+	0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 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, 0x28, 0x0a, 0x10, 0x64, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x73, 0x74,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x21,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e,
+	0x67, 0x53, 0x72, 0x63, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 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, 0x28, 0x0a, 0x10, 0x64, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0e, 0x64, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x12,
+	0x3d, 0x0a, 0x1b, 0x64, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e,
+	0x67, 0x5f, 0x6c, 0x76, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x64, 0x73, 0x74, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x69, 0x6e, 0x67, 0x4c, 0x76, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x61,
+	0x0a, 0x21, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64,
+	0x69, 0x6e, 0x67, 0x53, 0x72, 0x63, 0x44, 0x65, 0x74, 0x61, 0x63, 0x68, 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, 0x28, 0x0a, 0x10, 0x64, 0x73, 0x74, 0x5f, 0x72,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0e, 0x64, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4e, 0x61, 0x6d,
+	0x65, 0x22, 0x5c, 0x0a, 0x21, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x6e, 0x61, 0x70,
+	0x73, 0x68, 0x6f, 0x74, 0x53, 0x68, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x70, 0x79, 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, 0x23, 0x0a, 0x0d, 0x73, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22,
+	0x5f, 0x0a, 0x20, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x69, 0x6e, 0x67, 0x44, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 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, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73,
+	0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,
+	0x22, 0x3d, 0x0a, 0x21, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69,
+	0x6c, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22,
+	0x64, 0x0a, 0x21, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x69, 0x6e, 0x67, 0x44, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 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, 0x2b, 0x0a, 0x11, 0x75, 0x6e, 0x65, 0x78,
+	0x70, 0x6f, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0xfe, 0x05, 0x0a, 0x06, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d,
+	0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x73, 0x69,
+	0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x70, 0x65, 0x63, 0x53, 0x69,
+	0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a,
+	0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x53,
+	0x69, 0x7a, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x02, 0x69, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x56, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x07,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x45,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64,
+	0x72, 0x65, 0x73, 0x73, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x72, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4d, 0x61, 0x70, 0x12,
+	0x4d, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f,
+	0x6d, 0x61, 0x70, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x70, 0x64, 0x6b,
+	0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e,
+	0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x4d, 0x61, 0x70, 0x12, 0x21,
+	0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73,
+	0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x76, 0x6f, 0x6c, 0x52, 0x04, 0x68, 0x65, 0x61,
+	0x64, 0x12, 0x3c, 0x0a, 0x09, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x0a,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x45,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x45,
+	0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12,
+	0x1a, 0x0a, 0x08, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65,
+	0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65,
+	0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,
+	0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a,
+	0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x1a, 0x44, 0x0a, 0x16, 0x52, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 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, 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, 0x57, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4d, 0x6f, 0x64, 0x65, 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, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72,
+	0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4b, 0x0a, 0x0e, 0x53, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
+	0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73,
+	0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x76, 0x6f, 0x6c, 0x52, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcd, 0x02, 0x0a, 0x13, 0x45, 0x6e, 0x67, 0x69, 0x6e,
+	0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 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, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e,
+	0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x73, 0x69, 0x7a, 0x65,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x70, 0x65, 0x63, 0x53, 0x69, 0x7a, 0x65,
+	0x12, 0x63, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x61, 0x64, 0x64, 0x72,
+	0x65, 0x73, 0x73, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e,
+	0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74,
+	0x72, 0x79, 0x52, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65,
+	0x73, 0x73, 0x4d, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+	0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+	0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74,
+	0x1a, 0x44, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65,
+	0x73, 0x73, 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, 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, 0x29, 0x0a, 0x13, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 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, 0x22, 0x26, 0x0a, 0x10, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x47, 0x65, 0x74, 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, 0xa5, 0x01, 0x0a, 0x12, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x42, 0x0a, 0x07, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x28, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69,
+	0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x73, 0x1a, 0x4b, 0x0a, 0x0c, 0x45, 0x6e, 0x67, 0x69, 0x6e, 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, 0x25, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e,
+	0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
+	0x01, 0x22, 0x86, 0x01, 0x0a, 0x17, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a,
+	0x0b, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21,
+	0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4e, 0x61, 0x6d,
+	0x65, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x61, 0x64, 0x64,
+	0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3b, 0x0a, 0x18, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb8, 0x01, 0x0a, 0x19, 0x45, 0x6e, 0x67, 0x69,
+	0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70,
+	0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x73, 0x1a, 0x4d, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 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, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
+	0x38, 0x01, 0x22, 0x89, 0x01, 0x0a, 0x1a, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x4e, 0x61,
+	0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e,
+	0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x6d,
+	0x0a, 0x0f, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 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, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x73,
+	0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x37, 0x0a,
+	0x10, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68,
+	0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x87, 0x03, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x73, 0x69,
+	0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 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, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74,
+	0x12, 0x1c, 0x0a, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x24,
+	0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x41, 0x50, 0x49, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x41, 0x50, 0x49, 0x56, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6c, 0x69, 0x41, 0x50, 0x49, 0x4d, 0x69,
+	0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10,
+	0x63, 0x6c, 0x69, 0x41, 0x50, 0x49, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+	0x12, 0x32, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x41, 0x50,
+	0x49, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14,
+	0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x41, 0x50, 0x49, 0x56, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c,
+	0x65, 0x72, 0x41, 0x50, 0x49, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18,
+	0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65,
+	0x72, 0x41, 0x50, 0x49, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2c,
+	0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73,
+	0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, 0x46,
+	0x6f, 0x72, 0x6d, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x14,
+	0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x64, 0x61, 0x74, 0x61,
+	0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+	0x22, 0x49, 0x0a, 0x15, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69,
+	0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x30, 0x0a, 0x07, 0x76, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x70, 0x64,
+	0x6b, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70,
+	0x75, 0x74, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8a, 0x05, 0x0a, 0x13,
+	0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f,
+	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70,
+	0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x63, 0x6b,
+	0x75, 0x70, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0c, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1f, 0x0a,
+	0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12,
+	0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69,
+	0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x4e,
+	0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73,
+	0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x4c,
+	0x0a, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63,
+	0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x12,
+	0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+	0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x62, 0x61,
+	0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63,
+	0x6b, 0x73, 0x75, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x61, 0x63, 0x6b,
+	0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d,
+	0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4e, 0x61, 0x6d,
+	0x65, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+	0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63,
+	0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64,
+	0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c,
+	0x69, 0x6d, 0x69, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x63,
+	0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73,
+	0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+	0x43, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x72, 0x65,
+	0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 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, 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, 0x7e, 0x0a, 0x14, 0x42, 0x61, 0x63, 0x6b,
+	0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x16, 0x0a, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x69,
+	0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x0d, 0x69, 0x73, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12,
+	0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65,
+	0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x77, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b,
+	0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x16, 0x0a, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x67, 0x69, 0x6e,
+	0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
+	0x73, 0x22, 0xcb, 0x01, 0x0a, 0x14, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72,
+	0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72,
+	0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70,
+	0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x61, 0x63, 0x6b,
+	0x75, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x73,
+	0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65,
+	0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22,
+	0xc0, 0x02, 0x0a, 0x1a, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70,
+	0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d,
+	0x0a, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a,
+	0x0b, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23,
+	0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e,
+	0x61, 0x6d, 0x65, 0x12, 0x53, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61,
+	0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70,
+	0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65,
+	0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x72, 0x65,
+	0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x63, 0x72,
+	0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x63,
+	0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x05, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x69,
+	0x6d, 0x69, 0x74, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61,
+	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, 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, 0xa2, 0x01, 0x0a, 0x1b, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x63,
+	0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x48, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x45,
+	0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x1a, 0x39, 0x0a, 0x0b,
+	0x45, 0x72, 0x72, 0x6f, 0x72, 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, 0x43, 0x0a, 0x20, 0x45, 0x6e, 0x67, 0x69, 0x6e,
+	0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69,
+	0x6e, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0a, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc4, 0x02, 0x0a,
+	0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65,
+	0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a,
+	0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x72,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23,
+	0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e,
+	0x61, 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61,
+	0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70,
+	0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52,
+	0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x72,
+	0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x63,
+	0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e,
+	0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x05, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4c,
+	0x69, 0x6d, 0x69, 0x74, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69,
+	0x61, 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, 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, 0x37, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65,
+	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0a, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x40, 0x0a, 0x1b,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x72,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xf9,
+	0x02, 0x0a, 0x1c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72,
+	0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x21, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4e, 0x61,
+	0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x61, 0x64,
+	0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x69,
+	0x73, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x08, 0x52, 0x0b, 0x69, 0x73, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x23,
+	0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x73, 0x74, 0x6f,
+	0x72, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12,
+	0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x69,
+	0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64,
+	0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74,
+	0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18,
+	0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x55, 0x72, 0x6c,
+	0x12, 0x38, 0x0a, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x74,
+	0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0a, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x74, 0x6f,
+	0x72, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x22, 0xbd, 0x01, 0x0a, 0x15, 0x52,
+	0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x52,
+	0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x60, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74,
+	0x75, 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, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72,
+	0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72,
+	0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc0, 0x02, 0x0a, 0x04, 0x44,
+	0x69, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74,
+	0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12,
+	0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1b,
+	0x0a, 0x09, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x08, 0x66, 0x72, 0x65, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74,
+	0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x1f,
+	0x0a, 0x0b, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x0a, 0x66, 0x72, 0x65, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12,
+	0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x21,
+	0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0a,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x69, 0x7a,
+	0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xaa, 0x01,
+	0x0a, 0x11, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65,
+	0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1b, 0x0a,
+	0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c,
+	0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
+	0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x73,
+	0x6b, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,
+	0x64, 0x69, 0x73, 0x6b, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x22, 0x6b, 0x0a, 0x0e, 0x44, 0x69,
+	0x73, 0x6b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09,
+	0x64, 0x69, 0x73, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x64, 0x69, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x73,
+	0x6b, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,
+	0x64, 0x69, 0x73, 0x6b, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69,
+	0x73, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64,
+	0x69, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x22, 0x8b, 0x01, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x6b,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a,
+	0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69,
+	0x73, 0x6b, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64,
+	0x69, 0x73, 0x6b, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f,
+	0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b,
+	0x50, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x64, 0x72, 0x69,
+	0x76, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, 0x44,
+	0x72, 0x69, 0x76, 0x65, 0x72, 0x22, 0x2a, 0x0a, 0x12, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c,
+	0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c,
+	0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65,
+	0x6c, 0x22, 0x2a, 0x0a, 0x12, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x22, 0x2b, 0x0a,
+	0x13, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x2b, 0x0a, 0x13, 0x4c, 0x6f,
+	0x67, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2a, 0x26, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x06, 0x0a, 0x02, 0x57, 0x4f, 0x10, 0x00, 0x12, 0x06,
+	0x0a, 0x02, 0x52, 0x57, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x52, 0x52, 0x10, 0x02, 0x32,
+	0x99, 0x1c, 0x0a, 0x0b, 0x53, 0x50, 0x44, 0x4b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
+	0x40, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x12, 0x1d, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x10, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x12, 0x46, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x12, 0x1d, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x0a, 0x52, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x47, 0x65, 0x74, 0x12, 0x1a, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70,
+	0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x43, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x18,
+	0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72,
+	0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x49, 0x0a, 0x15, 0x52, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x49, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x12, 0x18,
+	0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
+	0x12, 0x43, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x12,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70,
+	0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x57, 0x61, 0x74, 0x63, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x60, 0x0a, 0x19, 0x52, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x72,
+	0x63, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x29, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63,
+	0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69,
+	0x6e, 0x67, 0x53, 0x72, 0x63, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x1a, 0x52,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67,
+	0x53, 0x72, 0x63, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x64, 0x6b,
+	0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69,
+	0x6c, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x72, 0x63, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12,
+	0x62, 0x0a, 0x1a, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x69, 0x6e, 0x67, 0x53, 0x72, 0x63, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x12, 0x2a, 0x2e,
+	0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52,
+	0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x72, 0x63, 0x41, 0x74, 0x74, 0x61,
+	0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x1a, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65,
+	0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x72, 0x63, 0x44, 0x65, 0x74, 0x61, 0x63,
+	0x68, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x72, 0x63,
+	0x44, 0x65, 0x74, 0x61, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x1a, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x68, 0x61, 0x6c, 0x6c, 0x6f,
+	0x77, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53,
+	0x68, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x74, 0x0a, 0x19, 0x52, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x73,
+	0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x29, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63,
+	0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69,
+	0x6e, 0x67, 0x44, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x2a, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x73, 0x74,
+	0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x62, 0x0a, 0x1a, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c,
+	0x64, 0x69, 0x6e, 0x67, 0x44, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x12, 0x2a, 0x2e,
+	0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52,
+	0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x73, 0x74, 0x46, 0x69, 0x6e, 0x69,
+	0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x22, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65,
+	0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73,
+	0x68, 0x6f, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x70, 0x64, 0x6b,
+	0x72, 0x70, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x56, 0x0a, 0x22, 0x52,
+	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67,
+	0x44, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x76, 0x65, 0x72,
+	0x74, 0x12, 0x18, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70,
+	0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
+	0x70, 0x74, 0x79, 0x12, 0x54, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x42, 0x61,
+	0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x73, 0x70, 0x64,
+	0x6b, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72,
+	0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x13, 0x52, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x1c, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75,
+	0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
+	0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x56, 0x0a, 0x14, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70,
+	0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x24, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70,
+	0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52,
+	0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x14, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x24, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63,
+	0x61, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3d,
+	0x0a, 0x0c, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1c,
+	0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x73,
+	0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x12, 0x44, 0x0a,
+	0x0c, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1c, 0x2e,
+	0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
+	0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x09, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x47, 0x65, 0x74,
+	0x12, 0x19, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e,
+	0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x73, 0x70,
+	0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x12, 0x4b, 0x0a, 0x14,
+	0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x53,
+	0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19,
+	0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x14, 0x45, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x12, 0x18, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70,
+	0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
+	0x70, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x14, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x53, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x12, 0x18, 0x2e, 0x73, 0x70,
+	0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x41, 0x0a,
+	0x0a, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
+	0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e,
+	0x67, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x41, 0x0a, 0x0b, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x57, 0x61, 0x74, 0x63, 0x68, 0x12,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
+	0x00, 0x30, 0x01, 0x12, 0x5c, 0x0a, 0x11, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x21, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72,
+	0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x73, 0x70,
+	0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x00, 0x12, 0x4e, 0x0a, 0x10, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x41, 0x64, 0x64, 0x12, 0x20, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e,
+	0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x41, 0x64, 0x64,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
+	0x00, 0x12, 0x54, 0x0a, 0x13, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72,
+	0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x12, 0x45, 0x6e, 0x67, 0x69, 0x6e,
+	0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e,
+	0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x73, 0x70,
+	0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x12,
+	0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63,
+	0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x1d, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75,
+	0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x00, 0x12, 0x62, 0x0a, 0x13, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75,
+	0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x23, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72,
+	0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52,
+	0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e,
+	0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x61,
+	0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x19, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42,
+	0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6e, 0x69,
+	0x73, 0x68, 0x12, 0x29, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x6e, 0x67,
+	0x69, 0x6e, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65,
+	0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x13, 0x45, 0x6e, 0x67, 0x69, 0x6e,
+	0x65, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d,
+	0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65,
+	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e,
+	0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x37, 0x0a, 0x0a, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e,
+	0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x73, 0x70, 0x64, 0x6b,
+	0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x12, 0x40, 0x0a, 0x0a, 0x44, 0x69, 0x73, 0x6b,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63,
+	0x2e, 0x44, 0x69, 0x73, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x07, 0x44, 0x69,
+	0x73, 0x6b, 0x47, 0x65, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e,
+	0x44, 0x69, 0x73, 0x6b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d,
+	0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x12, 0x42, 0x0a,
+	0x0b, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1b, 0x2e, 0x73,
+	0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c, 0x65, 0x76,
+	0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x12, 0x42, 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73,
+	0x12, 0x1b, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x65,
+	0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x4c,
+	0x65, 0x76, 0x65, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x73,
+	0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x76,
+	0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0b, 0x4c, 0x6f,
+	0x67, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x1a, 0x1c, 0x2e, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x47,
+	0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x4a, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c,
+	0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1e, 0x2e, 0x73, 0x70,
+	0x64, 0x6b, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74,
+	0x61, 0x69, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x31, 0x5a, 0x2f, 0x67,
+	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x68, 0x6f,
+	0x72, 0x6e, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67, 0x65, 0x6e,
+	0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2f, 0x73, 0x70, 0x64, 0x6b, 0x72, 0x70, 0x63, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_spdkrpc_spdk_proto_rawDescOnce sync.Once
+	file_spdkrpc_spdk_proto_rawDescData = file_spdkrpc_spdk_proto_rawDesc
+)
+
+func file_spdkrpc_spdk_proto_rawDescGZIP() []byte {
+	file_spdkrpc_spdk_proto_rawDescOnce.Do(func() {
+		file_spdkrpc_spdk_proto_rawDescData = protoimpl.X.CompressGZIP(file_spdkrpc_spdk_proto_rawDescData)
+	})
+	return file_spdkrpc_spdk_proto_rawDescData
+}
+
+var file_spdkrpc_spdk_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_spdkrpc_spdk_proto_msgTypes = make([]protoimpl.MessageInfo, 61)
+var file_spdkrpc_spdk_proto_goTypes = []interface{}{
+	(ReplicaMode)(0),                          // 0: spdkrpc.ReplicaMode
+	(*Lvol)(nil),                              // 1: spdkrpc.Lvol
+	(*Replica)(nil),                           // 2: spdkrpc.Replica
+	(*ReplicaCreateRequest)(nil),              // 3: spdkrpc.ReplicaCreateRequest
+	(*ReplicaDeleteRequest)(nil),              // 4: spdkrpc.ReplicaDeleteRequest
+	(*ReplicaGetRequest)(nil),                 // 5: spdkrpc.ReplicaGetRequest
+	(*ReplicaListResponse)(nil),               // 6: spdkrpc.ReplicaListResponse
+	(*ReplicaRebuildingSrcStartRequest)(nil),  // 7: spdkrpc.ReplicaRebuildingSrcStartRequest
+	(*ReplicaRebuildingSrcFinishRequest)(nil), // 8: spdkrpc.ReplicaRebuildingSrcFinishRequest
+	(*ReplicaRebuildingSrcAttachRequest)(nil), // 9: spdkrpc.ReplicaRebuildingSrcAttachRequest
+	(*ReplicaRebuildingSrcDetachRequest)(nil), // 10: spdkrpc.ReplicaRebuildingSrcDetachRequest
+	(*ReplicaSnapshotShallowCopyRequest)(nil), // 11: spdkrpc.ReplicaSnapshotShallowCopyRequest
+	(*ReplicaRebuildingDstStartRequest)(nil),  // 12: spdkrpc.ReplicaRebuildingDstStartRequest
+	(*ReplicaRebuildingDstStartResponse)(nil), // 13: spdkrpc.ReplicaRebuildingDstStartResponse
+	(*ReplicaRebuildingDstFinishRequest)(nil), // 14: spdkrpc.ReplicaRebuildingDstFinishRequest
+	(*Engine)(nil),                            // 15: spdkrpc.Engine
+	(*EngineCreateRequest)(nil),               // 16: spdkrpc.EngineCreateRequest
+	(*EngineDeleteRequest)(nil),               // 17: spdkrpc.EngineDeleteRequest
+	(*EngineGetRequest)(nil),                  // 18: spdkrpc.EngineGetRequest
+	(*EngineListResponse)(nil),                // 19: spdkrpc.EngineListResponse
+	(*EngineReplicaAddRequest)(nil),           // 20: spdkrpc.EngineReplicaAddRequest
+	(*EngineReplicaListRequest)(nil),          // 21: spdkrpc.EngineReplicaListRequest
+	(*EngineReplicaListResponse)(nil),         // 22: spdkrpc.EngineReplicaListResponse
+	(*EngineReplicaDeleteRequest)(nil),        // 23: spdkrpc.EngineReplicaDeleteRequest
+	(*SnapshotRequest)(nil),                   // 24: spdkrpc.SnapshotRequest
+	(*SnapshotResponse)(nil),                  // 25: spdkrpc.SnapshotResponse
+	(*VersionOutput)(nil),                     // 26: spdkrpc.VersionOutput
+	(*VersionDetailGetReply)(nil),             // 27: spdkrpc.VersionDetailGetReply
+	(*BackupCreateRequest)(nil),               // 28: spdkrpc.BackupCreateRequest
+	(*BackupCreateResponse)(nil),              // 29: spdkrpc.BackupCreateResponse
+	(*BackupStatusRequest)(nil),               // 30: spdkrpc.BackupStatusRequest
+	(*BackupStatusResponse)(nil),              // 31: spdkrpc.BackupStatusResponse
+	(*EngineBackupRestoreRequest)(nil),        // 32: spdkrpc.EngineBackupRestoreRequest
+	(*EngineBackupRestoreResponse)(nil),       // 33: spdkrpc.EngineBackupRestoreResponse
+	(*EngineBackupRestoreFinishRequest)(nil),  // 34: spdkrpc.EngineBackupRestoreFinishRequest
+	(*ReplicaBackupRestoreRequest)(nil),       // 35: spdkrpc.ReplicaBackupRestoreRequest
+	(*RestoreStatusRequest)(nil),              // 36: spdkrpc.RestoreStatusRequest
+	(*ReplicaRestoreStatusRequest)(nil),       // 37: spdkrpc.ReplicaRestoreStatusRequest
+	(*ReplicaRestoreStatusResponse)(nil),      // 38: spdkrpc.ReplicaRestoreStatusResponse
+	(*RestoreStatusResponse)(nil),             // 39: spdkrpc.RestoreStatusResponse
+	(*Disk)(nil),                              // 40: spdkrpc.Disk
+	(*DiskCreateRequest)(nil),                 // 41: spdkrpc.DiskCreateRequest
+	(*DiskGetRequest)(nil),                    // 42: spdkrpc.DiskGetRequest
+	(*DiskDeleteRequest)(nil),                 // 43: spdkrpc.DiskDeleteRequest
+	(*LogSetLevelRequest)(nil),                // 44: spdkrpc.LogSetLevelRequest
+	(*LogSetFlagsRequest)(nil),                // 45: spdkrpc.LogSetFlagsRequest
+	(*LogGetLevelResponse)(nil),               // 46: spdkrpc.LogGetLevelResponse
+	(*LogGetFlagsResponse)(nil),               // 47: spdkrpc.LogGetFlagsResponse
+	nil,                                       // 48: spdkrpc.Lvol.ChildrenEntry
+	nil,                                       // 49: spdkrpc.Replica.SnapshotsEntry
+	nil,                                       // 50: spdkrpc.ReplicaListResponse.ReplicasEntry
+	nil,                                       // 51: spdkrpc.Engine.ReplicaAddressMapEntry
+	nil,                                       // 52: spdkrpc.Engine.ReplicaModeMapEntry
+	nil,                                       // 53: spdkrpc.Engine.SnapshotsEntry
+	nil,                                       // 54: spdkrpc.EngineCreateRequest.ReplicaAddressMapEntry
+	nil,                                       // 55: spdkrpc.EngineListResponse.EnginesEntry
+	nil,                                       // 56: spdkrpc.EngineReplicaListResponse.ReplicasEntry
+	nil,                                       // 57: spdkrpc.BackupCreateRequest.CredentialEntry
+	nil,                                       // 58: spdkrpc.EngineBackupRestoreRequest.CredentialEntry
+	nil,                                       // 59: spdkrpc.EngineBackupRestoreResponse.ErrorsEntry
+	nil,                                       // 60: spdkrpc.ReplicaBackupRestoreRequest.CredentialEntry
+	nil,                                       // 61: spdkrpc.RestoreStatusResponse.StatusEntry
+	(*emptypb.Empty)(nil),                     // 62: google.protobuf.Empty
+}
+var file_spdkrpc_spdk_proto_depIdxs = []int32{
+	48, // 0: spdkrpc.Lvol.children:type_name -> spdkrpc.Lvol.ChildrenEntry
+	1,  // 1: spdkrpc.Replica.head:type_name -> spdkrpc.Lvol
+	49, // 2: spdkrpc.Replica.snapshots:type_name -> spdkrpc.Replica.SnapshotsEntry
+	50, // 3: spdkrpc.ReplicaListResponse.replicas:type_name -> spdkrpc.ReplicaListResponse.ReplicasEntry
+	51, // 4: spdkrpc.Engine.replica_address_map:type_name -> spdkrpc.Engine.ReplicaAddressMapEntry
+	52, // 5: spdkrpc.Engine.replica_mode_map:type_name -> spdkrpc.Engine.ReplicaModeMapEntry
+	1,  // 6: spdkrpc.Engine.head:type_name -> spdkrpc.Lvol
+	53, // 7: spdkrpc.Engine.snapshots:type_name -> spdkrpc.Engine.SnapshotsEntry
+	54, // 8: spdkrpc.EngineCreateRequest.replica_address_map:type_name -> spdkrpc.EngineCreateRequest.ReplicaAddressMapEntry
+	55, // 9: spdkrpc.EngineListResponse.engines:type_name -> spdkrpc.EngineListResponse.EnginesEntry
+	56, // 10: spdkrpc.EngineReplicaListResponse.replicas:type_name -> spdkrpc.EngineReplicaListResponse.ReplicasEntry
+	26, // 11: spdkrpc.VersionDetailGetReply.version:type_name -> spdkrpc.VersionOutput
+	57, // 12: spdkrpc.BackupCreateRequest.credential:type_name -> spdkrpc.BackupCreateRequest.CredentialEntry
+	58, // 13: spdkrpc.EngineBackupRestoreRequest.credential:type_name -> spdkrpc.EngineBackupRestoreRequest.CredentialEntry
+	59, // 14: spdkrpc.EngineBackupRestoreResponse.errors:type_name -> spdkrpc.EngineBackupRestoreResponse.ErrorsEntry
+	60, // 15: spdkrpc.ReplicaBackupRestoreRequest.credential:type_name -> spdkrpc.ReplicaBackupRestoreRequest.CredentialEntry
+	61, // 16: spdkrpc.RestoreStatusResponse.status:type_name -> spdkrpc.RestoreStatusResponse.StatusEntry
+	1,  // 17: spdkrpc.Replica.SnapshotsEntry.value:type_name -> spdkrpc.Lvol
+	2,  // 18: spdkrpc.ReplicaListResponse.ReplicasEntry.value:type_name -> spdkrpc.Replica
+	0,  // 19: spdkrpc.Engine.ReplicaModeMapEntry.value:type_name -> spdkrpc.ReplicaMode
+	1,  // 20: spdkrpc.Engine.SnapshotsEntry.value:type_name -> spdkrpc.Lvol
+	15, // 21: spdkrpc.EngineListResponse.EnginesEntry.value:type_name -> spdkrpc.Engine
+	2,  // 22: spdkrpc.EngineReplicaListResponse.ReplicasEntry.value:type_name -> spdkrpc.Replica
+	38, // 23: spdkrpc.RestoreStatusResponse.StatusEntry.value:type_name -> spdkrpc.ReplicaRestoreStatusResponse
+	3,  // 24: spdkrpc.SPDKService.ReplicaCreate:input_type -> spdkrpc.ReplicaCreateRequest
+	4,  // 25: spdkrpc.SPDKService.ReplicaDelete:input_type -> spdkrpc.ReplicaDeleteRequest
+	5,  // 26: spdkrpc.SPDKService.ReplicaGet:input_type -> spdkrpc.ReplicaGetRequest
+	24, // 27: spdkrpc.SPDKService.ReplicaSnapshotCreate:input_type -> spdkrpc.SnapshotRequest
+	24, // 28: spdkrpc.SPDKService.ReplicaSnapshotDelete:input_type -> spdkrpc.SnapshotRequest
+	24, // 29: spdkrpc.SPDKService.ReplicaSnapshotRevert:input_type -> spdkrpc.SnapshotRequest
+	62, // 30: spdkrpc.SPDKService.ReplicaList:input_type -> google.protobuf.Empty
+	62, // 31: spdkrpc.SPDKService.ReplicaWatch:input_type -> google.protobuf.Empty
+	7,  // 32: spdkrpc.SPDKService.ReplicaRebuildingSrcStart:input_type -> spdkrpc.ReplicaRebuildingSrcStartRequest
+	8,  // 33: spdkrpc.SPDKService.ReplicaRebuildingSrcFinish:input_type -> spdkrpc.ReplicaRebuildingSrcFinishRequest
+	9,  // 34: spdkrpc.SPDKService.ReplicaRebuildingSrcAttach:input_type -> spdkrpc.ReplicaRebuildingSrcAttachRequest
+	10, // 35: spdkrpc.SPDKService.ReplicaRebuildingSrcDetach:input_type -> spdkrpc.ReplicaRebuildingSrcDetachRequest
+	11, // 36: spdkrpc.SPDKService.ReplicaSnapshotShallowCopy:input_type -> spdkrpc.ReplicaSnapshotShallowCopyRequest
+	12, // 37: spdkrpc.SPDKService.ReplicaRebuildingDstStart:input_type -> spdkrpc.ReplicaRebuildingDstStartRequest
+	14, // 38: spdkrpc.SPDKService.ReplicaRebuildingDstFinish:input_type -> spdkrpc.ReplicaRebuildingDstFinishRequest
+	24, // 39: spdkrpc.SPDKService.ReplicaRebuildingDstSnapshotCreate:input_type -> spdkrpc.SnapshotRequest
+	24, // 40: spdkrpc.SPDKService.ReplicaRebuildingDstSnapshotRevert:input_type -> spdkrpc.SnapshotRequest
+	28, // 41: spdkrpc.SPDKService.ReplicaBackupCreate:input_type -> spdkrpc.BackupCreateRequest
+	30, // 42: spdkrpc.SPDKService.ReplicaBackupStatus:input_type -> spdkrpc.BackupStatusRequest
+	35, // 43: spdkrpc.SPDKService.ReplicaBackupRestore:input_type -> spdkrpc.ReplicaBackupRestoreRequest
+	37, // 44: spdkrpc.SPDKService.ReplicaRestoreStatus:input_type -> spdkrpc.ReplicaRestoreStatusRequest
+	16, // 45: spdkrpc.SPDKService.EngineCreate:input_type -> spdkrpc.EngineCreateRequest
+	17, // 46: spdkrpc.SPDKService.EngineDelete:input_type -> spdkrpc.EngineDeleteRequest
+	18, // 47: spdkrpc.SPDKService.EngineGet:input_type -> spdkrpc.EngineGetRequest
+	24, // 48: spdkrpc.SPDKService.EngineSnapshotCreate:input_type -> spdkrpc.SnapshotRequest
+	24, // 49: spdkrpc.SPDKService.EngineSnapshotDelete:input_type -> spdkrpc.SnapshotRequest
+	24, // 50: spdkrpc.SPDKService.EngineSnapshotRevert:input_type -> spdkrpc.SnapshotRequest
+	62, // 51: spdkrpc.SPDKService.EngineList:input_type -> google.protobuf.Empty
+	62, // 52: spdkrpc.SPDKService.EngineWatch:input_type -> google.protobuf.Empty
+	21, // 53: spdkrpc.SPDKService.EngineReplicaList:input_type -> spdkrpc.EngineReplicaListRequest
+	20, // 54: spdkrpc.SPDKService.EngineReplicaAdd:input_type -> spdkrpc.EngineReplicaAddRequest
+	23, // 55: spdkrpc.SPDKService.EngineReplicaDelete:input_type -> spdkrpc.EngineReplicaDeleteRequest
+	28, // 56: spdkrpc.SPDKService.EngineBackupCreate:input_type -> spdkrpc.BackupCreateRequest
+	30, // 57: spdkrpc.SPDKService.EngineBackupStatus:input_type -> spdkrpc.BackupStatusRequest
+	32, // 58: spdkrpc.SPDKService.EngineBackupRestore:input_type -> spdkrpc.EngineBackupRestoreRequest
+	34, // 59: spdkrpc.SPDKService.EngineBackupRestoreFinish:input_type -> spdkrpc.EngineBackupRestoreFinishRequest
+	36, // 60: spdkrpc.SPDKService.EngineRestoreStatus:input_type -> spdkrpc.RestoreStatusRequest
+	41, // 61: spdkrpc.SPDKService.DiskCreate:input_type -> spdkrpc.DiskCreateRequest
+	43, // 62: spdkrpc.SPDKService.DiskDelete:input_type -> spdkrpc.DiskDeleteRequest
+	42, // 63: spdkrpc.SPDKService.DiskGet:input_type -> spdkrpc.DiskGetRequest
+	44, // 64: spdkrpc.SPDKService.LogSetLevel:input_type -> spdkrpc.LogSetLevelRequest
+	45, // 65: spdkrpc.SPDKService.LogSetFlags:input_type -> spdkrpc.LogSetFlagsRequest
+	62, // 66: spdkrpc.SPDKService.LogGetLevel:input_type -> google.protobuf.Empty
+	62, // 67: spdkrpc.SPDKService.LogGetFlags:input_type -> google.protobuf.Empty
+	62, // 68: spdkrpc.SPDKService.VersionDetailGet:input_type -> google.protobuf.Empty
+	2,  // 69: spdkrpc.SPDKService.ReplicaCreate:output_type -> spdkrpc.Replica
+	62, // 70: spdkrpc.SPDKService.ReplicaDelete:output_type -> google.protobuf.Empty
+	2,  // 71: spdkrpc.SPDKService.ReplicaGet:output_type -> spdkrpc.Replica
+	2,  // 72: spdkrpc.SPDKService.ReplicaSnapshotCreate:output_type -> spdkrpc.Replica
+	62, // 73: spdkrpc.SPDKService.ReplicaSnapshotDelete:output_type -> google.protobuf.Empty
+	62, // 74: spdkrpc.SPDKService.ReplicaSnapshotRevert:output_type -> google.protobuf.Empty
+	6,  // 75: spdkrpc.SPDKService.ReplicaList:output_type -> spdkrpc.ReplicaListResponse
+	62, // 76: spdkrpc.SPDKService.ReplicaWatch:output_type -> google.protobuf.Empty
+	62, // 77: spdkrpc.SPDKService.ReplicaRebuildingSrcStart:output_type -> google.protobuf.Empty
+	62, // 78: spdkrpc.SPDKService.ReplicaRebuildingSrcFinish:output_type -> google.protobuf.Empty
+	62, // 79: spdkrpc.SPDKService.ReplicaRebuildingSrcAttach:output_type -> google.protobuf.Empty
+	62, // 80: spdkrpc.SPDKService.ReplicaRebuildingSrcDetach:output_type -> google.protobuf.Empty
+	62, // 81: spdkrpc.SPDKService.ReplicaSnapshotShallowCopy:output_type -> google.protobuf.Empty
+	13, // 82: spdkrpc.SPDKService.ReplicaRebuildingDstStart:output_type -> spdkrpc.ReplicaRebuildingDstStartResponse
+	62, // 83: spdkrpc.SPDKService.ReplicaRebuildingDstFinish:output_type -> google.protobuf.Empty
+	62, // 84: spdkrpc.SPDKService.ReplicaRebuildingDstSnapshotCreate:output_type -> google.protobuf.Empty
+	62, // 85: spdkrpc.SPDKService.ReplicaRebuildingDstSnapshotRevert:output_type -> google.protobuf.Empty
+	29, // 86: spdkrpc.SPDKService.ReplicaBackupCreate:output_type -> spdkrpc.BackupCreateResponse
+	31, // 87: spdkrpc.SPDKService.ReplicaBackupStatus:output_type -> spdkrpc.BackupStatusResponse
+	62, // 88: spdkrpc.SPDKService.ReplicaBackupRestore:output_type -> google.protobuf.Empty
+	38, // 89: spdkrpc.SPDKService.ReplicaRestoreStatus:output_type -> spdkrpc.ReplicaRestoreStatusResponse
+	15, // 90: spdkrpc.SPDKService.EngineCreate:output_type -> spdkrpc.Engine
+	62, // 91: spdkrpc.SPDKService.EngineDelete:output_type -> google.protobuf.Empty
+	15, // 92: spdkrpc.SPDKService.EngineGet:output_type -> spdkrpc.Engine
+	25, // 93: spdkrpc.SPDKService.EngineSnapshotCreate:output_type -> spdkrpc.SnapshotResponse
+	62, // 94: spdkrpc.SPDKService.EngineSnapshotDelete:output_type -> google.protobuf.Empty
+	62, // 95: spdkrpc.SPDKService.EngineSnapshotRevert:output_type -> google.protobuf.Empty
+	19, // 96: spdkrpc.SPDKService.EngineList:output_type -> spdkrpc.EngineListResponse
+	62, // 97: spdkrpc.SPDKService.EngineWatch:output_type -> google.protobuf.Empty
+	22, // 98: spdkrpc.SPDKService.EngineReplicaList:output_type -> spdkrpc.EngineReplicaListResponse
+	62, // 99: spdkrpc.SPDKService.EngineReplicaAdd:output_type -> google.protobuf.Empty
+	62, // 100: spdkrpc.SPDKService.EngineReplicaDelete:output_type -> google.protobuf.Empty
+	29, // 101: spdkrpc.SPDKService.EngineBackupCreate:output_type -> spdkrpc.BackupCreateResponse
+	31, // 102: spdkrpc.SPDKService.EngineBackupStatus:output_type -> spdkrpc.BackupStatusResponse
+	33, // 103: spdkrpc.SPDKService.EngineBackupRestore:output_type -> spdkrpc.EngineBackupRestoreResponse
+	62, // 104: spdkrpc.SPDKService.EngineBackupRestoreFinish:output_type -> google.protobuf.Empty
+	39, // 105: spdkrpc.SPDKService.EngineRestoreStatus:output_type -> spdkrpc.RestoreStatusResponse
+	40, // 106: spdkrpc.SPDKService.DiskCreate:output_type -> spdkrpc.Disk
+	62, // 107: spdkrpc.SPDKService.DiskDelete:output_type -> google.protobuf.Empty
+	40, // 108: spdkrpc.SPDKService.DiskGet:output_type -> spdkrpc.Disk
+	62, // 109: spdkrpc.SPDKService.LogSetLevel:output_type -> google.protobuf.Empty
+	62, // 110: spdkrpc.SPDKService.LogSetFlags:output_type -> google.protobuf.Empty
+	46, // 111: spdkrpc.SPDKService.LogGetLevel:output_type -> spdkrpc.LogGetLevelResponse
+	47, // 112: spdkrpc.SPDKService.LogGetFlags:output_type -> spdkrpc.LogGetFlagsResponse
+	27, // 113: spdkrpc.SPDKService.VersionDetailGet:output_type -> spdkrpc.VersionDetailGetReply
+	69, // [69:114] is the sub-list for method output_type
+	24, // [24:69] is the sub-list for method input_type
+	24, // [24:24] is the sub-list for extension type_name
+	24, // [24:24] is the sub-list for extension extendee
+	0,  // [0:24] is the sub-list for field type_name
+}
+
+func init() { file_spdkrpc_spdk_proto_init() }
+func file_spdkrpc_spdk_proto_init() {
+	if File_spdkrpc_spdk_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_spdkrpc_spdk_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Lvol); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Replica); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaDeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaGetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaRebuildingSrcStartRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaRebuildingSrcFinishRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaRebuildingSrcAttachRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaRebuildingSrcDetachRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaSnapshotShallowCopyRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaRebuildingDstStartRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaRebuildingDstStartResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaRebuildingDstFinishRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Engine); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineDeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineGetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineReplicaAddRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineReplicaListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineReplicaListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineReplicaDeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SnapshotRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SnapshotResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VersionOutput); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*VersionDetailGetReply); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackupCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackupCreateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackupStatusRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BackupStatusResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineBackupRestoreRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineBackupRestoreResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EngineBackupRestoreFinishRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaBackupRestoreRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RestoreStatusRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaRestoreStatusRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReplicaRestoreStatusResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RestoreStatusResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Disk); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskGetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DiskDeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LogSetLevelRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LogSetFlagsRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LogGetLevelResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spdkrpc_spdk_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LogGetFlagsResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_spdkrpc_spdk_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   61,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_spdkrpc_spdk_proto_goTypes,
+		DependencyIndexes: file_spdkrpc_spdk_proto_depIdxs,
+		EnumInfos:         file_spdkrpc_spdk_proto_enumTypes,
+		MessageInfos:      file_spdkrpc_spdk_proto_msgTypes,
+	}.Build()
+	File_spdkrpc_spdk_proto = out.File
+	file_spdkrpc_spdk_proto_rawDesc = nil
+	file_spdkrpc_spdk_proto_goTypes = nil
+	file_spdkrpc_spdk_proto_depIdxs = nil
+}
diff --git a/pkg/generated/spdkrpc/spdk_grpc.pb.go b/pkg/generated/spdkrpc/spdk_grpc.pb.go
new file mode 100644
index 0000000..4a93219
--- /dev/null
+++ b/pkg/generated/spdkrpc/spdk_grpc.pb.go
@@ -0,0 +1,1793 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v4.24.3
+// source: spdkrpc/spdk.proto
+
+package spdkrpc
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+	SPDKService_ReplicaCreate_FullMethodName                      = "/spdkrpc.SPDKService/ReplicaCreate"
+	SPDKService_ReplicaDelete_FullMethodName                      = "/spdkrpc.SPDKService/ReplicaDelete"
+	SPDKService_ReplicaGet_FullMethodName                         = "/spdkrpc.SPDKService/ReplicaGet"
+	SPDKService_ReplicaSnapshotCreate_FullMethodName              = "/spdkrpc.SPDKService/ReplicaSnapshotCreate"
+	SPDKService_ReplicaSnapshotDelete_FullMethodName              = "/spdkrpc.SPDKService/ReplicaSnapshotDelete"
+	SPDKService_ReplicaSnapshotRevert_FullMethodName              = "/spdkrpc.SPDKService/ReplicaSnapshotRevert"
+	SPDKService_ReplicaList_FullMethodName                        = "/spdkrpc.SPDKService/ReplicaList"
+	SPDKService_ReplicaWatch_FullMethodName                       = "/spdkrpc.SPDKService/ReplicaWatch"
+	SPDKService_ReplicaRebuildingSrcStart_FullMethodName          = "/spdkrpc.SPDKService/ReplicaRebuildingSrcStart"
+	SPDKService_ReplicaRebuildingSrcFinish_FullMethodName         = "/spdkrpc.SPDKService/ReplicaRebuildingSrcFinish"
+	SPDKService_ReplicaRebuildingSrcAttach_FullMethodName         = "/spdkrpc.SPDKService/ReplicaRebuildingSrcAttach"
+	SPDKService_ReplicaRebuildingSrcDetach_FullMethodName         = "/spdkrpc.SPDKService/ReplicaRebuildingSrcDetach"
+	SPDKService_ReplicaSnapshotShallowCopy_FullMethodName         = "/spdkrpc.SPDKService/ReplicaSnapshotShallowCopy"
+	SPDKService_ReplicaRebuildingDstStart_FullMethodName          = "/spdkrpc.SPDKService/ReplicaRebuildingDstStart"
+	SPDKService_ReplicaRebuildingDstFinish_FullMethodName         = "/spdkrpc.SPDKService/ReplicaRebuildingDstFinish"
+	SPDKService_ReplicaRebuildingDstSnapshotCreate_FullMethodName = "/spdkrpc.SPDKService/ReplicaRebuildingDstSnapshotCreate"
+	SPDKService_ReplicaRebuildingDstSnapshotRevert_FullMethodName = "/spdkrpc.SPDKService/ReplicaRebuildingDstSnapshotRevert"
+	SPDKService_ReplicaBackupCreate_FullMethodName                = "/spdkrpc.SPDKService/ReplicaBackupCreate"
+	SPDKService_ReplicaBackupStatus_FullMethodName                = "/spdkrpc.SPDKService/ReplicaBackupStatus"
+	SPDKService_ReplicaBackupRestore_FullMethodName               = "/spdkrpc.SPDKService/ReplicaBackupRestore"
+	SPDKService_ReplicaRestoreStatus_FullMethodName               = "/spdkrpc.SPDKService/ReplicaRestoreStatus"
+	SPDKService_EngineCreate_FullMethodName                       = "/spdkrpc.SPDKService/EngineCreate"
+	SPDKService_EngineDelete_FullMethodName                       = "/spdkrpc.SPDKService/EngineDelete"
+	SPDKService_EngineGet_FullMethodName                          = "/spdkrpc.SPDKService/EngineGet"
+	SPDKService_EngineSnapshotCreate_FullMethodName               = "/spdkrpc.SPDKService/EngineSnapshotCreate"
+	SPDKService_EngineSnapshotDelete_FullMethodName               = "/spdkrpc.SPDKService/EngineSnapshotDelete"
+	SPDKService_EngineSnapshotRevert_FullMethodName               = "/spdkrpc.SPDKService/EngineSnapshotRevert"
+	SPDKService_EngineList_FullMethodName                         = "/spdkrpc.SPDKService/EngineList"
+	SPDKService_EngineWatch_FullMethodName                        = "/spdkrpc.SPDKService/EngineWatch"
+	SPDKService_EngineReplicaList_FullMethodName                  = "/spdkrpc.SPDKService/EngineReplicaList"
+	SPDKService_EngineReplicaAdd_FullMethodName                   = "/spdkrpc.SPDKService/EngineReplicaAdd"
+	SPDKService_EngineReplicaDelete_FullMethodName                = "/spdkrpc.SPDKService/EngineReplicaDelete"
+	SPDKService_EngineBackupCreate_FullMethodName                 = "/spdkrpc.SPDKService/EngineBackupCreate"
+	SPDKService_EngineBackupStatus_FullMethodName                 = "/spdkrpc.SPDKService/EngineBackupStatus"
+	SPDKService_EngineBackupRestore_FullMethodName                = "/spdkrpc.SPDKService/EngineBackupRestore"
+	SPDKService_EngineBackupRestoreFinish_FullMethodName          = "/spdkrpc.SPDKService/EngineBackupRestoreFinish"
+	SPDKService_EngineRestoreStatus_FullMethodName                = "/spdkrpc.SPDKService/EngineRestoreStatus"
+	SPDKService_DiskCreate_FullMethodName                         = "/spdkrpc.SPDKService/DiskCreate"
+	SPDKService_DiskDelete_FullMethodName                         = "/spdkrpc.SPDKService/DiskDelete"
+	SPDKService_DiskGet_FullMethodName                            = "/spdkrpc.SPDKService/DiskGet"
+	SPDKService_LogSetLevel_FullMethodName                        = "/spdkrpc.SPDKService/LogSetLevel"
+	SPDKService_LogSetFlags_FullMethodName                        = "/spdkrpc.SPDKService/LogSetFlags"
+	SPDKService_LogGetLevel_FullMethodName                        = "/spdkrpc.SPDKService/LogGetLevel"
+	SPDKService_LogGetFlags_FullMethodName                        = "/spdkrpc.SPDKService/LogGetFlags"
+	SPDKService_VersionDetailGet_FullMethodName                   = "/spdkrpc.SPDKService/VersionDetailGet"
+)
+
+// SPDKServiceClient is the client API for SPDKService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type SPDKServiceClient interface {
+	ReplicaCreate(ctx context.Context, in *ReplicaCreateRequest, opts ...grpc.CallOption) (*Replica, error)
+	ReplicaDelete(ctx context.Context, in *ReplicaDeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaGet(ctx context.Context, in *ReplicaGetRequest, opts ...grpc.CallOption) (*Replica, error)
+	ReplicaSnapshotCreate(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*Replica, error)
+	ReplicaSnapshotDelete(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaSnapshotRevert(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ReplicaListResponse, error)
+	ReplicaWatch(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (SPDKService_ReplicaWatchClient, error)
+	ReplicaRebuildingSrcStart(ctx context.Context, in *ReplicaRebuildingSrcStartRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaRebuildingSrcFinish(ctx context.Context, in *ReplicaRebuildingSrcFinishRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaRebuildingSrcAttach(ctx context.Context, in *ReplicaRebuildingSrcAttachRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaRebuildingSrcDetach(ctx context.Context, in *ReplicaRebuildingSrcDetachRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaSnapshotShallowCopy(ctx context.Context, in *ReplicaSnapshotShallowCopyRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaRebuildingDstStart(ctx context.Context, in *ReplicaRebuildingDstStartRequest, opts ...grpc.CallOption) (*ReplicaRebuildingDstStartResponse, error)
+	ReplicaRebuildingDstFinish(ctx context.Context, in *ReplicaRebuildingDstFinishRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaRebuildingDstSnapshotCreate(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaRebuildingDstSnapshotRevert(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaBackupCreate(ctx context.Context, in *BackupCreateRequest, opts ...grpc.CallOption) (*BackupCreateResponse, error)
+	ReplicaBackupStatus(ctx context.Context, in *BackupStatusRequest, opts ...grpc.CallOption) (*BackupStatusResponse, error)
+	ReplicaBackupRestore(ctx context.Context, in *ReplicaBackupRestoreRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	ReplicaRestoreStatus(ctx context.Context, in *ReplicaRestoreStatusRequest, opts ...grpc.CallOption) (*ReplicaRestoreStatusResponse, error)
+	EngineCreate(ctx context.Context, in *EngineCreateRequest, opts ...grpc.CallOption) (*Engine, error)
+	EngineDelete(ctx context.Context, in *EngineDeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	EngineGet(ctx context.Context, in *EngineGetRequest, opts ...grpc.CallOption) (*Engine, error)
+	EngineSnapshotCreate(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*SnapshotResponse, error)
+	EngineSnapshotDelete(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	EngineSnapshotRevert(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	EngineList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*EngineListResponse, error)
+	EngineWatch(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (SPDKService_EngineWatchClient, error)
+	EngineReplicaList(ctx context.Context, in *EngineReplicaListRequest, opts ...grpc.CallOption) (*EngineReplicaListResponse, error)
+	EngineReplicaAdd(ctx context.Context, in *EngineReplicaAddRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	EngineReplicaDelete(ctx context.Context, in *EngineReplicaDeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	EngineBackupCreate(ctx context.Context, in *BackupCreateRequest, opts ...grpc.CallOption) (*BackupCreateResponse, error)
+	EngineBackupStatus(ctx context.Context, in *BackupStatusRequest, opts ...grpc.CallOption) (*BackupStatusResponse, error)
+	EngineBackupRestore(ctx context.Context, in *EngineBackupRestoreRequest, opts ...grpc.CallOption) (*EngineBackupRestoreResponse, error)
+	EngineBackupRestoreFinish(ctx context.Context, in *EngineBackupRestoreFinishRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	EngineRestoreStatus(ctx context.Context, in *RestoreStatusRequest, opts ...grpc.CallOption) (*RestoreStatusResponse, error)
+	DiskCreate(ctx context.Context, in *DiskCreateRequest, opts ...grpc.CallOption) (*Disk, error)
+	DiskDelete(ctx context.Context, in *DiskDeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	DiskGet(ctx context.Context, in *DiskGetRequest, opts ...grpc.CallOption) (*Disk, error)
+	LogSetLevel(ctx context.Context, in *LogSetLevelRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	LogSetFlags(ctx context.Context, in *LogSetFlagsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+	LogGetLevel(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*LogGetLevelResponse, error)
+	LogGetFlags(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*LogGetFlagsResponse, error)
+	VersionDetailGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionDetailGetReply, error)
+}
+
+type sPDKServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewSPDKServiceClient(cc grpc.ClientConnInterface) SPDKServiceClient {
+	return &sPDKServiceClient{cc}
+}
+
+func (c *sPDKServiceClient) ReplicaCreate(ctx context.Context, in *ReplicaCreateRequest, opts ...grpc.CallOption) (*Replica, error) {
+	out := new(Replica)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaDelete(ctx context.Context, in *ReplicaDeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaDelete_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaGet(ctx context.Context, in *ReplicaGetRequest, opts ...grpc.CallOption) (*Replica, error) {
+	out := new(Replica)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaSnapshotCreate(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*Replica, error) {
+	out := new(Replica)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaSnapshotCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaSnapshotDelete(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaSnapshotDelete_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaSnapshotRevert(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaSnapshotRevert_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ReplicaListResponse, error) {
+	out := new(ReplicaListResponse)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaList_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaWatch(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (SPDKService_ReplicaWatchClient, error) {
+	stream, err := c.cc.NewStream(ctx, &SPDKService_ServiceDesc.Streams[0], SPDKService_ReplicaWatch_FullMethodName, opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &sPDKServiceReplicaWatchClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type SPDKService_ReplicaWatchClient interface {
+	Recv() (*emptypb.Empty, error)
+	grpc.ClientStream
+}
+
+type sPDKServiceReplicaWatchClient struct {
+	grpc.ClientStream
+}
+
+func (x *sPDKServiceReplicaWatchClient) Recv() (*emptypb.Empty, error) {
+	m := new(emptypb.Empty)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *sPDKServiceClient) ReplicaRebuildingSrcStart(ctx context.Context, in *ReplicaRebuildingSrcStartRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaRebuildingSrcStart_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaRebuildingSrcFinish(ctx context.Context, in *ReplicaRebuildingSrcFinishRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaRebuildingSrcFinish_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaRebuildingSrcAttach(ctx context.Context, in *ReplicaRebuildingSrcAttachRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaRebuildingSrcAttach_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaRebuildingSrcDetach(ctx context.Context, in *ReplicaRebuildingSrcDetachRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaRebuildingSrcDetach_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaSnapshotShallowCopy(ctx context.Context, in *ReplicaSnapshotShallowCopyRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaSnapshotShallowCopy_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaRebuildingDstStart(ctx context.Context, in *ReplicaRebuildingDstStartRequest, opts ...grpc.CallOption) (*ReplicaRebuildingDstStartResponse, error) {
+	out := new(ReplicaRebuildingDstStartResponse)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaRebuildingDstStart_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaRebuildingDstFinish(ctx context.Context, in *ReplicaRebuildingDstFinishRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaRebuildingDstFinish_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaRebuildingDstSnapshotCreate(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaRebuildingDstSnapshotCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaRebuildingDstSnapshotRevert(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaRebuildingDstSnapshotRevert_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaBackupCreate(ctx context.Context, in *BackupCreateRequest, opts ...grpc.CallOption) (*BackupCreateResponse, error) {
+	out := new(BackupCreateResponse)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaBackupCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaBackupStatus(ctx context.Context, in *BackupStatusRequest, opts ...grpc.CallOption) (*BackupStatusResponse, error) {
+	out := new(BackupStatusResponse)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaBackupStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaBackupRestore(ctx context.Context, in *ReplicaBackupRestoreRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaBackupRestore_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) ReplicaRestoreStatus(ctx context.Context, in *ReplicaRestoreStatusRequest, opts ...grpc.CallOption) (*ReplicaRestoreStatusResponse, error) {
+	out := new(ReplicaRestoreStatusResponse)
+	err := c.cc.Invoke(ctx, SPDKService_ReplicaRestoreStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineCreate(ctx context.Context, in *EngineCreateRequest, opts ...grpc.CallOption) (*Engine, error) {
+	out := new(Engine)
+	err := c.cc.Invoke(ctx, SPDKService_EngineCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineDelete(ctx context.Context, in *EngineDeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_EngineDelete_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineGet(ctx context.Context, in *EngineGetRequest, opts ...grpc.CallOption) (*Engine, error) {
+	out := new(Engine)
+	err := c.cc.Invoke(ctx, SPDKService_EngineGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineSnapshotCreate(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*SnapshotResponse, error) {
+	out := new(SnapshotResponse)
+	err := c.cc.Invoke(ctx, SPDKService_EngineSnapshotCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineSnapshotDelete(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_EngineSnapshotDelete_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineSnapshotRevert(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_EngineSnapshotRevert_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*EngineListResponse, error) {
+	out := new(EngineListResponse)
+	err := c.cc.Invoke(ctx, SPDKService_EngineList_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineWatch(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (SPDKService_EngineWatchClient, error) {
+	stream, err := c.cc.NewStream(ctx, &SPDKService_ServiceDesc.Streams[1], SPDKService_EngineWatch_FullMethodName, opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &sPDKServiceEngineWatchClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type SPDKService_EngineWatchClient interface {
+	Recv() (*emptypb.Empty, error)
+	grpc.ClientStream
+}
+
+type sPDKServiceEngineWatchClient struct {
+	grpc.ClientStream
+}
+
+func (x *sPDKServiceEngineWatchClient) Recv() (*emptypb.Empty, error) {
+	m := new(emptypb.Empty)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *sPDKServiceClient) EngineReplicaList(ctx context.Context, in *EngineReplicaListRequest, opts ...grpc.CallOption) (*EngineReplicaListResponse, error) {
+	out := new(EngineReplicaListResponse)
+	err := c.cc.Invoke(ctx, SPDKService_EngineReplicaList_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineReplicaAdd(ctx context.Context, in *EngineReplicaAddRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_EngineReplicaAdd_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineReplicaDelete(ctx context.Context, in *EngineReplicaDeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_EngineReplicaDelete_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineBackupCreate(ctx context.Context, in *BackupCreateRequest, opts ...grpc.CallOption) (*BackupCreateResponse, error) {
+	out := new(BackupCreateResponse)
+	err := c.cc.Invoke(ctx, SPDKService_EngineBackupCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineBackupStatus(ctx context.Context, in *BackupStatusRequest, opts ...grpc.CallOption) (*BackupStatusResponse, error) {
+	out := new(BackupStatusResponse)
+	err := c.cc.Invoke(ctx, SPDKService_EngineBackupStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineBackupRestore(ctx context.Context, in *EngineBackupRestoreRequest, opts ...grpc.CallOption) (*EngineBackupRestoreResponse, error) {
+	out := new(EngineBackupRestoreResponse)
+	err := c.cc.Invoke(ctx, SPDKService_EngineBackupRestore_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineBackupRestoreFinish(ctx context.Context, in *EngineBackupRestoreFinishRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_EngineBackupRestoreFinish_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) EngineRestoreStatus(ctx context.Context, in *RestoreStatusRequest, opts ...grpc.CallOption) (*RestoreStatusResponse, error) {
+	out := new(RestoreStatusResponse)
+	err := c.cc.Invoke(ctx, SPDKService_EngineRestoreStatus_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) DiskCreate(ctx context.Context, in *DiskCreateRequest, opts ...grpc.CallOption) (*Disk, error) {
+	out := new(Disk)
+	err := c.cc.Invoke(ctx, SPDKService_DiskCreate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) DiskDelete(ctx context.Context, in *DiskDeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_DiskDelete_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) DiskGet(ctx context.Context, in *DiskGetRequest, opts ...grpc.CallOption) (*Disk, error) {
+	out := new(Disk)
+	err := c.cc.Invoke(ctx, SPDKService_DiskGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) LogSetLevel(ctx context.Context, in *LogSetLevelRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_LogSetLevel_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) LogSetFlags(ctx context.Context, in *LogSetFlagsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	out := new(emptypb.Empty)
+	err := c.cc.Invoke(ctx, SPDKService_LogSetFlags_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) LogGetLevel(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*LogGetLevelResponse, error) {
+	out := new(LogGetLevelResponse)
+	err := c.cc.Invoke(ctx, SPDKService_LogGetLevel_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) LogGetFlags(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*LogGetFlagsResponse, error) {
+	out := new(LogGetFlagsResponse)
+	err := c.cc.Invoke(ctx, SPDKService_LogGetFlags_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sPDKServiceClient) VersionDetailGet(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionDetailGetReply, error) {
+	out := new(VersionDetailGetReply)
+	err := c.cc.Invoke(ctx, SPDKService_VersionDetailGet_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// SPDKServiceServer is the server API for SPDKService service.
+// All implementations must embed UnimplementedSPDKServiceServer
+// for forward compatibility
+type SPDKServiceServer interface {
+	ReplicaCreate(context.Context, *ReplicaCreateRequest) (*Replica, error)
+	ReplicaDelete(context.Context, *ReplicaDeleteRequest) (*emptypb.Empty, error)
+	ReplicaGet(context.Context, *ReplicaGetRequest) (*Replica, error)
+	ReplicaSnapshotCreate(context.Context, *SnapshotRequest) (*Replica, error)
+	ReplicaSnapshotDelete(context.Context, *SnapshotRequest) (*emptypb.Empty, error)
+	ReplicaSnapshotRevert(context.Context, *SnapshotRequest) (*emptypb.Empty, error)
+	ReplicaList(context.Context, *emptypb.Empty) (*ReplicaListResponse, error)
+	ReplicaWatch(*emptypb.Empty, SPDKService_ReplicaWatchServer) error
+	ReplicaRebuildingSrcStart(context.Context, *ReplicaRebuildingSrcStartRequest) (*emptypb.Empty, error)
+	ReplicaRebuildingSrcFinish(context.Context, *ReplicaRebuildingSrcFinishRequest) (*emptypb.Empty, error)
+	ReplicaRebuildingSrcAttach(context.Context, *ReplicaRebuildingSrcAttachRequest) (*emptypb.Empty, error)
+	ReplicaRebuildingSrcDetach(context.Context, *ReplicaRebuildingSrcDetachRequest) (*emptypb.Empty, error)
+	ReplicaSnapshotShallowCopy(context.Context, *ReplicaSnapshotShallowCopyRequest) (*emptypb.Empty, error)
+	ReplicaRebuildingDstStart(context.Context, *ReplicaRebuildingDstStartRequest) (*ReplicaRebuildingDstStartResponse, error)
+	ReplicaRebuildingDstFinish(context.Context, *ReplicaRebuildingDstFinishRequest) (*emptypb.Empty, error)
+	ReplicaRebuildingDstSnapshotCreate(context.Context, *SnapshotRequest) (*emptypb.Empty, error)
+	ReplicaRebuildingDstSnapshotRevert(context.Context, *SnapshotRequest) (*emptypb.Empty, error)
+	ReplicaBackupCreate(context.Context, *BackupCreateRequest) (*BackupCreateResponse, error)
+	ReplicaBackupStatus(context.Context, *BackupStatusRequest) (*BackupStatusResponse, error)
+	ReplicaBackupRestore(context.Context, *ReplicaBackupRestoreRequest) (*emptypb.Empty, error)
+	ReplicaRestoreStatus(context.Context, *ReplicaRestoreStatusRequest) (*ReplicaRestoreStatusResponse, error)
+	EngineCreate(context.Context, *EngineCreateRequest) (*Engine, error)
+	EngineDelete(context.Context, *EngineDeleteRequest) (*emptypb.Empty, error)
+	EngineGet(context.Context, *EngineGetRequest) (*Engine, error)
+	EngineSnapshotCreate(context.Context, *SnapshotRequest) (*SnapshotResponse, error)
+	EngineSnapshotDelete(context.Context, *SnapshotRequest) (*emptypb.Empty, error)
+	EngineSnapshotRevert(context.Context, *SnapshotRequest) (*emptypb.Empty, error)
+	EngineList(context.Context, *emptypb.Empty) (*EngineListResponse, error)
+	EngineWatch(*emptypb.Empty, SPDKService_EngineWatchServer) error
+	EngineReplicaList(context.Context, *EngineReplicaListRequest) (*EngineReplicaListResponse, error)
+	EngineReplicaAdd(context.Context, *EngineReplicaAddRequest) (*emptypb.Empty, error)
+	EngineReplicaDelete(context.Context, *EngineReplicaDeleteRequest) (*emptypb.Empty, error)
+	EngineBackupCreate(context.Context, *BackupCreateRequest) (*BackupCreateResponse, error)
+	EngineBackupStatus(context.Context, *BackupStatusRequest) (*BackupStatusResponse, error)
+	EngineBackupRestore(context.Context, *EngineBackupRestoreRequest) (*EngineBackupRestoreResponse, error)
+	EngineBackupRestoreFinish(context.Context, *EngineBackupRestoreFinishRequest) (*emptypb.Empty, error)
+	EngineRestoreStatus(context.Context, *RestoreStatusRequest) (*RestoreStatusResponse, error)
+	DiskCreate(context.Context, *DiskCreateRequest) (*Disk, error)
+	DiskDelete(context.Context, *DiskDeleteRequest) (*emptypb.Empty, error)
+	DiskGet(context.Context, *DiskGetRequest) (*Disk, error)
+	LogSetLevel(context.Context, *LogSetLevelRequest) (*emptypb.Empty, error)
+	LogSetFlags(context.Context, *LogSetFlagsRequest) (*emptypb.Empty, error)
+	LogGetLevel(context.Context, *emptypb.Empty) (*LogGetLevelResponse, error)
+	LogGetFlags(context.Context, *emptypb.Empty) (*LogGetFlagsResponse, error)
+	VersionDetailGet(context.Context, *emptypb.Empty) (*VersionDetailGetReply, error)
+	mustEmbedUnimplementedSPDKServiceServer()
+}
+
+// UnimplementedSPDKServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedSPDKServiceServer struct {
+}
+
+func (UnimplementedSPDKServiceServer) ReplicaCreate(context.Context, *ReplicaCreateRequest) (*Replica, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaCreate not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaDelete(context.Context, *ReplicaDeleteRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaDelete not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaGet(context.Context, *ReplicaGetRequest) (*Replica, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaGet not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaSnapshotCreate(context.Context, *SnapshotRequest) (*Replica, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaSnapshotCreate not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaSnapshotDelete(context.Context, *SnapshotRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaSnapshotDelete not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaSnapshotRevert(context.Context, *SnapshotRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaSnapshotRevert not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaList(context.Context, *emptypb.Empty) (*ReplicaListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaList not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaWatch(*emptypb.Empty, SPDKService_ReplicaWatchServer) error {
+	return status.Errorf(codes.Unimplemented, "method ReplicaWatch not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaRebuildingSrcStart(context.Context, *ReplicaRebuildingSrcStartRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaRebuildingSrcStart not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaRebuildingSrcFinish(context.Context, *ReplicaRebuildingSrcFinishRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaRebuildingSrcFinish not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaRebuildingSrcAttach(context.Context, *ReplicaRebuildingSrcAttachRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaRebuildingSrcAttach not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaRebuildingSrcDetach(context.Context, *ReplicaRebuildingSrcDetachRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaRebuildingSrcDetach not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaSnapshotShallowCopy(context.Context, *ReplicaSnapshotShallowCopyRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaSnapshotShallowCopy not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaRebuildingDstStart(context.Context, *ReplicaRebuildingDstStartRequest) (*ReplicaRebuildingDstStartResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaRebuildingDstStart not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaRebuildingDstFinish(context.Context, *ReplicaRebuildingDstFinishRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaRebuildingDstFinish not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaRebuildingDstSnapshotCreate(context.Context, *SnapshotRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaRebuildingDstSnapshotCreate not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaRebuildingDstSnapshotRevert(context.Context, *SnapshotRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaRebuildingDstSnapshotRevert not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaBackupCreate(context.Context, *BackupCreateRequest) (*BackupCreateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaBackupCreate not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaBackupStatus(context.Context, *BackupStatusRequest) (*BackupStatusResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaBackupStatus not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaBackupRestore(context.Context, *ReplicaBackupRestoreRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaBackupRestore not implemented")
+}
+func (UnimplementedSPDKServiceServer) ReplicaRestoreStatus(context.Context, *ReplicaRestoreStatusRequest) (*ReplicaRestoreStatusResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ReplicaRestoreStatus not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineCreate(context.Context, *EngineCreateRequest) (*Engine, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineCreate not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineDelete(context.Context, *EngineDeleteRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineDelete not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineGet(context.Context, *EngineGetRequest) (*Engine, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineGet not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineSnapshotCreate(context.Context, *SnapshotRequest) (*SnapshotResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineSnapshotCreate not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineSnapshotDelete(context.Context, *SnapshotRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineSnapshotDelete not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineSnapshotRevert(context.Context, *SnapshotRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineSnapshotRevert not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineList(context.Context, *emptypb.Empty) (*EngineListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineList not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineWatch(*emptypb.Empty, SPDKService_EngineWatchServer) error {
+	return status.Errorf(codes.Unimplemented, "method EngineWatch not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineReplicaList(context.Context, *EngineReplicaListRequest) (*EngineReplicaListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineReplicaList not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineReplicaAdd(context.Context, *EngineReplicaAddRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineReplicaAdd not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineReplicaDelete(context.Context, *EngineReplicaDeleteRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineReplicaDelete not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineBackupCreate(context.Context, *BackupCreateRequest) (*BackupCreateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineBackupCreate not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineBackupStatus(context.Context, *BackupStatusRequest) (*BackupStatusResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineBackupStatus not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineBackupRestore(context.Context, *EngineBackupRestoreRequest) (*EngineBackupRestoreResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineBackupRestore not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineBackupRestoreFinish(context.Context, *EngineBackupRestoreFinishRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineBackupRestoreFinish not implemented")
+}
+func (UnimplementedSPDKServiceServer) EngineRestoreStatus(context.Context, *RestoreStatusRequest) (*RestoreStatusResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EngineRestoreStatus not implemented")
+}
+func (UnimplementedSPDKServiceServer) DiskCreate(context.Context, *DiskCreateRequest) (*Disk, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DiskCreate not implemented")
+}
+func (UnimplementedSPDKServiceServer) DiskDelete(context.Context, *DiskDeleteRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DiskDelete not implemented")
+}
+func (UnimplementedSPDKServiceServer) DiskGet(context.Context, *DiskGetRequest) (*Disk, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DiskGet not implemented")
+}
+func (UnimplementedSPDKServiceServer) LogSetLevel(context.Context, *LogSetLevelRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method LogSetLevel not implemented")
+}
+func (UnimplementedSPDKServiceServer) LogSetFlags(context.Context, *LogSetFlagsRequest) (*emptypb.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method LogSetFlags not implemented")
+}
+func (UnimplementedSPDKServiceServer) LogGetLevel(context.Context, *emptypb.Empty) (*LogGetLevelResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method LogGetLevel not implemented")
+}
+func (UnimplementedSPDKServiceServer) LogGetFlags(context.Context, *emptypb.Empty) (*LogGetFlagsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method LogGetFlags not implemented")
+}
+func (UnimplementedSPDKServiceServer) VersionDetailGet(context.Context, *emptypb.Empty) (*VersionDetailGetReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method VersionDetailGet not implemented")
+}
+func (UnimplementedSPDKServiceServer) mustEmbedUnimplementedSPDKServiceServer() {}
+
+// UnsafeSPDKServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to SPDKServiceServer will
+// result in compilation errors.
+type UnsafeSPDKServiceServer interface {
+	mustEmbedUnimplementedSPDKServiceServer()
+}
+
+func RegisterSPDKServiceServer(s grpc.ServiceRegistrar, srv SPDKServiceServer) {
+	s.RegisterService(&SPDKService_ServiceDesc, srv)
+}
+
+func _SPDKService_ReplicaCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaCreate(ctx, req.(*ReplicaCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaDeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaDelete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaDelete_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaDelete(ctx, req.(*ReplicaDeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaGetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaGet(ctx, req.(*ReplicaGetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaSnapshotCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SnapshotRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaSnapshotCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaSnapshotCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaSnapshotCreate(ctx, req.(*SnapshotRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaSnapshotDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SnapshotRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaSnapshotDelete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaSnapshotDelete_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaSnapshotDelete(ctx, req.(*SnapshotRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaSnapshotRevert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SnapshotRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaSnapshotRevert(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaSnapshotRevert_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaSnapshotRevert(ctx, req.(*SnapshotRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaList_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaList(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaWatch_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(emptypb.Empty)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(SPDKServiceServer).ReplicaWatch(m, &sPDKServiceReplicaWatchServer{stream})
+}
+
+type SPDKService_ReplicaWatchServer interface {
+	Send(*emptypb.Empty) error
+	grpc.ServerStream
+}
+
+type sPDKServiceReplicaWatchServer struct {
+	grpc.ServerStream
+}
+
+func (x *sPDKServiceReplicaWatchServer) Send(m *emptypb.Empty) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _SPDKService_ReplicaRebuildingSrcStart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaRebuildingSrcStartRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaRebuildingSrcStart(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaRebuildingSrcStart_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaRebuildingSrcStart(ctx, req.(*ReplicaRebuildingSrcStartRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaRebuildingSrcFinish_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaRebuildingSrcFinishRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaRebuildingSrcFinish(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaRebuildingSrcFinish_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaRebuildingSrcFinish(ctx, req.(*ReplicaRebuildingSrcFinishRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaRebuildingSrcAttach_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaRebuildingSrcAttachRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaRebuildingSrcAttach(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaRebuildingSrcAttach_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaRebuildingSrcAttach(ctx, req.(*ReplicaRebuildingSrcAttachRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaRebuildingSrcDetach_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaRebuildingSrcDetachRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaRebuildingSrcDetach(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaRebuildingSrcDetach_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaRebuildingSrcDetach(ctx, req.(*ReplicaRebuildingSrcDetachRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaSnapshotShallowCopy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaSnapshotShallowCopyRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaSnapshotShallowCopy(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaSnapshotShallowCopy_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaSnapshotShallowCopy(ctx, req.(*ReplicaSnapshotShallowCopyRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaRebuildingDstStart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaRebuildingDstStartRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaRebuildingDstStart(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaRebuildingDstStart_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaRebuildingDstStart(ctx, req.(*ReplicaRebuildingDstStartRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaRebuildingDstFinish_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaRebuildingDstFinishRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaRebuildingDstFinish(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaRebuildingDstFinish_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaRebuildingDstFinish(ctx, req.(*ReplicaRebuildingDstFinishRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaRebuildingDstSnapshotCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SnapshotRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaRebuildingDstSnapshotCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaRebuildingDstSnapshotCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaRebuildingDstSnapshotCreate(ctx, req.(*SnapshotRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaRebuildingDstSnapshotRevert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SnapshotRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaRebuildingDstSnapshotRevert(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaRebuildingDstSnapshotRevert_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaRebuildingDstSnapshotRevert(ctx, req.(*SnapshotRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaBackupCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(BackupCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaBackupCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaBackupCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaBackupCreate(ctx, req.(*BackupCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaBackupStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(BackupStatusRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaBackupStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaBackupStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaBackupStatus(ctx, req.(*BackupStatusRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaBackupRestore_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaBackupRestoreRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaBackupRestore(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaBackupRestore_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaBackupRestore(ctx, req.(*ReplicaBackupRestoreRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_ReplicaRestoreStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReplicaRestoreStatusRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).ReplicaRestoreStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_ReplicaRestoreStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).ReplicaRestoreStatus(ctx, req.(*ReplicaRestoreStatusRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineCreate(ctx, req.(*EngineCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineDeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineDelete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineDelete_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineDelete(ctx, req.(*EngineDeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineGetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineGet(ctx, req.(*EngineGetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineSnapshotCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SnapshotRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineSnapshotCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineSnapshotCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineSnapshotCreate(ctx, req.(*SnapshotRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineSnapshotDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SnapshotRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineSnapshotDelete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineSnapshotDelete_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineSnapshotDelete(ctx, req.(*SnapshotRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineSnapshotRevert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SnapshotRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineSnapshotRevert(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineSnapshotRevert_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineSnapshotRevert(ctx, req.(*SnapshotRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineList_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineList(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineWatch_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(emptypb.Empty)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(SPDKServiceServer).EngineWatch(m, &sPDKServiceEngineWatchServer{stream})
+}
+
+type SPDKService_EngineWatchServer interface {
+	Send(*emptypb.Empty) error
+	grpc.ServerStream
+}
+
+type sPDKServiceEngineWatchServer struct {
+	grpc.ServerStream
+}
+
+func (x *sPDKServiceEngineWatchServer) Send(m *emptypb.Empty) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _SPDKService_EngineReplicaList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineReplicaListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineReplicaList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineReplicaList_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineReplicaList(ctx, req.(*EngineReplicaListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineReplicaAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineReplicaAddRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineReplicaAdd(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineReplicaAdd_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineReplicaAdd(ctx, req.(*EngineReplicaAddRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineReplicaDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineReplicaDeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineReplicaDelete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineReplicaDelete_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineReplicaDelete(ctx, req.(*EngineReplicaDeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineBackupCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(BackupCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineBackupCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineBackupCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineBackupCreate(ctx, req.(*BackupCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineBackupStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(BackupStatusRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineBackupStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineBackupStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineBackupStatus(ctx, req.(*BackupStatusRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineBackupRestore_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineBackupRestoreRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineBackupRestore(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineBackupRestore_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineBackupRestore(ctx, req.(*EngineBackupRestoreRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineBackupRestoreFinish_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EngineBackupRestoreFinishRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineBackupRestoreFinish(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineBackupRestoreFinish_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineBackupRestoreFinish(ctx, req.(*EngineBackupRestoreFinishRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_EngineRestoreStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(RestoreStatusRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).EngineRestoreStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_EngineRestoreStatus_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).EngineRestoreStatus(ctx, req.(*RestoreStatusRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_DiskCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DiskCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).DiskCreate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_DiskCreate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).DiskCreate(ctx, req.(*DiskCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_DiskDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DiskDeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).DiskDelete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_DiskDelete_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).DiskDelete(ctx, req.(*DiskDeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_DiskGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DiskGetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).DiskGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_DiskGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).DiskGet(ctx, req.(*DiskGetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_LogSetLevel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(LogSetLevelRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).LogSetLevel(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_LogSetLevel_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).LogSetLevel(ctx, req.(*LogSetLevelRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_LogSetFlags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(LogSetFlagsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).LogSetFlags(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_LogSetFlags_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).LogSetFlags(ctx, req.(*LogSetFlagsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_LogGetLevel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).LogGetLevel(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_LogGetLevel_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).LogGetLevel(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_LogGetFlags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).LogGetFlags(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_LogGetFlags_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).LogGetFlags(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SPDKService_VersionDetailGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(emptypb.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SPDKServiceServer).VersionDetailGet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SPDKService_VersionDetailGet_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SPDKServiceServer).VersionDetailGet(ctx, req.(*emptypb.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// SPDKService_ServiceDesc is the grpc.ServiceDesc for SPDKService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var SPDKService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "spdkrpc.SPDKService",
+	HandlerType: (*SPDKServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ReplicaCreate",
+			Handler:    _SPDKService_ReplicaCreate_Handler,
+		},
+		{
+			MethodName: "ReplicaDelete",
+			Handler:    _SPDKService_ReplicaDelete_Handler,
+		},
+		{
+			MethodName: "ReplicaGet",
+			Handler:    _SPDKService_ReplicaGet_Handler,
+		},
+		{
+			MethodName: "ReplicaSnapshotCreate",
+			Handler:    _SPDKService_ReplicaSnapshotCreate_Handler,
+		},
+		{
+			MethodName: "ReplicaSnapshotDelete",
+			Handler:    _SPDKService_ReplicaSnapshotDelete_Handler,
+		},
+		{
+			MethodName: "ReplicaSnapshotRevert",
+			Handler:    _SPDKService_ReplicaSnapshotRevert_Handler,
+		},
+		{
+			MethodName: "ReplicaList",
+			Handler:    _SPDKService_ReplicaList_Handler,
+		},
+		{
+			MethodName: "ReplicaRebuildingSrcStart",
+			Handler:    _SPDKService_ReplicaRebuildingSrcStart_Handler,
+		},
+		{
+			MethodName: "ReplicaRebuildingSrcFinish",
+			Handler:    _SPDKService_ReplicaRebuildingSrcFinish_Handler,
+		},
+		{
+			MethodName: "ReplicaRebuildingSrcAttach",
+			Handler:    _SPDKService_ReplicaRebuildingSrcAttach_Handler,
+		},
+		{
+			MethodName: "ReplicaRebuildingSrcDetach",
+			Handler:    _SPDKService_ReplicaRebuildingSrcDetach_Handler,
+		},
+		{
+			MethodName: "ReplicaSnapshotShallowCopy",
+			Handler:    _SPDKService_ReplicaSnapshotShallowCopy_Handler,
+		},
+		{
+			MethodName: "ReplicaRebuildingDstStart",
+			Handler:    _SPDKService_ReplicaRebuildingDstStart_Handler,
+		},
+		{
+			MethodName: "ReplicaRebuildingDstFinish",
+			Handler:    _SPDKService_ReplicaRebuildingDstFinish_Handler,
+		},
+		{
+			MethodName: "ReplicaRebuildingDstSnapshotCreate",
+			Handler:    _SPDKService_ReplicaRebuildingDstSnapshotCreate_Handler,
+		},
+		{
+			MethodName: "ReplicaRebuildingDstSnapshotRevert",
+			Handler:    _SPDKService_ReplicaRebuildingDstSnapshotRevert_Handler,
+		},
+		{
+			MethodName: "ReplicaBackupCreate",
+			Handler:    _SPDKService_ReplicaBackupCreate_Handler,
+		},
+		{
+			MethodName: "ReplicaBackupStatus",
+			Handler:    _SPDKService_ReplicaBackupStatus_Handler,
+		},
+		{
+			MethodName: "ReplicaBackupRestore",
+			Handler:    _SPDKService_ReplicaBackupRestore_Handler,
+		},
+		{
+			MethodName: "ReplicaRestoreStatus",
+			Handler:    _SPDKService_ReplicaRestoreStatus_Handler,
+		},
+		{
+			MethodName: "EngineCreate",
+			Handler:    _SPDKService_EngineCreate_Handler,
+		},
+		{
+			MethodName: "EngineDelete",
+			Handler:    _SPDKService_EngineDelete_Handler,
+		},
+		{
+			MethodName: "EngineGet",
+			Handler:    _SPDKService_EngineGet_Handler,
+		},
+		{
+			MethodName: "EngineSnapshotCreate",
+			Handler:    _SPDKService_EngineSnapshotCreate_Handler,
+		},
+		{
+			MethodName: "EngineSnapshotDelete",
+			Handler:    _SPDKService_EngineSnapshotDelete_Handler,
+		},
+		{
+			MethodName: "EngineSnapshotRevert",
+			Handler:    _SPDKService_EngineSnapshotRevert_Handler,
+		},
+		{
+			MethodName: "EngineList",
+			Handler:    _SPDKService_EngineList_Handler,
+		},
+		{
+			MethodName: "EngineReplicaList",
+			Handler:    _SPDKService_EngineReplicaList_Handler,
+		},
+		{
+			MethodName: "EngineReplicaAdd",
+			Handler:    _SPDKService_EngineReplicaAdd_Handler,
+		},
+		{
+			MethodName: "EngineReplicaDelete",
+			Handler:    _SPDKService_EngineReplicaDelete_Handler,
+		},
+		{
+			MethodName: "EngineBackupCreate",
+			Handler:    _SPDKService_EngineBackupCreate_Handler,
+		},
+		{
+			MethodName: "EngineBackupStatus",
+			Handler:    _SPDKService_EngineBackupStatus_Handler,
+		},
+		{
+			MethodName: "EngineBackupRestore",
+			Handler:    _SPDKService_EngineBackupRestore_Handler,
+		},
+		{
+			MethodName: "EngineBackupRestoreFinish",
+			Handler:    _SPDKService_EngineBackupRestoreFinish_Handler,
+		},
+		{
+			MethodName: "EngineRestoreStatus",
+			Handler:    _SPDKService_EngineRestoreStatus_Handler,
+		},
+		{
+			MethodName: "DiskCreate",
+			Handler:    _SPDKService_DiskCreate_Handler,
+		},
+		{
+			MethodName: "DiskDelete",
+			Handler:    _SPDKService_DiskDelete_Handler,
+		},
+		{
+			MethodName: "DiskGet",
+			Handler:    _SPDKService_DiskGet_Handler,
+		},
+		{
+			MethodName: "LogSetLevel",
+			Handler:    _SPDKService_LogSetLevel_Handler,
+		},
+		{
+			MethodName: "LogSetFlags",
+			Handler:    _SPDKService_LogSetFlags_Handler,
+		},
+		{
+			MethodName: "LogGetLevel",
+			Handler:    _SPDKService_LogGetLevel_Handler,
+		},
+		{
+			MethodName: "LogGetFlags",
+			Handler:    _SPDKService_LogGetFlags_Handler,
+		},
+		{
+			MethodName: "VersionDetailGet",
+			Handler:    _SPDKService_VersionDetailGet_Handler,
+		},
+	},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "ReplicaWatch",
+			Handler:       _SPDKService_ReplicaWatch_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "EngineWatch",
+			Handler:       _SPDKService_EngineWatch_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "spdkrpc/spdk.proto",
+}
diff --git a/protobuf/bimrpc/bimrpc.proto b/protobuf/bimrpc/bimrpc.proto
new file mode 100644
index 0000000..7541967
--- /dev/null
+++ b/protobuf/bimrpc/bimrpc.proto
@@ -0,0 +1,115 @@
+syntax="proto3";
+
+package bimrpc;
+
+option go_package = "github.com/longhorn/types/pkg/generated/bimrpc";
+
+import "google/protobuf/empty.proto";
+
+service BackingImageManagerService {
+	rpc Delete(DeleteRequest) returns (google.protobuf.Empty) {}
+	rpc Get(GetRequest) returns (BackingImageResponse) {}
+	rpc List(google.protobuf.Empty) returns (ListResponse) {}
+	rpc VersionGet(google.protobuf.Empty) returns(VersionResponse);
+	rpc Sync(SyncRequest) returns (BackingImageResponse) {}
+	rpc Send(SendRequest) returns (google.protobuf.Empty) {}
+	rpc Fetch(FetchRequest) returns (BackingImageResponse) {}
+	rpc PrepareDownload(PrepareDownloadRequest) returns (PrepareDownloadResponse) {}
+	rpc BackupCreate(BackupCreateRequest) returns (google.protobuf.Empty) {}
+	rpc BackupStatus(BackupStatusRequest) returns (BackupStatusResponse) {}
+
+	rpc Watch(google.protobuf.Empty) returns (stream google.protobuf.Empty) {}
+}
+
+message BackingImageSpec {
+	string name = 1;
+	string uuid = 2;
+	int64 size = 3;
+	string checksum = 4;
+	int64 virtualSize = 5;
+}
+
+message BackingImageStatus {
+	string state = 1;
+	string error_msg = 2;
+	int32 sending_reference = 3;
+	string sender_manager_address = 4;
+	int32 progress = 5;
+	string checksum = 6;
+}
+
+message BackingImageResponse {
+	BackingImageSpec spec = 1;
+	BackingImageStatus status = 2;
+}
+
+message DeleteRequest {
+	string name = 1;
+	string uuid = 2;
+}
+
+message GetRequest {
+	string name = 1;
+	string uuid = 2;
+}
+
+message ListResponse{
+	map<string, BackingImageResponse> backing_images = 1;
+}
+
+message VersionResponse {
+	string version = 1;
+	string gitCommit = 2;
+	string buildDate = 3;
+
+	int64 backing_image_manager_api_version = 4;
+	int64 backing_image_manager_api_min_version = 5;
+}
+
+message SyncRequest {
+	BackingImageSpec spec = 1;
+	string from_address = 2;
+}
+
+message SendRequest {
+	string name = 1;
+	string uuid = 2;
+	string to_address = 3;
+}
+
+message FetchRequest {
+	BackingImageSpec spec = 1;
+	string data_source_address = 2;
+}
+
+message PrepareDownloadRequest {
+	string name = 1;
+    string uuid = 2;
+}
+
+message PrepareDownloadResponse {
+	string src_file_path = 1;
+	string address = 2;
+}
+
+message BackupCreateRequest {
+  string name = 1;
+  string uuid = 2;
+  string checksum = 3;
+  string backup_target = 4;
+  repeated string labels = 5;
+  map<string, string> credential = 6;
+  string compression_method = 7;
+  int32 concurrent_limit = 8;
+}
+
+message BackupStatusRequest {
+	string name = 1;
+}
+
+message BackupStatusResponse {
+  int32 progress = 1;
+  string backup_url = 2;
+  string error = 3;
+  string state = 4;
+}
diff --git a/protobuf/imrpc/common.proto b/protobuf/imrpc/common.proto
new file mode 100644
index 0000000..2aacfd4
--- /dev/null
+++ b/protobuf/imrpc/common.proto
@@ -0,0 +1,16 @@
+syntax="proto3";
+
+package imrpc;
+
+option go_package = "github.com/longhorn/types/pkg/generated/imrpc";
+
+// Deprecated: Use DataEngine instead.
+enum BackendStoreDriver {
+    v1 = 0;
+    v2 = 1;
+}
+
+enum DataEngine {
+    DATA_ENGINE_V1 = 0;
+    DATA_ENGINE_V2 = 1;
+}
diff --git a/protobuf/imrpc/disk.proto b/protobuf/imrpc/disk.proto
new file mode 100644
index 0000000..ee46892
--- /dev/null
+++ b/protobuf/imrpc/disk.proto
@@ -0,0 +1,106 @@
+syntax="proto3";
+
+package imrpc;
+
+option go_package = "github.com/longhorn/types/pkg/generated/imrpc";
+
+import "google/protobuf/empty.proto";
+
+service DiskService {
+    rpc DiskCreate(DiskCreateRequest) returns (Disk);
+    rpc DiskDelete(DiskDeleteRequest) returns (google.protobuf.Empty);
+    rpc DiskGet(DiskGetRequest) returns (Disk);
+    rpc DiskReplicaInstanceList(DiskReplicaInstanceListRequest) returns (DiskReplicaInstanceListResponse);
+    rpc DiskReplicaInstanceDelete(DiskReplicaInstanceDeleteRequest) returns (google.protobuf.Empty);
+
+    rpc VersionGet(google.protobuf.Empty) returns(DiskVersionResponse);
+}
+
+message Disk {
+    string id = 1;
+    string uuid = 2;
+    string path = 3;
+    string type = 4;
+
+    int64 total_size = 5;
+    int64 free_size = 6;
+
+    int64 total_blocks = 7;
+    int64 free_blocks = 8;
+
+    int64 block_size = 9;
+    int64 cluster_size = 10;
+
+    string driver = 11;
+    string name = 12;
+}
+
+message ReplicaInstance {
+    string name = 1;
+    string uuid = 2;
+    string disk_name = 3;
+    string disk_uuid = 4;
+    uint64 spec_size = 5;
+    uint64 actual_size = 6;
+}
+
+enum DiskType {
+    filesystem = 0;
+    block = 1;
+}
+
+message DiskCreateRequest{
+    DiskType disk_type = 1;
+
+    string disk_name = 2;
+    string disk_uuid = 3;
+    string disk_path = 4;
+    int64 block_size = 5;
+    string disk_driver = 6;
+}
+
+message DiskGetRequest {
+    DiskType disk_type = 1;
+
+    string disk_name = 2;
+    string disk_path = 3;
+    string disk_driver = 4;
+}
+
+message DiskDeleteRequest {
+    DiskType disk_type = 1;
+
+    string disk_name = 2;
+    string disk_uuid = 3;
+    string disk_path = 4;
+    string disk_driver = 5;
+}
+
+message DiskReplicaInstanceListRequest {
+    DiskType disk_type = 1;
+
+    string disk_name = 2;
+    string disk_driver = 3;
+}
+
+message DiskReplicaInstanceListResponse {
+	map<string, ReplicaInstance> replica_instances = 1;
+}
+
+message DiskReplicaInstanceDeleteRequest {
+    DiskType disk_type = 1;
+
+    string disk_name = 2;
+    string disk_uuid = 3;
+    string replcia_instance_name = 4;
+    string disk_driver = 5;
+}
+
+message DiskVersionResponse {
+    string version = 1;
+    string gitCommit = 2;
+    string buildDate = 3;
+
+    int64 instanceManagerDiskServiceAPIVersion = 4;
+    int64 instanceManagerDiskServiceAPIMinVersion = 5;
+}
diff --git a/protobuf/imrpc/imrpc.proto b/protobuf/imrpc/imrpc.proto
new file mode 100644
index 0000000..88809b4
--- /dev/null
+++ b/protobuf/imrpc/imrpc.proto
@@ -0,0 +1,88 @@
+syntax="proto3";
+
+// When users upgrade LH, if a volume is not retached, it uses the old version imrpc grpc server.
+// We can not use a new grpc client with different package name, so we use the same package name to avoid the conflict.
+// Old https://github.com/longhorn/longhorn-instance-manager/blob/779ea5e6d7f7fb59fb08d360ea79fa5f414bab93/pkg/imrpc/imrpc.proto#L1-L82
+// package imrpc;
+
+option go_package = "github.com/longhorn/types/pkg/generated/imrpc";
+
+import "google/protobuf/empty.proto";
+
+service ProcessManagerService {
+	rpc ProcessCreate(ProcessCreateRequest) returns (ProcessResponse) {}
+	rpc ProcessDelete(ProcessDeleteRequest) returns (ProcessResponse) {}
+	rpc ProcessGet(ProcessGetRequest) returns (ProcessResponse) {}
+	rpc ProcessList(ProcessListRequest) returns (ProcessListResponse) {}
+	rpc ProcessLog(LogRequest) returns (stream LogResponse) {}
+	rpc ProcessWatch(google.protobuf.Empty) returns (stream ProcessResponse) {}
+	rpc ProcessReplace(ProcessReplaceRequest) returns (ProcessResponse) {}
+
+	rpc VersionGet(google.protobuf.Empty) returns(VersionResponse);
+}
+
+message ProcessSpec {
+	string name = 1;
+	string binary = 2;
+	repeated string args = 3;
+	int32 port_count = 4;
+	repeated string port_args = 5;
+}
+
+message ProcessStatus {
+	string state = 1;
+	string error_msg = 2;
+	int32 port_start = 3;
+	int32 port_end = 4;
+	map<string, bool> conditions = 5;
+}
+
+message ProcessCreateRequest {
+	ProcessSpec spec = 1;
+}
+
+message ProcessDeleteRequest {
+	string name = 1;
+}
+
+message ProcessGetRequest {
+	string name = 1;
+}
+
+message ProcessResponse {
+	ProcessSpec spec = 1;
+	ProcessStatus status = 2;
+	bool deleted = 3;
+}
+
+message ProcessListRequest{
+}
+
+message ProcessListResponse{
+	map<string, ProcessResponse> processes = 1;
+}
+
+message LogRequest {
+	string name = 1;
+}
+
+message ProcessReplaceRequest {
+	ProcessSpec spec = 1;
+	string terminate_signal = 2;
+}
+
+message LogResponse {
+	string line = 2;
+}
+
+message VersionResponse {
+	string version = 1;
+	string gitCommit = 2;
+	string buildDate = 3;
+
+	int64 instanceManagerAPIVersion = 4;
+	int64 instanceManagerAPIMinVersion = 5;
+
+	int64 instanceManagerProxyAPIVersion = 6;
+	int64 instanceManagerProxyAPIMinVersion = 7;
+}
diff --git a/protobuf/imrpc/instance.proto b/protobuf/imrpc/instance.proto
new file mode 100644
index 0000000..f234e6d
--- /dev/null
+++ b/protobuf/imrpc/instance.proto
@@ -0,0 +1,135 @@
+syntax="proto3";
+
+package imrpc;
+
+option go_package = "github.com/longhorn/types/pkg/generated/imrpc";
+
+import "google/protobuf/empty.proto";
+import "imrpc/common.proto";
+import "imrpc/imrpc.proto";
+
+service InstanceService {
+	rpc InstanceCreate(InstanceCreateRequest) returns (InstanceResponse) {}
+	rpc InstanceDelete(InstanceDeleteRequest) returns (InstanceResponse) {}
+	rpc InstanceGet(InstanceGetRequest) returns (InstanceResponse) {}
+	rpc InstanceList(google.protobuf.Empty) returns (InstanceListResponse) {}
+	rpc InstanceLog(InstanceLogRequest) returns (stream LogResponse) {}
+	rpc InstanceWatch(google.protobuf.Empty) returns (stream google.protobuf.Empty) {}
+	rpc InstanceReplace(InstanceReplaceRequest) returns (InstanceResponse) {}
+
+	rpc LogSetLevel(LogSetLevelRequest) returns (google.protobuf.Empty);
+	rpc LogSetFlags(LogSetFlagsRequest) returns (google.protobuf.Empty);
+	rpc LogGetLevel(LogGetLevelRequest) returns (LogGetLevelResponse);
+	rpc LogGetFlags(LogGetFlagsRequest) returns (LogGetFlagsResponse);
+
+	rpc VersionGet(google.protobuf.Empty) returns (VersionResponse);
+}
+
+message ProcessInstanceSpec {
+	string binary = 1;
+	repeated string args = 2;
+}
+
+message SpdkInstanceSpec {
+    map<string, string> replica_address_map = 1;
+	string disk_name = 2;
+	string disk_uuid = 3;
+	uint64 size = 4;
+	bool expose_required = 5;
+	string frontend = 6;
+}
+
+message InstanceSpec {
+	// Deprecated: Replaced by `data_engine`.
+	BackendStoreDriver backend_store_driver = 1 [deprecated=true];
+	string name = 2;
+	string type = 3;
+	string volume_name = 4;
+
+	int32 port_count = 5;
+	repeated string port_args = 6;
+
+	ProcessInstanceSpec process_instance_spec = 7;
+	SpdkInstanceSpec spdk_instance_spec = 8;
+	DataEngine data_engine = 9;
+}
+
+message InstanceStatus {
+	string state = 1;
+	string error_msg = 2;
+	int32 port_start = 3;
+	int32 port_end = 4;
+	map<string, bool> conditions = 5;
+}
+
+message InstanceCreateRequest {
+	InstanceSpec spec = 1;
+}
+
+message InstanceDeleteRequest {
+	// Deprecated: Replaced by `data_engine`.
+	BackendStoreDriver backend_store_driver = 1 [deprecated=true];
+	string name = 2;
+	string type = 3;
+
+	string disk_uuid = 4;
+	bool cleanup_required = 5;
+	DataEngine data_engine = 6;
+}
+
+message InstanceGetRequest {
+	// Deprecated: Replaced by `data_engine`.
+	BackendStoreDriver backend_store_driver = 1 [deprecated=true];
+	string name = 2;
+	string type = 3;
+	DataEngine data_engine = 4;
+}
+
+message InstanceResponse {
+	InstanceSpec spec = 1;
+	InstanceStatus status = 2;
+	bool deleted = 3;
+}
+
+message InstanceListResponse{
+	map<string, InstanceResponse> instances = 1;
+}
+
+message InstanceLogRequest {
+	// Deprecated: Replaced by `data_engine`.
+	BackendStoreDriver backend_store_driver = 1 [deprecated=true];
+	string name = 2;
+	string type = 3;
+	DataEngine data_engine = 4;
+}
+
+message InstanceReplaceRequest {
+	InstanceSpec spec = 1;
+	string terminate_signal = 2;
+}
+
+message LogSetLevelRequest {
+	DataEngine data_engine = 1;
+	string level = 2;
+}
+
+message LogSetFlagsRequest {
+	DataEngine data_engine = 1;
+	string flags = 2;
+}
+
+message LogGetLevelRequest {
+	DataEngine data_engine = 1;
+}
+
+message LogGetLevelResponse {
+	string level = 1;
+}
+
+message LogGetFlagsRequest {
+	DataEngine data_engine = 1;
+}
+
+message LogGetFlagsResponse {
+	string flags = 1;
+}
diff --git a/protobuf/imrpc/proxy.proto b/protobuf/imrpc/proxy.proto
new file mode 100644
index 0000000..33e0a3d
--- /dev/null
+++ b/protobuf/imrpc/proxy.proto
@@ -0,0 +1,299 @@
+syntax="proto3";
+
+package imrpc;
+
+option go_package = "github.com/longhorn/types/pkg/generated/imrpc";
+
+import "google/protobuf/empty.proto";
+import "ptypes/controller.proto";
+import "ptypes/syncagent.proto";
+import "imrpc/common.proto";
+
+service ProxyEngineService {
+	rpc ServerVersionGet(ProxyEngineRequest) returns (EngineVersionProxyResponse);
+
+	rpc VolumeGet(ProxyEngineRequest) returns (EngineVolumeGetProxyResponse);
+	rpc VolumeExpand(EngineVolumeExpandRequest) returns (google.protobuf.Empty);
+	rpc VolumeFrontendStart(EngineVolumeFrontendStartRequest) returns (google.protobuf.Empty);
+	rpc VolumeFrontendShutdown(ProxyEngineRequest) returns (google.protobuf.Empty);
+	rpc VolumeUnmapMarkSnapChainRemovedSet(EngineVolumeUnmapMarkSnapChainRemovedSetRequest) returns (google.protobuf.Empty);
+	rpc VolumeSnapshotMaxCountSet(EngineVolumeSnapshotMaxCountSetRequest) returns (google.protobuf.Empty);
+	rpc VolumeSnapshotMaxSizeSet(EngineVolumeSnapshotMaxSizeSetRequest) returns (google.protobuf.Empty);
+
+	rpc VolumeSnapshot(EngineVolumeSnapshotRequest) returns (EngineVolumeSnapshotProxyResponse);
+	rpc SnapshotList(ProxyEngineRequest) returns (EngineSnapshotListProxyResponse);
+	rpc SnapshotRevert(EngineSnapshotRevertRequest) returns (google.protobuf.Empty);
+	rpc SnapshotPurge(EngineSnapshotPurgeRequest) returns (google.protobuf.Empty);
+	rpc SnapshotPurgeStatus(ProxyEngineRequest) returns (EngineSnapshotPurgeStatusProxyResponse);
+	rpc SnapshotClone(EngineSnapshotCloneRequest) returns (google.protobuf.Empty);
+	rpc SnapshotCloneStatus(ProxyEngineRequest) returns (EngineSnapshotCloneStatusProxyResponse);
+	rpc SnapshotRemove(EngineSnapshotRemoveRequest) returns (google.protobuf.Empty);
+	rpc SnapshotHash(EngineSnapshotHashRequest) returns (google.protobuf.Empty);
+	rpc SnapshotHashStatus(EngineSnapshotHashStatusRequest) returns (EngineSnapshotHashStatusProxyResponse);
+
+	rpc SnapshotBackup(EngineSnapshotBackupRequest) returns (EngineSnapshotBackupProxyResponse);
+	rpc SnapshotBackupStatus(EngineSnapshotBackupStatusRequest) returns (EngineSnapshotBackupStatusProxyResponse);
+	rpc BackupRestore(EngineBackupRestoreRequest) returns (EngineBackupRestoreProxyResponse);
+	rpc BackupRestoreStatus(ProxyEngineRequest) returns (EngineBackupRestoreStatusProxyResponse);
+	rpc BackupRestoreFinish(EngineBackupRestoreFinishRequest) returns (google.protobuf.Empty);
+	rpc CleanupBackupMountPoints(google.protobuf.Empty) returns (google.protobuf.Empty);
+
+	rpc ReplicaAdd(EngineReplicaAddRequest) returns (google.protobuf.Empty);
+	rpc ReplicaList(ProxyEngineRequest) returns (EngineReplicaListProxyResponse);
+	rpc ReplicaRebuildingStatus(ProxyEngineRequest) returns (EngineReplicaRebuildStatusProxyResponse);
+	rpc ReplicaVerifyRebuild(EngineReplicaVerifyRebuildRequest) returns (google.protobuf.Empty);
+	rpc ReplicaRemove(EngineReplicaRemoveRequest) returns (google.protobuf.Empty);
+	rpc ReplicaModeUpdate(EngineReplicaModeUpdateRequest) returns (google.protobuf.Empty);
+
+	rpc MetricsGet(ProxyEngineRequest) returns (EngineMetricsGetProxyResponse);
+	rpc RemountReadOnlyVolume(RemountVolumeRequest) returns (google.protobuf.Empty);
+}
+
+message ProxyEngineRequest{
+	string address = 1;
+	// Deprecated: Replaced by `data_engine`.
+	BackendStoreDriver backend_store_driver = 2 [deprecated=true];
+	string engine_name = 3;
+	string volume_name = 4;
+	DataEngine data_engine = 5;
+}
+
+message EngineVersionProxyResponse {
+	ptypes.VersionOutput version = 1;
+}
+
+message EngineVolumeGetProxyResponse {
+	ptypes.Volume volume = 1;
+}
+
+message EngineVolumeExpandRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	ptypes.VolumeExpandRequest expand = 2;
+}
+
+message EngineVolumeFrontendStartRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	ptypes.VolumeFrontendStartRequest frontend_start = 2;
+}
+
+message EngineVolumeSnapshotRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	ptypes.VolumeSnapshotRequest snapshot_volume = 2;
+}
+
+message EngineVolumeSnapshotProxyResponse {
+	ptypes.VolumeSnapshotReply snapshot = 1;
+}
+
+message EngineVolumeUnmapMarkSnapChainRemovedSetRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	ptypes.VolumeUnmapMarkSnapChainRemovedSetRequest unmap_mark_snap = 2;
+}
+
+message EngineVolumeSnapshotMaxCountSetRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	ptypes.VolumeSnapshotMaxCountSetRequest count = 2;
+}
+
+message EngineVolumeSnapshotMaxSizeSetRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	ptypes.VolumeSnapshotMaxSizeSetRequest size = 2;
+}
+
+message EngineSnapshotListProxyResponse {
+	map<string, EngineSnapshotDiskInfo> disks = 1;
+}
+
+message EngineSnapshotDiskInfo {
+	string name = 1;
+	string parent = 2;
+	map<string, bool> children = 3;
+	bool removed = 4;
+	bool user_created = 5;
+	string created = 6;
+	string size = 7;
+	map<string, string> labels = 8;
+}
+
+message EngineSnapshotRevertRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	string name = 2;
+}
+
+message EngineSnapshotPurgeRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	bool skip_if_in_progress = 2;
+}
+
+message EngineSnapshotPurgeStatusProxyResponse {
+	map<string, ptypes.SnapshotPurgeStatusResponse> status = 1;
+}
+
+message EngineSnapshotCloneRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	string from_engine_address = 2;
+	string snapshot_name = 3;
+	bool export_backing_image_if_exist = 4;
+	int32 file_sync_http_client_timeout = 5;
+	string from_engine_name = 6;
+	string from_volume_name = 7;
+}
+
+message EngineSnapshotCloneStatusProxyResponse {
+	map<string, ptypes.SnapshotCloneStatusResponse> status = 1;
+}
+
+message EngineSnapshotRemoveRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	repeated string names = 2;
+}
+
+message EngineSnapshotBackupRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	repeated string envs = 8;
+
+	string backup_name = 2;
+	string snapshot_name = 3;
+	string backup_target = 4;
+	string backing_image_name = 5;
+	string backing_image_checksum = 6;
+	map<string, string> labels = 7;
+	string compression_method = 9;
+	int32 concurrent_limit = 10;
+	string storage_class_name = 11;
+}
+
+message EngineSnapshotBackupProxyResponse {
+	string backup_id = 1;
+	string replica = 2;
+	bool is_incremental = 3;
+}
+
+message EngineSnapshotBackupStatusRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	string backup_name = 2;
+	string replica_address = 3;
+	string replica_name = 4;
+}
+
+message EngineSnapshotBackupStatusProxyResponse {
+	string backup_url = 1;
+	string error = 2;
+	int32 progress = 3;
+	string snapshot_name = 4;
+	string state = 5;
+
+	string replica_address = 6;
+}
+
+message EngineBackupRestoreRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	repeated string envs = 2;
+
+	string url = 3;
+	string target = 4;
+	string volume_name = 5;
+	int32 concurrent_limit = 6;
+}
+
+message EngineBackupRestoreProxyResponse {
+	bytes taskError = 1;
+}
+
+message EngineBackupRestoreStatusProxyResponse {
+	map<string, EngineBackupRestoreStatus> status = 1;
+}
+
+message EngineBackupRestoreStatus {
+	bool is_restoring = 1;
+	string last_restored = 2;
+	string current_restoring_backup = 3;
+	int32 progress = 4;
+	string error = 5;
+	string filename = 6;
+	string state = 7;
+	string backup_url = 8;
+}
+
+message EngineBackupRestoreFinishRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+}
+
+message EngineReplicaAddRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	string replica_address = 2;
+	bool restore = 3;
+	int64 size = 4;
+	int64 current_size = 5;
+	bool fast_sync = 6;
+	int32 file_sync_http_client_timeout = 7;
+	string replica_name = 8;
+}
+
+message EngineReplicaListProxyResponse {
+	ptypes.ReplicaListReply replica_list = 1;
+}
+
+message EngineReplicaVerifyRebuildRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	string replica_address = 2;
+	string replica_name = 3;
+}
+
+message EngineReplicaRebuildStatusProxyResponse {
+	map<string, ptypes.ReplicaRebuildStatusResponse> status = 1;
+}
+
+message EngineReplicaRemoveRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	string replica_address = 2;
+	string replica_name = 3;
+}
+
+message EngineReplicaModeUpdateRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	string replica_address = 2;
+	ptypes.ReplicaMode mode = 3;
+}
+
+message EngineSnapshotHashRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	string snapshot_name = 2;
+	bool rehash = 3;
+}
+
+message EngineSnapshotHashStatusRequest {
+	ProxyEngineRequest proxy_engine_request = 1;
+
+	string snapshot_name = 2;
+}
+
+message EngineSnapshotHashStatusProxyResponse {
+	map<string, ptypes.SnapshotHashStatusResponse> status = 1;
+}
+
+message EngineMetricsGetProxyResponse {
+	ptypes.Metrics metrics = 1;
+}
+
+message RemountVolumeRequest {
+	string volume_name = 1;
+}
diff --git a/protobuf/ptypes/common.proto b/protobuf/ptypes/common.proto
new file mode 100644
index 0000000..ee2b2da
--- /dev/null
+++ b/protobuf/ptypes/common.proto
@@ -0,0 +1,11 @@
+syntax="proto3";
+
+package ptypes;
+
+option go_package = "github.com/longhorn/types/pkg/generated/enginerpc";
+
+message SyncFileInfo {
+    string from_file_name = 1;
+    string to_file_name = 2;
+    int64 actual_size = 3;
+}
diff --git a/protobuf/ptypes/controller.proto b/protobuf/ptypes/controller.proto
new file mode 100644
index 0000000..da9817a
--- /dev/null
+++ b/protobuf/ptypes/controller.proto
@@ -0,0 +1,165 @@
+syntax="proto3";
+
+package ptypes;
+
+option go_package = "github.com/longhorn/types/pkg/generated/enginerpc";
+
+import "google/protobuf/empty.proto";
+import "ptypes/common.proto";
+
+service ControllerService {
+    rpc VolumeGet(google.protobuf.Empty) returns (Volume);
+    rpc VolumeStart(VolumeStartRequest) returns (Volume);
+    rpc VolumeShutdown(google.protobuf.Empty) returns (Volume);
+    rpc VolumeSnapshot(VolumeSnapshotRequest) returns (VolumeSnapshotReply);
+    rpc VolumeRevert(VolumeRevertRequest) returns (Volume);
+    rpc VolumeExpand(VolumeExpandRequest) returns (Volume);
+    rpc VolumeFrontendStart(VolumeFrontendStartRequest) returns (Volume);
+    rpc VolumeFrontendShutdown(google.protobuf.Empty) returns (Volume);
+    rpc VolumeUnmapMarkSnapChainRemovedSet(VolumeUnmapMarkSnapChainRemovedSetRequest) returns (Volume);
+    rpc VolumeSnapshotMaxCountSet(VolumeSnapshotMaxCountSetRequest) returns (Volume);
+    rpc VolumeSnapshotMaxSizeSet(VolumeSnapshotMaxSizeSetRequest) returns (Volume);
+
+    rpc ReplicaList(google.protobuf.Empty) returns (ReplicaListReply);
+    rpc ReplicaGet(ReplicaAddress) returns (ControllerReplica);
+    rpc ControllerReplicaCreate(ControllerReplicaCreateRequest) returns (ControllerReplica);
+    rpc ReplicaDelete(ReplicaAddress) returns (google.protobuf.Empty);
+    rpc ReplicaUpdate(ControllerReplica) returns (ControllerReplica);
+    rpc ReplicaPrepareRebuild(ReplicaAddress) returns (ReplicaPrepareRebuildReply);
+    rpc ReplicaVerifyRebuild(ReplicaAddress) returns (ControllerReplica);
+
+    rpc JournalList(JournalListRequest) returns (google.protobuf.Empty);
+
+    rpc VersionDetailGet(google.protobuf.Empty) returns(VersionDetailGetReply);
+
+    rpc MetricsGet(google.protobuf.Empty) returns(MetricsGetReply);
+}
+
+message Volume {
+    string name = 1;
+    int64 size = 2;
+    int32 replicaCount = 3;
+    string endpoint = 4;
+    string frontend = 5;
+    string frontendState = 6;
+    bool isExpanding = 7;
+
+    string last_expansion_error = 8;
+    string last_expansion_failed_at = 9;
+
+    bool unmap_mark_snap_chain_removed = 10;
+    int32 snapshot_max_count = 11;
+    int64 snapshot_max_size = 12;
+}
+
+message ReplicaAddress {
+    string address = 1;
+    string instanceName = 2;
+}
+
+enum ReplicaMode {
+    WO = 0;
+    RW = 1;
+    ERR = 2;
+}
+
+message ControllerReplica {
+    ReplicaAddress address = 1;
+    ReplicaMode mode = 2;
+}
+
+message VolumeStartRequest {
+    repeated string replicaAddresses = 1;
+    int64 size = 2;
+    int64 currentSize = 3;
+}
+
+message VolumeSnapshotRequest {
+    string name = 1;
+    map<string, string> labels = 2;
+}
+
+message VolumeSnapshotReply {
+    string name = 1;
+}
+
+message VolumeRevertRequest {
+    string name = 1;
+}
+
+message VolumeExpandRequest {
+    int64 size = 1;
+}
+
+message VolumeFrontendStartRequest {
+    string frontend = 1;
+}
+
+message VolumeUnmapMarkSnapChainRemovedSetRequest {
+    bool enabled = 1;
+}
+
+message VolumeSnapshotMaxCountSetRequest {
+    int32 count = 1;
+}
+
+message VolumeSnapshotMaxSizeSetRequest {
+    int64 size = 1;
+}
+
+message VolumePrepareRestoreRequest {
+    string lastRestored = 1;
+}
+
+message VolumeFinishRestoreRequest {
+    string currentRestored = 1;
+}
+
+message ReplicaListReply {
+    repeated ControllerReplica replicas = 1;
+}
+
+message ControllerReplicaCreateRequest {
+    string address = 1;
+    bool snapshot_required = 2;
+    ReplicaMode mode = 3;
+}
+
+message ReplicaPrepareRebuildReply {
+    ControllerReplica replica = 1;
+    repeated SyncFileInfo sync_file_info_list = 2;
+}
+
+message JournalListRequest {
+    int64 limit = 1;
+}
+
+message VersionOutput {
+    string version = 1;
+    string gitCommit = 2;
+    string buildDate = 3;
+
+    int64 cliAPIVersion = 4;
+    int64 cliAPIMinVersion = 5;
+    int64 controllerAPIVersion = 6;
+    int64 controllerAPIMinVersion = 7;
+    int64 dataFormatVersion = 8;
+    int64 dataFormatMinVersion = 9;
+}
+
+message VersionDetailGetReply {
+    VersionOutput version = 1;
+}
+
+message Metrics {
+    uint64 readThroughput = 1;
+    uint64 writeThroughput = 2;
+    uint64 readLatency = 3;
+    uint64 writeLatency = 4;
+    uint64 readIOPS = 5;
+    uint64 writeIOPS = 6;
+}
+
+message MetricsGetReply {
+    Metrics metrics = 1;
+}
diff --git a/protobuf/ptypes/replica.proto b/protobuf/ptypes/replica.proto
new file mode 100644
index 0000000..1eeb042
--- /dev/null
+++ b/protobuf/ptypes/replica.proto
@@ -0,0 +1,199 @@
+syntax="proto3";
+
+package ptypes;
+
+option go_package = "github.com/longhorn/types/pkg/generated/enginerpc";
+
+import "google/protobuf/empty.proto";
+
+service ReplicaService {
+  rpc ReplicaCreate(ReplicaCreateRequest) returns (ReplicaCreateResponse) {}
+  rpc ReplicaDelete(google.protobuf.Empty) returns (google.protobuf.Empty) {}
+  rpc ReplicaGet(google.protobuf.Empty) returns (ReplicaGetResponse) {}
+  rpc ReplicaOpen(google.protobuf.Empty) returns (ReplicaOpenResponse) {}
+  rpc ReplicaClose(google.protobuf.Empty) returns (ReplicaCloseResponse) {}
+  rpc ReplicaReload(google.protobuf.Empty) returns (ReplicaReloadResponse) {}
+  rpc ReplicaRevert(ReplicaRevertRequest) returns (ReplicaRevertResponse) {}
+  rpc ReplicaSnapshot(ReplicaSnapshotRequest) returns
+    (ReplicaSnapshotResponse) {}
+  rpc ReplicaExpand(ReplicaExpandRequest) returns (ReplicaExpandResponse) {}
+  rpc DiskRemove(DiskRemoveRequest) returns (DiskRemoveResponse) {}
+  rpc DiskReplace(DiskReplaceRequest) returns (DiskReplaceResponse) {}
+  rpc DiskPrepareRemove(DiskPrepareRemoveRequest) returns
+    (DiskPrepareRemoveResponse) {}
+  rpc DiskMarkAsRemoved(DiskMarkAsRemovedRequest) returns
+    (DiskMarkAsRemovedResponse) {}
+  rpc RebuildingSet(RebuildingSetRequest) returns (RebuildingSetResponse) {}
+  rpc RevisionCounterSet(RevisionCounterSetRequest) returns
+    (RevisionCounterSetResponse) {}
+  rpc UnmapMarkDiskChainRemovedSet(UnmapMarkDiskChainRemovedSetRequest) returns
+    (UnmapMarkDiskChainRemovedSetResponse) {}
+  rpc SnapshotMaxCountSet(SnapshotMaxCountSetRequest) returns
+    (SnapshotMaxCountSetResponse) {}
+  rpc SnapshotMaxSizeSet(SnapshotMaxSizeSetRequest) returns
+    (SnapshotMaxSizeSetResponse) {}
+}
+
+message ReplicaCreateRequest {
+  string size = 1;
+}
+
+message ReplicaCreateResponse {
+  Replica replica = 1;
+}
+
+message ReplicaGetResponse {
+  Replica replica = 1;
+}
+
+message ReplicaOpenResponse {
+  Replica replica = 1;
+}
+
+message ReplicaCloseResponse {
+  Replica replica = 1;
+}
+
+message ReplicaReloadResponse {
+  Replica replica = 1;
+}
+
+message ReplicaRevertRequest {
+  string name = 1;
+  string created = 2;
+}
+
+message ReplicaRevertResponse {
+  Replica replica = 1;
+}
+
+message ReplicaSnapshotRequest {
+  string name = 1;
+  bool user_created = 2;
+  string created = 3;
+  map<string, string> labels = 4;
+}
+
+message ReplicaSnapshotResponse {
+  Replica replica = 1;
+}
+
+message ReplicaExpandRequest {
+  int64 size = 1;
+}
+
+message ReplicaExpandResponse {
+  Replica replica = 1;
+}
+
+message DiskRemoveRequest {
+  string name = 1;
+  bool force = 2;
+}
+
+message DiskRemoveResponse {
+  Replica replica = 1;
+}
+
+message DiskReplaceRequest {
+  string target = 1;
+  string source = 2;
+}
+
+message DiskReplaceResponse {
+  Replica replica = 1;
+}
+
+message DiskPrepareRemoveRequest {
+  string name = 1;
+}
+
+message DiskPrepareRemoveResponse {
+  repeated PrepareRemoveAction operations = 1;
+}
+
+message DiskMarkAsRemovedRequest {
+  string name = 1;
+}
+
+message DiskMarkAsRemovedResponse {
+  Replica replica = 1;
+}
+
+message RebuildingSetRequest {
+  bool rebuilding = 1;
+}
+
+message RebuildingSetResponse {
+  Replica replica = 1;
+}
+
+message RevisionCounterSetRequest {
+  int64 counter = 1;
+}
+
+message RevisionCounterSetResponse {
+  Replica replica = 1;
+}
+
+message UnmapMarkDiskChainRemovedSetRequest {
+  bool enabled = 1;
+}
+
+message UnmapMarkDiskChainRemovedSetResponse {
+  Replica replica = 1;
+}
+
+message SnapshotMaxCountSetRequest {
+  int32 count = 1;
+}
+
+message SnapshotMaxCountSetResponse {
+  Replica replica = 1;
+}
+
+message SnapshotMaxSizeSetRequest {
+  int64 size = 1;
+}
+
+message SnapshotMaxSizeSetResponse {
+  Replica replica = 1;
+}
+
+message DiskInfo {
+  string name = 1;
+  string parent = 2;
+  map<string, bool> children = 3;
+  bool removed = 4;
+  bool user_created = 5;
+  string created = 6;
+  string size = 7;
+  map<string, string> labels = 8;
+}
+
+message Replica {
+  bool dirty = 1;
+  bool rebuilding = 2;
+  string head = 3;
+  string parent = 4;
+  string size = 5;
+  int64 sector_size = 6;
+  string backing_file = 7;
+  string state = 8;
+  repeated string chain = 9;
+  map<string, DiskInfo> disks = 10;
+  int32 remain_snapshots = 11;
+  int64 revision_counter = 12;
+  int64 last_modify_time = 13;
+  int64 head_file_size = 14;
+  bool revision_counter_disabled = 15;
+  bool unmap_mark_disk_chain_removed = 16;
+  int32 snapshot_count_usage = 17;
+  int64 snapshot_size_usage = 18;
+}
+
+message PrepareRemoveAction {
+  string action = 1;
+  string source = 2;
+  string target = 3;
+}
diff --git a/protobuf/ptypes/syncagent.proto b/protobuf/ptypes/syncagent.proto
new file mode 100644
index 0000000..1869975
--- /dev/null
+++ b/protobuf/ptypes/syncagent.proto
@@ -0,0 +1,195 @@
+syntax="proto3";
+
+package ptypes;
+
+option go_package = "github.com/longhorn/types/pkg/generated/enginerpc";
+
+import "google/protobuf/empty.proto";
+import "ptypes/common.proto";
+
+service SyncAgentService {
+  rpc FileRemove(FileRemoveRequest) returns (google.protobuf.Empty) {}
+  rpc FileRename(FileRenameRequest) returns (google.protobuf.Empty) {}
+  rpc FileSend(FileSendRequest) returns (google.protobuf.Empty) {}
+  rpc FilesSync(FilesSyncRequest) returns (google.protobuf.Empty) {}
+  rpc SnapshotClone(SnapshotCloneRequest) returns (google.protobuf.Empty) {}
+  rpc VolumeExport(VolumeExportRequest) returns (google.protobuf.Empty) {}
+  rpc ReceiverLaunch(ReceiverLaunchRequest) returns (ReceiverLaunchResponse) {}
+  rpc BackupCreate(BackupCreateRequest) returns (BackupCreateResponse) {}
+  rpc BackupRemove(BackupRemoveRequest) returns (google.protobuf.Empty) {}
+  rpc BackupRestore(BackupRestoreRequest) returns (google.protobuf.Empty) {}
+  rpc BackupStatus(BackupStatusRequest) returns (BackupStatusResponse) {}
+  rpc Reset(google.protobuf.Empty) returns (google.protobuf.Empty) {}
+  rpc RestoreStatus(google.protobuf.Empty) returns (RestoreStatusResponse) {}
+  rpc SnapshotPurge(google.protobuf.Empty) returns (google.protobuf.Empty) {}
+  rpc SnapshotPurgeStatus(google.protobuf.Empty) returns
+    (SnapshotPurgeStatusResponse) {}
+  rpc ReplicaRebuildStatus(google.protobuf.Empty) returns
+    (ReplicaRebuildStatusResponse) {}
+  rpc SnapshotCloneStatus(google.protobuf.Empty) returns (SnapshotCloneStatusResponse) {}
+  rpc SnapshotHash(SnapshotHashRequest) returns (google.protobuf.Empty) {}
+  rpc SnapshotHashStatus(SnapshotHashStatusRequest) returns
+    (SnapshotHashStatusResponse) {}
+  rpc SnapshotHashCancel(SnapshotHashCancelRequest) returns (google.protobuf.Empty) {}
+  rpc SnapshotHashLockState(google.protobuf.Empty) returns (SnapshotHashLockStateResponse) {}
+}
+
+message FileRemoveRequest {
+  string file_name = 1;
+}
+
+message FileRenameRequest {
+  string old_file_name = 1;
+  string new_file_name = 2;
+}
+
+message ReceiverLaunchRequest {
+  string to_file_name = 1;
+}
+
+message ReceiverLaunchResponse {
+  int32 port = 1;
+}
+
+message FileSendRequest {
+  string from_file_name = 1;
+  string host = 2;
+  int32 port = 3;
+  bool fast_sync = 4;
+  int32 file_sync_http_client_timeout = 5;
+}
+
+message FilesSyncRequest {
+  string from_address = 1;
+  string to_host = 2;
+  repeated SyncFileInfo sync_file_info_list = 3;
+  bool fast_sync = 4;
+  int32 file_sync_http_client_timeout = 5;
+}
+
+message SnapshotCloneRequest {
+    string from_address = 1;
+    string to_host = 2;
+    string snapshot_file_name = 3;
+    bool export_backing_image_if_exist = 4;
+    int32 file_sync_http_client_timeout = 5;
+    string from_volume_name = 6;
+}
+
+message VolumeExportRequest {
+  string snapshot_file_name = 1;
+  string host = 2;
+  int32 port = 3;
+  bool export_backing_image_if_exist = 4;
+  int32 file_sync_http_client_timeout = 5;
+}
+
+message BackupCreateRequest {
+  string snapshot_file_name = 1;
+  string backup_target = 2;
+  string volume_name = 3;
+  repeated string labels = 4;
+  map<string, string> credential = 5;
+  string backing_image_name = 6;
+  string backing_image_checksum = 7;
+  string backup_name = 8;
+  string compression_method = 9;
+  int32 concurrent_limit = 10;
+  string storage_class_name = 11;
+}
+
+message BackupCreateResponse {
+  string backup = 1;
+  bool is_incremental = 2;
+}
+
+message BackupRemoveRequest {
+  string backup = 1;
+};
+
+message BackupStatusRequest {
+  string backup = 1;
+}
+
+message BackupStatusResponse {
+  int32 progress = 1;
+  string backup_url = 2;
+  string error = 3;
+  string snapshot_name = 4;
+  string state = 5;
+}
+
+message BackupRestoreRequest {
+  string backup = 1;
+  string snapshot_disk_name = 2;
+  map<string, string> credential = 3;
+  int32 concurrent_limit = 4;
+}
+
+message BackupRestoreIncrementallyRequest {
+  string backup = 1;
+  string delta_file_name = 2;
+  string last_restored_backup_name = 3;
+  string snapshot_disk_name = 4;
+  map<string, string> credential = 5;
+  int32 concurrent_limit = 6;
+}
+
+message RestoreStatusResponse {
+  bool is_restoring = 1;
+  string last_restored = 2;
+  int32 progress = 3;
+  string error = 4;
+  string dest_file_name = 5;
+  string state = 6;
+  string backup_url = 7;
+  string current_restoring_backup = 8;
+}
+
+message SnapshotPurgeStatusResponse {
+  bool is_purging = 1;
+  string error = 2;
+  int32 progress = 3;
+  string state = 4;
+}
+
+message ReplicaRebuildStatusResponse {
+  bool is_rebuilding = 1;
+  string error = 2;
+  int32 progress = 3;
+  string state = 4;
+  string from_replica_address = 5;
+}
+
+message SnapshotCloneStatusResponse {
+  bool is_cloning = 1;
+  string error = 2;
+  int32 progress = 3;
+  string state = 4;
+  string from_replica_address = 5;
+  string snapshot_name = 6;
+}
+
+message SnapshotHashRequest {
+  string snapshot_name = 1;
+  bool rehash = 2;
+}
+
+message SnapshotHashStatusRequest {
+  string snapshot_name = 1;
+}
+
+message SnapshotHashStatusResponse {
+  string state = 1;
+  string checksum = 2;
+  string error = 3;
+  bool silently_corrupted = 4;
+}
+
+message SnapshotHashCancelRequest {
+  string snapshot_name = 1;
+}
+
+message SnapshotHashLockStateResponse {
+  bool is_locked = 1;
+}
diff --git a/protobuf/smrpc/smrpc.proto b/protobuf/smrpc/smrpc.proto
new file mode 100644
index 0000000..7572bcc
--- /dev/null
+++ b/protobuf/smrpc/smrpc.proto
@@ -0,0 +1,20 @@
+syntax="proto3";
+
+// When users upgrade LH, if a volume is not retached, it uses the old version smrpc grpc server.
+// We can not use a new grpc client with different package name, so we use the same package name to avoid the conflict.
+// Old smrpc protobuf: https://github.com/longhorn/longhorn-share-manager/blob/10b82112529f3d715faeefa91dd0eb83e15a6e48/pkg/rpc/smrpc.proto#L1-L15
+// package smrpc;
+
+option go_package = "github.com/longhorn/types/pkg/generated/smrpc";
+
+import "google/protobuf/empty.proto";
+
+service ShareManagerService {
+	rpc FilesystemTrim(FilesystemTrimRequest) returns (google.protobuf.Empty) {}
+	rpc Unmount(google.protobuf.Empty) returns (google.protobuf.Empty) {}
+	rpc Mount(google.protobuf.Empty) returns (google.protobuf.Empty) {}
+}
+
+message FilesystemTrimRequest {
+	bool encrypted_device = 1;
+}
diff --git a/protobuf/spdkrpc/spdk.proto b/protobuf/spdkrpc/spdk.proto
new file mode 100644
index 0000000..505a60c
--- /dev/null
+++ b/protobuf/spdkrpc/spdk.proto
@@ -0,0 +1,384 @@
+syntax="proto3";
+
+package spdkrpc;
+
+option go_package = "github.com/longhorn/types/pkg/generated/spdkrpc";
+
+import "google/protobuf/empty.proto";
+
+service SPDKService {
+    rpc ReplicaCreate(ReplicaCreateRequest) returns (Replica);
+    rpc ReplicaDelete(ReplicaDeleteRequest) returns (google.protobuf.Empty);
+    rpc ReplicaGet(ReplicaGetRequest) returns (Replica);
+    rpc ReplicaSnapshotCreate(SnapshotRequest) returns (Replica);
+    rpc ReplicaSnapshotDelete(SnapshotRequest) returns (google.protobuf.Empty);
+    rpc ReplicaSnapshotRevert(SnapshotRequest) returns (google.protobuf.Empty);
+    rpc ReplicaList(google.protobuf.Empty) returns (ReplicaListResponse);
+    rpc ReplicaWatch(google.protobuf.Empty) returns (stream google.protobuf.Empty) {}
+    rpc ReplicaRebuildingSrcStart(ReplicaRebuildingSrcStartRequest) returns (google.protobuf.Empty) {}
+    rpc ReplicaRebuildingSrcFinish(ReplicaRebuildingSrcFinishRequest) returns (google.protobuf.Empty) {}
+    rpc ReplicaRebuildingSrcAttach(ReplicaRebuildingSrcAttachRequest) returns (google.protobuf.Empty) {}
+    rpc ReplicaRebuildingSrcDetach(ReplicaRebuildingSrcDetachRequest) returns (google.protobuf.Empty) {}
+    rpc ReplicaSnapshotShallowCopy(ReplicaSnapshotShallowCopyRequest) returns (google.protobuf.Empty);
+    rpc ReplicaRebuildingDstStart(ReplicaRebuildingDstStartRequest) returns (ReplicaRebuildingDstStartResponse) {}
+    rpc ReplicaRebuildingDstFinish(ReplicaRebuildingDstFinishRequest) returns (google.protobuf.Empty) {}
+    rpc ReplicaRebuildingDstSnapshotCreate(SnapshotRequest) returns (google.protobuf.Empty);
+    rpc ReplicaRebuildingDstSnapshotRevert(SnapshotRequest) returns (google.protobuf.Empty);
+    rpc ReplicaBackupCreate(BackupCreateRequest) returns (BackupCreateResponse) {}
+    rpc ReplicaBackupStatus(BackupStatusRequest) returns (BackupStatusResponse) {}
+    rpc ReplicaBackupRestore(ReplicaBackupRestoreRequest) returns (google.protobuf.Empty) {}
+    rpc ReplicaRestoreStatus(ReplicaRestoreStatusRequest) returns (ReplicaRestoreStatusResponse) {}
+
+    rpc EngineCreate(EngineCreateRequest) returns (Engine);
+    rpc EngineDelete(EngineDeleteRequest) returns (google.protobuf.Empty);
+    rpc EngineGet(EngineGetRequest) returns (Engine);
+    rpc EngineSnapshotCreate(SnapshotRequest) returns (SnapshotResponse);
+    rpc EngineSnapshotDelete(SnapshotRequest) returns (google.protobuf.Empty);
+    rpc EngineSnapshotRevert(SnapshotRequest) returns (google.protobuf.Empty);
+    rpc EngineList(google.protobuf.Empty) returns (EngineListResponse);
+    rpc EngineWatch(google.protobuf.Empty) returns (stream google.protobuf.Empty) {}
+    rpc EngineReplicaList(EngineReplicaListRequest) returns (EngineReplicaListResponse) {}
+    rpc EngineReplicaAdd(EngineReplicaAddRequest) returns (google.protobuf.Empty) {}
+    rpc EngineReplicaDelete(EngineReplicaDeleteRequest) returns (google.protobuf.Empty) {}
+    rpc EngineBackupCreate(BackupCreateRequest) returns (BackupCreateResponse) {}
+    rpc EngineBackupStatus(BackupStatusRequest) returns (BackupStatusResponse) {}
+    rpc EngineBackupRestore(EngineBackupRestoreRequest) returns (EngineBackupRestoreResponse) {}
+    rpc EngineBackupRestoreFinish(EngineBackupRestoreFinishRequest) returns (google.protobuf.Empty) {}
+    rpc EngineRestoreStatus(RestoreStatusRequest) returns (RestoreStatusResponse) {}
+
+    rpc DiskCreate(DiskCreateRequest) returns (Disk);
+    rpc DiskDelete(DiskDeleteRequest) returns (google.protobuf.Empty);
+    rpc DiskGet(DiskGetRequest) returns (Disk);
+
+    rpc LogSetLevel(LogSetLevelRequest) returns (google.protobuf.Empty);
+    rpc LogSetFlags(LogSetFlagsRequest) returns (google.protobuf.Empty);
+    rpc LogGetLevel(google.protobuf.Empty) returns (LogGetLevelResponse);
+    rpc LogGetFlags(google.protobuf.Empty) returns (LogGetFlagsResponse);
+
+    rpc VersionDetailGet(google.protobuf.Empty) returns(VersionDetailGetReply);
+}
+
+message Lvol {
+    string name = 1;
+    string uuid = 2;
+    uint64 spec_size = 3;
+    uint64 actual_size = 4;
+    string parent = 5;
+    map<string, bool> children = 6;
+    string creation_time = 7;
+    bool user_created = 8;
+}
+
+message Replica {
+    string name = 1;
+    string lvs_name = 2;
+    string lvs_uuid = 3;
+    uint64 spec_size = 4;
+    uint64 actual_size = 5;
+    string ip = 6;
+    int32 port_start = 7;
+    int32 port_end = 8;
+    Lvol head = 9;
+    map<string, Lvol> snapshots = 10;
+    bool rebuilding = 11;
+    string state = 12;
+    string error_msg = 13;
+}
+
+message ReplicaCreateRequest {
+    string name = 1;
+    string lvs_name = 2;
+    string lvs_uuid = 3;
+    uint64 spec_size = 4;
+    bool expose_required = 5;
+    int32 port_count = 6;
+}
+
+message ReplicaDeleteRequest {
+    string name = 1;
+    bool cleanup_required = 2;
+}
+
+message ReplicaGetRequest {
+    string name = 1;
+}
+
+message ReplicaListResponse {
+	map<string, Replica> replicas = 1;
+}
+
+enum ReplicaMode {
+    WO = 0;
+    RW = 1;
+    ERR = 2;
+}
+
+message ReplicaRebuildingSrcStartRequest {
+    string name = 1;
+    string dst_replica_name = 2;
+    string dst_rebuilding_lvol_address = 3;
+}
+
+message ReplicaRebuildingSrcFinishRequest {
+    string name = 1;
+    string dst_replica_name = 2;
+}
+
+message ReplicaRebuildingSrcAttachRequest {
+    string name = 1;
+    string dst_replica_name = 2;
+    string dst_rebuilding_lvol_address = 3;
+}
+
+message ReplicaRebuildingSrcDetachRequest {
+    string name = 1;
+    string dst_replica_name = 2;
+}
+
+message ReplicaSnapshotShallowCopyRequest {
+    string name = 1;
+    string snapshot_name = 2;
+}
+
+message ReplicaRebuildingDstStartRequest {
+    string name = 1;
+    bool expose_required = 2;
+}
+
+message ReplicaRebuildingDstStartResponse {
+    string address = 1;
+}
+
+message ReplicaRebuildingDstFinishRequest {
+    string name = 1;
+    bool unexpose_required = 2;
+}
+
+message Engine {
+    string name = 1;
+    string volume_name = 2;
+    uint64 spec_size = 3;
+    uint64 actual_size = 4;
+    string ip = 5;
+    int32 port = 6;
+    map<string, string> replica_address_map = 7;
+    map<string, ReplicaMode> replica_mode_map = 8;
+    Lvol head = 9;
+    map<string, Lvol> snapshots = 10;
+    string frontend = 11;
+    string endpoint = 12;
+    string state = 13;
+    string error_msg = 14;
+}
+
+message EngineCreateRequest {
+    string name = 1;
+    string volume_name = 2;
+    uint64 spec_size = 3;
+    map<string, string> replica_address_map = 4;
+    string frontend = 5;
+    int32 port_count = 6;
+}
+
+message EngineDeleteRequest {
+    string name = 1;
+}
+
+message EngineGetRequest {
+    string name = 1;
+}
+
+message EngineListResponse {
+	map<string, Engine> engines = 1;
+}
+
+message EngineReplicaAddRequest {
+    string engine_name = 1;
+    string replica_name = 2;
+    string replica_address = 3;
+}
+
+
+message EngineReplicaListRequest {
+    string engine_name = 1;
+}
+
+message EngineReplicaListResponse {
+    map<string, Replica> replicas = 1;
+}
+
+message EngineReplicaDeleteRequest {
+    string engine_name = 1;
+    string replica_name = 2;
+    string replica_address = 3;
+}
+
+message SnapshotRequest {
+    string name = 1;
+    string snapshot_name = 2;
+    bool user_created = 3;
+}
+
+message SnapshotResponse {
+    string snapshot_name = 1;
+}
+
+message VersionOutput {
+    string version = 1;
+    string gitCommit = 2;
+    string buildDate = 3;
+
+    int64 cliAPIVersion = 4;
+    int64 cliAPIMinVersion = 5;
+    int64 controllerAPIVersion = 6;
+    int64 controllerAPIMinVersion = 7;
+    int64 dataFormatVersion = 8;
+    int64 dataFormatMinVersion = 9;
+}
+
+message VersionDetailGetReply {
+    VersionOutput version = 1;
+}
+
+message BackupCreateRequest {
+    string snapshot_name = 1;
+    string backup_target = 2;
+    string volume_name = 3;
+    int64 size = 4;
+    string engine_name = 5;
+    string replica_name = 6;
+    repeated string labels = 7;
+    map<string, string> credential = 8;
+    string backing_image_name = 9;
+    string backing_image_checksum = 10;
+    string backup_name = 11;
+    string compression_method = 12;
+    int32 concurrent_limit = 13;
+    string storage_class_name = 14;
+}
+
+message BackupCreateResponse {
+    string backup = 1;
+    bool is_incremental = 2;
+    string replica_address = 3;
+}
+
+message BackupStatusRequest {
+    string backup = 1;
+    string engine_name = 2;
+    string replica_address = 3;
+}
+
+message BackupStatusResponse {
+    int32 progress = 1;
+    string backup_url = 2;
+    string error = 3;
+    string snapshot_name = 4;
+    string state = 5;
+    string replica_address = 6;
+}
+
+message EngineBackupRestoreRequest {
+    string backup_url = 1;
+    string engine_name = 2;
+    string snapshot_name = 3;
+    map<string, string> credential = 4;
+    int32 concurrent_limit = 5;
+}
+
+message EngineBackupRestoreResponse {
+    map<string, string> errors = 4;
+}
+
+message EngineBackupRestoreFinishRequest {
+    string engine_name = 1;
+}
+
+message ReplicaBackupRestoreRequest {
+    string backup_url = 1;
+    string replica_name = 2;
+    string snapshot_name = 3;
+    map<string, string> credential = 4;
+    int32 concurrent_limit = 5;
+}
+
+message RestoreStatusRequest {
+    string engine_name = 1;
+}
+
+message ReplicaRestoreStatusRequest {
+    string replica_name = 2;
+}
+
+message ReplicaRestoreStatusResponse {
+    string replica_name = 1;
+    string replica_address = 2;
+    bool is_restoring = 3;
+    string last_restored = 4;
+    int32 progress = 5;
+    string error = 6;
+    string dest_file_name = 7;
+    string state = 8;
+    string backup_url = 9;
+    string current_restoring_backup = 10;
+}
+
+message RestoreStatusResponse {
+    map<string, ReplicaRestoreStatusResponse> status = 1;
+}
+
+message Disk {
+    string id = 1;
+    string uuid = 2;
+    string path = 3;
+    string type = 4;
+
+    int64 total_size = 5;
+    int64 free_size = 6;
+
+    int64 total_blocks = 7;
+    int64 free_blocks = 8;
+
+    int64 block_size = 9;
+    int64 cluster_size = 10;
+
+    string driver = 11;
+    string name = 12;
+}
+
+message DiskCreateRequest {
+    string disk_name = 1;
+    string disk_uuid = 2;
+    string disk_path = 3;
+    int64 block_size = 4;
+    string disk_driver = 5;
+}
+
+message DiskGetRequest {
+    string disk_name = 1;
+    string disk_driver = 2;
+    string disk_path = 3;
+}
+
+message DiskDeleteRequest {
+    string disk_name = 1;
+    string disk_uuid = 2;
+    string disk_path = 3;
+    string disk_driver = 4;
+}
+
+message LogSetLevelRequest {
+	string level = 1;
+}
+
+message LogSetFlagsRequest {
+	string flags = 1;
+}
+
+message LogGetLevelResponse {
+	string level = 1;
+}
+
+message LogGetFlagsResponse {
+	string flags = 1;
+}
diff --git a/protobuf/vendor/protobuf/src/google/protobuf/empty.proto b/protobuf/vendor/protobuf/src/google/protobuf/empty.proto
new file mode 100644
index 0000000..b87c89d
--- /dev/null
+++ b/protobuf/vendor/protobuf/src/google/protobuf/empty.proto
@@ -0,0 +1,51 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option go_package = "google.golang.org/protobuf/types/known/emptypb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "EmptyProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+option cc_enable_arenas = true;
+
+// A generic empty message that you can re-use to avoid defining duplicated
+// empty messages in your APIs. A typical example is to use it as the request
+// or the response type of an API method. For instance:
+//
+//     service Foo {
+//       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
+//     }
+//
+message Empty {}
diff --git a/scripts/checkdiff b/scripts/checkdiff
new file mode 100755
index 0000000..0cac228
--- /dev/null
+++ b/scripts/checkdiff
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+set -e
+
+cd $(dirname $0)
+
+./generate_grpc
+set +e
+
+output=`git diff --stat|grep -e ".pb.go" -e "_pb2.py" -e "_pb2_grpc.py"`
+if [ $? -eq 0 ]
+then
+	echo $output
+	echo GRPC generated code is not up to date
+	exit 1
+fi
diff --git a/scripts/ci b/scripts/ci
new file mode 100755
index 0000000..9c74b1a
--- /dev/null
+++ b/scripts/ci
@@ -0,0 +1,6 @@
+#!/bin/bash
+set -e
+
+cd $(dirname $0)
+
+./checkdiff
diff --git a/scripts/entry b/scripts/entry
new file mode 100755
index 0000000..486dc0f
--- /dev/null
+++ b/scripts/entry
@@ -0,0 +1,11 @@
+#!/bin/bash
+set -e
+
+trap "chown -R $DAPPER_UID:$DAPPER_GID ." exit
+
+mkdir -p bin
+if [ -e ./scripts/$1 ]; then
+    ./scripts/"$@"
+else
+    "$@"
+fi
diff --git a/scripts/generate_grpc b/scripts/generate_grpc
new file mode 100755
index 0000000..ae0cf11
--- /dev/null
+++ b/scripts/generate_grpc
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+set -e
+
+PROTOC_VER="${PROTOC_VER:-v24.3}"
+
+cd $(dirname $0)/..
+
+# check and download dependency for gRPC code generate
+if [ ! -e ./protobuf/vendor/protobuf/src/google/protobuf ]; then
+    rm -rf ./protobuf/vendor/protobuf/src/google/protobuf
+    DIR="./protobuf/vendor/protobuf/src/google/protobuf"
+    mkdir -p $DIR
+    wget https://raw.githubusercontent.com/protocolbuffers/protobuf/$PROTOC_VER/src/google/protobuf/empty.proto -P $DIR
+fi
+
+PY_BUILD_DIR_BASE=".pyprotobuild"
+GO_BUILD_DIR_BASE=".goprotobuild"
+mkdir -p "${PY_BUILD_DIR_BASE}" "${GO_BUILD_DIR_BASE}"
+
+for PROTO in ptypes imrpc bimrpc smrpc spdkrpc; do
+    for i in protobuf/${PROTO}/*.proto; do
+        python3 -m grpc_tools.protoc -I "protobuf/" -I "protobuf/vendor/" \
+            --python_out="${PY_BUILD_DIR_BASE}" \
+            --grpc_python_out="${PY_BUILD_DIR_BASE}" \
+            $i
+        protoc -I "protobuf/" -I "protobuf/vendor/" \
+            --go_out="${GO_BUILD_DIR_BASE}" --go_opt=paths=source_relative \
+            --go-grpc_out="${GO_BUILD_DIR_BASE}" --go-grpc_opt=paths=source_relative \
+            $i
+    done
+
+    mkdir -p generated-py/${PROTO}
+    for i in ${PY_BUILD_DIR_BASE}/${PROTO}/*.py; do
+        mv $i generated-py/${PROTO}/
+    done
+
+    mkdir -p pkg/generated/${PROTO}
+    for i in ${GO_BUILD_DIR_BASE}/${PROTO}/*.go; do
+        mv $i pkg/generated/${PROTO}/
+    done
+done
+
+# For backward compatible, we use ptypes as engine protobuf package name.
+# For golang, we would like to unify naming as <service>rpc, so we change it to enginerpc.
+mkdir -p pkg/generated/enginerpc
+mv pkg/generated/ptypes/* pkg/generated/enginerpc/
+rm -rf pkg/generated/ptypes
+
+rm -rf "${PY_BUILD_DIR_BASE}" "${GO_BUILD_DIR_BASE}"