vendor: update govmm and agent changes

To support tap network hotplug. Implement netdev_add, netdev_del and corresponding device_add QMP commands.
Full list in govmm:
    10efa84 qemu/qmp: add function for hotplug network by fds
    80ed88e qemu/qmp: implement function to hotplug serial ports
    ca46f21 qemu/qmp: implement function to hotplug character devices
    03f1a1c qemu/qmp: implement getfd
    84b212f qemu: add vhostfd and disable-modern to vsock hotplug
    12dfa87 qemu/qmp: implement function for hotplug network
    4ca232e qmp_test: Fix Warning and Error level logs
    430e72c qemu,qmp: Enable gas security checker
    ffc06e6 qemu,qmp: Add staticcheck to travis and fix errors

Add agent ListInterfaces and ListRoutes APIs.
Full list in agent:
    7c287c6 agent: add ListInterfaces and ListRoutes rpc

Signed-off-by: Ruidong Cao <caoruidong@huawei.com>
This commit is contained in:
Ruidong 2018-07-27 14:01:19 +08:00 committed by Ruidong Cao
parent cd514b69fd
commit 6666426739
6 changed files with 706 additions and 196 deletions

8
Gopkg.lock generated
View File

@ -115,21 +115,21 @@
revision = "3520598351bb3500a49ae9563f5539666ae0a27c"
[[projects]]
digest = "1:28e35e3d543955b2cb091308a4aeb3400ba66510dde85743719772c677482183"
digest = "1:a801632523299b53fbd954449f36020cf751e4bd6fe2d923e3416e8f0603b4af"
name = "github.com/intel/govmm"
packages = ["qemu"]
pruneopts = "NUT"
revision = "6ff20ae2f409df976574d0139b5ec2fa3e314769"
revision = "eda239928bfa12b214e9c93192d548cccf4e7f1e"
[[projects]]
digest = "1:b06e09c4554e80f208a583009e54369d109549501b776ca9fc6d59968c68aa29"
digest = "1:f2f0d25f32da7843fa4cdc2becb88eea9d1aa9f9c4167431b4c1cd1c3b7fb17c"
name = "github.com/kata-containers/agent"
packages = [
"protocols/client",
"protocols/grpc",
]
pruneopts = "NUT"
revision = "eec68398287d9491fe648a8e54fb942cf6b6d934"
revision = "e6d26c1bbbaf1c7292b1ee5dfa17ca13159f73b7"
[[projects]]
digest = "1:04054595e5c5a35d1553a7f3464d18577caf597445d643992998643df56d4afd"

View File

@ -52,11 +52,11 @@
[[constraint]]
name = "github.com/intel/govmm"
revision = "6ff20ae2f409df976574d0139b5ec2fa3e314769"
revision = "eda239928bfa12b214e9c93192d548cccf4e7f1e"
[[constraint]]
name = "github.com/kata-containers/agent"
revision = "eec68398287d9491fe648a8e54fb942cf6b6d934"
revision = "e6d26c1bbbaf1c7292b1ee5dfa17ca13159f73b7"
[[constraint]]
name = "github.com/containerd/cri-containerd"

View File

