diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 3e11d9231a4..81b187a1f96 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -14750,7 +14750,7 @@ "description": "AllocatedDeviceStatus contains the status of an allocated device, if the driver chooses to report it. This may include driver-specific information.", "properties": { "conditions": { - "description": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + "description": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.\n\nMust not contain more than 8 entries.", "items": { "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Condition" }, @@ -15180,7 +15180,7 @@ "type": "string" }, "ips": { - "description": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + "description": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.\n\nMust not contain more than 16 entries.", "items": { "type": "string" }, @@ -15570,7 +15570,7 @@ "description": "AllocatedDeviceStatus contains the status of an allocated device, if the driver chooses to report it. This may include driver-specific information.", "properties": { "conditions": { - "description": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + "description": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.\n\nMust not contain more than 8 entries.", "items": { "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Condition" }, @@ -16013,7 +16013,7 @@ "type": "string" }, "ips": { - "description": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + "description": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.\n\nMust not contain more than 16 entries.", "items": { "type": "string" }, diff --git a/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha3_openapi.json b/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha3_openapi.json index 08fcc374bd4..4082f020f97 100644 --- a/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha3_openapi.json +++ b/api/openapi-spec/v3/apis__resource.k8s.io__v1alpha3_openapi.json @@ -90,7 +90,7 @@ "description": "AllocatedDeviceStatus contains the status of an allocated device, if the driver chooses to report it. This may include driver-specific information.", "properties": { "conditions": { - "description": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + "description": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.\n\nMust not contain more than 8 entries.", "items": { "allOf": [ { @@ -642,7 +642,7 @@ "type": "string" }, "ips": { - "description": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + "description": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.\n\nMust not contain more than 16 entries.", "items": { "default": "", "type": "string" diff --git a/api/openapi-spec/v3/apis__resource.k8s.io__v1beta1_openapi.json b/api/openapi-spec/v3/apis__resource.k8s.io__v1beta1_openapi.json index 9f7313d7e7d..c2c971a888a 100644 --- a/api/openapi-spec/v3/apis__resource.k8s.io__v1beta1_openapi.json +++ b/api/openapi-spec/v3/apis__resource.k8s.io__v1beta1_openapi.json @@ -90,7 +90,7 @@ "description": "AllocatedDeviceStatus contains the status of an allocated device, if the driver chooses to report it. This may include driver-specific information.", "properties": { "conditions": { - "description": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + "description": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.\n\nMust not contain more than 8 entries.", "items": { "allOf": [ { @@ -664,7 +664,7 @@ "type": "string" }, "ips": { - "description": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + "description": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.\n\nMust not contain more than 16 entries.", "items": { "default": "", "type": "string" diff --git a/pkg/apis/resource/fuzzer/fuzzer.go b/pkg/apis/resource/fuzzer/fuzzer.go index 31b64886e00..f9fa97a102a 100644 --- a/pkg/apis/resource/fuzzer/fuzzer.go +++ b/pkg/apis/resource/fuzzer/fuzzer.go @@ -62,7 +62,7 @@ var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { // // This is necessary because randomly generated content // might be valid JSON which changes during re-encoding. - r.Data = runtime.RawExtension{Raw: []byte(`{"apiVersion":"unknown.group/unknown","kind":"Something","someKey":"someValue"}`)} + r.Data = &runtime.RawExtension{Raw: []byte(`{"apiVersion":"unknown.group/unknown","kind":"Something","someKey":"someValue"}`)} }, } } diff --git a/pkg/apis/resource/types.go b/pkg/apis/resource/types.go index ccd8f745037..d802944f3d2 100644 --- a/pkg/apis/resource/types.go +++ b/pkg/apis/resource/types.go @@ -993,6 +993,24 @@ type ResourceClaimTemplateList struct { Items []ResourceClaimTemplate } +const ( + // AllocatedDeviceStatusMaxConditions represents the maximum number of + // conditions in a device status. + AllocatedDeviceStatusMaxConditions int = 8 + // AllocatedDeviceStatusDataMaxLength represents the maximum length of the + // raw data in the Data field in a device status. + AllocatedDeviceStatusDataMaxLength int = 10 * 1024 + // NetworkDeviceDataMaxIPs represents the maximum number of IPs in the networkData + // field in a device status. + NetworkDeviceDataMaxIPs int = 16 + // NetworkDeviceDataInterfaceNameMaxLength represents the maximum number of characters + // for the networkData.interfaceName field in a device status. + NetworkDeviceDataInterfaceNameMaxLength int = 256 + // NetworkDeviceDataHardwareAddressMaxLength represents the maximum number of characters + // for the networkData.hardwareAddress field in a device status. + NetworkDeviceDataHardwareAddressMaxLength int = 128 +) + // AllocatedDeviceStatus contains the status of an allocated device, if the // driver chooses to report it. This may include driver-specific information. type AllocatedDeviceStatus struct { @@ -1037,7 +1055,7 @@ type AllocatedDeviceStatus struct { // The length of the raw data must be smaller or equal to 10 Ki. // // +optional - Data runtime.RawExtension + Data *runtime.RawExtension // NetworkData contains network-related information specific to the device. // diff --git a/pkg/apis/resource/v1alpha3/zz_generated.conversion.go b/pkg/apis/resource/v1alpha3/zz_generated.conversion.go index 9f9e01b24d3..9b4d7d1fb68 100644 --- a/pkg/apis/resource/v1alpha3/zz_generated.conversion.go +++ b/pkg/apis/resource/v1alpha3/zz_generated.conversion.go @@ -390,7 +390,7 @@ func autoConvert_v1alpha3_AllocatedDeviceStatus_To_resource_AllocatedDeviceStatu out.Pool = in.Pool out.Device = in.Device out.Conditions = *(*[]v1.Condition)(unsafe.Pointer(&in.Conditions)) - out.Data = in.Data + out.Data = (*runtime.RawExtension)(unsafe.Pointer(in.Data)) out.NetworkData = (*resource.NetworkDeviceData)(unsafe.Pointer(in.NetworkData)) return nil } @@ -405,7 +405,7 @@ func autoConvert_resource_AllocatedDeviceStatus_To_v1alpha3_AllocatedDeviceStatu out.Pool = in.Pool out.Device = in.Device out.Conditions = *(*[]v1.Condition)(unsafe.Pointer(&in.Conditions)) - out.Data = in.Data + out.Data = (*runtime.RawExtension)(unsafe.Pointer(in.Data)) out.NetworkData = (*resourcev1alpha3.NetworkDeviceData)(unsafe.Pointer(in.NetworkData)) return nil } diff --git a/pkg/apis/resource/v1beta1/zz_generated.conversion.go b/pkg/apis/resource/v1beta1/zz_generated.conversion.go index 8406ef4c6d7..74b674ee42b 100644 --- a/pkg/apis/resource/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/resource/v1beta1/zz_generated.conversion.go @@ -389,7 +389,7 @@ func autoConvert_v1beta1_AllocatedDeviceStatus_To_resource_AllocatedDeviceStatus out.Pool = in.Pool out.Device = in.Device out.Conditions = *(*[]v1.Condition)(unsafe.Pointer(&in.Conditions)) - out.Data = in.Data + out.Data = (*runtime.RawExtension)(unsafe.Pointer(in.Data)) out.NetworkData = (*resource.NetworkDeviceData)(unsafe.Pointer(in.NetworkData)) return nil } @@ -404,7 +404,7 @@ func autoConvert_resource_AllocatedDeviceStatus_To_v1beta1_AllocatedDeviceStatus out.Pool = in.Pool out.Device = in.Device out.Conditions = *(*[]v1.Condition)(unsafe.Pointer(&in.Conditions)) - out.Data = in.Data + out.Data = (*runtime.RawExtension)(unsafe.Pointer(in.Data)) out.NetworkData = (*resourcev1beta1.NetworkDeviceData)(unsafe.Pointer(in.NetworkData)) return nil } diff --git a/pkg/apis/resource/validation/validation.go b/pkg/apis/resource/validation/validation.go index 24fe8cfbdcb..753bfd2e229 100644 --- a/pkg/apis/resource/validation/validation.go +++ b/pkg/apis/resource/validation/validation.go @@ -256,7 +256,7 @@ func validateDeviceConfiguration(config resource.DeviceConfiguration, fldPath *f func validateOpaqueConfiguration(config resource.OpaqueDeviceConfiguration, fldPath *field.Path, stored bool) field.ErrorList { var allErrs field.ErrorList allErrs = append(allErrs, validateDriverName(config.Driver, fldPath.Child("driver"))...) - allErrs = append(allErrs, validateRawExtension(config.Parameters, fldPath.Child("parameters"), stored)...) + allErrs = append(allErrs, validateRawExtension(config.Parameters, fldPath.Child("parameters"), stored, resource.OpaqueParametersMaxLength)...) return allErrs } @@ -748,29 +748,29 @@ func validateDeviceStatus(device resource.AllocatedDeviceStatus, fldPath *field. if !allocatedDevices.Has(deviceID) { allErrs = append(allErrs, field.Invalid(fldPath, deviceID, "must be an allocated device in the claim")) } - if len(device.Conditions) > maxConditions { - allErrs = append(allErrs, field.TooMany(fldPath.Child("conditions"), len(device.Conditions), maxConditions)) + if len(device.Conditions) > resource.AllocatedDeviceStatusMaxConditions { + allErrs = append(allErrs, field.TooMany(fldPath.Child("conditions"), len(device.Conditions), resource.AllocatedDeviceStatusMaxConditions)) } allErrs = append(allErrs, metav1validation.ValidateConditions(device.Conditions, fldPath.Child("conditions"))...) - if len(device.Data.Raw) > 0 { // Data is an optional field. - allErrs = append(allErrs, validateRawExtension(device.Data, fldPath.Child("data"), false)...) + if device.Data != nil && len(device.Data.Raw) > 0 { // Data is an optional field. + allErrs = append(allErrs, validateRawExtension(*device.Data, fldPath.Child("data"), false, resource.AllocatedDeviceStatusDataMaxLength)...) } allErrs = append(allErrs, validateNetworkDeviceData(device.NetworkData, fldPath.Child("networkData"))...) return allErrs } // validateRawExtension validates RawExtension as in https://github.com/kubernetes/kubernetes/pull/125549/ -func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path, stored bool) field.ErrorList { +func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path, stored bool, rawExtensionMaxLength int) field.ErrorList { var allErrs field.ErrorList var v any if len(rawExtension.Raw) == 0 { allErrs = append(allErrs, field.Required(fldPath, "")) - } else if !stored && len(rawExtension.Raw) > resource.OpaqueParametersMaxLength { + } else if !stored && len(rawExtension.Raw) > rawExtensionMaxLength { // Don't even bother with parsing when too large. // Only applies on create. Existing parameters are grand-fathered in // because the limit was introduced in 1.32. This also means that it // can be changed in the future. - allErrs = append(allErrs, field.TooLong(fldPath, "" /* unused */, resource.OpaqueParametersMaxLength)) + allErrs = append(allErrs, field.TooLong(fldPath, "" /* unused */, rawExtensionMaxLength)) } else if err := json.Unmarshal(rawExtension.Raw, &v); err != nil { allErrs = append(allErrs, field.Invalid(fldPath, "", fmt.Sprintf("error parsing data as JSON: %v", err.Error()))) } else if v == nil { @@ -781,26 +781,21 @@ func validateRawExtension(rawExtension runtime.RawExtension, fldPath *field.Path return allErrs } -const maxConditions int = 8 -const maxIPs int = 16 -const interfaceNameMaxLength int = 256 -const hardwareAddressMaxLength int = 128 - func validateNetworkDeviceData(networkDeviceData *resource.NetworkDeviceData, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList if networkDeviceData == nil { return allErrs } - if len(networkDeviceData.InterfaceName) > interfaceNameMaxLength { - allErrs = append(allErrs, field.TooLong(fldPath.Child("interfaceName"), "" /* unused */, interfaceNameMaxLength)) + if len(networkDeviceData.InterfaceName) > resource.NetworkDeviceDataInterfaceNameMaxLength { + allErrs = append(allErrs, field.TooLong(fldPath.Child("interfaceName"), "" /* unused */, resource.NetworkDeviceDataInterfaceNameMaxLength)) } - if len(networkDeviceData.HardwareAddress) > hardwareAddressMaxLength { - allErrs = append(allErrs, field.TooLong(fldPath.Child("hardwareAddress"), "" /* unused */, hardwareAddressMaxLength)) + if len(networkDeviceData.HardwareAddress) > resource.NetworkDeviceDataHardwareAddressMaxLength { + allErrs = append(allErrs, field.TooLong(fldPath.Child("hardwareAddress"), "" /* unused */, resource.NetworkDeviceDataHardwareAddressMaxLength)) } - allErrs = append(allErrs, validateSet(networkDeviceData.IPs, maxIPs, + allErrs = append(allErrs, validateSet(networkDeviceData.IPs, resource.NetworkDeviceDataMaxIPs, func(address string, fldPath *field.Path) field.ErrorList { // reformat CIDR to handle different ways IPs can be written // (e.g. 2001:db8::1/64 == 2001:0db8::1/64) diff --git a/pkg/apis/resource/validation/validation_resourceclaim_test.go b/pkg/apis/resource/validation/validation_resourceclaim_test.go index 6458c5dbc2b..5f3fe3308a8 100644 --- a/pkg/apis/resource/validation/validation_resourceclaim_test.go +++ b/pkg/apis/resource/validation/validation_resourceclaim_test.go @@ -1004,7 +1004,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { {Type: "test-6", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, {Type: "test-7", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, }, - Data: runtime.RawExtension{ + Data: &runtime.RawExtension{ Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), }, NetworkData: &resource.NetworkDeviceData{ @@ -1056,8 +1056,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, "invalid-network-device-status": { wantFailures: field.ErrorList{ - field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "interfaceName"), "", interfaceNameMaxLength), - field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "hardwareAddress"), "", hardwareAddressMaxLength), + field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "interfaceName"), "", resource.NetworkDeviceDataInterfaceNameMaxLength), + field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "hardwareAddress"), "", resource.NetworkDeviceDataHardwareAddressMaxLength), field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "ips").Index(0), "300.9.8.0/24", "must be a valid CIDR value, (e.g. 10.9.8.0/24 or 2001:db8::/64)"), field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "ips").Index(1), "010.009.008.000/24", "must be in canonical form (10.9.8.0/24)"), field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "ips").Index(2), "2001:0db8::1/64", "must be in canonical form (2001:db8::1/64)"), @@ -1070,8 +1070,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Pool: goodName, Device: goodName, NetworkData: &resource.NetworkDeviceData{ - InterfaceName: strings.Repeat("x", interfaceNameMaxLength+1), - HardwareAddress: strings.Repeat("x", hardwareAddressMaxLength+1), + InterfaceName: strings.Repeat("x", resource.NetworkDeviceDataInterfaceNameMaxLength+1), + HardwareAddress: strings.Repeat("x", resource.NetworkDeviceDataHardwareAddressMaxLength+1), IPs: []string{ "300.9.8.0/24", "010.009.008.000/24", @@ -1095,7 +1095,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Driver: goodName, Pool: goodName, Device: goodName, - Data: runtime.RawExtension{ + Data: &runtime.RawExtension{ Raw: []byte(`foo`), }, }, @@ -1106,9 +1106,9 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, "invalid-data-device-status-limits": { wantFailures: field.ErrorList{ - field.TooMany(field.NewPath("status", "devices").Index(0).Child("conditions"), maxConditions+1, maxConditions), - field.TooLong(field.NewPath("status", "devices").Index(0).Child("data"), "" /* unused */, resource.OpaqueParametersMaxLength), - field.TooMany(field.NewPath("status", "devices").Index(0).Child("networkData", "ips"), maxIPs+1, maxIPs), + field.TooMany(field.NewPath("status", "devices").Index(0).Child("conditions"), resource.AllocatedDeviceStatusMaxConditions+1, resource.AllocatedDeviceStatusMaxConditions), + field.TooLong(field.NewPath("status", "devices").Index(0).Child("data"), "" /* unused */, resource.AllocatedDeviceStatusDataMaxLength), + field.TooMany(field.NewPath("status", "devices").Index(0).Child("networkData", "ips"), resource.NetworkDeviceDataMaxIPs+1, resource.NetworkDeviceDataMaxIPs), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { @@ -1117,7 +1117,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Driver: goodName, Pool: goodName, Device: goodName, - Data: runtime.RawExtension{Raw: []byte(`{"str": "` + strings.Repeat("x", resource.OpaqueParametersMaxLength-9-2+1 /* too large by one */) + `"}`)}, + Data: &runtime.RawExtension{Raw: []byte(`{"str": "` + strings.Repeat("x", resource.AllocatedDeviceStatusDataMaxLength-9-2+1 /* too large by one */) + `"}`)}, Conditions: []metav1.Condition{ {Type: "test-0", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, {Type: "test-1", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, @@ -1189,8 +1189,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, "invalid-network-device-status-disabled-feature-gate": { wantFailures: field.ErrorList{ - field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "interfaceName"), "", interfaceNameMaxLength), - field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "hardwareAddress"), "", hardwareAddressMaxLength), + field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "interfaceName"), "", resource.NetworkDeviceDataInterfaceNameMaxLength), + field.TooLong(field.NewPath("status", "devices").Index(0).Child("networkData", "hardwareAddress"), "", resource.NetworkDeviceDataHardwareAddressMaxLength), field.Invalid(field.NewPath("status", "devices").Index(0).Child("networkData", "ips").Index(0), "300.9.8.0/24", "must be a valid CIDR value, (e.g. 10.9.8.0/24 or 2001:db8::/64)"), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), @@ -1201,8 +1201,8 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Pool: goodName, Device: goodName, NetworkData: &resource.NetworkDeviceData{ - InterfaceName: strings.Repeat("x", interfaceNameMaxLength+1), - HardwareAddress: strings.Repeat("x", hardwareAddressMaxLength+1), + InterfaceName: strings.Repeat("x", resource.NetworkDeviceDataInterfaceNameMaxLength+1), + HardwareAddress: strings.Repeat("x", resource.NetworkDeviceDataHardwareAddressMaxLength+1), IPs: []string{ "300.9.8.0/24", }, @@ -1224,7 +1224,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Driver: goodName, Pool: goodName, Device: goodName, - Data: runtime.RawExtension{ + Data: &runtime.RawExtension{ Raw: []byte(`foo`), }, }, @@ -1235,9 +1235,9 @@ func TestValidateClaimStatusUpdate(t *testing.T) { }, "invalid-data-device-status-limits-feature-gate": { wantFailures: field.ErrorList{ - field.TooMany(field.NewPath("status", "devices").Index(0).Child("conditions"), maxConditions+1, maxConditions), - field.TooLong(field.NewPath("status", "devices").Index(0).Child("data"), "" /* unused */, resource.OpaqueParametersMaxLength), - field.TooMany(field.NewPath("status", "devices").Index(0).Child("networkData", "ips"), maxIPs+1, maxIPs), + field.TooMany(field.NewPath("status", "devices").Index(0).Child("conditions"), resource.AllocatedDeviceStatusMaxConditions+1, resource.AllocatedDeviceStatusMaxConditions), + field.TooLong(field.NewPath("status", "devices").Index(0).Child("data"), "" /* unused */, resource.AllocatedDeviceStatusDataMaxLength), + field.TooMany(field.NewPath("status", "devices").Index(0).Child("networkData", "ips"), resource.NetworkDeviceDataMaxIPs+1, resource.NetworkDeviceDataMaxIPs), }, oldClaim: func() *resource.ResourceClaim { return validAllocatedClaim }(), update: func(claim *resource.ResourceClaim) *resource.ResourceClaim { @@ -1246,7 +1246,7 @@ func TestValidateClaimStatusUpdate(t *testing.T) { Driver: goodName, Pool: goodName, Device: goodName, - Data: runtime.RawExtension{Raw: []byte(`{"str": "` + strings.Repeat("x", resource.OpaqueParametersMaxLength-9-2+1 /* too large by one */) + `"}`)}, + Data: &runtime.RawExtension{Raw: []byte(`{"str": "` + strings.Repeat("x", resource.AllocatedDeviceStatusDataMaxLength-9-2+1 /* too large by one */) + `"}`)}, Conditions: []metav1.Condition{ {Type: "test-0", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, {Type: "test-1", Status: metav1.ConditionTrue, Reason: "test_reason", LastTransitionTime: metav1.Now(), ObservedGeneration: 0}, diff --git a/pkg/apis/resource/zz_generated.deepcopy.go b/pkg/apis/resource/zz_generated.deepcopy.go index 9b49a4e3c14..edbff8751e2 100644 --- a/pkg/apis/resource/zz_generated.deepcopy.go +++ b/pkg/apis/resource/zz_generated.deepcopy.go @@ -37,7 +37,11 @@ func (in *AllocatedDeviceStatus) DeepCopyInto(out *AllocatedDeviceStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } - in.Data.DeepCopyInto(&out.Data) + if in.Data != nil { + in, out := &in.Data, &out.Data + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) + } if in.NetworkData != nil { in, out := &in.NetworkData, &out.NetworkData *out = new(NetworkDeviceData) diff --git a/pkg/generated/openapi/zz_generated.openapi.go b/pkg/generated/openapi/zz_generated.openapi.go index f7d0abc5d72..cc403682267 100644 --- a/pkg/generated/openapi/zz_generated.openapi.go +++ b/pkg/generated/openapi/zz_generated.openapi.go @@ -46736,7 +46736,7 @@ func schema_k8sio_api_resource_v1alpha3_AllocatedDeviceStatus(ref common.Referen }, }, SchemaProps: spec.SchemaProps{ - Description: "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + Description: "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.\n\nMust not contain more than 8 entries.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -47547,7 +47547,7 @@ func schema_k8sio_api_resource_v1alpha3_NetworkDeviceData(ref common.ReferenceCa }, }, SchemaProps: spec.SchemaProps{ - Description: "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + Description: "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.\n\nMust not contain more than 16 entries.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -48210,7 +48210,7 @@ func schema_k8sio_api_resource_v1beta1_AllocatedDeviceStatus(ref common.Referenc }, }, SchemaProps: spec.SchemaProps{ - Description: "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + Description: "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.\n\nMust not contain more than 8 entries.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -49044,7 +49044,7 @@ func schema_k8sio_api_resource_v1beta1_NetworkDeviceData(ref common.ReferenceCal }, }, SchemaProps: spec.SchemaProps{ - Description: "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + Description: "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.\n\nMust not contain more than 16 entries.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ diff --git a/staging/src/k8s.io/api/resource/v1alpha3/generated.pb.go b/staging/src/k8s.io/api/resource/v1alpha3/generated.pb.go index 540f7b8184a..9339406f4d4 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/generated.pb.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/generated.pb.go @@ -29,6 +29,7 @@ import ( v11 "k8s.io/api/core/v1" resource "k8s.io/apimachinery/pkg/api/resource" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" math "math" math_bits "math/bits" @@ -1016,134 +1017,134 @@ func init() { } var fileDescriptor_66649ee9bbcd89d2 = []byte{ - // 2030 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x19, 0xcd, 0x6f, 0x1c, 0x57, - 0xdd, 0xb3, 0xe3, 0xcf, 0xdf, 0xfa, 0x2b, 0x2f, 0xa4, 0x38, 0xa6, 0xec, 0x3a, 0x53, 0x04, 0x4e, - 0x9b, 0xee, 0x36, 0x4e, 0xd5, 0x16, 0xc2, 0x01, 0x8f, 0xed, 0x06, 0x47, 0x89, 0xe3, 0x3c, 0xb7, - 0x11, 0x81, 0x12, 0x78, 0x9e, 0x7d, 0xb6, 0x07, 0xcf, 0xce, 0x4c, 0xe7, 0xbd, 0x71, 0xea, 0x0b, - 0xaa, 0xe0, 0x1e, 0xf1, 0x0f, 0x20, 0x0e, 0x48, 0x48, 0x5c, 0x80, 0xff, 0x00, 0x24, 0x90, 0x88, - 0xe0, 0x12, 0x09, 0x0e, 0x3d, 0x2d, 0xcd, 0x22, 0xce, 0xdc, 0x73, 0x42, 0xef, 0xcd, 0x9b, 0xcf, - 0xdd, 0x71, 0xc6, 0x55, 0xb1, 0xd2, 0xdb, 0xce, 0xef, 0xfb, 0xfd, 0xbe, 0xdf, 0x5b, 0xb8, 0x72, - 0xf8, 0x0e, 0x6b, 0xd9, 0x5e, 0x9b, 0xf8, 0x76, 0x3b, 0xa0, 0xcc, 0x0b, 0x03, 0x8b, 0xb6, 0x8f, - 0xae, 0x12, 0xc7, 0x3f, 0x20, 0xd7, 0xda, 0xfb, 0xd4, 0xa5, 0x01, 0xe1, 0xb4, 0xd3, 0xf2, 0x03, - 0x8f, 0x7b, 0xe8, 0xe5, 0x88, 0xba, 0x45, 0x7c, 0xbb, 0x15, 0x53, 0xb7, 0x62, 0xea, 0xc5, 0xd7, - 0xf7, 0x6d, 0x7e, 0x10, 0xee, 0xb6, 0x2c, 0xaf, 0xdb, 0xde, 0xf7, 0xf6, 0xbd, 0xb6, 0x64, 0xda, - 0x0d, 0xf7, 0xe4, 0x97, 0xfc, 0x90, 0xbf, 0x22, 0x61, 0x8b, 0x46, 0x46, 0xb5, 0xe5, 0x05, 0x42, - 0x6d, 0x51, 0xe1, 0xe2, 0x9b, 0x29, 0x4d, 0x97, 0x58, 0x07, 0xb6, 0x4b, 0x83, 0xe3, 0xb6, 0x7f, - 0xb8, 0x9f, 0xb7, 0xf7, 0x34, 0x5c, 0xac, 0xdd, 0xa5, 0x9c, 0x0c, 0xd3, 0xd5, 0x2e, 0xe3, 0x0a, - 0x42, 0x97, 0xdb, 0xdd, 0x41, 0x35, 0x6f, 0x3d, 0x8f, 0x81, 0x59, 0x07, 0xb4, 0x4b, 0x8a, 0x7c, - 0xc6, 0xaf, 0x75, 0xb8, 0xb0, 0xea, 0x38, 0x9e, 0x25, 0x60, 0xeb, 0xf4, 0xc8, 0xb6, 0xe8, 0x0e, - 0x27, 0x3c, 0x64, 0xe8, 0xeb, 0x30, 0xde, 0x09, 0xec, 0x23, 0x1a, 0x2c, 0x68, 0x4b, 0xda, 0xf2, - 0x94, 0x39, 0xfb, 0xb8, 0xd7, 0x1c, 0xe9, 0xf7, 0x9a, 0xe3, 0xeb, 0x12, 0x8a, 0x15, 0x16, 0x2d, - 0xc1, 0xa8, 0xef, 0x79, 0xce, 0x42, 0x4d, 0x52, 0x4d, 0x2b, 0xaa, 0xd1, 0x6d, 0xcf, 0x73, 0xb0, - 0xc4, 0x48, 0x49, 0x52, 0xf2, 0x82, 0x5e, 0x90, 0x24, 0xa1, 0x58, 0x61, 0x91, 0x05, 0x60, 0x79, - 0x6e, 0xc7, 0xe6, 0xb6, 0xe7, 0xb2, 0x85, 0xd1, 0x25, 0x7d, 0xb9, 0xbe, 0xd2, 0x6e, 0xa5, 0x61, - 0x4e, 0x0e, 0xd6, 0xf2, 0x0f, 0xf7, 0x05, 0x80, 0xb5, 0x84, 0xff, 0x5a, 0x47, 0x57, 0x5b, 0x6b, - 0x31, 0x9f, 0x89, 0x94, 0x70, 0x48, 0x40, 0x0c, 0x67, 0xc4, 0xa2, 0x3b, 0x30, 0xda, 0x21, 0x9c, - 0x2c, 0x8c, 0x2d, 0x69, 0xcb, 0xf5, 0x95, 0xd7, 0x4b, 0xc5, 0x2b, 0xbf, 0xb5, 0x30, 0x79, 0xb8, - 0xf1, 0x11, 0xa7, 0x2e, 0x13, 0xc2, 0x93, 0xd3, 0xad, 0x13, 0x4e, 0xb0, 0x14, 0x84, 0x76, 0xa1, - 0xee, 0x52, 0xfe, 0xd0, 0x0b, 0x0e, 0x05, 0x70, 0x61, 0x5c, 0xca, 0xcd, 0x9a, 0x3d, 0x98, 0x9d, - 0xad, 0x2d, 0xc5, 0x20, 0xcf, 0x2d, 0xd8, 0xcc, 0xb9, 0x7e, 0xaf, 0x59, 0xdf, 0x4a, 0xe5, 0xe0, - 0xac, 0x50, 0xe3, 0xef, 0x1a, 0xcc, 0xab, 0x28, 0xd9, 0x9e, 0x8b, 0x29, 0x0b, 0x1d, 0x8e, 0x7e, - 0x04, 0x13, 0x91, 0xe3, 0x98, 0x8c, 0x50, 0x7d, 0xe5, 0xcd, 0x93, 0x95, 0x46, 0xda, 0x8a, 0x62, - 0xcc, 0x39, 0x75, 0xa6, 0x89, 0x08, 0xcf, 0x70, 0x2c, 0x15, 0xdd, 0x83, 0x69, 0xd7, 0xeb, 0xd0, - 0x1d, 0xea, 0x50, 0x8b, 0x7b, 0x81, 0x8c, 0x5e, 0x7d, 0x65, 0x29, 0xab, 0x45, 0xd4, 0x8a, 0xf0, - 0xff, 0x56, 0x86, 0xce, 0x9c, 0xef, 0xf7, 0x9a, 0xd3, 0x59, 0x08, 0xce, 0xc9, 0x31, 0x3e, 0xd5, - 0xa1, 0x6e, 0x12, 0x66, 0x5b, 0x91, 0x46, 0xf4, 0x53, 0x00, 0xc2, 0x79, 0x60, 0xef, 0x86, 0x5c, - 0x9e, 0x45, 0xc4, 0xfd, 0x9b, 0x27, 0x9f, 0x25, 0xc3, 0xde, 0x5a, 0x4d, 0x78, 0x37, 0x5c, 0x1e, - 0x1c, 0x9b, 0xaf, 0xc4, 0x19, 0x90, 0x22, 0x7e, 0xf6, 0xaf, 0xe6, 0xcc, 0xdd, 0x90, 0x38, 0xf6, - 0x9e, 0x4d, 0x3b, 0x5b, 0xa4, 0x4b, 0x71, 0x46, 0x23, 0x3a, 0x82, 0x49, 0x8b, 0xf8, 0xc4, 0xb2, - 0xf9, 0xf1, 0x42, 0x4d, 0x6a, 0x7f, 0xbb, 0xba, 0xf6, 0x35, 0xc5, 0x19, 0xe9, 0xbe, 0xa4, 0x74, - 0x4f, 0xc6, 0xe0, 0x41, 0xcd, 0x89, 0xae, 0x45, 0x07, 0xe6, 0x0a, 0xb6, 0xa3, 0x79, 0xd0, 0x0f, - 0xe9, 0x71, 0x54, 0x71, 0x58, 0xfc, 0x44, 0x6b, 0x30, 0x76, 0x44, 0x9c, 0x90, 0xca, 0xfa, 0xca, - 0x27, 0x6c, 0x79, 0x8c, 0x63, 0xa9, 0x38, 0xe2, 0xfd, 0x56, 0xed, 0x1d, 0x6d, 0xf1, 0x10, 0x66, - 0x72, 0xb6, 0x0e, 0xd1, 0xb5, 0x9e, 0xd7, 0xd5, 0x3a, 0xa9, 0xf6, 0x52, 0xe5, 0x77, 0x43, 0xe2, - 0x72, 0x9b, 0x1f, 0x67, 0x94, 0x19, 0x37, 0xe0, 0xdc, 0xda, 0xc6, 0x2d, 0xd5, 0x4f, 0x54, 0xdc, - 0xd1, 0x0a, 0x00, 0xfd, 0xc8, 0x0f, 0x28, 0x13, 0xb5, 0xa4, 0xba, 0x4a, 0x52, 0xae, 0x1b, 0x09, - 0x06, 0x67, 0xa8, 0x8c, 0x23, 0x50, 0x5d, 0x42, 0xf4, 0x19, 0x97, 0x74, 0xa9, 0xe2, 0x4b, 0x2a, - 0x51, 0xfa, 0x54, 0x62, 0xd0, 0x4d, 0x18, 0xdb, 0x15, 0x91, 0x51, 0xe6, 0x5f, 0xae, 0x1c, 0x44, - 0x73, 0xaa, 0xdf, 0x6b, 0x8e, 0x49, 0x00, 0x8e, 0x44, 0x18, 0x8f, 0x6a, 0xf0, 0xd5, 0x62, 0xc1, - 0xac, 0x79, 0xee, 0x9e, 0xbd, 0x1f, 0x06, 0xf2, 0x03, 0x7d, 0x07, 0xc6, 0x23, 0x91, 0xca, 0xa2, - 0xe5, 0xb8, 0xab, 0xed, 0x48, 0xe8, 0xb3, 0x5e, 0xf3, 0xa5, 0x22, 0x6b, 0x84, 0xc1, 0x8a, 0x0f, - 0x2d, 0xc3, 0x64, 0x40, 0x3f, 0x0c, 0x29, 0xe3, 0x4c, 0xe6, 0xdd, 0x94, 0x39, 0x2d, 0x52, 0x07, - 0x2b, 0x18, 0x4e, 0xb0, 0xe8, 0x63, 0x0d, 0xce, 0x47, 0x55, 0x99, 0xb3, 0x41, 0x55, 0xe4, 0xd5, - 0x2a, 0x39, 0x91, 0x63, 0x34, 0xbf, 0xa2, 0x8c, 0x3d, 0x3f, 0x04, 0x89, 0x87, 0xa9, 0x32, 0xfe, - 0xa3, 0xc1, 0x4b, 0xc3, 0x3b, 0x08, 0xda, 0x83, 0x89, 0x40, 0xfe, 0x8a, 0x8b, 0xf7, 0x7a, 0x15, - 0x83, 0xd4, 0x31, 0xcb, 0xfb, 0x51, 0xf4, 0xcd, 0x70, 0x2c, 0x1c, 0x59, 0x30, 0x6e, 0x49, 0x9b, - 0x54, 0x95, 0x5e, 0x3f, 0x5d, 0xbf, 0xcb, 0x7b, 0x20, 0x19, 0x42, 0x11, 0x18, 0x2b, 0xd1, 0xc6, - 0x6f, 0x35, 0x98, 0x2b, 0x54, 0x11, 0x6a, 0x80, 0x6e, 0xbb, 0x5c, 0xa6, 0x95, 0x1e, 0xc5, 0x68, - 0xd3, 0xe5, 0xf7, 0x44, 0xb2, 0x63, 0x81, 0x40, 0x97, 0x60, 0x74, 0x57, 0x8c, 0x40, 0x11, 0x8e, - 0x49, 0x73, 0xa6, 0xdf, 0x6b, 0x4e, 0x99, 0x9e, 0xe7, 0x44, 0x14, 0x12, 0x85, 0xbe, 0x01, 0xe3, - 0x8c, 0x07, 0xb6, 0xbb, 0xbf, 0x30, 0x2a, 0xb3, 0x45, 0xf6, 0xfb, 0x1d, 0x09, 0x89, 0xc8, 0x14, - 0x1a, 0xbd, 0x0a, 0x13, 0x47, 0x34, 0x90, 0x15, 0x32, 0x26, 0x29, 0x65, 0x37, 0xbd, 0x17, 0x81, - 0x22, 0xd2, 0x98, 0xc0, 0xf8, 0x7d, 0x0d, 0xea, 0x2a, 0x80, 0x0e, 0xb1, 0xbb, 0xe8, 0x7e, 0x26, - 0xa1, 0xa2, 0x48, 0xbc, 0x76, 0x8a, 0x48, 0x98, 0xf3, 0x71, 0xf3, 0x1a, 0x92, 0x81, 0x14, 0xea, - 0x96, 0xe7, 0x32, 0x1e, 0x10, 0xdb, 0x55, 0xe9, 0x9a, 0x6f, 0x10, 0x27, 0x25, 0x9e, 0x62, 0x33, - 0xcf, 0x2b, 0x05, 0xf5, 0x14, 0xc6, 0x70, 0x56, 0x2e, 0x7a, 0x90, 0x84, 0x58, 0x97, 0x1a, 0xde, - 0xaa, 0xa4, 0x41, 0x1c, 0xbe, 0x5a, 0x74, 0xff, 0xaa, 0xc1, 0x42, 0x19, 0x53, 0xae, 0x1e, 0xb5, - 0xcf, 0x54, 0x8f, 0xb5, 0xb3, 0xab, 0xc7, 0x3f, 0x69, 0x99, 0xd8, 0x33, 0x86, 0x7e, 0x0c, 0x93, - 0x62, 0x19, 0x92, 0xbb, 0x4d, 0xb4, 0x0e, 0xbc, 0x51, 0x6d, 0x75, 0xba, 0xb3, 0xfb, 0x13, 0x6a, - 0xf1, 0xdb, 0x94, 0x93, 0xb4, 0x19, 0xa7, 0x30, 0x9c, 0x48, 0x15, 0x9b, 0x13, 0xf3, 0xa9, 0x75, - 0x9a, 0x41, 0x24, 0x4d, 0xdb, 0xf1, 0xa9, 0x95, 0xf6, 0x6b, 0xf1, 0x85, 0xa5, 0x20, 0xe3, 0x97, - 0xd9, 0x60, 0x30, 0x96, 0x0f, 0x46, 0x99, 0x8b, 0xb5, 0xb3, 0x73, 0xf1, 0x1f, 0x93, 0x56, 0x20, - 0xed, 0xbb, 0x65, 0x33, 0x8e, 0x3e, 0x18, 0x70, 0x73, 0xab, 0x9a, 0x9b, 0x05, 0xb7, 0x74, 0x72, - 0x52, 0x65, 0x31, 0x24, 0xe3, 0xe2, 0x2d, 0x18, 0xb3, 0x39, 0xed, 0xc6, 0xf5, 0x75, 0xb9, 0xb2, - 0x8f, 0xcd, 0x19, 0x25, 0x75, 0x6c, 0x53, 0xf0, 0xe3, 0x48, 0x8c, 0xf1, 0x24, 0x7f, 0x02, 0xe1, - 0x7b, 0xf4, 0x43, 0x98, 0x62, 0x6a, 0x22, 0xc7, 0x5d, 0xe2, 0x4a, 0x15, 0x3d, 0xc9, 0x7a, 0x77, - 0x4e, 0xa9, 0x9a, 0x8a, 0x21, 0x0c, 0xa7, 0x12, 0x33, 0x15, 0x5c, 0x3b, 0x55, 0x05, 0x17, 0xe2, - 0x5f, 0x5a, 0xc1, 0x01, 0x0c, 0x0b, 0x20, 0xfa, 0x01, 0x8c, 0x7b, 0x3e, 0xf9, 0x30, 0xa4, 0x2a, - 0x2a, 0xcf, 0xd9, 0xe0, 0xee, 0x48, 0xda, 0x61, 0x69, 0x02, 0x42, 0x67, 0x84, 0xc6, 0x4a, 0xa4, - 0xf1, 0x48, 0x83, 0xf9, 0x62, 0x33, 0x3b, 0x45, 0xb7, 0xd8, 0x86, 0xd9, 0x2e, 0xe1, 0xd6, 0x41, - 0x32, 0x50, 0xd4, 0x5d, 0x69, 0xb9, 0xdf, 0x6b, 0xce, 0xde, 0xce, 0x61, 0x9e, 0xf5, 0x9a, 0xe8, - 0xdd, 0xd0, 0x71, 0x8e, 0xf3, 0x3b, 0x63, 0x81, 0xdf, 0xf8, 0xb9, 0x0e, 0x33, 0xb9, 0xde, 0x5d, - 0x61, 0x3b, 0x5a, 0x85, 0xb9, 0x4e, 0xea, 0x6c, 0x81, 0x50, 0x66, 0x7c, 0x59, 0x11, 0x67, 0x33, - 0x45, 0xf2, 0x15, 0xe9, 0xf3, 0xa9, 0xa3, 0x7f, 0xee, 0xa9, 0x73, 0x0f, 0x66, 0x49, 0x32, 0xad, - 0x6f, 0x7b, 0x1d, 0xaa, 0x66, 0x65, 0x4b, 0x71, 0xcd, 0xae, 0xe6, 0xb0, 0xcf, 0x7a, 0xcd, 0x2f, - 0x15, 0x67, 0xbc, 0x80, 0xe3, 0x82, 0x14, 0xf4, 0x0a, 0x8c, 0x59, 0x5e, 0xe8, 0x72, 0x39, 0x50, - 0xf5, 0xb4, 0x54, 0xd6, 0x04, 0x10, 0x47, 0x38, 0x74, 0x15, 0xea, 0xa4, 0xd3, 0xb5, 0xdd, 0x55, - 0xcb, 0xa2, 0x8c, 0xc9, 0x6b, 0xdc, 0x64, 0x34, 0xa5, 0x57, 0x53, 0x30, 0xce, 0xd2, 0x18, 0xff, - 0xd5, 0xe2, 0x1d, 0xb1, 0x64, 0x97, 0x41, 0x97, 0xc5, 0x66, 0x24, 0x51, 0x2a, 0x30, 0x99, 0xe5, - 0x46, 0x82, 0x71, 0x8c, 0xcf, 0x5c, 0xb7, 0x6b, 0x95, 0xae, 0xdb, 0x7a, 0x85, 0xeb, 0xf6, 0xe8, - 0x89, 0xd7, 0xed, 0xc2, 0x89, 0xc7, 0x2a, 0x9c, 0xf8, 0x03, 0x98, 0x2d, 0xec, 0xf4, 0x37, 0x41, - 0xb7, 0xa8, 0xa3, 0x8a, 0xee, 0x39, 0xb7, 0xde, 0x81, 0x1b, 0x81, 0x39, 0xd1, 0xef, 0x35, 0xf5, - 0xb5, 0x8d, 0x5b, 0x58, 0x08, 0x31, 0x7e, 0xa7, 0xc1, 0xb9, 0x81, 0x9b, 0x31, 0xba, 0x0e, 0x33, - 0xb6, 0xcb, 0x69, 0xb0, 0x47, 0x2c, 0xba, 0x95, 0xa6, 0xf8, 0x05, 0x75, 0xaa, 0x99, 0xcd, 0x2c, - 0x12, 0xe7, 0x69, 0xd1, 0x45, 0xd0, 0x6d, 0x3f, 0xde, 0xae, 0xa5, 0xb6, 0xcd, 0x6d, 0x86, 0x05, - 0x4c, 0xd4, 0xc3, 0x01, 0x09, 0x3a, 0x0f, 0x49, 0x40, 0x57, 0x3b, 0x1d, 0x71, 0xdf, 0x50, 0x3e, - 0x4d, 0xea, 0xe1, 0xbb, 0x79, 0x34, 0x2e, 0xd2, 0x1b, 0xbf, 0xd1, 0xe0, 0x62, 0x69, 0x27, 0xa9, - 0xfc, 0x80, 0x42, 0x00, 0x7c, 0x12, 0x90, 0x2e, 0xe5, 0x34, 0x60, 0x43, 0xa6, 0x6b, 0x85, 0x77, - 0x89, 0x64, 0x70, 0x6f, 0x27, 0x82, 0x70, 0x46, 0xa8, 0xf1, 0xab, 0x1a, 0xcc, 0x60, 0x15, 0x8f, - 0x68, 0x55, 0xfc, 0xff, 0xaf, 0x0b, 0x77, 0x73, 0xeb, 0xc2, 0x73, 0x52, 0x23, 0x67, 0x5c, 0xd9, - 0xc2, 0x80, 0xee, 0x8b, 0x25, 0x9a, 0xf0, 0x90, 0x55, 0xbb, 0xf8, 0xe4, 0x85, 0x4a, 0xc6, 0x34, - 0x08, 0xd1, 0x37, 0x56, 0x02, 0x8d, 0xbe, 0x06, 0x8d, 0x1c, 0xbd, 0xe8, 0xf4, 0x61, 0x97, 0x06, - 0x98, 0xee, 0xd1, 0x80, 0xba, 0x16, 0x45, 0x57, 0x60, 0x92, 0xf8, 0xf6, 0x8d, 0xc0, 0x0b, 0x7d, - 0x15, 0xd1, 0x64, 0x94, 0xaf, 0x6e, 0x6f, 0x4a, 0x38, 0x4e, 0x28, 0x04, 0x75, 0x6c, 0x91, 0xca, - 0xab, 0xcc, 0x7a, 0x1d, 0xc1, 0x71, 0x42, 0x91, 0xb4, 0xef, 0xd1, 0xd2, 0xf6, 0x6d, 0x82, 0x1e, - 0xda, 0x1d, 0x75, 0x27, 0x78, 0x43, 0x11, 0xe8, 0xef, 0x6f, 0xae, 0x3f, 0xeb, 0x35, 0x2f, 0x95, - 0x3d, 0xfe, 0xf1, 0x63, 0x9f, 0xb2, 0xd6, 0xfb, 0x9b, 0xeb, 0x58, 0x30, 0x1b, 0x7f, 0xd6, 0xe0, - 0x5c, 0xee, 0x90, 0x67, 0xb0, 0xd2, 0x6c, 0xe7, 0x57, 0x9a, 0xd7, 0x4e, 0x11, 0xb2, 0x92, 0xa5, - 0xc6, 0x2e, 0x1c, 0x42, 0x6e, 0x35, 0xef, 0x15, 0x1f, 0xc3, 0x2e, 0x57, 0xbe, 0x39, 0x94, 0xbf, - 0x80, 0x19, 0x7f, 0xab, 0xc1, 0xf9, 0x21, 0x59, 0x84, 0x1e, 0x00, 0xa4, 0x33, 0x66, 0x88, 0xd3, - 0x86, 0x28, 0x1c, 0xb8, 0xe7, 0xce, 0xca, 0x27, 0xaa, 0x14, 0x9a, 0x91, 0x88, 0x18, 0xd4, 0x03, - 0xca, 0x68, 0x70, 0x44, 0x3b, 0xef, 0x7a, 0x81, 0x72, 0xdd, 0xb7, 0x4f, 0xe1, 0xba, 0x81, 0xec, - 0x4d, 0xef, 0x5e, 0x38, 0x15, 0x8c, 0xb3, 0x5a, 0xd0, 0x83, 0xd4, 0x85, 0xd1, 0xdb, 0xeb, 0xb5, - 0x4a, 0x27, 0xca, 0x3f, 0x1b, 0x9f, 0xe0, 0xcc, 0x7f, 0x6a, 0x70, 0x21, 0x67, 0xe4, 0x7b, 0xb4, - 0xeb, 0x3b, 0x84, 0xd3, 0x33, 0x68, 0x46, 0xf7, 0x73, 0xcd, 0xe8, 0xed, 0x53, 0x78, 0x32, 0x36, - 0xb2, 0xf4, 0x16, 0xf3, 0x0f, 0x0d, 0x2e, 0x0e, 0xe5, 0x38, 0x83, 0xe2, 0xfa, 0x5e, 0xbe, 0xb8, - 0xae, 0x7d, 0x86, 0x73, 0x95, 0xdf, 0x1c, 0x2e, 0x96, 0xfa, 0xe1, 0x0b, 0x39, 0x3d, 0x8c, 0x3f, - 0x68, 0x30, 0x1d, 0x53, 0x8a, 0x75, 0xa9, 0xc2, 0xce, 0xbc, 0x02, 0xa0, 0xfe, 0x30, 0x89, 0x6f, - 0xf7, 0x7a, 0x6a, 0xf7, 0x8d, 0x04, 0x83, 0x33, 0x54, 0xe8, 0x26, 0xa0, 0xd8, 0xc2, 0x1d, 0x47, - 0x2e, 0x05, 0x62, 0xf5, 0xd4, 0x25, 0xef, 0xa2, 0xe2, 0x45, 0x78, 0x80, 0x02, 0x0f, 0xe1, 0x32, - 0xfe, 0xa2, 0xa5, 0x73, 0x5b, 0x82, 0x5f, 0x54, 0xcf, 0x4b, 0xe3, 0x4a, 0x3d, 0x9f, 0x9d, 0x3b, - 0x92, 0xf2, 0x85, 0x9d, 0x3b, 0xd2, 0xba, 0x92, 0x92, 0x78, 0xa4, 0x17, 0x4e, 0x21, 0x4b, 0xa1, - 0xea, 0x96, 0x77, 0x2b, 0xf3, 0x37, 0x59, 0x7d, 0xe5, 0xd5, 0x6a, 0xe6, 0x88, 0x34, 0x1d, 0xba, - 0xe3, 0x5f, 0x81, 0x49, 0xd7, 0xeb, 0x44, 0xfb, 0x70, 0x61, 0xbb, 0xd8, 0x52, 0x70, 0x9c, 0x50, - 0x0c, 0xfc, 0x91, 0x33, 0xfa, 0xf9, 0xfc, 0x91, 0x23, 0x37, 0x22, 0xc7, 0x11, 0x04, 0xf1, 0xf5, - 0x21, 0xdd, 0x88, 0x14, 0x1c, 0x27, 0x14, 0xe8, 0x4e, 0x3a, 0x5f, 0xc6, 0x65, 0x4c, 0xbe, 0x56, - 0x65, 0x44, 0x97, 0x0f, 0x14, 0xd3, 0x7c, 0xfc, 0xb4, 0x31, 0xf2, 0xe4, 0x69, 0x63, 0xe4, 0x93, - 0xa7, 0x8d, 0x91, 0x8f, 0xfb, 0x0d, 0xed, 0x71, 0xbf, 0xa1, 0x3d, 0xe9, 0x37, 0xb4, 0x4f, 0xfa, - 0x0d, 0xed, 0xd3, 0x7e, 0x43, 0xfb, 0xc5, 0xbf, 0x1b, 0x23, 0xdf, 0x7f, 0xf9, 0xa4, 0x7f, 0x95, - 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0xbd, 0x60, 0x85, 0x64, 0x74, 0x1e, 0x00, 0x00, + // 2031 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x19, 0x4b, 0x73, 0x1c, 0x47, + 0x59, 0xb3, 0xb3, 0x7a, 0x7d, 0xab, 0x97, 0xdb, 0x38, 0xc8, 0x22, 0xec, 0xca, 0x13, 0x0a, 0xe4, + 0xc4, 0xd9, 0x8d, 0xe5, 0x54, 0x12, 0x30, 0x07, 0x34, 0x92, 0x62, 0x64, 0x6c, 0x59, 0x6e, 0x25, + 0x2e, 0x0c, 0xc1, 0xd0, 0x9a, 0x6d, 0x49, 0x83, 0x66, 0x67, 0x36, 0xd3, 0x3d, 0x72, 0x74, 0xa1, + 0x52, 0x70, 0x77, 0xf1, 0x07, 0xa8, 0xdc, 0xa8, 0xe2, 0x02, 0xfc, 0x03, 0xa8, 0x82, 0x2a, 0x5c, + 0x70, 0x71, 0x15, 0x1c, 0x72, 0x5a, 0xe2, 0xa5, 0x38, 0x73, 0xf7, 0x89, 0xea, 0x9e, 0x9e, 0xe7, + 0xee, 0xc8, 0xb3, 0xa9, 0xa0, 0x32, 0xb7, 0x9d, 0xef, 0xdd, 0xdf, 0xbb, 0x7b, 0xe1, 0xca, 0xd1, + 0x3b, 0xac, 0x69, 0x7b, 0x2d, 0xd2, 0xb5, 0x5b, 0x3e, 0x65, 0x5e, 0xe0, 0x5b, 0xb4, 0x75, 0x7c, + 0x95, 0x38, 0xdd, 0x43, 0x72, 0xad, 0x75, 0x40, 0x5d, 0xea, 0x13, 0x4e, 0xdb, 0xcd, 0xae, 0xef, + 0x71, 0x0f, 0xbd, 0x1c, 0x52, 0x37, 0x49, 0xd7, 0x6e, 0x46, 0xd4, 0xcd, 0x88, 0x7a, 0xe9, 0xf5, + 0x03, 0x9b, 0x1f, 0x06, 0x7b, 0x4d, 0xcb, 0xeb, 0xb4, 0x0e, 0xbc, 0x03, 0xaf, 0x25, 0x99, 0xf6, + 0x82, 0x7d, 0xf9, 0x25, 0x3f, 0xe4, 0xaf, 0x50, 0xd8, 0x92, 0x91, 0x52, 0x6d, 0x79, 0xbe, 0x50, + 0x9b, 0x57, 0xb8, 0xf4, 0x66, 0x42, 0xd3, 0x21, 0xd6, 0xa1, 0xed, 0x52, 0xff, 0xa4, 0xd5, 0x3d, + 0x3a, 0xc8, 0xda, 0x3b, 0x0a, 0x17, 0x6b, 0x75, 0x28, 0x27, 0xc3, 0x74, 0xb5, 0x8a, 0xb8, 0xfc, + 0xc0, 0xe5, 0x76, 0x67, 0x50, 0xcd, 0x5b, 0xcf, 0x63, 0x60, 0xd6, 0x21, 0xed, 0x90, 0x3c, 0x9f, + 0xf1, 0x89, 0x0e, 0x17, 0xd6, 0x1c, 0xc7, 0xb3, 0x04, 0x6c, 0x83, 0x1e, 0xdb, 0x16, 0xdd, 0xe5, + 0x84, 0x07, 0x0c, 0x7d, 0x1d, 0x26, 0xda, 0xbe, 0x7d, 0x4c, 0xfd, 0x45, 0x6d, 0x59, 0x5b, 0x99, + 0x36, 0xe7, 0x1e, 0xf7, 0x1a, 0x63, 0xfd, 0x5e, 0x63, 0x62, 0x43, 0x42, 0xb1, 0xc2, 0xa2, 0x65, + 0xa8, 0x76, 0x3d, 0xcf, 0x59, 0xac, 0x48, 0xaa, 0x19, 0x45, 0x55, 0xdd, 0xf1, 0x3c, 0x07, 0x4b, + 0x8c, 0x94, 0x24, 0x25, 0x2f, 0xea, 0x39, 0x49, 0x12, 0x8a, 0x15, 0x16, 0x59, 0x00, 0x96, 0xe7, + 0xb6, 0x6d, 0x6e, 0x7b, 0x2e, 0x5b, 0xac, 0x2e, 0xeb, 0x2b, 0xb5, 0xd5, 0x56, 0x33, 0x09, 0x73, + 0x7c, 0xb0, 0x66, 0xf7, 0xe8, 0x40, 0x00, 0x58, 0x53, 0xf8, 0xaf, 0x79, 0x7c, 0xb5, 0xb9, 0x1e, + 0xf1, 0x99, 0x48, 0x09, 0x87, 0x18, 0xc4, 0x70, 0x4a, 0x2c, 0xfa, 0x1e, 0x54, 0xdb, 0x84, 0x93, + 0xc5, 0xf1, 0x65, 0x6d, 0xa5, 0xb6, 0xfa, 0x7a, 0xa1, 0x78, 0xe5, 0xb7, 0x26, 0x26, 0x0f, 0x37, + 0x3f, 0xe2, 0xd4, 0x65, 0x42, 0xf8, 0x94, 0x38, 0xd9, 0x06, 0xe1, 0x04, 0x4b, 0x21, 0x68, 0x0f, + 0x6a, 0x2e, 0xe5, 0x0f, 0x3d, 0xff, 0x48, 0x00, 0x17, 0x27, 0xa4, 0xcc, 0xb4, 0xc9, 0x83, 0x99, + 0xd9, 0xdc, 0x56, 0x0c, 0xf2, 0xcc, 0x82, 0xcd, 0x9c, 0xef, 0xf7, 0x1a, 0xb5, 0xed, 0x44, 0x0e, + 0x4e, 0x0b, 0x35, 0xfe, 0xa6, 0xc1, 0x82, 0x8a, 0x90, 0xed, 0xb9, 0x98, 0xb2, 0xc0, 0xe1, 0xe8, + 0xc7, 0x30, 0x19, 0x3a, 0x8d, 0xc9, 0xe8, 0xd4, 0x56, 0xdf, 0x3c, 0x5d, 0x69, 0xa8, 0x2d, 0x2f, + 0xc6, 0x9c, 0x57, 0xce, 0x9a, 0x0c, 0xf1, 0x0c, 0x47, 0x52, 0xd1, 0x3d, 0x98, 0x71, 0xbd, 0x36, + 0xdd, 0xa5, 0x0e, 0xb5, 0xb8, 0xe7, 0xcb, 0xc8, 0xd5, 0x56, 0x97, 0xd3, 0x5a, 0x44, 0x9d, 0x08, + 0xdf, 0x6f, 0xa7, 0xe8, 0xcc, 0x85, 0x7e, 0xaf, 0x31, 0x93, 0x86, 0xe0, 0x8c, 0x1c, 0xe3, 0x33, + 0x1d, 0x6a, 0x26, 0x61, 0xb6, 0x15, 0x6a, 0x44, 0x3f, 0x03, 0x20, 0x9c, 0xfb, 0xf6, 0x5e, 0xc0, + 0xe5, 0x59, 0x44, 0xcc, 0xbf, 0x79, 0xfa, 0x59, 0x52, 0xec, 0xcd, 0xb5, 0x98, 0x77, 0xd3, 0xe5, + 0xfe, 0x89, 0xf9, 0x4a, 0x14, 0xfd, 0x04, 0xf1, 0xf3, 0x7f, 0x36, 0x66, 0xef, 0x06, 0xc4, 0xb1, + 0xf7, 0x6d, 0xda, 0xde, 0x26, 0x1d, 0x8a, 0x53, 0x1a, 0xd1, 0x31, 0x4c, 0x59, 0xa4, 0x4b, 0x2c, + 0x9b, 0x9f, 0x2c, 0x56, 0xa4, 0xf6, 0xb7, 0xcb, 0x6b, 0x5f, 0x57, 0x9c, 0xa1, 0xee, 0x4b, 0x4a, + 0xf7, 0x54, 0x04, 0x1e, 0xd4, 0x1c, 0xeb, 0x5a, 0x72, 0x60, 0x3e, 0x67, 0x3b, 0x5a, 0x00, 0xfd, + 0x88, 0x9e, 0x84, 0xd5, 0x86, 0xc5, 0x4f, 0xb4, 0x0e, 0xe3, 0xc7, 0xc4, 0x09, 0xa8, 0xac, 0xad, + 0x6c, 0xb2, 0x16, 0xc7, 0x38, 0x92, 0x8a, 0x43, 0xde, 0x6f, 0x55, 0xde, 0xd1, 0x96, 0x8e, 0x60, + 0x36, 0x63, 0xeb, 0x10, 0x5d, 0x1b, 0x59, 0x5d, 0xcd, 0xd3, 0xea, 0x2e, 0x51, 0x7e, 0x37, 0x20, + 0x2e, 0xb7, 0xf9, 0x49, 0x4a, 0x99, 0x71, 0x03, 0xce, 0xad, 0x6f, 0xde, 0x52, 0xbd, 0x44, 0xc5, + 0x1d, 0xad, 0x02, 0xd0, 0x8f, 0xba, 0x3e, 0x65, 0xa2, 0x8e, 0x54, 0x47, 0x89, 0x4b, 0x75, 0x33, + 0xc6, 0xe0, 0x14, 0x95, 0x71, 0x0c, 0xaa, 0x43, 0x88, 0x1e, 0xe3, 0x92, 0x0e, 0x55, 0x7c, 0x71, + 0x8f, 0x91, 0x3e, 0x95, 0x18, 0x74, 0x13, 0xc6, 0xf7, 0x44, 0x64, 0x94, 0xf9, 0x97, 0x4b, 0x07, + 0xd1, 0x9c, 0xee, 0xf7, 0x1a, 0xe3, 0x12, 0x80, 0x43, 0x11, 0xc6, 0xa3, 0x0a, 0x7c, 0x35, 0x5f, + 0x30, 0xeb, 0x9e, 0xbb, 0x6f, 0x1f, 0x04, 0xbe, 0xfc, 0x40, 0xdf, 0x81, 0x89, 0x50, 0xa4, 0xb2, + 0x68, 0x25, 0xea, 0x68, 0xbb, 0x12, 0xfa, 0xac, 0xd7, 0x78, 0x29, 0xcf, 0x1a, 0x62, 0xb0, 0xe2, + 0x43, 0x2b, 0x30, 0xe5, 0xd3, 0x0f, 0x03, 0xca, 0x38, 0x93, 0x79, 0x37, 0x6d, 0xce, 0x88, 0xd4, + 0xc1, 0x0a, 0x86, 0x63, 0x2c, 0xfa, 0x58, 0x83, 0xf3, 0x61, 0x55, 0x66, 0x6c, 0x50, 0x15, 0x79, + 0xb5, 0x4c, 0x4e, 0x64, 0x18, 0xcd, 0xaf, 0x28, 0x63, 0xcf, 0x0f, 0x41, 0xe2, 0x61, 0xaa, 0x8c, + 0x7f, 0x6b, 0xf0, 0xd2, 0xf0, 0x0e, 0x82, 0xf6, 0x61, 0xd2, 0x97, 0xbf, 0xa2, 0xe2, 0xbd, 0x5e, + 0xc6, 0x20, 0x75, 0xcc, 0xe2, 0x7e, 0x14, 0x7e, 0x33, 0x1c, 0x09, 0x47, 0x16, 0x4c, 0x58, 0xd2, + 0x26, 0x55, 0xa5, 0xd7, 0x47, 0xeb, 0x77, 0x59, 0x0f, 0xc4, 0x03, 0x28, 0x04, 0x63, 0x25, 0xda, + 0xf8, 0x8d, 0x06, 0xf3, 0xb9, 0x2a, 0x42, 0x75, 0xd0, 0x6d, 0x97, 0xcb, 0xb4, 0xd2, 0xc3, 0x18, + 0x6d, 0xb9, 0xfc, 0x9e, 0x48, 0x76, 0x2c, 0x10, 0xe8, 0x12, 0x54, 0xf7, 0xc4, 0xf8, 0x13, 0xe1, + 0x98, 0x32, 0x67, 0xfb, 0xbd, 0xc6, 0xb4, 0xe9, 0x79, 0x4e, 0x48, 0x21, 0x51, 0xe8, 0x1b, 0x30, + 0xc1, 0xb8, 0x6f, 0xbb, 0x07, 0x8b, 0x55, 0x99, 0x2d, 0xb2, 0xdf, 0xef, 0x4a, 0x48, 0x48, 0xa6, + 0xd0, 0xe8, 0x55, 0x98, 0x3c, 0xa6, 0xbe, 0xac, 0x90, 0x71, 0x49, 0x29, 0xbb, 0xe9, 0xbd, 0x10, + 0x14, 0x92, 0x46, 0x04, 0xc6, 0xef, 0x2a, 0x50, 0x53, 0x01, 0x74, 0x88, 0xdd, 0x41, 0xf7, 0x53, + 0x09, 0x15, 0x46, 0xe2, 0xb5, 0x11, 0x22, 0x61, 0x2e, 0x44, 0xcd, 0x6b, 0x48, 0x06, 0x52, 0xa8, + 0x59, 0x9e, 0xcb, 0xb8, 0x4f, 0x6c, 0x57, 0xa5, 0x6b, 0xb6, 0x41, 0x9c, 0x96, 0x78, 0x8a, 0xcd, + 0x3c, 0xaf, 0x14, 0xd4, 0x12, 0x18, 0xc3, 0x69, 0xb9, 0xe8, 0x41, 0x1c, 0x62, 0x5d, 0x6a, 0x78, + 0xab, 0x94, 0x06, 0x71, 0xf8, 0x72, 0xd1, 0xfd, 0x8b, 0x06, 0x8b, 0x45, 0x4c, 0x99, 0x7a, 0xd4, + 0x3e, 0x57, 0x3d, 0x56, 0xce, 0xae, 0x1e, 0xff, 0xa8, 0xa5, 0x62, 0xcf, 0x18, 0xfa, 0x09, 0x4c, + 0x89, 0x45, 0x48, 0xee, 0x35, 0xe1, 0x3a, 0xf0, 0x46, 0xb9, 0xb5, 0xe9, 0xce, 0xde, 0x4f, 0xa9, + 0xc5, 0x6f, 0x53, 0x4e, 0x92, 0x66, 0x9c, 0xc0, 0x70, 0x2c, 0x15, 0xdd, 0x81, 0x2a, 0xeb, 0x52, + 0x6b, 0x94, 0x41, 0x24, 0x4d, 0xdb, 0xed, 0x52, 0x2b, 0xe9, 0xd7, 0xe2, 0x0b, 0x4b, 0x41, 0xc6, + 0xaf, 0xd2, 0xc1, 0x60, 0x2c, 0x1b, 0x8c, 0x22, 0x17, 0x6b, 0x67, 0xe7, 0xe2, 0x3f, 0xc4, 0xad, + 0x40, 0xda, 0x77, 0xcb, 0x66, 0x1c, 0x7d, 0x30, 0xe0, 0xe6, 0x66, 0x39, 0x37, 0x0b, 0x6e, 0xe9, + 0xe4, 0xb8, 0xca, 0x22, 0x48, 0xca, 0xc5, 0xdb, 0x30, 0x6e, 0x73, 0xda, 0x89, 0xea, 0xeb, 0x72, + 0x69, 0x1f, 0x9b, 0xb3, 0x4a, 0xea, 0xf8, 0x96, 0xe0, 0xc7, 0xa1, 0x18, 0xe3, 0x49, 0xf6, 0x04, + 0xc2, 0xf7, 0xe8, 0x47, 0x30, 0xcd, 0xd4, 0x44, 0x8e, 0xba, 0xc4, 0x95, 0x32, 0x7a, 0xe2, 0xf5, + 0xee, 0x9c, 0x52, 0x35, 0x1d, 0x41, 0x18, 0x4e, 0x24, 0xa6, 0x2a, 0xb8, 0x32, 0x52, 0x05, 0xe7, + 0xe2, 0x5f, 0x58, 0xc1, 0x3e, 0x0c, 0x0b, 0x20, 0xfa, 0x21, 0x4c, 0x78, 0x5d, 0xf2, 0x61, 0x40, + 0x55, 0x54, 0x9e, 0xb3, 0xc1, 0xdd, 0x91, 0xb4, 0xc3, 0xd2, 0x04, 0x84, 0xce, 0x10, 0x8d, 0x95, + 0x48, 0xe3, 0x91, 0x06, 0x0b, 0xf9, 0x66, 0x36, 0x42, 0xb7, 0xd8, 0x81, 0xb9, 0x0e, 0xe1, 0xd6, + 0x61, 0x3c, 0x50, 0xd4, 0x3d, 0x69, 0xa5, 0xdf, 0x6b, 0xcc, 0xdd, 0xce, 0x60, 0x9e, 0xf5, 0x1a, + 0xe8, 0xdd, 0xc0, 0x71, 0x4e, 0xb2, 0x3b, 0x63, 0x8e, 0xdf, 0xf8, 0x85, 0x0e, 0xb3, 0x99, 0xde, + 0x5d, 0x62, 0x3b, 0x5a, 0x83, 0xf9, 0x76, 0xe2, 0x6c, 0x81, 0x50, 0x66, 0x7c, 0x59, 0x11, 0xa7, + 0x33, 0x45, 0xf2, 0xe5, 0xe9, 0xb3, 0xa9, 0xa3, 0x7f, 0xe1, 0xa9, 0x73, 0x0f, 0xe6, 0x48, 0x3c, + 0xad, 0x6f, 0x7b, 0x6d, 0xaa, 0x66, 0x65, 0x53, 0x71, 0xcd, 0xad, 0x65, 0xb0, 0xcf, 0x7a, 0x8d, + 0x2f, 0xe5, 0x67, 0xbc, 0x80, 0xe3, 0x9c, 0x14, 0xf4, 0x0a, 0x8c, 0x5b, 0x5e, 0xe0, 0x72, 0x39, + 0x50, 0xf5, 0xa4, 0x54, 0xd6, 0x05, 0x10, 0x87, 0x38, 0x74, 0x15, 0x6a, 0xa4, 0xdd, 0xb1, 0xdd, + 0x35, 0xcb, 0xa2, 0x8c, 0xc9, 0x6b, 0xdc, 0x54, 0x38, 0xa5, 0xd7, 0x12, 0x30, 0x4e, 0xd3, 0x18, + 0xff, 0xd1, 0xa2, 0x1d, 0xb1, 0x60, 0x97, 0x41, 0x97, 0xc5, 0x66, 0x24, 0x51, 0x2a, 0x30, 0xa9, + 0xe5, 0x46, 0x82, 0x71, 0x84, 0x4f, 0x5d, 0xb5, 0x2b, 0xa5, 0xae, 0xda, 0x7a, 0x89, 0xab, 0x76, + 0xf5, 0xd4, 0xab, 0x76, 0xee, 0xc4, 0xe3, 0x25, 0x4e, 0xfc, 0x01, 0xcc, 0xe5, 0x76, 0xfa, 0x9b, + 0xa0, 0x5b, 0xd4, 0x51, 0x45, 0xf7, 0x9c, 0x5b, 0xef, 0xc0, 0x8d, 0xc0, 0x9c, 0xec, 0xf7, 0x1a, + 0xfa, 0xfa, 0xe6, 0x2d, 0x2c, 0x84, 0x18, 0xbf, 0xd5, 0xe0, 0xdc, 0xc0, 0xcd, 0x18, 0x5d, 0x87, + 0x59, 0xdb, 0xe5, 0xd4, 0xdf, 0x27, 0x16, 0xdd, 0x4e, 0x52, 0xfc, 0x82, 0x3a, 0xd5, 0xec, 0x56, + 0x1a, 0x89, 0xb3, 0xb4, 0xe8, 0x22, 0xe8, 0x76, 0x37, 0xda, 0xae, 0xa5, 0xb6, 0xad, 0x1d, 0x86, + 0x05, 0x4c, 0xd4, 0xc3, 0x21, 0xf1, 0xdb, 0x0f, 0x89, 0x4f, 0xd7, 0xda, 0x6d, 0x71, 0xdf, 0x50, + 0x3e, 0x8d, 0xeb, 0xe1, 0xbb, 0x59, 0x34, 0xce, 0xd3, 0x1b, 0xbf, 0xd6, 0xe0, 0x62, 0x61, 0x27, + 0x29, 0xfd, 0x78, 0x42, 0x00, 0xba, 0xc4, 0x27, 0x1d, 0xca, 0xa9, 0xcf, 0x86, 0x4c, 0xd7, 0x12, + 0x6f, 0x12, 0xf1, 0xe0, 0xde, 0x89, 0x05, 0xe1, 0x94, 0x50, 0xe3, 0x93, 0x0a, 0xcc, 0x62, 0x15, + 0x8f, 0x70, 0x55, 0xfc, 0xdf, 0xaf, 0x0b, 0x77, 0x33, 0xeb, 0xc2, 0x73, 0x52, 0x23, 0x63, 0x5c, + 0xd1, 0xc2, 0x80, 0xee, 0x8b, 0x25, 0x9a, 0xf0, 0x80, 0x95, 0xbb, 0xf8, 0x64, 0x85, 0x4a, 0xc6, + 0x24, 0x08, 0xe1, 0x37, 0x56, 0x02, 0x8d, 0xbe, 0x06, 0xf5, 0x0c, 0xbd, 0xe8, 0xf4, 0x41, 0x87, + 0xfa, 0x98, 0xee, 0x53, 0x9f, 0xba, 0x16, 0x45, 0x57, 0x60, 0x8a, 0x74, 0xed, 0x1b, 0xbe, 0x17, + 0x74, 0x55, 0x44, 0xe3, 0x51, 0xbe, 0xb6, 0xb3, 0x25, 0xe1, 0x38, 0xa6, 0x10, 0xd4, 0x91, 0x45, + 0x2a, 0xaf, 0x52, 0xeb, 0x75, 0x08, 0xc7, 0x31, 0x45, 0xdc, 0xbe, 0xab, 0x85, 0xed, 0xdb, 0x04, + 0x3d, 0xb0, 0xdb, 0xea, 0x4e, 0xf0, 0x86, 0x22, 0xd0, 0xdf, 0xdf, 0xda, 0x78, 0xd6, 0x6b, 0x5c, + 0x2a, 0x7a, 0xf8, 0xe3, 0x27, 0x5d, 0xca, 0x9a, 0xef, 0x6f, 0x6d, 0x60, 0xc1, 0x6c, 0xfc, 0x49, + 0x83, 0x73, 0x99, 0x43, 0x9e, 0xc1, 0x4a, 0xb3, 0x93, 0x5d, 0x69, 0x5e, 0x1b, 0x21, 0x64, 0x05, + 0x4b, 0x8d, 0x9d, 0x3b, 0x84, 0xdc, 0x6a, 0xde, 0xcb, 0x3f, 0x86, 0x5d, 0x2e, 0x7d, 0x73, 0x28, + 0x7e, 0x01, 0x33, 0xfe, 0x5a, 0x81, 0xf3, 0x43, 0xb2, 0x08, 0x3d, 0x00, 0x48, 0x66, 0xcc, 0x10, + 0xa7, 0x0d, 0x51, 0x38, 0x70, 0xcf, 0x9d, 0x93, 0x4f, 0x54, 0x09, 0x34, 0x25, 0x11, 0x31, 0xa8, + 0xf9, 0x94, 0x51, 0xff, 0x98, 0xb6, 0xdf, 0xf5, 0x7c, 0xe5, 0xba, 0x6f, 0x8f, 0xe0, 0xba, 0x81, + 0xec, 0x4d, 0xee, 0x5e, 0x38, 0x11, 0x8c, 0xd3, 0x5a, 0xd0, 0x83, 0xc4, 0x85, 0xe1, 0xbb, 0xeb, + 0xb5, 0x52, 0x27, 0xca, 0x3e, 0x19, 0x9f, 0xe2, 0xcc, 0x7f, 0x68, 0x70, 0x21, 0x63, 0xe4, 0x7b, + 0xb4, 0xd3, 0x75, 0x08, 0xa7, 0x67, 0xd0, 0x8c, 0xee, 0x67, 0x9a, 0xd1, 0xdb, 0x23, 0x78, 0x32, + 0x32, 0xb2, 0xf0, 0x16, 0xf3, 0x77, 0x0d, 0x2e, 0x0e, 0xe5, 0x38, 0x83, 0xe2, 0xfa, 0x7e, 0xb6, + 0xb8, 0xae, 0x7d, 0x8e, 0x73, 0x15, 0xdf, 0x1c, 0x2e, 0x16, 0xfa, 0xe1, 0xff, 0x72, 0x7a, 0x18, + 0xbf, 0xd7, 0x60, 0x26, 0xa2, 0x14, 0xeb, 0x52, 0x89, 0x9d, 0x79, 0x15, 0x40, 0xfd, 0x59, 0x12, + 0xdd, 0xee, 0xf5, 0xc4, 0xee, 0x1b, 0x31, 0x06, 0xa7, 0xa8, 0xd0, 0x4d, 0x40, 0x91, 0x85, 0xbb, + 0x8e, 0x5c, 0x0a, 0xc4, 0xea, 0xa9, 0x4b, 0xde, 0x25, 0xc5, 0x8b, 0xf0, 0x00, 0x05, 0x1e, 0xc2, + 0x65, 0xfc, 0x59, 0x4b, 0xe6, 0xb6, 0x04, 0xbf, 0xa8, 0x9e, 0x97, 0xc6, 0x15, 0x7a, 0x3e, 0x3d, + 0x77, 0x24, 0xe5, 0x0b, 0x3b, 0x77, 0xa4, 0x75, 0x05, 0x25, 0xf1, 0x48, 0xcf, 0x9d, 0x42, 0x96, + 0x42, 0xd9, 0x2d, 0xef, 0x56, 0xea, 0x2f, 0xb2, 0xda, 0xea, 0xab, 0xe5, 0xcc, 0x11, 0x69, 0x3a, + 0x74, 0xc7, 0xbf, 0x02, 0x53, 0xae, 0xd7, 0x0e, 0xf7, 0xe1, 0xdc, 0x76, 0xb1, 0xad, 0xe0, 0x38, + 0xa6, 0x18, 0xf8, 0x23, 0xa7, 0xfa, 0xc5, 0xfc, 0x91, 0x23, 0x37, 0x22, 0xc7, 0x11, 0x04, 0xd1, + 0xf5, 0x21, 0xd9, 0x88, 0x14, 0x1c, 0xc7, 0x14, 0xe8, 0x4e, 0x32, 0x5f, 0x26, 0x64, 0x4c, 0xbe, + 0x56, 0x66, 0x44, 0x17, 0x0f, 0x14, 0xd3, 0x7c, 0xfc, 0xb4, 0x3e, 0xf6, 0xe4, 0x69, 0x7d, 0xec, + 0xd3, 0xa7, 0xf5, 0xb1, 0x8f, 0xfb, 0x75, 0xed, 0x71, 0xbf, 0xae, 0x3d, 0xe9, 0xd7, 0xb5, 0x4f, + 0xfb, 0x75, 0xed, 0xb3, 0x7e, 0x5d, 0xfb, 0xe5, 0xbf, 0xea, 0x63, 0x3f, 0x78, 0xf9, 0xb4, 0x7f, + 0x94, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xba, 0x87, 0x1a, 0xe0, 0x70, 0x1e, 0x00, 0x00, } func (m *AllocatedDeviceStatus) Marshal() (dAtA []byte, err error) { @@ -1178,16 +1179,18 @@ func (m *AllocatedDeviceStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - { - size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.Data != nil { + { + size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x2a } - i-- - dAtA[i] = 0x2a if len(m.Conditions) > 0 { for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { { @@ -2754,8 +2757,10 @@ func (m *AllocatedDeviceStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } - l = m.Data.Size() - n += 1 + l + sovGenerated(uint64(l)) + if m.Data != nil { + l = m.Data.Size() + n += 1 + l + sovGenerated(uint64(l)) + } if m.NetworkData != nil { l = m.NetworkData.Size() n += 1 + l + sovGenerated(uint64(l)) @@ -3339,7 +3344,7 @@ func (this *AllocatedDeviceStatus) String() string { `Pool:` + fmt.Sprintf("%v", this.Pool) + `,`, `Device:` + fmt.Sprintf("%v", this.Device) + `,`, `Conditions:` + repeatedStringForConditions + `,`, - `Data:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Data), "RawExtension", "runtime.RawExtension", 1), `&`, ``, 1) + `,`, + `Data:` + strings.Replace(fmt.Sprintf("%v", this.Data), "RawExtension", "runtime.RawExtension", 1) + `,`, `NetworkData:` + strings.Replace(this.NetworkData.String(), "NetworkDeviceData", "NetworkDeviceData", 1) + `,`, `}`, }, "") @@ -4004,6 +4009,9 @@ func (m *AllocatedDeviceStatus) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } + if m.Data == nil { + m.Data = &runtime.RawExtension{} + } if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } diff --git a/staging/src/k8s.io/api/resource/v1alpha3/generated.proto b/staging/src/k8s.io/api/resource/v1alpha3/generated.proto index fa19c8f4dfa..19ac86c7722 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/generated.proto +++ b/staging/src/k8s.io/api/resource/v1alpha3/generated.proto @@ -62,6 +62,8 @@ message AllocatedDeviceStatus { // If the device has been configured according to the class and claim // config references, the `Ready` condition should be True. // + // Must not contain more than 8 entries. + // // +optional // +listType=map // +listMapKey=type @@ -550,6 +552,8 @@ message NetworkDeviceData { // associated subnet mask. // e.g.: "192.0.2.5/24" for IPv4 and "2001:db8::5/64" for IPv6. // + // Must not contain more than 16 entries. + // // +optional // +listType=atomic repeated string ips = 2; diff --git a/staging/src/k8s.io/api/resource/v1alpha3/types.go b/staging/src/k8s.io/api/resource/v1alpha3/types.go index 76d33a4c01d..e6471d05851 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/types.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/types.go @@ -1004,6 +1004,24 @@ type ResourceClaimTemplateList struct { Items []ResourceClaimTemplate `json:"items" protobuf:"bytes,2,rep,name=items"` } +const ( + // AllocatedDeviceStatusMaxConditions represents the maximum number of + // conditions in a device status. + AllocatedDeviceStatusMaxConditions int = 8 + // AllocatedDeviceStatusDataMaxLength represents the maximum length of the + // raw data in the Data field in a device status. + AllocatedDeviceStatusDataMaxLength int = 10 * 1024 + // NetworkDeviceDataMaxIPs represents the maximum number of IPs in the networkData + // field in a device status. + NetworkDeviceDataMaxIPs int = 16 + // NetworkDeviceDataInterfaceNameMaxLength represents the maximum number of characters + // for the networkData.interfaceName field in a device status. + NetworkDeviceDataInterfaceNameMaxLength int = 256 + // NetworkDeviceDataHardwareAddressMaxLength represents the maximum number of characters + // for the networkData.hardwareAddress field in a device status. + NetworkDeviceDataHardwareAddressMaxLength int = 128 +) + // AllocatedDeviceStatus contains the status of an allocated device, if the // driver chooses to report it. This may include driver-specific information. type AllocatedDeviceStatus struct { @@ -1036,6 +1054,8 @@ type AllocatedDeviceStatus struct { // If the device has been configured according to the class and claim // config references, the `Ready` condition should be True. // + // Must not contain more than 8 entries. + // // +optional // +listType=map // +listMapKey=type @@ -1046,7 +1066,7 @@ type AllocatedDeviceStatus struct { // The length of the raw data must be smaller or equal to 10 Ki. // // +optional - Data runtime.RawExtension `json:"data,omitempty" protobuf:"bytes,5,opt,name=data"` + Data *runtime.RawExtension `json:"data,omitempty" protobuf:"bytes,5,opt,name=data"` // NetworkData contains network-related information specific to the device. // @@ -1073,6 +1093,8 @@ type NetworkDeviceData struct { // associated subnet mask. // e.g.: "192.0.2.5/24" for IPv4 and "2001:db8::5/64" for IPv6. // + // Must not contain more than 16 entries. + // // +optional // +listType=atomic IPs []string `json:"ips,omitempty" protobuf:"bytes,2,opt,name=ips"` diff --git a/staging/src/k8s.io/api/resource/v1alpha3/types_swagger_doc_generated.go b/staging/src/k8s.io/api/resource/v1alpha3/types_swagger_doc_generated.go index dc70e1d284f..ecc83f15662 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/types_swagger_doc_generated.go @@ -32,7 +32,7 @@ var map_AllocatedDeviceStatus = map[string]string{ "driver": "Driver specifies the name of the DRA driver whose kubelet plugin should be invoked to process the allocation once the claim is needed on a node.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.", "pool": "This name together with the driver name and the device name field identify which device was allocated (`//`).\n\nMust not be longer than 253 characters and may contain one or more DNS sub-domains separated by slashes.", "device": "Device references one device instance via its name in the driver's resource pool. It must be a DNS label.", - "conditions": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + "conditions": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.\n\nMust not contain more than 8 entries.", "data": "Data contains arbitrary driver-specific data.\n\nThe length of the raw data must be smaller or equal to 10 Ki.", "networkData": "NetworkData contains network-related information specific to the device.", } @@ -228,7 +228,7 @@ func (DeviceSelector) SwaggerDoc() map[string]string { var map_NetworkDeviceData = map[string]string{ "": "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", "interfaceName": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface being configured in the pod.\n\nMust not be longer than 256 characters.", - "ips": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + "ips": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.\n\nMust not contain more than 16 entries.", "hardwareAddress": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.\n\nMust not be longer than 128 characters.", } diff --git a/staging/src/k8s.io/api/resource/v1alpha3/zz_generated.deepcopy.go b/staging/src/k8s.io/api/resource/v1alpha3/zz_generated.deepcopy.go index 07ba47b59bd..9b26b79efe6 100644 --- a/staging/src/k8s.io/api/resource/v1alpha3/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/resource/v1alpha3/zz_generated.deepcopy.go @@ -38,7 +38,11 @@ func (in *AllocatedDeviceStatus) DeepCopyInto(out *AllocatedDeviceStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } - in.Data.DeepCopyInto(&out.Data) + if in.Data != nil { + in, out := &in.Data, &out.Data + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) + } if in.NetworkData != nil { in, out := &in.NetworkData, &out.NetworkData *out = new(NetworkDeviceData) diff --git a/staging/src/k8s.io/api/resource/v1beta1/generated.pb.go b/staging/src/k8s.io/api/resource/v1beta1/generated.pb.go index df4e68f306b..4812f9ecf44 100644 --- a/staging/src/k8s.io/api/resource/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/api/resource/v1beta1/generated.pb.go @@ -28,6 +28,7 @@ import ( github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" v11 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" math "math" math_bits "math/bits" @@ -1047,132 +1048,132 @@ var fileDescriptor_ba331e3ec6484c27 = []byte{ // 2051 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x19, 0x4b, 0x8f, 0x1b, 0x49, 0x79, 0xda, 0xed, 0x79, 0x7d, 0x9e, 0x57, 0x2a, 0x64, 0x71, 0x26, 0xc2, 0x9e, 0x74, 0x24, 0xf0, - 0x66, 0xb3, 0xed, 0x8d, 0x81, 0x28, 0xca, 0x5e, 0x70, 0xcf, 0xcc, 0x06, 0x43, 0x32, 0x99, 0xad, - 0x61, 0x43, 0xb4, 0x6c, 0x10, 0x35, 0xed, 0x9a, 0x99, 0x66, 0xec, 0x6e, 0xa7, 0xbb, 0x7a, 0xb2, - 0x73, 0x40, 0xa0, 0x3d, 0xaf, 0x10, 0x77, 0xc4, 0x85, 0x03, 0x12, 0x12, 0x42, 0xfc, 0x02, 0x90, - 0x40, 0x88, 0x88, 0x03, 0xac, 0xe0, 0xb2, 0xe2, 0x60, 0x88, 0xf7, 0x07, 0x70, 0xcf, 0x09, 0x55, - 0x75, 0xf5, 0xd3, 0x6e, 0xd3, 0x83, 0x96, 0x51, 0xf6, 0xe6, 0xfe, 0xde, 0xf5, 0xbd, 0xab, 0x0c, - 0xaf, 0x1d, 0xdf, 0xf6, 0x74, 0xcb, 0x69, 0x92, 0x81, 0xd5, 0x74, 0xa9, 0xe7, 0xf8, 0xae, 0x49, - 0x9b, 0x27, 0x37, 0xf7, 0x29, 0x23, 0x37, 0x9b, 0x87, 0xd4, 0xa6, 0x2e, 0x61, 0xb4, 0xab, 0x0f, - 0x5c, 0x87, 0x39, 0xe8, 0x4a, 0x40, 0xac, 0x93, 0x81, 0xa5, 0x87, 0xc4, 0xba, 0x24, 0x5e, 0x7f, - 0xfd, 0xd0, 0x62, 0x47, 0xfe, 0xbe, 0x6e, 0x3a, 0xfd, 0xe6, 0xa1, 0x73, 0xe8, 0x34, 0x05, 0xcf, - 0xbe, 0x7f, 0x20, 0xbe, 0xc4, 0x87, 0xf8, 0x15, 0xc8, 0x5a, 0xd7, 0x12, 0x8a, 0x4d, 0xc7, 0xe5, - 0x4a, 0xb3, 0xfa, 0xd6, 0xbf, 0x12, 0xd3, 0xf4, 0x89, 0x79, 0x64, 0xd9, 0xd4, 0x3d, 0x6d, 0x0e, - 0x8e, 0x0f, 0xd3, 0xd6, 0x9e, 0x85, 0xcb, 0x6b, 0xf6, 0x29, 0x23, 0x93, 0x74, 0x35, 0xf3, 0xb8, - 0x5c, 0xdf, 0x66, 0x56, 0x7f, 0x5c, 0xcd, 0xad, 0xff, 0xc6, 0xe0, 0x99, 0x47, 0xb4, 0x4f, 0xb2, - 0x7c, 0xda, 0xcf, 0x55, 0xb8, 0xd4, 0xee, 0xf5, 0x1c, 0x93, 0xc3, 0xb6, 0xe8, 0x89, 0x65, 0xd2, - 0x3d, 0x46, 0x98, 0xef, 0xa1, 0x2f, 0xc2, 0x5c, 0xd7, 0xb5, 0x4e, 0xa8, 0x5b, 0x55, 0x36, 0x94, - 0xc6, 0xa2, 0xb1, 0xf2, 0x6c, 0x58, 0x9f, 0x19, 0x0d, 0xeb, 0x73, 0x5b, 0x02, 0x8a, 0x25, 0x16, - 0x6d, 0x40, 0x79, 0xe0, 0x38, 0xbd, 0x6a, 0x49, 0x50, 0x2d, 0x49, 0xaa, 0xf2, 0xae, 0xe3, 0xf4, - 0xb0, 0xc0, 0x08, 0x49, 0x42, 0x72, 0x55, 0xcd, 0x48, 0x12, 0x50, 0x2c, 0xb1, 0xc8, 0x04, 0x30, - 0x1d, 0xbb, 0x6b, 0x31, 0xcb, 0xb1, 0xbd, 0x6a, 0x79, 0x43, 0x6d, 0x54, 0x5a, 0x4d, 0x3d, 0x8e, - 0x72, 0x74, 0x30, 0x7d, 0x70, 0x7c, 0xc8, 0x01, 0x9e, 0xce, 0xfd, 0xa7, 0x9f, 0xdc, 0xd4, 0x37, - 0x43, 0x3e, 0x03, 0x49, 0xe1, 0x10, 0x81, 0x3c, 0x9c, 0x10, 0x8b, 0x1e, 0x40, 0xb9, 0x4b, 0x18, - 0xa9, 0xce, 0x6e, 0x28, 0x8d, 0x4a, 0xeb, 0xf5, 0x5c, 0xf1, 0xd2, 0x6f, 0x3a, 0x26, 0x4f, 0xb7, - 0xdf, 0x67, 0xd4, 0xf6, 0xb8, 0xf0, 0xe8, 0x74, 0x5b, 0x84, 0x11, 0x2c, 0x04, 0x21, 0x02, 0x15, - 0x9b, 0xb2, 0xa7, 0x8e, 0x7b, 0xcc, 0x81, 0xd5, 0x39, 0x21, 0x57, 0xd7, 0xa7, 0x24, 0xa7, 0xbe, - 0x23, 0xe9, 0xc5, 0xb1, 0x39, 0x97, 0xb1, 0x3a, 0x1a, 0xd6, 0x2b, 0x3b, 0xb1, 0x18, 0x9c, 0x94, - 0xa9, 0xfd, 0x59, 0x81, 0x35, 0x19, 0x24, 0xcb, 0xb1, 0x31, 0xf5, 0xfc, 0x1e, 0x43, 0xdf, 0x85, - 0xf9, 0xc0, 0x6f, 0x9e, 0x08, 0x50, 0xa5, 0xf5, 0xe5, 0xa9, 0x3a, 0x03, 0x65, 0x59, 0x29, 0xc6, - 0xaa, 0x3c, 0xd1, 0x7c, 0x80, 0xf7, 0x70, 0x28, 0x14, 0x3d, 0x84, 0x25, 0xdb, 0xe9, 0xd2, 0x3d, - 0xda, 0xa3, 0x26, 0x73, 0x5c, 0x11, 0xbb, 0x4a, 0x6b, 0x23, 0xa9, 0x84, 0x57, 0x0a, 0xf7, 0xfe, - 0x4e, 0x82, 0xce, 0x58, 0x1b, 0x0d, 0xeb, 0x4b, 0x49, 0x08, 0x4e, 0xc9, 0xd1, 0xfe, 0xa1, 0x42, - 0xc5, 0x20, 0x9e, 0x65, 0x06, 0x1a, 0xd1, 0x0f, 0x00, 0x08, 0x63, 0xae, 0xb5, 0xef, 0x33, 0x71, - 0x14, 0x1e, 0xf5, 0xdb, 0x53, 0x8f, 0x92, 0xe0, 0xd6, 0xdb, 0x11, 0xeb, 0xb6, 0xcd, 0xdc, 0x53, - 0xe3, 0x5a, 0x18, 0xfe, 0x18, 0xf1, 0xc1, 0x3f, 0xeb, 0xcb, 0x6f, 0xfb, 0xa4, 0x67, 0x1d, 0x58, - 0xb4, 0xbb, 0x43, 0xfa, 0x14, 0x27, 0x14, 0x22, 0x1f, 0x16, 0x4c, 0x32, 0x20, 0xa6, 0xc5, 0x4e, - 0xab, 0x25, 0xa1, 0xfc, 0x56, 0x61, 0xe5, 0x9b, 0x92, 0x31, 0x50, 0x7d, 0x55, 0xaa, 0x5e, 0x08, - 0xc1, 0xe3, 0x8a, 0x23, 0x55, 0xeb, 0xc7, 0xb0, 0x9a, 0x31, 0x1d, 0xad, 0x81, 0x7a, 0x4c, 0x4f, - 0x83, 0x6a, 0xc3, 0xfc, 0x27, 0x32, 0x60, 0xf6, 0x84, 0xf4, 0x7c, 0x2a, 0x6a, 0xab, 0xd2, 0xba, - 0x51, 0x24, 0xc0, 0xa1, 0x50, 0x1c, 0xb0, 0xde, 0x29, 0xdd, 0x56, 0xd6, 0x8f, 0x60, 0x39, 0x65, - 0xea, 0x04, 0x55, 0xed, 0xb4, 0xaa, 0xd7, 0x0a, 0xa8, 0x0a, 0x45, 0x26, 0x34, 0x69, 0x77, 0xe1, - 0xc2, 0xe6, 0xf6, 0x3d, 0xd9, 0x47, 0x64, 0xc4, 0x51, 0x0b, 0x80, 0xbe, 0x3f, 0x70, 0xa9, 0xc7, - 0x6b, 0x48, 0x76, 0x93, 0xa8, 0x4c, 0xb7, 0x23, 0x0c, 0x4e, 0x50, 0x69, 0x3e, 0xc8, 0xee, 0xc0, - 0xfb, 0x8b, 0x4d, 0xfa, 0x54, 0xf2, 0x45, 0x15, 0x28, 0xfc, 0x29, 0x30, 0xa8, 0x03, 0xb3, 0xfb, - 0x3c, 0x2a, 0xd2, 0xf6, 0x46, 0xd1, 0xf8, 0x19, 0x8b, 0xa3, 0x61, 0x7d, 0x56, 0x00, 0x70, 0x20, - 0x41, 0xfb, 0xb0, 0x04, 0x5f, 0xc8, 0x56, 0xca, 0xa6, 0x63, 0x1f, 0x58, 0x87, 0xbe, 0x2b, 0x3e, - 0xd0, 0xd7, 0x60, 0x2e, 0x90, 0x28, 0x0d, 0x6a, 0x84, 0xcd, 0x6c, 0x4f, 0x40, 0x5f, 0x0c, 0xeb, - 0xaf, 0x64, 0x59, 0x03, 0x0c, 0x96, 0x7c, 0xa8, 0x01, 0x0b, 0x2e, 0x7d, 0xe2, 0x53, 0x8f, 0x79, - 0x22, 0xe3, 0x16, 0x8d, 0x25, 0x9e, 0x35, 0x58, 0xc2, 0x70, 0x84, 0x45, 0x3f, 0x84, 0x8b, 0x41, - 0x35, 0xa6, 0x4c, 0x90, 0x95, 0xf8, 0x46, 0x91, 0x10, 0x25, 0xf9, 0x8c, 0x2b, 0xd2, 0xd4, 0x8b, - 0x13, 0x90, 0x78, 0x92, 0x26, 0xed, 0x13, 0x05, 0x5e, 0x99, 0xdc, 0x38, 0x10, 0x85, 0x79, 0x57, - 0xfc, 0x0a, 0x6b, 0xf6, 0x4e, 0x01, 0x7b, 0xe4, 0x19, 0xf3, 0xbb, 0x50, 0xf0, 0xed, 0xe1, 0x50, - 0x36, 0xda, 0x87, 0x39, 0x53, 0x98, 0x24, 0x8b, 0xf3, 0xce, 0x99, 0x9a, 0x5c, 0xfa, 0xfc, 0xd1, - 0xdc, 0x09, 0xc0, 0x58, 0x4a, 0xd6, 0x7e, 0xa9, 0xc0, 0x6a, 0xa6, 0x7a, 0x50, 0x0d, 0x54, 0xcb, - 0x66, 0x22, 0xa3, 0xd4, 0x20, 0x3e, 0x1d, 0x9b, 0x3d, 0xe4, 0x79, 0x8e, 0x39, 0x02, 0x5d, 0x85, - 0xf2, 0x3e, 0x9f, 0x7a, 0x3c, 0x16, 0x0b, 0xc6, 0xf2, 0x68, 0x58, 0x5f, 0x34, 0x1c, 0xa7, 0x17, - 0x50, 0x08, 0x14, 0xfa, 0x12, 0xcc, 0x79, 0xcc, 0xb5, 0xec, 0xc3, 0x6a, 0x59, 0x64, 0x8a, 0xe8, - 0xf1, 0x7b, 0x02, 0x12, 0x90, 0x49, 0x34, 0xba, 0x0e, 0xf3, 0x27, 0xd4, 0x15, 0xc5, 0x31, 0x2b, - 0x28, 0x45, 0x0b, 0x7d, 0x18, 0x80, 0x02, 0xd2, 0x90, 0x40, 0xa3, 0xb0, 0x92, 0xae, 0x3e, 0xb4, - 0x17, 0x56, 0xae, 0x32, 0x36, 0x79, 0xc6, 0x06, 0x66, 0xec, 0xb1, 0xb7, 0x7d, 0x62, 0x33, 0x8b, - 0x9d, 0x1a, 0xcb, 0xd2, 0x29, 0xb3, 0x81, 0xa2, 0x40, 0x96, 0xf6, 0xab, 0x12, 0x54, 0xa4, 0x9e, - 0x1e, 0xb1, 0xfa, 0xe8, 0x51, 0x22, 0x67, 0x83, 0x70, 0x5f, 0x2f, 0x1e, 0x6e, 0x63, 0x2d, 0xec, - 0x8c, 0x13, 0x72, 0xbc, 0x0b, 0x15, 0xd3, 0xb1, 0x3d, 0xe6, 0x12, 0xcb, 0x96, 0x05, 0x91, 0x1e, - 0xcb, 0x53, 0x72, 0x5b, 0x72, 0x19, 0x17, 0xa5, 0xfc, 0x4a, 0x0c, 0xf3, 0x70, 0x52, 0x2c, 0x7a, - 0x1c, 0xa5, 0x91, 0x2a, 0x14, 0x7c, 0xb5, 0x88, 0x02, 0x7e, 0xf2, 0x62, 0x19, 0xf4, 0x47, 0x05, - 0xaa, 0x79, 0x4c, 0xa9, 0x7a, 0x57, 0xfe, 0x97, 0x7a, 0x2f, 0x9d, 0x5b, 0xbd, 0xff, 0x4e, 0x49, - 0x84, 0xdd, 0xf3, 0xd0, 0xf7, 0x60, 0x81, 0x6f, 0x58, 0x62, 0x61, 0x52, 0xc6, 0xac, 0x98, 0xb2, - 0x8f, 0x3d, 0xd8, 0xff, 0x3e, 0x35, 0xd9, 0x7d, 0xca, 0x48, 0xdc, 0xe9, 0x63, 0x18, 0x8e, 0xa4, - 0xa2, 0x1d, 0x28, 0x7b, 0x03, 0x6a, 0x9e, 0x61, 0xc2, 0x09, 0xcb, 0xf6, 0x06, 0xd4, 0x8c, 0x67, - 0x01, 0xff, 0xc2, 0x42, 0x8e, 0xf6, 0xd3, 0x64, 0x24, 0x3c, 0x2f, 0x1d, 0x89, 0x1c, 0xff, 0x2a, - 0xe7, 0xe6, 0xdf, 0xdf, 0x46, 0x9d, 0x46, 0x58, 0x77, 0xcf, 0xf2, 0x18, 0x7a, 0x6f, 0xcc, 0xc7, - 0x7a, 0x31, 0x1f, 0x73, 0x6e, 0xe1, 0xe1, 0xa8, 0xbc, 0x42, 0x48, 0xc2, 0xbf, 0xf7, 0x61, 0xd6, - 0x62, 0xb4, 0x1f, 0x16, 0x56, 0xa3, 0xa8, 0x83, 0xe3, 0xbe, 0xd0, 0xe1, 0xec, 0x38, 0x90, 0xa2, - 0xfd, 0x25, 0x7d, 0x00, 0xee, 0x78, 0xf4, 0x1e, 0x2c, 0x7a, 0x72, 0xd4, 0x87, 0xcd, 0xa1, 0xc8, - 0xfa, 0x10, 0x2d, 0x8c, 0x17, 0xa4, 0xa6, 0xc5, 0x10, 0xe2, 0xe1, 0x58, 0x60, 0xa2, 0x72, 0x4b, - 0x67, 0xa9, 0xdc, 0x4c, 0xe8, 0x73, 0x2b, 0xf7, 0x09, 0x4c, 0x8a, 0x1e, 0x7a, 0x17, 0xe6, 0x9c, - 0x01, 0x79, 0x12, 0x75, 0xd5, 0xe9, 0x3b, 0xe1, 0x03, 0x41, 0x3a, 0x29, 0x45, 0x80, 0xab, 0x0c, - 0xd0, 0x58, 0x4a, 0xd4, 0x7e, 0xac, 0xc0, 0x5a, 0xb6, 0x85, 0x9d, 0xa1, 0x49, 0xec, 0xc2, 0x4a, - 0x9f, 0x30, 0xf3, 0x28, 0x9a, 0x55, 0xf2, 0xe6, 0xd5, 0x18, 0x0d, 0xeb, 0x2b, 0xf7, 0x53, 0x98, - 0x17, 0xc3, 0x3a, 0x7a, 0xcb, 0xef, 0xf5, 0x4e, 0xd3, 0x5b, 0x68, 0x86, 0x5f, 0xfb, 0x40, 0x85, - 0xe5, 0x54, 0xc3, 0x2e, 0xb0, 0x73, 0xb5, 0x61, 0xb5, 0x1b, 0xfb, 0x9a, 0x23, 0xa4, 0x19, 0x9f, - 0x97, 0xc4, 0xc9, 0x34, 0x11, 0x7c, 0x59, 0xfa, 0x74, 0xde, 0xa8, 0x9f, 0x76, 0xde, 0x3c, 0x84, - 0x15, 0x12, 0xed, 0x01, 0xf7, 0x9d, 0x2e, 0x95, 0x53, 0x58, 0x97, 0x5c, 0x2b, 0xed, 0x14, 0xf6, - 0xc5, 0xb0, 0xfe, 0xb9, 0xec, 0xf6, 0xc0, 0xe1, 0x38, 0x23, 0x05, 0x5d, 0x83, 0x59, 0xd3, 0xf1, - 0x6d, 0x26, 0x46, 0xb5, 0x1a, 0x97, 0xc9, 0x26, 0x07, 0xe2, 0x00, 0x87, 0x6e, 0x42, 0x85, 0x74, - 0xfb, 0x96, 0xdd, 0x36, 0x4d, 0xea, 0x79, 0xe2, 0x4e, 0xb8, 0x10, 0xcc, 0xff, 0x76, 0x0c, 0xc6, - 0x49, 0x1a, 0xed, 0xdf, 0x4a, 0xb8, 0x79, 0xe6, 0x2c, 0x49, 0xe8, 0x55, 0xbe, 0x71, 0x09, 0x94, - 0x8c, 0x4b, 0x62, 0x6b, 0x12, 0x60, 0x1c, 0xe2, 0x13, 0x77, 0xf7, 0x52, 0xa1, 0xbb, 0xbb, 0x5a, - 0xe0, 0xee, 0x5e, 0x9e, 0x7a, 0x77, 0xcf, 0x9c, 0x78, 0xb6, 0xc0, 0x89, 0xbf, 0x13, 0xae, 0x32, - 0xd1, 0x45, 0xa1, 0x03, 0xaa, 0x49, 0x7b, 0x13, 0xba, 0xe0, 0x78, 0x2e, 0x8c, 0xdd, 0x32, 0x8c, - 0xf9, 0xd1, 0xb0, 0xae, 0x6e, 0x6e, 0xdf, 0xc3, 0x5c, 0x86, 0xf6, 0x6b, 0x05, 0x2e, 0x8c, 0x5d, - 0xb3, 0xd1, 0x9b, 0xb0, 0x6c, 0xd9, 0x8c, 0xba, 0x07, 0xc4, 0xa4, 0x3b, 0x71, 0x82, 0x5f, 0x92, - 0x87, 0x5a, 0xee, 0x24, 0x91, 0x38, 0x4d, 0x8b, 0x2e, 0x83, 0x6a, 0x0d, 0xc2, 0x95, 0x5d, 0x68, - 0xeb, 0xec, 0x7a, 0x98, 0xc3, 0x78, 0x35, 0x1c, 0x11, 0xb7, 0xfb, 0x94, 0xb8, 0xb4, 0xdd, 0xed, - 0xf2, 0x3b, 0x8c, 0x74, 0x69, 0x54, 0x0d, 0x5f, 0x4f, 0xa3, 0x71, 0x96, 0x5e, 0xfb, 0x85, 0x02, - 0x97, 0x73, 0xfb, 0x48, 0xe1, 0xc7, 0x18, 0x02, 0x30, 0x20, 0x2e, 0xe9, 0x53, 0x46, 0x5d, 0x4f, - 0x0e, 0xd5, 0x33, 0xbe, 0x71, 0x44, 0xf3, 0x7a, 0x37, 0x12, 0x84, 0x13, 0x42, 0xb5, 0x9f, 0x95, - 0x60, 0x19, 0xcb, 0x70, 0x04, 0xcb, 0xe1, 0xff, 0x7f, 0x4b, 0xd8, 0x4d, 0x6d, 0x09, 0xd3, 0x33, - 0x23, 0x65, 0x5b, 0xde, 0x9e, 0x80, 0x1e, 0xf1, 0xe5, 0x9c, 0x30, 0xdf, 0x2b, 0x74, 0x9b, 0x4a, - 0xcb, 0x14, 0x7c, 0x71, 0x08, 0x82, 0x6f, 0x2c, 0xe5, 0x69, 0x23, 0x05, 0x6a, 0x29, 0x7a, 0xde, - 0xe5, 0xfd, 0x3e, 0x75, 0x31, 0x3d, 0xa0, 0x2e, 0xb5, 0x4d, 0x8a, 0x6e, 0xc0, 0x02, 0x19, 0x58, - 0x77, 0x5d, 0xc7, 0x1f, 0xc8, 0x78, 0x46, 0x23, 0xbc, 0xbd, 0xdb, 0x11, 0x70, 0x1c, 0x51, 0x70, - 0xea, 0xd0, 0x20, 0x99, 0x55, 0x89, 0x7d, 0x3a, 0x80, 0xe3, 0x88, 0x22, 0x6a, 0xdd, 0xe5, 0xdc, - 0xd6, 0x6d, 0x80, 0xea, 0x5b, 0x5d, 0x79, 0xd5, 0x78, 0x43, 0x12, 0xa8, 0xef, 0x74, 0xb6, 0x5e, - 0x0c, 0xeb, 0x57, 0xf3, 0x9e, 0x11, 0xd9, 0xe9, 0x80, 0x7a, 0xfa, 0x3b, 0x9d, 0x2d, 0xcc, 0x99, - 0xb5, 0xdf, 0x2b, 0x70, 0x21, 0x75, 0xc8, 0x73, 0x58, 0x65, 0x1e, 0xa4, 0x57, 0x99, 0xeb, 0xc5, - 0x23, 0x96, 0xb3, 0xcc, 0x1c, 0x65, 0xce, 0x20, 0xb6, 0x99, 0xbd, 0xec, 0xb3, 0x5a, 0xa3, 0xe8, - 0x55, 0x21, 0xff, 0x2d, 0x4d, 0xfb, 0x53, 0x09, 0x2e, 0x4e, 0xc8, 0x21, 0xf4, 0x18, 0x20, 0x1e, - 0x2f, 0x52, 0xdf, 0xf4, 0xbb, 0xcf, 0xd8, 0xd5, 0x79, 0x45, 0x3c, 0x76, 0xc5, 0xd0, 0x84, 0x40, - 0xe4, 0x42, 0xc5, 0xa5, 0x1e, 0x75, 0x4f, 0x68, 0xf7, 0x2d, 0xc7, 0x95, 0x7e, 0x7b, 0xb3, 0xb8, - 0xdf, 0xc6, 0x32, 0x37, 0xbe, 0x69, 0xe1, 0x58, 0x2e, 0x4e, 0x2a, 0x41, 0x8f, 0x63, 0xff, 0x05, - 0x2f, 0xb8, 0xad, 0x22, 0xe7, 0x49, 0xbf, 0x3d, 0x4f, 0xf1, 0xe4, 0xdf, 0x15, 0xb8, 0x94, 0xb2, - 0xf1, 0x5b, 0xb4, 0x3f, 0xe8, 0x11, 0x46, 0xcf, 0xa1, 0x0b, 0x3d, 0x4a, 0x75, 0xa1, 0x5b, 0xc5, - 0xfd, 0x18, 0xda, 0x98, 0x7b, 0x6b, 0xf9, 0x9b, 0x02, 0x97, 0x27, 0x72, 0x9c, 0x43, 0x59, 0x7d, - 0x3b, 0x5d, 0x56, 0xad, 0xb3, 0x1f, 0x2b, 0xa7, 0xbc, 0xfe, 0x9a, 0x77, 0x28, 0x51, 0x67, 0x9f, - 0xc1, 0xa1, 0xa1, 0xfd, 0x46, 0x81, 0xa5, 0x90, 0x92, 0xef, 0x48, 0x05, 0xf6, 0xe4, 0x16, 0x80, - 0xfc, 0xcb, 0x25, 0xbc, 0xc9, 0xab, 0xb1, 0xd9, 0x77, 0x23, 0x0c, 0x4e, 0x50, 0xa1, 0x6f, 0x00, - 0x0a, 0x0d, 0xdc, 0xeb, 0x89, 0x55, 0x80, 0xef, 0x9b, 0xaa, 0xe0, 0x5d, 0x97, 0xbc, 0x08, 0x8f, - 0x51, 0xe0, 0x09, 0x5c, 0xda, 0x1f, 0x94, 0x78, 0x5a, 0x0b, 0xf0, 0x4b, 0xea, 0x78, 0x61, 0x5b, - 0xae, 0xe3, 0x93, 0xe3, 0x46, 0x50, 0xbe, 0xac, 0xe3, 0x46, 0x18, 0x97, 0x53, 0x0f, 0x1f, 0xaa, - 0x99, 0x43, 0x88, 0x3a, 0x28, 0xba, 0xd9, 0x7d, 0x33, 0xf1, 0x37, 0x5b, 0xa5, 0xf5, 0x6a, 0x21, - 0x6b, 0x78, 0x8e, 0x4e, 0xdc, 0xea, 0x6f, 0xc0, 0x82, 0xed, 0x74, 0x83, 0x15, 0x38, 0xb3, 0x52, - 0xec, 0x48, 0x38, 0x8e, 0x28, 0xc6, 0xfe, 0x09, 0x2a, 0x7f, 0x3a, 0xff, 0x04, 0x89, 0x35, 0xa8, - 0xd7, 0xe3, 0x04, 0xe1, 0x85, 0x21, 0x5e, 0x83, 0x24, 0x1c, 0x47, 0x14, 0x68, 0x27, 0x1e, 0x2c, - 0x73, 0x22, 0x22, 0xd7, 0x0a, 0x0c, 0xe6, 0xfc, 0x49, 0x62, 0xb4, 0x9f, 0x3d, 0xaf, 0xcd, 0x7c, - 0xf4, 0xbc, 0x36, 0xf3, 0xf1, 0xf3, 0xda, 0xcc, 0x8f, 0x46, 0x35, 0xe5, 0xd9, 0xa8, 0xa6, 0x7c, - 0x34, 0xaa, 0x29, 0x1f, 0x8f, 0x6a, 0xca, 0xbf, 0x46, 0x35, 0xe5, 0x27, 0x9f, 0xd4, 0x66, 0xde, - 0xbd, 0x32, 0xe5, 0x1f, 0xe9, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x26, 0xe2, 0x5c, 0xf8, 0xaf, + 0x66, 0xb3, 0xed, 0x8d, 0x81, 0x28, 0xca, 0x5e, 0x70, 0xcf, 0xcc, 0x06, 0xb3, 0xc9, 0x64, 0xb6, + 0x86, 0x0d, 0xd1, 0xb2, 0x41, 0xd4, 0xb4, 0x6b, 0x66, 0x9a, 0xb1, 0xbb, 0x9d, 0xee, 0xea, 0xc9, + 0xce, 0x01, 0x81, 0xf6, 0xbc, 0x42, 0xdc, 0x11, 0x1c, 0x91, 0x90, 0x10, 0xe2, 0x17, 0x80, 0x04, + 0x42, 0x44, 0x1c, 0x60, 0x05, 0x97, 0x15, 0x07, 0x43, 0xbc, 0x3f, 0x80, 0x7b, 0x4e, 0xa8, 0xaa, + 0xab, 0x9f, 0x76, 0x9b, 0x1e, 0xb4, 0x8c, 0xc2, 0xcd, 0xfd, 0xbd, 0xeb, 0x7b, 0x57, 0x19, 0x5e, + 0x3b, 0xbe, 0xed, 0xe9, 0x96, 0xd3, 0x24, 0x03, 0xab, 0xe9, 0x52, 0xcf, 0xf1, 0x5d, 0x93, 0x36, + 0x4f, 0x6e, 0xee, 0x53, 0x46, 0x6e, 0x36, 0x0f, 0xa9, 0x4d, 0x5d, 0xc2, 0x68, 0x57, 0x1f, 0xb8, + 0x0e, 0x73, 0xd0, 0x95, 0x80, 0x58, 0x27, 0x03, 0x4b, 0x0f, 0x89, 0x75, 0x49, 0xbc, 0xfe, 0xfa, + 0xa1, 0xc5, 0x8e, 0xfc, 0x7d, 0xdd, 0x74, 0xfa, 0xcd, 0x43, 0xe7, 0xd0, 0x69, 0x0a, 0x9e, 0x7d, + 0xff, 0x40, 0x7c, 0x89, 0x0f, 0xf1, 0x2b, 0x90, 0xb5, 0xae, 0x25, 0x14, 0x9b, 0x8e, 0xcb, 0x95, + 0x66, 0xf5, 0xad, 0x7f, 0x25, 0xa6, 0xe9, 0x13, 0xf3, 0xc8, 0xb2, 0xa9, 0x7b, 0xda, 0x1c, 0x1c, + 0x1f, 0xa6, 0xad, 0x3d, 0x0b, 0x97, 0xd7, 0xec, 0x53, 0x46, 0x26, 0xe9, 0x6a, 0xe6, 0x71, 0xb9, + 0xbe, 0xcd, 0xac, 0xfe, 0xb8, 0x9a, 0x5b, 0xff, 0x89, 0xc1, 0x33, 0x8f, 0x68, 0x9f, 0x64, 0xf9, + 0xb4, 0x9f, 0xa9, 0x70, 0xa9, 0xdd, 0xeb, 0x39, 0x26, 0x87, 0x6d, 0xd1, 0x13, 0xcb, 0xa4, 0x7b, + 0x8c, 0x30, 0xdf, 0x43, 0x5f, 0x84, 0xb9, 0xae, 0x6b, 0x9d, 0x50, 0xb7, 0xaa, 0x6c, 0x28, 0x8d, + 0x45, 0x63, 0xe5, 0xd9, 0xb0, 0x3e, 0x33, 0x1a, 0xd6, 0xe7, 0xb6, 0x04, 0x14, 0x4b, 0x2c, 0xda, + 0x80, 0xf2, 0xc0, 0x71, 0x7a, 0xd5, 0x92, 0xa0, 0x5a, 0x92, 0x54, 0xe5, 0x5d, 0xc7, 0xe9, 0x61, + 0x81, 0x11, 0x92, 0x84, 0xe4, 0xaa, 0x9a, 0x91, 0x24, 0xa0, 0x58, 0x62, 0x91, 0x09, 0x60, 0x3a, + 0x76, 0xd7, 0x62, 0x96, 0x63, 0x7b, 0xd5, 0xf2, 0x86, 0xda, 0xa8, 0xb4, 0x9a, 0x7a, 0x1c, 0xe5, + 0xe8, 0x60, 0xfa, 0xe0, 0xf8, 0x90, 0x03, 0x3c, 0x9d, 0xfb, 0x4f, 0x3f, 0xb9, 0xa9, 0x6f, 0x86, + 0x7c, 0x06, 0x92, 0xc2, 0x21, 0x02, 0x79, 0x38, 0x21, 0x16, 0xbd, 0x0d, 0xe5, 0x2e, 0x61, 0xa4, + 0x3a, 0xbb, 0xa1, 0x34, 0x2a, 0xad, 0xd7, 0x73, 0xc5, 0x4b, 0xbf, 0xe9, 0x98, 0x3c, 0xdd, 0xfe, + 0x80, 0x51, 0xdb, 0xe3, 0xc2, 0x17, 0xf8, 0xc9, 0xb6, 0x08, 0x23, 0x58, 0x08, 0x41, 0x04, 0x2a, + 0x36, 0x65, 0x4f, 0x1d, 0xf7, 0x98, 0x03, 0xab, 0x73, 0x42, 0xa6, 0xae, 0x4f, 0x49, 0x4c, 0x7d, + 0x47, 0xd2, 0x8b, 0x23, 0x73, 0x2e, 0x63, 0x75, 0x34, 0xac, 0x57, 0x76, 0x62, 0x31, 0x38, 0x29, + 0x53, 0xfb, 0x93, 0x02, 0x6b, 0x32, 0x40, 0x96, 0x63, 0x63, 0xea, 0xf9, 0x3d, 0x86, 0xbe, 0x03, + 0xf3, 0x81, 0xcf, 0x3c, 0x11, 0x9c, 0x4a, 0xeb, 0xcb, 0x53, 0x75, 0x06, 0xca, 0xb2, 0x52, 0x8c, + 0x55, 0xe9, 0xaa, 0xf9, 0x00, 0xef, 0xe1, 0x50, 0x28, 0x7a, 0x08, 0x4b, 0xb6, 0xd3, 0xa5, 0x7b, + 0xb4, 0x47, 0x4d, 0xe6, 0xb8, 0x22, 0x6e, 0x95, 0xd6, 0x46, 0x52, 0x09, 0xaf, 0x12, 0xee, 0xf9, + 0x9d, 0x04, 0x9d, 0xb1, 0x36, 0x1a, 0xd6, 0x97, 0x92, 0x10, 0x9c, 0x92, 0xa3, 0xfd, 0x5d, 0x85, + 0x8a, 0x41, 0x3c, 0xcb, 0x0c, 0x34, 0xa2, 0xef, 0x03, 0x10, 0xc6, 0x5c, 0x6b, 0xdf, 0x67, 0xe2, + 0x28, 0x3c, 0xe2, 0xb7, 0xa7, 0x1e, 0x25, 0xc1, 0xad, 0xb7, 0x23, 0xd6, 0x6d, 0x9b, 0xb9, 0xa7, + 0xc6, 0xb5, 0x30, 0xf4, 0x31, 0xe2, 0xc3, 0x7f, 0xd4, 0x97, 0xdf, 0xf1, 0x49, 0xcf, 0x3a, 0xb0, + 0x68, 0x77, 0x87, 0xf4, 0x29, 0x4e, 0x28, 0x44, 0x3e, 0x2c, 0x98, 0x64, 0x40, 0x4c, 0x8b, 0x9d, + 0x56, 0x4b, 0x42, 0xf9, 0xad, 0xc2, 0xca, 0x37, 0x25, 0x63, 0xa0, 0xfa, 0xaa, 0x54, 0xbd, 0x10, + 0x82, 0xc7, 0x15, 0x47, 0xaa, 0xd6, 0x8f, 0x61, 0x35, 0x63, 0x3a, 0x5a, 0x03, 0xf5, 0x98, 0x9e, + 0x06, 0x95, 0x86, 0xf9, 0x4f, 0x64, 0xc0, 0xec, 0x09, 0xe9, 0xf9, 0x54, 0xd4, 0x55, 0xa5, 0x75, + 0xa3, 0x48, 0x80, 0x43, 0xa1, 0x38, 0x60, 0xbd, 0x53, 0xba, 0xad, 0xac, 0x1f, 0xc1, 0x72, 0xca, + 0xd4, 0x09, 0xaa, 0xda, 0x69, 0x55, 0xaf, 0x15, 0x50, 0x15, 0x8a, 0x4c, 0x68, 0xd2, 0xee, 0xc2, + 0x85, 0xcd, 0xed, 0x7b, 0xb2, 0x87, 0xc8, 0x88, 0xa3, 0x16, 0x00, 0xfd, 0x60, 0xe0, 0x52, 0x8f, + 0xd7, 0x8f, 0xec, 0x24, 0x51, 0x89, 0x6e, 0x47, 0x18, 0x9c, 0xa0, 0xd2, 0x7c, 0x90, 0x9d, 0x81, + 0xf7, 0x16, 0x9b, 0xf4, 0xa9, 0xe4, 0x8b, 0x7a, 0x8b, 0xf0, 0xa7, 0xc0, 0xa0, 0x0e, 0xcc, 0xee, + 0xf3, 0xa8, 0x48, 0xdb, 0x1b, 0x45, 0xe3, 0x67, 0x2c, 0x8e, 0x86, 0xf5, 0x59, 0x01, 0xc0, 0x81, + 0x04, 0xed, 0xa3, 0x12, 0x7c, 0x21, 0x5b, 0x29, 0x9b, 0x8e, 0x7d, 0x60, 0x1d, 0xfa, 0xae, 0xf8, + 0x40, 0x5f, 0x83, 0xb9, 0x40, 0xa2, 0x34, 0xa8, 0x11, 0x36, 0xb2, 0x3d, 0x01, 0x7d, 0x31, 0xac, + 0xbf, 0x92, 0x65, 0x0d, 0x30, 0x58, 0xf2, 0xa1, 0x06, 0x2c, 0xb8, 0xf4, 0x89, 0x4f, 0x3d, 0xe6, + 0x89, 0x8c, 0x5b, 0x34, 0x96, 0x78, 0xd6, 0x60, 0x09, 0xc3, 0x11, 0x16, 0xfd, 0x00, 0x2e, 0x06, + 0xd5, 0x98, 0x32, 0x41, 0x56, 0xe2, 0x1b, 0x45, 0x42, 0x94, 0xe4, 0x33, 0xae, 0x48, 0x53, 0x2f, + 0x4e, 0x40, 0xe2, 0x49, 0x9a, 0xb4, 0x4f, 0x15, 0x78, 0x65, 0x72, 0xe3, 0x40, 0x14, 0xe6, 0x5d, + 0xf1, 0x2b, 0xac, 0xd9, 0x3b, 0x05, 0xec, 0x91, 0x67, 0xcc, 0xef, 0x42, 0xc1, 0xb7, 0x87, 0x43, + 0xd9, 0x68, 0x1f, 0xe6, 0x4c, 0x61, 0x92, 0x2c, 0xce, 0x3b, 0x67, 0x6a, 0x72, 0xe9, 0xf3, 0x47, + 0x33, 0x27, 0x00, 0x63, 0x29, 0x59, 0xfb, 0x85, 0x02, 0xab, 0x99, 0xea, 0x41, 0x35, 0x50, 0x2d, + 0x9b, 0x89, 0x8c, 0x52, 0x83, 0xf8, 0x74, 0x6c, 0xf6, 0x90, 0xe7, 0x39, 0xe6, 0x08, 0x74, 0x15, + 0xca, 0xfb, 0x7c, 0xe2, 0xf1, 0x58, 0x2c, 0x18, 0xcb, 0xa3, 0x61, 0x7d, 0xd1, 0x70, 0x9c, 0x5e, + 0x40, 0x21, 0x50, 0xe8, 0x4b, 0x30, 0xe7, 0x31, 0xd7, 0xb2, 0x0f, 0xab, 0x65, 0x91, 0x29, 0xa2, + 0xc7, 0xef, 0x09, 0x48, 0x40, 0x26, 0xd1, 0xe8, 0x3a, 0xcc, 0x9f, 0x50, 0x57, 0x14, 0xc7, 0xac, + 0xa0, 0x14, 0x2d, 0xf4, 0x61, 0x00, 0x0a, 0x48, 0x43, 0x02, 0x8d, 0xc2, 0x4a, 0xba, 0xfa, 0xd0, + 0x5e, 0x58, 0xb9, 0xca, 0xd8, 0xe4, 0x19, 0x1b, 0x96, 0xb1, 0xc7, 0xde, 0xf1, 0x89, 0xcd, 0x2c, + 0x76, 0x6a, 0x2c, 0x4b, 0xa7, 0xcc, 0x06, 0x8a, 0x02, 0x59, 0xda, 0x2f, 0x4b, 0x50, 0x91, 0x7a, + 0x7a, 0xc4, 0xea, 0xa3, 0x47, 0x89, 0x9c, 0x0d, 0xc2, 0x7d, 0xbd, 0x78, 0xb8, 0x8d, 0xb5, 0xb0, + 0x33, 0x4e, 0xc8, 0xf1, 0x2e, 0x54, 0x4c, 0xc7, 0xf6, 0x98, 0x4b, 0x2c, 0x5b, 0x16, 0x44, 0x7a, + 0x24, 0x4f, 0xc9, 0x6d, 0xc9, 0x65, 0x5c, 0x94, 0xf2, 0x2b, 0x31, 0xcc, 0xc3, 0x49, 0xb1, 0xe8, + 0x71, 0x94, 0x46, 0xaa, 0x50, 0xf0, 0xd5, 0x22, 0x0a, 0xf8, 0xc9, 0x8b, 0x65, 0xd0, 0x1f, 0x14, + 0xa8, 0xe6, 0x31, 0xa5, 0xea, 0x5d, 0xf9, 0x6f, 0xea, 0xbd, 0x74, 0x6e, 0xf5, 0xfe, 0x5b, 0x25, + 0x11, 0x76, 0xcf, 0x43, 0xdf, 0x85, 0x05, 0xbe, 0x5d, 0x89, 0x65, 0x49, 0x19, 0xb3, 0x62, 0xca, + 0x2e, 0xf6, 0x60, 0xff, 0x7b, 0xd4, 0x64, 0xf7, 0x29, 0x23, 0x71, 0xa7, 0x8f, 0x61, 0x38, 0x92, + 0x8a, 0x76, 0xa0, 0xec, 0x0d, 0xa8, 0x79, 0x86, 0x09, 0x27, 0x2c, 0xdb, 0x1b, 0x50, 0x33, 0x9e, + 0x05, 0xfc, 0x0b, 0x0b, 0x39, 0xda, 0x4f, 0x92, 0x91, 0xf0, 0xbc, 0x74, 0x24, 0x72, 0xfc, 0xab, + 0x9c, 0x9b, 0x7f, 0x7f, 0x13, 0x75, 0x1a, 0x61, 0xdd, 0x3d, 0xcb, 0x63, 0xe8, 0xfd, 0x31, 0x1f, + 0xeb, 0xc5, 0x7c, 0xcc, 0xb9, 0x85, 0x87, 0xa3, 0xf2, 0x0a, 0x21, 0x09, 0xff, 0xde, 0x87, 0x59, + 0x8b, 0xd1, 0x7e, 0x58, 0x58, 0x8d, 0xa2, 0x0e, 0x8e, 0xfb, 0x42, 0x87, 0xb3, 0xe3, 0x40, 0x8a, + 0xf6, 0xe7, 0xf4, 0x01, 0xb8, 0xe3, 0xd1, 0xfb, 0xb0, 0xe8, 0xc9, 0x51, 0x1f, 0x36, 0x87, 0x22, + 0xeb, 0x43, 0xb4, 0x30, 0x5e, 0x90, 0x9a, 0x16, 0x43, 0x88, 0x87, 0x63, 0x81, 0x89, 0xca, 0x2d, + 0x9d, 0xa5, 0x72, 0x33, 0xa1, 0xcf, 0xad, 0xdc, 0x27, 0x30, 0x29, 0x7a, 0xe8, 0x3d, 0x98, 0x73, + 0x06, 0xe4, 0x49, 0xd4, 0x55, 0xa7, 0xef, 0x84, 0x0f, 0x04, 0xe9, 0xa4, 0x14, 0x01, 0xae, 0x32, + 0x40, 0x63, 0x29, 0x51, 0xfb, 0x91, 0x02, 0x6b, 0xd9, 0x16, 0x76, 0x86, 0x26, 0xb1, 0x0b, 0x2b, + 0x7d, 0xc2, 0xcc, 0xa3, 0x68, 0x56, 0xc9, 0x5b, 0x57, 0x63, 0x34, 0xac, 0xaf, 0xdc, 0x4f, 0x61, + 0x5e, 0x0c, 0xeb, 0xe8, 0x2d, 0xbf, 0xd7, 0x3b, 0x4d, 0x6f, 0xa1, 0x19, 0x7e, 0xed, 0x43, 0x15, + 0x96, 0x53, 0x0d, 0xbb, 0xc0, 0xce, 0xd5, 0x86, 0xd5, 0x6e, 0xec, 0x6b, 0x8e, 0x90, 0x66, 0x7c, + 0x5e, 0x12, 0x27, 0xd3, 0x44, 0xf0, 0x65, 0xe9, 0xd3, 0x79, 0xa3, 0x7e, 0xd6, 0x79, 0xf3, 0x10, + 0x56, 0x48, 0xb4, 0x07, 0xdc, 0x77, 0xba, 0x54, 0x4e, 0x61, 0x5d, 0x72, 0xad, 0xb4, 0x53, 0xd8, + 0x17, 0xc3, 0xfa, 0xe7, 0xb2, 0xdb, 0x03, 0x87, 0xe3, 0x8c, 0x14, 0x74, 0x0d, 0x66, 0x4d, 0xc7, + 0xb7, 0x99, 0x18, 0xd5, 0x6a, 0x5c, 0x26, 0x9b, 0x1c, 0x88, 0x03, 0x1c, 0xba, 0x09, 0x15, 0xd2, + 0xed, 0x5b, 0x76, 0xdb, 0x34, 0xa9, 0xe7, 0x89, 0x3b, 0xe1, 0x42, 0x30, 0xff, 0xdb, 0x31, 0x18, + 0x27, 0x69, 0xb4, 0x7f, 0x29, 0xe1, 0xe6, 0x99, 0xb3, 0x24, 0xa1, 0x57, 0xf9, 0xc6, 0x25, 0x50, + 0x32, 0x2e, 0x89, 0xad, 0x49, 0x80, 0x71, 0x88, 0x4f, 0xdc, 0xdb, 0x4b, 0x85, 0xee, 0xed, 0x6a, + 0x81, 0x7b, 0x7b, 0x79, 0xea, 0xbd, 0x3d, 0x73, 0xe2, 0xd9, 0x02, 0x27, 0xfe, 0x76, 0xb8, 0xca, + 0x44, 0x17, 0x85, 0x0e, 0xa8, 0x26, 0xed, 0x4d, 0xe8, 0x82, 0xe3, 0xb9, 0x30, 0x76, 0xcb, 0x30, + 0xe6, 0x47, 0xc3, 0xba, 0xba, 0xb9, 0x7d, 0x0f, 0x73, 0x19, 0xda, 0xaf, 0x14, 0xb8, 0x30, 0x76, + 0xcd, 0x46, 0x6f, 0xc2, 0xb2, 0x65, 0x33, 0xea, 0x1e, 0x10, 0x93, 0xee, 0xc4, 0x09, 0x7e, 0x49, + 0x1e, 0x6a, 0xb9, 0x93, 0x44, 0xe2, 0x34, 0x2d, 0xba, 0x0c, 0xaa, 0x35, 0x08, 0x57, 0x76, 0xa1, + 0xad, 0xb3, 0xeb, 0x61, 0x0e, 0xe3, 0xd5, 0x70, 0x44, 0xdc, 0xee, 0x53, 0xe2, 0xd2, 0x76, 0xb7, + 0xcb, 0xef, 0x30, 0xd2, 0xa5, 0x51, 0x35, 0x7c, 0x3d, 0x8d, 0xc6, 0x59, 0x7a, 0xed, 0xe7, 0x0a, + 0x5c, 0xce, 0xed, 0x23, 0x85, 0x1f, 0x62, 0x08, 0xc0, 0x80, 0xb8, 0xa4, 0x4f, 0x19, 0x75, 0x3d, + 0x39, 0x54, 0xcf, 0xf8, 0xbe, 0x11, 0xcd, 0xeb, 0xdd, 0x48, 0x10, 0x4e, 0x08, 0xd5, 0x7e, 0x5a, + 0x82, 0x65, 0x2c, 0xc3, 0x11, 0x2c, 0x87, 0xff, 0xfb, 0x2d, 0x61, 0x37, 0xb5, 0x25, 0x4c, 0xcf, + 0x8c, 0x94, 0x6d, 0x79, 0x7b, 0x02, 0x7a, 0xc4, 0x97, 0x73, 0xc2, 0x7c, 0xaf, 0xd0, 0x6d, 0x2a, + 0x2d, 0x53, 0xf0, 0xc5, 0x21, 0x08, 0xbe, 0xb1, 0x94, 0xa7, 0x8d, 0x14, 0xa8, 0xa5, 0xe8, 0x79, + 0x97, 0xf7, 0xfb, 0xd4, 0xc5, 0xf4, 0x80, 0xba, 0xd4, 0x36, 0x29, 0xba, 0x01, 0x0b, 0x64, 0x60, + 0xdd, 0x75, 0x1d, 0x7f, 0x20, 0xe3, 0x19, 0x8d, 0xf0, 0xf6, 0x6e, 0x47, 0xc0, 0x71, 0x44, 0xc1, + 0xa9, 0x43, 0x83, 0x64, 0x56, 0x25, 0xf6, 0xe9, 0x00, 0x8e, 0x23, 0x8a, 0xa8, 0x75, 0x97, 0x73, + 0x5b, 0xb7, 0x01, 0xaa, 0x6f, 0x75, 0xe5, 0x55, 0xe3, 0x0d, 0x49, 0xa0, 0xbe, 0xdb, 0xd9, 0x7a, + 0x31, 0xac, 0x5f, 0xcd, 0x7b, 0x42, 0x64, 0xa7, 0x03, 0xea, 0xe9, 0xef, 0x76, 0xb6, 0x30, 0x67, + 0xd6, 0x7e, 0xa7, 0xc0, 0x85, 0xd4, 0x21, 0xcf, 0x61, 0x95, 0x79, 0x90, 0x5e, 0x65, 0xae, 0x17, + 0x8f, 0x58, 0xce, 0x32, 0x73, 0x94, 0x39, 0x83, 0xd8, 0x66, 0xf6, 0xb2, 0xcf, 0x6a, 0x8d, 0xa2, + 0x57, 0x85, 0xfc, 0xb7, 0x34, 0xed, 0x8f, 0x25, 0xb8, 0x38, 0x21, 0x87, 0xd0, 0x63, 0x80, 0x78, + 0xbc, 0x48, 0x7d, 0xd3, 0xef, 0x3e, 0x63, 0x57, 0xe7, 0x15, 0xf1, 0xd8, 0x15, 0x43, 0x13, 0x02, + 0x91, 0x0b, 0x15, 0x97, 0x7a, 0xd4, 0x3d, 0xa1, 0xdd, 0xb7, 0x1c, 0x57, 0xfa, 0xed, 0xcd, 0xe2, + 0x7e, 0x1b, 0xcb, 0xdc, 0xf8, 0xa6, 0x85, 0x63, 0xb9, 0x38, 0xa9, 0x04, 0x3d, 0x8e, 0xfd, 0x17, + 0xbc, 0xde, 0xb6, 0x8a, 0x9c, 0x27, 0xfd, 0xee, 0x3c, 0xc5, 0x93, 0x7f, 0x53, 0xe0, 0x52, 0xca, + 0xc6, 0x6f, 0xd2, 0xfe, 0xa0, 0x47, 0x18, 0x3d, 0x87, 0x2e, 0xf4, 0x28, 0xd5, 0x85, 0x6e, 0x15, + 0xf7, 0x63, 0x68, 0x63, 0xee, 0xad, 0xe5, 0xaf, 0x0a, 0x5c, 0x9e, 0xc8, 0x71, 0x0e, 0x65, 0xf5, + 0xad, 0x74, 0x59, 0xb5, 0xce, 0x7e, 0xac, 0x9c, 0xf2, 0xfa, 0x4b, 0xde, 0xa1, 0x44, 0x9d, 0xfd, + 0x1f, 0x0e, 0x0d, 0xed, 0xd7, 0x0a, 0x2c, 0x85, 0x94, 0x7c, 0x47, 0x2a, 0xb0, 0x27, 0xb7, 0x00, + 0xe4, 0xdf, 0x2d, 0xe1, 0x4d, 0x5e, 0x8d, 0xcd, 0xbe, 0x1b, 0x61, 0x70, 0x82, 0x0a, 0x7d, 0x03, + 0x50, 0x68, 0xe0, 0x5e, 0x4f, 0xac, 0x02, 0x7c, 0xdf, 0x54, 0x05, 0xef, 0xba, 0xe4, 0x45, 0x78, + 0x8c, 0x02, 0x4f, 0xe0, 0xd2, 0x7e, 0xaf, 0xc4, 0xd3, 0x5a, 0x80, 0x5f, 0x52, 0xc7, 0x0b, 0xdb, + 0x72, 0x1d, 0x9f, 0x1c, 0x37, 0x82, 0xf2, 0x65, 0x1d, 0x37, 0xc2, 0xb8, 0x9c, 0x7a, 0xf8, 0x48, + 0xcd, 0x1c, 0x42, 0xd4, 0x41, 0xd1, 0xcd, 0xee, 0xed, 0xc4, 0x5f, 0x6c, 0x95, 0xd6, 0xab, 0x85, + 0xac, 0xe1, 0x39, 0x3a, 0x71, 0xab, 0xbf, 0x01, 0x0b, 0xb6, 0xd3, 0x0d, 0x56, 0xe0, 0xcc, 0x4a, + 0xb1, 0x23, 0xe1, 0x38, 0xa2, 0x18, 0xfb, 0x27, 0xa8, 0xfc, 0xd9, 0xfc, 0x13, 0x24, 0xd6, 0xa0, + 0x5e, 0x8f, 0x13, 0x84, 0x17, 0x86, 0x78, 0x0d, 0x92, 0x70, 0x1c, 0x51, 0xa0, 0x9d, 0x78, 0xb0, + 0xcc, 0x89, 0x88, 0x5c, 0x2b, 0x30, 0x98, 0xf3, 0x27, 0x89, 0xd1, 0x7e, 0xf6, 0xbc, 0x36, 0xf3, + 0xf1, 0xf3, 0xda, 0xcc, 0x27, 0xcf, 0x6b, 0x33, 0x3f, 0x1c, 0xd5, 0x94, 0x67, 0xa3, 0x9a, 0xf2, + 0xf1, 0xa8, 0xa6, 0x7c, 0x32, 0xaa, 0x29, 0xff, 0x1c, 0xd5, 0x94, 0x1f, 0x7f, 0x5a, 0x9b, 0x79, + 0xef, 0xca, 0x94, 0x7f, 0xa3, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xe1, 0xe6, 0x3e, 0xd5, 0xab, 0x1e, 0x00, 0x00, } @@ -1208,16 +1209,18 @@ func (m *AllocatedDeviceStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - { - size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.Data != nil { + { + size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x2a } - i-- - dAtA[i] = 0x2a if len(m.Conditions) > 0 { for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { { @@ -2817,8 +2820,10 @@ func (m *AllocatedDeviceStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } - l = m.Data.Size() - n += 1 + l + sovGenerated(uint64(l)) + if m.Data != nil { + l = m.Data.Size() + n += 1 + l + sovGenerated(uint64(l)) + } if m.NetworkData != nil { l = m.NetworkData.Size() n += 1 + l + sovGenerated(uint64(l)) @@ -3413,7 +3418,7 @@ func (this *AllocatedDeviceStatus) String() string { `Pool:` + fmt.Sprintf("%v", this.Pool) + `,`, `Device:` + fmt.Sprintf("%v", this.Device) + `,`, `Conditions:` + repeatedStringForConditions + `,`, - `Data:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Data), "RawExtension", "runtime.RawExtension", 1), `&`, ``, 1) + `,`, + `Data:` + strings.Replace(fmt.Sprintf("%v", this.Data), "RawExtension", "runtime.RawExtension", 1) + `,`, `NetworkData:` + strings.Replace(this.NetworkData.String(), "NetworkDeviceData", "NetworkDeviceData", 1) + `,`, `}`, }, "") @@ -4088,6 +4093,9 @@ func (m *AllocatedDeviceStatus) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } + if m.Data == nil { + m.Data = &runtime.RawExtension{} + } if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } diff --git a/staging/src/k8s.io/api/resource/v1beta1/generated.proto b/staging/src/k8s.io/api/resource/v1beta1/generated.proto index b944b5a62d6..f52413f2456 100644 --- a/staging/src/k8s.io/api/resource/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/resource/v1beta1/generated.proto @@ -62,6 +62,8 @@ message AllocatedDeviceStatus { // If the device has been configured according to the class and claim // config references, the `Ready` condition should be True. // + // Must not contain more than 8 entries. + // // +optional // +listType=map // +listMapKey=type @@ -558,6 +560,8 @@ message NetworkDeviceData { // associated subnet mask. // e.g.: "192.0.2.5/24" for IPv4 and "2001:db8::5/64" for IPv6. // + // Must not contain more than 16 entries. + // // +optional // +listType=atomic repeated string ips = 2; diff --git a/staging/src/k8s.io/api/resource/v1beta1/types.go b/staging/src/k8s.io/api/resource/v1beta1/types.go index bbba1eca386..558665386e7 100644 --- a/staging/src/k8s.io/api/resource/v1beta1/types.go +++ b/staging/src/k8s.io/api/resource/v1beta1/types.go @@ -1007,6 +1007,24 @@ type ResourceClaimTemplateList struct { Items []ResourceClaimTemplate `json:"items" protobuf:"bytes,2,rep,name=items"` } +const ( + // AllocatedDeviceStatusMaxConditions represents the maximum number of + // conditions in a device status. + AllocatedDeviceStatusMaxConditions int = 8 + // AllocatedDeviceStatusDataMaxLength represents the maximum length of the + // raw data in the Data field in a device status. + AllocatedDeviceStatusDataMaxLength int = 10 * 1024 + // NetworkDeviceDataMaxIPs represents the maximum number of IPs in the networkData + // field in a device status. + NetworkDeviceDataMaxIPs int = 16 + // NetworkDeviceDataInterfaceNameMaxLength represents the maximum number of characters + // for the networkData.interfaceName field in a device status. + NetworkDeviceDataInterfaceNameMaxLength int = 256 + // NetworkDeviceDataHardwareAddressMaxLength represents the maximum number of characters + // for the networkData.hardwareAddress field in a device status. + NetworkDeviceDataHardwareAddressMaxLength int = 128 +) + // AllocatedDeviceStatus contains the status of an allocated device, if the // driver chooses to report it. This may include driver-specific information. type AllocatedDeviceStatus struct { @@ -1039,6 +1057,8 @@ type AllocatedDeviceStatus struct { // If the device has been configured according to the class and claim // config references, the `Ready` condition should be True. // + // Must not contain more than 8 entries. + // // +optional // +listType=map // +listMapKey=type @@ -1049,7 +1069,7 @@ type AllocatedDeviceStatus struct { // The length of the raw data must be smaller or equal to 10 Ki. // // +optional - Data runtime.RawExtension `json:"data,omitempty" protobuf:"bytes,5,opt,name=data"` + Data *runtime.RawExtension `json:"data,omitempty" protobuf:"bytes,5,opt,name=data"` // NetworkData contains network-related information specific to the device. // @@ -1076,6 +1096,8 @@ type NetworkDeviceData struct { // associated subnet mask. // e.g.: "192.0.2.5/24" for IPv4 and "2001:db8::5/64" for IPv6. // + // Must not contain more than 16 entries. + // // +optional // +listType=atomic IPs []string `json:"ips,omitempty" protobuf:"bytes,2,opt,name=ips"` diff --git a/staging/src/k8s.io/api/resource/v1beta1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/resource/v1beta1/types_swagger_doc_generated.go index 1d1ff030a17..fac9987e3ae 100644 --- a/staging/src/k8s.io/api/resource/v1beta1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/resource/v1beta1/types_swagger_doc_generated.go @@ -32,7 +32,7 @@ var map_AllocatedDeviceStatus = map[string]string{ "driver": "Driver specifies the name of the DRA driver whose kubelet plugin should be invoked to process the allocation once the claim is needed on a node.\n\nMust be a DNS subdomain and should end with a DNS domain owned by the vendor of the driver.", "pool": "This name together with the driver name and the device name field identify which device was allocated (`//`).\n\nMust not be longer than 253 characters and may contain one or more DNS sub-domains separated by slashes.", "device": "Device references one device instance via its name in the driver's resource pool. It must be a DNS label.", - "conditions": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.", + "conditions": "Conditions contains the latest observation of the device's state. If the device has been configured according to the class and claim config references, the `Ready` condition should be True.\n\nMust not contain more than 8 entries.", "data": "Data contains arbitrary driver-specific data.\n\nThe length of the raw data must be smaller or equal to 10 Ki.", "networkData": "NetworkData contains network-related information specific to the device.", } @@ -237,7 +237,7 @@ func (DeviceSelector) SwaggerDoc() map[string]string { var map_NetworkDeviceData = map[string]string{ "": "NetworkDeviceData provides network-related details for the allocated device. This information may be filled by drivers or other components to configure or identify the device within a network context.", "interfaceName": "InterfaceName specifies the name of the network interface associated with the allocated device. This might be the name of a physical or virtual network interface being configured in the pod.\n\nMust not be longer than 256 characters.", - "ips": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.", + "ips": "IPs lists the network addresses assigned to the device's network interface. This can include both IPv4 and IPv6 addresses. The IPs are in the CIDR notation, which includes both the address and the associated subnet mask. e.g.: \"192.0.2.5/24\" for IPv4 and \"2001:db8::5/64\" for IPv6.\n\nMust not contain more than 16 entries.", "hardwareAddress": "HardwareAddress represents the hardware address (e.g. MAC Address) of the device's network interface.\n\nMust not be longer than 128 characters.", } diff --git a/staging/src/k8s.io/api/resource/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/resource/v1beta1/zz_generated.deepcopy.go index 3be61333fff..ec08c15b0af 100644 --- a/staging/src/k8s.io/api/resource/v1beta1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/resource/v1beta1/zz_generated.deepcopy.go @@ -37,7 +37,11 @@ func (in *AllocatedDeviceStatus) DeepCopyInto(out *AllocatedDeviceStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } - in.Data.DeepCopyInto(&out.Data) + if in.Data != nil { + in, out := &in.Data, &out.Data + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) + } if in.NetworkData != nil { in, out := &in.NetworkData, &out.NetworkData *out = new(NetworkDeviceData) diff --git a/test/e2e/dra/dra.go b/test/e2e/dra/dra.go index ae4835fe04f..4b8250f2fb7 100644 --- a/test/e2e/dra/dra.go +++ b/test/e2e/dra/dra.go @@ -430,7 +430,7 @@ var _ = framework.SIGDescribe("node")("DRA", feature.DynamicResourceAllocation, Pool: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Pool, Device: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Device, Conditions: []metav1.Condition{{Type: "a", Status: "True", Message: "c", Reason: "d", LastTransitionTime: metav1.NewTime(time.Now().Truncate(time.Second))}}, - Data: runtime.RawExtension{Raw: []byte(`{"foo":"bar"}`)}, + Data: &runtime.RawExtension{Raw: []byte(`{"foo":"bar"}`)}, NetworkData: &resourceapi.NetworkDeviceData{ InterfaceName: "inf1", IPs: []string{"10.9.8.0/24", "2001:db8::/64"}, @@ -454,7 +454,7 @@ var _ = framework.SIGDescribe("node")("DRA", feature.DynamicResourceAllocation, Pool: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Pool, Device: allocatedResourceClaim.Status.Allocation.Devices.Results[0].Device, Conditions: []metav1.Condition{{Type: "e", Status: "True", Message: "g", Reason: "h", LastTransitionTime: metav1.NewTime(time.Now().Truncate(time.Second))}}, - Data: runtime.RawExtension{Raw: []byte(`{"bar":"foo"}`)}, + Data: &runtime.RawExtension{Raw: []byte(`{"bar":"foo"}`)}, NetworkData: &resourceapi.NetworkDeviceData{ InterfaceName: "inf2", IPs: []string{"10.9.8.1/24", "2001:db8::1/64"}, diff --git a/test/integration/resourceclaim/feature_enable_disable_test.go b/test/integration/resourceclaim/feature_enable_disable_test.go index ca4a6d8fd16..844a6e17af2 100644 --- a/test/integration/resourceclaim/feature_enable_disable_test.go +++ b/test/integration/resourceclaim/feature_enable_disable_test.go @@ -82,7 +82,7 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { Driver: "foo", Pool: "foo", Device: "foo", - Data: runtime.RawExtension{ + Data: &runtime.RawExtension{ Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), }, NetworkData: &v1beta1.NetworkDeviceData{ @@ -155,7 +155,7 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { Driver: "bar", Pool: "bar", Device: "bar", - Data: runtime.RawExtension{ + Data: &runtime.RawExtension{ Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), }, NetworkData: &v1beta1.NetworkDeviceData{ @@ -191,7 +191,7 @@ func TestEnableDisableDRAResourceClaimDeviceStatus(t *testing.T) { Driver: "bar", Pool: "bar", Device: "bar", - Data: runtime.RawExtension{ + Data: &runtime.RawExtension{ Raw: []byte(`{"kind": "foo", "apiVersion": "dra.example.com/v1"}`), }, NetworkData: &v1beta1.NetworkDeviceData{