CCv0: Merge main into CCv0 branch

Merge remote-tracking branch 'upstream/main' into CCv0

Fixes: #6504
Signed-off-by: Megan Wright <megan.wright@ibm.com>
This commit is contained in:
Megan Wright
2023-03-20 13:23:49 +00:00
71 changed files with 2934 additions and 789 deletions

View File

@@ -258,15 +258,24 @@ const (
// VFIODeviceErrorType is the error type of VFIO device
VFIODeviceErrorType VFIODeviceType = iota
// VFIODeviceNormalType is a normal VFIO device type
VFIODeviceNormalType
// VFIOPCIDeviceNormalType is a normal VFIO PCI device type
VFIOPCIDeviceNormalType
// VFIODeviceMediatedType is a VFIO mediated device type
VFIODeviceMediatedType
// VFIOPCIDeviceMediatedType is a VFIO PCI mediated device type
VFIOPCIDeviceMediatedType
// VFIOAPDeviceMediatedType is a VFIO AP mediated device type
VFIOAPDeviceMediatedType
)
// VFIODev represents a VFIO drive used for hotplugging
type VFIODev struct {
type VFIODev interface {
GetID() *string
GetType() VFIODeviceType
GetSysfsDev() *string
}
// VFIOPCIDev represents a VFIO PCI device used for hotplugging
type VFIOPCIDev struct {
// ID is used to identify this drive in the hypervisor options.
ID string
@@ -298,6 +307,44 @@ type VFIODev struct {
IsPCIe bool
}
func (d VFIOPCIDev) GetID() *string {
return &d.ID
}
func (d VFIOPCIDev) GetType() VFIODeviceType {
return d.Type
}
func (d VFIOPCIDev) GetSysfsDev() *string {
return &d.SysfsDev
}
type VFIOAPDev struct {
// ID is used to identify this drive in the hypervisor options.
ID string
// sysfsdev of VFIO mediated device
SysfsDev string
// APDevices are the Adjunct Processor devices assigned to the mdev
APDevices []string
// Type of VFIO device
Type VFIODeviceType
}
func (d VFIOAPDev) GetID() *string {
return &d.ID
}
func (d VFIOAPDev) GetType() VFIODeviceType {
return d.Type
}
func (d VFIOAPDev) GetSysfsDev() *string {
return &d.SysfsDev
}
// RNGDev represents a random number generator device
type RNGDev struct {
// ID is used to identify the device in the hypervisor options.

View File

@@ -89,18 +89,47 @@ func readPCIProperty(propertyPath string) (string, error) {
return strings.Split(string(buf), "\n")[0], nil
}
func GetVFIODeviceType(deviceFileName string) config.VFIODeviceType {
func GetVFIODeviceType(deviceFilePath string) (config.VFIODeviceType, error) {
deviceFileName := filepath.Base(deviceFilePath)
//For example, 0000:04:00.0
tokens := strings.Split(deviceFileName, ":")
vfioDeviceType := config.VFIODeviceErrorType
if len(tokens) == 3 {
vfioDeviceType = config.VFIODeviceNormalType
} else {
//For example, 83b8f4f2-509f-382f-3c1e-e6bfe0fa1001
tokens = strings.Split(deviceFileName, "-")
if len(tokens) == 5 {
vfioDeviceType = config.VFIODeviceMediatedType
}
return config.VFIOPCIDeviceNormalType, nil
}
return vfioDeviceType
//For example, 83b8f4f2-509f-382f-3c1e-e6bfe0fa1001
tokens = strings.Split(deviceFileName, "-")
if len(tokens) != 5 {
return config.VFIODeviceErrorType, fmt.Errorf("Incorrect tokens found while parsing VFIO details: %s", deviceFileName)
}
deviceSysfsDev, err := GetSysfsDev(deviceFilePath)
if err != nil {
return config.VFIODeviceErrorType, err
}
if strings.HasPrefix(deviceSysfsDev, vfioAPSysfsDir) {
return config.VFIOAPDeviceMediatedType, nil
}
return config.VFIOPCIDeviceMediatedType, nil
}
// GetSysfsDev returns the sysfsdev of mediated device
// Expected input string format is absolute path to the sysfs dev node
// eg. /sys/kernel/iommu_groups/0/devices/f79944e4-5a3d-11e8-99ce-479cbab002e4
func GetSysfsDev(sysfsDevStr string) (string, error) {
return filepath.EvalSymlinks(sysfsDevStr)
}
// GetAPVFIODevices retrieves all APQNs associated with a mediated VFIO-AP
// device
func GetAPVFIODevices(sysfsdev string) ([]string, error) {
data, err := os.ReadFile(filepath.Join(sysfsdev, "matrix"))
if err != nil {
return []string{}, err
}
// Split by newlines, omitting final newline
return strings.Split(string(data[:len(data)-1]), "\n"), nil
}

View File

@@ -30,6 +30,7 @@ const (
iommuGroupPath = "/sys/bus/pci/devices/%s/iommu_group"
vfioDevPath = "/dev/vfio/%s"
pcieRootPortPrefix = "rp"
vfioAPSysfsDir = "/sys/devices/vfio_ap"
)
var (
@@ -85,19 +86,42 @@ func (device *VFIODevice) Attach(ctx context.Context, devReceiver api.DeviceRece
if err != nil {
return err
}
vfio := &config.VFIODev{
ID: utils.MakeNameID("vfio", device.DeviceInfo.ID+strconv.Itoa(i), maxDevIDSize),
Type: vfioDeviceType,
BDF: deviceBDF,
SysfsDev: deviceSysfsDev,
IsPCIe: isPCIeDevice(deviceBDF),
Class: getPCIDeviceProperty(deviceBDF, PCISysFsDevicesClass),
}
device.VfioDevs = append(device.VfioDevs, vfio)
if vfio.IsPCIe {
vfio.Bus = fmt.Sprintf("%s%d", pcieRootPortPrefix, len(AllPCIeDevs))
AllPCIeDevs[vfio.BDF] = true
id := utils.MakeNameID("vfio", device.DeviceInfo.ID+strconv.Itoa(i), maxDevIDSize)
var vfio config.VFIODev
switch vfioDeviceType {
case config.VFIOPCIDeviceNormalType, config.VFIOPCIDeviceMediatedType:
isPCIe := isPCIeDevice(deviceBDF)
// Do not directly assign to `vfio` -- need to access field still
vfioPCI := config.VFIOPCIDev{
ID: id,
Type: vfioDeviceType,
BDF: deviceBDF,
SysfsDev: deviceSysfsDev,
IsPCIe: isPCIe,
Class: getPCIDeviceProperty(deviceBDF, PCISysFsDevicesClass),
}
if isPCIe {
vfioPCI.Bus = fmt.Sprintf("%s%d", pcieRootPortPrefix, len(AllPCIeDevs))
AllPCIeDevs[deviceBDF] = true
}
vfio = vfioPCI
case config.VFIOAPDeviceMediatedType:
devices, err := GetAPVFIODevices(deviceSysfsDev)
if err != nil {
return err
}
vfio = config.VFIOAPDev{
ID: id,
SysfsDev: deviceSysfsDev,
Type: config.VFIOAPDeviceMediatedType,
APDevices: devices,
}
default:
return fmt.Errorf("Failed to append device: VFIO device type unrecognized")
}
device.VfioDevs = append(device.VfioDevs, &vfio)
}
coldPlug := device.DeviceInfo.ColdPlug
@@ -192,31 +216,60 @@ func (device *VFIODevice) Load(ds config.DeviceState) {
device.GenericDevice.Load(ds)
for _, dev := range ds.VFIODevs {
device.VfioDevs = append(device.VfioDevs, &config.VFIODev{
ID: dev.ID,
Type: config.VFIODeviceType(dev.Type),
BDF: dev.BDF,
SysfsDev: dev.SysfsDev,
})
var vfio config.VFIODev
vfioDeviceType := (*device.VfioDevs[0]).GetType()
switch vfioDeviceType {
case config.VFIOPCIDeviceNormalType, config.VFIOPCIDeviceMediatedType:
bdf := ""
if pciDev, ok := (*dev).(config.VFIOPCIDev); ok {
bdf = pciDev.BDF
}
vfio = config.VFIOPCIDev{
ID: *(*dev).GetID(),
Type: config.VFIODeviceType((*dev).GetType()),
BDF: bdf,
SysfsDev: *(*dev).GetSysfsDev(),
}
case config.VFIOAPDeviceMediatedType:
vfio = config.VFIOAPDev{
ID: *(*dev).GetID(),
SysfsDev: *(*dev).GetSysfsDev(),
}
default:
deviceLogger().WithError(
fmt.Errorf("VFIO device type unrecognized"),
).Error("Failed to append device")
return
}
device.VfioDevs = append(device.VfioDevs, &vfio)
}
}
// It should implement GetAttachCount() and DeviceID() as api.Device implementation
// here it shares function from *GenericDevice so we don't need duplicate codes
func getVFIODetails(deviceFileName, iommuDevicesPath string) (deviceBDF, deviceSysfsDev string, vfioDeviceType config.VFIODeviceType, err error) {
vfioDeviceType = GetVFIODeviceType(deviceFileName)
sysfsDevStr := filepath.Join(iommuDevicesPath, deviceFileName)
vfioDeviceType, err = GetVFIODeviceType(sysfsDevStr)
if err != nil {
return deviceBDF, deviceSysfsDev, vfioDeviceType, err
}
switch vfioDeviceType {
case config.VFIODeviceNormalType:
case config.VFIOPCIDeviceNormalType:
// Get bdf of device eg. 0000:00:1c.0
deviceBDF = getBDF(deviceFileName)
// Get sysfs path used by cloud-hypervisor
deviceSysfsDev = filepath.Join(config.SysBusPciDevicesPath, deviceFileName)
case config.VFIODeviceMediatedType:
case config.VFIOPCIDeviceMediatedType:
// Get sysfsdev of device eg. /sys/devices/pci0000:00/0000:00:02.0/f79944e4-5a3d-11e8-99ce-479cbab002e4
sysfsDevStr := filepath.Join(iommuDevicesPath, deviceFileName)
deviceSysfsDev, err = getSysfsDev(sysfsDevStr)
deviceSysfsDev, err = GetSysfsDev(sysfsDevStr)
deviceBDF = getBDF(getMediatedBDF(deviceSysfsDev))
case config.VFIOAPDeviceMediatedType:
sysfsDevStr := filepath.Join(iommuDevicesPath, deviceFileName)
deviceSysfsDev, err = GetSysfsDev(sysfsDevStr)
default:
err = fmt.Errorf("Incorrect tokens found while parsing vfio details: %s", deviceFileName)
}
@@ -244,13 +297,6 @@ func getBDF(deviceSysStr string) string {
return tokens[1]
}
// getSysfsDev returns the sysfsdev of mediated device
// Expected input string format is absolute path to the sysfs dev node
// eg. /sys/kernel/iommu_groups/0/devices/f79944e4-5a3d-11e8-99ce-479cbab002e4
func getSysfsDev(sysfsDevStr string) (string, error) {
return filepath.EvalSymlinks(sysfsDevStr)
}
// BindDevicetoVFIO binds the device to vfio driver after unbinding from host.
// Will be called by a network interface or a generic pcie device.
func BindDevicetoVFIO(bdf, hostDriver, vendorDeviceID string) (string, error) {

View File

@@ -32,9 +32,9 @@ func TestGetVFIODetails(t *testing.T) {
deviceBDF, deviceSysfsDev, vfioDeviceType, err := getVFIODetails(d.deviceStr, "")
switch vfioDeviceType {
case config.VFIODeviceNormalType:
case config.VFIOPCIDeviceNormalType:
assert.Equal(t, d.expectedStr, deviceBDF)
case config.VFIODeviceMediatedType:
case config.VFIOPCIDeviceMediatedType, config.VFIOAPDeviceMediatedType:
assert.Equal(t, d.expectedStr, deviceSysfsDev)
default:
assert.NotNil(t, err)

View File

@@ -67,7 +67,8 @@ func sandboxDevices() []specs.LinuxDeviceCgroup {
// In order to run Virtual Machines and create virtqueues, hypervisors
// need access to certain character devices in the host, like kvm and vhost-net.
hypervisorDevices := []string{
"/dev/kvm", // To run virtual machines
"/dev/kvm", // To run virtual machines with KVM
"/dev/mshv", // To run virtual machines with Hyper-V
"/dev/vhost-net", // To create virtqueues
"/dev/vfio/vfio", // To access VFIO devices
"/dev/vhost-vsock", // To interact with vsock if

View File

@@ -154,6 +154,9 @@ type agent interface {
// listInterfaces will tell the agent to list interfaces of an existed Sandbox
listInterfaces(ctx context.Context) ([]*pbTypes.Interface, error)
// updateEphemeralMounts will tell the agent to update tmpfs mounts in the Sandbox.
updateEphemeralMounts(ctx context.Context, storages []*grpc.Storage) error
// updateRoutes will tell the agent to update route table for an existed Sandbox.
updateRoutes(ctx context.Context, routes []*pbTypes.Route) ([]*pbTypes.Route, error)

View File

@@ -857,12 +857,12 @@ func (clh *cloudHypervisor) hotPlugVFIODevice(device *config.VFIODev) error {
defer cancel()
// Create the clh device config via the constructor to ensure default values are properly assigned
clhDevice := *chclient.NewDeviceConfig(device.SysfsDev)
clhDevice := *chclient.NewDeviceConfig(*(*device).GetSysfsDev())
pciInfo, _, err := cl.VmAddDevicePut(ctx, clhDevice)
if err != nil {
return fmt.Errorf("Failed to hotplug device %+v %s", device, openAPIClientError(err))
}
clh.devicesIds[device.ID] = pciInfo.GetId()
clh.devicesIds[*(*device).GetID()] = pciInfo.GetId()
// clh doesn't use bridges, so the PCI path is simply the slot
// number of the device. This will break if clh starts using
@@ -879,7 +879,14 @@ func (clh *cloudHypervisor) hotPlugVFIODevice(device *config.VFIODev) error {
return fmt.Errorf("Unexpected PCI address %q from clh hotplug", pciInfo.Bdf)
}
device.GuestPciPath, err = types.PciPathFromString(tokens[0])
guestPciPath, err := types.PciPathFromString(tokens[0])
pciDevice, ok := (*device).(config.VFIOPCIDev)
if !ok {
return fmt.Errorf("VFIO device %+v is not PCI, only PCI is supported in Cloud Hypervisor", device)
}
pciDevice.GuestPciPath = guestPciPath
*device = pciDevice
return err
}
@@ -923,7 +930,7 @@ func (clh *cloudHypervisor) HotplugRemoveDevice(ctx context.Context, devInfo int
case BlockDev:
deviceID = clhDriveIndexToID(devInfo.(*config.BlockDrive).Index)
case VfioDev:
deviceID = devInfo.(*config.VFIODev).ID
deviceID = *devInfo.(config.VFIODev).GetID()
default:
clh.Logger().WithFields(log.Fields{"devInfo": devInfo,
"deviceType": devType}).Error("HotplugRemoveDevice: unsupported device")

View File

@@ -624,7 +624,7 @@ func TestCloudHypervisorHotplugRemoveDevice(t *testing.T) {
_, err = clh.HotplugRemoveDevice(context.Background(), &config.BlockDrive{}, BlockDev)
assert.NoError(err, "Hotplug remove block device expected no error")
_, err = clh.HotplugRemoveDevice(context.Background(), &config.VFIODev{}, VfioDev)
_, err = clh.HotplugRemoveDevice(context.Background(), &config.VFIOPCIDev{}, VfioDev)
assert.NoError(err, "Hotplug remove vfio block device expected no error")
_, err = clh.HotplugRemoveDevice(context.Background(), nil, NetDev)

View File

@@ -117,41 +117,42 @@ var (
)
const (
grpcCheckRequest = "grpc.CheckRequest"
grpcExecProcessRequest = "grpc.ExecProcessRequest"
grpcCreateSandboxRequest = "grpc.CreateSandboxRequest"
grpcDestroySandboxRequest = "grpc.DestroySandboxRequest"
grpcCreateContainerRequest = "grpc.CreateContainerRequest"
grpcStartContainerRequest = "grpc.StartContainerRequest"
grpcRemoveContainerRequest = "grpc.RemoveContainerRequest"
grpcSignalProcessRequest = "grpc.SignalProcessRequest"
grpcUpdateRoutesRequest = "grpc.UpdateRoutesRequest"
grpcUpdateInterfaceRequest = "grpc.UpdateInterfaceRequest"
grpcListInterfacesRequest = "grpc.ListInterfacesRequest"
grpcListRoutesRequest = "grpc.ListRoutesRequest"
grpcAddARPNeighborsRequest = "grpc.AddARPNeighborsRequest"
grpcOnlineCPUMemRequest = "grpc.OnlineCPUMemRequest"
grpcUpdateContainerRequest = "grpc.UpdateContainerRequest"
grpcWaitProcessRequest = "grpc.WaitProcessRequest"
grpcTtyWinResizeRequest = "grpc.TtyWinResizeRequest"
grpcWriteStreamRequest = "grpc.WriteStreamRequest"
grpcCloseStdinRequest = "grpc.CloseStdinRequest"
grpcStatsContainerRequest = "grpc.StatsContainerRequest"
grpcPauseContainerRequest = "grpc.PauseContainerRequest"
grpcResumeContainerRequest = "grpc.ResumeContainerRequest"
grpcPullImageRequest = "grpc.PullImageRequest"
grpcReseedRandomDevRequest = "grpc.ReseedRandomDevRequest"
grpcGuestDetailsRequest = "grpc.GuestDetailsRequest"
grpcMemHotplugByProbeRequest = "grpc.MemHotplugByProbeRequest"
grpcCopyFileRequest = "grpc.CopyFileRequest"
grpcSetGuestDateTimeRequest = "grpc.SetGuestDateTimeRequest"
grpcGetOOMEventRequest = "grpc.GetOOMEventRequest"
grpcGetMetricsRequest = "grpc.GetMetricsRequest"
grpcAddSwapRequest = "grpc.AddSwapRequest"
grpcVolumeStatsRequest = "grpc.VolumeStatsRequest"
grpcResizeVolumeRequest = "grpc.ResizeVolumeRequest"
grpcGetIPTablesRequest = "grpc.GetIPTablesRequest"
grpcSetIPTablesRequest = "grpc.SetIPTablesRequest"
grpcCheckRequest = "grpc.CheckRequest"
grpcExecProcessRequest = "grpc.ExecProcessRequest"
grpcCreateSandboxRequest = "grpc.CreateSandboxRequest"
grpcDestroySandboxRequest = "grpc.DestroySandboxRequest"
grpcCreateContainerRequest = "grpc.CreateContainerRequest"
grpcStartContainerRequest = "grpc.StartContainerRequest"
grpcRemoveContainerRequest = "grpc.RemoveContainerRequest"
grpcSignalProcessRequest = "grpc.SignalProcessRequest"
grpcUpdateRoutesRequest = "grpc.UpdateRoutesRequest"
grpcUpdateInterfaceRequest = "grpc.UpdateInterfaceRequest"
grpcListInterfacesRequest = "grpc.ListInterfacesRequest"
grpcListRoutesRequest = "grpc.ListRoutesRequest"
grpcAddARPNeighborsRequest = "grpc.AddARPNeighborsRequest"
grpcOnlineCPUMemRequest = "grpc.OnlineCPUMemRequest"
grpcUpdateContainerRequest = "grpc.UpdateContainerRequest"
grpcUpdateEphemeralMountsRequest = "grpc.UpdateEphemeralMountsRequest"
grpcWaitProcessRequest = "grpc.WaitProcessRequest"
grpcTtyWinResizeRequest = "grpc.TtyWinResizeRequest"
grpcWriteStreamRequest = "grpc.WriteStreamRequest"
grpcCloseStdinRequest = "grpc.CloseStdinRequest"
grpcStatsContainerRequest = "grpc.StatsContainerRequest"
grpcPauseContainerRequest = "grpc.PauseContainerRequest"
grpcResumeContainerRequest = "grpc.ResumeContainerRequest"
grpcPullImageRequest = "grpc.PullImageRequest"
grpcReseedRandomDevRequest = "grpc.ReseedRandomDevRequest"
grpcGuestDetailsRequest = "grpc.GuestDetailsRequest"
grpcMemHotplugByProbeRequest = "grpc.MemHotplugByProbeRequest"
grpcCopyFileRequest = "grpc.CopyFileRequest"
grpcSetGuestDateTimeRequest = "grpc.SetGuestDateTimeRequest"
grpcGetOOMEventRequest = "grpc.GetOOMEventRequest"
grpcGetMetricsRequest = "grpc.GetMetricsRequest"
grpcAddSwapRequest = "grpc.AddSwapRequest"
grpcVolumeStatsRequest = "grpc.VolumeStatsRequest"
grpcResizeVolumeRequest = "grpc.ResizeVolumeRequest"
grpcGetIPTablesRequest = "grpc.GetIPTablesRequest"
grpcSetIPTablesRequest = "grpc.SetIPTablesRequest"
)
// newKataAgent returns an agent from an agent type.
@@ -610,6 +611,21 @@ func (k *kataAgent) updateRoutes(ctx context.Context, routes []*pbTypes.Route) (
return nil, nil
}
func (k *kataAgent) updateEphemeralMounts(ctx context.Context, storages []*grpc.Storage) error {
if storages != nil {
storagesReq := &grpc.UpdateEphemeralMountsRequest{
Storages: storages,
}
if _, err := k.sendReq(ctx, storagesReq); err != nil {
k.Logger().WithError(err).Error("update mounts request failed")
return err
}
return nil
}
return nil
}
func (k *kataAgent) addARPNeighbors(ctx context.Context, neighs []*pbTypes.ARPNeighbor) error {
if neighs != nil {
neighsReq := &grpc.AddARPNeighborsRequest{
@@ -1112,20 +1128,25 @@ func (k *kataAgent) appendVfioDevice(dev ContainerDevice, device api.Device, c *
groupNum := filepath.Base(dev.ContainerPath)
// Each /dev/vfio/NN device represents a VFIO group, which
// could include several PCI devices. So we give group
// information in the main structure, then list each
// individual PCI device in the Options array.
// For VFIO-PCI, each /dev/vfio/NN device represents a VFIO group,
// which could include several PCI devices. So we give group
// information in the main structure, then list each individual PCI
// device in the Options array.
//
// Each option is formatted as "DDDD:BB:DD.F=<pcipath>"
// DDDD:BB:DD.F is the device's PCI address on the
// *host*. <pcipath> is the device's PCI path in the guest
// (see qomGetPciPath() for details).
//
// For VFIO-AP, one VFIO group could include several queue devices. They are
// identified by APQNs (Adjunct Processor Queue Numbers), which do not differ
// between host and guest. They are passed as options so they can be awaited
// by the agent.
kataDevice := &grpc.Device{
ContainerPath: dev.ContainerPath,
Type: kataVfioDevType,
Type: kataVfioPciDevType,
Id: groupNum,
Options: make([]string, len(devList)),
Options: nil,
}
// We always pass the device information to the agent, since
@@ -1133,11 +1154,18 @@ func (k *kataAgent) appendVfioDevice(dev ContainerDevice, device api.Device, c *
// on the vfio_mode, we need to use a different device type so
// the agent can handle it properly
if c.sandbox.config.VfioMode == config.VFIOModeGuestKernel {
kataDevice.Type = kataVfioGuestKernelDevType
kataDevice.Type = kataVfioPciGuestKernelDevType
}
for i, pciDev := range devList {
kataDevice.Options[i] = fmt.Sprintf("0000:%s=%s", pciDev.BDF, pciDev.GuestPciPath)
if (*devList[0]).GetType() == config.VFIOAPDeviceMediatedType {
kataDevice.Type = kataVfioApDevType
kataDevice.Options = (*devList[0]).(config.VFIOAPDev).APDevices
} else {
kataDevice.Options = make([]string, len(devList))
for i, device := range devList {
pciDevice := (*device).(config.VFIOPCIDev)
kataDevice.Options[i] = fmt.Sprintf("0000:%s=%s", pciDevice.BDF, pciDevice.GuestPciPath)
}
}
return kataDevice
@@ -1963,6 +1991,9 @@ func (k *kataAgent) installReqFunc(c *kataclient.AgentClient) {
k.reqHandlers[grpcUpdateInterfaceRequest] = func(ctx context.Context, req interface{}) (interface{}, error) {
return k.client.AgentServiceClient.UpdateInterface(ctx, req.(*grpc.UpdateInterfaceRequest))
}
k.reqHandlers[grpcUpdateEphemeralMountsRequest] = func(ctx context.Context, req interface{}) (interface{}, error) {
return k.client.AgentServiceClient.UpdateEphemeralMounts(ctx, req.(*grpc.UpdateEphemeralMountsRequest))
}
k.reqHandlers[grpcListInterfacesRequest] = func(ctx context.Context, req interface{}) (interface{}, error) {
return k.client.AgentServiceClient.ListInterfaces(ctx, req.(*grpc.ListInterfacesRequest))
}

View File

@@ -122,6 +122,11 @@ func (n *mockAgent) listRoutes(ctx context.Context) ([]*pbTypes.Route, error) {
return nil, nil
}
// updateEphemeralMounts is the Noop agent updateEphemeralMounts implementation. It does nothing.
func (n *mockAgent) updateEphemeralMounts(ctx context.Context, storages []*grpc.Storage) error {
return nil
}
// check is the Noop agent health checker. It does nothing.
func (n *mockAgent) check(ctx context.Context) error {
return nil

View File

@@ -1527,6 +1527,45 @@ func (m *UpdateRoutesRequest) XXX_DiscardUnknown() {
var xxx_messageInfo_UpdateRoutesRequest proto.InternalMessageInfo
type UpdateEphemeralMountsRequest struct {
Storages []*Storage `protobuf:"bytes,1,rep,name=storages,proto3" json:"storages,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *UpdateEphemeralMountsRequest) Reset() { *m = UpdateEphemeralMountsRequest{} }
func (*UpdateEphemeralMountsRequest) ProtoMessage() {}
func (*UpdateEphemeralMountsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{36}
}
func (m *UpdateEphemeralMountsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *UpdateEphemeralMountsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_UpdateEphemeralMountsRequest.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *UpdateEphemeralMountsRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_UpdateEphemeralMountsRequest.Merge(m, src)
}
func (m *UpdateEphemeralMountsRequest) XXX_Size() int {
return m.Size()
}
func (m *UpdateEphemeralMountsRequest) XXX_DiscardUnknown() {
xxx_messageInfo_UpdateEphemeralMountsRequest.DiscardUnknown(m)
}
var xxx_messageInfo_UpdateEphemeralMountsRequest proto.InternalMessageInfo
type ListInterfacesRequest struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
@@ -1536,7 +1575,7 @@ type ListInterfacesRequest struct {
func (m *ListInterfacesRequest) Reset() { *m = ListInterfacesRequest{} }
func (*ListInterfacesRequest) ProtoMessage() {}
func (*ListInterfacesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{36}
return fileDescriptor_712ce9a559fda969, []int{37}
}
func (m *ListInterfacesRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1574,7 +1613,7 @@ type ListRoutesRequest struct {
func (m *ListRoutesRequest) Reset() { *m = ListRoutesRequest{} }
func (*ListRoutesRequest) ProtoMessage() {}
func (*ListRoutesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{37}
return fileDescriptor_712ce9a559fda969, []int{38}
}
func (m *ListRoutesRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1613,7 +1652,7 @@ type ARPNeighbors struct {
func (m *ARPNeighbors) Reset() { *m = ARPNeighbors{} }
func (*ARPNeighbors) ProtoMessage() {}
func (*ARPNeighbors) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{38}
return fileDescriptor_712ce9a559fda969, []int{39}
}
func (m *ARPNeighbors) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1652,7 +1691,7 @@ type AddARPNeighborsRequest struct {
func (m *AddARPNeighborsRequest) Reset() { *m = AddARPNeighborsRequest{} }
func (*AddARPNeighborsRequest) ProtoMessage() {}
func (*AddARPNeighborsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{39}
return fileDescriptor_712ce9a559fda969, []int{40}
}
func (m *AddARPNeighborsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1691,7 +1730,7 @@ type GetIPTablesRequest struct {
func (m *GetIPTablesRequest) Reset() { *m = GetIPTablesRequest{} }
func (*GetIPTablesRequest) ProtoMessage() {}
func (*GetIPTablesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{40}
return fileDescriptor_712ce9a559fda969, []int{41}
}
func (m *GetIPTablesRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1731,7 +1770,7 @@ type GetIPTablesResponse struct {
func (m *GetIPTablesResponse) Reset() { *m = GetIPTablesResponse{} }
func (*GetIPTablesResponse) ProtoMessage() {}
func (*GetIPTablesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{41}
return fileDescriptor_712ce9a559fda969, []int{42}
}
func (m *GetIPTablesResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1773,7 +1812,7 @@ type SetIPTablesRequest struct {
func (m *SetIPTablesRequest) Reset() { *m = SetIPTablesRequest{} }
func (*SetIPTablesRequest) ProtoMessage() {}
func (*SetIPTablesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{42}
return fileDescriptor_712ce9a559fda969, []int{43}
}
func (m *SetIPTablesRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1803,7 +1842,7 @@ func (m *SetIPTablesRequest) XXX_DiscardUnknown() {
var xxx_messageInfo_SetIPTablesRequest proto.InternalMessageInfo
type SetIPTablesResponse struct {
// raw stdout from iptables-restore or ip6tables-restore ?
// raw stdout from iptables-restore or ip6tables-restore
Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
@@ -1813,7 +1852,7 @@ type SetIPTablesResponse struct {
func (m *SetIPTablesResponse) Reset() { *m = SetIPTablesResponse{} }
func (*SetIPTablesResponse) ProtoMessage() {}
func (*SetIPTablesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{43}
return fileDescriptor_712ce9a559fda969, []int{44}
}
func (m *SetIPTablesResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1859,7 +1898,7 @@ type OnlineCPUMemRequest struct {
func (m *OnlineCPUMemRequest) Reset() { *m = OnlineCPUMemRequest{} }
func (*OnlineCPUMemRequest) ProtoMessage() {}
func (*OnlineCPUMemRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{44}
return fileDescriptor_712ce9a559fda969, []int{45}
}
func (m *OnlineCPUMemRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1899,7 +1938,7 @@ type ReseedRandomDevRequest struct {
func (m *ReseedRandomDevRequest) Reset() { *m = ReseedRandomDevRequest{} }
func (*ReseedRandomDevRequest) ProtoMessage() {}
func (*ReseedRandomDevRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{45}
return fileDescriptor_712ce9a559fda969, []int{46}
}
func (m *ReseedRandomDevRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1949,7 +1988,7 @@ type AgentDetails struct {
func (m *AgentDetails) Reset() { *m = AgentDetails{} }
func (*AgentDetails) ProtoMessage() {}
func (*AgentDetails) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{46}
return fileDescriptor_712ce9a559fda969, []int{47}
}
func (m *AgentDetails) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1995,7 +2034,7 @@ type GuestDetailsRequest struct {
func (m *GuestDetailsRequest) Reset() { *m = GuestDetailsRequest{} }
func (*GuestDetailsRequest) ProtoMessage() {}
func (*GuestDetailsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{47}
return fileDescriptor_712ce9a559fda969, []int{48}
}
func (m *GuestDetailsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2037,7 +2076,7 @@ type GuestDetailsResponse struct {
func (m *GuestDetailsResponse) Reset() { *m = GuestDetailsResponse{} }
func (*GuestDetailsResponse) ProtoMessage() {}
func (*GuestDetailsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{48}
return fileDescriptor_712ce9a559fda969, []int{49}
}
func (m *GuestDetailsResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2078,7 +2117,7 @@ type MemHotplugByProbeRequest struct {
func (m *MemHotplugByProbeRequest) Reset() { *m = MemHotplugByProbeRequest{} }
func (*MemHotplugByProbeRequest) ProtoMessage() {}
func (*MemHotplugByProbeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{49}
return fileDescriptor_712ce9a559fda969, []int{50}
}
func (m *MemHotplugByProbeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2120,7 +2159,7 @@ type SetGuestDateTimeRequest struct {
func (m *SetGuestDateTimeRequest) Reset() { *m = SetGuestDateTimeRequest{} }
func (*SetGuestDateTimeRequest) ProtoMessage() {}
func (*SetGuestDateTimeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{50}
return fileDescriptor_712ce9a559fda969, []int{51}
}
func (m *SetGuestDateTimeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2166,7 +2205,7 @@ type FSGroup struct {
func (m *FSGroup) Reset() { *m = FSGroup{} }
func (*FSGroup) ProtoMessage() {}
func (*FSGroup) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{51}
return fileDescriptor_712ce9a559fda969, []int{52}
}
func (m *FSGroup) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2234,7 +2273,7 @@ type Storage struct {
func (m *Storage) Reset() { *m = Storage{} }
func (*Storage) ProtoMessage() {}
func (*Storage) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{52}
return fileDescriptor_712ce9a559fda969, []int{53}
}
func (m *Storage) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2305,7 +2344,7 @@ type Device struct {
func (m *Device) Reset() { *m = Device{} }
func (*Device) ProtoMessage() {}
func (*Device) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{53}
return fileDescriptor_712ce9a559fda969, []int{54}
}
func (m *Device) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2346,7 +2385,7 @@ type StringUser struct {
func (m *StringUser) Reset() { *m = StringUser{} }
func (*StringUser) ProtoMessage() {}
func (*StringUser) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{54}
return fileDescriptor_712ce9a559fda969, []int{55}
}
func (m *StringUser) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2403,7 +2442,7 @@ type CopyFileRequest struct {
func (m *CopyFileRequest) Reset() { *m = CopyFileRequest{} }
func (*CopyFileRequest) ProtoMessage() {}
func (*CopyFileRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{55}
return fileDescriptor_712ce9a559fda969, []int{56}
}
func (m *CopyFileRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2441,7 +2480,7 @@ type GetOOMEventRequest struct {
func (m *GetOOMEventRequest) Reset() { *m = GetOOMEventRequest{} }
func (*GetOOMEventRequest) ProtoMessage() {}
func (*GetOOMEventRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{56}
return fileDescriptor_712ce9a559fda969, []int{57}
}
func (m *GetOOMEventRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2480,7 +2519,7 @@ type OOMEvent struct {
func (m *OOMEvent) Reset() { *m = OOMEvent{} }
func (*OOMEvent) ProtoMessage() {}
func (*OOMEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{57}
return fileDescriptor_712ce9a559fda969, []int{58}
}
func (m *OOMEvent) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2519,7 +2558,7 @@ type AddSwapRequest struct {
func (m *AddSwapRequest) Reset() { *m = AddSwapRequest{} }
func (*AddSwapRequest) ProtoMessage() {}
func (*AddSwapRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{58}
return fileDescriptor_712ce9a559fda969, []int{59}
}
func (m *AddSwapRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2557,7 +2596,7 @@ type GetMetricsRequest struct {
func (m *GetMetricsRequest) Reset() { *m = GetMetricsRequest{} }
func (*GetMetricsRequest) ProtoMessage() {}
func (*GetMetricsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{59}
return fileDescriptor_712ce9a559fda969, []int{60}
}
func (m *GetMetricsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2596,7 +2635,7 @@ type Metrics struct {
func (m *Metrics) Reset() { *m = Metrics{} }
func (*Metrics) ProtoMessage() {}
func (*Metrics) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{60}
return fileDescriptor_712ce9a559fda969, []int{61}
}
func (m *Metrics) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2636,7 +2675,7 @@ type VolumeStatsRequest struct {
func (m *VolumeStatsRequest) Reset() { *m = VolumeStatsRequest{} }
func (*VolumeStatsRequest) ProtoMessage() {}
func (*VolumeStatsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{61}
return fileDescriptor_712ce9a559fda969, []int{62}
}
func (m *VolumeStatsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2677,7 +2716,7 @@ type ResizeVolumeRequest struct {
func (m *ResizeVolumeRequest) Reset() { *m = ResizeVolumeRequest{} }
func (*ResizeVolumeRequest) ProtoMessage() {}
func (*ResizeVolumeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_712ce9a559fda969, []int{62}
return fileDescriptor_712ce9a559fda969, []int{63}
}
func (m *ResizeVolumeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2745,6 +2784,7 @@ func init() {
proto.RegisterType((*Routes)(nil), "grpc.Routes")
proto.RegisterType((*UpdateInterfaceRequest)(nil), "grpc.UpdateInterfaceRequest")
proto.RegisterType((*UpdateRoutesRequest)(nil), "grpc.UpdateRoutesRequest")
proto.RegisterType((*UpdateEphemeralMountsRequest)(nil), "grpc.UpdateEphemeralMountsRequest")
proto.RegisterType((*ListInterfacesRequest)(nil), "grpc.ListInterfacesRequest")
proto.RegisterType((*ListRoutesRequest)(nil), "grpc.ListRoutesRequest")
proto.RegisterType((*ARPNeighbors)(nil), "grpc.ARPNeighbors")
@@ -2779,208 +2819,211 @@ func init() {
}
var fileDescriptor_712ce9a559fda969 = []byte{
// 3207 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3a, 0x4b, 0x73, 0x1b, 0xc7,
0xd1, 0xc6, 0x83, 0x04, 0xd0, 0x78, 0x11, 0x4b, 0x8a, 0x82, 0x60, 0x9b, 0x96, 0x57, 0xb6, 0x4c,
0xd9, 0x9f, 0x48, 0x5b, 0x76, 0x59, 0x7e, 0x94, 0x3f, 0x7d, 0x24, 0x45, 0x93, 0xb4, 0x4d, 0x0b,
0xdf, 0x42, 0x8c, 0x53, 0x49, 0x25, 0x5b, 0xcb, 0xdd, 0x21, 0x38, 0x26, 0x76, 0x67, 0x3d, 0x3b,
0x0b, 0x91, 0x4e, 0x55, 0x2a, 0xa7, 0xe4, 0x96, 0x63, 0x6e, 0xf9, 0x03, 0xa9, 0xfc, 0x83, 0x5c,
0x73, 0x50, 0xe5, 0x94, 0x63, 0x2e, 0x49, 0xc5, 0xfa, 0x09, 0xf9, 0x05, 0xa9, 0x79, 0xed, 0x03,
0x0f, 0xda, 0x61, 0xa9, 0x2a, 0x17, 0xd4, 0x76, 0x4f, 0x4f, 0xbf, 0xa6, 0xa7, 0xa7, 0x7b, 0x06,
0xd0, 0x1f, 0x62, 0x76, 0x1a, 0x1f, 0x6f, 0xb8, 0xc4, 0xdf, 0x3c, 0x73, 0x98, 0x73, 0xd7, 0x25,
0x01, 0x73, 0x70, 0x80, 0x68, 0x34, 0x05, 0x47, 0xd4, 0xdd, 0x1c, 0xe1, 0xe3, 0x68, 0x33, 0xa4,
0x84, 0x11, 0x97, 0x8c, 0xd4, 0x57, 0xb4, 0xe9, 0x0c, 0x51, 0xc0, 0x36, 0x04, 0x60, 0x94, 0x87,
0x34, 0x74, 0x7b, 0x35, 0xe2, 0x62, 0x89, 0xe8, 0xd5, 0xdc, 0x48, 0x7f, 0xd6, 0xd9, 0x45, 0x88,
0x22, 0x05, 0xbc, 0x38, 0x24, 0x64, 0x38, 0x42, 0x92, 0xc7, 0x71, 0x7c, 0xb2, 0x89, 0xfc, 0x90,
0x5d, 0xc8, 0x41, 0xf3, 0xf7, 0x45, 0x58, 0xdd, 0xa1, 0xc8, 0x61, 0x68, 0x47, 0x2b, 0x60, 0xa1,
0x6f, 0x62, 0x14, 0x31, 0xe3, 0x55, 0x68, 0x24, 0x4a, 0xd9, 0xd8, 0xeb, 0x16, 0x6e, 0x16, 0xd6,
0x6b, 0x56, 0x3d, 0xc1, 0x1d, 0x78, 0xc6, 0x75, 0xa8, 0xa0, 0x73, 0xe4, 0xf2, 0xd1, 0xa2, 0x18,
0x5d, 0xe4, 0xe0, 0x81, 0x67, 0xbc, 0x03, 0xf5, 0x88, 0x51, 0x1c, 0x0c, 0xed, 0x38, 0x42, 0xb4,
0x5b, 0xba, 0x59, 0x58, 0xaf, 0xdf, 0x5b, 0xda, 0xe0, 0x2a, 0x6f, 0x0c, 0xc4, 0xc0, 0x51, 0x84,
0xa8, 0x05, 0x51, 0xf2, 0x6d, 0xdc, 0x86, 0x8a, 0x87, 0xc6, 0xd8, 0x45, 0x51, 0xb7, 0x7c, 0xb3,
0xb4, 0x5e, 0xbf, 0xd7, 0x90, 0xe4, 0x0f, 0x05, 0xd2, 0xd2, 0x83, 0xc6, 0x1d, 0xa8, 0x46, 0x8c,
0x50, 0x67, 0x88, 0xa2, 0xee, 0x82, 0x20, 0x6c, 0x6a, 0xbe, 0x02, 0x6b, 0x25, 0xc3, 0xc6, 0x4b,
0x50, 0x7a, 0xb4, 0x73, 0xd0, 0x5d, 0x14, 0xd2, 0x41, 0x51, 0x85, 0xc8, 0xb5, 0x38, 0xda, 0xb8,
0x05, 0xcd, 0xc8, 0x09, 0xbc, 0x63, 0x72, 0x6e, 0x87, 0xd8, 0x0b, 0xa2, 0x6e, 0xe5, 0x66, 0x61,
0xbd, 0x6a, 0x35, 0x14, 0xb2, 0xcf, 0x71, 0xe6, 0x47, 0x70, 0x6d, 0xc0, 0x1c, 0xca, 0xae, 0xe0,
0x1d, 0xf3, 0x08, 0x56, 0x2d, 0xe4, 0x93, 0xf1, 0x95, 0x5c, 0xdb, 0x85, 0x0a, 0xc3, 0x3e, 0x22,
0x31, 0x13, 0xae, 0x6d, 0x5a, 0x1a, 0x34, 0xff, 0x58, 0x00, 0x63, 0xf7, 0x1c, 0xb9, 0x7d, 0x4a,
0x5c, 0x14, 0x45, 0xff, 0xa5, 0xe5, 0x7a, 0x03, 0x2a, 0xa1, 0x54, 0xa0, 0x5b, 0x16, 0xe4, 0x6a,
0x15, 0xb4, 0x56, 0x7a, 0xd4, 0xfc, 0x1a, 0x56, 0x06, 0x78, 0x18, 0x38, 0xa3, 0xe7, 0xa8, 0xef,
0x2a, 0x2c, 0x46, 0x82, 0xa7, 0x50, 0xb5, 0x69, 0x29, 0xc8, 0xec, 0x83, 0xf1, 0x95, 0x83, 0xd9,
0xf3, 0x93, 0x64, 0xde, 0x85, 0xe5, 0x1c, 0xc7, 0x28, 0x24, 0x41, 0x84, 0x84, 0x02, 0xcc, 0x61,
0x71, 0x24, 0x98, 0x2d, 0x58, 0x0a, 0x32, 0x09, 0xac, 0x1e, 0x85, 0xde, 0x15, 0x77, 0xd3, 0x3d,
0xa8, 0x51, 0x14, 0x91, 0x98, 0xf2, 0x3d, 0x50, 0x14, 0x4e, 0x5d, 0x91, 0x4e, 0xfd, 0x02, 0x07,
0xf1, 0xb9, 0xa5, 0xc7, 0xac, 0x94, 0x4c, 0xc5, 0x27, 0x8b, 0xae, 0x12, 0x9f, 0x1f, 0xc1, 0xb5,
0xbe, 0x13, 0x47, 0x57, 0xd1, 0xd5, 0xfc, 0x98, 0xc7, 0x76, 0x14, 0xfb, 0x57, 0x9a, 0xfc, 0x87,
0x02, 0x54, 0x77, 0xc2, 0xf8, 0x28, 0x72, 0x86, 0xc8, 0x78, 0x05, 0xea, 0x8c, 0x30, 0x67, 0x64,
0xc7, 0x1c, 0x14, 0xe4, 0x65, 0x0b, 0x04, 0x4a, 0x12, 0xbc, 0x0a, 0x8d, 0x10, 0x51, 0x37, 0x8c,
0x15, 0x45, 0xf1, 0x66, 0x69, 0xbd, 0x6c, 0xd5, 0x25, 0x4e, 0x92, 0x6c, 0xc0, 0xb2, 0x18, 0xb3,
0x71, 0x60, 0x9f, 0x21, 0x1a, 0xa0, 0x91, 0x4f, 0x3c, 0x24, 0x82, 0xa3, 0x6c, 0x75, 0xc4, 0xd0,
0x41, 0xf0, 0x79, 0x32, 0x60, 0xbc, 0x09, 0x9d, 0x84, 0x9e, 0x47, 0xbc, 0xa0, 0x2e, 0x0b, 0xea,
0xb6, 0xa2, 0x3e, 0x52, 0x68, 0xf3, 0x97, 0xd0, 0x7a, 0x7c, 0x4a, 0x09, 0x63, 0x23, 0x1c, 0x0c,
0x1f, 0x3a, 0xcc, 0xe1, 0x5b, 0x33, 0x44, 0x14, 0x13, 0x2f, 0x52, 0xda, 0x6a, 0xd0, 0x78, 0x0b,
0x3a, 0x4c, 0xd2, 0x22, 0xcf, 0xd6, 0x34, 0x45, 0x41, 0xb3, 0x94, 0x0c, 0xf4, 0x15, 0xf1, 0xeb,
0xd0, 0x4a, 0x89, 0xf9, 0xe6, 0x56, 0xfa, 0x36, 0x13, 0xec, 0x63, 0xec, 0x23, 0x73, 0x2c, 0x7c,
0x25, 0x16, 0xd9, 0x78, 0x0b, 0x6a, 0xa9, 0x1f, 0x0a, 0x22, 0x42, 0x5a, 0x32, 0x42, 0xb4, 0x3b,
0xad, 0x6a, 0xe2, 0x94, 0x4f, 0xa0, 0xcd, 0x12, 0xc5, 0x6d, 0xcf, 0x61, 0x4e, 0x3e, 0xa8, 0xf2,
0x56, 0x59, 0x2d, 0x96, 0x83, 0xcd, 0x8f, 0xa1, 0xd6, 0xc7, 0x5e, 0x24, 0x05, 0x77, 0xa1, 0xe2,
0xc6, 0x94, 0xa2, 0x80, 0x69, 0x93, 0x15, 0x68, 0xac, 0xc0, 0xc2, 0x08, 0xfb, 0x98, 0x29, 0x33,
0x25, 0x60, 0x12, 0x80, 0x43, 0xe4, 0x13, 0x7a, 0x21, 0x1c, 0xb6, 0x02, 0x0b, 0xd9, 0xc5, 0x95,
0x80, 0xf1, 0x22, 0xd4, 0x7c, 0xe7, 0x3c, 0x59, 0x54, 0x3e, 0x52, 0xf5, 0x9d, 0x73, 0xa9, 0x7c,
0x17, 0x2a, 0x27, 0x0e, 0x1e, 0xb9, 0x01, 0x53, 0x5e, 0xd1, 0x60, 0x2a, 0xb0, 0x9c, 0x15, 0xf8,
0xe7, 0x22, 0xd4, 0xa5, 0x44, 0xa9, 0xf0, 0x0a, 0x2c, 0xb8, 0x8e, 0x7b, 0x9a, 0x88, 0x14, 0x80,
0x71, 0x5b, 0x2b, 0x52, 0xcc, 0x66, 0xb8, 0x54, 0x53, 0xad, 0xda, 0x26, 0x40, 0xf4, 0xc4, 0x09,
0x95, 0x6e, 0xa5, 0x39, 0xc4, 0x35, 0x4e, 0x23, 0xd5, 0x7d, 0x17, 0x1a, 0x32, 0xee, 0xd4, 0x94,
0xf2, 0x9c, 0x29, 0x75, 0x49, 0x25, 0x27, 0xdd, 0x82, 0x66, 0x1c, 0x21, 0xfb, 0x14, 0x23, 0xea,
0x50, 0xf7, 0xf4, 0xa2, 0xbb, 0x20, 0x0f, 0xa0, 0x38, 0x42, 0xfb, 0x1a, 0x67, 0xdc, 0x83, 0x05,
0x9e, 0x5b, 0xa2, 0xee, 0xa2, 0x38, 0xeb, 0x5e, 0xca, 0xb2, 0x14, 0xa6, 0x6e, 0x88, 0xdf, 0xdd,
0x80, 0xd1, 0x0b, 0x4b, 0x92, 0xf6, 0x3e, 0x00, 0x48, 0x91, 0xc6, 0x12, 0x94, 0xce, 0xd0, 0x85,
0xda, 0x87, 0xfc, 0x93, 0x3b, 0x67, 0xec, 0x8c, 0x62, 0xed, 0x75, 0x09, 0x7c, 0x54, 0xfc, 0xa0,
0x60, 0xba, 0xd0, 0xde, 0x1e, 0x9d, 0x61, 0x92, 0x99, 0xbe, 0x02, 0x0b, 0xbe, 0xf3, 0x35, 0xa1,
0xda, 0x93, 0x02, 0x10, 0x58, 0x1c, 0x10, 0xaa, 0x59, 0x08, 0xc0, 0x68, 0x41, 0x91, 0x84, 0xc2,
0x5f, 0x35, 0xab, 0x48, 0xc2, 0x54, 0x50, 0x39, 0x23, 0xc8, 0xfc, 0x47, 0x19, 0x20, 0x95, 0x62,
0x58, 0xd0, 0xc3, 0xc4, 0x8e, 0x10, 0xe5, 0xe7, 0xbb, 0x7d, 0x7c, 0xc1, 0x50, 0x64, 0x53, 0xe4,
0xc6, 0x34, 0xc2, 0x63, 0xbe, 0x7e, 0xdc, 0xec, 0x6b, 0xd2, 0xec, 0x09, 0xdd, 0xac, 0xeb, 0x98,
0x0c, 0xe4, 0xbc, 0x6d, 0x3e, 0xcd, 0xd2, 0xb3, 0x8c, 0x03, 0xb8, 0x96, 0xf2, 0xf4, 0x32, 0xec,
0x8a, 0x97, 0xb1, 0x5b, 0x4e, 0xd8, 0x79, 0x29, 0xab, 0x5d, 0x58, 0xc6, 0xc4, 0xfe, 0x26, 0x46,
0x71, 0x8e, 0x51, 0xe9, 0x32, 0x46, 0x1d, 0x4c, 0xfe, 0x5f, 0x4c, 0x48, 0xd9, 0xf4, 0xe1, 0x46,
0xc6, 0x4a, 0xbe, 0xdd, 0x33, 0xcc, 0xca, 0x97, 0x31, 0x5b, 0x4d, 0xb4, 0xe2, 0xf9, 0x20, 0xe5,
0xf8, 0x19, 0xac, 0x62, 0x62, 0x3f, 0x71, 0x30, 0x9b, 0x64, 0xb7, 0xf0, 0x3d, 0x46, 0xf2, 0x13,
0x2d, 0xcf, 0x4b, 0x1a, 0xe9, 0x23, 0x3a, 0xcc, 0x19, 0xb9, 0xf8, 0x3d, 0x46, 0x1e, 0x8a, 0x09,
0x29, 0x9b, 0x2d, 0xe8, 0x60, 0x32, 0xa9, 0x4d, 0xe5, 0x32, 0x26, 0x6d, 0x4c, 0xf2, 0x9a, 0x6c,
0x43, 0x27, 0x42, 0x2e, 0x23, 0x34, 0x1b, 0x04, 0xd5, 0xcb, 0x58, 0x2c, 0x29, 0xfa, 0x84, 0x87,
0xf9, 0x53, 0x68, 0xec, 0xc7, 0x43, 0xc4, 0x46, 0xc7, 0x49, 0x32, 0x78, 0x6e, 0xf9, 0xc7, 0xfc,
0x57, 0x11, 0xea, 0x3b, 0x43, 0x4a, 0xe2, 0x30, 0x97, 0x93, 0xe5, 0x26, 0x9d, 0xcc, 0xc9, 0x82,
0x44, 0xe4, 0x64, 0x49, 0xfc, 0x1e, 0x34, 0x7c, 0xb1, 0x75, 0x15, 0xbd, 0xcc, 0x43, 0x9d, 0xa9,
0x4d, 0x6d, 0xd5, 0xfd, 0x4c, 0x32, 0xdb, 0x00, 0x08, 0xb1, 0x17, 0xa9, 0x39, 0x32, 0x1d, 0xb5,
0x55, 0xb9, 0xa5, 0x53, 0xb4, 0x55, 0x0b, 0x93, 0x6c, 0xfd, 0x0e, 0xd4, 0x8f, 0xb9, 0x93, 0xd4,
0x84, 0x5c, 0x32, 0x4a, 0xbd, 0x67, 0xc1, 0x71, 0xba, 0x09, 0xf7, 0xa1, 0x79, 0x2a, 0x5d, 0xa6,
0x26, 0xc9, 0x18, 0xba, 0xa5, 0x2c, 0x49, 0xed, 0xdd, 0xc8, 0x7a, 0x56, 0x2e, 0x40, 0xe3, 0x34,
0x83, 0xea, 0x0d, 0xa0, 0x33, 0x45, 0x32, 0x23, 0x07, 0xad, 0x67, 0x73, 0x50, 0xfd, 0x9e, 0x21,
0x05, 0x65, 0x67, 0x66, 0xf3, 0xd2, 0x6f, 0x8b, 0xd0, 0xf8, 0x12, 0xb1, 0x27, 0x84, 0x9e, 0x49,
0x7d, 0x0d, 0x28, 0x07, 0x8e, 0x8f, 0x14, 0x47, 0xf1, 0x6d, 0xdc, 0x80, 0x2a, 0x3d, 0x97, 0x09,
0x44, 0xad, 0x67, 0x85, 0x9e, 0x8b, 0xc4, 0x60, 0xbc, 0x0c, 0x40, 0xcf, 0xed, 0xd0, 0x71, 0xcf,
0x90, 0xf2, 0x60, 0xd9, 0xaa, 0xd1, 0xf3, 0xbe, 0x44, 0xf0, 0x50, 0xa0, 0xe7, 0x36, 0xa2, 0x94,
0xd0, 0x48, 0xe5, 0xaa, 0x2a, 0x3d, 0xdf, 0x15, 0xb0, 0x9a, 0xeb, 0x51, 0x12, 0x86, 0xc8, 0x13,
0x39, 0x5a, 0xcc, 0x7d, 0x28, 0x11, 0x5c, 0x2a, 0xd3, 0x52, 0x17, 0xa5, 0x54, 0x96, 0x4a, 0x65,
0xa9, 0xd4, 0x8a, 0x9c, 0xc9, 0xb2, 0x52, 0x59, 0x22, 0xb5, 0x2a, 0xa5, 0xb2, 0x8c, 0x54, 0x96,
0x4a, 0xad, 0xe9, 0xb9, 0x4a, 0xaa, 0xf9, 0x9b, 0x02, 0xac, 0x4e, 0x16, 0x7e, 0xaa, 0x36, 0x7d,
0x0f, 0x1a, 0xae, 0x58, 0xaf, 0x5c, 0x4c, 0x76, 0xa6, 0x56, 0xd2, 0xaa, 0xbb, 0x99, 0x30, 0xbe,
0x0f, 0xcd, 0x40, 0x3a, 0x38, 0x09, 0xcd, 0x52, 0xba, 0x2e, 0x59, 0xdf, 0x5b, 0x8d, 0x20, 0x03,
0x99, 0x1e, 0x18, 0x5f, 0x51, 0xcc, 0xd0, 0x80, 0x51, 0xe4, 0xf8, 0xcf, 0xa3, 0xba, 0x37, 0xa0,
0x2c, 0xaa, 0x15, 0xbe, 0x4c, 0x0d, 0x4b, 0x7c, 0x9b, 0x6f, 0xc0, 0x72, 0x4e, 0x8a, 0xb2, 0x75,
0x09, 0x4a, 0x23, 0x14, 0x08, 0xee, 0x4d, 0x8b, 0x7f, 0x9a, 0x0e, 0x74, 0x2c, 0xe4, 0x78, 0xcf,
0x4f, 0x1b, 0x25, 0xa2, 0x94, 0x8a, 0x58, 0x07, 0x23, 0x2b, 0x42, 0xa9, 0xa2, 0xb5, 0x2e, 0x64,
0xb4, 0x7e, 0x04, 0x9d, 0x9d, 0x11, 0x89, 0xd0, 0x80, 0x79, 0x38, 0x78, 0x1e, 0xed, 0xc8, 0x2f,
0x60, 0xf9, 0x31, 0xbb, 0xf8, 0x8a, 0x33, 0x8b, 0xf0, 0xb7, 0xe8, 0x39, 0xd9, 0x47, 0xc9, 0x13,
0x6d, 0x1f, 0x25, 0x4f, 0x78, 0x73, 0xe3, 0x92, 0x51, 0xec, 0x07, 0x62, 0x2b, 0x34, 0x2d, 0x05,
0x99, 0xdb, 0xd0, 0x90, 0x35, 0xf4, 0x21, 0xf1, 0xe2, 0x11, 0x9a, 0xb9, 0x07, 0xd7, 0x00, 0x42,
0x87, 0x3a, 0x3e, 0x62, 0x88, 0xca, 0x18, 0xaa, 0x59, 0x19, 0x8c, 0xf9, 0xbb, 0x22, 0xac, 0xc8,
0xfb, 0x86, 0x81, 0x6c, 0xb3, 0xb5, 0x09, 0x3d, 0xa8, 0x9e, 0x92, 0x88, 0x65, 0x18, 0x26, 0x30,
0x57, 0x91, 0xf7, 0xe7, 0x92, 0x1b, 0xff, 0xcc, 0x5d, 0x02, 0x94, 0x2e, 0xbf, 0x04, 0x98, 0x6a,
0xf3, 0xcb, 0xd3, 0x6d, 0x3e, 0xdf, 0x6d, 0x9a, 0x08, 0xcb, 0x3d, 0x5e, 0xb3, 0x6a, 0x0a, 0x73,
0xe0, 0x19, 0xb7, 0xa1, 0x3d, 0xe4, 0x5a, 0xda, 0xa7, 0x84, 0x9c, 0xd9, 0xa1, 0xc3, 0x4e, 0xc5,
0x56, 0xaf, 0x59, 0x4d, 0x81, 0xde, 0x27, 0xe4, 0xac, 0xef, 0xb0, 0x53, 0xe3, 0x43, 0x68, 0xa9,
0x32, 0xd0, 0x17, 0x2e, 0x8a, 0xd4, 0xe1, 0xa7, 0x76, 0x51, 0xd6, 0x7b, 0x56, 0xf3, 0x2c, 0x03,
0x45, 0xe6, 0x75, 0xb8, 0xf6, 0x10, 0x45, 0x8c, 0x92, 0x8b, 0xbc, 0x63, 0xcc, 0xff, 0x05, 0x38,
0x08, 0x18, 0xa2, 0x27, 0x8e, 0x8b, 0x22, 0xe3, 0xed, 0x2c, 0xa4, 0x8a, 0xa3, 0xa5, 0x0d, 0x79,
0xdd, 0x93, 0x0c, 0x58, 0x19, 0x1a, 0x73, 0x03, 0x16, 0x2d, 0x12, 0xf3, 0x74, 0xf4, 0x9a, 0xfe,
0x52, 0xf3, 0x1a, 0x6a, 0x9e, 0x40, 0x5a, 0x6a, 0xcc, 0xdc, 0xd7, 0x2d, 0x6c, 0xca, 0x4e, 0x2d,
0xd1, 0x06, 0xd4, 0xb0, 0xc6, 0xa9, 0xac, 0x32, 0x2d, 0x3a, 0x25, 0x31, 0x3f, 0x86, 0x65, 0xc9,
0x49, 0x72, 0xd6, 0x6c, 0x5e, 0x83, 0x45, 0xaa, 0xd5, 0x28, 0xa4, 0xf7, 0x3c, 0x8a, 0x48, 0x8d,
0x71, 0x7f, 0x7c, 0x81, 0x23, 0x96, 0x1a, 0xa2, 0xfd, 0xb1, 0x0c, 0x1d, 0x3e, 0x90, 0xe3, 0x69,
0x7e, 0x0a, 0x8d, 0x2d, 0xab, 0xff, 0x25, 0xc2, 0xc3, 0xd3, 0x63, 0x9e, 0x3d, 0xdf, 0xcf, 0xc3,
0xca, 0x60, 0x43, 0x69, 0x9b, 0x19, 0xb2, 0x72, 0x74, 0xe6, 0x67, 0xb0, 0xba, 0xe5, 0x79, 0x59,
0x94, 0xd6, 0xfa, 0x6d, 0xa8, 0x05, 0x19, 0x76, 0x99, 0x33, 0x2b, 0x47, 0x9d, 0x12, 0x99, 0x77,
0xc1, 0xd8, 0x43, 0xec, 0xa0, 0xff, 0xd8, 0x39, 0x1e, 0xa5, 0xd6, 0x5f, 0x87, 0x0a, 0x8e, 0x6c,
0x1c, 0x8e, 0xdf, 0x17, 0x5c, 0xaa, 0xd6, 0x22, 0x8e, 0x0e, 0xc2, 0xf1, 0xfb, 0xe6, 0x1d, 0x58,
0xce, 0x91, 0x5f, 0x92, 0x56, 0xb6, 0xc0, 0x18, 0xfc, 0x70, 0xce, 0x09, 0x8b, 0x62, 0x86, 0xc5,
0x1d, 0x58, 0x1e, 0xfc, 0x40, 0x69, 0x3f, 0x83, 0xe5, 0x47, 0xc1, 0x08, 0x07, 0x68, 0xa7, 0x7f,
0x74, 0x88, 0x92, 0x9c, 0x6a, 0x40, 0x99, 0xd7, 0x9e, 0x4a, 0x96, 0xf8, 0xe6, 0x2a, 0x04, 0xc7,
0xb6, 0x1b, 0xc6, 0x91, 0xba, 0xb4, 0x5a, 0x0c, 0x8e, 0x77, 0xc2, 0x38, 0xe2, 0x87, 0x24, 0x2f,
0x92, 0x48, 0x30, 0xba, 0x10, 0x99, 0xa6, 0x6a, 0x55, 0xdc, 0x30, 0x7e, 0x14, 0x8c, 0x2e, 0xcc,
0xff, 0x11, 0x37, 0x09, 0x08, 0x79, 0x96, 0x13, 0x78, 0xc4, 0x7f, 0x88, 0xc6, 0x19, 0x09, 0x53,
0x7a, 0x3f, 0x2d, 0x40, 0x63, 0x6b, 0x88, 0x02, 0xf6, 0x10, 0x31, 0x07, 0x8f, 0x44, 0x67, 0x3a,
0x46, 0x34, 0xc2, 0x24, 0x50, 0x69, 0x43, 0x83, 0xc6, 0x2b, 0x50, 0xc7, 0x01, 0x66, 0xb6, 0xe7,
0x20, 0x9f, 0x04, 0x82, 0x4b, 0xd5, 0x02, 0x8e, 0x7a, 0x28, 0x30, 0xc6, 0x1b, 0xd0, 0x96, 0x97,
0x8a, 0xf6, 0xa9, 0x13, 0x78, 0x23, 0x9e, 0xb0, 0x4a, 0x22, 0xc5, 0xb4, 0x24, 0x7a, 0x5f, 0x61,
0x8d, 0x3b, 0xb0, 0xa4, 0xd2, 0x49, 0x4a, 0x59, 0x16, 0x94, 0x6d, 0x85, 0xcf, 0x91, 0xc6, 0x61,
0x48, 0x28, 0x8b, 0xec, 0x08, 0xb9, 0x2e, 0xf1, 0x43, 0xd5, 0xd6, 0xb5, 0x35, 0x7e, 0x20, 0xd1,
0xe6, 0x10, 0x96, 0xf7, 0xb8, 0x9d, 0xca, 0x92, 0x74, 0x7b, 0xb4, 0x7c, 0xe4, 0xdb, 0xc7, 0x23,
0xe2, 0x9e, 0xd9, 0x3c, 0xc9, 0x2b, 0x0f, 0xf3, 0xc2, 0x71, 0x9b, 0x23, 0x07, 0xf8, 0x5b, 0x71,
0x83, 0xc1, 0xa9, 0x4e, 0x09, 0x0b, 0x47, 0xf1, 0xd0, 0x0e, 0x29, 0x39, 0x46, 0xca, 0xc4, 0xb6,
0x8f, 0xfc, 0x7d, 0x89, 0xef, 0x73, 0xb4, 0xf9, 0xa7, 0x02, 0xac, 0xe4, 0x25, 0xa9, 0xd5, 0xde,
0x84, 0x95, 0xbc, 0x28, 0x55, 0xc6, 0xc8, 0x32, 0xb9, 0x93, 0x15, 0x28, 0x0b, 0x9a, 0xfb, 0xd0,
0x14, 0x57, 0xd0, 0xb6, 0x27, 0x39, 0xe5, 0x8b, 0xb7, 0xec, 0xba, 0x58, 0x0d, 0x27, 0xbb, 0x4a,
0x1f, 0xc2, 0x0d, 0x65, 0xbe, 0x3d, 0xad, 0xb6, 0x0c, 0x88, 0x55, 0x45, 0x70, 0x38, 0xa1, 0xfd,
0x17, 0xd0, 0x4d, 0x51, 0xdb, 0x17, 0x02, 0x99, 0x6e, 0xca, 0xe5, 0x09, 0x63, 0xb7, 0x3c, 0x8f,
0x8a, 0xdd, 0x5e, 0xb6, 0x66, 0x0d, 0x99, 0x0f, 0xe0, 0xfa, 0x00, 0x31, 0xe9, 0x0d, 0x87, 0xa9,
0x8e, 0x4a, 0x32, 0x5b, 0x82, 0xd2, 0x00, 0xb9, 0xc2, 0xf8, 0x92, 0xc5, 0x3f, 0x79, 0x00, 0x1e,
0x45, 0xc8, 0x15, 0x56, 0x96, 0x2c, 0xf1, 0x6d, 0x86, 0x50, 0xf9, 0x74, 0xb0, 0xc7, 0xeb, 0x26,
0x1e, 0xd4, 0xb2, 0xce, 0x52, 0x67, 0x6a, 0xd3, 0xaa, 0x08, 0xf8, 0xc0, 0x33, 0x3e, 0x83, 0x65,
0x39, 0xe4, 0x9e, 0x3a, 0xc1, 0x10, 0xd9, 0x21, 0x19, 0x61, 0x57, 0x86, 0x7e, 0xeb, 0x5e, 0x4f,
0xa5, 0x21, 0xc5, 0x67, 0x47, 0x90, 0xf4, 0x05, 0x85, 0xd5, 0x19, 0x4e, 0xa2, 0xcc, 0xbf, 0x17,
0xa0, 0xa2, 0x8e, 0x35, 0x7e, 0x34, 0x7b, 0x14, 0x8f, 0x11, 0x55, 0xc1, 0xae, 0x20, 0xe3, 0x75,
0x68, 0xc9, 0x2f, 0x9b, 0x84, 0x0c, 0x93, 0xe4, 0xb0, 0x6c, 0x4a, 0xec, 0x23, 0x89, 0x14, 0xd7,
0x96, 0xe2, 0xe2, 0x50, 0xf5, 0xe8, 0x0a, 0xe2, 0xf8, 0x93, 0x88, 0x2b, 0x25, 0x0e, 0xc7, 0x9a,
0xa5, 0x20, 0xbe, 0xb9, 0x34, 0xbf, 0x05, 0xc1, 0x4f, 0x83, 0x7c, 0x73, 0xf9, 0x24, 0x0e, 0x98,
0x1d, 0x12, 0x1c, 0x30, 0x75, 0x1a, 0x82, 0x40, 0xf5, 0x39, 0xc6, 0x58, 0x87, 0xea, 0x49, 0x64,
0x0b, 0x6b, 0x44, 0xe5, 0x9b, 0x9c, 0xd0, 0xca, 0x6a, 0xab, 0x72, 0x12, 0x89, 0x0f, 0xf3, 0xd7,
0x05, 0x58, 0x94, 0x97, 0xfc, 0x46, 0x0b, 0x8a, 0x49, 0xf5, 0x52, 0xc4, 0xa2, 0x12, 0x14, 0x5a,
0xc9, 0x8a, 0x45, 0x7c, 0xf3, 0x1c, 0x33, 0xf6, 0xe5, 0x19, 0xac, 0x8c, 0x18, 0xfb, 0xe2, 0xf0,
0x7d, 0x1d, 0x5a, 0x69, 0x11, 0x24, 0xc6, 0xa5, 0x31, 0xcd, 0x04, 0x2b, 0xc8, 0xe6, 0xda, 0x64,
0xfe, 0x18, 0x20, 0xbd, 0xec, 0xe6, 0xe1, 0x10, 0x27, 0xca, 0xf0, 0x4f, 0x8e, 0x19, 0x26, 0xe5,
0x13, 0xff, 0x34, 0x6e, 0x43, 0xcb, 0xf1, 0x3c, 0xcc, 0xa7, 0x3b, 0xa3, 0x3d, 0xec, 0x25, 0x09,
0x24, 0x8f, 0x35, 0xff, 0x52, 0x80, 0xf6, 0x0e, 0x09, 0x2f, 0x3e, 0xc5, 0x23, 0x94, 0xc9, 0x6e,
0x42, 0x49, 0x55, 0x3d, 0xf1, 0x6f, 0xde, 0x11, 0x9c, 0xe0, 0x11, 0x92, 0xdb, 0x5e, 0x46, 0x5d,
0x95, 0x23, 0xc4, 0x96, 0xd7, 0x83, 0xc9, 0xd5, 0x66, 0x53, 0x0e, 0x1e, 0x12, 0x4f, 0xf4, 0x3e,
0x1e, 0xa6, 0x76, 0x72, 0x91, 0xd9, 0xb4, 0x2a, 0x1e, 0xa6, 0x62, 0x48, 0x19, 0xb2, 0x20, 0x2e,
0xaa, 0xb3, 0x86, 0x2c, 0x4a, 0x0c, 0x37, 0x64, 0x15, 0x16, 0xc9, 0xc9, 0x49, 0x84, 0x98, 0x58,
0xab, 0x92, 0xa5, 0xa0, 0x24, 0x05, 0x57, 0x33, 0x29, 0x78, 0x45, 0x9c, 0x6b, 0x8f, 0x1e, 0x1d,
0xee, 0x8e, 0x51, 0xc0, 0xf4, 0x09, 0x7c, 0x17, 0xaa, 0x1a, 0xf5, 0x43, 0xae, 0x80, 0xdf, 0x84,
0xd6, 0x96, 0xe7, 0x0d, 0x9e, 0x38, 0xa1, 0xf6, 0x47, 0x17, 0x2a, 0xfd, 0x9d, 0x83, 0xbe, 0x74,
0x49, 0x89, 0x1b, 0xa0, 0x40, 0x7e, 0xe2, 0xef, 0x21, 0x76, 0x88, 0x18, 0xc5, 0x6e, 0x72, 0xe2,
0xdf, 0x82, 0x8a, 0xc2, 0xf0, 0x99, 0xbe, 0xfc, 0xd4, 0x47, 0x80, 0x02, 0xcd, 0xff, 0x03, 0xe3,
0x47, 0xbc, 0x76, 0x45, 0xb2, 0x71, 0x51, 0x92, 0xde, 0x84, 0xce, 0x58, 0x60, 0x6d, 0x59, 0xd4,
0x65, 0x96, 0xa1, 0x2d, 0x07, 0x44, 0x7e, 0x10, 0xb2, 0x8f, 0x60, 0x59, 0x96, 0xda, 0x92, 0xcf,
0x15, 0x58, 0x70, 0x1f, 0x26, 0xeb, 0x59, 0xb6, 0xc4, 0xf7, 0xbd, 0xa7, 0x86, 0x3a, 0xc6, 0xd4,
0xcd, 0x8e, 0xb1, 0x07, 0xed, 0x89, 0x67, 0x38, 0x43, 0x5d, 0xf5, 0xcd, 0x7e, 0x9d, 0xeb, 0xad,
0x6e, 0xc8, 0x67, 0xbd, 0x0d, 0xfd, 0xac, 0xb7, 0xb1, 0xeb, 0x87, 0xec, 0xc2, 0xd8, 0x85, 0x56,
0xfe, 0xc1, 0xca, 0x78, 0x51, 0x57, 0xc6, 0x33, 0x9e, 0xb1, 0xe6, 0xb2, 0xd9, 0x83, 0xf6, 0xc4,
0xdb, 0x95, 0xd6, 0x67, 0xf6, 0x93, 0xd6, 0x5c, 0x46, 0x0f, 0xa0, 0x9e, 0x79, 0xac, 0x32, 0xba,
0x92, 0xc9, 0xf4, 0xfb, 0xd5, 0x5c, 0x06, 0x3b, 0xd0, 0xcc, 0xbd, 0x1f, 0x19, 0x3d, 0x65, 0xcf,
0x8c, 0x47, 0xa5, 0xb9, 0x4c, 0xb6, 0xa1, 0x9e, 0x79, 0xc6, 0xd1, 0x5a, 0x4c, 0xbf, 0x15, 0xf5,
0x6e, 0xcc, 0x18, 0x51, 0xa7, 0xe5, 0x1e, 0xb4, 0x27, 0xde, 0x76, 0xb4, 0x4b, 0x66, 0x3f, 0xf9,
0xcc, 0x55, 0xe6, 0x73, 0xb1, 0x44, 0x99, 0xd6, 0x3d, 0xb3, 0x44, 0xd3, 0x2f, 0x39, 0xbd, 0x97,
0x66, 0x0f, 0x2a, 0xad, 0x76, 0xa1, 0x95, 0x7f, 0xc4, 0xd1, 0xcc, 0x66, 0x3e, 0xed, 0x5c, 0xbe,
0xde, 0xb9, 0xf7, 0x9c, 0x74, 0xbd, 0x67, 0x3d, 0xf3, 0xcc, 0x65, 0xb4, 0x05, 0xa0, 0x1a, 0x75,
0x0f, 0x07, 0x89, 0xa3, 0xa7, 0x2e, 0x08, 0x12, 0x47, 0xcf, 0x68, 0xea, 0x1f, 0x00, 0xc8, 0xfe,
0xda, 0x23, 0x31, 0x33, 0xae, 0x6b, 0x35, 0x26, 0x9a, 0xfa, 0x5e, 0x77, 0x7a, 0x60, 0x8a, 0x01,
0xa2, 0xf4, 0x2a, 0x0c, 0x3e, 0x01, 0x48, 0xfb, 0x76, 0xcd, 0x60, 0xaa, 0x93, 0xbf, 0xc4, 0x07,
0x8d, 0x6c, 0x97, 0x6e, 0x28, 0x5b, 0x67, 0x74, 0xee, 0x97, 0xb0, 0x68, 0x4f, 0x74, 0x61, 0xf9,
0x60, 0x9b, 0x6c, 0xce, 0x7a, 0x53, 0x9d, 0x98, 0x71, 0x1f, 0x1a, 0xd9, 0xf6, 0x4b, 0x6b, 0x31,
0xa3, 0x25, 0xeb, 0xe5, 0x5a, 0x30, 0xe3, 0x01, 0xb4, 0xf2, 0xad, 0x97, 0x0e, 0xa9, 0x99, 0x0d,
0x59, 0x4f, 0x5d, 0x2c, 0x66, 0xc8, 0xdf, 0x05, 0x48, 0x5b, 0x34, 0xed, 0xbe, 0xa9, 0xa6, 0x6d,
0x42, 0xea, 0x1e, 0xb4, 0x27, 0x5a, 0x2f, 0x6d, 0xf1, 0xec, 0x8e, 0xec, 0xb2, 0xbd, 0x9e, 0x69,
0xa4, 0x74, 0x08, 0x4e, 0xb7, 0x62, 0x3a, 0x04, 0x67, 0x75, 0x5d, 0xdb, 0x50, 0x1f, 0x4c, 0xf3,
0x18, 0xcc, 0xe5, 0x31, 0xab, 0x97, 0x7a, 0x0f, 0x20, 0x3d, 0xb6, 0xb4, 0x17, 0xa6, 0x0e, 0xb2,
0x5e, 0x53, 0x5f, 0xfe, 0x4a, 0xba, 0x1d, 0x68, 0xe6, 0xee, 0x47, 0x74, 0xba, 0x9b, 0x75, 0x69,
0x72, 0xd9, 0x21, 0x90, 0xbf, 0x4c, 0xd0, 0x2b, 0x38, 0xf3, 0x8a, 0xe1, 0xb2, 0x38, 0xce, 0x76,
0x7e, 0x3a, 0x82, 0x66, 0x74, 0x83, 0xdf, 0x93, 0x57, 0xb2, 0xdd, 0x5d, 0x26, 0xaf, 0xcc, 0x68,
0xfa, 0xe6, 0x32, 0xda, 0x87, 0xf6, 0x9e, 0x2e, 0xdc, 0x55, 0x53, 0xa1, 0xd7, 0x6f, 0xba, 0x89,
0xea, 0xf5, 0x66, 0x0d, 0xa9, 0x75, 0xf9, 0x1c, 0x3a, 0x53, 0x0d, 0x85, 0xb1, 0x96, 0x5c, 0xc1,
0xcf, 0xec, 0x34, 0xe6, 0xaa, 0x75, 0x00, 0x4b, 0x93, 0xfd, 0x84, 0xf1, 0x72, 0x12, 0x13, 0xb3,
0xfa, 0x8c, 0xb9, 0xac, 0x3e, 0x84, 0xaa, 0xae, 0x11, 0x0d, 0xf5, 0xd4, 0x31, 0x51, 0x33, 0xce,
0x9d, 0x7a, 0x5f, 0x84, 0x7c, 0x52, 0x7f, 0xa5, 0x21, 0x3f, 0x51, 0xa5, 0xf5, 0xd4, 0xcb, 0x44,
0x42, 0x79, 0x1f, 0x2a, 0xaa, 0x0c, 0x33, 0x56, 0x92, 0xcd, 0x96, 0xa9, 0xca, 0x2e, 0x8b, 0xb0,
0x3d, 0xc4, 0x32, 0xc5, 0x95, 0x16, 0x3a, 0x5d, 0x6f, 0xe9, 0x3d, 0x92, 0x1b, 0x51, 0x6b, 0xb1,
0x05, 0x8d, 0x6c, 0x79, 0xa5, 0x97, 0x74, 0x46, 0xc9, 0x35, 0x4f, 0x93, 0xed, 0xf3, 0xa7, 0xdf,
0xad, 0xbd, 0xf0, 0xb7, 0xef, 0xd6, 0x5e, 0xf8, 0xd5, 0xb3, 0xb5, 0xc2, 0xd3, 0x67, 0x6b, 0x85,
0xbf, 0x3e, 0x5b, 0x2b, 0xfc, 0xf3, 0xd9, 0x5a, 0xe1, 0x27, 0x3f, 0xff, 0x0f, 0xff, 0x73, 0x45,
0xe3, 0x80, 0x61, 0x1f, 0x6d, 0x8e, 0x31, 0x65, 0x99, 0xa1, 0xf0, 0x6c, 0x28, 0xff, 0x78, 0x95,
0xf9, 0x3f, 0x16, 0xd7, 0xf2, 0x78, 0x51, 0xc0, 0xef, 0xfe, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x77,
0xb9, 0x27, 0x67, 0xdc, 0x25, 0x00, 0x00,
// 3249 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3a, 0xcb, 0x72, 0x1c, 0x47,
0x72, 0x9a, 0x07, 0x30, 0x33, 0x39, 0x2f, 0x4c, 0x0f, 0x08, 0x0e, 0x47, 0x14, 0x44, 0x35, 0x25,
0x0a, 0x94, 0x4c, 0x40, 0xa2, 0x14, 0xa2, 0x1e, 0x21, 0xd3, 0x00, 0x08, 0x01, 0x90, 0x04, 0x71,
0xdc, 0x43, 0x58, 0x0e, 0x3b, 0xec, 0x8e, 0x46, 0x77, 0x61, 0xa6, 0x84, 0xe9, 0xae, 0x56, 0x75,
0x35, 0x08, 0xc8, 0x11, 0x0e, 0x9f, 0xec, 0x9b, 0x8f, 0xbe, 0xe9, 0x07, 0x1c, 0xfe, 0x03, 0x5f,
0x7d, 0x50, 0xf8, 0xb4, 0xc7, 0xbd, 0xec, 0xc6, 0x8a, 0x9f, 0xb0, 0x5f, 0xb0, 0x51, 0xaf, 0x7e,
0xcc, 0x03, 0xd2, 0x22, 0x18, 0xb1, 0x97, 0x89, 0xce, 0xac, 0xac, 0x7c, 0x55, 0x56, 0x56, 0x66,
0xd5, 0xc0, 0x60, 0x84, 0xd9, 0x38, 0x3e, 0xd9, 0x74, 0x89, 0xbf, 0x75, 0xe6, 0x30, 0xe7, 0x81,
0x4b, 0x02, 0xe6, 0xe0, 0x00, 0xd1, 0x68, 0x06, 0x8e, 0xa8, 0xbb, 0x35, 0xc1, 0x27, 0xd1, 0x56,
0x48, 0x09, 0x23, 0x2e, 0x99, 0xa8, 0xaf, 0x68, 0xcb, 0x19, 0xa1, 0x80, 0x6d, 0x0a, 0xc0, 0x28,
0x8f, 0x68, 0xe8, 0xf6, 0x6b, 0xc4, 0xc5, 0x12, 0xd1, 0xaf, 0xb9, 0x91, 0xfe, 0xac, 0xb3, 0xcb,
0x10, 0x45, 0x0a, 0x78, 0x75, 0x44, 0xc8, 0x68, 0x82, 0x24, 0x8f, 0x93, 0xf8, 0x74, 0x0b, 0xf9,
0x21, 0xbb, 0x94, 0x83, 0xe6, 0x8f, 0x45, 0x58, 0xdb, 0xa5, 0xc8, 0x61, 0x68, 0x57, 0x2b, 0x60,
0xa1, 0xef, 0x63, 0x14, 0x31, 0xe3, 0x0d, 0x68, 0x24, 0x4a, 0xd9, 0xd8, 0xeb, 0x15, 0xee, 0x14,
0x36, 0x6a, 0x56, 0x3d, 0xc1, 0x1d, 0x7a, 0xc6, 0x4d, 0xa8, 0xa0, 0x0b, 0xe4, 0xf2, 0xd1, 0xa2,
0x18, 0x5d, 0xe6, 0xe0, 0xa1, 0x67, 0xbc, 0x0f, 0xf5, 0x88, 0x51, 0x1c, 0x8c, 0xec, 0x38, 0x42,
0xb4, 0x57, 0xba, 0x53, 0xd8, 0xa8, 0x3f, 0x5c, 0xd9, 0xe4, 0x2a, 0x6f, 0x0e, 0xc5, 0xc0, 0x71,
0x84, 0xa8, 0x05, 0x51, 0xf2, 0x6d, 0xdc, 0x83, 0x8a, 0x87, 0xce, 0xb1, 0x8b, 0xa2, 0x5e, 0xf9,
0x4e, 0x69, 0xa3, 0xfe, 0xb0, 0x21, 0xc9, 0x9f, 0x08, 0xa4, 0xa5, 0x07, 0x8d, 0xfb, 0x50, 0x8d,
0x18, 0xa1, 0xce, 0x08, 0x45, 0xbd, 0x25, 0x41, 0xd8, 0xd4, 0x7c, 0x05, 0xd6, 0x4a, 0x86, 0x8d,
0xdb, 0x50, 0x7a, 0xba, 0x7b, 0xd8, 0x5b, 0x16, 0xd2, 0x41, 0x51, 0x85, 0xc8, 0xb5, 0x38, 0xda,
0xb8, 0x0b, 0xcd, 0xc8, 0x09, 0xbc, 0x13, 0x72, 0x61, 0x87, 0xd8, 0x0b, 0xa2, 0x5e, 0xe5, 0x4e,
0x61, 0xa3, 0x6a, 0x35, 0x14, 0x72, 0xc0, 0x71, 0xe6, 0xa7, 0x70, 0x63, 0xc8, 0x1c, 0xca, 0xae,
0xe1, 0x1d, 0xf3, 0x18, 0xd6, 0x2c, 0xe4, 0x93, 0xf3, 0x6b, 0xb9, 0xb6, 0x07, 0x15, 0x86, 0x7d,
0x44, 0x62, 0x26, 0x5c, 0xdb, 0xb4, 0x34, 0x68, 0xfe, 0x4f, 0x01, 0x8c, 0xbd, 0x0b, 0xe4, 0x0e,
0x28, 0x71, 0x51, 0x14, 0xfd, 0x85, 0x96, 0xeb, 0x6d, 0xa8, 0x84, 0x52, 0x81, 0x5e, 0x59, 0x90,
0xab, 0x55, 0xd0, 0x5a, 0xe9, 0x51, 0xf3, 0x3b, 0x58, 0x1d, 0xe2, 0x51, 0xe0, 0x4c, 0x5e, 0xa2,
0xbe, 0x6b, 0xb0, 0x1c, 0x09, 0x9e, 0x42, 0xd5, 0xa6, 0xa5, 0x20, 0x73, 0x00, 0xc6, 0xb7, 0x0e,
0x66, 0x2f, 0x4f, 0x92, 0xf9, 0x00, 0xba, 0x39, 0x8e, 0x51, 0x48, 0x82, 0x08, 0x09, 0x05, 0x98,
0xc3, 0xe2, 0x48, 0x30, 0x5b, 0xb2, 0x14, 0x64, 0x12, 0x58, 0x3b, 0x0e, 0xbd, 0x6b, 0xee, 0xa6,
0x87, 0x50, 0xa3, 0x28, 0x22, 0x31, 0xe5, 0x7b, 0xa0, 0x28, 0x9c, 0xba, 0x2a, 0x9d, 0xfa, 0x35,
0x0e, 0xe2, 0x0b, 0x4b, 0x8f, 0x59, 0x29, 0x99, 0x8a, 0x4f, 0x16, 0x5d, 0x27, 0x3e, 0x3f, 0x85,
0x1b, 0x03, 0x27, 0x8e, 0xae, 0xa3, 0xab, 0xf9, 0x19, 0x8f, 0xed, 0x28, 0xf6, 0xaf, 0x35, 0xf9,
0xbf, 0x0b, 0x50, 0xdd, 0x0d, 0xe3, 0xe3, 0xc8, 0x19, 0x21, 0xe3, 0x75, 0xa8, 0x33, 0xc2, 0x9c,
0x89, 0x1d, 0x73, 0x50, 0x90, 0x97, 0x2d, 0x10, 0x28, 0x49, 0xf0, 0x06, 0x34, 0x42, 0x44, 0xdd,
0x30, 0x56, 0x14, 0xc5, 0x3b, 0xa5, 0x8d, 0xb2, 0x55, 0x97, 0x38, 0x49, 0xb2, 0x09, 0x5d, 0x31,
0x66, 0xe3, 0xc0, 0x3e, 0x43, 0x34, 0x40, 0x13, 0x9f, 0x78, 0x48, 0x04, 0x47, 0xd9, 0xea, 0x88,
0xa1, 0xc3, 0xe0, 0xab, 0x64, 0xc0, 0x78, 0x07, 0x3a, 0x09, 0x3d, 0x8f, 0x78, 0x41, 0x5d, 0x16,
0xd4, 0x6d, 0x45, 0x7d, 0xac, 0xd0, 0xe6, 0xbf, 0x42, 0xeb, 0xd9, 0x98, 0x12, 0xc6, 0x26, 0x38,
0x18, 0x3d, 0x71, 0x98, 0xc3, 0xb7, 0x66, 0x88, 0x28, 0x26, 0x5e, 0xa4, 0xb4, 0xd5, 0xa0, 0xf1,
0x2e, 0x74, 0x98, 0xa4, 0x45, 0x9e, 0xad, 0x69, 0x8a, 0x82, 0x66, 0x25, 0x19, 0x18, 0x28, 0xe2,
0xb7, 0xa0, 0x95, 0x12, 0xf3, 0xcd, 0xad, 0xf4, 0x6d, 0x26, 0xd8, 0x67, 0xd8, 0x47, 0xe6, 0xb9,
0xf0, 0x95, 0x58, 0x64, 0xe3, 0x5d, 0xa8, 0xa5, 0x7e, 0x28, 0x88, 0x08, 0x69, 0xc9, 0x08, 0xd1,
0xee, 0xb4, 0xaa, 0x89, 0x53, 0x3e, 0x87, 0x36, 0x4b, 0x14, 0xb7, 0x3d, 0x87, 0x39, 0xf9, 0xa0,
0xca, 0x5b, 0x65, 0xb5, 0x58, 0x0e, 0x36, 0x3f, 0x83, 0xda, 0x00, 0x7b, 0x91, 0x14, 0xdc, 0x83,
0x8a, 0x1b, 0x53, 0x8a, 0x02, 0xa6, 0x4d, 0x56, 0xa0, 0xb1, 0x0a, 0x4b, 0x13, 0xec, 0x63, 0xa6,
0xcc, 0x94, 0x80, 0x49, 0x00, 0x8e, 0x90, 0x4f, 0xe8, 0xa5, 0x70, 0xd8, 0x2a, 0x2c, 0x65, 0x17,
0x57, 0x02, 0xc6, 0xab, 0x50, 0xf3, 0x9d, 0x8b, 0x64, 0x51, 0xf9, 0x48, 0xd5, 0x77, 0x2e, 0xa4,
0xf2, 0x3d, 0xa8, 0x9c, 0x3a, 0x78, 0xe2, 0x06, 0x4c, 0x79, 0x45, 0x83, 0xa9, 0xc0, 0x72, 0x56,
0xe0, 0xff, 0x15, 0xa1, 0x2e, 0x25, 0x4a, 0x85, 0x57, 0x61, 0xc9, 0x75, 0xdc, 0x71, 0x22, 0x52,
0x00, 0xc6, 0x3d, 0xad, 0x48, 0x31, 0x9b, 0xe1, 0x52, 0x4d, 0xb5, 0x6a, 0x5b, 0x00, 0xd1, 0x73,
0x27, 0x54, 0xba, 0x95, 0x16, 0x10, 0xd7, 0x38, 0x8d, 0x54, 0xf7, 0x03, 0x68, 0xc8, 0xb8, 0x53,
0x53, 0xca, 0x0b, 0xa6, 0xd4, 0x25, 0x95, 0x9c, 0x74, 0x17, 0x9a, 0x71, 0x84, 0xec, 0x31, 0x46,
0xd4, 0xa1, 0xee, 0xf8, 0xb2, 0xb7, 0x24, 0x0f, 0xa0, 0x38, 0x42, 0x07, 0x1a, 0x67, 0x3c, 0x84,
0x25, 0x9e, 0x5b, 0xa2, 0xde, 0xb2, 0x38, 0xeb, 0x6e, 0x67, 0x59, 0x0a, 0x53, 0x37, 0xc5, 0xef,
0x5e, 0xc0, 0xe8, 0xa5, 0x25, 0x49, 0xfb, 0x1f, 0x03, 0xa4, 0x48, 0x63, 0x05, 0x4a, 0x67, 0xe8,
0x52, 0xed, 0x43, 0xfe, 0xc9, 0x9d, 0x73, 0xee, 0x4c, 0x62, 0xed, 0x75, 0x09, 0x7c, 0x5a, 0xfc,
0xb8, 0x60, 0xba, 0xd0, 0xde, 0x99, 0x9c, 0x61, 0x92, 0x99, 0xbe, 0x0a, 0x4b, 0xbe, 0xf3, 0x1d,
0xa1, 0xda, 0x93, 0x02, 0x10, 0x58, 0x1c, 0x10, 0xaa, 0x59, 0x08, 0xc0, 0x68, 0x41, 0x91, 0x84,
0xc2, 0x5f, 0x35, 0xab, 0x48, 0xc2, 0x54, 0x50, 0x39, 0x23, 0xc8, 0xfc, 0x7d, 0x19, 0x20, 0x95,
0x62, 0x58, 0xd0, 0xc7, 0xc4, 0x8e, 0x10, 0xe5, 0xe7, 0xbb, 0x7d, 0x72, 0xc9, 0x50, 0x64, 0x53,
0xe4, 0xc6, 0x34, 0xc2, 0xe7, 0x7c, 0xfd, 0xb8, 0xd9, 0x37, 0xa4, 0xd9, 0x53, 0xba, 0x59, 0x37,
0x31, 0x19, 0xca, 0x79, 0x3b, 0x7c, 0x9a, 0xa5, 0x67, 0x19, 0x87, 0x70, 0x23, 0xe5, 0xe9, 0x65,
0xd8, 0x15, 0xaf, 0x62, 0xd7, 0x4d, 0xd8, 0x79, 0x29, 0xab, 0x3d, 0xe8, 0x62, 0x62, 0x7f, 0x1f,
0xa3, 0x38, 0xc7, 0xa8, 0x74, 0x15, 0xa3, 0x0e, 0x26, 0x7f, 0x2b, 0x26, 0xa4, 0x6c, 0x06, 0x70,
0x2b, 0x63, 0x25, 0xdf, 0xee, 0x19, 0x66, 0xe5, 0xab, 0x98, 0xad, 0x25, 0x5a, 0xf1, 0x7c, 0x90,
0x72, 0xfc, 0x12, 0xd6, 0x30, 0xb1, 0x9f, 0x3b, 0x98, 0x4d, 0xb3, 0x5b, 0xfa, 0x05, 0x23, 0xf9,
0x89, 0x96, 0xe7, 0x25, 0x8d, 0xf4, 0x11, 0x1d, 0xe5, 0x8c, 0x5c, 0xfe, 0x05, 0x23, 0x8f, 0xc4,
0x84, 0x94, 0xcd, 0x36, 0x74, 0x30, 0x99, 0xd6, 0xa6, 0x72, 0x15, 0x93, 0x36, 0x26, 0x79, 0x4d,
0x76, 0xa0, 0x13, 0x21, 0x97, 0x11, 0x9a, 0x0d, 0x82, 0xea, 0x55, 0x2c, 0x56, 0x14, 0x7d, 0xc2,
0xc3, 0xfc, 0x47, 0x68, 0x1c, 0xc4, 0x23, 0xc4, 0x26, 0x27, 0x49, 0x32, 0x78, 0x69, 0xf9, 0xc7,
0xfc, 0x63, 0x11, 0xea, 0xbb, 0x23, 0x4a, 0xe2, 0x30, 0x97, 0x93, 0xe5, 0x26, 0x9d, 0xce, 0xc9,
0x82, 0x44, 0xe4, 0x64, 0x49, 0xfc, 0x21, 0x34, 0x7c, 0xb1, 0x75, 0x15, 0xbd, 0xcc, 0x43, 0x9d,
0x99, 0x4d, 0x6d, 0xd5, 0xfd, 0x4c, 0x32, 0xdb, 0x04, 0x08, 0xb1, 0x17, 0xa9, 0x39, 0x32, 0x1d,
0xb5, 0x55, 0xb9, 0xa5, 0x53, 0xb4, 0x55, 0x0b, 0x93, 0x6c, 0xfd, 0x3e, 0xd4, 0x4f, 0xb8, 0x93,
0xd4, 0x84, 0x5c, 0x32, 0x4a, 0xbd, 0x67, 0xc1, 0x49, 0xba, 0x09, 0x0f, 0xa0, 0x39, 0x96, 0x2e,
0x53, 0x93, 0x64, 0x0c, 0xdd, 0x55, 0x96, 0xa4, 0xf6, 0x6e, 0x66, 0x3d, 0x2b, 0x17, 0xa0, 0x31,
0xce, 0xa0, 0xfa, 0x43, 0xe8, 0xcc, 0x90, 0xcc, 0xc9, 0x41, 0x1b, 0xd9, 0x1c, 0x54, 0x7f, 0x68,
0x48, 0x41, 0xd9, 0x99, 0xd9, 0xbc, 0xf4, 0x9f, 0x45, 0x68, 0x7c, 0x83, 0xd8, 0x73, 0x42, 0xcf,
0xa4, 0xbe, 0x06, 0x94, 0x03, 0xc7, 0x47, 0x8a, 0xa3, 0xf8, 0x36, 0x6e, 0x41, 0x95, 0x5e, 0xc8,
0x04, 0xa2, 0xd6, 0xb3, 0x42, 0x2f, 0x44, 0x62, 0x30, 0x5e, 0x03, 0xa0, 0x17, 0x76, 0xe8, 0xb8,
0x67, 0x48, 0x79, 0xb0, 0x6c, 0xd5, 0xe8, 0xc5, 0x40, 0x22, 0x78, 0x28, 0xd0, 0x0b, 0x1b, 0x51,
0x4a, 0x68, 0xa4, 0x72, 0x55, 0x95, 0x5e, 0xec, 0x09, 0x58, 0xcd, 0xf5, 0x28, 0x09, 0x43, 0xe4,
0x89, 0x1c, 0x2d, 0xe6, 0x3e, 0x91, 0x08, 0x2e, 0x95, 0x69, 0xa9, 0xcb, 0x52, 0x2a, 0x4b, 0xa5,
0xb2, 0x54, 0x6a, 0x45, 0xce, 0x64, 0x59, 0xa9, 0x2c, 0x91, 0x5a, 0x95, 0x52, 0x59, 0x46, 0x2a,
0x4b, 0xa5, 0xd6, 0xf4, 0x5c, 0x25, 0xd5, 0xfc, 0x8f, 0x02, 0xac, 0x4d, 0x17, 0x7e, 0xaa, 0x36,
0xfd, 0x10, 0x1a, 0xae, 0x58, 0xaf, 0x5c, 0x4c, 0x76, 0x66, 0x56, 0xd2, 0xaa, 0xbb, 0x99, 0x30,
0x7e, 0x04, 0xcd, 0x40, 0x3a, 0x38, 0x09, 0xcd, 0x52, 0xba, 0x2e, 0x59, 0xdf, 0x5b, 0x8d, 0x20,
0x03, 0x99, 0x1e, 0x18, 0xdf, 0x52, 0xcc, 0xd0, 0x90, 0x51, 0xe4, 0xf8, 0x2f, 0xa3, 0xba, 0x37,
0xa0, 0x2c, 0xaa, 0x15, 0xbe, 0x4c, 0x0d, 0x4b, 0x7c, 0x9b, 0x6f, 0x43, 0x37, 0x27, 0x45, 0xd9,
0xba, 0x02, 0xa5, 0x09, 0x0a, 0x04, 0xf7, 0xa6, 0xc5, 0x3f, 0x4d, 0x07, 0x3a, 0x16, 0x72, 0xbc,
0x97, 0xa7, 0x8d, 0x12, 0x51, 0x4a, 0x45, 0x6c, 0x80, 0x91, 0x15, 0xa1, 0x54, 0xd1, 0x5a, 0x17,
0x32, 0x5a, 0x3f, 0x85, 0xce, 0xee, 0x84, 0x44, 0x68, 0xc8, 0x3c, 0x1c, 0xbc, 0x8c, 0x76, 0xe4,
0x5f, 0xa0, 0xfb, 0x8c, 0x5d, 0x7e, 0xcb, 0x99, 0x45, 0xf8, 0x07, 0xf4, 0x92, 0xec, 0xa3, 0xe4,
0xb9, 0xb6, 0x8f, 0x92, 0xe7, 0xbc, 0xb9, 0x71, 0xc9, 0x24, 0xf6, 0x03, 0xb1, 0x15, 0x9a, 0x96,
0x82, 0xcc, 0x1d, 0x68, 0xc8, 0x1a, 0xfa, 0x88, 0x78, 0xf1, 0x04, 0xcd, 0xdd, 0x83, 0xeb, 0x00,
0xa1, 0x43, 0x1d, 0x1f, 0x31, 0x44, 0x65, 0x0c, 0xd5, 0xac, 0x0c, 0xc6, 0xfc, 0xaf, 0x22, 0xac,
0xca, 0xfb, 0x86, 0xa1, 0x6c, 0xb3, 0xb5, 0x09, 0x7d, 0xa8, 0x8e, 0x49, 0xc4, 0x32, 0x0c, 0x13,
0x98, 0xab, 0xc8, 0xfb, 0x73, 0xc9, 0x8d, 0x7f, 0xe6, 0x2e, 0x01, 0x4a, 0x57, 0x5f, 0x02, 0xcc,
0xb4, 0xf9, 0xe5, 0xd9, 0x36, 0x9f, 0xef, 0x36, 0x4d, 0x84, 0xe5, 0x1e, 0xaf, 0x59, 0x35, 0x85,
0x39, 0xf4, 0x8c, 0x7b, 0xd0, 0x1e, 0x71, 0x2d, 0xed, 0x31, 0x21, 0x67, 0x76, 0xe8, 0xb0, 0xb1,
0xd8, 0xea, 0x35, 0xab, 0x29, 0xd0, 0x07, 0x84, 0x9c, 0x0d, 0x1c, 0x36, 0x36, 0x3e, 0x81, 0x96,
0x2a, 0x03, 0x7d, 0xe1, 0xa2, 0x48, 0x1d, 0x7e, 0x6a, 0x17, 0x65, 0xbd, 0x67, 0x35, 0xcf, 0x32,
0x50, 0x64, 0xde, 0x84, 0x1b, 0x4f, 0x50, 0xc4, 0x28, 0xb9, 0xcc, 0x3b, 0xc6, 0xfc, 0x6b, 0x80,
0xc3, 0x80, 0x21, 0x7a, 0xea, 0xb8, 0x28, 0x32, 0xde, 0xcb, 0x42, 0xaa, 0x38, 0x5a, 0xd9, 0x94,
0xd7, 0x3d, 0xc9, 0x80, 0x95, 0xa1, 0x31, 0x37, 0x61, 0xd9, 0x22, 0x31, 0x4f, 0x47, 0x6f, 0xea,
0x2f, 0x35, 0xaf, 0xa1, 0xe6, 0x09, 0xa4, 0xa5, 0xc6, 0xcc, 0x03, 0xdd, 0xc2, 0xa6, 0xec, 0xd4,
0x12, 0x6d, 0x42, 0x0d, 0x6b, 0x9c, 0xca, 0x2a, 0xb3, 0xa2, 0x53, 0x12, 0xf3, 0x33, 0xe8, 0x4a,
0x4e, 0x92, 0xb3, 0x66, 0xf3, 0x26, 0x2c, 0x53, 0xad, 0x46, 0x21, 0xbd, 0xe7, 0x51, 0x44, 0x6a,
0xcc, 0x3c, 0x84, 0xdb, 0x72, 0xf2, 0x5e, 0x38, 0x46, 0x3e, 0xa2, 0xce, 0xe4, 0x88, 0xc4, 0x01,
0x4b, 0xb8, 0x64, 0x23, 0xa0, 0x70, 0x65, 0x04, 0x70, 0xd7, 0x7e, 0x8d, 0x23, 0x96, 0xfa, 0x44,
0xbb, 0xb6, 0x0b, 0x1d, 0x3e, 0x90, 0x53, 0xcf, 0xfc, 0x02, 0x1a, 0xdb, 0xd6, 0xe0, 0x1b, 0x84,
0x47, 0xe3, 0x13, 0x9e, 0x88, 0x3f, 0xca, 0xc3, 0x4a, 0x98, 0xa1, 0x0c, 0xcf, 0x0c, 0x59, 0x39,
0x3a, 0xf3, 0x4b, 0x58, 0xdb, 0xf6, 0xbc, 0x2c, 0x4a, 0xab, 0xfe, 0x1e, 0xd4, 0x82, 0x0c, 0xbb,
0xcc, 0xf1, 0x97, 0xa3, 0x4e, 0x89, 0xcc, 0x07, 0x60, 0xec, 0x23, 0x76, 0x38, 0x78, 0xe6, 0x9c,
0x4c, 0x52, 0x47, 0xde, 0x84, 0x0a, 0x8e, 0x6c, 0x1c, 0x9e, 0x7f, 0x24, 0xb8, 0x54, 0xad, 0x65,
0x1c, 0x1d, 0x86, 0xe7, 0x1f, 0x99, 0xf7, 0xa1, 0x9b, 0x23, 0xbf, 0x22, 0x43, 0x6d, 0x83, 0x31,
0xfc, 0xf5, 0x9c, 0x13, 0x16, 0xc5, 0x0c, 0x8b, 0xfb, 0xd0, 0x1d, 0xfe, 0x4a, 0x69, 0xff, 0x04,
0xdd, 0xa7, 0xc1, 0x04, 0x07, 0x68, 0x77, 0x70, 0x7c, 0x84, 0x92, 0xf4, 0x6c, 0x40, 0x99, 0x97,
0xb1, 0x4a, 0x96, 0xf8, 0xe6, 0x2a, 0x04, 0x27, 0xb6, 0x1b, 0xc6, 0x91, 0xba, 0xff, 0x5a, 0x0e,
0x4e, 0x76, 0xc3, 0x38, 0xe2, 0xe7, 0x2d, 0xaf, 0xb7, 0x48, 0x30, 0xb9, 0x14, 0x49, 0xab, 0x6a,
0x55, 0xdc, 0x30, 0x7e, 0x1a, 0x4c, 0x2e, 0xcd, 0xbf, 0x12, 0x97, 0x12, 0x08, 0x79, 0x96, 0x13,
0x78, 0xc4, 0x7f, 0x82, 0xce, 0x33, 0x12, 0x66, 0xf4, 0xfe, 0xa9, 0x00, 0x8d, 0xed, 0x11, 0x0a,
0xd8, 0x13, 0xc4, 0x1c, 0x3c, 0x11, 0x4d, 0xee, 0x39, 0xa2, 0x11, 0x26, 0x81, 0xca, 0x40, 0x1a,
0x34, 0x5e, 0x87, 0x3a, 0x0e, 0x30, 0xb3, 0x3d, 0x07, 0xf9, 0x24, 0x10, 0x5c, 0xaa, 0x16, 0x70,
0xd4, 0x13, 0x81, 0x31, 0xde, 0x86, 0xb6, 0xbc, 0x9f, 0xb4, 0xc7, 0x4e, 0xe0, 0x4d, 0x78, 0xee,
0x2b, 0x89, 0x6c, 0xd5, 0x92, 0xe8, 0x03, 0x85, 0x35, 0xee, 0xc3, 0x8a, 0x8a, 0xcb, 0x94, 0xb2,
0x2c, 0x28, 0xdb, 0x0a, 0x9f, 0x23, 0x8d, 0xc3, 0x90, 0x50, 0x16, 0xd9, 0x11, 0x72, 0x5d, 0xe2,
0x87, 0xaa, 0x43, 0x6c, 0x6b, 0xfc, 0x50, 0xa2, 0xcd, 0x11, 0x74, 0xf7, 0xb9, 0x9d, 0xca, 0x92,
0x74, 0xa7, 0xb5, 0x7c, 0xe4, 0xdb, 0x27, 0x13, 0xe2, 0x9e, 0xd9, 0xfc, 0xbc, 0x50, 0x1e, 0xe6,
0x35, 0xe8, 0x0e, 0x47, 0x0e, 0xf1, 0x0f, 0xe2, 0x32, 0x84, 0x53, 0x8d, 0x09, 0x0b, 0x27, 0xf1,
0xc8, 0x0e, 0x29, 0x39, 0x41, 0xca, 0xc4, 0xb6, 0x8f, 0xfc, 0x03, 0x89, 0x1f, 0x70, 0xb4, 0xf9,
0xbf, 0x05, 0x58, 0xcd, 0x4b, 0x52, 0xab, 0xbd, 0x05, 0xab, 0x79, 0x51, 0xaa, 0x22, 0x92, 0x15,
0x77, 0x27, 0x2b, 0x50, 0xd6, 0x46, 0x8f, 0xa0, 0x29, 0x6e, 0xb3, 0x6d, 0x4f, 0x72, 0xca, 0xd7,
0x81, 0xd9, 0x75, 0xb1, 0x1a, 0x4e, 0x76, 0x95, 0x3e, 0x81, 0x5b, 0xca, 0x7c, 0x7b, 0x56, 0x6d,
0x19, 0x10, 0x6b, 0x8a, 0xe0, 0x68, 0x4a, 0xfb, 0xaf, 0xa1, 0x97, 0xa2, 0x76, 0x2e, 0x05, 0x32,
0xdd, 0x94, 0xdd, 0x29, 0x63, 0xb7, 0x3d, 0x8f, 0x8a, 0xdd, 0x5e, 0xb6, 0xe6, 0x0d, 0x99, 0x8f,
0xe1, 0xe6, 0x10, 0x31, 0xe9, 0x0d, 0x87, 0xa9, 0xe6, 0x4c, 0x32, 0x5b, 0x81, 0xd2, 0x10, 0xb9,
0xc2, 0xf8, 0x92, 0xc5, 0x3f, 0x79, 0x00, 0x1e, 0x47, 0xc8, 0x15, 0x56, 0x96, 0x2c, 0xf1, 0x6d,
0x86, 0x50, 0xf9, 0x62, 0xb8, 0xcf, 0x4b, 0x30, 0x1e, 0xd4, 0xb2, 0x64, 0x53, 0xc7, 0x73, 0xd3,
0xaa, 0x08, 0xf8, 0xd0, 0x33, 0xbe, 0x84, 0xae, 0x1c, 0x72, 0xc7, 0x4e, 0x30, 0x42, 0x76, 0x48,
0x26, 0xd8, 0x95, 0xa1, 0xdf, 0x7a, 0xd8, 0x57, 0x69, 0x48, 0xf1, 0xd9, 0x15, 0x24, 0x03, 0x41,
0x61, 0x75, 0x46, 0xd3, 0x28, 0xf3, 0x77, 0x05, 0xa8, 0xa8, 0xfc, 0xc8, 0x4f, 0x79, 0x8f, 0xe2,
0x73, 0x44, 0x55, 0xb0, 0x2b, 0xc8, 0x78, 0x0b, 0x5a, 0xf2, 0xcb, 0x26, 0x21, 0xc3, 0x24, 0x39,
0x77, 0x9b, 0x12, 0xfb, 0x54, 0x22, 0xc5, 0x0d, 0xa8, 0xb8, 0x83, 0x54, 0xed, 0xbe, 0x82, 0x38,
0xfe, 0x34, 0xe2, 0x4a, 0x89, 0x73, 0xb6, 0x66, 0x29, 0x88, 0x6f, 0x2e, 0xcd, 0x6f, 0x49, 0xf0,
0xd3, 0x20, 0xdf, 0x5c, 0x3e, 0x4f, 0xed, 0x76, 0x48, 0x70, 0xc0, 0xd4, 0xc1, 0x0a, 0x02, 0x35,
0xe0, 0x18, 0x63, 0x03, 0xaa, 0xa7, 0x91, 0x2d, 0xac, 0x11, 0x45, 0x74, 0x92, 0xea, 0x95, 0xd5,
0x56, 0xe5, 0x34, 0x12, 0x1f, 0xe6, 0xbf, 0x17, 0x60, 0x59, 0xbe, 0x17, 0x18, 0x2d, 0x28, 0x26,
0x85, 0x50, 0x11, 0x8b, 0xa2, 0x52, 0x68, 0x25, 0x8b, 0x1f, 0xf1, 0xcd, 0x73, 0xcc, 0xb9, 0x2f,
0x8f, 0x73, 0x65, 0xc4, 0xb9, 0x2f, 0xce, 0xf1, 0xb7, 0xa0, 0x95, 0xd6, 0x53, 0x62, 0x5c, 0x1a,
0xd3, 0x4c, 0xb0, 0x82, 0x6c, 0xa1, 0x4d, 0xe6, 0xdf, 0x03, 0xa4, 0xf7, 0xe6, 0x3c, 0x1c, 0xe2,
0x44, 0x19, 0xfe, 0xc9, 0x31, 0xa3, 0xa4, 0x12, 0xe3, 0x9f, 0xc6, 0x3d, 0x68, 0x39, 0x9e, 0x87,
0xf9, 0x74, 0x67, 0xb2, 0x8f, 0xbd, 0x24, 0x81, 0xe4, 0xb1, 0xe6, 0xff, 0x17, 0xa0, 0xbd, 0x4b,
0xc2, 0xcb, 0x2f, 0xf0, 0x04, 0x65, 0xb2, 0x9b, 0x50, 0x52, 0x15, 0x62, 0xfc, 0x9b, 0x37, 0x17,
0xa7, 0x78, 0x82, 0xe4, 0xb6, 0x97, 0x51, 0x57, 0xe5, 0x08, 0xb1, 0xe5, 0xf5, 0x60, 0x72, 0x4b,
0xda, 0x94, 0x83, 0x47, 0xc4, 0x13, 0x6d, 0x94, 0x87, 0xa9, 0x9d, 0xdc, 0x89, 0x36, 0xad, 0x8a,
0x87, 0xa9, 0x18, 0x52, 0x86, 0x2c, 0x89, 0x3b, 0xef, 0xac, 0x21, 0xcb, 0x12, 0xc3, 0x0d, 0x59,
0x83, 0x65, 0x72, 0x7a, 0x1a, 0x21, 0x26, 0xd6, 0xaa, 0x64, 0x29, 0x28, 0x49, 0xc1, 0xd5, 0x4c,
0x0a, 0x5e, 0x15, 0xe7, 0xda, 0xd3, 0xa7, 0x47, 0x7b, 0xe7, 0x28, 0x60, 0xfa, 0x04, 0x7e, 0x00,
0x55, 0x8d, 0xfa, 0x35, 0xb7, 0xc9, 0xef, 0x40, 0x6b, 0xdb, 0xf3, 0x86, 0xcf, 0x9d, 0x50, 0xfb,
0xa3, 0x07, 0x95, 0xc1, 0xee, 0xe1, 0x40, 0xba, 0xa4, 0xc4, 0x0d, 0x50, 0x20, 0x3f, 0xf1, 0xf7,
0x11, 0x3b, 0x42, 0x8c, 0x62, 0x37, 0x39, 0xf1, 0xef, 0x42, 0x45, 0x61, 0xf8, 0x4c, 0x5f, 0x7e,
0xea, 0x23, 0x40, 0x81, 0xe6, 0xdf, 0x80, 0xf1, 0x77, 0xbc, 0x0c, 0x46, 0xb2, 0x07, 0x52, 0x92,
0xde, 0x81, 0xce, 0xb9, 0xc0, 0xda, 0xb2, 0x3e, 0xcc, 0x2c, 0x43, 0x5b, 0x0e, 0x88, 0xfc, 0x20,
0x64, 0x1f, 0x43, 0x57, 0x56, 0xed, 0x92, 0xcf, 0x35, 0x58, 0x70, 0x1f, 0x26, 0xeb, 0x59, 0xb6,
0xc4, 0xf7, 0xc3, 0x1f, 0xbb, 0xea, 0x18, 0x53, 0x97, 0x44, 0xc6, 0x3e, 0xb4, 0xa7, 0x5e, 0xf4,
0x0c, 0x75, 0x6b, 0x38, 0xff, 0xa1, 0xaf, 0xbf, 0xb6, 0x29, 0x5f, 0x08, 0x37, 0xf5, 0x0b, 0xe1,
0xe6, 0x9e, 0x1f, 0xb2, 0x4b, 0x63, 0x0f, 0x5a, 0xf9, 0xb7, 0x2f, 0xe3, 0x55, 0x5d, 0x62, 0xcd,
0x79, 0x11, 0x5b, 0xc8, 0x66, 0x1f, 0xda, 0x53, 0xcf, 0x60, 0x5a, 0x9f, 0xf9, 0xaf, 0x63, 0x0b,
0x19, 0x3d, 0x86, 0x7a, 0xe6, 0xdd, 0xcb, 0xe8, 0x49, 0x26, 0xb3, 0x4f, 0x61, 0x0b, 0x19, 0xec,
0x42, 0x33, 0xf7, 0x14, 0x65, 0xf4, 0x95, 0x3d, 0x73, 0xde, 0xa7, 0x16, 0x32, 0xd9, 0x81, 0x7a,
0xe6, 0x45, 0x48, 0x6b, 0x31, 0xfb, 0xec, 0xd4, 0xbf, 0x35, 0x67, 0x44, 0x9d, 0x96, 0xfb, 0xd0,
0x9e, 0x7a, 0x26, 0xd2, 0x2e, 0x99, 0xff, 0x7a, 0xb4, 0x50, 0x99, 0x21, 0xdc, 0x98, 0x5b, 0x25,
0x1b, 0x66, 0x96, 0xdd, 0xfc, 0x12, 0x7a, 0x21, 0xd3, 0xaf, 0xc4, 0xba, 0x67, 0xae, 0x16, 0x32,
0xeb, 0x3e, 0xfb, 0xd2, 0xd4, 0xbf, 0x3d, 0x7f, 0x50, 0x99, 0xba, 0x07, 0xad, 0xfc, 0x23, 0x93,
0x66, 0x36, 0xf7, 0xe9, 0xe9, 0xea, 0x20, 0xca, 0xbd, 0x37, 0xa5, 0x41, 0x34, 0xef, 0x19, 0x6a,
0x21, 0xa3, 0x6d, 0x00, 0x75, 0x91, 0xe0, 0xe1, 0x20, 0x59, 0xbd, 0x99, 0x0b, 0x8c, 0x64, 0xf5,
0xe6, 0x5c, 0x3a, 0x3c, 0x06, 0x90, 0xfd, 0xbf, 0x47, 0x62, 0x66, 0xdc, 0xd4, 0x6a, 0x4c, 0x5d,
0x3a, 0xf4, 0x7b, 0xb3, 0x03, 0x33, 0x0c, 0x10, 0xa5, 0xd7, 0x61, 0xf0, 0x39, 0x40, 0x7a, 0xaf,
0xa0, 0x19, 0xcc, 0xdc, 0x34, 0x5c, 0xe1, 0x83, 0x46, 0xf6, 0x16, 0xc1, 0x50, 0xb6, 0xce, 0xb9,
0x59, 0xb8, 0x82, 0x45, 0x7b, 0xaa, 0x4b, 0xcc, 0x47, 0xf0, 0x74, 0xf3, 0xd8, 0x9f, 0xe9, 0x14,
0x8d, 0x47, 0xd0, 0xc8, 0xb6, 0x87, 0x5a, 0x8b, 0x39, 0x2d, 0x63, 0x3f, 0xd7, 0x22, 0x1a, 0x8f,
0xa1, 0x95, 0xef, 0xe7, 0x74, 0x48, 0xcd, 0xed, 0xf2, 0xfa, 0xea, 0xe2, 0x33, 0x43, 0xfe, 0x01,
0x40, 0xda, 0xf7, 0x69, 0xf7, 0xcd, 0x74, 0x82, 0x53, 0x52, 0xf7, 0xa1, 0x3d, 0xd5, 0xcf, 0x69,
0x8b, 0xe7, 0xb7, 0x79, 0x57, 0x25, 0x90, 0x4c, 0x77, 0xa6, 0x43, 0x70, 0xb6, 0xbf, 0xd3, 0x21,
0x38, 0xaf, 0x95, 0xdb, 0x81, 0xfa, 0x70, 0x96, 0xc7, 0x70, 0x21, 0x8f, 0x79, 0x0d, 0xda, 0x87,
0x00, 0xe9, 0x59, 0xa8, 0xbd, 0x30, 0x73, 0x3a, 0xf6, 0x9b, 0xfa, 0x72, 0x5a, 0xd2, 0xed, 0x42,
0x33, 0x77, 0x7f, 0xa3, 0x73, 0xe8, 0xbc, 0x4b, 0x9d, 0xab, 0x4e, 0x96, 0xfc, 0x65, 0x87, 0x5e,
0xc1, 0xb9, 0x57, 0x20, 0x57, 0xc5, 0x71, 0xb6, 0x9d, 0xd4, 0x11, 0x34, 0xa7, 0xc5, 0xfc, 0x85,
0xbc, 0x92, 0x6d, 0x19, 0x33, 0x79, 0x65, 0x4e, 0x27, 0xb9, 0x90, 0xd1, 0x01, 0xb4, 0xf7, 0x75,
0x37, 0xa0, 0x3a, 0x15, 0xbd, 0x7e, 0xb3, 0x9d, 0x59, 0xbf, 0x3f, 0x6f, 0x48, 0xad, 0xcb, 0x57,
0xd0, 0x99, 0xe9, 0x52, 0x8c, 0xf5, 0xe4, 0x89, 0x60, 0x6e, 0xfb, 0xb2, 0x50, 0xad, 0x43, 0x58,
0x99, 0x6e, 0x52, 0x8c, 0xd7, 0x92, 0x98, 0x98, 0xd7, 0xbc, 0x2c, 0x64, 0xf5, 0x09, 0x54, 0x75,
0xe1, 0x69, 0xa8, 0xa7, 0x98, 0xa9, 0x42, 0x74, 0xe1, 0xd4, 0x47, 0x22, 0xe4, 0x93, 0xa2, 0x2e,
0x0d, 0xf9, 0xa9, 0xd2, 0xaf, 0xaf, 0x5e, 0x4e, 0x12, 0xca, 0x47, 0x50, 0x51, 0xb5, 0x9d, 0xb1,
0x9a, 0x6c, 0xb6, 0x4c, 0xa9, 0x77, 0x55, 0x84, 0xed, 0x23, 0x96, 0xa9, 0xd8, 0xb4, 0xd0, 0xd9,
0x22, 0x4e, 0xef, 0x91, 0xdc, 0x88, 0x5a, 0x8b, 0x6d, 0x68, 0x64, 0x6b, 0x36, 0xbd, 0xa4, 0x73,
0xea, 0xb8, 0x45, 0x9a, 0xec, 0x5c, 0xfc, 0xf4, 0xf3, 0xfa, 0x2b, 0xbf, 0xfd, 0x79, 0xfd, 0x95,
0x7f, 0x7b, 0xb1, 0x5e, 0xf8, 0xe9, 0xc5, 0x7a, 0xe1, 0x37, 0x2f, 0xd6, 0x0b, 0x7f, 0x78, 0xb1,
0x5e, 0xf8, 0x87, 0x7f, 0xfe, 0x33, 0xff, 0x13, 0x46, 0xe3, 0x80, 0x61, 0x1f, 0x6d, 0x9d, 0x63,
0xca, 0x32, 0x43, 0xe1, 0xd9, 0x48, 0xfe, 0x31, 0x2c, 0xf3, 0x7f, 0x31, 0xae, 0xe5, 0xc9, 0xb2,
0x80, 0x3f, 0xf8, 0x53, 0x00, 0x00, 0x00, 0xff, 0xff, 0xeb, 0xb0, 0x39, 0x1d, 0x7c, 0x26, 0x00,
0x00,
}
func (m *CreateContainerRequest) Marshal() (dAtA []byte, err error) {
@@ -4858,6 +4901,47 @@ func (m *UpdateRoutesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
func (m *UpdateEphemeralMountsRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *UpdateEphemeralMountsRequest) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *UpdateEphemeralMountsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if m.XXX_unrecognized != nil {
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
if len(m.Storages) > 0 {
for iNdEx := len(m.Storages) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.Storages[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintAgent(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
}
}
return len(dAtA) - i, nil
}
func (m *ListInterfacesRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -6901,6 +6985,24 @@ func (m *UpdateRoutesRequest) Size() (n int) {
return n
}
func (m *UpdateEphemeralMountsRequest) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
if len(m.Storages) > 0 {
for _, e := range m.Storages {
l = e.Size()
n += 1 + l + sovAgent(uint64(l))
}
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
return n
}
func (m *ListInterfacesRequest) Size() (n int) {
if m == nil {
return 0
@@ -7664,7 +7766,7 @@ func (this *MemoryStats) String() string {
return "nil"
}
keysForStats := make([]string, 0, len(this.Stats))
for k := range this.Stats {
for k, _ := range this.Stats {
keysForStats = append(keysForStats, k)
}
github_com_gogo_protobuf_sortkeys.Strings(keysForStats)
@@ -7775,7 +7877,7 @@ func (this *CgroupStats) String() string {
return "nil"
}
keysForHugetlbStats := make([]string, 0, len(this.HugetlbStats))
for k := range this.HugetlbStats {
for k, _ := range this.HugetlbStats {
keysForHugetlbStats = append(keysForHugetlbStats, k)
}
github_com_gogo_protobuf_sortkeys.Strings(keysForHugetlbStats)
@@ -8008,6 +8110,22 @@ func (this *UpdateRoutesRequest) String() string {
}, "")
return s
}
func (this *UpdateEphemeralMountsRequest) String() string {
if this == nil {
return "nil"
}
repeatedStringForStorages := "[]*Storage{"
for _, f := range this.Storages {
repeatedStringForStorages += strings.Replace(f.String(), "Storage", "Storage", 1) + ","
}
repeatedStringForStorages += "}"
s := strings.Join([]string{`&UpdateEphemeralMountsRequest{`,
`Storages:` + repeatedStringForStorages + `,`,
`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
`}`,
}, "")
return s
}
func (this *ListInterfacesRequest) String() string {
if this == nil {
return "nil"
@@ -8355,6 +8473,7 @@ type AgentServiceService interface {
SignalProcess(ctx context.Context, req *SignalProcessRequest) (*types.Empty, error)
WaitProcess(ctx context.Context, req *WaitProcessRequest) (*WaitProcessResponse, error)
UpdateContainer(ctx context.Context, req *UpdateContainerRequest) (*types.Empty, error)
UpdateEphemeralMounts(ctx context.Context, req *UpdateEphemeralMountsRequest) (*types.Empty, error)
StatsContainer(ctx context.Context, req *StatsContainerRequest) (*StatsContainerResponse, error)
PauseContainer(ctx context.Context, req *PauseContainerRequest) (*types.Empty, error)
ResumeContainer(ctx context.Context, req *ResumeContainerRequest) (*types.Empty, error)
@@ -8436,6 +8555,13 @@ func RegisterAgentServiceService(srv *github_com_containerd_ttrpc.Server, svc Ag
}
return svc.UpdateContainer(ctx, &req)
},
"UpdateEphemeralMounts": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) {
var req UpdateEphemeralMountsRequest
if err := unmarshal(&req); err != nil {
return nil, err
}
return svc.UpdateEphemeralMounts(ctx, &req)
},
"StatsContainer": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) {
var req StatsContainerRequest
if err := unmarshal(&req); err != nil {
@@ -8701,6 +8827,14 @@ func (c *agentServiceClient) UpdateContainer(ctx context.Context, req *UpdateCon
return &resp, nil
}
func (c *agentServiceClient) UpdateEphemeralMounts(ctx context.Context, req *UpdateEphemeralMountsRequest) (*types.Empty, error) {
var resp types.Empty
if err := c.client.Call(ctx, "grpc.AgentService", "UpdateEphemeralMounts", req, &resp); err != nil {
return nil, err
}
return &resp, nil
}
func (c *agentServiceClient) StatsContainer(ctx context.Context, req *StatsContainerRequest) (*StatsContainerResponse, error) {
var resp StatsContainerResponse
if err := c.client.Call(ctx, "grpc.AgentService", "StatsContainer", req, &resp); err != nil {
@@ -13934,6 +14068,91 @@ func (m *UpdateRoutesRequest) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *UpdateEphemeralMountsRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowAgent
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: UpdateEphemeralMountsRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: UpdateEphemeralMountsRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Storages", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowAgent
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthAgent
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthAgent
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Storages = append(m.Storages, &Storage{})
if err := m.Storages[len(m.Storages)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipAgent(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthAgent
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *ListInterfacesRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0

View File

@@ -423,7 +423,13 @@ type Hooks struct {
// Poststart is a list of hooks to be run after the container process is started.
Poststart []Hook `protobuf:"bytes,2,rep,name=Poststart,proto3" json:"Poststart"`
// Poststop is a list of hooks to be run after the container process exits.
Poststop []Hook `protobuf:"bytes,3,rep,name=Poststop,proto3" json:"Poststop"`
Poststop []Hook `protobuf:"bytes,3,rep,name=Poststop,proto3" json:"Poststop"`
// Createruntime is a list of hooks to be run during the creation of runtime(sandbox).
CreateRuntime []Hook `protobuf:"bytes,4,rep,name=CreateRuntime,proto3" json:"CreateRuntime"`
// CreateContainer is a list of hooks to be run after VM is started, and before container is created.
CreateContainer []Hook `protobuf:"bytes,5,rep,name=CreateContainer,proto3" json:"CreateContainer"`
// StartContainer is a list of hooks to be run after container is created, but before it is started.
StartContainer []Hook `protobuf:"bytes,6,rep,name=StartContainer,proto3" json:"StartContainer"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@@ -1390,6 +1396,7 @@ type LinuxSyscall struct {
Names []string `protobuf:"bytes,1,rep,name=Names,proto3" json:"Names,omitempty"`
Action string `protobuf:"bytes,2,opt,name=Action,proto3" json:"Action,omitempty"`
// Types that are valid to be assigned to ErrnoRet:
//
// *LinuxSyscall_Errnoret
ErrnoRet isLinuxSyscall_ErrnoRet `protobuf_oneof:"ErrnoRet"`
Args []LinuxSeccompArg `protobuf:"bytes,4,rep,name=Args,proto3" json:"Args"`
@@ -1546,140 +1553,143 @@ func init() {
}
var fileDescriptor_82a9ef0098ca0b24 = []byte{
// 2121 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xcb, 0x73, 0x5b, 0x49,
0xd5, 0xcf, 0x95, 0x64, 0x59, 0x6a, 0xc5, 0x79, 0xf4, 0x64, 0x32, 0xf7, 0xcb, 0x97, 0xd2, 0x78,
0x2e, 0x29, 0x30, 0x10, 0xac, 0x22, 0xe1, 0x31, 0x0c, 0x8f, 0x2a, 0xd9, 0x4e, 0x62, 0xd5, 0xc4,
0xb1, 0x68, 0xd9, 0x13, 0x98, 0xc5, 0x54, 0xb5, 0xaf, 0xda, 0x52, 0x8f, 0xaf, 0x6e, 0xdf, 0xea,
0xdb, 0xb2, 0x63, 0x56, 0xb0, 0x63, 0xcf, 0x82, 0x35, 0x1b, 0x1e, 0xff, 0x01, 0xc5, 0x8a, 0x1d,
0x29, 0x56, 0x2c, 0xa9, 0xa2, 0x0a, 0x88, 0xf7, 0xec, 0x59, 0x52, 0xa7, 0xfb, 0xdc, 0xab, 0x96,
0xe4, 0xc0, 0x04, 0x56, 0xea, 0xf3, 0x3b, 0x8f, 0x7e, 0x9c, 0xe7, 0x15, 0x79, 0x36, 0x92, 0x66,
0x3c, 0x3d, 0xda, 0x8c, 0xd5, 0xa4, 0x73, 0xc2, 0x0d, 0xff, 0x4a, 0xac, 0x52, 0xc3, 0x65, 0x2a,
0x74, 0xbe, 0x44, 0xe7, 0x3a, 0xee, 0x24, 0xf2, 0x28, 0xef, 0x64, 0x5a, 0x19, 0x15, 0xab, 0x04,
0x57, 0x79, 0x47, 0xc5, 0x72, 0xd3, 0x2e, 0x69, 0x6d, 0xa4, 0xb3, 0xf8, 0x4e, 0x34, 0x52, 0x23,
0xe5, 0x98, 0x47, 0xd3, 0xe3, 0x0e, 0x50, 0x96, 0xb0, 0x2b, 0x27, 0x19, 0xfd, 0xa1, 0x4a, 0x6a,
0x83, 0x4c, 0xc4, 0x34, 0x24, 0xab, 0x1f, 0x09, 0x9d, 0x4b, 0x95, 0x86, 0xc1, 0x7a, 0xb0, 0xd1,
0x64, 0x05, 0x49, 0xbf, 0x40, 0x56, 0xfb, 0x5a, 0xc5, 0x22, 0xcf, 0xc3, 0xca, 0x7a, 0xb0, 0xd1,
0x7a, 0xb0, 0xb6, 0x09, 0xe6, 0x37, 0x11, 0x64, 0x05, 0x97, 0xb6, 0x49, 0x8d, 0x29, 0x65, 0xc2,
0xaa, 0x95, 0x22, 0x4e, 0x0a, 0x10, 0x66, 0x71, 0x7a, 0x87, 0x34, 0x76, 0x55, 0x6e, 0x52, 0x3e,
0x11, 0x61, 0xcd, 0xee, 0x51, 0xd2, 0xf4, 0x8b, 0xa4, 0xbe, 0xa7, 0xa6, 0xa9, 0xc9, 0xc3, 0x95,
0xf5, 0xea, 0x46, 0xeb, 0x41, 0xcb, 0x69, 0x5b, 0x6c, 0xab, 0xf6, 0xf2, 0xaf, 0xef, 0x5e, 0x61,
0x28, 0x40, 0xdf, 0x23, 0x2b, 0xbb, 0x4a, 0x9d, 0xe4, 0x61, 0xdd, 0xee, 0x83, 0x92, 0x16, 0x62,
0x8e, 0x43, 0xbf, 0x4b, 0x5a, 0xdd, 0x34, 0x55, 0x86, 0x1b, 0xa9, 0xd2, 0x3c, 0x5c, 0xb5, 0x26,
0xff, 0xdf, 0x09, 0xc2, 0x6d, 0x37, 0x3d, 0xee, 0xa3, 0xd4, 0xe8, 0x73, 0xe6, 0xcb, 0xc3, 0x0e,
0x4f, 0x65, 0x3a, 0x7d, 0x11, 0x36, 0xfc, 0x1d, 0x2c, 0xc4, 0x1c, 0x07, 0x1e, 0x65, 0xa0, 0x12,
0xae, 0x65, 0x1e, 0x36, 0xfd, 0x47, 0x41, 0x90, 0x15, 0x5c, 0x10, 0x7c, 0x2e, 0xd3, 0xa1, 0x3a,
0xcb, 0x43, 0xe2, 0x0b, 0x22, 0xc8, 0x0a, 0xee, 0x9d, 0xef, 0x91, 0x1b, 0x8b, 0xa7, 0xa2, 0x37,
0x48, 0xf5, 0x44, 0x9c, 0xa3, 0x43, 0x60, 0x49, 0x6f, 0x91, 0x95, 0x53, 0x9e, 0x4c, 0x85, 0x75,
0x45, 0x93, 0x39, 0xe2, 0x83, 0xca, 0xfb, 0x41, 0xf4, 0xbb, 0x6a, 0xe9, 0x27, 0x78, 0xe9, 0x03,
0xa1, 0x27, 0x32, 0xe5, 0x89, 0x55, 0x6e, 0xb0, 0x92, 0xa6, 0x5f, 0x26, 0xad, 0x6d, 0x95, 0xe6,
0x2a, 0x11, 0x03, 0xf9, 0x23, 0x81, 0x2e, 0x6d, 0xba, 0x43, 0x6d, 0xa9, 0x17, 0xcc, 0xe7, 0xd2,
0x7b, 0xa4, 0x76, 0x98, 0x0b, 0x3d, 0xef, 0x52, 0x40, 0xd0, 0x27, 0x96, 0x4b, 0x29, 0xa9, 0x75,
0xf5, 0x28, 0x0f, 0x6b, 0xeb, 0xd5, 0x8d, 0x26, 0xb3, 0x6b, 0x38, 0xfa, 0xa3, 0xf4, 0xd4, 0x7a,
0xb3, 0xc9, 0x60, 0x09, 0xc8, 0xf6, 0xd9, 0xd0, 0x7a, 0xad, 0xc9, 0x60, 0x49, 0xbf, 0x4d, 0xae,
0x6e, 0xf3, 0x8c, 0x1f, 0xc9, 0x44, 0x1a, 0x29, 0xc0, 0x4f, 0xb0, 0xcb, 0x3b, 0xde, 0x73, 0xfb,
0x6c, 0x36, 0x27, 0x4c, 0xbf, 0x4a, 0x56, 0x59, 0x22, 0x27, 0xd2, 0xe4, 0x61, 0xc3, 0xfa, 0xf7,
0x26, 0x86, 0xe5, 0xfe, 0xa0, 0xf7, 0x03, 0xc7, 0xc1, 0x43, 0x16, 0x72, 0x74, 0x83, 0x5c, 0x7f,
0xa6, 0x9e, 0x89, 0xb3, 0xbe, 0x96, 0xa7, 0x32, 0x11, 0x23, 0xe1, 0x9c, 0xd7, 0x60, 0x8b, 0x30,
0x48, 0x76, 0xb3, 0x8c, 0xeb, 0x89, 0xd2, 0x7d, 0xad, 0x8e, 0x65, 0x22, 0xac, 0xf7, 0x9a, 0x6c,
0x11, 0xa6, 0xeb, 0xa4, 0xb5, 0xbf, 0xbf, 0x37, 0x88, 0x95, 0x16, 0xdd, 0xe1, 0xa7, 0x61, 0x6b,
0x3d, 0xd8, 0xa8, 0x32, 0x1f, 0xa2, 0x11, 0xb9, 0x3a, 0x10, 0x09, 0xdc, 0xe6, 0x29, 0x3f, 0x12,
0x49, 0x78, 0xd5, 0x1a, 0x9a, 0xc3, 0xa2, 0x87, 0xa4, 0xba, 0xa5, 0x5e, 0xd0, 0xdb, 0xa4, 0xbe,
0x2b, 0xe4, 0x68, 0x6c, 0xac, 0xd7, 0xd6, 0x18, 0x52, 0xe0, 0xf5, 0xe7, 0x72, 0x68, 0xc6, 0xd6,
0x5b, 0x6b, 0xcc, 0x11, 0x51, 0xea, 0x9c, 0x03, 0x0f, 0x7b, 0xd8, 0xdb, 0x41, 0x15, 0x58, 0x02,
0xf2, 0xa4, 0xb7, 0x83, 0xd2, 0xb0, 0xa4, 0x9f, 0x27, 0xd7, 0xba, 0xc3, 0xa1, 0x84, 0xd8, 0xe2,
0xc9, 0x13, 0x39, 0xcc, 0xc3, 0xea, 0x7a, 0x75, 0x63, 0x8d, 0x2d, 0xa0, 0x10, 0x39, 0x60, 0xd3,
0xcf, 0xd1, 0x82, 0x8e, 0x7e, 0x15, 0x90, 0x9b, 0x4b, 0x5e, 0x01, 0x8d, 0x2d, 0x35, 0x4d, 0x87,
0x32, 0x1d, 0x85, 0x81, 0xf5, 0x76, 0x49, 0xd3, 0xbb, 0xa4, 0xf9, 0xe8, 0xf8, 0x58, 0xc4, 0x46,
0x9e, 0x42, 0xa4, 0x01, 0x73, 0x06, 0xc0, 0xd3, 0xf5, 0xd2, 0xb1, 0xd0, 0xd2, 0xf0, 0xa3, 0x44,
0xd8, 0x03, 0x35, 0x99, 0x0f, 0x81, 0x7e, 0x1f, 0xe2, 0xd6, 0x18, 0x31, 0xc4, 0xe8, 0x9a, 0x01,
0x50, 0xb2, 0xba, 0x93, 0x23, 0x29, 0x52, 0x83, 0x61, 0x56, 0x90, 0x51, 0x8f, 0xb4, 0xbc, 0x30,
0x80, 0xf8, 0x3c, 0x38, 0xcf, 0x04, 0xe6, 0x91, 0x5d, 0x03, 0xb6, 0xcb, 0xf5, 0xd0, 0xbe, 0x51,
0x8d, 0xd9, 0x35, 0x60, 0x03, 0x75, 0xec, 0x0a, 0x58, 0x8d, 0xd9, 0x75, 0xa4, 0xc8, 0x8a, 0xad,
0x3b, 0x70, 0xda, 0xa1, 0xc8, 0x8d, 0x4c, 0x6d, 0x82, 0xa2, 0x2d, 0x1f, 0x02, 0xef, 0xe5, 0x6a,
0xaa, 0xe3, 0x22, 0x39, 0x91, 0x02, 0xb3, 0x06, 0xb6, 0xaf, 0xba, 0xed, 0x61, 0x0d, 0x67, 0x57,
0x99, 0xab, 0x4e, 0xee, 0x5e, 0x05, 0x19, 0x7d, 0xc3, 0x55, 0x51, 0xd0, 0xea, 0x73, 0x33, 0x2e,
0x0e, 0x0d, 0x6b, 0x78, 0x6b, 0x26, 0xf8, 0x50, 0xa5, 0xc9, 0xb9, 0xdd, 0xa3, 0xc1, 0x4a, 0x3a,
0xfa, 0x59, 0x80, 0x75, 0x91, 0xde, 0x27, 0x8d, 0xbe, 0x16, 0xb9, 0xe1, 0xda, 0x58, 0x8f, 0x94,
0x89, 0x0b, 0x6c, 0xcc, 0x89, 0x52, 0x82, 0x6e, 0x92, 0x66, 0x5f, 0xe5, 0xc6, 0x89, 0x57, 0x5e,
0x23, 0x3e, 0x13, 0xb1, 0xd6, 0x2d, 0xa1, 0x32, 0xeb, 0xb2, 0xcb, 0xad, 0xa3, 0x44, 0xf4, 0x31,
0xa9, 0x01, 0x7e, 0xe9, 0x6d, 0x8a, 0xb2, 0x51, 0x59, 0x2e, 0x1b, 0xd5, 0x59, 0xd9, 0x08, 0xc9,
0xea, 0x81, 0x9c, 0x08, 0x35, 0x35, 0x36, 0x20, 0xab, 0xac, 0x20, 0xa3, 0xdf, 0xac, 0x60, 0x9d,
0xa6, 0xdf, 0x21, 0xad, 0xc3, 0xde, 0xce, 0x1e, 0xcf, 0x32, 0x99, 0x8e, 0x72, 0xbc, 0xf4, 0x2d,
0xaf, 0x8e, 0x94, 0x4c, 0x3c, 0xa0, 0x2f, 0x0e, 0xda, 0x4f, 0x3c, 0xed, 0xca, 0x7f, 0xd6, 0xf6,
0xc4, 0x69, 0x87, 0xd4, 0x07, 0xe7, 0x79, 0x6c, 0x12, 0x7c, 0x0d, 0xbf, 0x7c, 0x6d, 0x3a, 0x8e,
0x6b, 0x31, 0x28, 0x46, 0x1f, 0x90, 0x26, 0x13, 0x2e, 0x34, 0x72, 0x7b, 0xa5, 0xf9, 0xcd, 0x4a,
0x1e, 0x9b, 0x89, 0x41, 0xf0, 0x6d, 0x8f, 0xb4, 0x9a, 0x66, 0xb9, 0x7d, 0xc5, 0x15, 0x17, 0x7c,
0x1e, 0x44, 0x3f, 0x20, 0xe4, 0x19, 0x9f, 0x88, 0x3c, 0xe3, 0x60, 0xb6, 0xbe, 0x74, 0x87, 0x92,
0x89, 0x77, 0xf0, 0xa4, 0xa1, 0x94, 0xee, 0x88, 0x53, 0x19, 0x8b, 0xa2, 0x55, 0xde, 0xf4, 0x14,
0x1d, 0xa7, 0x28, 0xa5, 0x28, 0x47, 0xef, 0x93, 0xd5, 0x81, 0x88, 0x63, 0x35, 0xc9, 0xb0, 0x49,
0x52, 0x4f, 0x05, 0x39, 0xac, 0x10, 0xa1, 0xf7, 0xc9, 0x4d, 0x88, 0xe9, 0xe3, 0xbc, 0xaf, 0x55,
0xc6, 0x47, 0x2e, 0x83, 0x9a, 0xf6, 0x12, 0xcb, 0x0c, 0xb8, 0xec, 0x1e, 0xcf, 0x4f, 0xc4, 0x10,
0x2e, 0x06, 0x6d, 0xd3, 0xd6, 0x05, 0x0f, 0xa2, 0xf7, 0xc8, 0x5a, 0x11, 0xf7, 0x4e, 0xa6, 0x65,
0x65, 0xe6, 0x41, 0xda, 0x26, 0xc4, 0xa6, 0xae, 0x5f, 0x76, 0x3d, 0x84, 0x76, 0x48, 0xa3, 0x97,
0x1a, 0x91, 0xb0, 0xa1, 0x09, 0xd7, 0xec, 0x25, 0xde, 0xf2, 0x9d, 0x8e, 0x2c, 0x56, 0x0a, 0xdd,
0xf9, 0x16, 0x69, 0x79, 0x0e, 0x7d, 0xa3, 0xee, 0xfc, 0x6e, 0x39, 0x06, 0x80, 0xd0, 0x70, 0x3a,
0x99, 0x14, 0x8a, 0x8e, 0x00, 0x81, 0x62, 0x64, 0xb8, 0x5c, 0xe0, 0x13, 0x72, 0x6d, 0x3e, 0x18,
0x6d, 0xb7, 0x50, 0xb9, 0x29, 0x4b, 0x3f, 0x52, 0x36, 0x58, 0x8a, 0x79, 0xb1, 0xec, 0x02, 0x3e,
0x64, 0x0b, 0x1d, 0x34, 0xff, 0xaa, 0x65, 0xd9, 0x75, 0xf4, 0x3e, 0xda, 0x2f, 0xe3, 0xe2, 0x75,
0x65, 0xd3, 0x46, 0x60, 0x65, 0x96, 0xc7, 0xd1, 0x2f, 0x02, 0xd2, 0xf2, 0x42, 0xe5, 0x75, 0xb9,
0x6e, 0x6d, 0x55, 0x3c, 0x5b, 0xb7, 0xc8, 0xca, 0x1e, 0xff, 0x54, 0xb9, 0xe9, 0xa2, 0xca, 0x1c,
0x61, 0x51, 0x99, 0x2a, 0x8d, 0xd9, 0xee, 0x08, 0xa8, 0x7c, 0x8f, 0x65, 0x22, 0xf6, 0xd4, 0x50,
0xd8, 0xe8, 0x5f, 0x63, 0x25, 0x5d, 0xf4, 0xbf, 0xfa, 0x52, 0xff, 0x5b, 0x2d, 0xfb, 0x5f, 0xf4,
0xb7, 0x0a, 0x5e, 0x6f, 0x96, 0x53, 0xdf, 0x9c, 0x45, 0x7d, 0xb0, 0x94, 0xb9, 0x8e, 0xe3, 0x12,
0x6c, 0x31, 0xf6, 0x61, 0x56, 0x15, 0x13, 0xa5, 0xcf, 0x71, 0x78, 0xf2, 0xb3, 0xc5, 0x31, 0x18,
0x0a, 0xd0, 0x75, 0x52, 0xdd, 0xee, 0x1f, 0xe2, 0xf8, 0x74, 0xcd, 0x1f, 0x6c, 0xfa, 0x87, 0x0c,
0x58, 0xf4, 0x73, 0xa4, 0xd6, 0x87, 0x76, 0xec, 0x0a, 0xc1, 0x75, 0x4f, 0x04, 0x60, 0x66, 0x99,
0x90, 0x6d, 0x5b, 0x89, 0x8a, 0x4f, 0x7a, 0xfb, 0xf6, 0xf2, 0xf3, 0xd9, 0x86, 0x1c, 0x56, 0x88,
0xd0, 0xc7, 0xe4, 0xda, 0xee, 0x74, 0x24, 0x32, 0x3e, 0x12, 0x4f, 0xdd, 0x80, 0xe4, 0xca, 0x41,
0xe8, 0x29, 0xcd, 0x09, 0xe0, 0x05, 0x17, 0xb4, 0x60, 0xd7, 0x67, 0xc2, 0x9c, 0x29, 0x7d, 0x82,
0x93, 0x99, 0xbf, 0x2b, 0x72, 0x58, 0x21, 0x12, 0xfd, 0xa5, 0x88, 0x02, 0xbc, 0xfa, 0x2d, 0x28,
0xce, 0x13, 0xe9, 0x46, 0x99, 0x2a, 0x73, 0x04, 0xc4, 0x26, 0x13, 0xb9, 0xd0, 0xa7, 0xae, 0x06,
0x54, 0xdc, 0xb8, 0xe4, 0x41, 0x36, 0x36, 0xcf, 0x78, 0x86, 0x41, 0x61, 0xd7, 0x10, 0xe9, 0x1f,
0x0a, 0x9d, 0x8a, 0x04, 0x83, 0x02, 0x29, 0x98, 0x0f, 0xdc, 0xea, 0x60, 0xbb, 0x6f, 0x5f, 0xa6,
0xca, 0x66, 0x00, 0xe4, 0x3f, 0x68, 0x67, 0x32, 0x85, 0x6f, 0x97, 0xba, 0x6d, 0xea, 0x1e, 0x42,
0xbf, 0x44, 0x6e, 0xec, 0xc8, 0x1c, 0x06, 0x8d, 0xfd, 0xfd, 0xbd, 0x0f, 0x65, 0x92, 0x08, 0x6d,
0x2f, 0xda, 0x60, 0x4b, 0x78, 0xf4, 0xc7, 0x80, 0x34, 0x0a, 0xc7, 0xc1, 0x71, 0x06, 0x63, 0xae,
0x6d, 0xe0, 0x80, 0x51, 0xa4, 0xe0, 0xca, 0xdf, 0x9f, 0x2a, 0xc3, 0xf1, 0x5a, 0x8e, 0x00, 0xe9,
0xbe, 0xd0, 0x52, 0x0d, 0x71, 0xae, 0x40, 0x0a, 0x66, 0x4c, 0x26, 0x78, 0x62, 0xe4, 0x44, 0xb0,
0x69, 0x0a, 0x3f, 0x78, 0xbb, 0x45, 0x18, 0x86, 0xb7, 0x02, 0x42, 0x4b, 0x2b, 0xd6, 0xd2, 0x02,
0x0a, 0x4f, 0xb7, 0x9d, 0x4d, 0x73, 0x1c, 0xb1, 0xed, 0x1a, 0xb0, 0x3d, 0x31, 0x71, 0xb3, 0x75,
0x93, 0xd9, 0x75, 0x74, 0x86, 0x73, 0xdc, 0x73, 0x3b, 0x5d, 0x62, 0xd6, 0x96, 0xd9, 0x18, 0x5c,
0x9a, 0x8d, 0x15, 0x3f, 0x1b, 0x6f, 0x93, 0xba, 0xd3, 0xc5, 0x0a, 0x82, 0x14, 0xbc, 0xf8, 0x53,
0xc1, 0x8f, 0x91, 0x57, 0xb3, 0x3c, 0x0f, 0x89, 0x0e, 0xc9, 0x5b, 0x76, 0xe3, 0x83, 0xb1, 0x56,
0xc6, 0x24, 0xe2, 0xbf, 0xd8, 0x9a, 0x92, 0x1a, 0xe3, 0x46, 0x14, 0x33, 0x1a, 0xac, 0xa3, 0x7f,
0x54, 0xc9, 0x55, 0x3f, 0x15, 0xbc, 0xf3, 0x05, 0xff, 0xe6, 0x7c, 0x95, 0xc5, 0xf3, 0xd1, 0x2e,
0xb9, 0xea, 0xbf, 0xc9, 0x25, 0x1d, 0xdd, 0x67, 0x63, 0xda, 0xcc, 0xa9, 0xd0, 0x43, 0xf2, 0x76,
0x71, 0x3b, 0xe8, 0x46, 0x5b, 0x59, 0x8e, 0xb6, 0x6a, 0xd6, 0xd6, 0xff, 0x79, 0xb6, 0xe6, 0x5f,
0x01, 0xad, 0x5d, 0xae, 0x4d, 0x9f, 0x93, 0xdb, 0x05, 0xe3, 0xb9, 0x96, 0x46, 0xcc, 0xec, 0xae,
0x7c, 0x36, 0xbb, 0xaf, 0x51, 0xf7, 0x0d, 0xc3, 0x8e, 0xbd, 0xfd, 0xfe, 0x00, 0x0d, 0xd7, 0xdf,
0xd0, 0xf0, 0xbc, 0x3a, 0xfd, 0x21, 0x79, 0x67, 0x6e, 0x4b, 0xcf, 0xf2, 0xea, 0x67, 0xb3, 0xfc,
0x3a, 0xfd, 0xe8, 0x3d, 0xd2, 0x2c, 0x2b, 0xe4, 0xe5, 0x75, 0x26, 0xfa, 0x49, 0xf1, 0xad, 0xe2,
0x17, 0x72, 0x90, 0xed, 0x26, 0x89, 0x3a, 0xc3, 0x8f, 0x62, 0x47, 0xfc, 0xcf, 0xbd, 0xe9, 0x36,
0xa9, 0x77, 0x63, 0xfb, 0xff, 0x88, 0x9b, 0xcb, 0x90, 0x8a, 0x12, 0x8c, 0x4a, 0xac, 0x90, 0x30,
0xc9, 0x6e, 0x27, 0x3c, 0xcf, 0xcb, 0x86, 0x5d, 0x90, 0x74, 0x8b, 0x90, 0xbe, 0x96, 0x4a, 0xbb,
0xcf, 0x60, 0x37, 0x80, 0xde, 0x5d, 0x98, 0x45, 0xf4, 0x31, 0x8f, 0x05, 0x4a, 0x9d, 0x17, 0x43,
0xdc, 0x4c, 0x2b, 0x7a, 0x4c, 0xe8, 0x72, 0x65, 0x87, 0xbe, 0xd9, 0xe7, 0x23, 0x91, 0x43, 0xb7,
0x77, 0xfd, 0xb8, 0xa4, 0x67, 0x2f, 0xe7, 0xbe, 0x81, 0xf0, 0xe5, 0x76, 0xc9, 0xed, 0xcb, 0xf7,
0x84, 0x77, 0x82, 0xe1, 0xa0, 0xe8, 0xeb, 0xb0, 0xb6, 0xf6, 0x91, 0x8f, 0xf9, 0x54, 0xd2, 0xd1,
0x2f, 0x03, 0x7c, 0x80, 0x62, 0x0c, 0xbc, 0x47, 0xd6, 0x76, 0xc4, 0x31, 0x9f, 0x26, 0xa6, 0x1b,
0x7b, 0x1f, 0x51, 0xf3, 0x20, 0x48, 0x75, 0x75, 0x3c, 0x96, 0x46, 0xc4, 0x66, 0xaa, 0x45, 0xf1,
0x7d, 0x30, 0x0f, 0xc2, 0xe1, 0x1f, 0x27, 0x7c, 0x94, 0xe3, 0xa7, 0x82, 0x23, 0xe8, 0xd7, 0x48,
0x03, 0x26, 0x34, 0x9e, 0x24, 0x39, 0x26, 0xdc, 0xdc, 0x5c, 0xea, 0x58, 0xc5, 0x47, 0x4a, 0x21,
0x19, 0x49, 0x72, 0xdd, 0x3f, 0x67, 0x57, 0x8f, 0xc0, 0x7c, 0x2f, 0x1d, 0x8a, 0x17, 0x58, 0xe1,
0x1d, 0x01, 0xe8, 0x47, 0xe5, 0x7c, 0x57, 0x63, 0x8e, 0x80, 0x37, 0xb0, 0x8b, 0x83, 0x33, 0x85,
0x65, 0xa9, 0xa4, 0xe9, 0x35, 0x52, 0xd9, 0xcf, 0xf0, 0x4b, 0xba, 0xb2, 0x9f, 0x45, 0x3f, 0x2f,
0xdf, 0xc4, 0x6d, 0x0e, 0x26, 0xed, 0xc4, 0x85, 0xdf, 0xce, 0x8e, 0x70, 0x21, 0x55, 0x76, 0x48,
0x1b, 0x52, 0xf6, 0x6d, 0xee, 0x92, 0x86, 0xd0, 0x3a, 0x55, 0x5a, 0x60, 0xe9, 0xdd, 0xbd, 0xc2,
0x4a, 0x84, 0x76, 0xbc, 0xff, 0x61, 0x5a, 0x0f, 0xde, 0x5e, 0x9e, 0xc8, 0xbb, 0xba, 0xf8, 0x84,
0xb1, 0x82, 0x5b, 0x84, 0x34, 0x1e, 0x81, 0x32, 0x13, 0x26, 0xfa, 0x3a, 0x59, 0x9b, 0x9b, 0x7b,
0xc1, 0x0f, 0x4f, 0x1f, 0x6e, 0xf3, 0x78, 0x2c, 0x06, 0xf1, 0x58, 0x4c, 0x78, 0xe1, 0xad, 0x39,
0x70, 0xeb, 0xa7, 0xc1, 0xcb, 0x57, 0xed, 0x2b, 0x7f, 0x7e, 0xd5, 0xbe, 0xf2, 0xcf, 0x57, 0xed,
0xe0, 0xc7, 0x17, 0xed, 0xe0, 0xd7, 0x17, 0xed, 0xe0, 0xb7, 0x17, 0xed, 0xe0, 0xf7, 0x17, 0xed,
0xe0, 0xe5, 0x45, 0x3b, 0xf8, 0xd3, 0x45, 0x3b, 0xf8, 0xfb, 0x45, 0x3b, 0xf8, 0xf8, 0x93, 0x37,
0xfc, 0x97, 0x53, 0xbb, 0xf6, 0xd7, 0x39, 0x95, 0xda, 0x78, 0xac, 0xec, 0x64, 0xd4, 0xe1, 0x23,
0x91, 0x1a, 0xef, 0x1f, 0x50, 0xb8, 0xe9, 0x51, 0xdd, 0xd2, 0x0f, 0xff, 0x15, 0x00, 0x00, 0xff,
0xff, 0x10, 0x2c, 0x26, 0x0c, 0x4e, 0x15, 0x00, 0x00,
// 2163 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xcd, 0x73, 0x1b, 0x49,
0x15, 0xcf, 0x48, 0xb2, 0x2c, 0xb5, 0x22, 0x67, 0xd3, 0x9b, 0xcd, 0x0e, 0x21, 0xa5, 0xf5, 0x0e,
0x29, 0x30, 0x10, 0xac, 0x22, 0x81, 0x25, 0x84, 0x8f, 0x2a, 0x59, 0x4e, 0x62, 0xd5, 0xc6, 0xb1,
0x68, 0xd9, 0x6b, 0xd8, 0xc3, 0x56, 0xb5, 0x47, 0x6d, 0xa9, 0xd7, 0xa3, 0xe9, 0xa9, 0x9e, 0x96,
0x1d, 0x73, 0x82, 0x1b, 0xff, 0x01, 0x67, 0x2e, 0x7c, 0xfc, 0x07, 0x14, 0x27, 0x38, 0x91, 0xe2,
0xc4, 0x91, 0x2a, 0xaa, 0x80, 0xf8, 0xce, 0x9d, 0x23, 0xf5, 0xfa, 0x63, 0xd4, 0x92, 0x6c, 0xd8,
0xc0, 0xad, 0xdf, 0x7b, 0xbf, 0xf7, 0xfa, 0xe3, 0x7d, 0xce, 0xa0, 0x17, 0x23, 0xae, 0xc6, 0xd3,
0xa3, 0xcd, 0x58, 0x4c, 0xda, 0x27, 0x54, 0xd1, 0xaf, 0xc5, 0x22, 0x55, 0x94, 0xa7, 0x4c, 0xe6,
0x4b, 0x74, 0x2e, 0xe3, 0x76, 0xc2, 0x8f, 0xf2, 0x76, 0x26, 0x85, 0x12, 0xb1, 0x48, 0xec, 0x2a,
0x6f, 0x8b, 0x98, 0x6f, 0xea, 0x25, 0xae, 0x8c, 0x64, 0x16, 0xdf, 0x89, 0x46, 0x62, 0x24, 0x8c,
0xf0, 0x68, 0x7a, 0xdc, 0x06, 0x4a, 0x13, 0x7a, 0x65, 0x90, 0xd1, 0x1f, 0xcb, 0xa8, 0x32, 0xc8,
0x58, 0x8c, 0x43, 0xb4, 0xfa, 0x11, 0x93, 0x39, 0x17, 0x69, 0x18, 0xac, 0x07, 0x1b, 0x75, 0xe2,
0x48, 0xfc, 0x25, 0xb4, 0xda, 0x97, 0x22, 0x66, 0x79, 0x1e, 0x96, 0xd6, 0x83, 0x8d, 0xc6, 0x83,
0xe6, 0x26, 0x98, 0xdf, 0xb4, 0x4c, 0xe2, 0xa4, 0xb8, 0x85, 0x2a, 0x44, 0x08, 0x15, 0x96, 0x35,
0x0a, 0x19, 0x14, 0x70, 0x88, 0xe6, 0xe3, 0x3b, 0xa8, 0xb6, 0x23, 0x72, 0x95, 0xd2, 0x09, 0x0b,
0x2b, 0x7a, 0x8f, 0x82, 0xc6, 0x5f, 0x46, 0xd5, 0x5d, 0x31, 0x4d, 0x55, 0x1e, 0xae, 0xac, 0x97,
0x37, 0x1a, 0x0f, 0x1a, 0x46, 0x5b, 0xf3, 0xb6, 0x2a, 0xaf, 0xfe, 0xf6, 0xde, 0x35, 0x62, 0x01,
0xf8, 0x7d, 0xb4, 0xb2, 0x23, 0xc4, 0x49, 0x1e, 0x56, 0xf5, 0x3e, 0x16, 0xa9, 0x59, 0xc4, 0x48,
0xf0, 0xf7, 0x50, 0xa3, 0x93, 0xa6, 0x42, 0x51, 0xc5, 0x45, 0x9a, 0x87, 0xab, 0xda, 0xe4, 0xe7,
0x0d, 0x10, 0x6e, 0xbb, 0xe9, 0x49, 0x9f, 0xa4, 0x4a, 0x9e, 0x13, 0x1f, 0x0f, 0x3b, 0x3c, 0xe7,
0xe9, 0xf4, 0x65, 0x58, 0xf3, 0x77, 0xd0, 0x2c, 0x62, 0x24, 0xf0, 0x28, 0x03, 0x91, 0x50, 0xc9,
0xf3, 0xb0, 0xee, 0x3f, 0x8a, 0x65, 0x12, 0x27, 0x05, 0xe0, 0x21, 0x4f, 0x87, 0xe2, 0x2c, 0x0f,
0x91, 0x0f, 0xb4, 0x4c, 0xe2, 0xa4, 0x77, 0xbe, 0x8f, 0xde, 0x5a, 0x3c, 0x15, 0x7e, 0x0b, 0x95,
0x4f, 0xd8, 0xb9, 0x75, 0x08, 0x2c, 0xf1, 0x2d, 0xb4, 0x72, 0x4a, 0x93, 0x29, 0xd3, 0xae, 0xa8,
0x13, 0x43, 0x3c, 0x2e, 0x3d, 0x0a, 0xa2, 0xdf, 0x95, 0x0b, 0x3f, 0xc1, 0x4b, 0xef, 0x33, 0x39,
0xe1, 0x29, 0x4d, 0xb4, 0x72, 0x8d, 0x14, 0x34, 0xfe, 0x2a, 0x6a, 0x74, 0x45, 0x9a, 0x8b, 0x84,
0x0d, 0xf8, 0x8f, 0x99, 0x75, 0x69, 0xdd, 0x1c, 0x6a, 0x4b, 0xbc, 0x24, 0xbe, 0x14, 0xdf, 0x43,
0x95, 0x83, 0x9c, 0xc9, 0x79, 0x97, 0x02, 0xc7, 0xfa, 0x44, 0x4b, 0x31, 0x46, 0x95, 0x8e, 0x1c,
0xe5, 0x61, 0x65, 0xbd, 0xbc, 0x51, 0x27, 0x7a, 0x0d, 0x47, 0x7f, 0x92, 0x9e, 0x6a, 0x6f, 0xd6,
0x09, 0x2c, 0x81, 0xd3, 0x3d, 0x1b, 0x6a, 0xaf, 0xd5, 0x09, 0x2c, 0xf1, 0x77, 0xd0, 0xf5, 0x2e,
0xcd, 0xe8, 0x11, 0x4f, 0xb8, 0xe2, 0x0c, 0xfc, 0x04, 0xbb, 0xbc, 0xeb, 0x3d, 0xb7, 0x2f, 0x26,
0x73, 0x60, 0xfc, 0x75, 0xb4, 0x4a, 0x12, 0x3e, 0xe1, 0x2a, 0x0f, 0x6b, 0xda, 0xbf, 0x37, 0x6d,
0x58, 0xee, 0x0d, 0x7a, 0x3f, 0x34, 0x12, 0x7b, 0x48, 0x87, 0xc3, 0x1b, 0xe8, 0xc6, 0x0b, 0xf1,
0x82, 0x9d, 0xf5, 0x25, 0x3f, 0xe5, 0x09, 0x1b, 0x31, 0xe3, 0xbc, 0x1a, 0x59, 0x64, 0x03, 0xb2,
0x93, 0x65, 0x54, 0x4e, 0x84, 0xec, 0x4b, 0x71, 0xcc, 0x13, 0xa6, 0xbd, 0x57, 0x27, 0x8b, 0x6c,
0xbc, 0x8e, 0x1a, 0x7b, 0x7b, 0xbb, 0x83, 0x58, 0x48, 0xd6, 0x19, 0x7e, 0x1a, 0x36, 0xd6, 0x83,
0x8d, 0x32, 0xf1, 0x59, 0x38, 0x42, 0xd7, 0x07, 0x2c, 0x81, 0xdb, 0x3c, 0xa7, 0x47, 0x2c, 0x09,
0xaf, 0x6b, 0x43, 0x73, 0xbc, 0xe8, 0x21, 0x2a, 0x6f, 0x89, 0x97, 0xf8, 0x36, 0xaa, 0xee, 0x30,
0x3e, 0x1a, 0x2b, 0xed, 0xb5, 0x26, 0xb1, 0x14, 0x78, 0xfd, 0x90, 0x0f, 0xd5, 0x58, 0x7b, 0xab,
0x49, 0x0c, 0x11, 0xa5, 0xc6, 0x39, 0xf0, 0xb0, 0x07, 0xbd, 0x6d, 0xab, 0x02, 0x4b, 0xe0, 0x3c,
0xeb, 0x6d, 0x5b, 0x34, 0x2c, 0xf1, 0x17, 0xd1, 0x5a, 0x67, 0x38, 0xe4, 0x10, 0x5b, 0x34, 0x79,
0xc6, 0x87, 0x79, 0x58, 0x5e, 0x2f, 0x6f, 0x34, 0xc9, 0x02, 0x17, 0x22, 0x07, 0x6c, 0xfa, 0x39,
0xea, 0xe8, 0xe8, 0x57, 0x01, 0xba, 0xb9, 0xe4, 0x15, 0xd0, 0xd8, 0x12, 0xd3, 0x74, 0xc8, 0xd3,
0x51, 0x18, 0x68, 0x6f, 0x17, 0x34, 0xbe, 0x8b, 0xea, 0x4f, 0x8e, 0x8f, 0x59, 0xac, 0xf8, 0x29,
0x44, 0x1a, 0x08, 0x67, 0x0c, 0x78, 0xba, 0x5e, 0x3a, 0x66, 0x92, 0x2b, 0x7a, 0x94, 0x30, 0x7d,
0xa0, 0x3a, 0xf1, 0x59, 0xa0, 0xdf, 0x87, 0xb8, 0x55, 0x8a, 0x0d, 0x6d, 0x74, 0xcd, 0x18, 0x50,
0xb2, 0x3a, 0x93, 0x23, 0xce, 0x52, 0x65, 0xc3, 0xcc, 0x91, 0x51, 0x0f, 0x35, 0xbc, 0x30, 0x80,
0xf8, 0xdc, 0x3f, 0xcf, 0x98, 0xcd, 0x23, 0xbd, 0x06, 0xde, 0x0e, 0x95, 0x43, 0xfd, 0x46, 0x15,
0xa2, 0xd7, 0xc0, 0x1b, 0x88, 0x63, 0x53, 0xc0, 0x2a, 0x44, 0xaf, 0x23, 0x81, 0x56, 0x74, 0xdd,
0x81, 0xd3, 0x0e, 0x59, 0xae, 0x78, 0xaa, 0x13, 0xd4, 0xda, 0xf2, 0x59, 0xe0, 0xbd, 0x5c, 0x4c,
0x65, 0xec, 0x92, 0xd3, 0x52, 0x60, 0x56, 0xc1, 0xf6, 0x65, 0xb3, 0x3d, 0xac, 0xe1, 0xec, 0x22,
0x33, 0xd5, 0xc9, 0xdc, 0xcb, 0x91, 0xd1, 0x07, 0xa6, 0x8a, 0x82, 0x56, 0x9f, 0xaa, 0xb1, 0x3b,
0x34, 0xac, 0xe1, 0xad, 0x09, 0xa3, 0x43, 0x91, 0x26, 0xe7, 0x7a, 0x8f, 0x1a, 0x29, 0xe8, 0xe8,
0x0f, 0x25, 0x5b, 0x17, 0xf1, 0x7d, 0x54, 0xeb, 0x4b, 0x96, 0x2b, 0x2a, 0x95, 0xf6, 0x48, 0x91,
0xb8, 0x20, 0xb6, 0x39, 0x51, 0x20, 0xf0, 0x26, 0xaa, 0xf7, 0x45, 0xae, 0x0c, 0xbc, 0x74, 0x05,
0x7c, 0x06, 0xd1, 0xd6, 0x35, 0x21, 0x32, 0xed, 0xb2, 0xcb, 0xad, 0x5b, 0x04, 0xfe, 0x00, 0x35,
0xbb, 0x92, 0x51, 0xc5, 0xc8, 0x34, 0x55, 0x5c, 0x07, 0xd5, 0xe5, 0x2a, 0xf3, 0x30, 0xfc, 0x18,
0xdd, 0x30, 0x8c, 0xae, 0xeb, 0x7c, 0xb6, 0x31, 0x2c, 0x6b, 0x2e, 0x02, 0xf1, 0x23, 0xb4, 0x36,
0x80, 0xa3, 0xce, 0x54, 0xab, 0x57, 0xa8, 0x2e, 0xe0, 0xa2, 0x8f, 0x51, 0x05, 0xa4, 0x97, 0xbe,
0xbd, 0x2b, 0x72, 0xa5, 0xe5, 0x22, 0x57, 0x9e, 0x15, 0xb9, 0x10, 0xad, 0xee, 0xf3, 0x09, 0x13,
0x53, 0xa5, 0xd3, 0xa7, 0x4c, 0x1c, 0x19, 0xfd, 0x66, 0xc5, 0x76, 0x15, 0xfc, 0x5d, 0xd4, 0x38,
0xe8, 0x6d, 0xef, 0xd2, 0x2c, 0xe3, 0xe9, 0x28, 0xb7, 0x2e, 0xba, 0xe5, 0x55, 0xbd, 0x42, 0x68,
0x8f, 0xe9, 0xc3, 0x41, 0xfb, 0x99, 0xa7, 0x5d, 0xfa, 0xef, 0xda, 0x1e, 0x1c, 0xb7, 0x51, 0x75,
0x70, 0x9e, 0xc7, 0x2a, 0xb1, 0xbe, 0xf3, 0x8b, 0xed, 0xa6, 0x91, 0x98, 0x86, 0x68, 0x61, 0xf8,
0x01, 0xaa, 0x13, 0x66, 0x02, 0x39, 0xd7, 0x57, 0x9a, 0xdf, 0xac, 0x90, 0x91, 0x19, 0x0c, 0x52,
0xa5, 0x3b, 0x92, 0x62, 0x9a, 0xe5, 0xfa, 0x15, 0x57, 0x4c, 0xaa, 0x78, 0x2c, 0xfc, 0x18, 0xa1,
0x17, 0x74, 0xc2, 0xf2, 0x8c, 0x82, 0xd9, 0xea, 0xd2, 0x1d, 0x0a, 0xa1, 0xbd, 0x83, 0x87, 0x86,
0xc2, 0xbf, 0xcd, 0x4e, 0x79, 0xcc, 0x5c, 0x63, 0xbf, 0xe9, 0x29, 0x1a, 0x89, 0x2b, 0xfc, 0x16,
0x87, 0xef, 0xa3, 0xd5, 0x01, 0x8b, 0x63, 0x31, 0xc9, 0x6c, 0x4b, 0xc7, 0x9e, 0x8a, 0x95, 0x10,
0x07, 0xc1, 0xf7, 0xd1, 0x4d, 0xc8, 0xc0, 0xe3, 0xbc, 0x2f, 0x45, 0x46, 0x47, 0x26, 0xdf, 0xeb,
0xfa, 0x12, 0xcb, 0x02, 0xb8, 0xec, 0x2e, 0xcd, 0x4f, 0xd8, 0x10, 0x2e, 0x06, 0x4d, 0x5e, 0x57,
0x31, 0x8f, 0x85, 0xef, 0xa1, 0xa6, 0xcb, 0x52, 0x83, 0x69, 0x68, 0xcc, 0x3c, 0x13, 0xb7, 0x10,
0xd2, 0x85, 0xc6, 0x6f, 0x12, 0x1e, 0x07, 0xb7, 0x51, 0xad, 0x97, 0x2a, 0x96, 0x90, 0xa1, 0x0a,
0x9b, 0xfa, 0x12, 0x6f, 0xfb, 0x4e, 0xb7, 0x22, 0x52, 0x80, 0xee, 0x7c, 0x1b, 0x35, 0x3c, 0x87,
0xbe, 0xd1, 0x2c, 0xf1, 0x5e, 0x31, 0xb4, 0x00, 0x68, 0x38, 0x9d, 0x4c, 0x9c, 0xa2, 0x21, 0x00,
0xe0, 0x06, 0x9c, 0xcb, 0x01, 0x9f, 0xa0, 0xb5, 0xf9, 0x60, 0xd4, 0xbd, 0x4d, 0xe4, 0xaa, 0x68,
0x54, 0x96, 0xd2, 0xc1, 0xe2, 0x12, 0xb0, 0xe8, 0x59, 0x3e, 0x4b, 0x97, 0x65, 0x18, 0x55, 0xca,
0x5a, 0xa4, 0xd7, 0xd1, 0x23, 0x6b, 0xbf, 0x88, 0x8b, 0xab, 0x8a, 0xbc, 0x8e, 0xc0, 0xd2, 0x2c,
0x8f, 0xa3, 0x5f, 0x04, 0xa8, 0xe1, 0x85, 0xca, 0x55, 0xb9, 0xae, 0x6d, 0x95, 0x3c, 0x5b, 0xb7,
0xd0, 0xca, 0x2e, 0xfd, 0x54, 0x98, 0x59, 0xa8, 0x4c, 0x0c, 0xa1, 0xb9, 0x3c, 0x15, 0xd2, 0x66,
0xbb, 0x21, 0xa0, 0x4e, 0x3f, 0xe5, 0x09, 0xdb, 0x15, 0x43, 0xa6, 0xa3, 0xbf, 0x49, 0x0a, 0xda,
0x75, 0xeb, 0xea, 0x52, 0xb7, 0x5e, 0x2d, 0xba, 0x75, 0xf4, 0xf7, 0x92, 0xbd, 0xde, 0x2c, 0xa7,
0xbe, 0x35, 0x8b, 0xfa, 0x60, 0x29, 0x73, 0x8d, 0xc4, 0x24, 0xd8, 0x62, 0xec, 0xc3, 0x64, 0xcd,
0x26, 0x42, 0x9e, 0xdb, 0x51, 0xcf, 0xcf, 0x16, 0x23, 0x20, 0x16, 0x80, 0xd7, 0x51, 0xb9, 0xdb,
0x3f, 0xb0, 0xc3, 0xde, 0x9a, 0x3f, 0x86, 0xf5, 0x0f, 0x08, 0x88, 0xf0, 0x17, 0x50, 0xa5, 0x0f,
0xc3, 0x83, 0x29, 0x04, 0x37, 0x3c, 0x08, 0xb0, 0x89, 0x16, 0x42, 0xb6, 0x6d, 0x25, 0x22, 0x3e,
0xe9, 0xed, 0xe9, 0xcb, 0xcf, 0x67, 0x9b, 0x95, 0x10, 0x07, 0xc1, 0x4f, 0xd1, 0xda, 0xce, 0x74,
0xc4, 0x32, 0x3a, 0x62, 0xcf, 0xcd, 0x38, 0x67, 0xca, 0x41, 0xe8, 0x29, 0xcd, 0x01, 0x5c, 0xed,
0x9e, 0xd7, 0x82, 0x5d, 0x5f, 0x30, 0x75, 0x26, 0xe4, 0x89, 0x9d, 0x23, 0xfd, 0x5d, 0xad, 0x84,
0x38, 0x48, 0xf4, 0x57, 0x17, 0x05, 0xf6, 0xea, 0xb7, 0xa0, 0x38, 0x4f, 0xb8, 0x19, 0xbc, 0xca,
0xc4, 0x10, 0x10, 0x9b, 0x84, 0xe5, 0x4c, 0x9e, 0x9a, 0x1a, 0x50, 0x32, 0xc3, 0x9d, 0xc7, 0xd2,
0xb1, 0x79, 0x46, 0x33, 0x1b, 0x14, 0x7a, 0x0d, 0x91, 0xfe, 0x21, 0x93, 0x29, 0x4b, 0x6c, 0x50,
0x58, 0x0a, 0xa6, 0x19, 0xb3, 0xda, 0xef, 0xf6, 0xf5, 0xcb, 0x94, 0xc9, 0x8c, 0x01, 0xf9, 0x0f,
0xda, 0x19, 0x4f, 0xe1, 0x4b, 0xab, 0xaa, 0x47, 0x10, 0x8f, 0x83, 0xbf, 0x82, 0xde, 0xda, 0xe6,
0x39, 0x8c, 0x45, 0x7b, 0x7b, 0xbb, 0x1f, 0xf2, 0x24, 0x61, 0x52, 0x5f, 0xb4, 0x46, 0x96, 0xf8,
0xd1, 0x9f, 0x02, 0x54, 0x73, 0x8e, 0x83, 0xe3, 0x0c, 0xc6, 0x54, 0xea, 0xc0, 0x01, 0xa3, 0x96,
0x82, 0x2b, 0xff, 0x60, 0x2a, 0x14, 0xb5, 0xd7, 0x32, 0x04, 0xa0, 0xfb, 0x4c, 0x72, 0x31, 0xb4,
0x53, 0x90, 0xa5, 0x60, 0x22, 0x26, 0x8c, 0x26, 0xd0, 0x9c, 0x67, 0xad, 0x1c, 0xf4, 0x16, 0xd9,
0x30, 0x6a, 0x3a, 0x96, 0xb5, 0xb4, 0xa2, 0x2d, 0x2d, 0x70, 0xe1, 0xe9, 0xba, 0xd9, 0x34, 0xb7,
0x1f, 0x04, 0x7a, 0x0d, 0xbc, 0x5d, 0x36, 0x31, 0x5f, 0x02, 0x75, 0xa2, 0xd7, 0xd1, 0x99, 0x9d,
0x3a, 0x0f, 0xf5, 0x2c, 0x6c, 0xb3, 0xb6, 0xc8, 0xc6, 0xe0, 0xd2, 0x6c, 0x2c, 0xf9, 0xd9, 0x78,
0x1b, 0x55, 0x8d, 0xae, 0xad, 0x20, 0x96, 0x82, 0x17, 0x7f, 0xce, 0xe8, 0xb1, 0x95, 0x55, 0xb4,
0xcc, 0xe3, 0x44, 0x07, 0xe8, 0x6d, 0xbd, 0xf1, 0xfe, 0x58, 0x0a, 0xa5, 0x12, 0xf6, 0x3f, 0x6c,
0x8d, 0x51, 0x85, 0x50, 0xc5, 0xdc, 0x44, 0x09, 0xeb, 0xe8, 0x9f, 0x65, 0x74, 0xdd, 0x4f, 0x05,
0xef, 0x7c, 0xc1, 0x7f, 0x38, 0x5f, 0x69, 0xf1, 0x7c, 0xb8, 0x83, 0xae, 0xfb, 0x6f, 0x72, 0x49,
0x47, 0xf7, 0xc5, 0x36, 0x6d, 0xe6, 0x54, 0xf0, 0x01, 0x7a, 0xc7, 0xdd, 0x0e, 0xba, 0xd1, 0x56,
0x96, 0x5b, 0x5b, 0x66, 0x4c, 0xfb, 0x9c, 0x67, 0x6b, 0xfe, 0x15, 0xac, 0xb5, 0xcb, 0xb5, 0xf1,
0x21, 0xba, 0xed, 0x04, 0x87, 0x92, 0x2b, 0x36, 0xb3, 0xbb, 0xf2, 0xd9, 0xec, 0x5e, 0xa1, 0xee,
0x1b, 0x86, 0x1d, 0x7b, 0x7b, 0xfd, 0x81, 0x35, 0x5c, 0x7d, 0x43, 0xc3, 0xf3, 0xea, 0xf8, 0x47,
0xe8, 0xdd, 0xb9, 0x2d, 0x3d, 0xcb, 0xab, 0x9f, 0xcd, 0xf2, 0x55, 0xfa, 0xd1, 0xfb, 0xa8, 0x5e,
0x54, 0xc8, 0xcb, 0xeb, 0x4c, 0xf4, 0x53, 0xf7, 0x65, 0xe5, 0x17, 0x72, 0xc0, 0x76, 0x92, 0x44,
0x9c, 0xd9, 0x4f, 0x78, 0x43, 0xfc, 0xdf, 0xbd, 0xe9, 0x36, 0xaa, 0x76, 0x62, 0xfd, 0x37, 0xc7,
0xcc, 0x65, 0x96, 0x8a, 0x12, 0x1b, 0x95, 0xb6, 0x42, 0xc2, 0x24, 0xdb, 0x4d, 0x68, 0x9e, 0x17,
0x0d, 0xdb, 0x91, 0x78, 0x0b, 0xa1, 0xbe, 0xe4, 0x42, 0x9a, 0x8f, 0x76, 0x33, 0x80, 0xde, 0x5d,
0x98, 0x45, 0xe4, 0x31, 0x8d, 0x99, 0x45, 0x9d, 0xbb, 0x21, 0x6e, 0xa6, 0x15, 0x3d, 0x45, 0x78,
0xb9, 0xb2, 0x43, 0xdf, 0xec, 0xd3, 0x11, 0xcb, 0xa1, 0xdb, 0x9b, 0x7e, 0x5c, 0xd0, 0xb3, 0x97,
0x33, 0x5f, 0x6c, 0xf6, 0xe5, 0x76, 0xd0, 0xed, 0xcb, 0xf7, 0x84, 0x77, 0x82, 0xe1, 0xc0, 0xf5,
0x75, 0x58, 0x6b, 0xfb, 0x56, 0x6e, 0xf3, 0xa9, 0xa0, 0xa3, 0x5f, 0x06, 0xf6, 0x01, 0xdc, 0x18,
0x78, 0x0f, 0x35, 0xb7, 0xd9, 0x31, 0x9d, 0x26, 0xaa, 0x13, 0x7b, 0x9f, 0x7c, 0xf3, 0x4c, 0x40,
0x75, 0x64, 0x3c, 0xe6, 0x8a, 0xc5, 0x6a, 0x2a, 0x99, 0xfb, 0x3e, 0x98, 0x67, 0xc2, 0xe1, 0x9f,
0x26, 0x74, 0x94, 0xdb, 0x4f, 0x05, 0x43, 0xe0, 0x6f, 0xa0, 0x1a, 0x4c, 0x68, 0x34, 0x49, 0x72,
0x9b, 0x70, 0x73, 0x73, 0xa9, 0x11, 0xb9, 0x4f, 0x2a, 0x87, 0x8c, 0x38, 0xba, 0xe1, 0x9f, 0xb3,
0x23, 0x47, 0x60, 0xbe, 0x97, 0x0e, 0xd9, 0x4b, 0x5b, 0xe1, 0x0d, 0x01, 0xdc, 0x8f, 0x8a, 0xf9,
0xae, 0x42, 0x0c, 0x01, 0x6f, 0xa0, 0x17, 0xfb, 0x67, 0xc2, 0x96, 0xa5, 0x82, 0xc6, 0x6b, 0xa8,
0xb4, 0x97, 0xd9, 0xef, 0xfe, 0xd2, 0x5e, 0x16, 0xfd, 0xbc, 0x78, 0x13, 0xb3, 0x39, 0x98, 0xd4,
0x13, 0x97, 0xfd, 0xd2, 0x37, 0x84, 0x09, 0xa9, 0xa2, 0x43, 0xea, 0x90, 0xd2, 0x6f, 0x73, 0x17,
0xd5, 0x98, 0x94, 0xa9, 0x90, 0xcc, 0x96, 0xde, 0x9d, 0x6b, 0xa4, 0xe0, 0xe0, 0xb6, 0xf7, 0xd7,
0xa8, 0xf1, 0xe0, 0x9d, 0xe5, 0x89, 0xbc, 0x23, 0xdd, 0x27, 0x8c, 0x06, 0x6e, 0x21, 0x54, 0x7b,
0x02, 0xca, 0x84, 0xa9, 0xe8, 0x9b, 0xa8, 0x39, 0x37, 0xf7, 0x82, 0x1f, 0x9e, 0x3f, 0xec, 0xd2,
0x78, 0xcc, 0x06, 0xf1, 0x98, 0x4d, 0xa8, 0xf3, 0xd6, 0x1c, 0x73, 0xeb, 0x67, 0xc1, 0xab, 0xd7,
0xad, 0x6b, 0x7f, 0x79, 0xdd, 0xba, 0xf6, 0xaf, 0xd7, 0xad, 0xe0, 0x27, 0x17, 0xad, 0xe0, 0xd7,
0x17, 0xad, 0xe0, 0xb7, 0x17, 0xad, 0xe0, 0xf7, 0x17, 0xad, 0xe0, 0xd5, 0x45, 0x2b, 0xf8, 0xf3,
0x45, 0x2b, 0xf8, 0xc7, 0x45, 0x2b, 0xf8, 0xf8, 0x93, 0x37, 0xfc, 0x27, 0x2b, 0x4d, 0xfb, 0x6b,
0x9f, 0x72, 0xa9, 0x3c, 0x51, 0x76, 0x32, 0x6a, 0xd3, 0x11, 0x4b, 0x95, 0xf7, 0xbf, 0x16, 0x6e,
0x7a, 0x54, 0xd5, 0xf4, 0xc3, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0xce, 0xda, 0xe2, 0x21, 0xfc,
0x15, 0x00, 0x00,
}
func (this *Spec) Equal(that interface{}) bool {
@@ -2103,6 +2113,30 @@ func (this *Hooks) Equal(that interface{}) bool {
return false
}
}
if len(this.CreateRuntime) != len(that1.CreateRuntime) {
return false
}
for i := range this.CreateRuntime {
if !this.CreateRuntime[i].Equal(&that1.CreateRuntime[i]) {
return false
}
}
if len(this.CreateContainer) != len(that1.CreateContainer) {
return false
}
for i := range this.CreateContainer {
if !this.CreateContainer[i].Equal(&that1.CreateContainer[i]) {
return false
}
}
if len(this.StartContainer) != len(that1.StartContainer) {
return false
}
for i := range this.StartContainer {
if !this.StartContainer[i].Equal(&that1.StartContainer[i]) {
return false
}
}
if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) {
return false
}
@@ -3674,6 +3708,48 @@ func (m *Hooks) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
if len(m.StartContainer) > 0 {
for iNdEx := len(m.StartContainer) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.StartContainer[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintOci(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x32
}
}
if len(m.CreateContainer) > 0 {
for iNdEx := len(m.CreateContainer) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.CreateContainer[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintOci(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x2a
}
}
if len(m.CreateRuntime) > 0 {
for iNdEx := len(m.CreateRuntime) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.CreateRuntime[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintOci(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x22
}
}
if len(m.Poststop) > 0 {
for iNdEx := len(m.Poststop) - 1; iNdEx >= 0; iNdEx-- {
{
@@ -5277,8 +5353,32 @@ func NewPopulatedHooks(r randyOci, easy bool) *Hooks {
this.Poststop[i] = *v21
}
}
if r.Intn(5) != 0 {
v22 := r.Intn(5)
this.CreateRuntime = make([]Hook, v22)
for i := 0; i < v22; i++ {
v23 := NewPopulatedHook(r, easy)
this.CreateRuntime[i] = *v23
}
}
if r.Intn(5) != 0 {
v24 := r.Intn(5)
this.CreateContainer = make([]Hook, v24)
for i := 0; i < v24; i++ {
v25 := NewPopulatedHook(r, easy)
this.CreateContainer[i] = *v25
}
}
if r.Intn(5) != 0 {
v26 := r.Intn(5)
this.StartContainer = make([]Hook, v26)
for i := 0; i < v26; i++ {
v27 := NewPopulatedHook(r, easy)
this.StartContainer[i] = *v27
}
}
if !easy && r.Intn(10) != 0 {
this.XXX_unrecognized = randUnrecognizedOci(r, 4)
this.XXX_unrecognized = randUnrecognizedOci(r, 7)
}
return this
}
@@ -5286,14 +5386,14 @@ func NewPopulatedHooks(r randyOci, easy bool) *Hooks {
func NewPopulatedHook(r randyOci, easy bool) *Hook {
this := &Hook{}
this.Path = string(randStringOci(r))
v22 := r.Intn(10)
this.Args = make([]string, v22)
for i := 0; i < v22; i++ {
v28 := r.Intn(10)
this.Args = make([]string, v28)
for i := 0; i < v28; i++ {
this.Args[i] = string(randStringOci(r))
}
v23 := r.Intn(10)
this.Env = make([]string, v23)
for i := 0; i < v23; i++ {
v29 := r.Intn(10)
this.Env = make([]string, v29)
for i := 0; i < v29; i++ {
this.Env[i] = string(randStringOci(r))
}
this.Timeout = int64(r.Int63())
@@ -5309,25 +5409,25 @@ func NewPopulatedHook(r randyOci, easy bool) *Hook {
func NewPopulatedLinux(r randyOci, easy bool) *Linux {
this := &Linux{}
if r.Intn(5) != 0 {
v24 := r.Intn(5)
this.UIDMappings = make([]LinuxIDMapping, v24)
for i := 0; i < v24; i++ {
v25 := NewPopulatedLinuxIDMapping(r, easy)
this.UIDMappings[i] = *v25
v30 := r.Intn(5)
this.UIDMappings = make([]LinuxIDMapping, v30)
for i := 0; i < v30; i++ {
v31 := NewPopulatedLinuxIDMapping(r, easy)
this.UIDMappings[i] = *v31
}
}
if r.Intn(5) != 0 {
v26 := r.Intn(5)
this.GIDMappings = make([]LinuxIDMapping, v26)
for i := 0; i < v26; i++ {
v27 := NewPopulatedLinuxIDMapping(r, easy)
this.GIDMappings[i] = *v27
v32 := r.Intn(5)
this.GIDMappings = make([]LinuxIDMapping, v32)
for i := 0; i < v32; i++ {
v33 := NewPopulatedLinuxIDMapping(r, easy)
this.GIDMappings[i] = *v33
}
}
if r.Intn(5) != 0 {
v28 := r.Intn(10)
v34 := r.Intn(10)
this.Sysctl = make(map[string]string)
for i := 0; i < v28; i++ {
for i := 0; i < v34; i++ {
this.Sysctl[randStringOci(r)] = randStringOci(r)
}
}
@@ -5336,33 +5436,33 @@ func NewPopulatedLinux(r randyOci, easy bool) *Linux {
}
this.CgroupsPath = string(randStringOci(r))
if r.Intn(5) != 0 {
v29 := r.Intn(5)
this.Namespaces = make([]LinuxNamespace, v29)
for i := 0; i < v29; i++ {
v30 := NewPopulatedLinuxNamespace(r, easy)
this.Namespaces[i] = *v30
v35 := r.Intn(5)
this.Namespaces = make([]LinuxNamespace, v35)
for i := 0; i < v35; i++ {
v36 := NewPopulatedLinuxNamespace(r, easy)
this.Namespaces[i] = *v36
}
}
if r.Intn(5) != 0 {
v31 := r.Intn(5)
this.Devices = make([]LinuxDevice, v31)
for i := 0; i < v31; i++ {
v32 := NewPopulatedLinuxDevice(r, easy)
this.Devices[i] = *v32
v37 := r.Intn(5)
this.Devices = make([]LinuxDevice, v37)
for i := 0; i < v37; i++ {
v38 := NewPopulatedLinuxDevice(r, easy)
this.Devices[i] = *v38
}
}
if r.Intn(5) != 0 {
this.Seccomp = NewPopulatedLinuxSeccomp(r, easy)
}
this.RootfsPropagation = string(randStringOci(r))
v33 := r.Intn(10)
this.MaskedPaths = make([]string, v33)
for i := 0; i < v33; i++ {
v39 := r.Intn(10)
this.MaskedPaths = make([]string, v39)
for i := 0; i < v39; i++ {
this.MaskedPaths[i] = string(randStringOci(r))
}
v34 := r.Intn(10)
this.ReadonlyPaths = make([]string, v34)
for i := 0; i < v34; i++ {
v40 := r.Intn(10)
this.ReadonlyPaths = make([]string, v40)
for i := 0; i < v40; i++ {
this.ReadonlyPaths[i] = string(randStringOci(r))
}
this.MountLabel = string(randStringOci(r))
@@ -5438,11 +5538,11 @@ func NewPopulatedLinuxDevice(r randyOci, easy bool) *LinuxDevice {
func NewPopulatedLinuxResources(r randyOci, easy bool) *LinuxResources {
this := &LinuxResources{}
if r.Intn(5) != 0 {
v35 := r.Intn(5)
this.Devices = make([]LinuxDeviceCgroup, v35)
for i := 0; i < v35; i++ {
v36 := NewPopulatedLinuxDeviceCgroup(r, easy)
this.Devices[i] = *v36
v41 := r.Intn(5)
this.Devices = make([]LinuxDeviceCgroup, v41)
for i := 0; i < v41; i++ {
v42 := NewPopulatedLinuxDeviceCgroup(r, easy)
this.Devices[i] = *v42
}
}
if r.Intn(5) != 0 {
@@ -5458,11 +5558,11 @@ func NewPopulatedLinuxResources(r randyOci, easy bool) *LinuxResources {
this.BlockIO = NewPopulatedLinuxBlockIO(r, easy)
}
if r.Intn(5) != 0 {
v37 := r.Intn(5)
this.HugepageLimits = make([]LinuxHugepageLimit, v37)
for i := 0; i < v37; i++ {
v38 := NewPopulatedLinuxHugepageLimit(r, easy)
this.HugepageLimits[i] = *v38
v43 := r.Intn(5)
this.HugepageLimits = make([]LinuxHugepageLimit, v43)
for i := 0; i < v43; i++ {
v44 := NewPopulatedLinuxHugepageLimit(r, easy)
this.HugepageLimits[i] = *v44
}
}
if r.Intn(5) != 0 {
@@ -5564,44 +5664,44 @@ func NewPopulatedLinuxBlockIO(r randyOci, easy bool) *LinuxBlockIO {
this := &LinuxBlockIO{}
this.Weight = uint32(r.Uint32())
this.LeafWeight = uint32(r.Uint32())
if r.Intn(5) != 0 {
v39 := r.Intn(5)
this.WeightDevice = make([]LinuxWeightDevice, v39)
for i := 0; i < v39; i++ {
v40 := NewPopulatedLinuxWeightDevice(r, easy)
this.WeightDevice[i] = *v40
}
}
if r.Intn(5) != 0 {
v41 := r.Intn(5)
this.ThrottleReadBpsDevice = make([]LinuxThrottleDevice, v41)
for i := 0; i < v41; i++ {
v42 := NewPopulatedLinuxThrottleDevice(r, easy)
this.ThrottleReadBpsDevice[i] = *v42
}
}
if r.Intn(5) != 0 {
v43 := r.Intn(5)
this.ThrottleWriteBpsDevice = make([]LinuxThrottleDevice, v43)
for i := 0; i < v43; i++ {
v44 := NewPopulatedLinuxThrottleDevice(r, easy)
this.ThrottleWriteBpsDevice[i] = *v44
}
}
if r.Intn(5) != 0 {
v45 := r.Intn(5)
this.ThrottleReadIOPSDevice = make([]LinuxThrottleDevice, v45)
this.WeightDevice = make([]LinuxWeightDevice, v45)
for i := 0; i < v45; i++ {
v46 := NewPopulatedLinuxThrottleDevice(r, easy)
this.ThrottleReadIOPSDevice[i] = *v46
v46 := NewPopulatedLinuxWeightDevice(r, easy)
this.WeightDevice[i] = *v46
}
}
if r.Intn(5) != 0 {
v47 := r.Intn(5)
this.ThrottleWriteIOPSDevice = make([]LinuxThrottleDevice, v47)
this.ThrottleReadBpsDevice = make([]LinuxThrottleDevice, v47)
for i := 0; i < v47; i++ {
v48 := NewPopulatedLinuxThrottleDevice(r, easy)
this.ThrottleWriteIOPSDevice[i] = *v48
this.ThrottleReadBpsDevice[i] = *v48
}
}
if r.Intn(5) != 0 {
v49 := r.Intn(5)
this.ThrottleWriteBpsDevice = make([]LinuxThrottleDevice, v49)
for i := 0; i < v49; i++ {
v50 := NewPopulatedLinuxThrottleDevice(r, easy)
this.ThrottleWriteBpsDevice[i] = *v50
}
}
if r.Intn(5) != 0 {
v51 := r.Intn(5)
this.ThrottleReadIOPSDevice = make([]LinuxThrottleDevice, v51)
for i := 0; i < v51; i++ {
v52 := NewPopulatedLinuxThrottleDevice(r, easy)
this.ThrottleReadIOPSDevice[i] = *v52
}
}
if r.Intn(5) != 0 {
v53 := r.Intn(5)
this.ThrottleWriteIOPSDevice = make([]LinuxThrottleDevice, v53)
for i := 0; i < v53; i++ {
v54 := NewPopulatedLinuxThrottleDevice(r, easy)
this.ThrottleWriteIOPSDevice[i] = *v54
}
}
if !easy && r.Intn(10) != 0 {
@@ -5645,11 +5745,11 @@ func NewPopulatedLinuxNetwork(r randyOci, easy bool) *LinuxNetwork {
this := &LinuxNetwork{}
this.ClassID = uint32(r.Uint32())
if r.Intn(5) != 0 {
v49 := r.Intn(5)
this.Priorities = make([]LinuxInterfacePriority, v49)
for i := 0; i < v49; i++ {
v50 := NewPopulatedLinuxInterfacePriority(r, easy)
this.Priorities[i] = *v50
v55 := r.Intn(5)
this.Priorities = make([]LinuxInterfacePriority, v55)
for i := 0; i < v55; i++ {
v56 := NewPopulatedLinuxInterfacePriority(r, easy)
this.Priorities[i] = *v56
}
}
if !easy && r.Intn(10) != 0 {
@@ -5681,22 +5781,22 @@ func NewPopulatedLinuxInterfacePriority(r randyOci, easy bool) *LinuxInterfacePr
func NewPopulatedLinuxSeccomp(r randyOci, easy bool) *LinuxSeccomp {
this := &LinuxSeccomp{}
this.DefaultAction = string(randStringOci(r))
v51 := r.Intn(10)
this.Architectures = make([]string, v51)
for i := 0; i < v51; i++ {
v57 := r.Intn(10)
this.Architectures = make([]string, v57)
for i := 0; i < v57; i++ {
this.Architectures[i] = string(randStringOci(r))
}
v52 := r.Intn(10)
this.Flags = make([]string, v52)
for i := 0; i < v52; i++ {
v58 := r.Intn(10)
this.Flags = make([]string, v58)
for i := 0; i < v58; i++ {
this.Flags[i] = string(randStringOci(r))
}
if r.Intn(5) != 0 {
v53 := r.Intn(5)
this.Syscalls = make([]LinuxSyscall, v53)
for i := 0; i < v53; i++ {
v54 := NewPopulatedLinuxSyscall(r, easy)
this.Syscalls[i] = *v54
v59 := r.Intn(5)
this.Syscalls = make([]LinuxSyscall, v59)
for i := 0; i < v59; i++ {
v60 := NewPopulatedLinuxSyscall(r, easy)
this.Syscalls[i] = *v60
}
}
if !easy && r.Intn(10) != 0 {
@@ -5719,9 +5819,9 @@ func NewPopulatedLinuxSeccompArg(r randyOci, easy bool) *LinuxSeccompArg {
func NewPopulatedLinuxSyscall(r randyOci, easy bool) *LinuxSyscall {
this := &LinuxSyscall{}
v55 := r.Intn(10)
this.Names = make([]string, v55)
for i := 0; i < v55; i++ {
v61 := r.Intn(10)
this.Names = make([]string, v61)
for i := 0; i < v61; i++ {
this.Names[i] = string(randStringOci(r))
}
this.Action = string(randStringOci(r))
@@ -5731,11 +5831,11 @@ func NewPopulatedLinuxSyscall(r randyOci, easy bool) *LinuxSyscall {
this.ErrnoRet = NewPopulatedLinuxSyscall_Errnoret(r, easy)
}
if r.Intn(5) != 0 {
v56 := r.Intn(5)
this.Args = make([]LinuxSeccompArg, v56)
for i := 0; i < v56; i++ {
v57 := NewPopulatedLinuxSeccompArg(r, easy)
this.Args[i] = *v57
v62 := r.Intn(5)
this.Args = make([]LinuxSeccompArg, v62)
for i := 0; i < v62; i++ {
v63 := NewPopulatedLinuxSeccompArg(r, easy)
this.Args[i] = *v63
}
}
if !easy && r.Intn(10) != 0 {
@@ -5777,9 +5877,9 @@ func randUTF8RuneOci(r randyOci) rune {
return rune(ru + 61)
}
func randStringOci(r randyOci) string {
v58 := r.Intn(100)
tmps := make([]rune, v58)
for i := 0; i < v58; i++ {
v64 := r.Intn(100)
tmps := make([]rune, v64)
for i := 0; i < v64; i++ {
tmps[i] = randUTF8RuneOci(r)
}
return string(tmps)
@@ -5801,11 +5901,11 @@ func randFieldOci(dAtA []byte, r randyOci, fieldNumber int, wire int) []byte {
switch wire {
case 0:
dAtA = encodeVarintPopulateOci(dAtA, uint64(key))
v59 := r.Int63()
v65 := r.Int63()
if r.Intn(2) == 0 {
v59 *= -1
v65 *= -1
}
dAtA = encodeVarintPopulateOci(dAtA, uint64(v59))
dAtA = encodeVarintPopulateOci(dAtA, uint64(v65))
case 1:
dAtA = encodeVarintPopulateOci(dAtA, uint64(key))
dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
@@ -6133,6 +6233,24 @@ func (m *Hooks) Size() (n int) {
n += 1 + l + sovOci(uint64(l))
}
}
if len(m.CreateRuntime) > 0 {
for _, e := range m.CreateRuntime {
l = e.Size()
n += 1 + l + sovOci(uint64(l))
}
}
if len(m.CreateContainer) > 0 {
for _, e := range m.CreateContainer {
l = e.Size()
n += 1 + l + sovOci(uint64(l))
}
}
if len(m.StartContainer) > 0 {
for _, e := range m.StartContainer {
l = e.Size()
n += 1 + l + sovOci(uint64(l))
}
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
@@ -6797,7 +6915,7 @@ func (this *Spec) String() string {
}
repeatedStringForMounts += "}"
keysForAnnotations := make([]string, 0, len(this.Annotations))
for k := range this.Annotations {
for k, _ := range this.Annotations {
keysForAnnotations = append(keysForAnnotations, k)
}
github_com_gogo_protobuf_sortkeys.Strings(keysForAnnotations)
@@ -6948,10 +7066,28 @@ func (this *Hooks) String() string {
repeatedStringForPoststop += strings.Replace(strings.Replace(f.String(), "Hook", "Hook", 1), `&`, ``, 1) + ","
}
repeatedStringForPoststop += "}"
repeatedStringForCreateRuntime := "[]Hook{"
for _, f := range this.CreateRuntime {
repeatedStringForCreateRuntime += strings.Replace(strings.Replace(f.String(), "Hook", "Hook", 1), `&`, ``, 1) + ","
}
repeatedStringForCreateRuntime += "}"
repeatedStringForCreateContainer := "[]Hook{"
for _, f := range this.CreateContainer {
repeatedStringForCreateContainer += strings.Replace(strings.Replace(f.String(), "Hook", "Hook", 1), `&`, ``, 1) + ","
}
repeatedStringForCreateContainer += "}"
repeatedStringForStartContainer := "[]Hook{"
for _, f := range this.StartContainer {
repeatedStringForStartContainer += strings.Replace(strings.Replace(f.String(), "Hook", "Hook", 1), `&`, ``, 1) + ","
}
repeatedStringForStartContainer += "}"
s := strings.Join([]string{`&Hooks{`,
`Prestart:` + repeatedStringForPrestart + `,`,
`Poststart:` + repeatedStringForPoststart + `,`,
`Poststop:` + repeatedStringForPoststop + `,`,
`CreateRuntime:` + repeatedStringForCreateRuntime + `,`,
`CreateContainer:` + repeatedStringForCreateContainer + `,`,
`StartContainer:` + repeatedStringForStartContainer + `,`,
`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
`}`,
}, "")
@@ -6996,7 +7132,7 @@ func (this *Linux) String() string {
}
repeatedStringForDevices += "}"
keysForSysctl := make([]string, 0, len(this.Sysctl))
for k := range this.Sysctl {
for k, _ := range this.Sysctl {
keysForSysctl = append(keysForSysctl, k)
}
github_com_gogo_protobuf_sortkeys.Strings(keysForSysctl)
@@ -9298,6 +9434,108 @@ func (m *Hooks) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field CreateRuntime", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowOci
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthOci
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthOci
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.CreateRuntime = append(m.CreateRuntime, Hook{})
if err := m.CreateRuntime[len(m.CreateRuntime)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 5:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field CreateContainer", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowOci
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthOci
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthOci
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.CreateContainer = append(m.CreateContainer, Hook{})
if err := m.CreateContainer[len(m.CreateContainer)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 6:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field StartContainer", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowOci
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthOci
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthOci
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.StartContainer = append(m.StartContainer, Hook{})
if err := m.StartContainer[len(m.StartContainer)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipOci(dAtA[iNdEx:])

View File

@@ -125,6 +125,10 @@ func (p *HybridVSockTTRPCMockImp) UpdateContainer(ctx context.Context, req *pb.U
return emptyResp, nil
}
func (p *HybridVSockTTRPCMockImp) UpdateEphemeralMounts(ctx context.Context, req *pb.UpdateEphemeralMountsRequest) (*gpb.Empty, error) {
return emptyResp, nil
}
func (p *HybridVSockTTRPCMockImp) RemoveContainer(ctx context.Context, req *pb.RemoveContainerRequest) (*gpb.Empty, error) {
return emptyResp, nil
}

View File

@@ -1797,7 +1797,7 @@ func (q *qemu) hotplugVFIODevice(ctx context.Context, device *config.VFIODev, op
return err
}
devID := device.ID
devID := *(*device).GetID()
machineType := q.HypervisorConfig().HypervisorMachineType
if op == AddDevice {
@@ -1814,29 +1814,31 @@ func (q *qemu) hotplugVFIODevice(ctx context.Context, device *config.VFIODev, op
// for pc machine type instead of bridge. This is useful for devices that require
// a large PCI BAR which is a currently a limitation with PCI bridges.
if q.state.HotplugVFIOOnRootBus {
// In case MachineType is q35, a PCIe device is hotplugged on a PCIe Root Port.
switch machineType {
case QemuQ35:
if device.IsPCIe && q.state.PCIeRootPort <= 0 {
q.Logger().WithField("dev-id", device.ID).Warn("VFIO device is a PCIe device. It's recommended to add the PCIe Root Port by setting the pcie_root_port parameter in the configuration for q35")
device.Bus = ""
switch (*device).GetType() {
case config.VFIOPCIDeviceNormalType, config.VFIOPCIDeviceMediatedType:
// In case MachineType is q35, a PCIe device is hotplugged on a PCIe Root Port.
pciDevice, ok := (*device).(config.VFIOPCIDev)
if !ok {
return fmt.Errorf("VFIO device %+v is not PCI, but its Type said otherwise", device)
}
default:
device.Bus = ""
}
switch machineType {
case QemuQ35:
if pciDevice.IsPCIe && q.state.PCIeRootPort <= 0 {
q.Logger().WithField("dev-id", (*device).GetID()).Warn("VFIO device is a PCIe device. It's recommended to add the PCIe Root Port by setting the pcie_root_port parameter in the configuration for q35")
pciDevice.Bus = ""
}
default:
pciDevice.Bus = ""
}
*device = pciDevice
switch device.Type {
case config.VFIODeviceNormalType:
err = q.qmpMonitorCh.qmp.ExecuteVFIODeviceAdd(q.qmpMonitorCh.ctx, devID, device.BDF, device.Bus, romFile)
case config.VFIODeviceMediatedType:
if utils.IsAPVFIOMediatedDevice(device.SysfsDev) {
err = q.qmpMonitorCh.qmp.ExecuteAPVFIOMediatedDeviceAdd(q.qmpMonitorCh.ctx, device.SysfsDev)
if pciDevice.Type == config.VFIOPCIDeviceNormalType {
err = q.qmpMonitorCh.qmp.ExecuteVFIODeviceAdd(q.qmpMonitorCh.ctx, devID, pciDevice.BDF, pciDevice.Bus, romFile)
} else {
err = q.qmpMonitorCh.qmp.ExecutePCIVFIOMediatedDeviceAdd(q.qmpMonitorCh.ctx, devID, device.SysfsDev, "", device.Bus, romFile)
err = q.qmpMonitorCh.qmp.ExecutePCIVFIOMediatedDeviceAdd(q.qmpMonitorCh.ctx, devID, *(*device).GetSysfsDev(), "", pciDevice.Bus, romFile)
}
default:
return fmt.Errorf("Incorrect VFIO device type found")
case config.VFIOAPDeviceMediatedType:
err = q.qmpMonitorCh.qmp.ExecuteAPVFIOMediatedDeviceAdd(q.qmpMonitorCh.ctx, *(*device).GetSysfsDev())
}
} else {
addr, bridge, err := q.arch.addDeviceToBridge(ctx, devID, types.PCI)
@@ -1850,15 +1852,17 @@ func (q *qemu) hotplugVFIODevice(ctx context.Context, device *config.VFIODev, op
}
}()
switch device.Type {
case config.VFIODeviceNormalType:
err = q.qmpMonitorCh.qmp.ExecutePCIVFIODeviceAdd(q.qmpMonitorCh.ctx, devID, device.BDF, addr, bridge.ID, romFile)
case config.VFIODeviceMediatedType:
if utils.IsAPVFIOMediatedDevice(device.SysfsDev) {
err = q.qmpMonitorCh.qmp.ExecuteAPVFIOMediatedDeviceAdd(q.qmpMonitorCh.ctx, device.SysfsDev)
} else {
err = q.qmpMonitorCh.qmp.ExecutePCIVFIOMediatedDeviceAdd(q.qmpMonitorCh.ctx, devID, device.SysfsDev, addr, bridge.ID, romFile)
switch (*device).GetType() {
case config.VFIOPCIDeviceNormalType:
pciDevice, ok := (*device).(config.VFIOPCIDev)
if !ok {
return fmt.Errorf("VFIO device %+v is not PCI, but its Type said otherwise", device)
}
err = q.qmpMonitorCh.qmp.ExecutePCIVFIODeviceAdd(q.qmpMonitorCh.ctx, devID, pciDevice.BDF, addr, bridge.ID, romFile)
case config.VFIOPCIDeviceMediatedType:
err = q.qmpMonitorCh.qmp.ExecutePCIVFIOMediatedDeviceAdd(q.qmpMonitorCh.ctx, devID, *(*device).GetSysfsDev(), addr, bridge.ID, romFile)
case config.VFIOAPDeviceMediatedType:
err = q.qmpMonitorCh.qmp.ExecuteAPVFIOMediatedDeviceAdd(q.qmpMonitorCh.ctx, *(*device).GetSysfsDev())
default:
return fmt.Errorf("Incorrect VFIO device type found")
}
@@ -1866,13 +1870,24 @@ func (q *qemu) hotplugVFIODevice(ctx context.Context, device *config.VFIODev, op
if err != nil {
return err
}
// XXX: Depending on whether we're doing root port or
// bridge hotplug, and how the bridge is set up in
// other parts of the code, we may or may not already
// have information about the slot number of the
// bridge and or the device. For simplicity, just
// query both of them back from qemu
device.GuestPciPath, err = q.qomGetPciPath(devID)
switch (*device).GetType() {
case config.VFIOPCIDeviceNormalType, config.VFIOPCIDeviceMediatedType:
pciDevice, ok := (*device).(config.VFIOPCIDev)
if !ok {
return fmt.Errorf("VFIO device %+v is not PCI, but its Type said otherwise", device)
}
// XXX: Depending on whether we're doing root port or
// bridge hotplug, and how the bridge is set up in
// other parts of the code, we may or may not already
// have information about the slot number of the
// bridge and or the device. For simplicity, just
// query both of them back from qemu
guestPciPath, err := q.qomGetPciPath(devID)
pciDevice.GuestPciPath = guestPciPath
*device = pciDevice
return err
}
return err
} else {
q.Logger().WithField("dev-id", devID).Info("Start hot-unplug VFIO device")

View File

@@ -708,16 +708,17 @@ func (q *qemuArchBase) appendVhostUserDevice(ctx context.Context, devices []govm
}
func (q *qemuArchBase) appendVFIODevice(devices []govmmQemu.Device, vfioDev config.VFIODev) []govmmQemu.Device {
if vfioDev.BDF == "" {
pciDevice := vfioDev.(config.VFIOPCIDev)
if pciDevice.BDF == "" {
return devices
}
devices = append(devices,
govmmQemu.VFIODevice{
BDF: vfioDev.BDF,
VendorID: vfioDev.VendorID,
DeviceID: vfioDev.DeviceID,
Bus: vfioDev.Bus,
BDF: pciDevice.BDF,
VendorID: pciDevice.VendorID,
DeviceID: pciDevice.DeviceID,
Bus: pciDevice.Bus,
},
)

View File

@@ -463,7 +463,7 @@ func TestQemuArchBaseAppendVFIODevice(t *testing.T) {
},
}
vfDevice := config.VFIODev{
vfDevice := config.VFIOPCIDev{
BDF: bdf,
}
@@ -483,7 +483,7 @@ func TestQemuArchBaseAppendVFIODeviceWithVendorDeviceID(t *testing.T) {
},
}
vfDevice := config.VFIODev{
vfDevice := config.VFIOPCIDev{
BDF: bdf,
VendorID: vendorID,
DeviceID: deviceID,

View File

@@ -17,7 +17,9 @@ import (
"os"
"os/exec"
"path/filepath"
//"strconv"
"strings"
"sync"
"syscall"
@@ -48,6 +50,9 @@ import (
"github.com/kata-containers/kata-containers/src/runtime/virtcontainers/pkg/rootless"
"github.com/kata-containers/kata-containers/src/runtime/virtcontainers/types"
"github.com/kata-containers/kata-containers/src/runtime/virtcontainers/utils"
"google.golang.org/grpc/codes"
grpcStatus "google.golang.org/grpc/status"
)
// sandboxTracingTags defines tags for the trace span
@@ -1864,11 +1869,15 @@ func (s *Sandbox) HotplugAddDevice(ctx context.Context, device api.Device, devTy
// adding a group of VFIO devices
for _, dev := range vfioDevices {
if _, err := s.hypervisor.HotplugAddDevice(ctx, dev, VfioDev); err != nil {
bdf := ""
if pciDevice, ok := (*dev).(config.VFIOPCIDev); ok {
bdf = pciDevice.BDF
}
s.Logger().
WithFields(logrus.Fields{
"sandbox": s.id,
"vfio-device-ID": dev.ID,
"vfio-device-BDF": dev.BDF,
"vfio-device-ID": (*dev).GetID(),
"vfio-device-BDF": bdf,
}).WithError(err).Error("failed to hotplug VFIO device")
return err
}
@@ -1917,11 +1926,15 @@ func (s *Sandbox) HotplugRemoveDevice(ctx context.Context, device api.Device, de
// remove a group of VFIO devices
for _, dev := range vfioDevices {
if _, err := s.hypervisor.HotplugRemoveDevice(ctx, dev, VfioDev); err != nil {
bdf := ""
if pciDevice, ok := (*dev).(config.VFIOPCIDev); ok {
bdf = pciDevice.BDF
}
s.Logger().WithError(err).
WithFields(logrus.Fields{
"sandbox": s.id,
"vfio-device-ID": dev.ID,
"vfio-device-BDF": dev.BDF,
"vfio-device-ID": (*dev).GetID(),
"vfio-device-BDF": bdf,
}).Error("failed to hot unplug VFIO device")
return err
}
@@ -2121,11 +2134,69 @@ func (s *Sandbox) updateResources(ctx context.Context) error {
if newMemoryMB == finalMemoryMB {
break
}
}
tmpfsMounts, err := s.prepareEphemeralMounts(finalMemoryMB)
if err != nil {
return err
}
if err := s.agent.updateEphemeralMounts(ctx, tmpfsMounts); err != nil {
// upgrade path: if runtime is newer version, but agent is old
// then ignore errUnimplemented
if grpcStatus.Convert(err).Code() == codes.Unimplemented {
s.Logger().Warnf("agent does not support updateMounts")
return nil
}
return err
}
return nil
}
func (s *Sandbox) prepareEphemeralMounts(memoryMB uint32) ([]*grpc.Storage, error) {
tmpfsMounts := []*grpc.Storage{}
for _, c := range s.containers {
for _, mount := range c.mounts {
// if a tmpfs ephemeral mount is present
// update its size to occupy the entire sandbox's memory
if mount.Type == KataEphemeralDevType {
sizeLimited := false
for _, opt := range mount.Options {
if strings.HasPrefix(opt, "size") {
sizeLimited = true
}
}
if sizeLimited { // do not resize sizeLimited emptyDirs
continue
}
mountOptions := []string{"remount", fmt.Sprintf("size=%dM", memoryMB)}
origin_src := mount.Source
stat := syscall.Stat_t{}
err := syscall.Stat(origin_src, &stat)
if err != nil {
return nil, err
}
// if volume's gid isn't root group(default group), this means there's
// an specific fsGroup is set on this local volume, then it should pass
// to guest.
if stat.Gid != 0 {
mountOptions = append(mountOptions, fmt.Sprintf("%s=%d", fsGid, stat.Gid))
}
tmpfsMounts = append(tmpfsMounts, &grpc.Storage{
Driver: KataEphemeralDevType,
MountPoint: filepath.Join(ephemeralPath(), filepath.Base(mount.Source)),
Source: "tmpfs",
Fstype: "tmpfs",
Options: mountOptions,
})
}
}
}
return tmpfsMounts, nil
}
func (s *Sandbox) updateMemory(ctx context.Context, newMemoryMB uint32) error {

View File

@@ -179,6 +179,65 @@ func TestCalculateSandboxMem(t *testing.T) {
}
}
func TestPrepareEphemeralMounts(t *testing.T) {
sandbox := &Sandbox{}
sandbox.containers = map[string]*Container{
"container1": {
mounts: []Mount{
{
// happy path
Type: KataEphemeralDevType,
Options: []string{
"rw",
"relatime",
},
Source: "/tmp",
},
{
// should be ignored because it is not KataEphemeralDevType
Type: KataLocalDevType,
Options: []string{
"rw",
"relatime",
},
Source: "/tmp",
},
{
// should be ignored because it is sizeLimited
Type: KataLocalDevType,
Options: []string{
"rw",
"relatime",
"size=1M",
},
Source: "/tmp",
},
},
},
}
storages, err := sandbox.prepareEphemeralMounts(1024)
assert.NoError(t, err)
assert.Equal(t, len(storages), 1)
for _, s := range storages {
assert.Equal(t, s.Driver, KataEphemeralDevType)
assert.Equal(t, s.Source, "tmpfs")
assert.Equal(t, s.Fstype, "tmpfs")
assert.Equal(t, s.MountPoint, filepath.Join(ephemeralPath(), "tmp"))
assert.Equal(t, len(s.Options), 2) // remount, size=1024M
validSet := map[string]struct{}{
"remount": {},
"size=1024M": {},
}
for _, opt := range s.Options {
if _, ok := validSet[opt]; !ok {
t.Error("invalid mount opt: " + opt)
}
}
}
}
func TestCalculateSandboxMemHandlesNegativeLimits(t *testing.T) {
sandbox := &Sandbox{}
sandbox.config = &SandboxConfig{}

View File

@@ -89,8 +89,7 @@ func FindContextID() (*os.File, uint64, error) {
const (
procMountsFile = "/proc/mounts"
fieldsPerLine = 6
vfioAPSysfsDir = "vfio_ap"
fieldsPerLine = 6
)
const (
@@ -142,18 +141,6 @@ func GetDevicePathAndFsTypeOptions(mountPoint string) (devicePath, fsType string
}
}
// IsAPVFIOMediatedDevice decides whether a device is a VFIO-AP device
// by checking for the existence of "vfio_ap" in the path
func IsAPVFIOMediatedDevice(sysfsdev string) bool {
split := strings.Split(sysfsdev, string(os.PathSeparator))
for _, el := range split {
if el == vfioAPSysfsDir {
return true
}
}
return false
}
func waitProcessUsingPidfd(pid int, timeoutSecs uint, logger *logrus.Entry) (bool, error) {
pidfd, err := unix.PidfdOpen(pid, 0)

View File

@@ -63,19 +63,3 @@ func TestGetDevicePathAndFsTypeOptionsSuccessful(t *testing.T) {
assert.Equal(fstype, fstypeOut)
assert.Equal(fsOptions, optsOut)
}
func TestIsAPVFIOMediatedDeviceFalse(t *testing.T) {
assert := assert.New(t)
// Should be false for a PCI device
isAPMdev := IsAPVFIOMediatedDevice("/sys/bus/pci/devices/0000:00:02.0/a297db4a-f4c2-11e6-90f6-d3b88d6c9525")
assert.False(isAPMdev)
}
func TestIsAPVFIOMediatedDeviceTrue(t *testing.T) {
assert := assert.New(t)
// Typical AP sysfsdev
isAPMdev := IsAPVFIOMediatedDevice("/sys/devices/vfio_ap/matrix/a297db4a-f4c2-11e6-90f6-d3b88d6c9525")
assert.True(isAPMdev)
}