@ -45,9 +45,11 @@ func CreateCloudInitISO(ctx context.Context, scratchDir, isoPath string,
userDataPath := path.Join(dataDirPath, "user_data")
defer func() {
/* #nosec */
_ = os.RemoveAll(configDrivePath)
}()
/* #nosec */
err := os.MkdirAll(dataDirPath, 0755)
if err != nil {
return fmt.Errorf("Unable to create config drive directory %s : %v",

View File

@ -63,28 +63,28 @@ const (
NVDIMM DeviceDriver = "nvdimm"
// Virtio9P is the 9pfs device driver.
Virtio9P = "virtio-9p-pci"
Virtio9P DeviceDriver = "virtio-9p-pci"
// VirtioNet is the virt-io networking device driver.
VirtioNet = "virtio-net"
VirtioNet DeviceDriver = "virtio-net"
// VirtioNetPCI is the virt-io pci networking device driver.
VirtioNetPCI = "virtio-net-pci"
VirtioNetPCI DeviceDriver = "virtio-net-pci"
// VirtioSerial is the serial device driver.
VirtioSerial = "virtio-serial-pci"
VirtioSerial DeviceDriver = "virtio-serial-pci"
// VirtioBlock is the block device driver.
VirtioBlock = "virtio-blk"
VirtioBlock DeviceDriver = "virtio-blk"
// Console is the console device driver.
Console = "virtconsole"
Console DeviceDriver = "virtconsole"
// VirtioSerialPort is the serial port device driver.
VirtioSerialPort = "virtserialport"
VirtioSerialPort DeviceDriver = "virtserialport"
// VHostVSockPCI is the vhost vsock pci driver.
VHostVSockPCI = "vhost-vsock-pci"
VHostVSockPCI DeviceDriver = "vhost-vsock-pci"
)
// ObjectType is a string representing a qemu object type.
@ -171,10 +171,10 @@ const (
Local FSDriver = "local"
// Handle is the handle qemu filesystem driver.
Handle = "handle"
Handle FSDriver = "handle"
// Proxy is the proxy qemu filesystem driver.
Proxy = "proxy"
Proxy FSDriver = "proxy"
)
const (
@ -182,13 +182,13 @@ const (
None SecurityModelType = "none"
// PassThrough uses the same credentials on both the host and guest.
PassThrough = "passthrough"
PassThrough SecurityModelType = "passthrough"
// MappedXattr stores some files attributes as extended attributes.
MappedXattr = "mapped-xattr"
MappedXattr SecurityModelType = "mapped-xattr"
// MappedFile stores some files attributes in the .virtfs directory.
MappedFile = "mapped-file"
MappedFile SecurityModelType = "mapped-file"
)
// FSDevice represents a qemu filesystem configuration.
@ -259,19 +259,19 @@ const (
Pipe CharDeviceBackend = "pipe"
// Socket creates a 2 way stream socket (TCP or Unix).
Socket = "socket"
Socket CharDeviceBackend = "socket"
// CharConsole sends traffic from the guest to QEMU's standard output.
CharConsole = "console"
CharConsole CharDeviceBackend = "console"
// Serial sends traffic from the guest to a serial device on the host.
Serial = "serial"
Serial CharDeviceBackend = "serial"
// TTY is an alias for Serial.
TTY = "tty"
TTY CharDeviceBackend = "tty"
// PTY creates a new pseudo-terminal on the host and connect to it.
PTY = "pty"
PTY CharDeviceBackend = "pty"
)
// CharDevice represents a qemu character device.
@ -348,19 +348,19 @@ const (
TAP NetDeviceType = "tap"
// MACVTAP is a macvtap networking device type.
MACVTAP = "macvtap"
MACVTAP NetDeviceType = "macvtap"
// IPVTAP is a ipvtap virtual networking device type.
IPVTAP = "ipvtap"
IPVTAP NetDeviceType = "ipvtap"
// VETHTAP is a veth-tap virtual networking device type.
VETHTAP = "vethtap"
VETHTAP NetDeviceType = "vethtap"
// VFIO is a direct assigned PCI device or PCI VF
VFIO = "VFIO"
VFIO NetDeviceType = "VFIO"
// VHOSTUSER is a vhost-user port (socket)
VHOSTUSER = "vhostuser"
VHOSTUSER NetDeviceType = "vhostuser"
)
// QemuNetdevParam converts to the QEMU -netdev parameter notation
@ -637,7 +637,7 @@ const (
NoInterface BlockDeviceInterface = "none"
// SCSI represents a SCSI block device interface.
SCSI = "scsi"
SCSI BlockDeviceInterface = "scsi"
)
const (
@ -645,7 +645,7 @@ const (
Threads BlockDeviceAIO = "threads"
// Native is the pthread asynchronous I/O implementation.
Native = "native"
Native BlockDeviceAIO = "native"
)
const (
@ -976,7 +976,9 @@ type VSOCKDevice struct {
const (
// MinimalGuestCID is the smallest valid context ID for a guest.
MinimalGuestCID uint32 = 3
)
const (
// VhostVSOCKPCI is the VSOCK vhost device type.
VhostVSOCKPCI = "vhost-vsock-pci"
@ -1029,7 +1031,7 @@ const (
UTC RTCBaseType = "utc"
// LocalTime is the local base time for qemu RTC.
LocalTime = "localtime"
LocalTime RTCBaseType = "localtime"
)
const (
@ -1037,7 +1039,7 @@ const (
Host RTCClock = "host"
// VM is for using the guest clock as a reference
VM = "vm"
VM RTCClock = "vm"
)
const (
@ -1045,7 +1047,7 @@ const (
Slew RTCDriftFix = "slew"
// NoDriftFix means we don't want/need to fix qemu's RTC drift.
NoDriftFix = "none"
NoDriftFix RTCDriftFix = "none"
)
// RTC represents a qemu Real Time Clock configuration.
@ -1669,6 +1671,7 @@ func LaunchCustomQemu(ctx context.Context, path string, params []string, fds []*
path = "qemu-system-x86_64"
}
/* #nosec */
cmd := exec.Command(path, params...)
if len(fds) > 0 {
logger.Infof("Adding extra file %v", fds)

View File

@ -24,9 +24,12 @@ import (
"fmt"
"io"
"net"
"os"
"syscall"
"time"
"context"
"strings"
)
// QMPLog is a logging interface used by the qemu package to log various
@ -118,6 +121,7 @@ type qmpCommand struct {
args map[string]interface{}
filter *qmpEventFilter
resultReceived bool
oob []byte
}
// QMP is a structure that contains the internal state used by startQMPLoop and
@ -302,7 +306,12 @@ func (q *QMP) writeNextQMPCommand(cmdQueue *list.List) {
}
q.cfg.Logger.Infof("%s", string(encodedCmd))
encodedCmd = append(encodedCmd, '\n')
if unixConn, ok := q.conn.(*net.UnixConn); ok && len(cmd.oob) > 0 {
_, _, err = unixConn.WriteMsgUnix(encodedCmd, cmd.oob, nil)
} else {
_, err = q.conn.Write(encodedCmd)
}
if err != nil {
cmd.res <- qmpResult{
err: fmt.Errorf("Unable to write command to qmp socket %v", err),
@ -409,13 +418,14 @@ func (q *QMP) mainLoop() {
if q.cfg.EventCh != nil {
close(q.cfg.EventCh)
}
/* #nosec */
_ = q.conn.Close()
_ = <-fromVMCh
failOutstandingCommands(cmdQueue)
close(q.disconnectedCh)
}()
version := []byte{}
var version []byte
var cmdDoneCh <-chan struct{}
DONE:
@ -485,7 +495,7 @@ func startQMPLoop(conn io.ReadWriteCloser, cfg QMPConfig,
}
func (q *QMP) executeCommandWithResponse(ctx context.Context, name string, args map[string]interface{},
filter *qmpEventFilter) (interface{}, error) {
oob []byte, filter *qmpEventFilter) (interface{}, error) {
var err error
var response interface{}
resCh := make(chan qmpResult)
@ -498,6 +508,7 @@ func (q *QMP) executeCommandWithResponse(ctx context.Context, name string, args
name: name,
args: args,
filter: filter,
oob: oob,
}:
}
@ -519,7 +530,7 @@ func (q *QMP) executeCommandWithResponse(ctx context.Context, name string, args
func (q *QMP) executeCommand(ctx context.Context, name string, args map[string]interface{},
filter *qmpEventFilter) error {
_, err := q.executeCommandWithResponse(ctx, name, args, filter)
_, err := q.executeCommandWithResponse(ctx, name, args, nil, filter)
return err
}
@ -727,6 +738,68 @@ func (q *QMP) ExecuteBlockdevDel(ctx context.Context, blockdevID string) error {
return q.executeCommand(ctx, "x-blockdev-del", args, nil)
}
// ExecuteNetdevAdd adds a Net device to a QEMU instance
// using the netdev_add command. netdevID is the id of the device to add.
// Must be valid QMP identifier.
func (q *QMP) ExecuteNetdevAdd(ctx context.Context, netdevType, netdevID, ifname, downscript, script string, queues int) error {
args := map[string]interface{}{
"type": netdevType,
"id": netdevID,
"ifname": ifname,
"downscript": downscript,
"script": script,
}
if queues > 1 {
args["queues"] = queues
}
return q.executeCommand(ctx, "netdev_add", args, nil)
}
// ExecuteNetdevAddByFds adds a Net device to a QEMU instance
// using the netdev_add command by fds and vhostfds. netdevID is the id of the device to add.
// Must be valid QMP identifier.
func (q *QMP) ExecuteNetdevAddByFds(ctx context.Context, netdevType, netdevID string, fdNames, vhostFdNames []string) error {
fdNameStr := strings.Join(fdNames, ":")
vhostFdNameStr := strings.Join(vhostFdNames, ":")
args := map[string]interface{}{
"type": netdevType,
"id": netdevID,
"fds": fdNameStr,
"vhost": "on",
"vhostfds": vhostFdNameStr,
}
return q.executeCommand(ctx, "netdev_add", args, nil)
}
// ExecuteNetdevDel deletes a Net device from a QEMU instance
// using the netdev_del command. netdevID is the id of the device to delete.
func (q *QMP) ExecuteNetdevDel(ctx context.Context, netdevID string) error {
args := map[string]interface{}{
"id": netdevID,
}
return q.executeCommand(ctx, "netdev_del", args, nil)
}
// ExecuteNetPCIDeviceAdd adds a Net PCI device to a QEMU instance
// using the device_add command. devID is the id of the device to add.
// Must be valid QMP identifier. netdevID is the id of nic added by previous netdev_add.
func (q *QMP) ExecuteNetPCIDeviceAdd(ctx context.Context, netdevID, devID, macAddr, addr, bus string) error {
args := map[string]interface{}{
"id": devID,
"driver": VirtioNetPCI,
"netdev": netdevID,
"mac": macAddr,
"addr": addr,
}
if bus != "" {
args["bus"] = bus
}
return q.executeCommand(ctx, "device_add", args, nil)
}
// ExecuteDeviceDel deletes guest portion of a QEMU device by sending a
// device_del command. devId is the identifier of the device to delete.
// Typically it would match the devID parameter passed to an earlier call
@ -809,7 +882,7 @@ func (q *QMP) ExecuteCPUDeviceAdd(ctx context.Context, driver, cpuID, socketID,
// ExecuteQueryHotpluggableCPUs returns a slice with the list of hotpluggable CPUs
func (q *QMP) ExecuteQueryHotpluggableCPUs(ctx context.Context) ([]HotpluggableCPU, error) {
response, err := q.executeCommandWithResponse(ctx, "query-hotpluggable-cpus", nil, nil)
response, err := q.executeCommandWithResponse(ctx, "query-hotpluggable-cpus", nil, nil, nil)
if err != nil {
return nil, err
}
@ -883,11 +956,65 @@ func (q *QMP) ExecHotplugMemory(ctx context.Context, qomtype, id, mempath string
}
// ExecutePCIVSockAdd adds a vhost-vsock-pci bus
func (q *QMP) ExecutePCIVSockAdd(ctx context.Context, id, guestCID string) error {
func (q *QMP) ExecutePCIVSockAdd(ctx context.Context, id, guestCID, vhostfd string, disableModern bool) error {
args := map[string]interface{}{
"driver": VHostVSockPCI,
"id": id,
"guest-cid": guestCID,
"vhostfd": vhostfd,
}
if disableModern {
args["disable-modern"] = disableModern
}
return q.executeCommand(ctx, "device_add", args, nil)
}
// ExecuteGetFD sends a file descriptor via SCM rights and assigns it a name
func (q *QMP) ExecuteGetFD(ctx context.Context, fdname string, fd *os.File) error {
oob := syscall.UnixRights(int(fd.Fd()))
args := map[string]interface{}{
"fdname": fdname,
}
_, err := q.executeCommandWithResponse(ctx, "getfd", args, oob, nil)
return err
}
// ExecuteCharDevUnixSocketAdd adds a character device using as backend a unix socket,
// id is an identifier for the device, path specifies the local path of the unix socket,
// wait is to block waiting for a client to connect, server specifies that the socket is a listening socket.
func (q *QMP) ExecuteCharDevUnixSocketAdd(ctx context.Context, id, path string, wait, server bool) error {
args := map[string]interface{}{
"id": id,
"backend": map[string]interface{}{
"type": "socket",
"data": map[string]interface{}{
"wait": wait,
"server": server,
"addr": map[string]interface{}{
"type": "unix",
"data": map[string]interface{}{
"path": path,
},
},
},
},
}
return q.executeCommand(ctx, "chardev-add", args, nil)
}
// ExecuteVirtSerialPortAdd adds a virtserialport.
// id is an identifier for the virtserialport, name is a name for the virtserialport and
// it will be visible in the VM, chardev is the character device id previously added.
func (q *QMP) ExecuteVirtSerialPortAdd(ctx context.Context, id, name, chardev string) error {
args := map[string]interface{}{
"driver": VirtioSerialPort,
"id": id,
"name": name,
"chardev": chardev,
}
return q.executeCommand(ctx, "device_add", args, nil)
}

View File

@ -44,12 +44,15 @@
DestroySandboxRequest
IPAddress
Interface
Interfaces
Route
Routes
UpdateInterfaceRequest
AddInterfaceRequest
RemoveInterfaceRequest
UpdateRoutesRequest
ListInterfacesRequest
ListRoutesRequest
OnlineCPUMemRequest
ReseedRandomDevRequest
Storage
@ -1212,6 +1215,22 @@ func (m *Interface) GetHwAddr() string {
return ""
}
type Interfaces struct {
Interfaces []*Interface `protobuf:"bytes,1,rep,name=Interfaces" json:"Interfaces,omitempty"`
}
func (m *Interfaces) Reset() { *m = Interfaces{} }
func (m *Interfaces) String() string { return proto.CompactTextString(m) }
func (*Interfaces) ProtoMessage() {}
func (*Interfaces) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{34} }
func (m *Interfaces) GetInterfaces() []*Interface {
if m != nil {
return m.Interfaces
}
return nil
}
type Route struct {
Dest string `protobuf:"bytes,1,opt,name=dest,proto3" json:"dest,omitempty"`
Gateway string `protobuf:"bytes,2,opt,name=gateway,proto3" json:"gateway,omitempty"`
@ -1223,7 +1242,7 @@ type Route struct {
func (m *Route) Reset() { *m = Route{} }
func (m *Route) String() string { return proto.CompactTextString(m) }
func (*Route) ProtoMessage() {}
func (*Route) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{34} }
func (*Route) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{35} }
func (m *Route) GetDest() string {
if m != nil {
@ -1267,7 +1286,7 @@ type Routes struct {
func (m *Routes) Reset() { *m = Routes{} }
func (m *Routes) String() string { return proto.CompactTextString(m) }
func (*Routes) ProtoMessage() {}
func (*Routes) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{35} }
func (*Routes) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{36} }
func (m *Routes) GetRoutes() []*Route {
if m != nil {
@ -1283,7 +1302,7 @@ type UpdateInterfaceRequest struct {
func (m *UpdateInterfaceRequest) Reset() { *m = UpdateInterfaceRequest{} }
func (m *UpdateInterfaceRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateInterfaceRequest) ProtoMessage() {}
func (*UpdateInterfaceRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{36} }
func (*UpdateInterfaceRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{37} }
func (m *UpdateInterfaceRequest) GetInterface() *Interface {
if m != nil {
@ -1299,7 +1318,7 @@ type AddInterfaceRequest struct {
func (m *AddInterfaceRequest) Reset() { *m = AddInterfaceRequest{} }
func (m *AddInterfaceRequest) String() string { return proto.CompactTextString(m) }
func (*AddInterfaceRequest) ProtoMessage() {}
func (*AddInterfaceRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{37} }
func (*AddInterfaceRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{38} }
func (m *AddInterfaceRequest) GetInterface() *Interface {
if m != nil {
@ -1315,7 +1334,7 @@ type RemoveInterfaceRequest struct {
func (m *RemoveInterfaceRequest) Reset() { *m = RemoveInterfaceRequest{} }
func (m *RemoveInterfaceRequest) String() string { return proto.CompactTextString(m) }
func (*RemoveInterfaceRequest) ProtoMessage() {}
func (*RemoveInterfaceRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{38} }
func (*RemoveInterfaceRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{39} }
func (m *RemoveInterfaceRequest) GetInterface() *Interface {
if m != nil {
@ -1331,7 +1350,7 @@ type UpdateRoutesRequest struct {
func (m *UpdateRoutesRequest) Reset() { *m = UpdateRoutesRequest{} }
func (m *UpdateRoutesRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateRoutesRequest) ProtoMessage() {}
func (*UpdateRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{39} }
func (*UpdateRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{40} }
func (m *UpdateRoutesRequest) GetRoutes() *Routes {
if m != nil {
@ -1340,6 +1359,22 @@ func (m *UpdateRoutesRequest) GetRoutes() *Routes {
return nil
}
type ListInterfacesRequest struct {
}
func (m *ListInterfacesRequest) Reset() { *m = ListInterfacesRequest{} }
func (m *ListInterfacesRequest) String() string { return proto.CompactTextString(m) }
func (*ListInterfacesRequest) ProtoMessage() {}
func (*ListInterfacesRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{41} }
type ListRoutesRequest struct {
}
func (m *ListRoutesRequest) Reset() { *m = ListRoutesRequest{} }
func (m *ListRoutesRequest) String() string { return proto.CompactTextString(m) }
func (*ListRoutesRequest) ProtoMessage() {}
func (*ListRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{42} }
type OnlineCPUMemRequest struct {
// Wait specifies if the caller waits for the agent to online all resources.
// If true the agent returns once all resources have been connected, otherwise all
@ -1352,7 +1387,7 @@ type OnlineCPUMemRequest struct {
func (m *OnlineCPUMemRequest) Reset() { *m = OnlineCPUMemRequest{} }
func (m *OnlineCPUMemRequest) String() string { return proto.CompactTextString(m) }
func (*OnlineCPUMemRequest) ProtoMessage() {}
func (*OnlineCPUMemRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{40} }
func (*OnlineCPUMemRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{43} }
func (m *OnlineCPUMemRequest) GetWait() bool {
if m != nil {
@ -1376,7 +1411,7 @@ type ReseedRandomDevRequest struct {
func (m *ReseedRandomDevRequest) Reset() { *m = ReseedRandomDevRequest{} }
func (m *ReseedRandomDevRequest) String() string { return proto.CompactTextString(m) }
func (*ReseedRandomDevRequest) ProtoMessage() {}
func (*ReseedRandomDevRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{41} }
func (*ReseedRandomDevRequest) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{44} }
func (m *ReseedRandomDevRequest) GetData() []byte {
if m != nil {
@ -1418,7 +1453,7 @@ type Storage struct {
func (m *Storage) Reset() { *m = Storage{} }
func (m *Storage) String() string { return proto.CompactTextString(m) }
func (*Storage) ProtoMessage() {}
func (*Storage) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{42} }
func (*Storage) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{45} }
func (m *Storage) GetDriver() string {
if m != nil {
@ -1501,7 +1536,7 @@ type Device struct {
func (m *Device) Reset() { *m = Device{} }
func (m *Device) String() string { return proto.CompactTextString(m) }
func (*Device) ProtoMessage() {}
func (*Device) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{43} }
func (*Device) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{46} }
func (m *Device) GetId() string {
if m != nil {
@ -1547,7 +1582,7 @@ type StringUser struct {
func (m *StringUser) Reset() { *m = StringUser{} }
func (m *StringUser) String() string { return proto.CompactTextString(m) }
func (*StringUser) ProtoMessage() {}
func (*StringUser) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{44} }
func (*StringUser) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{47} }
func (m *StringUser) GetUid() string {
if m != nil {
@ -1605,12 +1640,15 @@ func init() {
proto.RegisterType((*DestroySandboxRequest)(nil), "grpc.DestroySandboxRequest")
proto.RegisterType((*IPAddress)(nil), "grpc.IPAddress")
proto.RegisterType((*Interface)(nil), "grpc.Interface")
proto.RegisterType((*Interfaces)(nil), "grpc.Interfaces")
proto.RegisterType((*Route)(nil), "grpc.Route")
proto.RegisterType((*Routes)(nil), "grpc.Routes")
proto.RegisterType((*UpdateInterfaceRequest)(nil), "grpc.UpdateInterfaceRequest")
proto.RegisterType((*AddInterfaceRequest)(nil), "grpc.AddInterfaceRequest")
proto.RegisterType((*RemoveInterfaceRequest)(nil), "grpc.RemoveInterfaceRequest")
proto.RegisterType((*UpdateRoutesRequest)(nil), "grpc.UpdateRoutesRequest")
proto.RegisterType((*ListInterfacesRequest)(nil), "grpc.ListInterfacesRequest")
proto.RegisterType((*ListRoutesRequest)(nil), "grpc.ListRoutesRequest")
proto.RegisterType((*OnlineCPUMemRequest)(nil), "grpc.OnlineCPUMemRequest")
proto.RegisterType((*ReseedRandomDevRequest)(nil), "grpc.ReseedRandomDevRequest")
proto.RegisterType((*Storage)(nil), "grpc.Storage")
@ -1659,6 +1697,8 @@ type AgentServiceClient interface {
UpdateInterface(ctx context.Context, in *UpdateInterfaceRequest, opts ...grpc1.CallOption) (*Interface, error)
RemoveInterface(ctx context.Context, in *RemoveInterfaceRequest, opts ...grpc1.CallOption) (*Interface, error)
UpdateRoutes(ctx context.Context, in *UpdateRoutesRequest, opts ...grpc1.CallOption) (*Routes, error)
ListInterfaces(ctx context.Context, in *ListInterfacesRequest, opts ...grpc1.CallOption) (*Interfaces, error)
ListRoutes(ctx context.Context, in *ListRoutesRequest, opts ...grpc1.CallOption) (*Routes, error)
// misc (TODO: some rpcs can be replaced by hyperstart-exec)
CreateSandbox(ctx context.Context, in *CreateSandboxRequest, opts ...grpc1.CallOption) (*google_protobuf2.Empty, error)
DestroySandbox(ctx context.Context, in *DestroySandboxRequest, opts ...grpc1.CallOption) (*google_protobuf2.Empty, error)
@ -1854,6 +1894,24 @@ func (c *agentServiceClient) UpdateRoutes(ctx context.Context, in *UpdateRoutesR
return out, nil
}
func (c *agentServiceClient) ListInterfaces(ctx context.Context, in *ListInterfacesRequest, opts ...grpc1.CallOption) (*Interfaces, error) {
out := new(Interfaces)
err := grpc1.Invoke(ctx, "/grpc.AgentService/ListInterfaces", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *agentServiceClient) ListRoutes(ctx context.Context, in *ListRoutesRequest, opts ...grpc1.CallOption) (*Routes, error) {
out := new(Routes)
err := grpc1.Invoke(ctx, "/grpc.AgentService/ListRoutes", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *agentServiceClient) CreateSandbox(ctx context.Context, in *CreateSandboxRequest, opts ...grpc1.CallOption) (*google_protobuf2.Empty, error) {
out := new(google_protobuf2.Empty)
err := grpc1.Invoke(ctx, "/grpc.AgentService/CreateSandbox", in, out, c.cc, opts...)
@ -1922,6 +1980,8 @@ type AgentServiceServer interface {
UpdateInterface(context.Context, *UpdateInterfaceRequest) (*Interface, error)
RemoveInterface(context.Context, *RemoveInterfaceRequest) (*Interface, error)
UpdateRoutes(context.Context, *UpdateRoutesRequest) (*Routes, error)
ListInterfaces(context.Context, *ListInterfacesRequest) (*Interfaces, error)
ListRoutes(context.Context, *ListRoutesRequest) (*Routes, error)
// misc (TODO: some rpcs can be replaced by hyperstart-exec)
CreateSandbox(context.Context, *CreateSandboxRequest) (*google_protobuf2.Empty, error)
DestroySandbox(context.Context, *DestroySandboxRequest) (*google_protobuf2.Empty, error)
@ -2293,6 +2353,42 @@ func _AgentService_UpdateRoutes_Handler(srv interface{}, ctx context.Context, de
return interceptor(ctx, in, info, handler)
}
func _AgentService_ListInterfaces_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc1.UnaryServerInterceptor) (interface{}, error) {
in := new(ListInterfacesRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(AgentServiceServer).ListInterfaces(ctx, in)
}
info := &grpc1.UnaryServerInfo{
Server: srv,
FullMethod: "/grpc.AgentService/ListInterfaces",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(AgentServiceServer).ListInterfaces(ctx, req.(*ListInterfacesRequest))
}
return interceptor(ctx, in, info, handler)
}
func _AgentService_ListRoutes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc1.UnaryServerInterceptor) (interface{}, error) {
in := new(ListRoutesRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(AgentServiceServer).ListRoutes(ctx, in)
}
info := &grpc1.UnaryServerInfo{
Server: srv,
FullMethod: "/grpc.AgentService/ListRoutes",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(AgentServiceServer).ListRoutes(ctx, req.(*ListRoutesRequest))
}
return interceptor(ctx, in, info, handler)
}
func _AgentService_CreateSandbox_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc1.UnaryServerInterceptor) (interface{}, error) {
in := new(CreateSandboxRequest)
if err := dec(in); err != nil {
@ -2449,6 +2545,14 @@ var _AgentService_serviceDesc = grpc1.ServiceDesc{
MethodName: "UpdateRoutes",
Handler: _AgentService_UpdateRoutes_Handler,
},
{
MethodName: "ListInterfaces",
Handler: _AgentService_ListInterfaces_Handler,
},
{
MethodName: "ListRoutes",
Handler: _AgentService_ListRoutes_Handler,
},
{
MethodName: "CreateSandbox",
Handler: _AgentService_CreateSandbox_Handler,
@ -3847,6 +3951,36 @@ func (m *Interface) MarshalTo(dAtA []byte) (int, error) {
return i, nil
}
func (m *Interfaces) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *Interfaces) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if len(m.Interfaces) > 0 {
for _, msg := range m.Interfaces {
dAtA[i] = 0xa
i++
i = encodeVarintAgent(dAtA, i, uint64(msg.Size()))
n, err := msg.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n
}
}
return i, nil
}
func (m *Route) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@ -4036,6 +4170,42 @@ func (m *UpdateRoutesRequest) MarshalTo(dAtA []byte) (int, error) {
return i, nil
}
func (m *ListInterfacesRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *ListInterfacesRequest) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
return i, nil
}
func (m *ListRoutesRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *ListRoutesRequest) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
return i, nil
}
func (m *OnlineCPUMemRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@ -4885,6 +5055,18 @@ func (m *Interface) Size() (n int) {
return n
}
func (m *Interfaces) Size() (n int) {
var l int
_ = l
if len(m.Interfaces) > 0 {
for _, e := range m.Interfaces {
l = e.Size()
n += 1 + l + sovAgent(uint64(l))
}
}
return n
}
func (m *Route) Size() (n int) {
var l int
_ = l
@ -4962,6 +5144,18 @@ func (m *UpdateRoutesRequest) Size() (n int) {
return n
}
func (m *ListInterfacesRequest) Size() (n int) {
var l int
_ = l
return n
}
func (m *ListRoutesRequest) Size() (n int) {
var l int
_ = l
return n
}
func (m *OnlineCPUMemRequest) Size() (n int) {
var l int
_ = l
@ -9609,6 +9803,87 @@ func (m *Interface) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *Interfaces) 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: Interfaces: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: Interfaces: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Interfaces", 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 > l {
return io.ErrUnexpectedEOF
}
m.Interfaces = append(m.Interfaces, &Interface{})
if err := m.Interfaces[len(m.Interfaces)-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 {
return ErrInvalidLengthAgent
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *Route) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@ -10207,6 +10482,106 @@ func (m *UpdateRoutesRequest) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *ListInterfacesRequest) 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: ListInterfacesRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: ListInterfacesRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
default:
iNdEx = preIndex
skippy, err := skipAgent(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthAgent
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *ListRoutesRequest) 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: ListRoutesRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: ListRoutesRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
default:
iNdEx = preIndex
skippy, err := skipAgent(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthAgent
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *OnlineCPUMemRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@ -11041,149 +11416,152 @@ var (
func init() { proto.RegisterFile("agent.proto", fileDescriptorAgent) }
var fileDescriptorAgent = []byte{
// 2290 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0x5b, 0x73, 0x1c, 0x47,
0x15, 0x66, 0xaf, 0xd2, 0x9e, 0xdd, 0x95, 0xb4, 0x23, 0x59, 0xde, 0xac, 0x8d, 0x51, 0xc6, 0xe0,
0x88, 0x04, 0xcb, 0x15, 0xc5, 0x05, 0x29, 0xbb, 0x52, 0xc1, 0xba, 0x20, 0x8b, 0xc4, 0x78, 0x19,
0x59, 0x65, 0xaa, 0x78, 0xd8, 0x6a, 0xcd, 0xb4, 0x56, 0x1d, 0xef, 0x4c, 0x4f, 0xba, 0x7b, 0x24,
0x2d, 0xa9, 0xe2, 0x91, 0x5f, 0xc0, 0x2b, 0x7f, 0x80, 0xe2, 0x2d, 0x7f, 0x81, 0x07, 0x1e, 0xf9,
0x05, 0x14, 0xe5, 0x9f, 0xc0, 0x1b, 0x6f, 0x54, 0xdf, 0xe6, 0xb2, 0x17, 0x19, 0x14, 0x55, 0xf1,
0xb2, 0x3b, 0xe7, 0xf4, 0xe9, 0xef, 0x5c, 0xba, 0xfb, 0xf4, 0xe9, 0x03, 0x4d, 0x34, 0xc4, 0x91,
0xd8, 0x8a, 0x19, 0x15, 0xd4, 0xa9, 0x0e, 0x59, 0xec, 0xf7, 0x1a, 0xd4, 0x27, 0x9a, 0xd1, 0xbb,
0x33, 0xa4, 0x74, 0x38, 0xc2, 0x8f, 0x14, 0x75, 0x92, 0x9c, 0x3e, 0xc2, 0x61, 0x2c, 0xc6, 0x7a,
0xd0, 0xfd, 0x53, 0x19, 0xd6, 0x77, 0x19, 0x46, 0x02, 0xef, 0xd2, 0x48, 0x20, 0x12, 0x61, 0xe6,
0xe1, 0xaf, 0x13, 0xcc, 0x85, 0xf3, 0x3e, 0xb4, 0x7c, 0xcb, 0x1b, 0x90, 0xa0, 0x5b, 0xda, 0x28,
0x6d, 0x36, 0xbc, 0x66, 0xca, 0x3b, 0x0c, 0x9c, 0xdb, 0xb0, 0x80, 0x2f, 0xb1, 0x2f, 0x47, 0xcb,
0x6a, 0xb4, 0x2e, 0xc9, 0xc3, 0xc0, 0xf9, 0x18, 0x9a, 0x5c, 0x30, 0x12, 0x0d, 0x07, 0x09, 0xc7,
0xac, 0x5b, 0xd9, 0x28, 0x6d, 0x36, 0xb7, 0x57, 0xb6, 0xa4, 0x69, 0x5b, 0x47, 0x6a, 0xe0, 0x98,
0x63, 0xe6, 0x01, 0x4f, 0xbf, 0x9d, 0x07, 0xb0, 0x10, 0xe0, 0x73, 0xe2, 0x63, 0xde, 0xad, 0x6e,
0x54, 0x36, 0x9b, 0xdb, 0x2d, 0x2d, 0xbe, 0xa7, 0x98, 0x9e, 0x1d, 0x74, 0x7e, 0x0c, 0x8b, 0x5c,
0x50, 0x86, 0x86, 0x98, 0x77, 0x6b, 0x4a, 0xb0, 0x6d, 0x71, 0x15, 0xd7, 0x4b, 0x87, 0x9d, 0xbb,
0x50, 0x79, 0xb9, 0x7b, 0xd8, 0xad, 0x2b, 0xed, 0x60, 0xa4, 0x62, 0xec, 0x7b, 0x92, 0xed, 0xdc,
0x87, 0x36, 0x47, 0x51, 0x70, 0x42, 0x2f, 0x07, 0x31, 0x09, 0x22, 0xde, 0x5d, 0xd8, 0x28, 0x6d,
0x2e, 0x7a, 0x2d, 0xc3, 0xec, 0x4b, 0x9e, 0xfb, 0x04, 0x6e, 0x1d, 0x09, 0xc4, 0xc4, 0x35, 0xa2,
0xe3, 0x1e, 0xc3, 0xba, 0x87, 0x43, 0x7a, 0x7e, 0xad, 0xd0, 0x76, 0x61, 0x41, 0x90, 0x10, 0xd3,
0x44, 0xa8, 0xd0, 0xb6, 0x3d, 0x4b, 0xba, 0x7f, 0x29, 0x81, 0xb3, 0x7f, 0x89, 0xfd, 0x3e, 0xa3,
0x3e, 0xe6, 0xfc, 0xff, 0xb4, 0x5c, 0x1f, 0xc0, 0x42, 0xac, 0x0d, 0xe8, 0x56, 0x95, 0xb8, 0x59,
0x05, 0x6b, 0x95, 0x1d, 0x75, 0xbf, 0x82, 0xb5, 0x23, 0x32, 0x8c, 0xd0, 0xe8, 0x06, 0xed, 0x5d,
0x87, 0x3a, 0x57, 0x98, 0xca, 0xd4, 0xb6, 0x67, 0x28, 0xb7, 0x0f, 0xce, 0x6b, 0x44, 0xc4, 0xcd,
0x69, 0x72, 0x1f, 0xc2, 0x6a, 0x01, 0x91, 0xc7, 0x34, 0xe2, 0x58, 0x19, 0x20, 0x90, 0x48, 0xb8,
0x02, 0xab, 0x79, 0x86, 0x72, 0x31, 0xac, 0x7d, 0x49, 0xb8, 0x15, 0xc7, 0xff, 0x8b, 0x09, 0xeb,
0x50, 0x3f, 0xa5, 0x2c, 0x44, 0xc2, 0x5a, 0xa0, 0x29, 0xc7, 0x81, 0x2a, 0x62, 0x43, 0xde, 0xad,
0x6c, 0x54, 0x36, 0x1b, 0x9e, 0xfa, 0x96, 0xbb, 0x72, 0x42, 0x8d, 0xb1, 0xeb, 0x7d, 0x68, 0x99,
0xb8, 0x0f, 0x46, 0x84, 0x0b, 0xa5, 0xa7, 0xe5, 0x35, 0x0d, 0x4f, 0xce, 0x71, 0x29, 0xac, 0x1f,
0xc7, 0xc1, 0x35, 0x0f, 0xfc, 0x36, 0x34, 0x18, 0xe6, 0x34, 0x61, 0xf2, 0x98, 0x96, 0xd5, 0xba,
0xaf, 0xe9, 0x75, 0xff, 0x92, 0x44, 0xc9, 0xa5, 0x67, 0xc7, 0xbc, 0x4c, 0xcc, 0x1c, 0x21, 0xc1,
0xaf, 0x73, 0x84, 0x9e, 0xc0, 0xad, 0x3e, 0x4a, 0xf8, 0x75, 0x6c, 0x75, 0x9f, 0xca, 0xe3, 0xc7,
0x93, 0xf0, 0x5a, 0x93, 0xff, 0x5c, 0x82, 0xc5, 0xdd, 0x38, 0x39, 0xe6, 0x68, 0x88, 0x9d, 0x1f,
0x40, 0x53, 0x50, 0x81, 0x46, 0x83, 0x44, 0x92, 0x4a, 0xbc, 0xea, 0x81, 0x62, 0x69, 0x01, 0x19,
0x76, 0xcc, 0xfc, 0x38, 0x31, 0x12, 0xe5, 0x8d, 0xca, 0x66, 0xd5, 0x6b, 0x6a, 0x9e, 0x16, 0xd9,
0x82, 0x55, 0x35, 0x36, 0x20, 0xd1, 0xe0, 0x0d, 0x66, 0x11, 0x1e, 0x85, 0x34, 0xc0, 0x6a, 0xff,
0x56, 0xbd, 0x8e, 0x1a, 0x3a, 0x8c, 0xbe, 0x48, 0x07, 0x9c, 0x0f, 0xa1, 0x93, 0xca, 0xcb, 0x43,
0xa9, 0xa4, 0xab, 0x4a, 0x7a, 0xd9, 0x48, 0x1f, 0x1b, 0xb6, 0xfb, 0x7b, 0x58, 0x7a, 0x75, 0xc6,
0xa8, 0x10, 0x23, 0x12, 0x0d, 0xf7, 0x90, 0x40, 0x32, 0x7b, 0xc4, 0x98, 0x11, 0x1a, 0x70, 0x63,
0xad, 0x25, 0x9d, 0x8f, 0xa0, 0x23, 0xb4, 0x2c, 0x0e, 0x06, 0x56, 0xa6, 0xac, 0x64, 0x56, 0xd2,
0x81, 0xbe, 0x11, 0xfe, 0x11, 0x2c, 0x65, 0xc2, 0x32, 0xff, 0x18, 0x7b, 0xdb, 0x29, 0xf7, 0x15,
0x09, 0xb1, 0x7b, 0xae, 0x62, 0xa5, 0x16, 0xd9, 0xf9, 0x08, 0x1a, 0x59, 0x1c, 0x4a, 0x6a, 0x87,
0x2c, 0xe9, 0x1d, 0x62, 0xc3, 0xe9, 0x2d, 0xa6, 0x41, 0xf9, 0x0c, 0x96, 0x45, 0x6a, 0xf8, 0x20,
0x40, 0x02, 0x15, 0x37, 0x55, 0xd1, 0x2b, 0x6f, 0x49, 0x14, 0x68, 0xf7, 0x29, 0x34, 0xfa, 0x24,
0xe0, 0x5a, 0x71, 0x17, 0x16, 0xfc, 0x84, 0x31, 0x1c, 0x09, 0xeb, 0xb2, 0x21, 0x9d, 0x35, 0xa8,
0x8d, 0x48, 0x48, 0x84, 0x71, 0x53, 0x13, 0x2e, 0x05, 0x78, 0x81, 0x43, 0xca, 0xc6, 0x2a, 0x60,
0x6b, 0x50, 0xcb, 0x2f, 0xae, 0x26, 0x9c, 0x3b, 0xd0, 0x08, 0xd1, 0x65, 0xba, 0xa8, 0x72, 0x64,
0x31, 0x44, 0x97, 0xda, 0xf8, 0x2e, 0x2c, 0x9c, 0x22, 0x32, 0xf2, 0x23, 0x61, 0xa2, 0x62, 0xc9,
0x4c, 0x61, 0x35, 0xaf, 0xf0, 0xaf, 0x65, 0x68, 0x6a, 0x8d, 0xda, 0xe0, 0x35, 0xa8, 0xf9, 0xc8,
0x3f, 0x4b, 0x55, 0x2a, 0xc2, 0x79, 0x60, 0x0d, 0x29, 0xe7, 0x93, 0x70, 0x66, 0xa9, 0x35, 0xed,
0x11, 0x00, 0xbf, 0x40, 0xb1, 0xb1, 0xad, 0x32, 0x47, 0xb8, 0x21, 0x65, 0xb4, 0xb9, 0x9f, 0x40,
0x4b, 0xef, 0x3b, 0x33, 0xa5, 0x3a, 0x67, 0x4a, 0x53, 0x4b, 0xe9, 0x49, 0xf7, 0xa1, 0x9d, 0x70,
0x3c, 0x38, 0x23, 0x98, 0x21, 0xe6, 0x9f, 0x8d, 0xbb, 0x35, 0x7d, 0x47, 0x26, 0x1c, 0x3f, 0xb7,
0x3c, 0x67, 0x1b, 0x6a, 0x32, 0xfd, 0xf1, 0x6e, 0x5d, 0x5d, 0xc7, 0x77, 0xf3, 0x90, 0xca, 0xd5,
0x2d, 0xf5, 0xbb, 0x1f, 0x09, 0x36, 0xf6, 0xb4, 0x68, 0xef, 0x53, 0x80, 0x8c, 0xe9, 0xac, 0x40,
0xe5, 0x0d, 0x1e, 0x9b, 0x73, 0x28, 0x3f, 0x65, 0x70, 0xce, 0xd1, 0x28, 0xb1, 0x51, 0xd7, 0xc4,
0x93, 0xf2, 0xa7, 0x25, 0xd7, 0x87, 0xe5, 0x9d, 0xd1, 0x1b, 0x42, 0x73, 0xd3, 0xd7, 0xa0, 0x16,
0xa2, 0xaf, 0x28, 0xb3, 0x91, 0x54, 0x84, 0xe2, 0x92, 0x88, 0x32, 0x0b, 0xa1, 0x08, 0x67, 0x09,
0xca, 0x34, 0x56, 0xf1, 0x6a, 0x78, 0x65, 0x1a, 0x67, 0x8a, 0xaa, 0x39, 0x45, 0xee, 0x3f, 0xaa,
0x00, 0x99, 0x16, 0xc7, 0x83, 0x1e, 0xa1, 0x03, 0x8e, 0x99, 0x2c, 0x41, 0x06, 0x27, 0x63, 0x81,
0xf9, 0x80, 0x61, 0x3f, 0x61, 0x9c, 0x9c, 0xcb, 0xf5, 0x93, 0x6e, 0xdf, 0xd2, 0x6e, 0x4f, 0xd8,
0xe6, 0xdd, 0x26, 0xf4, 0x48, 0xcf, 0xdb, 0x91, 0xd3, 0x3c, 0x3b, 0xcb, 0x39, 0x84, 0x5b, 0x19,
0x66, 0x90, 0x83, 0x2b, 0x5f, 0x05, 0xb7, 0x9a, 0xc2, 0x05, 0x19, 0xd4, 0x3e, 0xac, 0x12, 0x3a,
0xf8, 0x3a, 0xc1, 0x49, 0x01, 0xa8, 0x72, 0x15, 0x50, 0x87, 0xd0, 0x5f, 0xab, 0x09, 0x19, 0x4c,
0x1f, 0xde, 0xcb, 0x79, 0x29, 0x8f, 0x7b, 0x0e, 0xac, 0x7a, 0x15, 0xd8, 0x7a, 0x6a, 0x95, 0xcc,
0x07, 0x19, 0xe2, 0x2f, 0x61, 0x9d, 0xd0, 0xc1, 0x05, 0x22, 0x62, 0x12, 0xae, 0xf6, 0x0e, 0x27,
0xe5, 0xa5, 0x5b, 0xc4, 0xd2, 0x4e, 0x86, 0x98, 0x0d, 0x0b, 0x4e, 0xd6, 0xdf, 0xe1, 0xe4, 0x0b,
0x35, 0x21, 0x83, 0x79, 0x06, 0x1d, 0x42, 0x27, 0xad, 0x59, 0xb8, 0x0a, 0x64, 0x99, 0xd0, 0xa2,
0x25, 0x3b, 0xd0, 0xe1, 0xd8, 0x17, 0x94, 0xe5, 0x37, 0xc1, 0xe2, 0x55, 0x10, 0x2b, 0x46, 0x3e,
0xc5, 0x70, 0x7f, 0x0b, 0xad, 0xe7, 0xc9, 0x10, 0x8b, 0xd1, 0x49, 0x9a, 0x0c, 0x6e, 0x2c, 0xff,
0xb8, 0xff, 0x2a, 0x43, 0x73, 0x77, 0xc8, 0x68, 0x12, 0x17, 0x72, 0xb2, 0x3e, 0xa4, 0x93, 0x39,
0x59, 0x89, 0xa8, 0x9c, 0xac, 0x85, 0x1f, 0x43, 0x2b, 0x54, 0x47, 0xd7, 0xc8, 0xeb, 0x3c, 0xd4,
0x99, 0x3a, 0xd4, 0x5e, 0x33, 0xcc, 0x25, 0xb3, 0x2d, 0x80, 0x98, 0x04, 0xdc, 0xcc, 0xd1, 0xe9,
0x68, 0xd9, 0x54, 0x84, 0x36, 0x45, 0x7b, 0x8d, 0x38, 0xcd, 0xd6, 0x1f, 0x43, 0xf3, 0x44, 0x06,
0xc9, 0x4c, 0x28, 0x24, 0xa3, 0x2c, 0x7a, 0x1e, 0x9c, 0x64, 0x87, 0xf0, 0x39, 0xb4, 0xcf, 0x74,
0xc8, 0xcc, 0x24, 0xbd, 0x87, 0xee, 0x1b, 0x4f, 0x32, 0x7f, 0xb7, 0xf2, 0x91, 0xd5, 0x0b, 0xd0,
0x3a, 0xcb, 0xb1, 0x7a, 0x47, 0xd0, 0x99, 0x12, 0x99, 0x91, 0x83, 0x36, 0xf3, 0x39, 0xa8, 0xb9,
0xed, 0x68, 0x45, 0xf9, 0x99, 0xf9, 0xbc, 0xf4, 0x2b, 0x58, 0x9f, 0x2c, 0x73, 0x4c, 0x51, 0xf6,
0x18, 0x5a, 0xbe, 0xb2, 0xae, 0xb0, 0x02, 0x9d, 0x29, 0xbb, 0xbd, 0xa6, 0x9f, 0x11, 0x6e, 0x00,
0xce, 0x6b, 0x46, 0x04, 0x3e, 0x12, 0x0c, 0xa3, 0xf0, 0x26, 0xaa, 0x66, 0x07, 0xaa, 0xea, 0x8a,
0xad, 0xa8, 0xa2, 0x50, 0x7d, 0xbb, 0x1f, 0xc0, 0x6a, 0x41, 0x8b, 0x31, 0x79, 0x05, 0x2a, 0x23,
0x1c, 0x29, 0xf4, 0xb6, 0x27, 0x3f, 0x5d, 0x04, 0x1d, 0x0f, 0xa3, 0xe0, 0xe6, 0xac, 0x31, 0x2a,
0x2a, 0x99, 0x8a, 0x4d, 0x70, 0xf2, 0x2a, 0x8c, 0x29, 0xd6, 0xea, 0x52, 0xce, 0xea, 0x97, 0xd0,
0xd9, 0x1d, 0x51, 0x8e, 0x8f, 0x44, 0x40, 0xa2, 0x9b, 0x28, 0xf3, 0xbf, 0x81, 0xd5, 0x57, 0x62,
0xfc, 0x5a, 0x82, 0x71, 0xf2, 0x3b, 0x7c, 0x43, 0xfe, 0x31, 0x7a, 0x61, 0xfd, 0x63, 0xf4, 0x42,
0x56, 0xf8, 0x3e, 0x1d, 0x25, 0x61, 0xa4, 0xb6, 0x7b, 0xdb, 0x33, 0x94, 0xfb, 0x6d, 0x09, 0xd6,
0xf4, 0x1b, 0xfc, 0x48, 0x3f, 0x3d, 0xad, 0xfa, 0x1e, 0x2c, 0x9e, 0x51, 0x2e, 0x22, 0x14, 0x62,
0xa3, 0x3a, 0xa5, 0x25, 0xbc, 0x7c, 0xb3, 0x96, 0xd5, 0xab, 0x40, 0x7e, 0x16, 0x1e, 0xc6, 0x95,
0xab, 0x1f, 0xc6, 0x53, 0x4f, 0xdf, 0xea, 0xf4, 0xd3, 0xd7, 0xf9, 0x3e, 0x80, 0x15, 0x22, 0x81,
0xba, 0xf8, 0x1b, 0x5e, 0xc3, 0x70, 0x0e, 0x03, 0xf7, 0x36, 0xdc, 0xda, 0xc3, 0x5c, 0x30, 0x3a,
0x2e, 0x5a, 0xed, 0x22, 0x68, 0x1c, 0xf6, 0x9f, 0x05, 0x01, 0xc3, 0x9c, 0x3b, 0x0f, 0xa0, 0x7e,
0x8a, 0x42, 0x32, 0xd2, 0x07, 0x6b, 0xc9, 0xe6, 0x9d, 0xc3, 0xfe, 0x2f, 0x14, 0xd7, 0x33, 0xa3,
0x32, 0x99, 0x21, 0x3d, 0xc5, 0x84, 0xd1, 0x92, 0x72, 0xfd, 0x43, 0xc4, 0xdf, 0x98, 0x2b, 0x5b,
0x7d, 0xbb, 0x7f, 0x2c, 0x41, 0xe3, 0x30, 0x12, 0x98, 0x9d, 0x22, 0x5f, 0x3d, 0xc6, 0x74, 0x73,
0xc0, 0x04, 0xc9, 0x50, 0x72, 0xa6, 0x0a, 0x9d, 0x06, 0x54, 0xdf, 0x32, 0xef, 0xa4, 0xc6, 0xa5,
0x71, 0x5a, 0xb6, 0x46, 0x99, 0x01, 0x2f, 0x2f, 0x23, 0x23, 0x1d, 0x8a, 0xc4, 0xd4, 0x07, 0xf2,
0x53, 0x2a, 0x3c, 0xbb, 0x90, 0x02, 0x26, 0x2a, 0x86, 0x72, 0xbf, 0x81, 0x9a, 0x47, 0x13, 0xa1,
0xf7, 0x2c, 0x36, 0xcf, 0xaf, 0x86, 0xa7, 0xbe, 0xa5, 0x87, 0x43, 0x24, 0xf0, 0x05, 0x1a, 0x5b,
0x0f, 0x0d, 0x99, 0xb3, 0xbf, 0x52, 0xb0, 0x5f, 0x3e, 0x32, 0xd5, 0x1b, 0x4a, 0xe9, 0x6e, 0x78,
0x86, 0x92, 0x77, 0x05, 0xf7, 0x69, 0x8c, 0x95, 0xf6, 0xb6, 0xa7, 0x09, 0xf7, 0x21, 0xd4, 0x95,
0x72, 0xb9, 0xba, 0xe6, 0xcb, 0x54, 0x26, 0x4d, 0xed, 0x9e, 0xe2, 0x79, 0x66, 0xc8, 0x3d, 0xb0,
0xcf, 0xc0, 0x34, 0x8e, 0x76, 0xd7, 0x3d, 0x84, 0x06, 0xb1, 0x3c, 0x93, 0xab, 0x6c, 0x80, 0x52,
0xd1, 0x4c, 0xc2, 0xdd, 0x83, 0xd5, 0x67, 0x41, 0xf0, 0x5d, 0x51, 0x0e, 0x6c, 0xaf, 0xe4, 0xbb,
0x02, 0x3d, 0x85, 0x55, 0xed, 0x97, 0xf6, 0xd3, 0xa2, 0xfc, 0x10, 0xea, 0xcc, 0xc6, 0xa4, 0x94,
0x35, 0x97, 0x8c, 0x90, 0x19, 0x73, 0x77, 0x60, 0xf5, 0x65, 0x34, 0x22, 0x11, 0xde, 0xed, 0x1f,
0xbf, 0xc0, 0x69, 0x9a, 0x73, 0xa0, 0x2a, 0x6b, 0x18, 0x35, 0x75, 0xd1, 0x53, 0xdf, 0xf2, 0xdc,
0x47, 0x27, 0x03, 0x3f, 0x4e, 0xb8, 0xe9, 0xcf, 0xd4, 0xa3, 0x93, 0xdd, 0x38, 0xe1, 0xee, 0x4f,
0xd4, 0xb3, 0x13, 0xe3, 0xc0, 0x43, 0x51, 0x40, 0xc3, 0x3d, 0x7c, 0x9e, 0x83, 0x49, 0x9f, 0x38,
0x36, 0x93, 0x7d, 0x5b, 0x82, 0x05, 0x73, 0x3e, 0xd5, 0x3e, 0x60, 0xe4, 0x1c, 0xb3, 0x74, 0x1f,
0x2b, 0x4a, 0xbe, 0xc2, 0xf4, 0xd7, 0x80, 0xc6, 0x82, 0xd0, 0xf4, 0xd4, 0xb7, 0x35, 0xf7, 0xa5,
0x66, 0xe6, 0xb6, 0x4b, 0xa5, 0xb0, 0x5d, 0xd6, 0xa1, 0x7e, 0xca, 0xc5, 0x38, 0x4e, 0xb7, 0x91,
0xa6, 0xe4, 0x86, 0xb4, 0x78, 0x35, 0x85, 0x67, 0x49, 0xf9, 0xde, 0x0d, 0x69, 0x12, 0x89, 0x41,
0x4c, 0x49, 0x24, 0x54, 0xff, 0xac, 0xe1, 0x81, 0x62, 0xf5, 0x25, 0xc7, 0xfd, 0x43, 0x09, 0xea,
0xba, 0x2f, 0x27, 0xeb, 0xe9, 0x34, 0x31, 0x96, 0x89, 0xba, 0x64, 0x94, 0x2e, 0x73, 0xe8, 0x94,
0xa6, 0xdb, 0xb0, 0x70, 0x1e, 0x0e, 0x62, 0x24, 0xce, 0xac, 0x69, 0xe7, 0x61, 0x1f, 0x89, 0x33,
0xe9, 0x59, 0x96, 0x5f, 0xd5, 0xb8, 0x36, 0xb1, 0x9d, 0x72, 0x95, 0xd8, 0x5c, 0x4b, 0xdd, 0xdf,
0xc8, 0x67, 0x44, 0xda, 0x93, 0x5a, 0x81, 0x4a, 0x92, 0x1a, 0x23, 0x3f, 0x25, 0x67, 0x98, 0x66,
0x66, 0xf9, 0xe9, 0x3c, 0x80, 0x25, 0x14, 0x04, 0x44, 0x4e, 0x47, 0xa3, 0x03, 0x12, 0xd8, 0xc6,
0xca, 0x04, 0xf7, 0xc3, 0x1e, 0x2c, 0xda, 0x24, 0xe5, 0xd4, 0xa1, 0x7c, 0xfe, 0x78, 0xe5, 0x7b,
0xea, 0xff, 0xa7, 0x2b, 0xa5, 0xed, 0x7f, 0xb7, 0xa0, 0xf5, 0x6c, 0x88, 0x23, 0x61, 0x8a, 0x5e,
0xe7, 0x00, 0x96, 0x27, 0x9a, 0xa8, 0x8e, 0x79, 0x05, 0xcd, 0xee, 0xad, 0xf6, 0xd6, 0xb7, 0x74,
0x53, 0x76, 0xcb, 0x36, 0x65, 0xb7, 0xf6, 0xc3, 0x58, 0x8c, 0x9d, 0x7d, 0x58, 0x2a, 0xb6, 0x1b,
0x9d, 0x3b, 0x36, 0x87, 0xcf, 0x68, 0x42, 0xce, 0x85, 0x39, 0x80, 0xe5, 0x89, 0xce, 0xa3, 0xb5,
0x67, 0x76, 0x43, 0x72, 0x2e, 0xd0, 0xe7, 0xd0, 0xcc, 0xb5, 0x1a, 0x9d, 0xae, 0x06, 0x99, 0xee,
0x3e, 0xce, 0x05, 0xd8, 0x85, 0x76, 0xa1, 0xfb, 0xe7, 0xf4, 0x8c, 0x3f, 0x33, 0x5a, 0x82, 0x73,
0x41, 0x76, 0xa0, 0x99, 0x6b, 0xc2, 0x59, 0x2b, 0xa6, 0x3b, 0x7d, 0xbd, 0xf7, 0x66, 0x8c, 0x98,
0x32, 0xe2, 0x39, 0xb4, 0x0b, 0x2d, 0x33, 0x6b, 0xc8, 0xac, 0x76, 0x5d, 0xef, 0xce, 0xcc, 0x31,
0x83, 0x74, 0x00, 0xcb, 0x13, 0x0d, 0x34, 0x1b, 0xdc, 0xd9, 0x7d, 0xb5, 0xb9, 0x6e, 0x7d, 0xa1,
0x16, 0x3b, 0x57, 0x31, 0xe6, 0x16, 0x7b, 0xba, 0x5d, 0xd6, 0xbb, 0x3b, 0x7b, 0xd0, 0x58, 0xb5,
0x0f, 0x4b, 0xc5, 0x4e, 0x99, 0x05, 0x9b, 0xd9, 0x3f, 0xbb, 0x7a, 0xe7, 0x14, 0x9a, 0x66, 0xd9,
0xce, 0x99, 0xd5, 0x4b, 0x9b, 0x0b, 0xf4, 0x0c, 0xc0, 0x14, 0x96, 0x01, 0x89, 0xd2, 0x25, 0x9b,
0x2a, 0x68, 0xd3, 0x25, 0x9b, 0x51, 0x84, 0x7e, 0x0e, 0xa0, 0xeb, 0xc1, 0x80, 0x26, 0xc2, 0xb9,
0x6d, 0xcd, 0x98, 0x28, 0x42, 0x7b, 0xdd, 0xe9, 0x81, 0x29, 0x00, 0xcc, 0xd8, 0x75, 0x00, 0x3e,
0x03, 0xc8, 0xea, 0x4c, 0x0b, 0x30, 0x55, 0x79, 0x5e, 0x11, 0x83, 0x56, 0xbe, 0xaa, 0x74, 0x8c,
0xaf, 0x33, 0x2a, 0xcd, 0xb9, 0x10, 0x4f, 0xa0, 0x95, 0xbf, 0x5d, 0x2d, 0xc4, 0x8c, 0x1b, 0xb7,
0x37, 0x79, 0x2b, 0x3a, 0x3f, 0xb7, 0x1b, 0x35, 0x63, 0x15, 0x36, 0xea, 0x7f, 0x85, 0x30, 0x71,
0x2b, 0x17, 0xf3, 0xc8, 0xbb, 0x11, 0x7e, 0x06, 0xad, 0xfc, 0x75, 0x6c, 0xed, 0x9f, 0x71, 0x45,
0xf7, 0x0a, 0x57, 0xb2, 0x4c, 0x1c, 0x85, 0x9a, 0xd8, 0x9e, 0xd7, 0x59, 0x85, 0xf2, 0x55, 0xe9,
0xb4, 0x58, 0xa3, 0xda, 0x43, 0x31, 0xb3, 0x72, 0xbd, 0x6a, 0x1d, 0xf3, 0x65, 0x81, 0x75, 0x62,
0x46, 0xa9, 0xf0, 0x8e, 0x73, 0x95, 0xaf, 0x0a, 0x72, 0xe7, 0x6a, 0x46, 0xb1, 0x30, 0x0f, 0x68,
0xa7, 0xf5, 0xb7, 0xb7, 0xf7, 0x4a, 0x7f, 0x7f, 0x7b, 0xaf, 0xf4, 0xcf, 0xb7, 0xf7, 0x4a, 0x27,
0x75, 0x35, 0xfa, 0xc9, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x4b, 0xe9, 0x79, 0x55, 0x02, 0x1c,
0x00, 0x00,
// 2352 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0x5f, 0x6f, 0x1c, 0x49,
0x11, 0x67, 0xff, 0xda, 0x5b, 0xbb, 0x6b, 0x7b, 0xdb, 0x8e, 0xb3, 0xb7, 0x39, 0x82, 0x6f, 0x02,
0x39, 0x73, 0x47, 0x1c, 0x9d, 0x13, 0xc1, 0x29, 0x51, 0x14, 0x62, 0xc7, 0x38, 0xe6, 0x2e, 0x64,
0x19, 0xc7, 0x0a, 0x12, 0x0f, 0xab, 0xf1, 0x4c, 0x7b, 0xdd, 0x97, 0x9d, 0xe9, 0xb9, 0xee, 0x1e,
0xdb, 0xcb, 0x49, 0x3c, 0xf2, 0x09, 0x78, 0xe5, 0x0b, 0x20, 0xde, 0xee, 0x2b, 0xf0, 0xc0, 0x23,
0x9f, 0x00, 0xa1, 0x7c, 0x01, 0x24, 0x3e, 0x01, 0xea, 0x7f, 0xf3, 0x67, 0xff, 0x38, 0xe0, 0xb3,
0xc4, 0xcb, 0xee, 0x54, 0x75, 0x75, 0xd5, 0xaf, 0xaa, 0xbb, 0xab, 0xab, 0x0b, 0x9a, 0xde, 0x10,
0x47, 0x62, 0x2b, 0x66, 0x54, 0x50, 0x54, 0x1d, 0xb2, 0xd8, 0xef, 0x35, 0xa8, 0x4f, 0x34, 0xa3,
0x77, 0x6b, 0x48, 0xe9, 0x70, 0x84, 0xef, 0x2b, 0xea, 0x38, 0x39, 0xb9, 0x8f, 0xc3, 0x58, 0x8c,
0xf5, 0xa0, 0xf3, 0xa7, 0x32, 0xac, 0xef, 0x32, 0xec, 0x09, 0xbc, 0x4b, 0x23, 0xe1, 0x91, 0x08,
0x33, 0x17, 0x7f, 0x9d, 0x60, 0x2e, 0xd0, 0x47, 0xd0, 0xf2, 0x2d, 0x6f, 0x40, 0x82, 0x6e, 0x69,
0xa3, 0xb4, 0xd9, 0x70, 0x9b, 0x29, 0xef, 0x20, 0x40, 0x37, 0x61, 0x01, 0x5f, 0x60, 0x5f, 0x8e,
0x96, 0xd5, 0x68, 0x5d, 0x92, 0x07, 0x01, 0xfa, 0x0c, 0x9a, 0x5c, 0x30, 0x12, 0x0d, 0x07, 0x09,
0xc7, 0xac, 0x5b, 0xd9, 0x28, 0x6d, 0x36, 0xb7, 0x57, 0xb6, 0x24, 0xb4, 0xad, 0x43, 0x35, 0x70,
0xc4, 0x31, 0x73, 0x81, 0xa7, 0xdf, 0xe8, 0x2e, 0x2c, 0x04, 0xf8, 0x8c, 0xf8, 0x98, 0x77, 0xab,
0x1b, 0x95, 0xcd, 0xe6, 0x76, 0x4b, 0x8b, 0x3f, 0x57, 0x4c, 0xd7, 0x0e, 0xa2, 0x1f, 0xc3, 0x22,
0x17, 0x94, 0x79, 0x43, 0xcc, 0xbb, 0x35, 0x25, 0xd8, 0xb6, 0x7a, 0x15, 0xd7, 0x4d, 0x87, 0xd1,
0x87, 0x50, 0x79, 0xb5, 0x7b, 0xd0, 0xad, 0x2b, 0xeb, 0x60, 0xa4, 0x62, 0xec, 0xbb, 0x92, 0x8d,
0xee, 0x40, 0x9b, 0x7b, 0x51, 0x70, 0x4c, 0x2f, 0x06, 0x31, 0x09, 0x22, 0xde, 0x5d, 0xd8, 0x28,
0x6d, 0x2e, 0xba, 0x2d, 0xc3, 0xec, 0x4b, 0x9e, 0xf3, 0x08, 0x6e, 0x1c, 0x0a, 0x8f, 0x89, 0x2b,
0x44, 0xc7, 0x39, 0x82, 0x75, 0x17, 0x87, 0xf4, 0xec, 0x4a, 0xa1, 0xed, 0xc2, 0x82, 0x20, 0x21,
0xa6, 0x89, 0x50, 0xa1, 0x6d, 0xbb, 0x96, 0x74, 0xfe, 0x52, 0x02, 0xb4, 0x77, 0x81, 0xfd, 0x3e,
0xa3, 0x3e, 0xe6, 0xfc, 0xff, 0xb4, 0x5c, 0x1f, 0xc3, 0x42, 0xac, 0x01, 0x74, 0xab, 0x4a, 0xdc,
0xac, 0x82, 0x45, 0x65, 0x47, 0x9d, 0xaf, 0x60, 0xed, 0x90, 0x0c, 0x23, 0x6f, 0x74, 0x8d, 0x78,
0xd7, 0xa1, 0xce, 0x95, 0x4e, 0x05, 0xb5, 0xed, 0x1a, 0xca, 0xe9, 0x03, 0x7a, 0xe3, 0x11, 0x71,
0x7d, 0x96, 0x9c, 0x7b, 0xb0, 0x5a, 0xd0, 0xc8, 0x63, 0x1a, 0x71, 0xac, 0x00, 0x08, 0x4f, 0x24,
0x5c, 0x29, 0xab, 0xb9, 0x86, 0x72, 0x30, 0xac, 0x7d, 0x49, 0xb8, 0x15, 0xc7, 0xff, 0x0b, 0x84,
0x75, 0xa8, 0x9f, 0x50, 0x16, 0x7a, 0xc2, 0x22, 0xd0, 0x14, 0x42, 0x50, 0xf5, 0xd8, 0x90, 0x77,
0x2b, 0x1b, 0x95, 0xcd, 0x86, 0xab, 0xbe, 0xe5, 0xae, 0x9c, 0x30, 0x63, 0x70, 0x7d, 0x04, 0x2d,
0x13, 0xf7, 0xc1, 0x88, 0x70, 0xa1, 0xec, 0xb4, 0xdc, 0xa6, 0xe1, 0xc9, 0x39, 0x0e, 0x85, 0xf5,
0xa3, 0x38, 0xb8, 0xe2, 0x81, 0xdf, 0x86, 0x06, 0xc3, 0x9c, 0x26, 0x4c, 0x1e, 0xd3, 0xb2, 0x5a,
0xf7, 0x35, 0xbd, 0xee, 0x5f, 0x92, 0x28, 0xb9, 0x70, 0xed, 0x98, 0x9b, 0x89, 0x99, 0x23, 0x24,
0xf8, 0x55, 0x8e, 0xd0, 0x23, 0xb8, 0xd1, 0xf7, 0x12, 0x7e, 0x15, 0xac, 0xce, 0x63, 0x79, 0xfc,
0x78, 0x12, 0x5e, 0x69, 0xf2, 0x9f, 0x4b, 0xb0, 0xb8, 0x1b, 0x27, 0x47, 0xdc, 0x1b, 0x62, 0xf4,
0x03, 0x68, 0x0a, 0x2a, 0xbc, 0xd1, 0x20, 0x91, 0xa4, 0x12, 0xaf, 0xba, 0xa0, 0x58, 0x5a, 0x40,
0x86, 0x1d, 0x33, 0x3f, 0x4e, 0x8c, 0x44, 0x79, 0xa3, 0xb2, 0x59, 0x75, 0x9b, 0x9a, 0xa7, 0x45,
0xb6, 0x60, 0x55, 0x8d, 0x0d, 0x48, 0x34, 0x78, 0x8b, 0x59, 0x84, 0x47, 0x21, 0x0d, 0xb0, 0xda,
0xbf, 0x55, 0xb7, 0xa3, 0x86, 0x0e, 0xa2, 0x2f, 0xd2, 0x01, 0xf4, 0x09, 0x74, 0x52, 0x79, 0x79,
0x28, 0x95, 0x74, 0x55, 0x49, 0x2f, 0x1b, 0xe9, 0x23, 0xc3, 0x76, 0x7e, 0x0f, 0x4b, 0xaf, 0x4f,
0x19, 0x15, 0x62, 0x44, 0xa2, 0xe1, 0x73, 0x4f, 0x78, 0x32, 0x7b, 0xc4, 0x98, 0x11, 0x1a, 0x70,
0x83, 0xd6, 0x92, 0xe8, 0x53, 0xe8, 0x08, 0x2d, 0x8b, 0x83, 0x81, 0x95, 0x29, 0x2b, 0x99, 0x95,
0x74, 0xa0, 0x6f, 0x84, 0x7f, 0x04, 0x4b, 0x99, 0xb0, 0xcc, 0x3f, 0x06, 0x6f, 0x3b, 0xe5, 0xbe,
0x26, 0x21, 0x76, 0xce, 0x54, 0xac, 0xd4, 0x22, 0xa3, 0x4f, 0xa1, 0x91, 0xc5, 0xa1, 0xa4, 0x76,
0xc8, 0x92, 0xde, 0x21, 0x36, 0x9c, 0xee, 0x62, 0x1a, 0x94, 0x27, 0xb0, 0x2c, 0x52, 0xe0, 0x83,
0xc0, 0x13, 0x5e, 0x71, 0x53, 0x15, 0xbd, 0x72, 0x97, 0x44, 0x81, 0x76, 0x1e, 0x43, 0xa3, 0x4f,
0x02, 0xae, 0x0d, 0x77, 0x61, 0xc1, 0x4f, 0x18, 0xc3, 0x91, 0xb0, 0x2e, 0x1b, 0x12, 0xad, 0x41,
0x6d, 0x44, 0x42, 0x22, 0x8c, 0x9b, 0x9a, 0x70, 0x28, 0xc0, 0x4b, 0x1c, 0x52, 0x36, 0x56, 0x01,
0x5b, 0x83, 0x5a, 0x7e, 0x71, 0x35, 0x81, 0x6e, 0x41, 0x23, 0xf4, 0x2e, 0xd2, 0x45, 0x95, 0x23,
0x8b, 0xa1, 0x77, 0xa1, 0xc1, 0x77, 0x61, 0xe1, 0xc4, 0x23, 0x23, 0x3f, 0x12, 0x26, 0x2a, 0x96,
0xcc, 0x0c, 0x56, 0xf3, 0x06, 0xff, 0x5a, 0x86, 0xa6, 0xb6, 0xa8, 0x01, 0xaf, 0x41, 0xcd, 0xf7,
0xfc, 0xd3, 0xd4, 0xa4, 0x22, 0xd0, 0x5d, 0x0b, 0xa4, 0x9c, 0x4f, 0xc2, 0x19, 0x52, 0x0b, 0xed,
0x3e, 0x00, 0x3f, 0xf7, 0x62, 0x83, 0xad, 0x32, 0x47, 0xb8, 0x21, 0x65, 0x34, 0xdc, 0x07, 0xd0,
0xd2, 0xfb, 0xce, 0x4c, 0xa9, 0xce, 0x99, 0xd2, 0xd4, 0x52, 0x7a, 0xd2, 0x1d, 0x68, 0x27, 0x1c,
0x0f, 0x4e, 0x09, 0x66, 0x1e, 0xf3, 0x4f, 0xc7, 0xdd, 0x9a, 0xbe, 0x23, 0x13, 0x8e, 0x5f, 0x58,
0x1e, 0xda, 0x86, 0x9a, 0x4c, 0x7f, 0xbc, 0x5b, 0x57, 0xd7, 0xf1, 0x87, 0x79, 0x95, 0xca, 0xd5,
0x2d, 0xf5, 0xbb, 0x17, 0x09, 0x36, 0x76, 0xb5, 0x68, 0xef, 0x73, 0x80, 0x8c, 0x89, 0x56, 0xa0,
0xf2, 0x16, 0x8f, 0xcd, 0x39, 0x94, 0x9f, 0x32, 0x38, 0x67, 0xde, 0x28, 0xb1, 0x51, 0xd7, 0xc4,
0xa3, 0xf2, 0xe7, 0x25, 0xc7, 0x87, 0xe5, 0x9d, 0xd1, 0x5b, 0x42, 0x73, 0xd3, 0xd7, 0xa0, 0x16,
0x7a, 0x5f, 0x51, 0x66, 0x23, 0xa9, 0x08, 0xc5, 0x25, 0x11, 0x65, 0x56, 0x85, 0x22, 0xd0, 0x12,
0x94, 0x69, 0xac, 0xe2, 0xd5, 0x70, 0xcb, 0x34, 0xce, 0x0c, 0x55, 0x73, 0x86, 0x9c, 0x7f, 0x54,
0x01, 0x32, 0x2b, 0xc8, 0x85, 0x1e, 0xa1, 0x03, 0x8e, 0x99, 0x2c, 0x41, 0x06, 0xc7, 0x63, 0x81,
0xf9, 0x80, 0x61, 0x3f, 0x61, 0x9c, 0x9c, 0xc9, 0xf5, 0x93, 0x6e, 0xdf, 0xd0, 0x6e, 0x4f, 0x60,
0x73, 0x6f, 0x12, 0x7a, 0xa8, 0xe7, 0xed, 0xc8, 0x69, 0xae, 0x9d, 0x85, 0x0e, 0xe0, 0x46, 0xa6,
0x33, 0xc8, 0xa9, 0x2b, 0x5f, 0xa6, 0x6e, 0x35, 0x55, 0x17, 0x64, 0xaa, 0xf6, 0x60, 0x95, 0xd0,
0xc1, 0xd7, 0x09, 0x4e, 0x0a, 0x8a, 0x2a, 0x97, 0x29, 0xea, 0x10, 0xfa, 0x6b, 0x35, 0x21, 0x53,
0xd3, 0x87, 0x0f, 0x72, 0x5e, 0xca, 0xe3, 0x9e, 0x53, 0x56, 0xbd, 0x4c, 0xd9, 0x7a, 0x8a, 0x4a,
0xe6, 0x83, 0x4c, 0xe3, 0x2f, 0x61, 0x9d, 0xd0, 0xc1, 0xb9, 0x47, 0xc4, 0xa4, 0xba, 0xda, 0x7b,
0x9c, 0x94, 0x97, 0x6e, 0x51, 0x97, 0x76, 0x32, 0xc4, 0x6c, 0x58, 0x70, 0xb2, 0xfe, 0x1e, 0x27,
0x5f, 0xaa, 0x09, 0x99, 0x9a, 0x67, 0xd0, 0x21, 0x74, 0x12, 0xcd, 0xc2, 0x65, 0x4a, 0x96, 0x09,
0x2d, 0x22, 0xd9, 0x81, 0x0e, 0xc7, 0xbe, 0xa0, 0x2c, 0xbf, 0x09, 0x16, 0x2f, 0x53, 0xb1, 0x62,
0xe4, 0x53, 0x1d, 0xce, 0x6f, 0xa1, 0xf5, 0x22, 0x19, 0x62, 0x31, 0x3a, 0x4e, 0x93, 0xc1, 0xb5,
0xe5, 0x1f, 0xe7, 0xdf, 0x65, 0x68, 0xee, 0x0e, 0x19, 0x4d, 0xe2, 0x42, 0x4e, 0xd6, 0x87, 0x74,
0x32, 0x27, 0x2b, 0x11, 0x95, 0x93, 0xb5, 0xf0, 0x43, 0x68, 0x85, 0xea, 0xe8, 0x1a, 0x79, 0x9d,
0x87, 0x3a, 0x53, 0x87, 0xda, 0x6d, 0x86, 0xb9, 0x64, 0xb6, 0x05, 0x10, 0x93, 0x80, 0x9b, 0x39,
0x3a, 0x1d, 0x2d, 0x9b, 0x8a, 0xd0, 0xa6, 0x68, 0xb7, 0x11, 0xa7, 0xd9, 0xfa, 0x33, 0x68, 0x1e,
0xcb, 0x20, 0x99, 0x09, 0x85, 0x64, 0x94, 0x45, 0xcf, 0x85, 0xe3, 0xec, 0x10, 0xbe, 0x80, 0xf6,
0xa9, 0x0e, 0x99, 0x99, 0xa4, 0xf7, 0xd0, 0x1d, 0xe3, 0x49, 0xe6, 0xef, 0x56, 0x3e, 0xb2, 0x7a,
0x01, 0x5a, 0xa7, 0x39, 0x56, 0xef, 0x10, 0x3a, 0x53, 0x22, 0x33, 0x72, 0xd0, 0x66, 0x3e, 0x07,
0x35, 0xb7, 0x91, 0x36, 0x94, 0x9f, 0x99, 0xcf, 0x4b, 0xbf, 0x82, 0xf5, 0xc9, 0x32, 0xc7, 0x14,
0x65, 0x0f, 0xa1, 0xe5, 0x2b, 0x74, 0x85, 0x15, 0xe8, 0x4c, 0xe1, 0x76, 0x9b, 0x7e, 0x46, 0x38,
0x01, 0xa0, 0x37, 0x8c, 0x08, 0x7c, 0x28, 0x18, 0xf6, 0xc2, 0xeb, 0xa8, 0x9a, 0x11, 0x54, 0xd5,
0x15, 0x5b, 0x51, 0x45, 0xa1, 0xfa, 0x76, 0x3e, 0x86, 0xd5, 0x82, 0x15, 0x03, 0x79, 0x05, 0x2a,
0x23, 0x1c, 0x29, 0xed, 0x6d, 0x57, 0x7e, 0x3a, 0x1e, 0x74, 0x5c, 0xec, 0x05, 0xd7, 0x87, 0xc6,
0x98, 0xa8, 0x64, 0x26, 0x36, 0x01, 0xe5, 0x4d, 0x18, 0x28, 0x16, 0x75, 0x29, 0x87, 0xfa, 0x15,
0x74, 0x76, 0x47, 0x94, 0xe3, 0x43, 0x11, 0x90, 0xe8, 0x3a, 0xca, 0xfc, 0x6f, 0x60, 0xf5, 0xb5,
0x18, 0xbf, 0x91, 0xca, 0x38, 0xf9, 0x1d, 0xbe, 0x26, 0xff, 0x18, 0x3d, 0xb7, 0xfe, 0x31, 0x7a,
0x2e, 0x2b, 0x7c, 0x9f, 0x8e, 0x92, 0x30, 0x52, 0xdb, 0xbd, 0xed, 0x1a, 0xca, 0xf9, 0xb6, 0x04,
0x6b, 0xfa, 0x0d, 0x7e, 0xa8, 0x9f, 0x9e, 0xd6, 0x7c, 0x0f, 0x16, 0x4f, 0x29, 0x17, 0x91, 0x17,
0x62, 0x63, 0x3a, 0xa5, 0xa5, 0x7a, 0xf9, 0x66, 0x2d, 0xab, 0x57, 0x81, 0xfc, 0x2c, 0x3c, 0x8c,
0x2b, 0x97, 0x3f, 0x8c, 0xa7, 0x9e, 0xbe, 0xd5, 0xe9, 0xa7, 0x2f, 0xfa, 0x3e, 0x80, 0x15, 0x22,
0x81, 0xba, 0xf8, 0x1b, 0x6e, 0xc3, 0x70, 0x0e, 0x02, 0xe7, 0x26, 0xdc, 0x78, 0x8e, 0xb9, 0x60,
0x74, 0x5c, 0x44, 0xed, 0x78, 0xd0, 0x38, 0xe8, 0x3f, 0x0b, 0x02, 0x86, 0x39, 0x47, 0x77, 0xa1,
0x7e, 0xe2, 0x85, 0x64, 0xa4, 0x0f, 0xd6, 0x92, 0xcd, 0x3b, 0x07, 0xfd, 0x5f, 0x28, 0xae, 0x6b,
0x46, 0x65, 0x32, 0xf3, 0xf4, 0x14, 0x13, 0x46, 0x4b, 0xca, 0xf5, 0x0f, 0x3d, 0xfe, 0xd6, 0x5c,
0xd9, 0xea, 0xdb, 0xf9, 0x63, 0x09, 0x1a, 0x07, 0x91, 0xc0, 0xec, 0xc4, 0xf3, 0xd5, 0x63, 0x4c,
0x37, 0x07, 0x4c, 0x90, 0x0c, 0x25, 0x67, 0xaa, 0xd0, 0x69, 0x85, 0xea, 0x5b, 0xe6, 0x9d, 0x14,
0x5c, 0x1a, 0xa7, 0x65, 0x0b, 0xca, 0x0c, 0xb8, 0x79, 0x19, 0x19, 0xe9, 0x50, 0x24, 0xa6, 0x3e,
0x90, 0x9f, 0xd2, 0xe0, 0xe9, 0xb9, 0x14, 0x30, 0x51, 0x31, 0x94, 0xf3, 0x04, 0x20, 0x45, 0xc5,
0x65, 0x85, 0x96, 0x51, 0xa6, 0x48, 0xb0, 0x96, 0x2c, 0xdf, 0xcd, 0x89, 0x38, 0xdf, 0x40, 0xcd,
0xa5, 0x89, 0xd0, 0x5b, 0x1e, 0x9b, 0xd7, 0x5b, 0xc3, 0x55, 0xdf, 0x32, 0x40, 0x43, 0x4f, 0xe0,
0x73, 0x6f, 0x6c, 0x03, 0x64, 0xc8, 0x9c, 0xfb, 0x95, 0x82, 0xfb, 0xf2, 0x8d, 0xaa, 0x9e, 0x60,
0x0a, 0x7a, 0xc3, 0x35, 0x94, 0xbc, 0x6a, 0xb8, 0x4f, 0x63, 0xac, 0xc0, 0xb7, 0x5d, 0x4d, 0x38,
0xf7, 0xa0, 0xae, 0x8c, 0xcb, 0xcd, 0x61, 0xbe, 0x0c, 0xe6, 0xa6, 0xc6, 0xac, 0x78, 0xae, 0x19,
0x72, 0xf6, 0xed, 0x2b, 0x32, 0x73, 0xc5, 0x6c, 0xda, 0x7b, 0xd0, 0x20, 0x96, 0x67, 0x52, 0xdd,
0x94, 0xd7, 0x99, 0x84, 0xf3, 0x1c, 0x56, 0x9f, 0x05, 0xc1, 0x77, 0xd5, 0xb2, 0x6f, 0x5b, 0x2d,
0xdf, 0x55, 0xd1, 0x63, 0x58, 0xd5, 0x7e, 0x69, 0x3f, 0xad, 0x96, 0x1f, 0x42, 0x9d, 0xd9, 0x98,
0x94, 0xb2, 0xde, 0x94, 0x11, 0x32, 0x63, 0xf2, 0x48, 0xc8, 0x27, 0x76, 0xb6, 0xa4, 0xf6, 0x48,
0xac, 0x42, 0x47, 0x0e, 0x14, 0x74, 0x3a, 0x3b, 0xb0, 0xfa, 0x2a, 0x1a, 0x91, 0x08, 0xef, 0xf6,
0x8f, 0x5e, 0xe2, 0x34, 0xa7, 0x22, 0xa8, 0xca, 0x82, 0x49, 0x19, 0x5a, 0x74, 0xd5, 0xb7, 0x4c,
0x32, 0xd1, 0xf1, 0xc0, 0x8f, 0x13, 0x6e, 0x9a, 0x41, 0xf5, 0xe8, 0x78, 0x37, 0x4e, 0xb8, 0xf3,
0x13, 0xf5, 0xc6, 0xc5, 0x38, 0x70, 0xbd, 0x28, 0xa0, 0xe1, 0x73, 0x7c, 0x96, 0x53, 0x93, 0xbe,
0xa7, 0x6c, 0xda, 0xfc, 0xb6, 0x04, 0x0b, 0x26, 0x19, 0xa8, 0x5d, 0xc3, 0xc8, 0x19, 0x66, 0xe9,
0xa1, 0x51, 0x94, 0x7c, 0xf2, 0xe9, 0xaf, 0x01, 0x8d, 0x05, 0xa1, 0x69, 0x8a, 0x69, 0x6b, 0xee,
0x2b, 0xcd, 0xcc, 0x6d, 0xae, 0x4a, 0x61, 0x73, 0xad, 0x43, 0xfd, 0x84, 0x8b, 0x71, 0x9c, 0x6e,
0x3a, 0x4d, 0xc9, 0xed, 0x6b, 0xf5, 0xd5, 0x94, 0x3e, 0x4b, 0xca, 0xc7, 0x75, 0x48, 0x93, 0x48,
0x0c, 0x62, 0x4a, 0x22, 0xa1, 0x9a, 0x75, 0x0d, 0x17, 0x14, 0xab, 0x2f, 0x39, 0xce, 0x1f, 0x4a,
0x50, 0xd7, 0x4d, 0x40, 0x59, 0xbc, 0xa7, 0x59, 0xb8, 0x4c, 0xd4, 0x8d, 0xa6, 0x6c, 0x99, 0x13,
0xae, 0x2c, 0xdd, 0x84, 0x85, 0xb3, 0x70, 0x10, 0x7b, 0xe2, 0xd4, 0x42, 0x3b, 0x0b, 0xfb, 0x9e,
0x38, 0x95, 0x9e, 0x65, 0xc9, 0x5c, 0x8d, 0x6b, 0x88, 0xed, 0x94, 0xab, 0xc4, 0xe6, 0x22, 0x75,
0x7e, 0x23, 0xdf, 0x2c, 0x69, 0x03, 0x6c, 0x05, 0x2a, 0x49, 0x0a, 0x46, 0x7e, 0x4a, 0xce, 0x30,
0xbd, 0x06, 0xe4, 0x27, 0xba, 0x0b, 0x4b, 0x5e, 0x10, 0x10, 0x39, 0xdd, 0x1b, 0xed, 0x93, 0xc0,
0x76, 0x71, 0x26, 0xb8, 0x9f, 0xf4, 0x60, 0xd1, 0x66, 0x44, 0x54, 0x87, 0xf2, 0xd9, 0xc3, 0x95,
0xef, 0xa9, 0xff, 0x9f, 0xae, 0x94, 0xb6, 0xff, 0xd5, 0x86, 0xd6, 0xb3, 0x21, 0x8e, 0x84, 0xa9,
0xb0, 0xd1, 0x3e, 0x2c, 0x4f, 0x74, 0x6c, 0x91, 0x79, 0x72, 0xcd, 0x6e, 0xe4, 0xf6, 0xd6, 0xb7,
0x74, 0x07, 0x78, 0xcb, 0x76, 0x80, 0xb7, 0xf6, 0xc2, 0x58, 0x8c, 0xd1, 0x1e, 0x2c, 0x15, 0x7b,
0x9b, 0xe8, 0x96, 0xbd, 0x30, 0x66, 0x74, 0x3c, 0xe7, 0xaa, 0xd9, 0x87, 0xe5, 0x89, 0x36, 0xa7,
0xc5, 0x33, 0xbb, 0xfb, 0x39, 0x57, 0xd1, 0x53, 0x68, 0xe6, 0xfa, 0x9a, 0xa8, 0xab, 0x95, 0x4c,
0xb7, 0x3a, 0xe7, 0x2a, 0xd8, 0x85, 0x76, 0xa1, 0xd5, 0x88, 0x7a, 0xc6, 0x9f, 0x19, 0xfd, 0xc7,
0xb9, 0x4a, 0x76, 0xa0, 0x99, 0xeb, 0xf8, 0x59, 0x14, 0xd3, 0x6d, 0xc5, 0xde, 0x07, 0x33, 0x46,
0x4c, 0xcd, 0xf2, 0x02, 0xda, 0x85, 0xfe, 0x9c, 0x05, 0x32, 0xab, 0x37, 0xd8, 0xbb, 0x35, 0x73,
0xcc, 0x68, 0xda, 0x87, 0xe5, 0x89, 0x6e, 0x9d, 0x0d, 0xee, 0xec, 0x26, 0xde, 0x5c, 0xb7, 0xbe,
0x50, 0x8b, 0x9d, 0x2b, 0x4f, 0x73, 0x8b, 0x3d, 0xdd, 0x9b, 0xeb, 0x7d, 0x38, 0x7b, 0xd0, 0xa0,
0xda, 0x83, 0xa5, 0x62, 0x5b, 0xce, 0x2a, 0x9b, 0xd9, 0xac, 0xbb, 0x7c, 0xe7, 0x14, 0x3a, 0x74,
0xd9, 0xce, 0x99, 0xd5, 0xb8, 0x9b, 0xab, 0xe8, 0x19, 0x80, 0xa9, 0x62, 0x03, 0x12, 0xa5, 0x4b,
0x36, 0x55, 0x3d, 0xa7, 0x4b, 0x36, 0xa3, 0xe2, 0x7d, 0x0a, 0xa0, 0x8b, 0xcf, 0x80, 0x26, 0x02,
0xdd, 0xb4, 0x30, 0x26, 0x2a, 0xde, 0x5e, 0x77, 0x7a, 0x60, 0x4a, 0x01, 0x66, 0xec, 0x2a, 0x0a,
0x9e, 0x00, 0x64, 0x45, 0xad, 0x55, 0x30, 0x55, 0xe6, 0x5e, 0x12, 0x83, 0x56, 0xbe, 0x84, 0x45,
0xc6, 0xd7, 0x19, 0x65, 0xed, 0x5c, 0x15, 0x8f, 0xa0, 0x95, 0xbf, 0x8b, 0xad, 0x8a, 0x19, 0xf7,
0x73, 0x6f, 0xf2, 0x0e, 0x45, 0x3f, 0xb7, 0x1b, 0x35, 0x63, 0x15, 0x36, 0xea, 0x7f, 0xa5, 0x61,
0xe2, 0x0e, 0x2f, 0xe6, 0x91, 0xf7, 0x6b, 0xf8, 0x19, 0xb4, 0xf2, 0x97, 0xb7, 0xc5, 0x3f, 0xe3,
0x42, 0xef, 0x15, 0x2e, 0x70, 0xf4, 0x14, 0x96, 0x8a, 0x17, 0x37, 0xca, 0x1d, 0xca, 0xa9, 0xeb,
0xbc, 0xb7, 0x32, 0x61, 0x98, 0xa3, 0x07, 0x00, 0xd9, 0x05, 0x6f, 0xd7, 0x6e, 0xea, 0xca, 0x9f,
0xb0, 0xba, 0x0b, 0xed, 0x42, 0xd9, 0x6f, 0xb3, 0xc4, 0xac, 0xb7, 0xc0, 0x65, 0x49, 0xbc, 0x58,
0x86, 0x5b, 0xe8, 0x33, 0x8b, 0xf3, 0xcb, 0x76, 0x4f, 0xbe, 0x18, 0xb1, 0xa1, 0x9b, 0x51, 0xa0,
0xbc, 0xe7, 0x34, 0xe7, 0x6b, 0x91, 0xdc, 0x69, 0x9e, 0x51, 0xa2, 0xcc, 0x53, 0xb4, 0xd3, 0xfa,
0xdb, 0xbb, 0xdb, 0xa5, 0xbf, 0xbf, 0xbb, 0x5d, 0xfa, 0xe7, 0xbb, 0xdb, 0xa5, 0xe3, 0xba, 0x1a,
0x7d, 0xf0, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2b, 0xc8, 0x6c, 0x30, 0xe5, 0x1c, 0x00, 0x00,
}