From 2ce985b206c8ffda082642c3a4d122be864b7b71 Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Mon, 26 Oct 2026 03:42:24 -0700 Subject: [PATCH] fix(os): ID-map the Sysbox rootfs overlay instead of cloning it sysbox-mgr ran with --disable-ovfs-on-idmapped-mount, which forced Sysbox's chown fallback. That fallback clones the container rootfs into /var/lib/sysbox/rootfs/ and deletes the clone when Sysbox stops, losing every write made inside a Sysbox container. Dropping the flag alone is not enough. Stock Sysbox then ID-maps only the overlay lower layers and chowns the upper layer. If a container fails to start, that chown is never reverted. The retry sees a non-root rootfs owner, skips ID shifting, and image files show up as nobody:nogroup. Patch Sysbox to ID-map the merged overlay mount as a whole when the kernel supports it (the overlayfs backport in this stack). Nothing on disk is chowned, so no ownership state can be left behind, and writes stay in Docker's upper directory on the persistent data disk. sysbox-mgr probes the feature at startup; kernels without it keep the lower-layer mode. The patches are shared with the Yocto recipe, and the mgr protobuf file is regenerated for the new config field. Signed-off-by: Kevin Wang --- os/mkosi/components/sysbox/sysbox-build.sh | 3 + os/mkosi/tests/acceptance.sh | 6 + .../dstack-sysbox/dstack-sysbox_0.7.1.bb | 4 + .../files/sysbox-ipc-idmapped-overlayfs.patch | 64 ++++ .../sysbox-libs-idmapped-overlayfs.patch | 147 ++++++++ .../files/sysbox-mgr-idmapped-overlayfs.patch | 141 +++++++ .../dstack-sysbox/files/sysbox-mgr.service | 5 +- .../sysbox-runc-idmapped-overlayfs.patch | 148 ++++++++ .../files/sysboxMgrProtobuf.pb.go | 351 +++++++++--------- 9 files changed, 698 insertions(+), 171 deletions(-) create mode 100644 os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-ipc-idmapped-overlayfs.patch create mode 100644 os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-libs-idmapped-overlayfs.patch create mode 100644 os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-mgr-idmapped-overlayfs.patch create mode 100644 os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-runc-idmapped-overlayfs.patch diff --git a/os/mkosi/components/sysbox/sysbox-build.sh b/os/mkosi/components/sysbox/sysbox-build.sh index b5f065993..01f1b77e2 100755 --- a/os/mkosi/components/sysbox/sysbox-build.sh +++ b/os/mkosi/components/sysbox/sysbox-build.sh @@ -29,6 +29,9 @@ checkout https://github.com/nestybox/sysbox-mgr.git "$SYSBOX_MGR_REVISION" "$B/s checkout https://github.com/nestybox/sysbox-ipc.git "$SYSBOX_IPC_REVISION" "$B/sysbox-ipc" checkout https://github.com/nestybox/sysbox-libs.git "$SYSBOX_LIBS_REVISION" "$B/sysbox-libs" checkout https://github.com/Dstack-TEE/fuse.git "$SYSBOX_FUSE_REVISION" "$B/sysbox-fuse" +for repo in sysbox-libs sysbox-ipc sysbox-mgr sysbox-runc; do + patch -d "$B/$repo" -p1 --fuzz=0 < "$ROOT/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/$repo-idmapped-overlayfs.patch" +done rm -rf "$B/sysbox-fs/bazil"; ln -s "$B/sysbox-fuse" "$B/sysbox-fs/bazil" install -m0644 "$ROOT/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysboxFsProtobuf.pb.go" \ "$B/sysbox-ipc/sysboxFsGrpc/sysboxFsProtobuf/" diff --git a/os/mkosi/tests/acceptance.sh b/os/mkosi/tests/acceptance.sh index 75533f307..0e09651a3 100755 --- a/os/mkosi/tests/acceptance.sh +++ b/os/mkosi/tests/acceptance.sh @@ -225,6 +225,12 @@ grep -q '^STARGZ_VERSION=0.18.2$' "$D/versions.env" grep -q '^NERDCTL_VERSION=2.3.5$' "$D/versions.env" grep -q '^[[:space:]]*docker-cli$' "$D/mkosi.conf" grep -q '^SYSBOX_VERSION=0.7.1$' "$D/versions.env" +grep -q 'idmapped-overlayfs.patch' "$D/components/sysbox/sysbox-build.sh" +if grep -q -- '--disable-ovfs-on-idmapped-mount' \ + "$D/../yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-mgr.service"; then + echo "sysbox-mgr must not disable ID-mapped overlayfs" >&2 + exit 1 +fi grep -q '^ZFS_VERSION=2.4.0$' "$D/versions.env" grep -q -- '--fuzz=0' "$D/components/zfs/zfs-build.sh" # ZFS 2.4.0 declares Linux-Maximum 6.18; no out-of-tree compat patch is carried. diff --git a/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/dstack-sysbox_0.7.1.bb b/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/dstack-sysbox_0.7.1.bb index f6549d331..17411a3b9 100644 --- a/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/dstack-sysbox_0.7.1.bb +++ b/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/dstack-sysbox_0.7.1.bb @@ -28,6 +28,10 @@ SRC_URI = " \ git://github.com/nestybox/sysbox-ipc.git;nobranch=1;name=sysbox-ipc;protocol=https;destsuffix=sysbox-ipc \ git://github.com/nestybox/sysbox-libs.git;nobranch=1;name=sysbox-libs;protocol=https;destsuffix=sysbox-libs \ git://github.com/Dstack-TEE/fuse.git;branch=master;name=sysbox-fuse;protocol=https;destsuffix=sysbox-fuse \ + file://sysbox-libs-idmapped-overlayfs.patch;patchdir=../sysbox-libs \ + file://sysbox-ipc-idmapped-overlayfs.patch;patchdir=../sysbox-ipc \ + file://sysbox-mgr-idmapped-overlayfs.patch;patchdir=../sysbox-mgr \ + file://sysbox-runc-idmapped-overlayfs.patch;patchdir=../sysbox-runc \ file://sysbox.service \ file://sysbox-fs.service \ file://sysbox-mgr.service \ diff --git a/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-ipc-idmapped-overlayfs.patch b/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-ipc-idmapped-overlayfs.patch new file mode 100644 index 000000000..c4b962412 --- /dev/null +++ b/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-ipc-idmapped-overlayfs.patch @@ -0,0 +1,64 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Kevin Wang +Date: Mon, 26 Oct 2026 19:54:55 -0700 +Subject: [PATCH] sysbox-mgr: report ID-mapped overlayfs support to sysbox-runc + +Add ContainerConfig.IDMapMountOnOverlayfsOk so sysbox-runc can choose +the ID-mapped overlayfs rootfs mode. + +Signed-off-by: Kevin Wang +--- + sysboxMgrGrpc/grpcClient.go | 1 + + sysboxMgrGrpc/grpcServer.go | 1 + + sysboxMgrGrpc/sysboxMgrProtobuf/sysboxMgrProtobuf.proto | 1 + + sysboxMgrLib/sysboxMgrLib.go | 1 + + 4 files changed, 4 insertions(+) + +diff --git a/sysboxMgrGrpc/grpcClient.go b/sysboxMgrGrpc/grpcClient.go +index ec38e82..e860d3c 100644 +--- a/sysboxMgrGrpc/grpcClient.go ++++ b/sysboxMgrGrpc/grpcClient.go +@@ -84,6 +84,7 @@ func Register(regInfo *ipcLib.RegistrationInfo) (*ipcLib.ContainerConfig, error) + ShiftfsOnOverlayfsOk: resp.ContainerConfig.GetShiftfsOnOverlayfsOk(), + IDMapMountOk: resp.ContainerConfig.GetIDMapMountOk(), + OverlayfsOnIDMapMountOk: resp.ContainerConfig.GetOverlayfsOnIDMapMountOk(), ++ IDMapMountOnOverlayfsOk: resp.ContainerConfig.GetIDMapMountOnOverlayfsOk(), + NoRootfsCloning: resp.ContainerConfig.GetNoRootfsCloning(), + IgnoreSysfsChown: resp.ContainerConfig.GetIgnoreSysfsChown(), + AllowTrustedXattr: resp.ContainerConfig.GetAllowTrustedXattr(), +diff --git a/sysboxMgrGrpc/grpcServer.go b/sysboxMgrGrpc/grpcServer.go +index 009fb6b..177db64 100644 +--- a/sysboxMgrGrpc/grpcServer.go ++++ b/sysboxMgrGrpc/grpcServer.go +@@ -128,6 +128,7 @@ func (s *ServerStub) Register(ctx context.Context, req *pb.RegisterReq) (*pb.Reg + ShiftfsOnOverlayfsOk: config.ShiftfsOnOverlayfsOk, + IDMapMountOk: config.IDMapMountOk, + OverlayfsOnIDMapMountOk: config.OverlayfsOnIDMapMountOk, ++ IDMapMountOnOverlayfsOk: config.IDMapMountOnOverlayfsOk, + NoRootfsCloning: config.NoRootfsCloning, + IgnoreSysfsChown: config.IgnoreSysfsChown, + AllowTrustedXattr: config.AllowTrustedXattr, +diff --git a/sysboxMgrGrpc/sysboxMgrProtobuf/sysboxMgrProtobuf.proto b/sysboxMgrGrpc/sysboxMgrProtobuf/sysboxMgrProtobuf.proto +index 392e4fe..7960641 100644 +--- a/sysboxMgrGrpc/sysboxMgrProtobuf/sysboxMgrProtobuf.proto ++++ b/sysboxMgrGrpc/sysboxMgrProtobuf/sysboxMgrProtobuf.proto +@@ -90,6 +90,7 @@ message ContainerConfig { + uint32 rootfsUidShiftType = 15; + bool noShiftfsOnFuse = 16; + bool relaxedReadOnly = 17; ++ bool IDMapMountOnOverlayfsOk = 18; + } + + message RegisterResp { +diff --git a/sysboxMgrLib/sysboxMgrLib.go b/sysboxMgrLib/sysboxMgrLib.go +index 9f8272d..d9ed601 100644 +--- a/sysboxMgrLib/sysboxMgrLib.go ++++ b/sysboxMgrLib/sysboxMgrLib.go +@@ -51,6 +51,7 @@ type ContainerConfig struct { + NoShiftfsOnFuse bool + IDMapMountOk bool + OverlayfsOnIDMapMountOk bool ++ IDMapMountOnOverlayfsOk bool + NoRootfsCloning bool + IgnoreSysfsChown bool + AllowTrustedXattr bool diff --git a/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-libs-idmapped-overlayfs.patch b/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-libs-idmapped-overlayfs.patch new file mode 100644 index 000000000..f13bcd4b1 --- /dev/null +++ b/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-libs-idmapped-overlayfs.patch @@ -0,0 +1,147 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Kevin Wang +Date: Mon, 26 Oct 2026 19:54:55 -0700 +Subject: [PATCH] idMap: add ID-mapped overlayfs shift type and probe + +Add the IDMappedOverlayfs shift type, appended so existing values keep +their meaning, and IDMapMountSupportedOnOverlayfs(), which mounts a test +overlay and ID-maps the merged mount. The kernel rejects that with +EINVAL unless overlayfs supports ID-mapped mounts (Linux 7.3, or a +backport), so EINVAL reports the feature as unsupported. + +IDMapMount now wraps the mount_setattr errno so callers can inspect it. + +Signed-off-by: Kevin Wang +--- + idMap/idMapMount.go | 63 +++++++++++++++++++++++++++--------- + idShiftUtils/idShiftUtils.go | 1 + + 2 files changed, 49 insertions(+), 15 deletions(-) + +diff --git a/idMap/idMapMount.go b/idMap/idMapMount.go +index aaff4c9..9fe790b 100644 +--- a/idMap/idMapMount.go ++++ b/idMap/idMapMount.go +@@ -86,7 +86,7 @@ func IDMapMount(usernsPath, mountPath string, unmountFirst bool) error { + + err = unix.MountSetattr(int(fdTree), "", unix.AT_EMPTY_PATH|unix.AT_RECURSIVE, mountAttr) + if err != nil { +- return fmt.Errorf("Failed to set mount attr: %s", err) ++ return fmt.Errorf("Failed to set mount attr: %w", err) + } + + // Unmount the original mountPath mount to prevent redundant / stacked mounting +@@ -120,7 +120,7 @@ func IDMapMountSupported(dir string) (bool, error) { + return false, nil + } + +- return runIDMapMountCheckOnHost(dir, false) ++ return runIDMapMountCheckOnHost(dir, idMapCheckDir) + } + + // OverlayfsOnIDMapMountSupported checks if overlayfs over ID-mapped lower +@@ -137,13 +137,37 @@ func OverlayfsOnIDMapMountSupported(dir string) (bool, error) { + return false, nil + } + +- return runIDMapMountCheckOnHost(dir, true) ++ return runIDMapMountCheckOnHost(dir, idMapCheckOverlayfsLower) + } + +-// runIDMapMountCheckOnHost runs a quick test on the host to check if ID-mapping is +-// supported. dir is the path where the test will run. If checkOnOverlayfs +-// is true, the test checks if overlayfs supports ID-mapped lower layers. +-func runIDMapMountCheckOnHost(dir string, checkOnOverlayfs bool) (bool, error) { ++// IDMapMountSupportedOnOverlayfs checks if an overlayfs mount itself (i.e., the ++// merged mount rather than its lower layers) can be ID-mapped on the host. ++func IDMapMountSupportedOnOverlayfs(dir string) (bool, error) { ++ ++ // This builds on overlayfs over ID-mapped lower layers (Linux >= 5.19) ++ kernelOK, err := checkKernelVersion(5, 19) ++ if err != nil { ++ return false, err ++ } ++ ++ if !kernelOK { ++ return false, nil ++ } ++ ++ return runIDMapMountCheckOnHost(dir, idMapCheckOverlayfsMerged) ++} ++ ++type idMapCheck int ++ ++const ( ++ idMapCheckDir idMapCheck = iota ++ idMapCheckOverlayfsLower ++ idMapCheckOverlayfsMerged ++) ++ ++// runIDMapMountCheckOnHost runs a quick test on the host to check if the given ++// kind of ID-mapping is supported. dir is the path where the test will run. ++func runIDMapMountCheckOnHost(dir string, check idMapCheck) (bool, error) { + var ( + lowerDir, upperDir, workDir, idMapDir string + ) +@@ -161,7 +185,7 @@ func runIDMapMountCheckOnHost(dir string, checkOnOverlayfs bool) (bool, error) { + return false, err + } + +- if checkOnOverlayfs { ++ if check != idMapCheckDir { + lowerDir = filepath.Join(tmpDir, "lower") + upperDir = filepath.Join(tmpDir, "upper") + workDir = filepath.Join(tmpDir, "work") +@@ -202,25 +226,34 @@ func runIDMapMountCheckOnHost(dir string, checkOnOverlayfs bool) (bool, error) { + // Create the ID mapped mount associated with the child process user-ns + usernsPath := fmt.Sprintf("/proc/%d/ns/user", pid) + +- if checkOnOverlayfs { ++ opts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lowerDir, upperDir, workDir) ++ ++ switch check { ++ case idMapCheckDir: ++ idMapDir = testDir ++ case idMapCheckOverlayfsLower: + idMapDir = lowerDir +- } else { ++ case idMapCheckOverlayfsMerged: ++ if err := unix.Mount("overlay", testDir, "overlay", 0, opts); err != nil { ++ return false, err ++ } ++ defer unix.Unmount(testDir, unix.MNT_DETACH) + idMapDir = testDir + } + + if err := IDMapMount(usernsPath, idMapDir, false); err != nil { ++ if check == idMapCheckOverlayfsMerged && errors.Is(err, unix.EINVAL) { ++ return false, nil ++ } + return false, errors.Wrap(err, "create mapped mount") + } + defer unix.Unmount(idMapDir, unix.MNT_DETACH) + +- if checkOnOverlayfs { +- opts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lowerDir, upperDir, workDir) +- flags := uintptr(0) +- if err := unix.Mount("overlay", testDir, "overlay", flags, opts); err != nil { ++ if check == idMapCheckOverlayfsLower { ++ if err := unix.Mount("overlay", testDir, "overlay", 0, opts); err != nil { + return false, err + } + unix.Unmount(testDir, unix.MNT_DETACH) +- return true, nil + } + + return true, nil +diff --git a/idShiftUtils/idShiftUtils.go b/idShiftUtils/idShiftUtils.go +index 9e9b410..78d33a3 100644 +--- a/idShiftUtils/idShiftUtils.go ++++ b/idShiftUtils/idShiftUtils.go +@@ -42,6 +42,7 @@ const ( + IDMappedMount + IDMappedMountOrShiftfs + Chown ++ IDMappedOverlayfs + ) + + type aclType int diff --git a/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-mgr-idmapped-overlayfs.patch b/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-mgr-idmapped-overlayfs.patch new file mode 100644 index 000000000..18ce10a12 --- /dev/null +++ b/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-mgr-idmapped-overlayfs.patch @@ -0,0 +1,141 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Kevin Wang +Date: Mon, 26 Oct 2026 19:54:55 -0700 +Subject: [PATCH] mgr: probe ID-mapped overlayfs support + +Probe whether the merged overlayfs mount can be ID-mapped and pass the +result to sysbox-runc. --disable-idmapped-mount and +--disable-ovfs-on-idmapped-mount also disable it. + +A rootfs in this mode keeps its on-disk ownership, so mount syncing +needs no chown, and update/pause/resume/unregister leave it alone: +they only revert the upper-layer chown of the IDMappedMount mode. + +Signed-off-by: Kevin Wang +--- + mgr.go | 10 ++++++++-- + utils.go | 19 ++++++++++++------- + 2 files changed, 20 insertions(+), 9 deletions(-) + +diff --git a/mgr.go b/mgr.go +index 87e6a85..b99ab8d 100644 +--- a/mgr.go ++++ b/mgr.go +@@ -95,6 +95,7 @@ type mgrConfig struct { + shiftfsOnOverlayfsOk bool + idMapMountOk bool + overlayfsOnIDMapMountOk bool ++ idMapMountOnOvfsOk bool + noRootfsCloning bool + ignoreSysfsChown bool + allowTrustedXattr bool +@@ -242,9 +243,10 @@ func newSysboxMgr(ctx *cli.Context) (*SysboxMgr, error) { + + idMapMountOk := false + ovfsOnIDMapMountOk := false ++ idMapMountOnOvfsOk := false + + if !ctx.GlobalBool("disable-idmapped-mount") { +- idMapMountOk, ovfsOnIDMapMountOk, err = checkIDMapMountSupport(ctx) ++ idMapMountOk, ovfsOnIDMapMountOk, idMapMountOnOvfsOk, err = checkIDMapMountSupport(ctx) + if err != nil { + return nil, fmt.Errorf("ID-mapping check failed: %v", err) + } +@@ -252,6 +254,7 @@ func newSysboxMgr(ctx *cli.Context) (*SysboxMgr, error) { + + if ctx.GlobalBool("disable-ovfs-on-idmapped-mount") { + ovfsOnIDMapMountOk = false ++ idMapMountOnOvfsOk = false + } + + shiftfsModPresent := false +@@ -310,6 +313,7 @@ func newSysboxMgr(ctx *cli.Context) (*SysboxMgr, error) { + shiftfsOnOverlayfsOk: shiftfsOnOvfsOk, + idMapMountOk: idMapMountOk, + overlayfsOnIDMapMountOk: ovfsOnIDMapMountOk, ++ idMapMountOnOvfsOk: idMapMountOnOvfsOk, + noRootfsCloning: ctx.GlobalBool("disable-rootfs-cloning"), + ignoreSysfsChown: ctx.GlobalBool("ignore-sysfs-chown"), + allowTrustedXattr: ctx.GlobalBool("allow-trusted-xattr"), +@@ -346,6 +350,7 @@ func newSysboxMgr(ctx *cli.Context) (*SysboxMgr, error) { + logrus.Info("Use of overlayfs on ID-mapped mounts disabled.") + } else { + logrus.Infof("Overlayfs on ID-mapped mounts supported by kernel: %s", ifThenElse(mgrCfg.overlayfsOnIDMapMountOk, "yes", "no")) ++ logrus.Infof("ID-mapped overlayfs mounts supported by kernel: %s", ifThenElse(mgrCfg.idMapMountOnOvfsOk, "yes", "no")) + } + + if mgrCfg.noRootfsCloning { +@@ -615,6 +620,7 @@ func (mgr *SysboxMgr) register(regInfo *ipcLib.RegistrationInfo) (*ipcLib.Contai + ShiftfsOnOverlayfsOk: mgr.mgrCfg.shiftfsOnOverlayfsOk, + IDMapMountOk: mgr.mgrCfg.idMapMountOk, + OverlayfsOnIDMapMountOk: mgr.mgrCfg.overlayfsOnIDMapMountOk, ++ IDMapMountOnOverlayfsOk: mgr.mgrCfg.idMapMountOnOvfsOk, + NoRootfsCloning: mgr.mgrCfg.noRootfsCloning, + IgnoreSysfsChown: mgr.mgrCfg.ignoreSysfsChown, + AllowTrustedXattr: mgr.mgrCfg.allowTrustedXattr, +@@ -980,7 +986,7 @@ func (mgr *SysboxMgr) reqMounts(id string, rootfsUidShiftType idShiftUtils.IDShi + + switch rootfsUidShiftType { + +- case idShiftUtils.IDMappedMount: ++ case idShiftUtils.IDMappedMount, idShiftUtils.IDMappedOverlayfs: + volChownOnSync = false + volUid = 0 + volGid = 0 +diff --git a/utils.go b/utils.go +index 92389f5..61a1445 100644 +--- a/utils.go ++++ b/utils.go +@@ -912,7 +912,7 @@ func getInode(file string) (uint64, error) { + return st.Ino, nil + } + +-func checkIDMapMountSupport(ctx *cli.Context) (bool, bool, error) { ++func checkIDMapMountSupport(ctx *cli.Context) (bool, bool, bool, error) { + + // The sysbox lib dir may have restrictive permissions; loosen those up + // temporarily while we perform the ID-map check since it runs inside a +@@ -921,12 +921,12 @@ func checkIDMapMountSupport(ctx *cli.Context) (bool, bool, error) { + // write-other permissions. + fi, err := os.Stat(sysboxLibDir) + if err != nil { +- return false, false, err ++ return false, false, false, err + } + origPerm := fi.Mode() + + if err := os.Chmod(sysboxLibDir, 0755); err != nil { +- return false, false, fmt.Errorf("failed to chmod %s to 0755: %s", sysboxLibDir, err) ++ return false, false, false, fmt.Errorf("failed to chmod %s to 0755: %s", sysboxLibDir, err) + } + + defer func() { +@@ -935,19 +935,24 @@ func checkIDMapMountSupport(ctx *cli.Context) (bool, bool, error) { + + IDMapMountOk, err := idMap.IDMapMountSupported(sysboxLibDir) + if err != nil { +- return false, false, fmt.Errorf("failed to check kernel ID-mapping support: %v", err) ++ return false, false, false, fmt.Errorf("failed to check kernel ID-mapping support: %v", err) + } + + ovfsOnIDMapMountOk, err := idMap.OverlayfsOnIDMapMountSupported(sysboxLibDir) + if err != nil { +- return false, false, fmt.Errorf("failed to check kernel ID-mapping-on-overlayfs support: %v", err) ++ return false, false, false, fmt.Errorf("failed to check kernel ID-mapping-on-overlayfs support: %v", err) ++ } ++ ++ idMapMountOnOvfsOk, err := idMap.IDMapMountSupportedOnOverlayfs(sysboxLibDir) ++ if err != nil { ++ return false, false, false, fmt.Errorf("failed to check kernel ID-mapped overlayfs mount support: %v", err) + } + + if err := os.Chmod(sysboxLibDir, origPerm); err != nil { +- return false, false, fmt.Errorf("failed to chmod %s back to %o: %s", sysboxLibDir, origPerm, err) ++ return false, false, false, fmt.Errorf("failed to chmod %s back to %o: %s", sysboxLibDir, origPerm, err) + } + +- return IDMapMountOk, ovfsOnIDMapMountOk, nil ++ return IDMapMountOk, ovfsOnIDMapMountOk, idMapMountOnOvfsOk, nil + } + + func checkShiftfsSupport(ctx *cli.Context) (bool, bool, error) { diff --git a/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-mgr.service b/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-mgr.service index 8bcfcd026..33ad209ef 100644 --- a/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-mgr.service +++ b/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-mgr.service @@ -5,7 +5,10 @@ After=dstack-prepare.service [Service] Type=notify -ExecStart=/usr/bin/sysbox-mgr --data-root /var/lib/sysbox --disable-ovfs-on-idmapped-mount +# Requires overlayfs idmapped-mount support (backported into this tree from +# Linux 7.3). Without it Sysbox probes support incorrectly and the runtime +# mount_setattr() fails with EINVAL. +ExecStart=/usr/bin/sysbox-mgr --data-root /var/lib/sysbox TimeoutStartSec=45 TimeoutStopSec=90 StartLimitInterval=0 diff --git a/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-runc-idmapped-overlayfs.patch b/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-runc-idmapped-overlayfs.patch new file mode 100644 index 000000000..17aec3f01 --- /dev/null +++ b/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysbox-runc-idmapped-overlayfs.patch @@ -0,0 +1,148 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Kevin Wang +Date: Mon, 26 Oct 2026 19:54:55 -0700 +Subject: [PATCH] rootfs: ID-map the merged overlayfs mount when supported + +When the kernel can ID-map an overlayfs mount, ID-map the container's +existing rootfs overlay mount as a whole instead of ID-mapping its lower +layers and chowning the upper layer. Nothing on disk is chowned, so +there is no ownership state to revert when the container stops, pauses +or fails to start. + +This fixes retries after a failed start: the upper layer used to stay +chowned to the container's host UID, the retry then concluded that no +shifting was needed, and image files showed up as nobody:nogroup. + +Kernels without the feature keep using the lower-layer mode. + +Signed-off-by: Kevin Wang +--- + libcontainer/rootfs_init_linux.go | 11 +++++++---- + libcontainer/rootfs_linux.go | 12 +++++++----- + libcontainer/standard_init_linux.go | 3 +++ + libsysbox/sysbox/sysbox.go | 14 +++++++++++--- + 4 files changed, 28 insertions(+), 12 deletions(-) + +diff --git a/libcontainer/rootfs_init_linux.go b/libcontainer/rootfs_init_linux.go +index 88fe7b9..80696bd 100644 +--- a/libcontainer/rootfs_init_linux.go ++++ b/libcontainer/rootfs_init_linux.go +@@ -328,7 +328,7 @@ func (l *linuxRootfsInit) Init() error { + return err + } + +- if fsName == "overlayfs" { ++ if fsName == "overlayfs" && !l.reqs[0].IDMapOverlayfs { + + // Get info about the ovfs mount (layers, mount opts, propagation, etc.) + mounts, err := sysboxmount.GetMountsPid(uint32(os.Getpid())) +@@ -468,9 +468,12 @@ func (l *linuxRootfsInit) Init() error { + } + + // ID-mapping by itself won't allow the container to write to "/"; must +- // chown the rootfs dir so that it can write there. +- if err := unix.Chown(rootfs, uid, gid); err != nil { +- return newSystemErrorWithCausef(err, "failed to chown %s to %v:%v", rootfs, uid, gid) ++ // chown the rootfs dir so that it can write there. Not needed for an ++ // ID-mapped overlayfs mount, which must leave on-disk ownership intact. ++ if !l.reqs[0].IDMapOverlayfs { ++ if err := unix.Chown(rootfs, uid, gid); err != nil { ++ return newSystemErrorWithCausef(err, "failed to chown %s to %v:%v", rootfs, uid, gid) ++ } + } + + case bind: +diff --git a/libcontainer/rootfs_linux.go b/libcontainer/rootfs_linux.go +index 314d27b..feb6243 100644 +--- a/libcontainer/rootfs_linux.go ++++ b/libcontainer/rootfs_linux.go +@@ -62,7 +62,8 @@ func needsSetupDev(config *configs.Config) bool { + func prepareRootfs(pipe io.ReadWriter, iConfig *initConfig) (err error) { + config := iConfig.Config + +- if config.RootfsUidShiftType == sh.IDMappedMount { ++ if config.RootfsUidShiftType == sh.IDMappedMount || ++ config.RootfsUidShiftType == sh.IDMappedOverlayfs { + if err := doRootfsIDMapping(config, pipe); err != nil { + return newSystemErrorWithCause(err, "ID-mapping rootfs") + } +@@ -1308,10 +1309,11 @@ func mountPropagate(m *configs.Mount, rootfs string, mountLabel string) error { + func doRootfsIDMapping(config *configs.Config, pipe io.ReadWriter) error { + reqs := []opReq{ + { +- Op: rootfsIDMap, +- Rootfs: config.Rootfs, +- Uid: config.UidMappings[0].HostID, +- Gid: config.GidMappings[0].HostID, ++ Op: rootfsIDMap, ++ Rootfs: config.Rootfs, ++ Uid: config.UidMappings[0].HostID, ++ Gid: config.GidMappings[0].HostID, ++ IDMapOverlayfs: config.RootfsUidShiftType == sh.IDMappedOverlayfs, + }, + } + +diff --git a/libcontainer/standard_init_linux.go b/libcontainer/standard_init_linux.go +index 6c0ecb1..ab1f9c1 100644 +--- a/libcontainer/standard_init_linux.go ++++ b/libcontainer/standard_init_linux.go +@@ -63,6 +63,9 @@ type opReq struct { + Uid int `json:"uid"` + Gid int `json:"gid"` + Mode os.FileMode `json:"mode"` ++ ++ // rootfsIDMap ++ IDMapOverlayfs bool `json:"idmap_overlayfs"` + } + + func (l *linuxStandardInit) getSessionRingParams() (string, uint32, uint32) { +diff --git a/libsysbox/sysbox/sysbox.go b/libsysbox/sysbox/sysbox.go +index a287366..d100f80 100644 +--- a/libsysbox/sysbox/sysbox.go ++++ b/libsysbox/sysbox/sysbox.go +@@ -155,6 +155,7 @@ func CheckUidShifting(sysMgr *Mgr, spec *specs.Spec) (sh.IDShiftType, sh.IDShift + + idMapMountOk := sysMgr.Config.IDMapMountOk + ovfsOnIDMapMountOk := sysMgr.Config.OverlayfsOnIDMapMountOk ++ idMapMountOnOvfsOk := sysMgr.Config.IDMapMountOnOverlayfsOk + + rootfsShiftType := sysMgr.Config.RootfsUidShiftType + +@@ -162,6 +163,7 @@ func CheckUidShifting(sysMgr *Mgr, spec *specs.Spec) (sh.IDShiftType, sh.IDShift + + useShiftfsOnRootfs := false + useIDMapMountOnRootfs := false ++ useIDMappedOvfsOnRootfs := false + + rootPathFs, err := libutils.GetFsName(spec.Root.Path) + if err != nil { +@@ -169,7 +171,9 @@ func CheckUidShifting(sysMgr *Mgr, spec *specs.Spec) (sh.IDShiftType, sh.IDShift + } + + if idMapMountOk { +- if rootPathFs == "overlayfs" && ovfsOnIDMapMountOk { ++ if rootPathFs == "overlayfs" && idMapMountOnOvfsOk { ++ useIDMappedOvfsOnRootfs = true ++ } else if rootPathFs == "overlayfs" && ovfsOnIDMapMountOk { + useIDMapMountOnRootfs = true + } + } +@@ -188,12 +192,16 @@ func CheckUidShifting(sysMgr *Mgr, spec *specs.Spec) (sh.IDShiftType, sh.IDShift + // Check uid shifting type to be used for the container's rootfs. + // + // We do it via ID-mapping (preferably) or via shiftfs (if available on +- // the host) or by chown'ing the rootfs hierarchy. Chowning is the least ++ // the host) or by chown'ing the rootfs hierarchy. ID-mapping the merged ++ // overlayfs mount is preferred over ID-mapping its lower layers, since ++ // the latter requires chown'ing the upper layer. Chowning is the least + // preferred and slowest approach, but won't disrupt anything on the host + // since the container's rootfs is dedicated to the container (no other + // entity in the system will use it while the container is running). + if needShiftOnRootfs { +- if useIDMapMountOnRootfs { ++ if useIDMappedOvfsOnRootfs { ++ rootfsShiftType = sh.IDMappedOverlayfs ++ } else if useIDMapMountOnRootfs { + rootfsShiftType = sh.IDMappedMount + } else if useShiftfsOnRootfs { + rootfsShiftType = sh.Shiftfs diff --git a/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysboxMgrProtobuf.pb.go b/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysboxMgrProtobuf.pb.go index 1c0364d2f..ca138fbf9 100644 --- a/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysboxMgrProtobuf.pb.go +++ b/os/yocto/layers/meta-dstack/recipes-core/dstack-sysbox/files/sysboxMgrProtobuf.pb.go @@ -200,6 +200,7 @@ type ContainerConfig struct { RootfsUidShiftType uint32 `protobuf:"varint,15,opt,name=rootfsUidShiftType,proto3" json:"rootfsUidShiftType,omitempty"` NoShiftfsOnFuse bool `protobuf:"varint,16,opt,name=noShiftfsOnFuse,proto3" json:"noShiftfsOnFuse,omitempty"` RelaxedReadOnly bool `protobuf:"varint,17,opt,name=relaxedReadOnly,proto3" json:"relaxedReadOnly,omitempty"` + IDMapMountOnOverlayfsOk bool `protobuf:"varint,18,opt,name=IDMapMountOnOverlayfsOk,proto3" json:"IDMapMountOnOverlayfsOk,omitempty"` } func (x *ContainerConfig) Reset() { @@ -353,6 +354,13 @@ func (x *ContainerConfig) GetRelaxedReadOnly() bool { return false } +func (x *ContainerConfig) GetIDMapMountOnOverlayfsOk() bool { + if x != nil { + return x.IDMapMountOnOverlayfsOk + } + return false +} + type RegisterResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1924,7 +1932,7 @@ var file_sysboxMgrProtobuf_proto_rawDesc = []byte{ 0x69, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x44, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x67, 0x69, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, - 0x67, 0x73, 0x22, 0xd9, 0x05, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x67, 0x73, 0x22, 0x93, 0x06, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x44, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x44, 0x6e, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4f, 0x6b, 0x18, @@ -1969,181 +1977,184 @@ var file_sysboxMgrProtobuf_proto_rawDesc = []byte{ 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6e, 0x6f, 0x53, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4f, 0x6e, 0x46, 0x75, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x6c, 0x61, 0x78, 0x65, 0x64, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, - 0x65, 0x6c, 0x61, 0x78, 0x65, 0x64, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x53, - 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x43, - 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x22, 0xe7, 0x01, 0x0a, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x65, 0x74, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x65, 0x74, 0x6e, 0x73, 0x12, - 0x35, 0x0a, 0x0b, 0x75, 0x69, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x49, 0x44, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x69, 0x64, 0x4d, 0x61, - 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x67, 0x69, 0x64, 0x4d, 0x61, 0x70, - 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x44, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, - 0x52, 0x0b, 0x67, 0x69, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2e, 0x0a, - 0x12, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x55, 0x69, 0x64, 0x53, 0x68, 0x69, 0x66, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x72, 0x6f, 0x6f, 0x74, 0x66, - 0x73, 0x55, 0x69, 0x64, 0x53, 0x68, 0x69, 0x66, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x0c, 0x0a, - 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x1f, 0x0a, 0x0d, 0x55, - 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x10, 0x0a, 0x0e, - 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x33, - 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x69, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x71, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, - 0x69, 0x7a, 0x65, 0x22, 0x34, 0x0a, 0x0e, 0x53, 0x75, 0x62, 0x69, 0x64, 0x41, 0x6c, 0x6c, 0x6f, - 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x22, 0x45, 0x0a, 0x0d, 0x4d, 0x6f, 0x75, - 0x6e, 0x74, 0x50, 0x72, 0x65, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, + 0x65, 0x6c, 0x61, 0x78, 0x65, 0x64, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x38, + 0x0a, 0x17, 0x49, 0x44, 0x4d, 0x61, 0x70, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4f, 0x6e, 0x4f, 0x76, + 0x65, 0x72, 0x6c, 0x61, 0x79, 0x66, 0x73, 0x4f, 0x6b, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x17, 0x49, 0x44, 0x4d, 0x61, 0x70, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4f, 0x6e, 0x4f, 0x76, 0x65, + 0x72, 0x6c, 0x61, 0x79, 0x66, 0x73, 0x4f, 0x6b, 0x22, 0x53, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x43, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xe7, 0x01, + 0x0a, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x65, 0x74, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6e, 0x65, 0x74, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x75, 0x69, 0x64, + 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x44, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x69, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x35, 0x0a, 0x0b, 0x67, 0x69, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x49, 0x44, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x67, 0x69, 0x64, 0x4d, + 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x6f, 0x6f, 0x74, 0x66, + 0x73, 0x55, 0x69, 0x64, 0x53, 0x68, 0x69, 0x66, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x12, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x55, 0x69, 0x64, 0x53, 0x68, + 0x69, 0x66, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x0c, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x1f, 0x0a, 0x0d, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x10, 0x0a, 0x0e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x33, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x69, + 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x34, 0x0a, + 0x0e, 0x53, 0x75, 0x62, 0x69, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x75, 0x69, + 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, + 0x67, 0x69, 0x64, 0x22, 0x45, 0x0a, 0x0d, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x70, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x22, 0x77, 0x0a, 0x0c, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x70, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x67, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x33, + 0x0a, 0x08, 0x70, 0x72, 0x65, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, + 0x74, 0x50, 0x72, 0x65, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x72, 0x65, 0x70, 0x4c, + 0x69, 0x73, 0x74, 0x22, 0x0f, 0x0a, 0x0d, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x22, 0x36, 0x0a, 0x0c, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x74, 0x22, 0x7c, 0x0a, 0x08, + 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x6f, 0x6f, 0x74, + 0x66, 0x73, 0x55, 0x69, 0x64, 0x53, 0x68, 0x69, 0x66, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x55, 0x69, 0x64, 0x53, + 0x68, 0x69, 0x66, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x4c, + 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x07, 0x72, 0x65, 0x71, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x59, 0x0a, 0x05, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x70, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x03, 0x6f, 0x70, 0x74, 0x22, 0x34, 0x0a, 0x09, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x27, 0x0a, 0x06, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x06, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x41, 0x0a, 0x0b, 0x53, + 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, - 0x22, 0x77, 0x0a, 0x0c, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x70, 0x52, 0x65, 0x71, + 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x22, 0x5b, + 0x0a, 0x0e, 0x53, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x75, - 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x03, 0x67, 0x69, 0x64, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x70, 0x4c, 0x69, 0x73, 0x74, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x08, 0x70, 0x72, 0x65, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x0f, 0x0a, 0x0d, 0x4d, 0x6f, 0x75, - 0x6e, 0x74, 0x50, 0x72, 0x65, 0x70, 0x52, 0x65, 0x73, 0x70, 0x22, 0x36, 0x0a, 0x0c, 0x4d, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, + 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x0c, 0x73, + 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x73, 0x22, 0x4c, 0x0a, 0x0f, 0x53, + 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x12, 0x39, + 0x0a, 0x0c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x53, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x0c, 0x73, 0x68, 0x69, + 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x73, 0x22, 0x34, 0x0a, 0x0a, 0x46, 0x73, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x74, 0x66, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x22, + 0x57, 0x0a, 0x07, 0x46, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, - 0x73, 0x74, 0x22, 0x7c, 0x0a, 0x08, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, - 0x0a, 0x12, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x55, 0x69, 0x64, 0x53, 0x68, 0x69, 0x66, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x72, 0x6f, 0x6f, 0x74, - 0x66, 0x73, 0x55, 0x69, 0x64, 0x53, 0x68, 0x69, 0x66, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x30, - 0x0a, 0x07, 0x72, 0x65, 0x71, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72, 0x65, 0x71, 0x4c, 0x69, 0x73, 0x74, - 0x22, 0x59, 0x0a, 0x05, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x64, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x70, 0x74, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x6f, 0x70, 0x74, 0x22, 0x34, 0x0a, 0x09, 0x4d, - 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x27, 0x0a, 0x06, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x73, 0x22, 0x41, 0x0a, 0x0b, 0x53, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, - 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, - 0x6f, 0x6e, 0x6c, 0x79, 0x22, 0x5b, 0x0a, 0x0e, 0x53, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, - 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x66, - 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, - 0x61, 0x72, 0x6b, 0x52, 0x0c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, - 0x73, 0x22, 0x4c, 0x0a, 0x0f, 0x53, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, - 0x61, 0x72, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, - 0x6b, 0x52, 0x0c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x73, 0x22, - 0x34, 0x0a, 0x0a, 0x46, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, - 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x22, 0x57, 0x0a, 0x07, 0x46, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x64, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x74, 0x22, 0x3e, - 0x0a, 0x0b, 0x46, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2f, 0x0a, - 0x09, 0x66, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x09, 0x66, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x1a, - 0x0a, 0x08, 0x50, 0x61, 0x75, 0x73, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x0b, 0x0a, 0x09, 0x50, 0x61, - 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x1b, 0x0a, 0x09, 0x52, 0x65, 0x73, 0x75, 0x6d, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0b, 0x46, 0x73, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2f, 0x0a, 0x09, 0x66, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x66, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x1a, 0x0a, 0x08, 0x50, 0x61, 0x75, 0x73, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x22, 0x0c, 0x0a, 0x0a, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x22, 0x20, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x66, - 0x73, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x22, 0x29, 0x0a, 0x0f, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x52, 0x6f, 0x6f, - 0x74, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x74, 0x66, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x22, - 0x62, 0x0a, 0x14, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, - 0x6f, 0x74, 0x66, 0x73, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x69, 0x64, 0x4f, 0x66, - 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x75, 0x69, 0x64, 0x4f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x69, 0x64, 0x4f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x67, 0x69, 0x64, 0x4f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x43, 0x6c, 0x6f, 0x6e, - 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x2c, 0x0a, 0x1a, - 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, - 0x66, 0x73, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, - 0x76, 0x65, 0x72, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, - 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x32, 0x86, 0x07, 0x0a, 0x15, 0x73, 0x79, - 0x73, 0x62, 0x6f, 0x78, 0x4d, 0x67, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x12, 0x3b, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, - 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, - 0x12, 0x35, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, - 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0a, 0x55, 0x6e, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0a, 0x53, 0x75, - 0x62, 0x69, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x53, 0x75, 0x62, 0x69, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, - 0x71, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x75, 0x62, - 0x69, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x3f, 0x0a, - 0x0a, 0x50, 0x72, 0x65, 0x70, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x70, - 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, - 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x70, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x36, - 0x0a, 0x09, 0x52, 0x65, 0x71, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x1a, - 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x53, 0x68, 0x69, - 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x53, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x52, - 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x68, - 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, - 0x3b, 0x0a, 0x0a, 0x52, 0x65, 0x71, 0x46, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, + 0x52, 0x02, 0x69, 0x64, 0x22, 0x0b, 0x0a, 0x09, 0x50, 0x61, 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x22, 0x1b, 0x0a, 0x09, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x0c, + 0x0a, 0x0a, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x20, 0x0a, 0x0e, + 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x52, 0x65, 0x71, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x29, + 0x0a, 0x0f, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x43, 0x68, 0x6f, + 0x77, 0x6e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x52, 0x65, + 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x69, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x75, 0x69, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x67, 0x69, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x67, 0x69, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x17, 0x0a, + 0x15, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, + 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x2c, 0x0a, 0x1a, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, + 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x43, 0x68, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x43, 0x6c, + 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x32, 0x86, 0x07, 0x0a, 0x15, 0x73, 0x79, 0x73, 0x62, 0x6f, 0x78, 0x4d, 0x67, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x3b, 0x0a, + 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x1a, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x06, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, + 0x00, 0x12, 0x41, 0x0a, 0x0a, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, + 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0a, 0x53, 0x75, 0x62, 0x69, 0x64, 0x41, 0x6c, 0x6c, + 0x6f, 0x63, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x75, + 0x62, 0x69, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x75, 0x62, 0x69, 0x64, 0x41, 0x6c, 0x6c, 0x6f, + 0x63, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0a, 0x50, 0x72, 0x65, 0x70, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, + 0x65, 0x70, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x09, 0x52, 0x65, 0x71, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, + 0x12, 0x47, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x53, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, + 0x72, 0x6b, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x68, + 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x68, 0x69, 0x66, 0x74, 0x66, 0x73, 0x4d, + 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x0a, 0x52, 0x65, 0x71, + 0x46, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x46, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x32, 0x0a, 0x05, - 0x50, 0x61, 0x75, 0x73, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, - 0x12, 0x35, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x1a, - 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x43, 0x6c, - 0x6f, 0x6e, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, - 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x43, - 0x6c, 0x6f, 0x6e, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, - 0x12, 0x56, 0x0a, 0x11, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, - 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, - 0x66, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, - 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x17, 0x52, 0x65, 0x76, 0x65, - 0x72, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x43, 0x68, - 0x6f, 0x77, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, + 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x32, 0x0a, 0x05, 0x50, 0x61, 0x75, 0x73, 0x65, 0x12, + 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, 0x61, 0x75, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, + 0x61, 0x75, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x06, 0x52, 0x65, + 0x73, 0x75, 0x6d, 0x65, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, + 0x00, 0x12, 0x47, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x52, 0x6f, 0x6f, + 0x74, 0x66, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x43, + 0x6c, 0x6f, 0x6e, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x52, 0x6f, + 0x6f, 0x74, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x11, 0x43, 0x68, + 0x6f, 0x77, 0x6e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x12, + 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, + 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, + 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x22, 0x00, 0x12, 0x68, 0x0a, 0x17, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x43, 0x6c, 0x6f, 0x6e, + 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x24, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x43, + 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x43, 0x68, 0x6f, 0x77, 0x6e, + 0x52, 0x65, 0x71, 0x1a, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x66, - 0x73, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, - 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x22, 0x00, 0x42, 0x16, 0x5a, 0x14, 0x2e, 0x2f, 0x3b, 0x73, 0x79, 0x73, 0x62, 0x6f, 0x78, 0x4d, - 0x67, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x73, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x16, 0x5a, 0x14, + 0x2e, 0x2f, 0x3b, 0x73, 0x79, 0x73, 0x62, 0x6f, 0x78, 0x4d, 0x67, 0x72, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var (