docker: move recoverable error proto to shared structs

This commit is contained in:
Nick Ethier 2018-11-14 06:20:35 -05:00
parent 585e468085
commit ced5d5c445
No known key found for this signature in database
GPG key ID: 07C1A3ECED90D24A
11 changed files with 621 additions and 568 deletions

294
drivers/docker/config.go Normal file
View file

@ -0,0 +1,294 @@
package docker
import (
"strconv"
"strings"
"time"
hclog "github.com/hashicorp/go-hclog"
"github.com/hashicorp/nomad/client/structs"
"github.com/hashicorp/nomad/plugins/base"
"github.com/hashicorp/nomad/plugins/drivers"
"github.com/hashicorp/nomad/plugins/shared/hclspec"
"github.com/hashicorp/nomad/plugins/shared/loader"
)
func PluginLoader(opts map[string]string) (map[string]interface{}, error) {
conf := map[string]interface{}{}
if v, ok := opts["docker.endpoint"]; ok {
conf["endpoint"] = v
}
if v, ok := opts["docker.auth.config"]; ok {
conf["auth_config"] = v
}
if v, ok := opts["docker.auth.helper"]; ok {
conf["auth_helper"] = v
}
if _, ok := opts["docker.tls.cert"]; ok {
conf["tls"] = map[string]interface{}{
"cert": opts["docker.tls.cert"],
"key": opts["docker.tls.key"],
"ca": opts["docker.tls.ca"],
}
}
if v, ok := opts["docker.cleanup.image.delay"]; ok {
conf["image_gc_delay"] = v
}
if v, ok := opts["docker.volumes.selinuxlabel"]; ok {
conf["volumes_selinuxlabel"] = v
}
if v, ok := opts["docker.caps.whitelist"]; ok {
conf["allow_caps"] = strings.Split(v, ",")
}
if v, err := strconv.ParseBool(opts["docker.cleanup.image"]); err == nil {
conf["image_gc"] = v
}
if v, err := strconv.ParseBool(opts["docker.volumes.enabled"]); err == nil {
conf["volumes_enabled"] = v
}
if v, err := strconv.ParseBool(opts["docker.privileged.enabled"]); err == nil {
conf["allow_privileged"] = v
}
if v, err := strconv.ParseBool(opts["docker.cleanup.container"]); err == nil {
conf["container_gc"] = v
}
return conf, nil
}
var (
// PluginID is the rawexec plugin metadata registered in the plugin
// catalog.
PluginID = loader.PluginID{
Name: pluginName,
PluginType: base.PluginTypeDriver,
}
// PluginConfig is the rawexec factory function registered in the
// plugin catalog.
PluginConfig = &loader.InternalPluginConfig{
Config: map[string]interface{}{},
Factory: func(l hclog.Logger) interface{} { return NewDockerDriver(l) },
}
// pluginInfo is the response returned for the PluginInfo RPC
pluginInfo = &base.PluginInfoResponse{
Type: base.PluginTypeDriver,
PluginApiVersion: "0.0.1",
PluginVersion: "0.1.0",
Name: pluginName,
}
// configSpec is the hcl specification returned by the ConfigSchema RPC
configSpec = hclspec.NewObject(map[string]*hclspec.Spec{
"endpoint": hclspec.NewAttr("endpoint", "string", false),
"auth_config": hclspec.NewAttr("auth_config", "string", false),
"auth_helper": hclspec.NewAttr("auth_helper", "string", false),
"tls": hclspec.NewBlock("tls", false, hclspec.NewObject(map[string]*hclspec.Spec{
"cert": hclspec.NewAttr("cert", "string", false),
"key": hclspec.NewAttr("key", "string", false),
"ca": hclspec.NewAttr("ca", "string", false),
})),
"image_gc": hclspec.NewDefault(
hclspec.NewAttr("image_gc", "bool", false),
hclspec.NewLiteral("true"),
),
"image_gc_delay": hclspec.NewAttr("image_gc_delay", "string", false),
"volumes_enabled": hclspec.NewDefault(
hclspec.NewAttr("volumes_enabled", "bool", false),
hclspec.NewLiteral("true"),
),
"volumes_selinuxlabel": hclspec.NewAttr("volumes_selinuxlabel", "string", false),
"allow_privileged": hclspec.NewAttr("allow_privileged", "bool", false),
"allow_caps": hclspec.NewDefault(
hclspec.NewAttr("allow_caps", "list(string)", false),
hclspec.NewLiteral(`["CHOWN","DAC_OVERRIDE","FSETID","FOWNER","MKNOD","NET_RAW","SETGID","SETUID","SETFCAP","SETPCAP","NET_BIND_SERVICE","SYS_CHROOT","KILL","AUDIT_WRITE"]`),
),
"container_gc": hclspec.NewDefault(
hclspec.NewAttr("container_gc", "bool", false),
hclspec.NewLiteral("true"),
),
})
// taskConfigSpec is the hcl specification for the driver config section of
// a task within a job. It is returned in the TaskConfigSchema RPC
taskConfigSpec = hclspec.NewObject(map[string]*hclspec.Spec{
"image": hclspec.NewAttr("image", "string", true),
"advertise_ipv6_address": hclspec.NewAttr("advertise_ipv6_address", "bool", false),
"args": hclspec.NewAttr("args", "list(string)", false),
"auth": hclspec.NewBlock("auth", false, hclspec.NewObject(map[string]*hclspec.Spec{
"username": hclspec.NewAttr("username", "string", false),
"password": hclspec.NewAttr("password", "string", false),
"email": hclspec.NewAttr("email", "string", false),
"server_address": hclspec.NewAttr("server_address", "string", false),
})),
"auth_soft_fail": hclspec.NewAttr("auth_soft_fail", "bool", false),
"cap_add": hclspec.NewAttr("cap_add", "list(string)", false),
"cap_drop": hclspec.NewAttr("cap_drop", "list(string)", false),
"command": hclspec.NewAttr("command", "string", false),
"cpu_hard_limit": hclspec.NewAttr("cpu_hard_limit", "bool", false),
"cpu_cfs_period": hclspec.NewAttr("cpu_cfs_period", "number", false),
"devices": hclspec.NewBlockSet("devices", hclspec.NewObject(map[string]*hclspec.Spec{
"host_path": hclspec.NewAttr("host_path", "string", false),
"container_path": hclspec.NewAttr("container_path", "string", false),
"cgroup_permissions": hclspec.NewAttr("cgroup_permissions", "string", false),
})),
"dns_search_domains": hclspec.NewAttr("dns_search_domains", "list(string)", false),
"dns_options": hclspec.NewAttr("dns_options", "list(string)", false),
"dns_servers": hclspec.NewAttr("dns_servers", "list(string)", false),
"entrypoint": hclspec.NewAttr("entrypoint", "list(string)", false),
"extra_hosts": hclspec.NewAttr("extra_hosts", "list(string)", false),
"force_pull": hclspec.NewAttr("force_pull", "bool", false),
"hostname": hclspec.NewAttr("hostname", "string", false),
"interactive": hclspec.NewAttr("interactive", "bool", false),
"ipc_mode": hclspec.NewAttr("ipc_mode", "string", false),
"ipv4_address": hclspec.NewAttr("ipv4_address", "string", false),
"ipv6_address": hclspec.NewAttr("ipv6_address", "string", false),
"labels": hclspec.NewAttr("labels", "map(string)", false),
"load": hclspec.NewAttr("load", "string", false),
"logging": hclspec.NewAttr("logging", "map(string)", false),
"mac_address": hclspec.NewAttr("mac_address", "map(string)", false),
"mounts": hclspec.NewBlockSet("mounts", hclspec.NewObject(map[string]*hclspec.Spec{
"target": hclspec.NewAttr("target", "string", false),
"source": hclspec.NewAttr("source", "string", false),
"readonly": hclspec.NewAttr("readonly", "bool", false),
"volume_options": hclspec.NewBlockSet("volume_options", hclspec.NewObject(map[string]*hclspec.Spec{
"no_copy": hclspec.NewAttr("no_copy", "bool", false),
"labels": hclspec.NewAttr("labels", "map(string)", false),
"driver_config": hclspec.NewBlockSet("driver_config", hclspec.NewObject(map[string]*hclspec.Spec{
"name": hclspec.NewAttr("name", "string", false),
"options": hclspec.NewAttr("name", "map(string)", false),
})),
})),
})),
"network_aliases": hclspec.NewAttr("network_aliases", "list(string)", false),
"network_mode": hclspec.NewAttr("network_mode", "string", false),
"pids_limit": hclspec.NewAttr("pids_limit", "number", false),
"pid_mode": hclspec.NewAttr("pid_mode", "string", false),
"port_map": hclspec.NewAttr("port_map", "map(number)", false),
"privileged": hclspec.NewAttr("privileged", "bool", false),
"readonly_rootfs": hclspec.NewAttr("readonly_rootfs", "bool", false),
"security_opt": hclspec.NewAttr("security_opt", "list(string)", false),
"shm_size": hclspec.NewAttr("shm_size", "number", false),
"sysctl": hclspec.NewAttr("sysctl", "map(string)", false),
"tty": hclspec.NewAttr("tty", "bool", false),
"ulimit": hclspec.NewAttr("ulimit", "map(string)", false),
"uts_mode": hclspec.NewAttr("uts_mode", "string", false),
"userns_mode": hclspec.NewAttr("userns_mode", "string", false),
"volumes": hclspec.NewAttr("volumes", "list(string)", false),
"volume_driver": hclspec.NewAttr("volume_driver", "string", false),
"work_dir": hclspec.NewAttr("work_dir", "string", false),
})
// capabilities is returned by the Capabilities RPC and indicates what
// optional features this driver supports
capabilities = &drivers.Capabilities{
SendSignals: true,
Exec: true,
FSIsolation: structs.FSIsolationImage,
}
)
type TaskConfig struct {
Image string `codec:"image"`
AdvertiseIPv6Addr bool `codec:"advertise_ipv6_address"`
Args []string `codec:"args"`
Auth DockerAuth `codec:"auth"`
AuthSoftFail bool `codec:"auth_soft_fail"`
CapAdd []string `codec:"cap_add"`
CapDrop []string `codec:"cap_drop"`
Command string `codec:"command"`
CPUCFSPeriod int64 `codec:"cpu_cfs_period"`
CPUHardLimit bool `codec:"cpu_hard_limit"`
Devices []DockerDevice `codec:"devices"`
DNSSearchDomains []string `codec:"dns_search_domains"`
DNSOptions []string `codec:"dns_options"`
DNSServers []string `codec:"dns_servers"`
Entrypoint []string `codec:"entrypoint"`
ExtraHosts []string `codec:"extra_hosts"`
ForcePull bool `codec:"force_pull"`
Hostname string `codec:"hostname"`
Interactive bool `codec:"interactive"`
IPCMode string `codec:"ipc_mode"`
IPv4Address string `codec:"ipv4_address"`
IPv6Address string `codec:"ipv6_address"`
Labels map[string]string `codec:"labels"`
LoadImage string `codec:"load"`
Logging DockerLogging `codec:"logging"`
MacAddress string `codec:"mac_address"`
Mounts []DockerMount `codec:"mounts"`
NetworkAliases []string `codec:"network_aliases"`
NetworkMode string `codec:"network_mode"`
PidsLimit int64 `codec:"pids_limit"`
PidMode string `codec:"pid_mode"`
PortMap map[string]int `codec:"port_map"`
Privileged bool `codec:"privileged"`
ReadonlyRootfs bool `codec:"readonly_rootfs"`
SecurityOpt []string `codec:"security_opt"`
ShmSize int64 `codec:"shm_size"`
Sysctl map[string]string `codec:"sysctl"`
TTY bool `codec:"tty"`
Ulimit map[string]string `codec:"ulimit"`
UTSMode string `codec:"uts_mode"`
UsernsMode string `codec:"userns_mode"`
Volumes []string `codec:"volumes"`
VolumeDriver string `codec:"volume_driver"`
WorkDir string `codec:"work_dir"`
}
type DockerAuth struct {
Username string `codec:"username"`
Password string `codec:"password"`
Email string `codec:"email"`
ServerAddr string `codec:"server_address"`
}
type DockerDevice struct {
HostPath string `codec:"host_path"`
ContainerPath string `codec:"container_path"`
CgroupPermissions string `codec:"cgroup_permissions"`
}
type DockerLogging struct {
Type string `codec:"type"`
Config map[string]string `codec:"config"`
}
type DockerMount struct {
Target string `codec:"target"`
Source string `codec:"source"`
ReadOnly bool `codec:"readonly"`
VolumeOptions DockerVolumeOptions `codec:"volume_options"`
}
type DockerVolumeOptions struct {
NoCopy bool `codec:"no_copy"`
Labels map[string]string `codec:"labels"`
DriverConfig DockerVolumeDriverConfig `codec:"driver_config"`
}
// VolumeDriverConfig holds a map of volume driver specific options
type DockerVolumeDriverConfig struct {
Name string `codec:"name"`
Options map[string]string `codec:"options"`
}
type DriverConfig struct {
Endpoint string `codec:"endpoint"`
AuthConfig string `codec:"auth_config"`
AuthHelper string `codec:"auth_helper"`
TLS TLSConfig `codec:"tls"`
ImageGC bool `codec:"image_gc"`
ImageGCDelay string `codec:"image_gc_delay"`
imageGCDelayDuration time.Duration `codec:"-"`
VolumesEnabled bool `codec:"volumes_enabled"`
VolumesSelinuxLabel string `codec:"volumes_selinuxlabel"`
AllowPrivileged bool `codec:"allow_privileged"`
AllowCaps []string `codec:"allow_caps"`
ContainerGC bool `codec:"container_gc"`
}
type TLSConfig struct {
Cert string `codec:"cert"`
Key string `codec:"key"`
CA string `codec:"ca"`
}

View file

@ -26,7 +26,6 @@ import (
"github.com/hashicorp/nomad/plugins/drivers"
"github.com/hashicorp/nomad/plugins/drivers/utils"
"github.com/hashicorp/nomad/plugins/shared/hclspec"
"github.com/hashicorp/nomad/plugins/shared/loader"
)
const (
@ -56,181 +55,6 @@ const (
)
var (
// PluginID is the rawexec plugin metadata registered in the plugin
// catalog.
PluginID = loader.PluginID{
Name: pluginName,
PluginType: base.PluginTypeDriver,
}
// PluginConfig is the rawexec factory function registered in the
// plugin catalog.
PluginConfig = &loader.InternalPluginConfig{
Config: map[string]interface{}{},
Factory: func(l hclog.Logger) interface{} { return NewDockerDriver(l) },
}
)
func PluginLoader(opts map[string]string) (map[string]interface{}, error) {
conf := map[string]interface{}{}
if v, ok := opts["docker.endpoint"]; ok {
conf["endpoint"] = v
}
if v, ok := opts["docker.auth.config"]; ok {
conf["auth_config"] = v
}
if v, ok := opts["docker.auth.helper"]; ok {
conf["auth_helper"] = v
}
if _, ok := opts["docker.tls.cert"]; ok {
conf["tls"] = map[string]interface{}{
"cert": opts["docker.tls.cert"],
"key": opts["docker.tls.key"],
"ca": opts["docker.tls.ca"],
}
}
if v, ok := opts["docker.cleanup.image.delay"]; ok {
conf["image_gc_delay"] = v
}
if v, ok := opts["docker.volumes.selinuxlabel"]; ok {
conf["volumes_selinuxlabel"] = v
}
if v, ok := opts["docker.caps.whitelist"]; ok {
conf["allow_caps"] = strings.Split(v, ",")
}
if v, err := strconv.ParseBool(opts["docker.cleanup.image"]); err == nil {
conf["image_gc"] = v
}
if v, err := strconv.ParseBool(opts["docker.volumes.enabled"]); err == nil {
conf["volumes_enabled"] = v
}
if v, err := strconv.ParseBool(opts["docker.privileged.enabled"]); err == nil {
conf["allow_privileged"] = v
}
if v, err := strconv.ParseBool(opts["docker.cleanup.container"]); err == nil {
conf["container_gc"] = v
}
return conf, nil
}
var (
// pluginInfo is the response returned for the PluginInfo RPC
pluginInfo = &base.PluginInfoResponse{
Type: base.PluginTypeDriver,
PluginApiVersion: "0.0.1",
PluginVersion: "0.1.0",
Name: pluginName,
}
// configSpec is the hcl specification returned by the ConfigSchema RPC
configSpec = hclspec.NewObject(map[string]*hclspec.Spec{
"endpoint": hclspec.NewAttr("endpoint", "string", false),
"auth_config": hclspec.NewAttr("auth_config", "string", false),
"auth_helper": hclspec.NewAttr("auth_helper", "string", false),
"tls": hclspec.NewBlock("tls", false, hclspec.NewObject(map[string]*hclspec.Spec{
"cert": hclspec.NewAttr("cert", "string", false),
"key": hclspec.NewAttr("key", "string", false),
"ca": hclspec.NewAttr("ca", "string", false),
})),
"image_gc": hclspec.NewDefault(
hclspec.NewAttr("image_gc", "bool", false),
hclspec.NewLiteral("true"),
),
"image_gc_delay": hclspec.NewAttr("image_gc_delay", "string", false),
"volumes_enabled": hclspec.NewDefault(
hclspec.NewAttr("volumes_enabled", "bool", false),
hclspec.NewLiteral("true"),
),
"volumes_selinuxlabel": hclspec.NewAttr("volumes_selinuxlabel", "string", false),
"allow_privileged": hclspec.NewAttr("allow_privileged", "bool", false),
"allow_caps": hclspec.NewDefault(
hclspec.NewAttr("allow_caps", "list(string)", false),
hclspec.NewLiteral(`["CHOWN","DAC_OVERRIDE","FSETID","FOWNER","MKNOD","NET_RAW","SETGID","SETUID","SETFCAP","SETPCAP","NET_BIND_SERVICE","SYS_CHROOT","KILL","AUDIT_WRITE"]`),
),
"container_gc": hclspec.NewDefault(
hclspec.NewAttr("container_gc", "bool", false),
hclspec.NewLiteral("true"),
),
})
// taskConfigSpec is the hcl specification for the driver config section of
// a task within a job. It is returned in the TaskConfigSchema RPC
taskConfigSpec = hclspec.NewObject(map[string]*hclspec.Spec{
"image": hclspec.NewAttr("image", "string", true),
"advertise_ipv6_address": hclspec.NewAttr("advertise_ipv6_address", "bool", false),
"args": hclspec.NewAttr("args", "list(string)", false),
"auth": hclspec.NewBlock("auth", false, hclspec.NewObject(map[string]*hclspec.Spec{
"username": hclspec.NewAttr("username", "string", false),
"password": hclspec.NewAttr("password", "string", false),
"email": hclspec.NewAttr("email", "string", false),
"server_address": hclspec.NewAttr("server_address", "string", false),
})),
"auth_soft_fail": hclspec.NewAttr("auth_soft_fail", "bool", false),
"cap_add": hclspec.NewAttr("cap_add", "list(string)", false),
"cap_drop": hclspec.NewAttr("cap_drop", "list(string)", false),
"command": hclspec.NewAttr("command", "string", false),
"cpu_hard_limit": hclspec.NewAttr("cpu_hard_limit", "bool", false),
"cpu_cfs_period": hclspec.NewAttr("cpu_cfs_period", "number", false),
"devices": hclspec.NewBlockSet("devices", hclspec.NewObject(map[string]*hclspec.Spec{
"host_path": hclspec.NewAttr("host_path", "string", false),
"container_path": hclspec.NewAttr("container_path", "string", false),
"cgroup_permissions": hclspec.NewAttr("cgroup_permissions", "string", false),
})),
"dns_search_domains": hclspec.NewAttr("dns_search_domains", "list(string)", false),
"dns_options": hclspec.NewAttr("dns_options", "list(string)", false),
"dns_servers": hclspec.NewAttr("dns_servers", "list(string)", false),
"entrypoint": hclspec.NewAttr("entrypoint", "list(string)", false),
"extra_hosts": hclspec.NewAttr("extra_hosts", "list(string)", false),
"force_pull": hclspec.NewAttr("force_pull", "bool", false),
"hostname": hclspec.NewAttr("hostname", "string", false),
"interactive": hclspec.NewAttr("interactive", "bool", false),
"ipc_mode": hclspec.NewAttr("ipc_mode", "string", false),
"ipv4_address": hclspec.NewAttr("ipv4_address", "string", false),
"ipv6_address": hclspec.NewAttr("ipv6_address", "string", false),
"labels": hclspec.NewAttr("labels", "map(string)", false),
"load": hclspec.NewAttr("load", "string", false),
"logging": hclspec.NewAttr("logging", "map(string)", false),
"mac_address": hclspec.NewAttr("mac_address", "map(string)", false),
"mounts": hclspec.NewBlockSet("mounts", hclspec.NewObject(map[string]*hclspec.Spec{
"target": hclspec.NewAttr("target", "string", false),
"source": hclspec.NewAttr("source", "string", false),
"readonly": hclspec.NewAttr("readonly", "bool", false),
"volume_options": hclspec.NewBlockSet("volume_options", hclspec.NewObject(map[string]*hclspec.Spec{
"no_copy": hclspec.NewAttr("no_copy", "bool", false),
"labels": hclspec.NewAttr("labels", "map(string)", false),
"driver_config": hclspec.NewBlockSet("driver_config", hclspec.NewObject(map[string]*hclspec.Spec{
"name": hclspec.NewAttr("name", "string", false),
"options": hclspec.NewAttr("name", "map(string)", false),
})),
})),
})),
"network_aliases": hclspec.NewAttr("network_aliases", "list(string)", false),
"network_mode": hclspec.NewAttr("network_mode", "string", false),
"pids_limit": hclspec.NewAttr("pids_limit", "number", false),
"pid_mode": hclspec.NewAttr("pid_mode", "string", false),
"port_map": hclspec.NewAttr("port_map", "map(number)", false),
"privileged": hclspec.NewAttr("privileged", "bool", false),
"readonly_rootfs": hclspec.NewAttr("readonly_rootfs", "bool", false),
"security_opt": hclspec.NewAttr("security_opt", "list(string)", false),
"shm_size": hclspec.NewAttr("shm_size", "number", false),
"sysctl": hclspec.NewAttr("sysctl", "map(string)", false),
"tty": hclspec.NewAttr("tty", "bool", false),
"ulimit": hclspec.NewAttr("ulimit", "map(string)", false),
"uts_mode": hclspec.NewAttr("uts_mode", "string", false),
"userns_mode": hclspec.NewAttr("userns_mode", "string", false),
"volumes": hclspec.NewAttr("volumes", "list(string)", false),
"volume_driver": hclspec.NewAttr("volume_driver", "string", false),
"work_dir": hclspec.NewAttr("work_dir", "string", false),
})
// capabilities is returned by the Capabilities RPC and indicates what
// optional features this driver supports
capabilities = &drivers.Capabilities{
SendSignals: true,
Exec: true,
FSIsolation: structs.FSIsolationImage,
}
// createClientsLock is a lock that protects reading/writing global client
// variables
createClientsLock sync.Mutex
@ -244,10 +68,6 @@ var (
// running operations such as waiting on containers and collect stats
waitClient *docker.Client
// healthCheckClient is a docker client with a timeout of 1 minute. This is
// necessary to have a shorter timeout than other API or fingerprint calls
healthCheckClient *docker.Client
// The statistics the Docker driver exposes
DockerMeasuredMemStats = []string{"RSS", "Cache", "Swap", "Max Usage"}
DockerMeasuredCpuStats = []string{"Throttled Periods", "Throttled Time", "Percent"}
@ -264,111 +84,6 @@ var (
}
)
type TaskConfig struct {
Image string `codec:"image"`
AdvertiseIPv6Addr bool `codec:"advertise_ipv6_address"`
Args []string `codec:"args"`
Auth DockerAuth `codec:"auth"`
AuthSoftFail bool `codec:"auth_soft_fail"`
CapAdd []string `codec:"cap_add"`
CapDrop []string `codec:"cap_drop"`
Command string `codec:"command"`
CPUCFSPeriod int64 `codec:"cpu_cfs_period"`
CPUHardLimit bool `codec:"cpu_hard_limit"`
Devices []DockerDevice `codec:"devices"`
DNSSearchDomains []string `codec:"dns_search_domains"`
DNSOptions []string `codec:"dns_options"`
DNSServers []string `codec:"dns_servers"`
Entrypoint []string `codec:"entrypoint"`
ExtraHosts []string `codec:"extra_hosts"`
ForcePull bool `codec:"force_pull"`
Hostname string `codec:"hostname"`
Interactive bool `codec:"interactive"`
IPCMode string `codec:"ipc_mode"`
IPv4Address string `codec:"ipv4_address"`
IPv6Address string `codec:"ipv6_address"`
Labels map[string]string `codec:"labels"`
LoadImage string `codec:"load"`
Logging DockerLogging `codec:"logging"`
MacAddress string `codec:"mac_address"`
Mounts []DockerMount `codec:"mounts"`
NetworkAliases []string `codec:"network_aliases"`
NetworkMode string `codec:"network_mode"`
PidsLimit int64 `codec:"pids_limit"`
PidMode string `codec:"pid_mode"`
PortMap map[string]int `codec:"port_map"`
Privileged bool `codec:"privileged"`
ReadonlyRootfs bool `codec:"readonly_rootfs"`
SecurityOpt []string `codec:"security_opt"`
ShmSize int64 `codec:"shm_size"`
Sysctl map[string]string `codec:"sysctl"`
TTY bool `codec:"tty"`
Ulimit map[string]string `codec:"ulimit"`
UTSMode string `codec:"uts_mode"`
UsernsMode string `codec:"userns_mode"`
Volumes []string `codec:"volumes"`
VolumeDriver string `codec:"volume_driver"`
WorkDir string `codec:"work_dir"`
}
type DockerAuth struct {
Username string `codec:"username"`
Password string `codec:"password"`
Email string `codec:"email"`
ServerAddr string `codec:"server_address"`
}
type DockerDevice struct {
HostPath string `codec:"host_path"`
ContainerPath string `codec:"container_path"`
CgroupPermissions string `codec:"cgroup_permissions"`
}
type DockerLogging struct {
Type string `codec:"type"`
Config map[string]string `codec:"config"`
}
type DockerMount struct {
Target string `codec:"target"`
Source string `codec:"source"`
ReadOnly bool `codec:"readonly"`
VolumeOptions DockerVolumeOptions `codec:"volume_options"`
}
type DockerVolumeOptions struct {
NoCopy bool `codec:"no_copy"`
Labels map[string]string `codec:"labels"`
DriverConfig DockerVolumeDriverConfig `codec:"driver_config"`
}
// VolumeDriverConfig holds a map of volume driver specific options
type DockerVolumeDriverConfig struct {
Name string `codec:"name"`
Options map[string]string `codec:"options"`
}
type DriverConfig struct {
Endpoint string `codec:"endpoint"`
AuthConfig string `codec:"auth_config"`
AuthHelper string `codec:"auth_helper"`
TLS TLSConfig `codec:"tls"`
ImageGC bool `codec:"image_gc"`
ImageGCDelay string `codec:"image_gc_delay"`
imageGCDelayDuration time.Duration `codec:"-"`
VolumesEnabled bool `codec:"volumes_enabled"`
VolumesSelinuxLabel string `codec:"volumes_selinuxlabel"`
AllowPrivileged bool `codec:"allow_privileged"`
AllowCaps []string `codec:"allow_caps"`
ContainerGC bool `codec:"container_gc"`
}
type TLSConfig struct {
Cert string `codec:"cert"`
Key string `codec:"key"`
CA string `codec:"ca"`
}
type Driver struct {
// eventer is used to handle multiplexing of TaskEvents calls such that an
// event can be broadcast to all callers
@ -657,7 +372,7 @@ CREATE:
dlogger, pluginClient, err := docklog.LaunchDockerLogger(d.logger)
if err != nil {
d.logger.Error("an error occured after container startup, terminating container", "container_id", container.ID)
d.logger.Error("an error occurred after container startup, terminating container", "container_id", container.ID)
client.RemoveContainer(docker.RemoveContainerOptions{ID: container.ID, Force: true})
return nil, nil, fmt.Errorf("failed to launch docker logger plugin: %v", err)
}
@ -673,7 +388,7 @@ CREATE:
}); err != nil {
pluginClient.Kill()
d.logger.Error("an error occured after container startup, terminating container", "container_id", container.ID)
d.logger.Error("an error occurred after container startup, terminating container", "container_id", container.ID)
client.RemoveContainer(docker.RemoveContainerOptions{ID: container.ID, Force: true})
return nil, nil, fmt.Errorf("failed to launch docker logger process %s: %v", container.ID, err)
}
@ -704,7 +419,7 @@ CREATE:
if err := handle.SetDriverState(h.buildState()); err != nil {
d.logger.Error("unable to encode container state into handle", "error", err)
d.logger.Error("an error occured after container startup, terminating container", "container_id", container.ID)
d.logger.Error("an error occurred after container startup, terminating container", "container_id", container.ID)
client.RemoveContainer(docker.RemoveContainerOptions{ID: container.ID, Force: true})
}

View file

@ -349,7 +349,7 @@ func TestDockerDriver_Start_Wait(t *testing.T) {
select {
case <-waitCh:
t.Fatalf("wait channel should not have recieved an exit result")
t.Fatalf("wait channel should not have received an exit result")
case <-time.After(time.Duration(tu.TestMultiplier()*1) * time.Second):
}
}

View file

@ -219,6 +219,7 @@ func (h *taskHandle) run() {
ExitCode: exitCode,
Signal: 0,
OOMKilled: oom,
Err: werr,
}
close(h.waitCh)
}

View file

@ -15,6 +15,7 @@ import (
"github.com/hashicorp/nomad/plugins/drivers/proto"
"github.com/hashicorp/nomad/plugins/shared"
"github.com/hashicorp/nomad/plugins/shared/hclspec"
sproto "github.com/hashicorp/nomad/plugins/shared/structs/proto"
"google.golang.org/grpc/status"
)
@ -138,7 +139,7 @@ func (d *driverPluginClient) StartTask(c *TaskConfig) (*TaskHandle, *cstructs.Dr
if err != nil {
st := status.Convert(err)
if len(st.Details()) > 0 {
if rec, ok := st.Details()[0].(*proto.RecoverableError); ok {
if rec, ok := st.Details()[0].(*sproto.RecoverableError); ok {
return nil, nil, structs.NewRecoverableError(err, rec.Recoverable)
}
}

View file

@ -18,7 +18,7 @@ import (
)
const (
// CheckBufSize is the size of the check output result<Paste>
// CheckBufSize is the size of the check output result
CheckBufSize = 4 * 1024
)

View file

@ -49,7 +49,7 @@ func (x TaskState) String() string {
return proto.EnumName(TaskState_name, int32(x))
}
func (TaskState) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{0}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{0}
}
type FingerprintResponse_HealthState int32
@ -75,7 +75,7 @@ func (x FingerprintResponse_HealthState) String() string {
return proto.EnumName(FingerprintResponse_HealthState_name, int32(x))
}
func (FingerprintResponse_HealthState) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{6, 0}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{5, 0}
}
type StartTaskResponse_Result int32
@ -101,7 +101,7 @@ func (x StartTaskResponse_Result) String() string {
return proto.EnumName(StartTaskResponse_Result_name, int32(x))
}
func (StartTaskResponse_Result) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{10, 0}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{9, 0}
}
type DriverCapabilities_FSIsolation int32
@ -127,7 +127,7 @@ func (x DriverCapabilities_FSIsolation) String() string {
return proto.EnumName(DriverCapabilities_FSIsolation_name, int32(x))
}
func (DriverCapabilities_FSIsolation) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{26, 0}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{25, 0}
}
type CPUUsage_Fields int32
@ -162,7 +162,7 @@ func (x CPUUsage_Fields) String() string {
return proto.EnumName(CPUUsage_Fields_name, int32(x))
}
func (CPUUsage_Fields) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{42, 0}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{41, 0}
}
type MemoryUsage_Fields int32
@ -194,47 +194,7 @@ func (x MemoryUsage_Fields) String() string {
return proto.EnumName(MemoryUsage_Fields_name, int32(x))
}
func (MemoryUsage_Fields) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{43, 0}
}
// RecoverableError is used with a grpc Status to indicate if the error is one
// which is recoverable and can be reattempted by the client.
type RecoverableError struct {
Recoverable bool `protobuf:"varint,1,opt,name=recoverable,proto3" json:"recoverable,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *RecoverableError) Reset() { *m = RecoverableError{} }
func (m *RecoverableError) String() string { return proto.CompactTextString(m) }
func (*RecoverableError) ProtoMessage() {}
func (*RecoverableError) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{0}
}
func (m *RecoverableError) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RecoverableError.Unmarshal(m, b)
}
func (m *RecoverableError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_RecoverableError.Marshal(b, m, deterministic)
}
func (dst *RecoverableError) XXX_Merge(src proto.Message) {
xxx_messageInfo_RecoverableError.Merge(dst, src)
}
func (m *RecoverableError) XXX_Size() int {
return xxx_messageInfo_RecoverableError.Size(m)
}
func (m *RecoverableError) XXX_DiscardUnknown() {
xxx_messageInfo_RecoverableError.DiscardUnknown(m)
}
var xxx_messageInfo_RecoverableError proto.InternalMessageInfo
func (m *RecoverableError) GetRecoverable() bool {
if m != nil {
return m.Recoverable
}
return false
return fileDescriptor_driver_41ce58b9a7aabf23, []int{42, 0}
}
type TaskConfigSchemaRequest struct {
@ -247,7 +207,7 @@ func (m *TaskConfigSchemaRequest) Reset() { *m = TaskConfigSchemaRequest
func (m *TaskConfigSchemaRequest) String() string { return proto.CompactTextString(m) }
func (*TaskConfigSchemaRequest) ProtoMessage() {}
func (*TaskConfigSchemaRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{1}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{0}
}
func (m *TaskConfigSchemaRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskConfigSchemaRequest.Unmarshal(m, b)
@ -279,7 +239,7 @@ func (m *TaskConfigSchemaResponse) Reset() { *m = TaskConfigSchemaRespon
func (m *TaskConfigSchemaResponse) String() string { return proto.CompactTextString(m) }
func (*TaskConfigSchemaResponse) ProtoMessage() {}
func (*TaskConfigSchemaResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{2}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{1}
}
func (m *TaskConfigSchemaResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskConfigSchemaResponse.Unmarshal(m, b)
@ -316,7 +276,7 @@ func (m *CapabilitiesRequest) Reset() { *m = CapabilitiesRequest{} }
func (m *CapabilitiesRequest) String() string { return proto.CompactTextString(m) }
func (*CapabilitiesRequest) ProtoMessage() {}
func (*CapabilitiesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{3}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{2}
}
func (m *CapabilitiesRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CapabilitiesRequest.Unmarshal(m, b)
@ -351,7 +311,7 @@ func (m *CapabilitiesResponse) Reset() { *m = CapabilitiesResponse{} }
func (m *CapabilitiesResponse) String() string { return proto.CompactTextString(m) }
func (*CapabilitiesResponse) ProtoMessage() {}
func (*CapabilitiesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{4}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{3}
}
func (m *CapabilitiesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CapabilitiesResponse.Unmarshal(m, b)
@ -388,7 +348,7 @@ func (m *FingerprintRequest) Reset() { *m = FingerprintRequest{} }
func (m *FingerprintRequest) String() string { return proto.CompactTextString(m) }
func (*FingerprintRequest) ProtoMessage() {}
func (*FingerprintRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{5}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{4}
}
func (m *FingerprintRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FingerprintRequest.Unmarshal(m, b)
@ -431,7 +391,7 @@ func (m *FingerprintResponse) Reset() { *m = FingerprintResponse{} }
func (m *FingerprintResponse) String() string { return proto.CompactTextString(m) }
func (*FingerprintResponse) ProtoMessage() {}
func (*FingerprintResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{6}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{5}
}
func (m *FingerprintResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FingerprintResponse.Unmarshal(m, b)
@ -486,7 +446,7 @@ func (m *RecoverTaskRequest) Reset() { *m = RecoverTaskRequest{} }
func (m *RecoverTaskRequest) String() string { return proto.CompactTextString(m) }
func (*RecoverTaskRequest) ProtoMessage() {}
func (*RecoverTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{7}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{6}
}
func (m *RecoverTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RecoverTaskRequest.Unmarshal(m, b)
@ -530,7 +490,7 @@ func (m *RecoverTaskResponse) Reset() { *m = RecoverTaskResponse{} }
func (m *RecoverTaskResponse) String() string { return proto.CompactTextString(m) }
func (*RecoverTaskResponse) ProtoMessage() {}
func (*RecoverTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{8}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{7}
}
func (m *RecoverTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RecoverTaskResponse.Unmarshal(m, b)
@ -562,7 +522,7 @@ func (m *StartTaskRequest) Reset() { *m = StartTaskRequest{} }
func (m *StartTaskRequest) String() string { return proto.CompactTextString(m) }
func (*StartTaskRequest) ProtoMessage() {}
func (*StartTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{9}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{8}
}
func (m *StartTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StartTaskRequest.Unmarshal(m, b)
@ -616,7 +576,7 @@ func (m *StartTaskResponse) Reset() { *m = StartTaskResponse{} }
func (m *StartTaskResponse) String() string { return proto.CompactTextString(m) }
func (*StartTaskResponse) ProtoMessage() {}
func (*StartTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{10}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{9}
}
func (m *StartTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StartTaskResponse.Unmarshal(m, b)
@ -676,7 +636,7 @@ func (m *WaitTaskRequest) Reset() { *m = WaitTaskRequest{} }
func (m *WaitTaskRequest) String() string { return proto.CompactTextString(m) }
func (*WaitTaskRequest) ProtoMessage() {}
func (*WaitTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{11}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{10}
}
func (m *WaitTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WaitTaskRequest.Unmarshal(m, b)
@ -717,7 +677,7 @@ func (m *WaitTaskResponse) Reset() { *m = WaitTaskResponse{} }
func (m *WaitTaskResponse) String() string { return proto.CompactTextString(m) }
func (*WaitTaskResponse) ProtoMessage() {}
func (*WaitTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{12}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{11}
}
func (m *WaitTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WaitTaskResponse.Unmarshal(m, b)
@ -769,7 +729,7 @@ func (m *StopTaskRequest) Reset() { *m = StopTaskRequest{} }
func (m *StopTaskRequest) String() string { return proto.CompactTextString(m) }
func (*StopTaskRequest) ProtoMessage() {}
func (*StopTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{13}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{12}
}
func (m *StopTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StopTaskRequest.Unmarshal(m, b)
@ -820,7 +780,7 @@ func (m *StopTaskResponse) Reset() { *m = StopTaskResponse{} }
func (m *StopTaskResponse) String() string { return proto.CompactTextString(m) }
func (*StopTaskResponse) ProtoMessage() {}
func (*StopTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{14}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{13}
}
func (m *StopTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StopTaskResponse.Unmarshal(m, b)
@ -854,7 +814,7 @@ func (m *DestroyTaskRequest) Reset() { *m = DestroyTaskRequest{} }
func (m *DestroyTaskRequest) String() string { return proto.CompactTextString(m) }
func (*DestroyTaskRequest) ProtoMessage() {}
func (*DestroyTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{15}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{14}
}
func (m *DestroyTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DestroyTaskRequest.Unmarshal(m, b)
@ -898,7 +858,7 @@ func (m *DestroyTaskResponse) Reset() { *m = DestroyTaskResponse{} }
func (m *DestroyTaskResponse) String() string { return proto.CompactTextString(m) }
func (*DestroyTaskResponse) ProtoMessage() {}
func (*DestroyTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{16}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{15}
}
func (m *DestroyTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DestroyTaskResponse.Unmarshal(m, b)
@ -930,7 +890,7 @@ func (m *InspectTaskRequest) Reset() { *m = InspectTaskRequest{} }
func (m *InspectTaskRequest) String() string { return proto.CompactTextString(m) }
func (*InspectTaskRequest) ProtoMessage() {}
func (*InspectTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{17}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{16}
}
func (m *InspectTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InspectTaskRequest.Unmarshal(m, b)
@ -973,7 +933,7 @@ func (m *InspectTaskResponse) Reset() { *m = InspectTaskResponse{} }
func (m *InspectTaskResponse) String() string { return proto.CompactTextString(m) }
func (*InspectTaskResponse) ProtoMessage() {}
func (*InspectTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{18}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{17}
}
func (m *InspectTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InspectTaskResponse.Unmarshal(m, b)
@ -1026,7 +986,7 @@ func (m *TaskStatsRequest) Reset() { *m = TaskStatsRequest{} }
func (m *TaskStatsRequest) String() string { return proto.CompactTextString(m) }
func (*TaskStatsRequest) ProtoMessage() {}
func (*TaskStatsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{19}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{18}
}
func (m *TaskStatsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStatsRequest.Unmarshal(m, b)
@ -1065,7 +1025,7 @@ func (m *TaskStatsResponse) Reset() { *m = TaskStatsResponse{} }
func (m *TaskStatsResponse) String() string { return proto.CompactTextString(m) }
func (*TaskStatsResponse) ProtoMessage() {}
func (*TaskStatsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{20}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{19}
}
func (m *TaskStatsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStatsResponse.Unmarshal(m, b)
@ -1102,7 +1062,7 @@ func (m *TaskEventsRequest) Reset() { *m = TaskEventsRequest{} }
func (m *TaskEventsRequest) String() string { return proto.CompactTextString(m) }
func (*TaskEventsRequest) ProtoMessage() {}
func (*TaskEventsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{21}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{20}
}
func (m *TaskEventsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskEventsRequest.Unmarshal(m, b)
@ -1136,7 +1096,7 @@ func (m *SignalTaskRequest) Reset() { *m = SignalTaskRequest{} }
func (m *SignalTaskRequest) String() string { return proto.CompactTextString(m) }
func (*SignalTaskRequest) ProtoMessage() {}
func (*SignalTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{22}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{21}
}
func (m *SignalTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalTaskRequest.Unmarshal(m, b)
@ -1180,7 +1140,7 @@ func (m *SignalTaskResponse) Reset() { *m = SignalTaskResponse{} }
func (m *SignalTaskResponse) String() string { return proto.CompactTextString(m) }
func (*SignalTaskResponse) ProtoMessage() {}
func (*SignalTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{23}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{22}
}
func (m *SignalTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalTaskResponse.Unmarshal(m, b)
@ -1217,7 +1177,7 @@ func (m *ExecTaskRequest) Reset() { *m = ExecTaskRequest{} }
func (m *ExecTaskRequest) String() string { return proto.CompactTextString(m) }
func (*ExecTaskRequest) ProtoMessage() {}
func (*ExecTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{24}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{23}
}
func (m *ExecTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecTaskRequest.Unmarshal(m, b)
@ -1274,7 +1234,7 @@ func (m *ExecTaskResponse) Reset() { *m = ExecTaskResponse{} }
func (m *ExecTaskResponse) String() string { return proto.CompactTextString(m) }
func (*ExecTaskResponse) ProtoMessage() {}
func (*ExecTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{25}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{24}
}
func (m *ExecTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecTaskResponse.Unmarshal(m, b)
@ -1333,7 +1293,7 @@ func (m *DriverCapabilities) Reset() { *m = DriverCapabilities{} }
func (m *DriverCapabilities) String() string { return proto.CompactTextString(m) }
func (*DriverCapabilities) ProtoMessage() {}
func (*DriverCapabilities) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{26}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{25}
}
func (m *DriverCapabilities) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DriverCapabilities.Unmarshal(m, b)
@ -1412,7 +1372,7 @@ func (m *TaskConfig) Reset() { *m = TaskConfig{} }
func (m *TaskConfig) String() string { return proto.CompactTextString(m) }
func (*TaskConfig) ProtoMessage() {}
func (*TaskConfig) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{27}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{26}
}
func (m *TaskConfig) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskConfig.Unmarshal(m, b)
@ -1539,7 +1499,7 @@ func (m *Resources) Reset() { *m = Resources{} }
func (m *Resources) String() string { return proto.CompactTextString(m) }
func (*Resources) ProtoMessage() {}
func (*Resources) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{28}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{27}
}
func (m *Resources) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Resources.Unmarshal(m, b)
@ -1595,7 +1555,7 @@ func (m *RawResources) Reset() { *m = RawResources{} }
func (m *RawResources) String() string { return proto.CompactTextString(m) }
func (*RawResources) ProtoMessage() {}
func (*RawResources) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{29}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{28}
}
func (m *RawResources) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RawResources.Unmarshal(m, b)
@ -1666,7 +1626,7 @@ func (m *NetworkResource) Reset() { *m = NetworkResource{} }
func (m *NetworkResource) String() string { return proto.CompactTextString(m) }
func (*NetworkResource) ProtoMessage() {}
func (*NetworkResource) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{30}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{29}
}
func (m *NetworkResource) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NetworkResource.Unmarshal(m, b)
@ -1740,7 +1700,7 @@ func (m *NetworkPort) Reset() { *m = NetworkPort{} }
func (m *NetworkPort) String() string { return proto.CompactTextString(m) }
func (*NetworkPort) ProtoMessage() {}
func (*NetworkPort) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{31}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{30}
}
func (m *NetworkPort) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NetworkPort.Unmarshal(m, b)
@ -1798,7 +1758,7 @@ func (m *LinuxResources) Reset() { *m = LinuxResources{} }
func (m *LinuxResources) String() string { return proto.CompactTextString(m) }
func (*LinuxResources) ProtoMessage() {}
func (*LinuxResources) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{32}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{31}
}
func (m *LinuxResources) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LinuxResources.Unmarshal(m, b)
@ -1883,7 +1843,7 @@ func (m *Mount) Reset() { *m = Mount{} }
func (m *Mount) String() string { return proto.CompactTextString(m) }
func (*Mount) ProtoMessage() {}
func (*Mount) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{33}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{32}
}
func (m *Mount) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Mount.Unmarshal(m, b)
@ -1946,7 +1906,7 @@ func (m *Device) Reset() { *m = Device{} }
func (m *Device) String() string { return proto.CompactTextString(m) }
func (*Device) ProtoMessage() {}
func (*Device) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{34}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{33}
}
func (m *Device) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Device.Unmarshal(m, b)
@ -2004,7 +1964,7 @@ func (m *TaskHandle) Reset() { *m = TaskHandle{} }
func (m *TaskHandle) String() string { return proto.CompactTextString(m) }
func (*TaskHandle) ProtoMessage() {}
func (*TaskHandle) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{35}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{34}
}
func (m *TaskHandle) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskHandle.Unmarshal(m, b)
@ -2064,7 +2024,7 @@ func (m *NetworkOverride) Reset() { *m = NetworkOverride{} }
func (m *NetworkOverride) String() string { return proto.CompactTextString(m) }
func (*NetworkOverride) ProtoMessage() {}
func (*NetworkOverride) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{36}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{35}
}
func (m *NetworkOverride) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NetworkOverride.Unmarshal(m, b)
@ -2122,7 +2082,7 @@ func (m *ExitResult) Reset() { *m = ExitResult{} }
func (m *ExitResult) String() string { return proto.CompactTextString(m) }
func (*ExitResult) ProtoMessage() {}
func (*ExitResult) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{37}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{36}
}
func (m *ExitResult) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExitResult.Unmarshal(m, b)
@ -2185,7 +2145,7 @@ func (m *TaskStatus) Reset() { *m = TaskStatus{} }
func (m *TaskStatus) String() string { return proto.CompactTextString(m) }
func (*TaskStatus) ProtoMessage() {}
func (*TaskStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{38}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{37}
}
func (m *TaskStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStatus.Unmarshal(m, b)
@ -2260,7 +2220,7 @@ func (m *TaskDriverStatus) Reset() { *m = TaskDriverStatus{} }
func (m *TaskDriverStatus) String() string { return proto.CompactTextString(m) }
func (*TaskDriverStatus) ProtoMessage() {}
func (*TaskDriverStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{39}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{38}
}
func (m *TaskDriverStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskDriverStatus.Unmarshal(m, b)
@ -2305,7 +2265,7 @@ func (m *TaskStats) Reset() { *m = TaskStats{} }
func (m *TaskStats) String() string { return proto.CompactTextString(m) }
func (*TaskStats) ProtoMessage() {}
func (*TaskStats) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{40}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{39}
}
func (m *TaskStats) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStats.Unmarshal(m, b)
@ -2367,7 +2327,7 @@ func (m *TaskResourceUsage) Reset() { *m = TaskResourceUsage{} }
func (m *TaskResourceUsage) String() string { return proto.CompactTextString(m) }
func (*TaskResourceUsage) ProtoMessage() {}
func (*TaskResourceUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{41}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{40}
}
func (m *TaskResourceUsage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskResourceUsage.Unmarshal(m, b)
@ -2419,7 +2379,7 @@ func (m *CPUUsage) Reset() { *m = CPUUsage{} }
func (m *CPUUsage) String() string { return proto.CompactTextString(m) }
func (*CPUUsage) ProtoMessage() {}
func (*CPUUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{42}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{41}
}
func (m *CPUUsage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CPUUsage.Unmarshal(m, b)
@ -2505,7 +2465,7 @@ func (m *MemoryUsage) Reset() { *m = MemoryUsage{} }
func (m *MemoryUsage) String() string { return proto.CompactTextString(m) }
func (*MemoryUsage) ProtoMessage() {}
func (*MemoryUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{43}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{42}
}
func (m *MemoryUsage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MemoryUsage.Unmarshal(m, b)
@ -2585,7 +2545,7 @@ func (m *DriverTaskEvent) Reset() { *m = DriverTaskEvent{} }
func (m *DriverTaskEvent) String() string { return proto.CompactTextString(m) }
func (*DriverTaskEvent) ProtoMessage() {}
func (*DriverTaskEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_8f22bab6c7112303, []int{44}
return fileDescriptor_driver_41ce58b9a7aabf23, []int{43}
}
func (m *DriverTaskEvent) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DriverTaskEvent.Unmarshal(m, b)
@ -2634,7 +2594,6 @@ func (m *DriverTaskEvent) GetAnnotations() map[string]string {
}
func init() {
proto.RegisterType((*RecoverableError)(nil), "hashicorp.nomad.plugins.drivers.proto.RecoverableError")
proto.RegisterType((*TaskConfigSchemaRequest)(nil), "hashicorp.nomad.plugins.drivers.proto.TaskConfigSchemaRequest")
proto.RegisterType((*TaskConfigSchemaResponse)(nil), "hashicorp.nomad.plugins.drivers.proto.TaskConfigSchemaResponse")
proto.RegisterType((*CapabilitiesRequest)(nil), "hashicorp.nomad.plugins.drivers.proto.CapabilitiesRequest")
@ -3277,186 +3236,185 @@ var _Driver_serviceDesc = grpc.ServiceDesc{
}
func init() {
proto.RegisterFile("plugins/drivers/proto/driver.proto", fileDescriptor_driver_8f22bab6c7112303)
proto.RegisterFile("plugins/drivers/proto/driver.proto", fileDescriptor_driver_41ce58b9a7aabf23)
}
var fileDescriptor_driver_8f22bab6c7112303 = []byte{
// 2831 bytes of a gzipped FileDescriptorProto
var fileDescriptor_driver_41ce58b9a7aabf23 = []byte{
// 2809 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0x4b, 0x6f, 0x23, 0xc7,
0xf1, 0x17, 0x9f, 0x22, 0x8b, 0x14, 0x35, 0xdb, 0xbb, 0xfb, 0x37, 0x4d, 0xe3, 0x1f, 0xaf, 0x07,
0x70, 0x20, 0xd8, 0x5e, 0xca, 0x96, 0x13, 0xef, 0x23, 0xf0, 0x83, 0xa6, 0x66, 0x57, 0xf2, 0x4a,
0x94, 0xd2, 0xa4, 0xb0, 0x5e, 0x27, 0xf6, 0x64, 0x34, 0xd3, 0x22, 0x67, 0xc5, 0x79, 0xb8, 0x7b,
0xa8, 0x95, 0x10, 0x04, 0x09, 0x12, 0x20, 0x48, 0x02, 0x04, 0xc8, 0x25, 0xc8, 0x39, 0xb9, 0x05,
0xb9, 0xe6, 0x94, 0x20, 0x97, 0x7c, 0x8a, 0x1c, 0x73, 0x09, 0x90, 0x6b, 0x3e, 0x81, 0x83, 0x7e,
0xcc, 0x70, 0x28, 0x69, 0xbd, 0x43, 0x2a, 0x27, 0x4e, 0x55, 0x77, 0xff, 0xba, 0x58, 0x55, 0x5d,
0x55, 0xdd, 0x05, 0x7a, 0x38, 0x9e, 0x0c, 0x5d, 0x9f, 0xad, 0x3b, 0xd4, 0x3d, 0x21, 0x94, 0xad,
0x87, 0x34, 0x88, 0x02, 0x45, 0xb5, 0x05, 0x81, 0x5e, 0x1f, 0x59, 0x6c, 0xe4, 0xda, 0x01, 0x0d,
0xdb, 0x7e, 0xe0, 0x59, 0x4e, 0x5b, 0xad, 0x69, 0xab, 0x35, 0x72, 0x5a, 0xeb, 0x1b, 0xc3, 0x20,
0x18, 0x8e, 0x89, 0x44, 0x38, 0x9c, 0x1c, 0xad, 0x3b, 0x13, 0x6a, 0x45, 0x6e, 0xe0, 0xab, 0xf1,
0x57, 0xcf, 0x8f, 0x47, 0xae, 0x47, 0x58, 0x64, 0x79, 0xa1, 0x9a, 0xf0, 0xd1, 0xd0, 0x8d, 0x46,
0x93, 0xc3, 0xb6, 0x1d, 0x78, 0xeb, 0xc9, 0x96, 0xeb, 0x62, 0xcb, 0xf5, 0x58, 0x4c, 0x36, 0xb2,
0x28, 0x71, 0xd6, 0x47, 0xf6, 0x98, 0x85, 0xc4, 0xe6, 0xbf, 0x26, 0xff, 0x90, 0x08, 0xfa, 0xb7,
0x40, 0xc3, 0xc4, 0x0e, 0x4e, 0x08, 0xb5, 0x0e, 0xc7, 0xc4, 0xa0, 0x34, 0xa0, 0xe8, 0x16, 0xd4,
0xe8, 0x94, 0xd7, 0xcc, 0xdd, 0xca, 0xad, 0x55, 0x70, 0x9a, 0xa5, 0xbf, 0x0c, 0x2f, 0x0d, 0x2c,
0x76, 0xdc, 0x0d, 0xfc, 0x23, 0x77, 0xd8, 0xb7, 0x47, 0xc4, 0xb3, 0x30, 0xf9, 0x72, 0x42, 0x58,
0xa4, 0x7f, 0x1f, 0x9a, 0x17, 0x87, 0x58, 0x18, 0xf8, 0x8c, 0xa0, 0x8f, 0xa0, 0xc8, 0xb7, 0x16,
0x88, 0xb5, 0x8d, 0xb7, 0xda, 0xcf, 0xd3, 0x92, 0x14, 0xb9, 0xad, 0x44, 0x6e, 0xf7, 0x43, 0x62,
0x63, 0xb1, 0x52, 0xbf, 0x09, 0xd7, 0xbb, 0x56, 0x68, 0x1d, 0xba, 0x63, 0x37, 0x72, 0x09, 0x8b,
0x37, 0x9d, 0xc0, 0x8d, 0x59, 0xb6, 0xda, 0xf0, 0x73, 0xa8, 0xdb, 0x29, 0xbe, 0xda, 0xf8, 0x5e,
0x3b, 0x93, 0x79, 0xda, 0x9b, 0x82, 0x9a, 0x01, 0x9e, 0x81, 0xd3, 0x6f, 0x00, 0x7a, 0xe0, 0xfa,
0x43, 0x42, 0x43, 0xea, 0xfa, 0x51, 0x2c, 0xcc, 0xaf, 0x0a, 0x70, 0x7d, 0x86, 0xad, 0x84, 0x79,
0x0a, 0x60, 0x45, 0x11, 0x75, 0x0f, 0x27, 0x91, 0x10, 0xa5, 0xb0, 0x56, 0xdb, 0xf8, 0x24, 0xa3,
0x28, 0x97, 0xe0, 0xb5, 0x3b, 0x09, 0x98, 0xe1, 0x47, 0xf4, 0x0c, 0xa7, 0xd0, 0xd1, 0x17, 0x50,
0x1e, 0x11, 0x6b, 0x1c, 0x8d, 0x9a, 0xf9, 0x5b, 0xb9, 0xb5, 0xc6, 0xc6, 0x83, 0x2b, 0xec, 0xb3,
0x25, 0x80, 0xfa, 0x91, 0x15, 0x11, 0xac, 0x50, 0xd1, 0x6d, 0x40, 0xf2, 0xcb, 0x74, 0x08, 0xb3,
0xa9, 0x1b, 0x72, 0xaf, 0x6d, 0x16, 0x6e, 0xe5, 0xd6, 0xaa, 0xf8, 0x9a, 0x1c, 0xd9, 0x9c, 0x0e,
0xb4, 0xde, 0x87, 0xd5, 0x73, 0xd2, 0x22, 0x0d, 0x0a, 0xc7, 0xe4, 0x4c, 0x58, 0xa4, 0x8a, 0xf9,
0x27, 0xba, 0x01, 0xa5, 0x13, 0x6b, 0x3c, 0x21, 0x42, 0xe4, 0x2a, 0x96, 0xc4, 0xfd, 0xfc, 0xdd,
0x9c, 0x7e, 0x0f, 0x6a, 0x29, 0x21, 0x50, 0x03, 0xe0, 0xa0, 0xb7, 0x69, 0x0c, 0x8c, 0xee, 0xc0,
0xd8, 0xd4, 0x96, 0xd0, 0x0a, 0x54, 0x0f, 0x7a, 0x5b, 0x46, 0x67, 0x67, 0xb0, 0xf5, 0x44, 0xcb,
0xa1, 0x1a, 0x2c, 0xc7, 0x44, 0x5e, 0x3f, 0x05, 0xa4, 0xfc, 0x9b, 0x7b, 0xa5, 0x32, 0x11, 0x7a,
0x09, 0x96, 0x23, 0x8b, 0x1d, 0x9b, 0xae, 0xa3, 0x04, 0x28, 0x73, 0x72, 0xdb, 0x41, 0xdb, 0x50,
0x1e, 0x59, 0xbe, 0x33, 0x96, 0x42, 0xd4, 0x36, 0xde, 0xc9, 0xa8, 0x37, 0x0e, 0xbe, 0x25, 0x16,
0x62, 0x05, 0xc0, 0x5d, 0x75, 0x66, 0x67, 0xa9, 0x4d, 0xfd, 0x09, 0x68, 0xfd, 0xc8, 0xa2, 0x51,
0x5a, 0x1c, 0x03, 0x8a, 0x7c, 0x7f, 0xe5, 0x9e, 0xf3, 0xec, 0x29, 0x8f, 0x19, 0x16, 0xcb, 0xf5,
0xff, 0xe4, 0xe1, 0x5a, 0x0a, 0x5b, 0xb9, 0xdd, 0x63, 0x28, 0x53, 0xc2, 0x26, 0xe3, 0x48, 0xc0,
0x37, 0x36, 0x3e, 0xcc, 0x08, 0x7f, 0x01, 0xa9, 0x8d, 0x05, 0x0c, 0x56, 0x70, 0x68, 0x0d, 0x34,
0xb9, 0xc2, 0x24, 0x3c, 0x6c, 0x98, 0x1e, 0x1b, 0x2a, 0xd3, 0x35, 0x24, 0x5f, 0x44, 0x93, 0x5d,
0x36, 0x4c, 0x69, 0xb5, 0x70, 0x45, 0xad, 0x22, 0x0b, 0x34, 0x9f, 0x44, 0xcf, 0x02, 0x7a, 0x6c,
0x72, 0xd5, 0x52, 0xd7, 0x21, 0xcd, 0xa2, 0x00, 0x7d, 0x2f, 0x23, 0x68, 0x4f, 0x2e, 0xdf, 0x53,
0xab, 0xf1, 0xaa, 0x3f, 0xcb, 0xd0, 0xdf, 0x84, 0xb2, 0xfc, 0xa7, 0xdc, 0x93, 0xfa, 0x07, 0xdd,
0xae, 0xd1, 0xef, 0x6b, 0x4b, 0xa8, 0x0a, 0x25, 0x6c, 0x0c, 0x30, 0xf7, 0xb0, 0x2a, 0x94, 0x1e,
0x74, 0x06, 0x9d, 0x1d, 0x2d, 0xaf, 0xbf, 0x01, 0xab, 0x8f, 0x2d, 0x37, 0xca, 0xe2, 0x5c, 0x7a,
0x00, 0xda, 0x74, 0xae, 0xb2, 0xce, 0xf6, 0x8c, 0x75, 0xb2, 0xab, 0xc6, 0x38, 0x75, 0xa3, 0x73,
0xf6, 0xd0, 0xa0, 0x40, 0x28, 0x55, 0x26, 0xe0, 0x9f, 0xfa, 0x33, 0x58, 0xed, 0x47, 0x41, 0x98,
0xc9, 0xf3, 0xdf, 0x85, 0x65, 0x9e, 0x5d, 0x82, 0x49, 0xa4, 0x5c, 0xff, 0xe5, 0xb6, 0xcc, 0x3e,
0xed, 0x38, 0xfb, 0xb4, 0x37, 0x55, 0x76, 0xc2, 0xf1, 0x4c, 0xf4, 0x7f, 0x50, 0x66, 0xee, 0xd0,
0xb7, 0xc6, 0xea, 0xe8, 0x2b, 0x4a, 0x47, 0xdc, 0xc9, 0xe3, 0x8d, 0x95, 0xe3, 0x77, 0x01, 0x6d,
0x12, 0x16, 0xd1, 0xe0, 0x2c, 0x93, 0x3c, 0x37, 0xa0, 0x74, 0x14, 0x50, 0x5b, 0x1e, 0xc4, 0x0a,
0x96, 0x04, 0x3f, 0x54, 0x33, 0x20, 0x0a, 0xfb, 0x36, 0xa0, 0x6d, 0x9f, 0x27, 0x88, 0x6c, 0x86,
0xf8, 0x4d, 0x1e, 0xae, 0xcf, 0xcc, 0x57, 0xc6, 0x58, 0xfc, 0x1c, 0xf2, 0xc0, 0x34, 0x61, 0xf2,
0x1c, 0xa2, 0x3d, 0x28, 0xcb, 0x19, 0x4a, 0x93, 0x77, 0xe6, 0x00, 0x92, 0x39, 0x47, 0xc1, 0x29,
0x98, 0x4b, 0x9d, 0xbe, 0xf0, 0xbf, 0x76, 0x7a, 0x2d, 0xfe, 0x1f, 0xec, 0x85, 0xfa, 0xfb, 0x1e,
0x5c, 0x4b, 0x4d, 0x56, 0xca, 0x7b, 0x00, 0x25, 0xc6, 0x19, 0x4a, 0x7b, 0x6f, 0xcf, 0xa9, 0x3d,
0x86, 0xe5, 0x72, 0xfd, 0xba, 0x04, 0x37, 0x4e, 0x88, 0x9f, 0x88, 0xa2, 0x6f, 0xc2, 0xb5, 0xbe,
0x70, 0xad, 0x4c, 0xbe, 0x33, 0x75, 0xcb, 0xfc, 0x8c, 0x5b, 0xde, 0x00, 0x94, 0x46, 0x51, 0xce,
0x73, 0x06, 0xab, 0xc6, 0x29, 0xb1, 0x33, 0x21, 0x37, 0x61, 0xd9, 0x0e, 0x3c, 0xcf, 0xf2, 0x9d,
0x66, 0xfe, 0x56, 0x61, 0xad, 0x8a, 0x63, 0x32, 0x7d, 0x7e, 0x0a, 0x59, 0xcf, 0x8f, 0xfe, 0xeb,
0x1c, 0x68, 0xd3, 0xbd, 0x95, 0x22, 0xb9, 0xf4, 0x91, 0xc3, 0x81, 0xf8, 0xde, 0x75, 0xac, 0x28,
0xc5, 0x8f, 0x8f, 0xb8, 0xe4, 0x13, 0x4a, 0x53, 0x21, 0xa4, 0x70, 0xc5, 0x10, 0xa2, 0xff, 0x2b,
0x07, 0xe8, 0x62, 0xd5, 0x83, 0x5e, 0x83, 0x3a, 0x23, 0xbe, 0x63, 0x4a, 0x35, 0xb2, 0xb8, 0x22,
0xe4, 0x3c, 0xa9, 0x4f, 0x86, 0x10, 0x14, 0xc9, 0x29, 0xb1, 0xd5, 0x69, 0x15, 0xdf, 0x68, 0x04,
0xf5, 0x23, 0x66, 0xba, 0x2c, 0x18, 0x5b, 0x49, 0x79, 0xd0, 0xd8, 0x30, 0x16, 0xae, 0xbe, 0xda,
0x0f, 0xfa, 0xdb, 0x31, 0x18, 0xae, 0x1d, 0xb1, 0x84, 0xd0, 0xdb, 0x50, 0x4b, 0x8d, 0xa1, 0x0a,
0x14, 0x7b, 0x7b, 0x3d, 0x43, 0x5b, 0x42, 0x00, 0xe5, 0xee, 0x16, 0xde, 0xdb, 0x1b, 0xc8, 0xa8,
0xbd, 0xbd, 0xdb, 0x79, 0x68, 0x68, 0x79, 0xfd, 0xab, 0x22, 0xc0, 0x34, 0x7d, 0xa2, 0x06, 0xe4,
0x13, 0x4b, 0xe7, 0x5d, 0x87, 0xff, 0x19, 0xdf, 0xf2, 0xe2, 0x42, 0x44, 0x7c, 0xa3, 0x0d, 0xb8,
0xe9, 0xb1, 0x61, 0x68, 0xd9, 0xc7, 0xa6, 0xca, 0x7a, 0xb6, 0x58, 0x2c, 0xfe, 0x55, 0x1d, 0x5f,
0x57, 0x83, 0x4a, 0x6a, 0x89, 0xbb, 0x03, 0x05, 0xe2, 0x9f, 0x34, 0x8b, 0xa2, 0xd4, 0xbb, 0x3f,
0x77, 0x5a, 0x6f, 0x1b, 0xfe, 0x89, 0x2c, 0xed, 0x38, 0x0c, 0xea, 0x41, 0x95, 0x12, 0x16, 0x4c,
0xa8, 0x4d, 0x58, 0xb3, 0x34, 0xd7, 0x21, 0xc3, 0xf1, 0x3a, 0x3c, 0x85, 0x40, 0x9b, 0x50, 0xf6,
0x82, 0x89, 0x1f, 0xb1, 0x66, 0x59, 0x08, 0xf8, 0x56, 0x46, 0xb0, 0x5d, 0xbe, 0x08, 0xab, 0xb5,
0xe8, 0x21, 0x2c, 0x3b, 0xe4, 0xc4, 0xe5, 0x32, 0x2d, 0x0b, 0x98, 0xdb, 0x59, 0xed, 0x2b, 0x56,
0xe1, 0x78, 0x35, 0x57, 0xfa, 0x84, 0x11, 0xda, 0xac, 0x48, 0xa5, 0xf3, 0x6f, 0xf4, 0x0a, 0x54,
0xad, 0xf1, 0x38, 0xb0, 0x4d, 0xc7, 0xa5, 0xcd, 0xaa, 0x18, 0xa8, 0x08, 0xc6, 0xa6, 0x4b, 0xd1,
0xab, 0x50, 0x93, 0x27, 0xc3, 0x0c, 0xad, 0x68, 0xd4, 0x04, 0x31, 0x0c, 0x92, 0xb5, 0x6f, 0x45,
0x23, 0x35, 0x81, 0x50, 0x2a, 0x27, 0xd4, 0x92, 0x09, 0x84, 0x52, 0x31, 0xe1, 0x9b, 0xb0, 0x2a,
0x8e, 0xf9, 0x90, 0x06, 0x93, 0xd0, 0x14, 0x26, 0xaf, 0x8b, 0x49, 0x2b, 0x9c, 0xfd, 0x90, 0x73,
0x7b, 0xdc, 0xf6, 0x2f, 0x43, 0xe5, 0x69, 0x70, 0x28, 0x27, 0xac, 0x88, 0x09, 0xcb, 0x4f, 0x83,
0x43, 0x3e, 0xd4, 0x7a, 0x0f, 0x2a, 0xb1, 0x95, 0xe6, 0x2a, 0x69, 0x7f, 0x9f, 0x87, 0x6a, 0x62,
0x15, 0xf4, 0x29, 0xac, 0x50, 0xeb, 0x99, 0x39, 0x35, 0xaf, 0x8c, 0xa1, 0xef, 0x66, 0x35, 0xaf,
0xf5, 0x6c, 0x6a, 0xe1, 0x3a, 0x4d, 0x51, 0xe8, 0x0b, 0x58, 0x1d, 0xbb, 0xfe, 0xe4, 0x34, 0x85,
0x2d, 0x93, 0xd2, 0xb7, 0x33, 0x62, 0xef, 0xf0, 0xd5, 0x53, 0xf4, 0xc6, 0x78, 0x86, 0x46, 0x9f,
0x41, 0xc3, 0x0f, 0x1c, 0x92, 0x82, 0x2f, 0x2c, 0x2e, 0xfa, 0x0a, 0x87, 0x4a, 0x48, 0xfd, 0xcf,
0x39, 0xa8, 0xa7, 0xc7, 0xb9, 0x82, 0xed, 0x70, 0x22, 0x94, 0x53, 0xc0, 0xfc, 0x93, 0xc7, 0x44,
0x8f, 0x78, 0x01, 0x3d, 0x13, 0xff, 0xaa, 0x80, 0x15, 0xc5, 0x9d, 0xc9, 0x71, 0xd9, 0xb1, 0x10,
0xa6, 0x80, 0xc5, 0x37, 0xe7, 0xb9, 0x41, 0xc8, 0x44, 0xb9, 0x58, 0xc0, 0xe2, 0x1b, 0x61, 0xa8,
0xa8, 0x4c, 0xc8, 0x8f, 0x54, 0x61, 0xfe, 0x8c, 0x1a, 0x0b, 0x87, 0x13, 0x1c, 0xfd, 0x77, 0x79,
0x58, 0x3d, 0x37, 0xca, 0xe5, 0x94, 0x7e, 0x1e, 0xe7, 0x13, 0x49, 0x71, 0x99, 0x6c, 0xd7, 0x89,
0x8b, 0x36, 0xf1, 0x2d, 0xa2, 0x51, 0xa8, 0x0a, 0xaa, 0xbc, 0x1b, 0x72, 0x27, 0xf2, 0x0e, 0xdd,
0x48, 0x0a, 0x5e, 0xc2, 0x92, 0x40, 0x4f, 0xa0, 0x41, 0x09, 0x23, 0xf4, 0x84, 0x38, 0x66, 0x18,
0xd0, 0x28, 0x96, 0x7f, 0x63, 0x3e, 0xf9, 0xf7, 0x03, 0x1a, 0xe1, 0x95, 0x18, 0x89, 0x53, 0x0c,
0x3d, 0x86, 0x15, 0xe7, 0xcc, 0xb7, 0x3c, 0xd7, 0x56, 0xc8, 0xe5, 0x85, 0x91, 0xeb, 0x0a, 0x48,
0x00, 0xf3, 0x7b, 0x5c, 0x6a, 0x90, 0xff, 0xb1, 0xb1, 0x75, 0x48, 0xc6, 0x4a, 0x27, 0x92, 0x98,
0x3d, 0x33, 0x25, 0x75, 0x66, 0xf4, 0xaf, 0x72, 0xd0, 0x98, 0x75, 0x45, 0xf4, 0xff, 0x00, 0x76,
0x38, 0x31, 0x43, 0x42, 0xdd, 0xc0, 0x51, 0x4e, 0x51, 0xb5, 0xc3, 0xc9, 0xbe, 0x60, 0xf0, 0xd8,
0xc1, 0x87, 0xbf, 0x9c, 0x04, 0x91, 0xa5, 0xbc, 0xa3, 0x62, 0x87, 0x93, 0xef, 0x72, 0x3a, 0x5e,
0x2b, 0x1e, 0x1a, 0x98, 0xf2, 0x12, 0x3e, 0xbd, 0x2f, 0x18, 0xe8, 0x2d, 0x40, 0xd2, 0x91, 0xcc,
0xb1, 0xeb, 0xb9, 0x91, 0x79, 0x78, 0xc6, 0xaf, 0xec, 0xd2, 0x71, 0x34, 0x39, 0xb2, 0xc3, 0x07,
0x3e, 0xe6, 0x7c, 0xa4, 0xc3, 0x4a, 0x10, 0x78, 0x26, 0xb3, 0x03, 0x4a, 0x4c, 0xcb, 0x79, 0x2a,
0x82, 0x73, 0x01, 0xd7, 0x82, 0xc0, 0xeb, 0x73, 0x5e, 0xc7, 0x79, 0xca, 0x63, 0x91, 0x1d, 0x4e,
0x18, 0x89, 0x4c, 0xfe, 0xd3, 0x2c, 0xcb, 0x58, 0x24, 0x59, 0xdd, 0x70, 0xc2, 0x52, 0x13, 0x3c,
0xe2, 0xf1, 0x58, 0x9a, 0x9a, 0xb0, 0x4b, 0x3c, 0xa6, 0x7f, 0x0e, 0x25, 0x11, 0x79, 0xf9, 0x1f,
0x13, 0x51, 0x4b, 0x04, 0x35, 0xa9, 0xba, 0x0a, 0x67, 0x88, 0x90, 0xf6, 0x0a, 0x54, 0x47, 0x01,
0x53, 0x21, 0x51, 0x7a, 0x55, 0x85, 0x33, 0xc4, 0x60, 0x0b, 0x2a, 0x94, 0x58, 0x4e, 0xe0, 0x8f,
0xcf, 0xc4, 0x7f, 0xae, 0xe0, 0x84, 0xd6, 0xbf, 0x84, 0xb2, 0x8c, 0xc8, 0x57, 0xc0, 0xbf, 0x0d,
0xc8, 0x96, 0xb1, 0x34, 0x24, 0xd4, 0x73, 0x19, 0x73, 0x03, 0x9f, 0xc5, 0xaf, 0x02, 0x72, 0x64,
0x7f, 0x3a, 0xa0, 0xff, 0x3d, 0x27, 0xb3, 0xb0, 0xbc, 0xe2, 0xf1, 0x3a, 0x46, 0xa5, 0xd4, 0x85,
0xef, 0xc1, 0x0a, 0x20, 0xae, 0x45, 0x89, 0x7a, 0xfd, 0x98, 0xb7, 0x16, 0x25, 0xb2, 0x16, 0x25,
0xbc, 0xf0, 0x51, 0xc9, 0x5e, 0xc2, 0xc9, 0x5c, 0x5f, 0x73, 0x92, 0x22, 0x9d, 0xe8, 0xff, 0xce,
0x25, 0xa7, 0x3d, 0x2e, 0xa6, 0xd1, 0x17, 0x50, 0xe1, 0x07, 0xc7, 0xf4, 0xac, 0x50, 0xbd, 0xf3,
0x74, 0x17, 0xab, 0xd3, 0xdb, 0xfc, 0x9c, 0xec, 0x5a, 0xa1, 0xac, 0x02, 0x96, 0x43, 0x49, 0xf1,
0xa8, 0x61, 0x39, 0xd3, 0xa8, 0xc1, 0xbf, 0xd1, 0xeb, 0xd0, 0xb0, 0x26, 0x51, 0x60, 0x5a, 0xce,
0x09, 0xa1, 0x91, 0xcb, 0x88, 0xb2, 0xf0, 0x0a, 0xe7, 0x76, 0x62, 0x66, 0xeb, 0x3e, 0xd4, 0xd3,
0x98, 0x2f, 0xca, 0x59, 0xa5, 0x74, 0xce, 0xfa, 0x01, 0xc0, 0xb4, 0x66, 0xe4, 0x9e, 0x40, 0x4e,
0xdd, 0xc8, 0xb4, 0x03, 0x47, 0x46, 0xb5, 0x12, 0xae, 0x70, 0x46, 0x37, 0x70, 0xc8, 0xb9, 0x0a,
0xbc, 0x14, 0x57, 0xe0, 0xfc, 0xdc, 0xf1, 0xa3, 0x72, 0xec, 0x8e, 0xc7, 0xc4, 0x51, 0x12, 0x56,
0x83, 0xc0, 0x7b, 0x24, 0x18, 0xfa, 0xdf, 0xf2, 0xd2, 0x23, 0xe4, 0xfd, 0x27, 0x53, 0x5d, 0x96,
0x98, 0xba, 0x70, 0x35, 0x53, 0xdf, 0x03, 0x60, 0x91, 0x45, 0x23, 0xe2, 0x98, 0x56, 0xa4, 0x9e,
0x14, 0x5a, 0x17, 0x4a, 0xf8, 0x41, 0xfc, 0x00, 0x8b, 0xab, 0x6a, 0x76, 0x27, 0x42, 0xef, 0x43,
0xdd, 0x0e, 0xbc, 0x70, 0x4c, 0xd4, 0xe2, 0xd2, 0x0b, 0x17, 0xd7, 0x92, 0xf9, 0x9d, 0x28, 0x55,
0xbf, 0x97, 0xaf, 0x5a, 0xbf, 0xff, 0x25, 0x27, 0xaf, 0x71, 0xe9, 0x5b, 0x24, 0x1a, 0x5e, 0xf2,
0xee, 0xf8, 0x70, 0xc1, 0x2b, 0xe9, 0xd7, 0x3d, 0x3a, 0x5e, 0xf5, 0x95, 0xef, 0xaf, 0x05, 0xa8,
0x26, 0xb7, 0xc1, 0x0b, 0xb6, 0xbf, 0x0b, 0xd5, 0xe4, 0xf5, 0x5b, 0x95, 0x30, 0x5f, 0x6b, 0x9e,
0x64, 0x32, 0x3a, 0x02, 0x64, 0x0d, 0x87, 0x49, 0x85, 0x62, 0x4e, 0x98, 0x35, 0x8c, 0xef, 0xcf,
0x77, 0xe7, 0xd0, 0x43, 0x9c, 0x79, 0x0e, 0xf8, 0x7a, 0xac, 0x59, 0xc3, 0xe1, 0x0c, 0x07, 0xfd,
0x10, 0x6e, 0xce, 0xee, 0x61, 0x1e, 0x9e, 0x99, 0xa1, 0xeb, 0xa8, 0xfa, 0x7f, 0x6b, 0xde, 0x0b,
0x71, 0x7b, 0x06, 0xfe, 0xe3, 0xb3, 0x7d, 0xd7, 0x91, 0x3a, 0x47, 0xf4, 0xc2, 0x40, 0xeb, 0xc7,
0xf0, 0xd2, 0x73, 0xa6, 0x5f, 0x62, 0x83, 0x5e, 0xda, 0x06, 0x57, 0x51, 0x42, 0xca, 0x7a, 0x7f,
0xc8, 0xc9, 0x7b, 0xfb, 0xac, 0x4e, 0x3a, 0xd3, 0x8a, 0xad, 0xb6, 0xb1, 0x9e, 0x71, 0x9f, 0xee,
0xfe, 0x81, 0x84, 0x17, 0x25, 0xde, 0x27, 0x33, 0x25, 0x5e, 0xf6, 0x32, 0x64, 0x57, 0x2c, 0x92,
0x40, 0x0a, 0x41, 0xff, 0x53, 0x01, 0x2a, 0x31, 0xba, 0xb8, 0x1e, 0x9c, 0xb1, 0x88, 0x78, 0xa6,
0x17, 0x87, 0xb0, 0x1c, 0x06, 0xc9, 0xda, 0xe5, 0x41, 0xec, 0x15, 0xa8, 0xf2, 0x5b, 0x88, 0x1c,
0xce, 0x8b, 0xe1, 0x0a, 0x67, 0x88, 0xc1, 0x57, 0xa1, 0x16, 0x05, 0x91, 0x35, 0x36, 0x23, 0xd7,
0x3e, 0x96, 0x49, 0x2e, 0x87, 0x41, 0xb0, 0x06, 0x9c, 0x83, 0xde, 0x84, 0x6b, 0xd1, 0x88, 0x06,
0x51, 0x34, 0xe6, 0x15, 0x9a, 0xa8, 0x49, 0x64, 0x09, 0x51, 0xc4, 0x5a, 0x32, 0x20, 0x6b, 0x15,
0xc6, 0xa3, 0xf7, 0x74, 0x32, 0x77, 0x5d, 0x11, 0x44, 0x8a, 0x78, 0x25, 0xe1, 0x72, 0xd7, 0x46,
0x4d, 0x58, 0x0e, 0x09, 0xb5, 0x89, 0x2f, 0x63, 0x45, 0x0e, 0xc7, 0x24, 0x32, 0x61, 0xd5, 0x23,
0x16, 0x9b, 0x50, 0xe2, 0x98, 0x47, 0x2e, 0x19, 0x3b, 0xf2, 0x3a, 0xd6, 0xc8, 0x5c, 0xcf, 0xc6,
0x6a, 0x69, 0x3f, 0x10, 0xab, 0x71, 0x23, 0x86, 0x93, 0x34, 0xaf, 0x0f, 0xe4, 0x17, 0x5a, 0x85,
0x5a, 0xff, 0x49, 0x7f, 0x60, 0xec, 0x9a, 0xbb, 0x7b, 0x9b, 0x86, 0x7a, 0x7f, 0xef, 0x1b, 0x58,
0x92, 0x39, 0x3e, 0x3e, 0xd8, 0x1b, 0x74, 0x76, 0xcc, 0xc1, 0x76, 0xf7, 0x51, 0x5f, 0xcb, 0xa3,
0x9b, 0x70, 0x6d, 0xb0, 0x85, 0xf7, 0x06, 0x83, 0x1d, 0x63, 0xd3, 0xdc, 0x37, 0xf0, 0xf6, 0xde,
0x66, 0x5f, 0x2b, 0x20, 0x04, 0x8d, 0x29, 0x7b, 0xb0, 0xbd, 0x6b, 0x68, 0x45, 0x54, 0x83, 0xe5,
0x7d, 0x03, 0x77, 0x8d, 0xde, 0x40, 0x2b, 0xe9, 0xff, 0xc8, 0x43, 0x2d, 0x65, 0x45, 0xee, 0xc8,
0x94, 0xc9, 0xbb, 0x51, 0x11, 0xf3, 0x4f, 0x1e, 0x4c, 0x6c, 0xcb, 0x1e, 0x49, 0xeb, 0x14, 0xb1,
0x24, 0xb8, 0xdd, 0x3c, 0xeb, 0x34, 0x75, 0xce, 0x8b, 0xb8, 0xe2, 0x59, 0xa7, 0x12, 0xe4, 0x35,
0xa8, 0x1f, 0x13, 0xea, 0x93, 0xb1, 0x1a, 0x97, 0x16, 0xa9, 0x49, 0x9e, 0x9c, 0xb2, 0x06, 0x9a,
0x9a, 0x32, 0x85, 0x91, 0xe6, 0x68, 0x48, 0xfe, 0x6e, 0x0c, 0x76, 0x78, 0x51, 0xeb, 0x65, 0xa1,
0xf5, 0x7b, 0xf3, 0x3b, 0xe9, 0xf3, 0x14, 0xdf, 0x4f, 0x14, 0xbf, 0x0c, 0x05, 0x1c, 0x3f, 0x45,
0x77, 0x3b, 0xdd, 0x2d, 0xae, 0xec, 0x15, 0xa8, 0xee, 0x76, 0x3e, 0x35, 0x0f, 0xfa, 0xe2, 0x61,
0x03, 0x69, 0x50, 0x7f, 0x64, 0xe0, 0x9e, 0xb1, 0xa3, 0x38, 0x05, 0x74, 0x03, 0x34, 0xc5, 0x99,
0xce, 0x2b, 0xea, 0x7f, 0xcc, 0xc3, 0xaa, 0x8c, 0xeb, 0xc9, 0x5b, 0xdb, 0xf3, 0x1f, 0xbd, 0x16,
0x0f, 0xbd, 0x4d, 0x58, 0xf6, 0x08, 0x4b, 0xec, 0x50, 0xc5, 0x31, 0x89, 0x5c, 0xa8, 0x59, 0xbe,
0x1f, 0x44, 0xe2, 0xc1, 0x86, 0xa9, 0x10, 0xf9, 0x70, 0xae, 0xa7, 0xa1, 0x44, 0xf2, 0x76, 0x67,
0x8a, 0x24, 0x23, 0x64, 0x1a, 0xbb, 0xf5, 0x01, 0x68, 0xe7, 0x27, 0xcc, 0x93, 0x97, 0xde, 0x78,
0x67, 0x9a, 0x96, 0x08, 0x77, 0xd0, 0x83, 0xde, 0xa3, 0xde, 0xde, 0xe3, 0x9e, 0xb6, 0xc4, 0x09,
0x7c, 0xd0, 0xeb, 0x6d, 0xf7, 0x1e, 0x6a, 0x39, 0x04, 0x50, 0x36, 0x3e, 0xdd, 0x1e, 0x18, 0x9b,
0x5a, 0x7e, 0xe3, 0x9f, 0x2b, 0x50, 0x96, 0x42, 0xa2, 0xdf, 0xaa, 0x94, 0x9c, 0x6e, 0x88, 0xa2,
0x0f, 0xe6, 0x2e, 0x6d, 0x67, 0x9a, 0xac, 0xad, 0x0f, 0x17, 0x5e, 0xaf, 0xde, 0x3c, 0x97, 0xd0,
0x2f, 0x73, 0x50, 0x9f, 0x79, 0xe4, 0xcb, 0xfa, 0x3e, 0x75, 0x49, 0xff, 0xb5, 0xf5, 0x9d, 0x85,
0xd6, 0x26, 0xb2, 0xfc, 0x22, 0x07, 0xb5, 0x54, 0xe7, 0x11, 0xdd, 0x5b, 0xa4, 0x5b, 0x29, 0x25,
0xb9, 0xbf, 0x78, 0xa3, 0x53, 0x5f, 0x7a, 0x3b, 0x87, 0x7e, 0x9e, 0x83, 0x5a, 0xaa, 0x6d, 0x97,
0x59, 0x94, 0x8b, 0x4d, 0xc6, 0xcc, 0xa2, 0x5c, 0xd6, 0x25, 0x5c, 0x42, 0x3f, 0xc9, 0x41, 0x35,
0x69, 0xc1, 0xa1, 0x3b, 0xf3, 0x37, 0xed, 0xa4, 0x10, 0x77, 0x17, 0xed, 0xf6, 0xe9, 0x4b, 0xe8,
0x47, 0x50, 0x89, 0xfb, 0x55, 0x28, 0x6b, 0x1a, 0x39, 0xd7, 0x0c, 0x6b, 0xdd, 0x99, 0x7b, 0x5d,
0x7a, 0xfb, 0xb8, 0x89, 0x94, 0x79, 0xfb, 0x73, 0xed, 0xae, 0xd6, 0x9d, 0xb9, 0xd7, 0x25, 0xdb,
0x73, 0x4f, 0x48, 0xf5, 0x9a, 0x32, 0x7b, 0xc2, 0xc5, 0x26, 0x57, 0x66, 0x4f, 0xb8, 0xac, 0xb5,
0x25, 0x05, 0x49, 0x75, 0xab, 0x32, 0x0b, 0x72, 0xb1, 0x23, 0x96, 0x59, 0x90, 0x4b, 0x9a, 0x63,
0xca, 0x25, 0xa7, 0x05, 0xfa, 0x9d, 0xb9, 0x1b, 0x3c, 0x73, 0xba, 0xe4, 0x85, 0x16, 0x93, 0xbe,
0x84, 0x7e, 0xaa, 0x9e, 0x0c, 0x64, 0x77, 0x08, 0xcd, 0x03, 0x35, 0xd3, 0x50, 0x6a, 0xbd, 0xb7,
0x58, 0xaa, 0x11, 0x31, 0xe2, 0x67, 0x39, 0x80, 0x69, 0x1f, 0x29, 0xb3, 0x10, 0x17, 0x1a, 0x58,
0xad, 0x7b, 0x0b, 0xac, 0x4c, 0x1f, 0x8f, 0xb8, 0x75, 0x94, 0xf9, 0x78, 0x9c, 0xeb, 0x73, 0x65,
0x3e, 0x1e, 0xe7, 0x7b, 0x54, 0xfa, 0xd2, 0xc7, 0xcb, 0x9f, 0x95, 0x64, 0xee, 0x2f, 0x8b, 0x9f,
0x77, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x20, 0x12, 0x44, 0xf1, 0x18, 0x25, 0x00, 0x00,
0x11, 0x16, 0x9f, 0x22, 0x8b, 0x14, 0x35, 0xdb, 0xbb, 0x1b, 0xd3, 0x34, 0x12, 0xaf, 0x07, 0x70,
0x20, 0xd8, 0x5e, 0xca, 0x96, 0x11, 0xef, 0x23, 0xf0, 0x83, 0xa6, 0x66, 0x57, 0xf2, 0x4a, 0x94,
0xd2, 0xa4, 0xb0, 0x5e, 0x27, 0xf6, 0x64, 0x34, 0xd3, 0x22, 0x67, 0xc5, 0x79, 0xb8, 0x7b, 0xa8,
0x95, 0x10, 0x04, 0x09, 0x12, 0x20, 0x48, 0x02, 0x04, 0xc8, 0x25, 0xc8, 0x39, 0xb9, 0x05, 0xb9,
0xe6, 0x94, 0x20, 0x97, 0xfc, 0x8a, 0x1c, 0x73, 0x09, 0x90, 0x6b, 0x7e, 0x81, 0x83, 0x7e, 0xcc,
0x70, 0x28, 0x69, 0xbd, 0x43, 0x2a, 0x27, 0x4e, 0x55, 0x77, 0x7f, 0x5d, 0xac, 0xaa, 0xae, 0xaa,
0xee, 0x02, 0x3d, 0x1c, 0x4f, 0x86, 0xae, 0xcf, 0xd6, 0x1d, 0xea, 0x9e, 0x10, 0xca, 0xd6, 0x43,
0x1a, 0x44, 0x81, 0xa2, 0xda, 0x82, 0x40, 0xaf, 0x8f, 0x2c, 0x36, 0x72, 0xed, 0x80, 0x86, 0x6d,
0x3f, 0xf0, 0x2c, 0xa7, 0xad, 0xd6, 0xb4, 0xd5, 0x1a, 0x39, 0xad, 0xf5, 0xad, 0x61, 0x10, 0x0c,
0xc7, 0x44, 0x22, 0x1c, 0x4e, 0x8e, 0xd6, 0x9d, 0x09, 0xb5, 0x22, 0x37, 0xf0, 0xd5, 0xf8, 0xab,
0xe7, 0xc7, 0x23, 0xd7, 0x23, 0x2c, 0xb2, 0xbc, 0x50, 0x4d, 0xf8, 0x68, 0xe8, 0x46, 0xa3, 0xc9,
0x61, 0xdb, 0x0e, 0xbc, 0xf5, 0x64, 0xcb, 0x75, 0xb1, 0xe5, 0x7a, 0x2c, 0x26, 0x1b, 0x59, 0x94,
0x38, 0xeb, 0x23, 0x7b, 0xcc, 0x42, 0x62, 0xf3, 0x5f, 0x93, 0x7f, 0x48, 0x04, 0xfd, 0x65, 0x78,
0x69, 0x60, 0xb1, 0xe3, 0x6e, 0xe0, 0x1f, 0xb9, 0xc3, 0xbe, 0x3d, 0x22, 0x9e, 0x85, 0xc9, 0x97,
0x13, 0xc2, 0x22, 0xfd, 0x07, 0xd0, 0xbc, 0x38, 0xc4, 0xc2, 0xc0, 0x67, 0x04, 0x7d, 0x04, 0x45,
0x0e, 0xd2, 0xcc, 0xdd, 0xca, 0xad, 0xd5, 0x36, 0xde, 0x6a, 0x3f, 0xef, 0xff, 0xca, 0xcd, 0xdb,
0x6a, 0xf3, 0x76, 0x3f, 0x24, 0x36, 0x16, 0x2b, 0xf5, 0x9b, 0x70, 0xbd, 0x6b, 0x85, 0xd6, 0xa1,
0x3b, 0x76, 0x23, 0x97, 0xb0, 0x78, 0xd3, 0x09, 0xdc, 0x98, 0x65, 0xab, 0x0d, 0x3f, 0x87, 0xba,
0x9d, 0xe2, 0xab, 0x8d, 0xef, 0xb5, 0x33, 0x29, 0xba, 0xbd, 0x29, 0xa8, 0x19, 0xe0, 0x19, 0x38,
0xfd, 0x06, 0xa0, 0x07, 0xae, 0x3f, 0x24, 0x34, 0xa4, 0xae, 0x1f, 0xc5, 0xc2, 0xfc, 0xba, 0x00,
0xd7, 0x67, 0xd8, 0x4a, 0x98, 0xa7, 0x00, 0x56, 0x14, 0x51, 0xf7, 0x70, 0x12, 0x09, 0x51, 0x0a,
0x6b, 0xb5, 0x8d, 0x4f, 0x32, 0x8a, 0x72, 0x09, 0x5e, 0xbb, 0x93, 0x80, 0x19, 0x7e, 0x44, 0xcf,
0x70, 0x0a, 0x1d, 0x7d, 0x01, 0xe5, 0x11, 0xb1, 0xc6, 0xd1, 0xa8, 0x99, 0xbf, 0x95, 0x5b, 0x6b,
0x6c, 0x3c, 0xb8, 0xc2, 0x3e, 0x5b, 0x02, 0xa8, 0x1f, 0x59, 0x11, 0xc1, 0x0a, 0x15, 0xdd, 0x06,
0x24, 0xbf, 0x4c, 0x87, 0x30, 0x9b, 0xba, 0x21, 0xf7, 0xbf, 0x66, 0xe1, 0x56, 0x6e, 0xad, 0x8a,
0xaf, 0xc9, 0x91, 0xcd, 0xe9, 0x40, 0xeb, 0x7d, 0x58, 0x3d, 0x27, 0x2d, 0xd2, 0xa0, 0x70, 0x4c,
0xce, 0x84, 0x45, 0xaa, 0x98, 0x7f, 0xa2, 0x1b, 0x50, 0x3a, 0xb1, 0xc6, 0x13, 0x22, 0x44, 0xae,
0x62, 0x49, 0xdc, 0xcf, 0xdf, 0xcd, 0xe9, 0xf7, 0xa0, 0x96, 0x12, 0x02, 0x35, 0x00, 0x0e, 0x7a,
0x9b, 0xc6, 0xc0, 0xe8, 0x0e, 0x8c, 0x4d, 0x6d, 0x09, 0xad, 0x40, 0xf5, 0xa0, 0xb7, 0x65, 0x74,
0x76, 0x06, 0x5b, 0x4f, 0xb4, 0x1c, 0xaa, 0xc1, 0x72, 0x4c, 0xe4, 0xf5, 0x53, 0x40, 0x98, 0xd8,
0xc1, 0x09, 0xa1, 0xdc, 0x2b, 0x95, 0x89, 0xd0, 0x4b, 0xb0, 0x1c, 0x59, 0xec, 0xd8, 0x74, 0x1d,
0x25, 0x40, 0x99, 0x93, 0xdb, 0x0e, 0xda, 0x86, 0xf2, 0xc8, 0xf2, 0x9d, 0xb1, 0x14, 0xa2, 0xb6,
0xf1, 0x4e, 0x46, 0xbd, 0x71, 0xf0, 0x2d, 0xb1, 0x10, 0x2b, 0x00, 0xee, 0xaa, 0x33, 0x3b, 0x4b,
0x6d, 0xea, 0x4f, 0x40, 0xeb, 0x47, 0x16, 0x8d, 0xd2, 0xe2, 0x18, 0x50, 0xe4, 0xfb, 0x2b, 0xf7,
0x9c, 0x67, 0x4f, 0x79, 0xcc, 0xb0, 0x58, 0xae, 0xff, 0x37, 0x0f, 0xd7, 0x52, 0xd8, 0xca, 0xed,
0x1e, 0x43, 0x99, 0x12, 0x36, 0x19, 0x47, 0x02, 0xbe, 0xb1, 0xf1, 0x61, 0x46, 0xf8, 0x0b, 0x48,
0x6d, 0x2c, 0x60, 0xb0, 0x82, 0x43, 0x6b, 0xa0, 0xc9, 0x15, 0x26, 0xa1, 0x34, 0xa0, 0xa6, 0xc7,
0x86, 0xca, 0x74, 0x0d, 0xc9, 0x37, 0x38, 0x7b, 0x97, 0x0d, 0x53, 0x5a, 0x2d, 0x5c, 0x51, 0xab,
0xc8, 0x02, 0xcd, 0x27, 0xd1, 0xb3, 0x80, 0x1e, 0x9b, 0x5c, 0xb5, 0xd4, 0x75, 0x48, 0xb3, 0x28,
0x40, 0xdf, 0xcb, 0x08, 0xda, 0x93, 0xcb, 0xf7, 0xd4, 0x6a, 0xbc, 0xea, 0xcf, 0x32, 0xf4, 0x37,
0xa1, 0x2c, 0xff, 0x29, 0xf7, 0xa4, 0xfe, 0x41, 0xb7, 0x6b, 0xf4, 0xfb, 0xda, 0x12, 0xaa, 0x42,
0x09, 0x1b, 0x03, 0xcc, 0x3d, 0xac, 0x0a, 0xa5, 0x07, 0x9d, 0x41, 0x67, 0x47, 0xcb, 0xeb, 0x6f,
0xc0, 0xea, 0x63, 0xcb, 0x8d, 0xb2, 0x38, 0x97, 0x1e, 0x80, 0x36, 0x9d, 0xab, 0xac, 0xb3, 0x3d,
0x63, 0x9d, 0xec, 0xaa, 0x31, 0x4e, 0xdd, 0xe8, 0x9c, 0x3d, 0x34, 0x28, 0x10, 0x4a, 0x95, 0x09,
0xf8, 0xa7, 0xfe, 0x0c, 0x56, 0xfb, 0x51, 0x10, 0x66, 0xf2, 0xfc, 0x77, 0x61, 0x99, 0xe7, 0x89,
0x60, 0x12, 0x29, 0xd7, 0x7f, 0xb9, 0x2d, 0xf3, 0x48, 0x3b, 0xce, 0x23, 0xed, 0x4d, 0x95, 0x67,
0x70, 0x3c, 0x13, 0x7d, 0x03, 0xca, 0xcc, 0x1d, 0xfa, 0xd6, 0x58, 0x1d, 0x7d, 0x45, 0xe9, 0x88,
0x3b, 0x79, 0xbc, 0xb1, 0x72, 0xfc, 0x2e, 0xa0, 0x4d, 0xc2, 0x22, 0x1a, 0x9c, 0x65, 0x92, 0xe7,
0x06, 0x94, 0x8e, 0x02, 0x6a, 0xcb, 0x83, 0x58, 0xc1, 0x92, 0xe0, 0x87, 0x6a, 0x06, 0x44, 0x61,
0xdf, 0x06, 0xb4, 0xed, 0xf3, 0x04, 0x91, 0xcd, 0x10, 0xbf, 0xcd, 0xc3, 0xf5, 0x99, 0xf9, 0xca,
0x18, 0x8b, 0x9f, 0x43, 0x1e, 0x98, 0x26, 0x4c, 0x9e, 0x43, 0xb4, 0x07, 0x65, 0x39, 0x43, 0x69,
0xf2, 0xce, 0x1c, 0x40, 0x32, 0xe7, 0x28, 0x38, 0x05, 0x73, 0xa9, 0xd3, 0x17, 0xfe, 0xdf, 0x4e,
0xaf, 0xc5, 0xff, 0x83, 0xbd, 0x50, 0x7f, 0xdf, 0x87, 0x6b, 0xa9, 0xc9, 0x4a, 0x79, 0x0f, 0xa0,
0xc4, 0x38, 0x43, 0x69, 0xef, 0xed, 0x39, 0xb5, 0xc7, 0xb0, 0x5c, 0xae, 0x5f, 0x97, 0xe0, 0xc6,
0x09, 0xf1, 0x13, 0x51, 0xf4, 0x4d, 0xb8, 0xd6, 0x17, 0xae, 0x95, 0xc9, 0x77, 0xa6, 0x6e, 0x99,
0x9f, 0x71, 0xcb, 0x1b, 0x80, 0xd2, 0x28, 0xca, 0x79, 0xce, 0x60, 0xd5, 0x38, 0x25, 0x76, 0x26,
0xe4, 0x26, 0x2c, 0xdb, 0x81, 0xe7, 0x59, 0xbe, 0xd3, 0xcc, 0xdf, 0x2a, 0xac, 0x55, 0x71, 0x4c,
0xa6, 0xcf, 0x4f, 0x21, 0xeb, 0xf9, 0xd1, 0x7f, 0x93, 0x03, 0x6d, 0xba, 0xb7, 0x52, 0x24, 0x97,
0x3e, 0x72, 0x38, 0x10, 0xdf, 0xbb, 0x8e, 0x15, 0xa5, 0xf8, 0xf1, 0x11, 0x97, 0x7c, 0x42, 0x69,
0x2a, 0x84, 0x14, 0xae, 0x18, 0x42, 0xf4, 0x7f, 0xe7, 0x00, 0x5d, 0xac, 0x7a, 0xd0, 0x6b, 0x50,
0x67, 0xc4, 0x77, 0x4c, 0xa9, 0x46, 0x69, 0xe1, 0x0a, 0xae, 0x71, 0x9e, 0xd4, 0x27, 0x43, 0x08,
0x8a, 0xe4, 0x94, 0xd8, 0xea, 0xb4, 0x8a, 0x6f, 0x34, 0x82, 0xfa, 0x11, 0x33, 0x5d, 0x16, 0x8c,
0xad, 0xa4, 0x3c, 0x68, 0x6c, 0x18, 0x0b, 0x57, 0x5f, 0xed, 0x07, 0xfd, 0xed, 0x18, 0x0c, 0xd7,
0x8e, 0x58, 0x42, 0xe8, 0x6d, 0xa8, 0xa5, 0xc6, 0x50, 0x05, 0x8a, 0xbd, 0xbd, 0x9e, 0xa1, 0x2d,
0x21, 0x80, 0x72, 0x77, 0x0b, 0xef, 0xed, 0x0d, 0x64, 0xd4, 0xde, 0xde, 0xed, 0x3c, 0x34, 0xb4,
0xbc, 0xfe, 0x55, 0x11, 0x60, 0x9a, 0x3e, 0x51, 0x03, 0xf2, 0x89, 0xa5, 0xf3, 0xae, 0xc3, 0xff,
0x8c, 0x6f, 0x79, 0x71, 0x21, 0x22, 0xbe, 0xd1, 0x06, 0xdc, 0xf4, 0xd8, 0x30, 0xb4, 0xec, 0x63,
0x53, 0x65, 0x3d, 0x5b, 0x2c, 0x16, 0xff, 0xaa, 0x8e, 0xaf, 0xab, 0x41, 0x25, 0xb5, 0xc4, 0xdd,
0x81, 0x02, 0xf1, 0x4f, 0x9a, 0x45, 0x51, 0xea, 0xdd, 0x9f, 0x3b, 0xad, 0xb7, 0x0d, 0xff, 0x44,
0x96, 0x76, 0x1c, 0x06, 0xf5, 0xa0, 0x4a, 0x09, 0x0b, 0x26, 0xd4, 0x26, 0xac, 0x59, 0x9a, 0xeb,
0x90, 0xe1, 0x78, 0x1d, 0x9e, 0x42, 0xa0, 0x4d, 0x28, 0x7b, 0xc1, 0xc4, 0x8f, 0x58, 0xb3, 0x2c,
0x04, 0x7c, 0x2b, 0x23, 0xd8, 0x2e, 0x5f, 0x84, 0xd5, 0x5a, 0xf4, 0x10, 0x96, 0x1d, 0x72, 0xe2,
0x72, 0x99, 0x96, 0x05, 0xcc, 0xed, 0xac, 0xf6, 0x15, 0xab, 0x70, 0xbc, 0x9a, 0x2b, 0x7d, 0xc2,
0x08, 0x6d, 0x56, 0xa4, 0xd2, 0xf9, 0x37, 0x7a, 0x05, 0xaa, 0xd6, 0x78, 0x1c, 0xd8, 0xa6, 0xe3,
0xd2, 0x66, 0x55, 0x0c, 0x54, 0x04, 0x63, 0xd3, 0xa5, 0xe8, 0x55, 0xa8, 0xc9, 0x93, 0x61, 0x86,
0x56, 0x34, 0x6a, 0x82, 0x18, 0x06, 0xc9, 0xda, 0xb7, 0xa2, 0x91, 0x9a, 0x40, 0x28, 0x95, 0x13,
0x6a, 0xc9, 0x04, 0x42, 0xa9, 0x98, 0xf0, 0x6d, 0x58, 0x15, 0xc7, 0x7c, 0x48, 0x83, 0x49, 0x68,
0x0a, 0x93, 0xd7, 0xc5, 0xa4, 0x15, 0xce, 0x7e, 0xc8, 0xb9, 0x3d, 0x6e, 0xfb, 0x97, 0xa1, 0xf2,
0x34, 0x38, 0x94, 0x13, 0x56, 0xc4, 0x84, 0xe5, 0xa7, 0xc1, 0x21, 0x1f, 0x6a, 0xbd, 0x07, 0x95,
0xd8, 0x4a, 0x73, 0x95, 0xb4, 0x7f, 0xc8, 0x43, 0x35, 0xb1, 0x0a, 0xfa, 0x14, 0x56, 0xa8, 0xf5,
0xcc, 0x9c, 0x9a, 0x57, 0xc6, 0xd0, 0x77, 0xb3, 0x9a, 0xd7, 0x7a, 0x36, 0xb5, 0x70, 0x9d, 0xa6,
0x28, 0xf4, 0x05, 0xac, 0x8e, 0x5d, 0x7f, 0x72, 0x9a, 0xc2, 0x96, 0x49, 0xe9, 0x3b, 0x19, 0xb1,
0x77, 0xf8, 0xea, 0x29, 0x7a, 0x63, 0x3c, 0x43, 0xa3, 0xcf, 0xa0, 0xe1, 0x07, 0x0e, 0x49, 0xc1,
0x17, 0x16, 0x17, 0x7d, 0x85, 0x43, 0x25, 0xa4, 0xfe, 0x97, 0x1c, 0xd4, 0xd3, 0xe3, 0x5c, 0xc1,
0x76, 0x38, 0x11, 0xca, 0x29, 0x60, 0xfe, 0xc9, 0x63, 0xa2, 0x47, 0xbc, 0x80, 0x9e, 0x89, 0x7f,
0x55, 0xc0, 0x8a, 0xe2, 0xce, 0xe4, 0xb8, 0xec, 0x58, 0x08, 0x53, 0xc0, 0xe2, 0x9b, 0xf3, 0xdc,
0x20, 0x64, 0xa2, 0x5c, 0x2c, 0x60, 0xf1, 0x8d, 0x30, 0x54, 0x54, 0x26, 0xe4, 0x47, 0xaa, 0x30,
0x7f, 0x46, 0x8d, 0x85, 0xc3, 0x09, 0x8e, 0xfe, 0xfb, 0x3c, 0xac, 0x9e, 0x1b, 0xe5, 0x72, 0x4a,
0x3f, 0x8f, 0xf3, 0x89, 0xa4, 0xb8, 0x4c, 0xb6, 0xeb, 0xc4, 0x45, 0x9b, 0xf8, 0x16, 0xd1, 0x28,
0x54, 0x05, 0x55, 0xde, 0x0d, 0xb9, 0x13, 0x79, 0x87, 0x6e, 0x24, 0x05, 0x2f, 0x61, 0x49, 0xa0,
0x27, 0xd0, 0xa0, 0x84, 0x11, 0x7a, 0x42, 0x1c, 0x33, 0x0c, 0x68, 0x14, 0xcb, 0xbf, 0x31, 0x9f,
0xfc, 0xfb, 0x01, 0x8d, 0xf0, 0x4a, 0x8c, 0xc4, 0x29, 0x86, 0x1e, 0xc3, 0x8a, 0x73, 0xe6, 0x5b,
0x9e, 0x6b, 0x2b, 0xe4, 0xf2, 0xc2, 0xc8, 0x75, 0x05, 0x24, 0x80, 0xf9, 0x3d, 0x2e, 0x35, 0xc8,
0xff, 0xd8, 0xd8, 0x3a, 0x24, 0x63, 0xa5, 0x13, 0x49, 0xcc, 0x9e, 0x99, 0x92, 0x3a, 0x33, 0xfa,
0x57, 0x39, 0x68, 0xcc, 0xba, 0x22, 0xfa, 0x26, 0x80, 0x1d, 0x4e, 0xcc, 0x90, 0x50, 0x37, 0x70,
0x94, 0x53, 0x54, 0xed, 0x70, 0xb2, 0x2f, 0x18, 0x3c, 0x76, 0xf0, 0xe1, 0x2f, 0x27, 0x41, 0x64,
0x29, 0xef, 0xa8, 0xd8, 0xe1, 0xe4, 0x7b, 0x9c, 0x8e, 0xd7, 0x8a, 0x87, 0x06, 0xa6, 0xbc, 0x84,
0x4f, 0xef, 0x0b, 0x06, 0x7a, 0x0b, 0x90, 0x74, 0x24, 0x73, 0xec, 0x7a, 0x6e, 0x64, 0x1e, 0x9e,
0xf1, 0x2b, 0xbb, 0x74, 0x1c, 0x4d, 0x8e, 0xec, 0xf0, 0x81, 0x8f, 0x39, 0x1f, 0xe9, 0xb0, 0x12,
0x04, 0x9e, 0xc9, 0xec, 0x80, 0x12, 0xd3, 0x72, 0x9e, 0x8a, 0xe0, 0x5c, 0xc0, 0xb5, 0x20, 0xf0,
0xfa, 0x9c, 0xd7, 0x71, 0x9e, 0xf2, 0x58, 0x64, 0x87, 0x13, 0x46, 0x22, 0x93, 0xff, 0x34, 0xcb,
0x32, 0x16, 0x49, 0x56, 0x37, 0x9c, 0xb0, 0xd4, 0x04, 0x8f, 0x78, 0x3c, 0x96, 0xa6, 0x26, 0xec,
0x12, 0x8f, 0xe9, 0x9f, 0x43, 0x49, 0x44, 0x5e, 0xfe, 0xc7, 0x44, 0xd4, 0x12, 0x41, 0x4d, 0xaa,
0xae, 0xc2, 0x19, 0x22, 0xa4, 0xbd, 0x02, 0xd5, 0x51, 0xc0, 0x54, 0x48, 0x94, 0x5e, 0x55, 0xe1,
0x0c, 0x31, 0xd8, 0x82, 0x0a, 0x25, 0x96, 0x13, 0xf8, 0xe3, 0x33, 0xf1, 0x9f, 0x2b, 0x38, 0xa1,
0xf5, 0x2f, 0xa1, 0x2c, 0x23, 0xf2, 0x15, 0xf0, 0x6f, 0x03, 0xb2, 0x65, 0x2c, 0x0d, 0x09, 0xf5,
0x5c, 0xc6, 0xdc, 0xc0, 0x67, 0xf1, 0xab, 0x80, 0x1c, 0xd9, 0x9f, 0x0e, 0xe8, 0xff, 0xc8, 0xc9,
0x2c, 0x2c, 0xaf, 0x78, 0xbc, 0x8e, 0x51, 0x29, 0x75, 0xe1, 0x7b, 0xb0, 0x02, 0x88, 0x6b, 0x51,
0xa2, 0x5e, 0x3f, 0xe6, 0xad, 0x45, 0x89, 0xac, 0x45, 0x09, 0x2f, 0x7c, 0x54, 0xb2, 0x97, 0x70,
0x32, 0xd7, 0xd7, 0x9c, 0xa4, 0x48, 0x27, 0xfa, 0x7f, 0x72, 0xc9, 0x69, 0x8f, 0x8b, 0x69, 0xf4,
0x05, 0x54, 0xf8, 0xc1, 0x31, 0x3d, 0x2b, 0x54, 0xef, 0x3c, 0xdd, 0xc5, 0xea, 0xf4, 0x36, 0x3f,
0x27, 0xbb, 0x56, 0x28, 0xab, 0x80, 0xe5, 0x50, 0x52, 0x3c, 0x6a, 0x58, 0xce, 0x34, 0x6a, 0xf0,
0x6f, 0xf4, 0x3a, 0x34, 0xac, 0x49, 0x14, 0x98, 0x96, 0x73, 0x42, 0x68, 0xe4, 0x32, 0xa2, 0x2c,
0xbc, 0xc2, 0xb9, 0x9d, 0x98, 0xd9, 0xba, 0x0f, 0xf5, 0x34, 0xe6, 0x8b, 0x72, 0x56, 0x29, 0x9d,
0xb3, 0x7e, 0x08, 0x30, 0xad, 0x19, 0xb9, 0x27, 0x90, 0x53, 0x37, 0x32, 0xed, 0xc0, 0x91, 0x51,
0xad, 0x84, 0x2b, 0x9c, 0xd1, 0x0d, 0x1c, 0x72, 0xae, 0x02, 0x2f, 0xc5, 0x15, 0x38, 0x3f, 0x77,
0xfc, 0xa8, 0x1c, 0xbb, 0xe3, 0x31, 0x71, 0x94, 0x84, 0xd5, 0x20, 0xf0, 0x1e, 0x09, 0x86, 0xfe,
0xf7, 0xbc, 0xf4, 0x08, 0x79, 0xff, 0xc9, 0x54, 0x97, 0x25, 0xa6, 0x2e, 0x5c, 0xcd, 0xd4, 0xf7,
0x00, 0x58, 0x64, 0xd1, 0x88, 0x38, 0xa6, 0x15, 0xa9, 0x27, 0x85, 0xd6, 0x85, 0x12, 0x7e, 0x10,
0x3f, 0xa5, 0xe2, 0xaa, 0x9a, 0xdd, 0x89, 0xd0, 0xfb, 0x50, 0xb7, 0x03, 0x2f, 0x1c, 0x13, 0xb5,
0xb8, 0xf4, 0xc2, 0xc5, 0xb5, 0x64, 0x7e, 0x27, 0x4a, 0xd5, 0xef, 0xe5, 0xab, 0xd6, 0xef, 0x7f,
0xcd, 0xc9, 0x6b, 0x5c, 0xfa, 0x16, 0x89, 0x86, 0x97, 0xbc, 0x3b, 0x3e, 0x5c, 0xf0, 0x4a, 0xfa,
0x75, 0x8f, 0x8e, 0x57, 0x7d, 0xe5, 0xfb, 0x5b, 0x01, 0xaa, 0xc9, 0x6d, 0xf0, 0x82, 0xed, 0xef,
0x42, 0x35, 0x79, 0xc7, 0x56, 0x25, 0xcc, 0xd7, 0x9a, 0x27, 0x99, 0x8c, 0x8e, 0x00, 0x59, 0xc3,
0x61, 0x52, 0xa1, 0x98, 0x13, 0x66, 0x0d, 0xe3, 0xfb, 0xf3, 0xdd, 0x39, 0xf4, 0x10, 0x67, 0x9e,
0x03, 0xbe, 0x1e, 0x6b, 0xd6, 0x70, 0x38, 0xc3, 0x41, 0x3f, 0x82, 0x9b, 0xb3, 0x7b, 0x98, 0x87,
0x67, 0x66, 0xe8, 0x3a, 0xaa, 0xfe, 0xdf, 0x9a, 0xf7, 0x42, 0xdc, 0x9e, 0x81, 0xff, 0xf8, 0x6c,
0xdf, 0x75, 0xa4, 0xce, 0x11, 0xbd, 0x30, 0xd0, 0xfa, 0x09, 0xbc, 0xf4, 0x9c, 0xe9, 0x97, 0xd8,
0xa0, 0x97, 0xb6, 0xc1, 0x55, 0x94, 0x90, 0xb2, 0xde, 0x1f, 0x73, 0xf2, 0xde, 0x3e, 0xab, 0x93,
0xce, 0xb4, 0x62, 0xab, 0x6d, 0xac, 0x67, 0xdc, 0xa7, 0xbb, 0x7f, 0x20, 0xe1, 0x45, 0x89, 0xf7,
0xc9, 0x4c, 0x89, 0x97, 0xbd, 0x0c, 0xd9, 0x15, 0x8b, 0x24, 0x90, 0x42, 0xd0, 0xff, 0x5c, 0x80,
0x4a, 0x8c, 0x2e, 0xae, 0x07, 0x67, 0x2c, 0x22, 0x9e, 0xe9, 0xc5, 0x21, 0x2c, 0x87, 0x41, 0xb2,
0x76, 0x79, 0x10, 0x7b, 0x05, 0xaa, 0xfc, 0x16, 0x22, 0x87, 0xf3, 0x62, 0xb8, 0xc2, 0x19, 0x62,
0xf0, 0x55, 0xa8, 0x45, 0x41, 0x64, 0x8d, 0xcd, 0xc8, 0xb5, 0x8f, 0x65, 0x92, 0xcb, 0x61, 0x10,
0xac, 0x01, 0xe7, 0xa0, 0x37, 0xe1, 0x5a, 0x34, 0xa2, 0x41, 0x14, 0x8d, 0x79, 0x85, 0x26, 0x6a,
0x12, 0x59, 0x42, 0x14, 0xb1, 0x96, 0x0c, 0xc8, 0x5a, 0x85, 0xf1, 0xe8, 0x3d, 0x9d, 0xcc, 0x5d,
0x57, 0x04, 0x91, 0x22, 0x5e, 0x49, 0xb8, 0xdc, 0xb5, 0x51, 0x13, 0x96, 0x43, 0x42, 0x6d, 0xe2,
0xcb, 0x58, 0x91, 0xc3, 0x31, 0x89, 0x4c, 0x58, 0xf5, 0x88, 0xc5, 0x26, 0x94, 0x38, 0xe6, 0x91,
0x4b, 0xc6, 0x8e, 0xbc, 0x8e, 0x35, 0x32, 0xd7, 0xb3, 0xb1, 0x5a, 0xda, 0x0f, 0xc4, 0x6a, 0xdc,
0x88, 0xe1, 0x24, 0xcd, 0xeb, 0x03, 0xf9, 0x85, 0x56, 0xa1, 0xd6, 0x7f, 0xd2, 0x1f, 0x18, 0xbb,
0xe6, 0xee, 0xde, 0xa6, 0xa1, 0xde, 0xdf, 0xfb, 0x06, 0x96, 0x64, 0x8e, 0x8f, 0x0f, 0xf6, 0x06,
0x9d, 0x1d, 0x73, 0xb0, 0xdd, 0x7d, 0xd4, 0xd7, 0xf2, 0xe8, 0x26, 0x5c, 0x1b, 0x6c, 0xe1, 0xbd,
0xc1, 0x60, 0xc7, 0xd8, 0x34, 0xf7, 0x0d, 0xbc, 0xbd, 0xb7, 0xd9, 0xd7, 0x0a, 0x08, 0x41, 0x63,
0xca, 0x1e, 0x6c, 0xef, 0x1a, 0x5a, 0x11, 0xd5, 0x60, 0x79, 0xdf, 0xc0, 0x5d, 0xa3, 0x37, 0xd0,
0x4a, 0xfa, 0x3f, 0xf3, 0x50, 0x4b, 0x59, 0x91, 0x3b, 0x32, 0x65, 0xf2, 0x6e, 0x54, 0xc4, 0xfc,
0x93, 0x07, 0x13, 0xdb, 0xb2, 0x47, 0xd2, 0x3a, 0x45, 0x2c, 0x09, 0x6e, 0x37, 0xcf, 0x3a, 0x4d,
0x9d, 0xf3, 0x22, 0xae, 0x78, 0xd6, 0xa9, 0x04, 0x79, 0x0d, 0xea, 0xc7, 0x84, 0xfa, 0x64, 0xac,
0xc6, 0xa5, 0x45, 0x6a, 0x92, 0x27, 0xa7, 0xac, 0x81, 0xa6, 0xa6, 0x4c, 0x61, 0xa4, 0x39, 0x1a,
0x92, 0xbf, 0x1b, 0x83, 0x1d, 0x5e, 0xd4, 0x7a, 0x59, 0x68, 0xfd, 0xde, 0xfc, 0x4e, 0xfa, 0x3c,
0xc5, 0xf7, 0x13, 0xc5, 0x2f, 0x43, 0x01, 0xc7, 0x4f, 0xd1, 0xdd, 0x4e, 0x77, 0x8b, 0x2b, 0x7b,
0x05, 0xaa, 0xbb, 0x9d, 0x4f, 0xcd, 0x83, 0xbe, 0x78, 0xd8, 0x40, 0x1a, 0xd4, 0x1f, 0x19, 0xb8,
0x67, 0xec, 0x28, 0x4e, 0x01, 0xdd, 0x00, 0x4d, 0x71, 0xa6, 0xf3, 0x8a, 0xfa, 0x9f, 0xf2, 0xb0,
0x2a, 0xe3, 0x7a, 0xf2, 0xd6, 0xf6, 0xfc, 0x47, 0xaf, 0xc5, 0x43, 0x6f, 0x13, 0x96, 0x3d, 0xc2,
0x12, 0x3b, 0x54, 0x71, 0x4c, 0x22, 0x17, 0x6a, 0x96, 0xef, 0x07, 0x91, 0x78, 0xb0, 0x61, 0x2a,
0x44, 0x3e, 0x9c, 0xeb, 0x69, 0x28, 0x91, 0xbc, 0xdd, 0x99, 0x22, 0xc9, 0x08, 0x99, 0xc6, 0x6e,
0x7d, 0x00, 0xda, 0xf9, 0x09, 0xf3, 0xe4, 0xa5, 0x37, 0xde, 0x99, 0xa6, 0x25, 0xc2, 0x1d, 0xf4,
0xa0, 0xf7, 0xa8, 0xb7, 0xf7, 0xb8, 0xa7, 0x2d, 0x71, 0x02, 0x1f, 0xf4, 0x7a, 0xdb, 0xbd, 0x87,
0x5a, 0x0e, 0x01, 0x94, 0x8d, 0x4f, 0xb7, 0x07, 0xc6, 0xa6, 0x96, 0xdf, 0xf8, 0xd7, 0x0a, 0x94,
0xa5, 0x90, 0xe8, 0x77, 0x2a, 0x25, 0xa7, 0x1b, 0xa2, 0xe8, 0x83, 0xb9, 0x4b, 0xdb, 0x99, 0x26,
0x6b, 0xeb, 0xc3, 0x85, 0xd7, 0xab, 0x37, 0xcf, 0x25, 0xf4, 0xab, 0x1c, 0xd4, 0x67, 0x1e, 0xf9,
0xb2, 0xbe, 0x4f, 0x5d, 0xd2, 0x7f, 0x6d, 0x7d, 0x77, 0xa1, 0xb5, 0x89, 0x2c, 0xbf, 0xcc, 0x41,
0x2d, 0xd5, 0x79, 0x44, 0xf7, 0x16, 0xe9, 0x56, 0x4a, 0x49, 0xee, 0x2f, 0xde, 0xe8, 0xd4, 0x97,
0xde, 0xce, 0xa1, 0x5f, 0xe4, 0xa0, 0x96, 0x6a, 0xdb, 0x65, 0x16, 0xe5, 0x62, 0x93, 0x31, 0xb3,
0x28, 0x97, 0x75, 0x09, 0x97, 0xd0, 0x4f, 0x73, 0x50, 0x4d, 0x5a, 0x70, 0xe8, 0xce, 0xfc, 0x4d,
0x3b, 0x29, 0xc4, 0xdd, 0x45, 0xbb, 0x7d, 0xfa, 0x12, 0xfa, 0x31, 0x54, 0xe2, 0x7e, 0x15, 0xca,
0x9a, 0x46, 0xce, 0x35, 0xc3, 0x5a, 0x77, 0xe6, 0x5e, 0x97, 0xde, 0x3e, 0x6e, 0x22, 0x65, 0xde,
0xfe, 0x5c, 0xbb, 0xab, 0x75, 0x67, 0xee, 0x75, 0xc9, 0xf6, 0xdc, 0x13, 0x52, 0xbd, 0xa6, 0xcc,
0x9e, 0x70, 0xb1, 0xc9, 0x95, 0xd9, 0x13, 0x2e, 0x6b, 0x6d, 0x49, 0x41, 0x52, 0xdd, 0xaa, 0xcc,
0x82, 0x5c, 0xec, 0x88, 0x65, 0x16, 0xe4, 0x92, 0xe6, 0x98, 0x72, 0xc9, 0x69, 0x81, 0x7e, 0x67,
0xee, 0x06, 0xcf, 0x9c, 0x2e, 0x79, 0xa1, 0xc5, 0xa4, 0x2f, 0xa1, 0x9f, 0xa9, 0x27, 0x03, 0xd9,
0x1d, 0x42, 0xf3, 0x40, 0xcd, 0x34, 0x94, 0x5a, 0xef, 0x2d, 0x96, 0x6a, 0x44, 0x8c, 0xf8, 0x79,
0x0e, 0x60, 0xda, 0x47, 0xca, 0x2c, 0xc4, 0x85, 0x06, 0x56, 0xeb, 0xde, 0x02, 0x2b, 0xd3, 0xc7,
0x23, 0x6e, 0x1d, 0x65, 0x3e, 0x1e, 0xe7, 0xfa, 0x5c, 0x99, 0x8f, 0xc7, 0xf9, 0x1e, 0x95, 0xbe,
0xf4, 0xf1, 0xf2, 0x67, 0x25, 0x99, 0xfb, 0xcb, 0xe2, 0xe7, 0xdd, 0xff, 0x05, 0x00, 0x00, 0xff,
0xff, 0x96, 0x9e, 0x17, 0x6c, 0xe2, 0x24, 0x00, 0x00,
}

View file

@ -7,12 +7,6 @@ import "google/protobuf/timestamp.proto";
import "github.com/hashicorp/nomad/plugins/shared/hclspec/hcl_spec.proto";
// RecoverableError is used with a grpc Status to indicate if the error is one
// which is recoverable and can be reattempted by the client.
message RecoverableError {
bool recoverable = 1;
}
// Driver service defines RPCs used to communicate with a nomad runtime driver.
// Some rpcs may not be implemented by the driver based on it's capabilities.
service Driver {

View file

@ -13,6 +13,7 @@ import (
cstructs "github.com/hashicorp/nomad/client/structs"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/plugins/drivers/proto"
sproto "github.com/hashicorp/nomad/plugins/shared/structs/proto"
context "golang.org/x/net/context"
)
@ -102,7 +103,7 @@ func (b *driverPluginServer) StartTask(ctx context.Context, req *proto.StartTask
if err != nil {
if rec, ok := err.(structs.Recoverable); ok {
st := status.New(codes.FailedPrecondition, rec.Error())
st, err := st.WithDetails(&proto.RecoverableError{Recoverable: rec.IsRecoverable()})
st, err := st.WithDetails(&sproto.RecoverableError{Recoverable: rec.IsRecoverable()})
if err != nil {
// If this error, it will always error
panic(err)

View file

@ -0,0 +1,80 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: plugins/shared/structs/proto/recoverable_error.proto
package proto
import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
// RecoverableError is used with a grpc Status to indicate if the error is one
// which is recoverable and can be reattempted by the client.
type RecoverableError struct {
Recoverable bool `protobuf:"varint,1,opt,name=recoverable,proto3" json:"recoverable,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *RecoverableError) Reset() { *m = RecoverableError{} }
func (m *RecoverableError) String() string { return proto.CompactTextString(m) }
func (*RecoverableError) ProtoMessage() {}
func (*RecoverableError) Descriptor() ([]byte, []int) {
return fileDescriptor_recoverable_error_f746254fd69675b0, []int{0}
}
func (m *RecoverableError) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RecoverableError.Unmarshal(m, b)
}
func (m *RecoverableError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_RecoverableError.Marshal(b, m, deterministic)
}
func (dst *RecoverableError) XXX_Merge(src proto.Message) {
xxx_messageInfo_RecoverableError.Merge(dst, src)
}
func (m *RecoverableError) XXX_Size() int {
return xxx_messageInfo_RecoverableError.Size(m)
}
func (m *RecoverableError) XXX_DiscardUnknown() {
xxx_messageInfo_RecoverableError.DiscardUnknown(m)
}
var xxx_messageInfo_RecoverableError proto.InternalMessageInfo
func (m *RecoverableError) GetRecoverable() bool {
if m != nil {
return m.Recoverable
}
return false
}
func init() {
proto.RegisterType((*RecoverableError)(nil), "hashicorp.nomad.plugins.shared.structs.RecoverableError")
}
func init() {
proto.RegisterFile("plugins/shared/structs/proto/recoverable_error.proto", fileDescriptor_recoverable_error_f746254fd69675b0)
}
var fileDescriptor_recoverable_error_f746254fd69675b0 = []byte{
// 138 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x32, 0x29, 0xc8, 0x29, 0x4d,
0xcf, 0xcc, 0x2b, 0xd6, 0x2f, 0xce, 0x48, 0x2c, 0x4a, 0x4d, 0xd1, 0x2f, 0x2e, 0x29, 0x2a, 0x4d,
0x2e, 0x29, 0xd6, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x2f, 0x4a, 0x4d, 0xce, 0x2f, 0x4b, 0x2d,
0x4a, 0x4c, 0xca, 0x49, 0x8d, 0x4f, 0x2d, 0x2a, 0xca, 0x2f, 0xd2, 0x03, 0x8b, 0x0b, 0xa9, 0x65,
0x24, 0x16, 0x67, 0x64, 0x26, 0xe7, 0x17, 0x15, 0xe8, 0xe5, 0xe5, 0xe7, 0x26, 0xa6, 0xe8, 0x41,
0x4d, 0xd1, 0x83, 0x98, 0xa2, 0x07, 0x35, 0x45, 0xc9, 0x84, 0x4b, 0x20, 0x08, 0x61, 0x84, 0x2b,
0xc8, 0x04, 0x21, 0x05, 0x2e, 0x6e, 0x24, 0x63, 0x25, 0x18, 0x15, 0x18, 0x35, 0x38, 0x82, 0x90,
0x85, 0x9c, 0xd8, 0xa3, 0x58, 0xc1, 0xd6, 0x24, 0xb1, 0x81, 0x29, 0x63, 0x40, 0x00, 0x00, 0x00,
0xff, 0xff, 0xc5, 0x45, 0x79, 0xed, 0xa5, 0x00, 0x00, 0x00,
}

View file

@ -0,0 +1,9 @@
syntax = "proto3";
package hashicorp.nomad.plugins.shared.structs;
option go_package = "proto";
// RecoverableError is used with a grpc Status to indicate if the error is one
// which is recoverable and can be reattempted by the client.
message RecoverableError {
bool recoverable = 1;
}