diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 7481a0970b9..11128d23404 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -45084,6 +45084,15 @@ "description": "externalName is the external reference that kubedns or equivalent will return as a CNAME record for this service. No proxying will be involved. Must be a valid DNS name and requires Type to be ExternalName.", "type": "string" }, + "externalTrafficPolicy": { + "description": "externalTrafficPolicy denotes if this Service desires to route external traffic to local endpoints only. This preserves Source IP and avoids a second hop for LoadBalancer and Nodeport type services.", + "type": "string" + }, + "healthCheckNodePort": { + "description": "healthCheckNodePort specifies the healthcheck nodePort for the service. If not specified, HealthCheckNodePort is created by the service api backend with the allocated nodePort. Will use user-specified nodePort value if specified by the client. Only effects when Type is set to LoadBalancer and ExternalTrafficPolicy is set to Local.", + "type": "integer", + "format": "int32" + }, "loadBalancerIP": { "description": "Only applies to Service Type: LoadBalancer LoadBalancer will get created with the IP specified in this field. This feature depends on whether the underlying cloud-provider supports specifying the loadBalancerIP when a load balancer is created. This field will be ignored if the cloud-provider does not support the feature.", "type": "string" diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index d045e970abd..8bd2ec00f03 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -21041,6 +21041,15 @@ "externalName": { "type": "string", "description": "externalName is the external reference that kubedns or equivalent will return as a CNAME record for this service. No proxying will be involved. Must be a valid DNS name and requires Type to be ExternalName." + }, + "externalTrafficPolicy": { + "type": "string", + "description": "externalTrafficPolicy denotes if this Service desires to route external traffic to local endpoints only. This preserves Source IP and avoids a second hop for LoadBalancer and Nodeport type services." + }, + "healthCheckNodePort": { + "type": "integer", + "format": "int32", + "description": "healthCheckNodePort specifies the healthcheck nodePort for the service. If not specified, HealthCheckNodePort is created by the service api backend with the allocated nodePort. Will use user-specified nodePort value if specified by the client. Only effects when Type is set to LoadBalancer and ExternalTrafficPolicy is set to Local." } } }, diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index d7bd6816726..10de1b9ff09 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -9695,6 +9695,20 @@ Examples:

string

+ +

externalTrafficPolicy

+

externalTrafficPolicy denotes if this Service desires to route external traffic to local endpoints only. This preserves Source IP and avoids a second hop for LoadBalancer and Nodeport type services.

+

false

+

string

+ + + +

healthCheckNodePort

+

healthCheckNodePort specifies the healthcheck nodePort for the service. If not specified, HealthCheckNodePort is created by the service api backend with the allocated nodePort. Will use user-specified nodePort value if specified by the client. Only effects when Type is set to LoadBalancer and ExternalTrafficPolicy is set to Local.

+

false

+

integer (int32)

+ + @@ -9927,7 +9941,7 @@ Examples:
diff --git a/federation/apis/openapi-spec/swagger.json b/federation/apis/openapi-spec/swagger.json index 76f0b50c950..e4176b19266 100644 --- a/federation/apis/openapi-spec/swagger.json +++ b/federation/apis/openapi-spec/swagger.json @@ -12228,6 +12228,15 @@ "description": "externalName is the external reference that kubedns or equivalent will return as a CNAME record for this service. No proxying will be involved. Must be a valid DNS name and requires Type to be ExternalName.", "type": "string" }, + "externalTrafficPolicy": { + "description": "externalTrafficPolicy denotes if this Service desires to route external traffic to local endpoints only. This preserves Source IP and avoids a second hop for LoadBalancer and Nodeport type services.", + "type": "string" + }, + "healthCheckNodePort": { + "description": "healthCheckNodePort specifies the healthcheck nodePort for the service. If not specified, HealthCheckNodePort is created by the service api backend with the allocated nodePort. Will use user-specified nodePort value if specified by the client. Only effects when Type is set to LoadBalancer and ExternalTrafficPolicy is set to Local.", + "type": "integer", + "format": "int32" + }, "loadBalancerIP": { "description": "Only applies to Service Type: LoadBalancer LoadBalancer will get created with the IP specified in this field. This feature depends on whether the underlying cloud-provider supports specifying the loadBalancerIP when a load balancer is created. This field will be ignored if the cloud-provider does not support the feature.", "type": "string" diff --git a/pkg/api/service/BUILD b/pkg/api/service/BUILD index 590af4a564e..6464ca1d21e 100644 --- a/pkg/api/service/BUILD +++ b/pkg/api/service/BUILD @@ -30,6 +30,8 @@ go_test( deps = [ "//pkg/api:go_default_library", "//pkg/util/net/sets:go_default_library", + "//vendor/github.com/davecgh/go-spew/spew:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) diff --git a/pkg/api/service/annotations.go b/pkg/api/service/annotations.go index d6ccaeba32a..c347854367e 100644 --- a/pkg/api/service/annotations.go +++ b/pkg/api/service/annotations.go @@ -26,25 +26,19 @@ const ( // Not all cloud providers support this annotation, though AWS & GCE do. AnnotationLoadBalancerSourceRangesKey = "service.beta.kubernetes.io/load-balancer-source-ranges" - // AnnotationValueExternalTrafficLocal Value of annotation to specify local endpoints behaviour + // AnnotationValueExternalTrafficLocal Value of annotation to specify local endpoints behavior. AnnotationValueExternalTrafficLocal = "OnlyLocal" - // AnnotationValueExternalTrafficGlobal Value of annotation to specify global (legacy) behaviour + // AnnotationValueExternalTrafficGlobal Value of annotation to specify global (legacy) behavior. AnnotationValueExternalTrafficGlobal = "Global" - // TODO: The alpha annotations have been deprecated, remove them when we move this feature to GA. + // TODO: The beta annotations have been deprecated, remove them when we release k8s 1.8. - // AlphaAnnotationHealthCheckNodePort Annotation specifying the healthcheck nodePort for the service - // If not specified, annotation is created by the service api backend with the allocated nodePort - // Will use user-specified nodePort value if specified by the client - AlphaAnnotationHealthCheckNodePort = "service.alpha.kubernetes.io/healthcheck-nodeport" - - // AlphaAnnotationExternalTraffic An annotation that denotes if this Service desires to route external traffic to local - // endpoints only. This preserves Source IP and avoids a second hop. - AlphaAnnotationExternalTraffic = "service.alpha.kubernetes.io/external-traffic" - - // BetaAnnotationHealthCheckNodePort is the beta version of AlphaAnnotationHealthCheckNodePort. + // BetaAnnotationHealthCheckNodePort Annotation specifying the healthcheck nodePort for the service. + // If not specified, annotation is created by the service api backend with the allocated nodePort. + // Will use user-specified nodePort value if specified by the client. BetaAnnotationHealthCheckNodePort = "service.beta.kubernetes.io/healthcheck-nodeport" - // BetaAnnotationExternalTraffic is the beta version of AlphaAnnotationExternalTraffic. + // BetaAnnotationExternalTraffic An annotation that denotes if this Service desires to route + // external traffic to local endpoints only. This preserves Source IP and avoids a second hop. BetaAnnotationExternalTraffic = "service.beta.kubernetes.io/external-traffic" ) diff --git a/pkg/api/service/util.go b/pkg/api/service/util.go index ddf2f68d6a1..8a4b544586f 100644 --- a/pkg/api/service/util.go +++ b/pkg/api/service/util.go @@ -76,23 +76,22 @@ func RequestsOnlyLocalTraffic(service *api.Service) bool { service.Spec.Type != api.ServiceTypeNodePort { return false } - // First check the alpha annotation and then the beta. This is so existing - // Services continue to work till the user decides to transition to beta. - // If they transition to beta, there's no way to go back to alpha without - // rolling back the cluster. - for _, annotation := range []string{AlphaAnnotationExternalTraffic, BetaAnnotationExternalTraffic} { - if l, ok := service.Annotations[annotation]; ok { - switch l { - case AnnotationValueExternalTrafficLocal: - return true - case AnnotationValueExternalTrafficGlobal: - return false - default: - glog.Errorf("Invalid value for annotation %v: %v", annotation, l) - } + + // First check the beta annotation and then the first class field. This is so that + // existing Services continue to work till the user decides to transition to the + // first class field. + if l, ok := service.Annotations[BetaAnnotationExternalTraffic]; ok { + switch l { + case AnnotationValueExternalTrafficLocal: + return true + case AnnotationValueExternalTrafficGlobal: + return false + default: + glog.Errorf("Invalid value for annotation %v: %v", BetaAnnotationExternalTraffic, l) + return false } } - return false + return service.Spec.ExternalTrafficPolicy == api.ServiceExternalTrafficPolicyTypeLocal } // NeedsHealthCheck Check if service needs health check. @@ -103,21 +102,61 @@ func NeedsHealthCheck(service *api.Service) bool { return RequestsOnlyLocalTraffic(service) } -// GetServiceHealthCheckNodePort Return health check node port annotation for service, if one exists +// GetServiceHealthCheckNodePort Return health check node port for service, if one exists func GetServiceHealthCheckNodePort(service *api.Service) int32 { - // First check the alpha annotation and then the beta. This is so existing - // Services continue to work till the user decides to transition to beta. - // If they transition to beta, there's no way to go back to alpha without - // rolling back the cluster. - for _, annotation := range []string{AlphaAnnotationHealthCheckNodePort, BetaAnnotationHealthCheckNodePort} { - if l, ok := service.Annotations[annotation]; ok { - p, err := strconv.Atoi(l) - if err != nil { - glog.Errorf("Failed to parse annotation %v: %v", annotation, err) - continue - } - return int32(p) + // First check the beta annotation and then the first class field. This is so that + // existing Services continue to work till the user decides to transition to the + // first class field. + if l, ok := service.Annotations[BetaAnnotationHealthCheckNodePort]; ok { + p, err := strconv.Atoi(l) + if err != nil { + glog.Errorf("Failed to parse annotation %v: %v", BetaAnnotationHealthCheckNodePort, err) + return 0 } + return int32(p) } - return 0 + return service.Spec.HealthCheckNodePort +} + +// SetDefaultExternalTrafficPolicyIfNeeded defaults the ExternalTrafficPolicy field +// for NodePort / LoadBalancer service to Global for consistency. +// TODO: Move this default logic to default.go once beta annotation is deprecated. +func SetDefaultExternalTrafficPolicyIfNeeded(service *api.Service) { + if _, ok := service.Annotations[BetaAnnotationExternalTraffic]; ok { + // Don't default this field if beta annotation exists. + return + } else if (service.Spec.Type == api.ServiceTypeNodePort || + service.Spec.Type == api.ServiceTypeLoadBalancer) && + service.Spec.ExternalTrafficPolicy == "" { + service.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeGlobal + } +} + +// ClearExternalTrafficPolicy resets the ExternalTrafficPolicy field. +func ClearExternalTrafficPolicy(service *api.Service) { + // First check the beta annotation and then the first class field. This is so that + // existing Services continue to work till the user decides to transition to the + // first class field. + if _, ok := service.Annotations[BetaAnnotationExternalTraffic]; ok { + delete(service.Annotations, BetaAnnotationExternalTraffic) + return + } + service.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyType("") +} + +// SetServiceHealthCheckNodePort sets the given health check node port on service. +// It does not check whether this service needs healthCheckNodePort. +func SetServiceHealthCheckNodePort(service *api.Service, hcNodePort int32) { + // First check the beta annotation and then the first class field. This is so that + // existing Services continue to work till the user decides to transition to the + // first class field. + if _, ok := service.Annotations[BetaAnnotationExternalTraffic]; ok { + if hcNodePort == 0 { + delete(service.Annotations, BetaAnnotationHealthCheckNodePort) + } else { + service.Annotations[BetaAnnotationHealthCheckNodePort] = fmt.Sprintf("%d", hcNodePort) + } + return + } + service.Spec.HealthCheckNodePort = hcNodePort } diff --git a/pkg/api/service/util_test.go b/pkg/api/service/util_test.go index c1e6c7fb4d4..e0508f2f8ca 100644 --- a/pkg/api/service/util_test.go +++ b/pkg/api/service/util_test.go @@ -19,10 +19,15 @@ package service import ( "testing" + "fmt" + "reflect" "strings" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/kubernetes/pkg/api" netsets "k8s.io/kubernetes/pkg/util/net/sets" + + "github.com/davecgh/go-spew/spew" ) func TestGetLoadBalancerSourceRanges(t *testing.T) { @@ -129,3 +134,385 @@ func TestAllowAll(t *testing.T) { checkAllowAll(true, "192.168.0.0/0") checkAllowAll(true, "192.168.0.1/32", "0.0.0.0/0") } + +func TestRequestsOnlyLocalTraffic(t *testing.T) { + checkRequestsOnlyLocalTraffic := func(requestsOnlyLocalTraffic bool, service *api.Service) { + res := RequestsOnlyLocalTraffic(service) + if res != requestsOnlyLocalTraffic { + t.Errorf("Expected requests OnlyLocal traffic = %v, got %v", + requestsOnlyLocalTraffic, res) + } + } + + checkRequestsOnlyLocalTraffic(false, &api.Service{}) + checkRequestsOnlyLocalTraffic(false, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeClusterIP, + }, + }) + checkRequestsOnlyLocalTraffic(false, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeNodePort, + }, + }) + checkRequestsOnlyLocalTraffic(false, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeNodePort, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeGlobal, + }, + }) + checkRequestsOnlyLocalTraffic(true, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeNodePort, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeLocal, + }, + }) + checkRequestsOnlyLocalTraffic(false, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeGlobal, + }, + }) + checkRequestsOnlyLocalTraffic(true, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeLocal, + }, + }) +} + +func TestNeedsHealthCheck(t *testing.T) { + checkNeedsHealthCheck := func(needsHealthCheck bool, service *api.Service) { + res := NeedsHealthCheck(service) + if res != needsHealthCheck { + t.Errorf("Expected needs health check = %v, got %v", + needsHealthCheck, res) + } + } + + checkNeedsHealthCheck(false, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeClusterIP, + }, + }) + checkNeedsHealthCheck(false, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeNodePort, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeGlobal, + }, + }) + checkNeedsHealthCheck(false, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeNodePort, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeLocal, + }, + }) + checkNeedsHealthCheck(false, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeGlobal, + }, + }) + checkNeedsHealthCheck(true, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeLocal, + }, + }) + + checkNeedsHealthCheck(false, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: "invalid", + }, + }, + }) + checkNeedsHealthCheck(false, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficGlobal, + }, + }, + }) + checkNeedsHealthCheck(true, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficLocal, + }, + }, + }) +} + +func TestGetServiceHealthCheckNodePort(t *testing.T) { + checkGetServiceHealthCheckNodePort := func(healthCheckNodePort int32, service *api.Service) { + res := GetServiceHealthCheckNodePort(service) + if res != healthCheckNodePort { + t.Errorf("Expected health check node port = %v, got %v", + healthCheckNodePort, res) + } + } + + checkGetServiceHealthCheckNodePort(0, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeClusterIP, + }, + }) + checkGetServiceHealthCheckNodePort(0, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeNodePort, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeGlobal, + }, + }) + checkGetServiceHealthCheckNodePort(0, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeGlobal, + }, + }) + checkGetServiceHealthCheckNodePort(34567, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeLocal, + HealthCheckNodePort: int32(34567), + }, + }) + checkGetServiceHealthCheckNodePort(34567, &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficLocal, + BetaAnnotationHealthCheckNodePort: "34567", + }, + }, + }) +} + +func TestSetDefaultExternalTrafficPolicyIfNeeded(t *testing.T) { + testCases := []struct { + inputService *api.Service + expectedService *api.Service + }{ + // First class fields cases. + { + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + }, + }, + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeGlobal, + }, + }, + }, + { + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeNodePort, + }, + }, + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeNodePort, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeGlobal, + }, + }, + }, + { + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeClusterIP, + }, + }, + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeClusterIP, + }, + }, + }, + // Beta annotations cases. + { + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficLocal, + }, + }, + }, + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficLocal, + }, + }, + }, + }, + { + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficGlobal, + }, + }, + }, + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficGlobal, + }, + }, + }, + }, + } + + for i, tc := range testCases { + SetDefaultExternalTrafficPolicyIfNeeded(tc.inputService) + if !reflect.DeepEqual(tc.inputService, tc.expectedService) { + t.Errorf("%v: got unexpected service", i) + spew.Dump(tc) + } + } +} + +func TestClearExternalTrafficPolicy(t *testing.T) { + testCases := []struct { + inputService *api.Service + }{ + // First class fields cases. + { + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeClusterIP, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeGlobal, + }, + }, + }, + // Beta annotations cases. + { + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeClusterIP, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficLocal, + }, + }, + }, + }, + } + + for i, tc := range testCases { + ClearExternalTrafficPolicy(tc.inputService) + if _, ok := tc.inputService.Annotations[BetaAnnotationExternalTraffic]; ok || + tc.inputService.Spec.ExternalTrafficPolicy != "" { + t.Errorf("%v: failed to clear ExternalTrafficPolicy", i) + spew.Dump(tc) + } + } +} + +func TestSetServiceHealthCheckNodePort(t *testing.T) { + testCases := []struct { + inputService *api.Service + hcNodePort int32 + beta bool + }{ + // First class fields cases. + { + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeClusterIP, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeGlobal, + }, + }, + 30012, + false, + }, + { + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeClusterIP, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeGlobal, + }, + }, + 0, + false, + }, + // Beta annotations cases. + { + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeClusterIP, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficGlobal, + }, + }, + }, + 30012, + true, + }, + { + &api.Service{ + Spec: api.ServiceSpec{ + Type: api.ServiceTypeClusterIP, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficGlobal, + }, + }, + }, + 0, + true, + }, + } + + for i, tc := range testCases { + SetServiceHealthCheckNodePort(tc.inputService, tc.hcNodePort) + if !tc.beta { + if tc.inputService.Spec.HealthCheckNodePort != tc.hcNodePort { + t.Errorf("%v: got HealthCheckNodePort %v, want %v", i, tc.inputService.Spec.HealthCheckNodePort, tc.hcNodePort) + } + } else { + l, ok := tc.inputService.Annotations[BetaAnnotationHealthCheckNodePort] + if tc.hcNodePort == 0 { + if ok { + t.Errorf("%v: HealthCheckNodePort set, want it to be cleared", i) + } + } else { + if !ok { + t.Errorf("%v: HealthCheckNodePort unset, want %v", i, tc.hcNodePort) + } else if l != fmt.Sprintf("%v", tc.hcNodePort) { + t.Errorf("%v: got HealthCheckNodePort %v, want %v", i, l, tc.hcNodePort) + } + } + } + } +} diff --git a/pkg/api/types.go b/pkg/api/types.go index 9d0ab25f521..2345673da3d 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -2453,6 +2453,16 @@ const ( ServiceTypeExternalName ServiceType = "ExternalName" ) +// Service External Traffic Policy Type string +type ServiceExternalTrafficPolicyType string + +const ( + // ServiceExternalTrafficPolicyTypeLocal specifies local endpoints behavior. + ServiceExternalTrafficPolicyTypeLocal ServiceExternalTrafficPolicyType = "Local" + // ServiceExternalTrafficPolicyTypeGlobal specifies global (legacy) behavior. + ServiceExternalTrafficPolicyTypeGlobal ServiceExternalTrafficPolicyType = "Global" +) + // ServiceStatus represents the current status of a service type ServiceStatus struct { // LoadBalancer contains the current status of the load-balancer, @@ -2552,6 +2562,20 @@ type ServiceSpec struct { // cloud-provider does not support the feature." // +optional LoadBalancerSourceRanges []string + + // externalTrafficPolicy denotes if this Service desires to route external traffic to + // local endpoints only. This preserves Source IP and avoids a second hop for + // LoadBalancer and Nodeport type services. + // +optional + ExternalTrafficPolicy ServiceExternalTrafficPolicyType + + // healthCheckNodePort specifies the healthcheck nodePort for the service. + // If not specified, HealthCheckNodePort is created by the service api + // backend with the allocated nodePort. Will use user-specified nodePort value + // if specified by the client. Only effects when Type is set to LoadBalancer + // and ExternalTrafficPolicy is set to Local. + // +optional + HealthCheckNodePort int32 } type ServicePort struct { diff --git a/pkg/api/v1/generated.pb.go b/pkg/api/v1/generated.pb.go index fb5626bb438..cc65a7bd0be 100644 --- a/pkg/api/v1/generated.pb.go +++ b/pkg/api/v1/generated.pb.go @@ -8490,6 +8490,13 @@ func (m *ServiceSpec) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.ExternalName))) i += copy(dAtA[i:], m.ExternalName) + dAtA[i] = 0x5a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ExternalTrafficPolicy))) + i += copy(dAtA[i:], m.ExternalTrafficPolicy) + dAtA[i] = 0x60 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.HealthCheckNodePort)) return i, nil } @@ -11866,6 +11873,9 @@ func (m *ServiceSpec) Size() (n int) { } l = len(m.ExternalName) n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ExternalTrafficPolicy) + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.HealthCheckNodePort)) return n } @@ -14336,6 +14346,8 @@ func (this *ServiceSpec) String() string { `LoadBalancerIP:` + fmt.Sprintf("%v", this.LoadBalancerIP) + `,`, `LoadBalancerSourceRanges:` + fmt.Sprintf("%v", this.LoadBalancerSourceRanges) + `,`, `ExternalName:` + fmt.Sprintf("%v", this.ExternalName) + `,`, + `ExternalTrafficPolicy:` + fmt.Sprintf("%v", this.ExternalTrafficPolicy) + `,`, + `HealthCheckNodePort:` + fmt.Sprintf("%v", this.HealthCheckNodePort) + `,`, `}`, }, "") return s @@ -40836,6 +40848,54 @@ func (m *ServiceSpec) Unmarshal(dAtA []byte) error { } m.ExternalName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExternalTrafficPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExternalTrafficPolicy = ServiceExternalTrafficPolicyType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HealthCheckNodePort", wireType) + } + m.HealthCheckNodePort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.HealthCheckNodePort |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -43147,605 +43207,605 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 11175 bytes of a gzipped FileDescriptorProto + // 11238 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x8c, 0x24, 0xc7, 0x75, 0x98, 0x7a, 0x66, 0xbf, 0xe6, 0xed, 0xe7, 0xd5, 0xed, 0x1d, 0x97, 0x2b, 0xf2, 0xf6, 0xd8, 0x14, 0xe9, 0x23, 0x79, 0xdc, 0xd5, 0x1d, 0x49, 0xf1, 0x24, 0x2a, 0xb4, 0x76, 0x77, 0x76, 0xef, 0x56, 0xf7, 0x35, 0xac, 0xd9, 0xbb, 0xa3, 0x28, 0x46, 0x64, 0xdf, 0x74, 0xed, 0x6c, 0xf3, 0x7a, - 0xbb, 0x87, 0xdd, 0x3d, 0x7b, 0xb7, 0x52, 0x04, 0xd8, 0x8a, 0x20, 0x25, 0x80, 0x92, 0xc8, 0x70, - 0x04, 0x04, 0x4e, 0x00, 0x05, 0x06, 0xe2, 0x28, 0x9f, 0x8e, 0x22, 0xe8, 0xc3, 0xb0, 0x9c, 0x0f, - 0x27, 0x72, 0x64, 0x20, 0x71, 0x0c, 0x18, 0xb1, 0x1d, 0x18, 0x59, 0x5b, 0x2b, 0xc4, 0x3f, 0x02, - 0x24, 0x08, 0xe2, 0x7f, 0x9b, 0x20, 0x08, 0xea, 0xb3, 0xab, 0x7a, 0x66, 0xb6, 0x7b, 0x96, 0xb7, - 0x6b, 0x4a, 0xc8, 0xbf, 0x99, 0x7a, 0xaf, 0x5e, 0x7d, 0x74, 0xd5, 0xab, 0xf7, 0x5e, 0xbd, 0xf7, - 0x0a, 0xce, 0xdf, 0xbb, 0x14, 0xcf, 0x7b, 0xe1, 0xc2, 0xbd, 0xf6, 0x5d, 0x12, 0x05, 0x24, 0x21, - 0xf1, 0x42, 0xeb, 0x5e, 0x73, 0xc1, 0x69, 0x79, 0x0b, 0xdb, 0x17, 0x16, 0x9a, 0x24, 0x20, 0x91, - 0x93, 0x10, 0x77, 0xbe, 0x15, 0x85, 0x49, 0x88, 0x1e, 0xe3, 0xd8, 0xf3, 0x29, 0xf6, 0x7c, 0xeb, - 0x5e, 0x73, 0xde, 0x69, 0x79, 0xf3, 0xdb, 0x17, 0x66, 0x9f, 0x6f, 0x7a, 0xc9, 0x66, 0xfb, 0xee, - 0x7c, 0x23, 0xdc, 0x5a, 0x68, 0x86, 0xcd, 0x70, 0x81, 0x55, 0xba, 0xdb, 0xde, 0x60, 0xff, 0xd8, - 0x1f, 0xf6, 0x8b, 0x13, 0x9b, 0x7d, 0x51, 0x34, 0xed, 0xb4, 0xbc, 0x2d, 0xa7, 0xb1, 0xe9, 0x05, - 0x24, 0xda, 0x51, 0x8d, 0x47, 0x24, 0x0e, 0xdb, 0x51, 0x83, 0x64, 0xbb, 0x70, 0x60, 0xad, 0x78, - 0x61, 0x8b, 0x24, 0x4e, 0x97, 0x8e, 0xcf, 0x2e, 0xf4, 0xaa, 0x15, 0xb5, 0x83, 0xc4, 0xdb, 0xea, - 0x6c, 0xe6, 0x23, 0x79, 0x15, 0xe2, 0xc6, 0x26, 0xd9, 0x72, 0x3a, 0xea, 0xbd, 0xd0, 0xab, 0x5e, - 0x3b, 0xf1, 0xfc, 0x05, 0x2f, 0x48, 0xe2, 0x24, 0x3a, 0x68, 0x4c, 0x31, 0x89, 0xb6, 0x49, 0x94, - 0x0e, 0x88, 0x3c, 0x70, 0xb6, 0x5a, 0x3e, 0xe9, 0x36, 0xa6, 0x2b, 0xda, 0xa7, 0x7b, 0xde, 0x69, - 0x36, 0x23, 0xd2, 0x74, 0x92, 0x50, 0xab, 0xeb, 0xb4, 0xbc, 0x88, 0x34, 0xbd, 0x38, 0x89, 0x9c, - 0xc4, 0x0b, 0x83, 0x85, 0xed, 0x0b, 0x8e, 0xdf, 0xda, 0x74, 0x3a, 0x28, 0xd9, 0x7f, 0x60, 0xc1, - 0xd9, 0xc5, 0x3b, 0xf5, 0x15, 0xdf, 0x89, 0x13, 0xaf, 0xb1, 0xe4, 0x87, 0x8d, 0x7b, 0xf5, 0x24, - 0x8c, 0xc8, 0xed, 0xd0, 0x6f, 0x6f, 0x91, 0x3a, 0xfb, 0x10, 0xe8, 0x3c, 0x8c, 0x6c, 0xb3, 0xff, - 0x6b, 0xd5, 0x19, 0xeb, 0xac, 0x75, 0xae, 0xb2, 0x34, 0xf5, 0xc3, 0xdd, 0xb9, 0x0f, 0xec, 0xed, - 0xce, 0x8d, 0xdc, 0x16, 0xe5, 0x58, 0x61, 0xa0, 0xa7, 0x61, 0x68, 0x23, 0x5e, 0xdf, 0x69, 0x91, - 0x99, 0x12, 0xc3, 0x9d, 0x10, 0xb8, 0x43, 0xab, 0x75, 0x5a, 0x8a, 0x05, 0x14, 0x2d, 0x40, 0xa5, - 0xe5, 0x44, 0x89, 0x47, 0x3b, 0x38, 0x53, 0x3e, 0x6b, 0x9d, 0x1b, 0x5c, 0x3a, 0x21, 0x50, 0x2b, - 0x35, 0x09, 0xc0, 0x29, 0x0e, 0xed, 0x46, 0x44, 0x1c, 0xf7, 0x66, 0xe0, 0xef, 0xcc, 0x0c, 0x9c, - 0xb5, 0xce, 0x8d, 0xa4, 0xdd, 0xc0, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, 0x7b, 0x25, 0x18, 0x59, 0xdc, - 0xd8, 0xf0, 0x02, 0x2f, 0xd9, 0x41, 0x6f, 0xc3, 0x58, 0x10, 0xba, 0x44, 0xfe, 0x67, 0xa3, 0x18, - 0xbd, 0xf8, 0xec, 0xfc, 0x41, 0x8b, 0x7a, 0xfe, 0x86, 0x56, 0x63, 0x69, 0x6a, 0x6f, 0x77, 0x6e, - 0x4c, 0x2f, 0xc1, 0x06, 0x45, 0xf4, 0x26, 0x8c, 0xb6, 0x42, 0x57, 0x35, 0x50, 0x62, 0x0d, 0x3c, - 0x73, 0x70, 0x03, 0xb5, 0xb4, 0xc2, 0xd2, 0xe4, 0xde, 0xee, 0xdc, 0xa8, 0x56, 0x80, 0x75, 0x72, - 0xc8, 0x87, 0x49, 0xfa, 0x37, 0x48, 0x3c, 0xd5, 0x42, 0x99, 0xb5, 0xf0, 0x7c, 0x7e, 0x0b, 0x5a, - 0xa5, 0xa5, 0x93, 0x7b, 0xbb, 0x73, 0x93, 0x99, 0x42, 0x9c, 0x25, 0x6d, 0x7f, 0x16, 0x26, 0x16, - 0x93, 0xc4, 0x69, 0x6c, 0x12, 0x97, 0x7f, 0x5f, 0xf4, 0x22, 0x0c, 0x04, 0xce, 0x16, 0x11, 0x5f, - 0xff, 0xac, 0x98, 0xf6, 0x81, 0x1b, 0xce, 0x16, 0xd9, 0xdf, 0x9d, 0x9b, 0xba, 0x15, 0x78, 0xef, - 0xb6, 0xc5, 0x9a, 0xa1, 0x65, 0x98, 0x61, 0xa3, 0x8b, 0x00, 0x2e, 0xd9, 0xf6, 0x1a, 0xa4, 0xe6, - 0x24, 0x9b, 0x62, 0x35, 0x20, 0x51, 0x17, 0xaa, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x0b, 0x16, 0x54, - 0x16, 0xb7, 0x43, 0xcf, 0xad, 0x85, 0x6e, 0x8c, 0xda, 0x30, 0xd9, 0x8a, 0xc8, 0x06, 0x89, 0x54, - 0xd1, 0x8c, 0x75, 0xb6, 0x7c, 0x6e, 0xf4, 0xe2, 0xc5, 0x9c, 0x71, 0x9b, 0x95, 0x56, 0x82, 0x24, - 0xda, 0x59, 0x7a, 0x44, 0x34, 0x3d, 0x99, 0x81, 0xe2, 0x6c, 0x1b, 0xf6, 0x2f, 0x94, 0xe0, 0xd4, - 0xe2, 0x67, 0xdb, 0x11, 0xa9, 0x7a, 0xf1, 0xbd, 0xec, 0x56, 0x70, 0xbd, 0xf8, 0xde, 0x8d, 0x74, - 0x32, 0xd4, 0x1a, 0xac, 0x8a, 0x72, 0xac, 0x30, 0xd0, 0xf3, 0x30, 0x4c, 0x7f, 0xdf, 0xc2, 0x6b, - 0x62, 0xf4, 0x27, 0x05, 0xf2, 0x68, 0xd5, 0x49, 0x9c, 0x2a, 0x07, 0x61, 0x89, 0x83, 0xae, 0xc3, - 0x68, 0x83, 0x71, 0x8e, 0xe6, 0xf5, 0xd0, 0x25, 0xec, 0x0b, 0x57, 0x96, 0x9e, 0xa3, 0xe8, 0xcb, - 0x69, 0xf1, 0xfe, 0xee, 0xdc, 0x0c, 0xef, 0x9b, 0x20, 0xa1, 0xc1, 0xb0, 0x5e, 0x1f, 0xd9, 0x6a, - 0x23, 0x0e, 0x30, 0x4a, 0xd0, 0x65, 0x13, 0x9e, 0xd3, 0xf6, 0xd4, 0x20, 0xdb, 0x53, 0x63, 0x3d, - 0xf6, 0xd3, 0x3f, 0xb4, 0xc4, 0x9c, 0xac, 0x7a, 0xbe, 0xc9, 0x1e, 0x2e, 0x02, 0xc4, 0xa4, 0x11, - 0x91, 0x44, 0x9b, 0x15, 0xf5, 0x99, 0xeb, 0x0a, 0x82, 0x35, 0x2c, 0xba, 0xf9, 0xe3, 0x4d, 0x27, - 0x62, 0xab, 0x45, 0xcc, 0x8d, 0xda, 0xfc, 0x75, 0x09, 0xc0, 0x29, 0x8e, 0xb1, 0xf9, 0xcb, 0xb9, - 0x9b, 0xff, 0x37, 0x2d, 0x18, 0x5e, 0xf2, 0x02, 0xd7, 0x0b, 0x9a, 0xe8, 0x6d, 0x18, 0xa1, 0x67, - 0x83, 0xeb, 0x24, 0x8e, 0xd8, 0xf7, 0x1f, 0x96, 0x8b, 0x47, 0x67, 0xd5, 0x72, 0xf9, 0xc4, 0xf3, - 0x14, 0x9b, 0x2e, 0xa2, 0x9b, 0x77, 0xdf, 0x21, 0x8d, 0xe4, 0x3a, 0x49, 0x9c, 0x74, 0x38, 0x69, - 0x19, 0x56, 0x54, 0xd1, 0x2d, 0x18, 0x4a, 0x9c, 0xa8, 0x49, 0x12, 0xb1, 0xed, 0x73, 0x36, 0x25, - 0xa7, 0x81, 0xe9, 0x92, 0x23, 0x41, 0x83, 0xa4, 0x0c, 0x72, 0x9d, 0x11, 0xc1, 0x82, 0x98, 0xdd, - 0x80, 0xb1, 0x65, 0xa7, 0xe5, 0xdc, 0xf5, 0x7c, 0x2f, 0xf1, 0x48, 0x8c, 0x7e, 0x06, 0xca, 0x8e, - 0xeb, 0xb2, 0x0d, 0x50, 0x59, 0x3a, 0xb5, 0xb7, 0x3b, 0x57, 0x5e, 0x74, 0xdd, 0xfd, 0xdd, 0x39, - 0x50, 0x58, 0x3b, 0x98, 0x62, 0xa0, 0x67, 0x61, 0xc0, 0x8d, 0xc2, 0xd6, 0x4c, 0x89, 0x61, 0x9e, - 0xa6, 0x3b, 0xb5, 0x1a, 0x85, 0xad, 0x0c, 0x2a, 0xc3, 0xb1, 0x7f, 0x50, 0x02, 0xb4, 0x4c, 0x5a, - 0x9b, 0xab, 0x75, 0xe3, 0x9b, 0x9e, 0x83, 0x91, 0xad, 0x30, 0xf0, 0x92, 0x30, 0x8a, 0x45, 0x83, - 0x6c, 0x5d, 0x5c, 0x17, 0x65, 0x58, 0x41, 0xd1, 0x59, 0x18, 0x68, 0xa5, 0xdb, 0x7b, 0x4c, 0xb2, - 0x06, 0xb6, 0xb1, 0x19, 0x84, 0x62, 0xb4, 0x63, 0x12, 0x89, 0xf5, 0xac, 0x30, 0x6e, 0xc5, 0x24, - 0xc2, 0x0c, 0x92, 0xae, 0x20, 0xba, 0xb6, 0xc4, 0x6a, 0xcd, 0xac, 0x20, 0x0a, 0xc1, 0x1a, 0x16, - 0x7a, 0x0b, 0x2a, 0xfc, 0x1f, 0x26, 0x1b, 0x6c, 0xe9, 0xe6, 0x32, 0x85, 0x6b, 0x61, 0xc3, 0xf1, - 0xb3, 0x93, 0x3f, 0xce, 0x56, 0x9c, 0x24, 0x84, 0x53, 0x9a, 0xc6, 0x8a, 0x1b, 0xca, 0x5d, 0x71, - 0x7f, 0xcb, 0x02, 0xb4, 0xec, 0x05, 0x2e, 0x89, 0x8e, 0xe1, 0xe8, 0xec, 0x6f, 0x33, 0xfc, 0x11, - 0xed, 0x5a, 0xb8, 0xd5, 0x0a, 0x03, 0x12, 0x24, 0xcb, 0x61, 0xe0, 0xf2, 0xe3, 0xf4, 0x63, 0x30, - 0x90, 0xd0, 0xa6, 0x78, 0xb7, 0x9e, 0x96, 0x9f, 0x85, 0x36, 0xb0, 0xbf, 0x3b, 0x77, 0xba, 0xb3, - 0x06, 0xeb, 0x02, 0xab, 0x83, 0x3e, 0x0a, 0x43, 0x71, 0xe2, 0x24, 0xed, 0x58, 0x74, 0xf4, 0x09, - 0xd9, 0xd1, 0x3a, 0x2b, 0xdd, 0xdf, 0x9d, 0x9b, 0x54, 0xd5, 0x78, 0x11, 0x16, 0x15, 0xd0, 0x33, - 0x30, 0xbc, 0x45, 0xe2, 0xd8, 0x69, 0x4a, 0x06, 0x37, 0x29, 0xea, 0x0e, 0x5f, 0xe7, 0xc5, 0x58, - 0xc2, 0xd1, 0x93, 0x30, 0x48, 0xa2, 0x28, 0x8c, 0xc4, 0x8a, 0x18, 0x17, 0x88, 0x83, 0x2b, 0xb4, - 0x10, 0x73, 0x98, 0xfd, 0x9f, 0x2d, 0x98, 0x54, 0x7d, 0xe5, 0x6d, 0x1d, 0xc3, 0x96, 0x77, 0x01, - 0x1a, 0x72, 0x80, 0x31, 0xdb, 0x68, 0x5a, 0x1b, 0xdd, 0x97, 0x5f, 0xe7, 0x84, 0xa6, 0x6d, 0xa8, - 0xa2, 0x18, 0x6b, 0x74, 0xed, 0x7f, 0x67, 0xc1, 0xc9, 0xcc, 0xd8, 0xae, 0x79, 0x71, 0x82, 0xde, - 0xec, 0x18, 0xdf, 0x7c, 0xb1, 0xf1, 0xd1, 0xda, 0x6c, 0x74, 0x6a, 0xbd, 0xc8, 0x12, 0x6d, 0x6c, - 0x18, 0x06, 0xbd, 0x84, 0x6c, 0xc9, 0x61, 0x3d, 0x5f, 0x70, 0x58, 0xbc, 0x7f, 0xe9, 0x57, 0x5a, - 0xa3, 0x34, 0x30, 0x27, 0x65, 0xff, 0x6f, 0x0b, 0x2a, 0xcb, 0x61, 0xb0, 0xe1, 0x35, 0xaf, 0x3b, - 0xad, 0x63, 0xf8, 0x3e, 0x75, 0x18, 0x60, 0xd4, 0xf9, 0x10, 0x2e, 0xe4, 0x0d, 0x41, 0x74, 0x6c, - 0x9e, 0x9e, 0xa9, 0x5c, 0x58, 0x50, 0x6c, 0x8a, 0x16, 0x61, 0x46, 0x6c, 0xf6, 0x65, 0xa8, 0x28, - 0x04, 0x34, 0x05, 0xe5, 0x7b, 0x84, 0x4b, 0x92, 0x15, 0x4c, 0x7f, 0xa2, 0x69, 0x18, 0xdc, 0x76, - 0xfc, 0xb6, 0xd8, 0xbc, 0x98, 0xff, 0xf9, 0x58, 0xe9, 0x92, 0x65, 0xff, 0x80, 0xed, 0x40, 0xd1, - 0xc8, 0x4a, 0xb0, 0x2d, 0x98, 0xc3, 0x17, 0x2d, 0x98, 0xf6, 0xbb, 0x30, 0x25, 0x31, 0x27, 0x87, - 0x61, 0x67, 0x8f, 0x89, 0x6e, 0x4f, 0x77, 0x83, 0xe2, 0xae, 0xad, 0x51, 0x5e, 0x1f, 0xb6, 0xe8, - 0x82, 0x73, 0x7c, 0xd6, 0x75, 0x21, 0x03, 0xdc, 0x14, 0x65, 0x58, 0x41, 0xed, 0x3f, 0xb5, 0x60, - 0x5a, 0x8d, 0xe3, 0x2a, 0xd9, 0xa9, 0x13, 0x9f, 0x34, 0x92, 0x30, 0x7a, 0xbf, 0x8c, 0xe4, 0x71, - 0xfe, 0x4d, 0x38, 0x4f, 0x1a, 0x15, 0x04, 0xca, 0x57, 0xc9, 0x0e, 0xff, 0x40, 0xfa, 0x40, 0xcb, - 0x07, 0x0e, 0xf4, 0xd7, 0x2d, 0x18, 0x57, 0x03, 0x3d, 0x86, 0x2d, 0x77, 0xcd, 0xdc, 0x72, 0x3f, - 0x53, 0x70, 0xbd, 0xf6, 0xd8, 0x6c, 0x7f, 0xb3, 0x44, 0xd9, 0x86, 0xc0, 0xa9, 0x45, 0x21, 0x9d, - 0x24, 0xca, 0xf1, 0xdf, 0x27, 0x5f, 0xa9, 0xbf, 0xc1, 0x5e, 0x25, 0x3b, 0xeb, 0x21, 0x95, 0x26, - 0xba, 0x0f, 0xd6, 0xf8, 0xa8, 0x03, 0x07, 0x7e, 0xd4, 0xdf, 0x2e, 0xc1, 0x29, 0x35, 0x2d, 0xc6, - 0x29, 0xfd, 0x53, 0x39, 0x31, 0x17, 0x60, 0xd4, 0x25, 0x1b, 0x4e, 0xdb, 0x4f, 0x94, 0x36, 0x31, - 0xc8, 0xd5, 0xcc, 0x6a, 0x5a, 0x8c, 0x75, 0x9c, 0x3e, 0xe6, 0xf2, 0xeb, 0xa3, 0x8c, 0x9f, 0x27, - 0x0e, 0x5d, 0xf5, 0x54, 0xc2, 0xd3, 0xd4, 0xc3, 0x31, 0x5d, 0x3d, 0x14, 0xaa, 0xe0, 0x93, 0x30, - 0xe8, 0x6d, 0xd1, 0x33, 0xbf, 0x64, 0x1e, 0xe5, 0x6b, 0xb4, 0x10, 0x73, 0x18, 0x7a, 0x0a, 0x86, - 0x1b, 0xe1, 0xd6, 0x96, 0x13, 0xb8, 0x33, 0x65, 0x26, 0x73, 0x8e, 0x52, 0xb1, 0x60, 0x99, 0x17, - 0x61, 0x09, 0x43, 0x8f, 0xc1, 0x80, 0x13, 0x35, 0xe3, 0x99, 0x01, 0x86, 0x33, 0x42, 0x5b, 0x5a, - 0x8c, 0x9a, 0x31, 0x66, 0xa5, 0x54, 0x96, 0xbc, 0x1f, 0x46, 0xf7, 0xbc, 0xa0, 0x59, 0xf5, 0x22, - 0x26, 0x18, 0x6a, 0xb2, 0xe4, 0x1d, 0x05, 0xc1, 0x1a, 0x16, 0xaa, 0xc1, 0x60, 0x2b, 0x8c, 0x92, - 0x78, 0x66, 0x88, 0x4d, 0xfc, 0x73, 0xb9, 0xdb, 0x8f, 0x8f, 0xbb, 0x16, 0x46, 0x49, 0x3a, 0x14, - 0xfa, 0x2f, 0xc6, 0x9c, 0x10, 0x5a, 0x86, 0x32, 0x09, 0xb6, 0x67, 0x86, 0x19, 0xbd, 0x0f, 0x1d, - 0x4c, 0x6f, 0x25, 0xd8, 0xbe, 0xed, 0x44, 0x29, 0xbf, 0x5a, 0x09, 0xb6, 0x31, 0xad, 0x8d, 0x1a, - 0x50, 0x91, 0xc6, 0xb0, 0x78, 0x66, 0xa4, 0xc8, 0x52, 0xc4, 0x02, 0x1d, 0x93, 0x77, 0xdb, 0x5e, - 0x44, 0xb6, 0x48, 0x90, 0xc4, 0xa9, 0x62, 0x25, 0xa1, 0x31, 0x4e, 0xe9, 0xa2, 0x06, 0x8c, 0x71, - 0xf9, 0xf3, 0x7a, 0xd8, 0x0e, 0x92, 0x78, 0xa6, 0xc2, 0xba, 0x9c, 0x63, 0xb9, 0xb8, 0x9d, 0xd6, - 0x58, 0x9a, 0x16, 0xe4, 0xc7, 0xb4, 0xc2, 0x18, 0x1b, 0x44, 0xd1, 0x9b, 0x30, 0xee, 0x7b, 0xdb, - 0x24, 0x20, 0x71, 0x5c, 0x8b, 0xc2, 0xbb, 0x64, 0x06, 0xd8, 0x68, 0x9e, 0xcc, 0xd3, 0xe2, 0xc3, - 0xbb, 0x64, 0xe9, 0xc4, 0xde, 0xee, 0xdc, 0xf8, 0x35, 0xbd, 0x36, 0x36, 0x89, 0xa1, 0xb7, 0x60, - 0x82, 0x0a, 0xbb, 0x5e, 0x4a, 0x7e, 0xb4, 0x38, 0x79, 0xb4, 0xb7, 0x3b, 0x37, 0x81, 0x8d, 0xea, - 0x38, 0x43, 0x0e, 0xad, 0x43, 0xc5, 0xf7, 0x36, 0x48, 0x63, 0xa7, 0xe1, 0x93, 0x99, 0x31, 0x46, - 0x3b, 0x67, 0x73, 0x5e, 0x93, 0xe8, 0x5c, 0xc1, 0x50, 0x7f, 0x71, 0x4a, 0x08, 0xdd, 0x86, 0xd3, - 0x09, 0x89, 0xb6, 0xbc, 0x80, 0xd9, 0xe8, 0x84, 0xf4, 0xcb, 0x4c, 0x25, 0xe3, 0x6c, 0xd5, 0x9e, - 0x11, 0x13, 0x7b, 0x7a, 0xbd, 0x2b, 0x16, 0xee, 0x51, 0x1b, 0xdd, 0x84, 0x49, 0xb6, 0x9f, 0x6a, - 0x6d, 0xdf, 0xaf, 0x85, 0xbe, 0xd7, 0xd8, 0x99, 0x99, 0x60, 0x04, 0x9f, 0x92, 0x06, 0x90, 0x35, - 0x13, 0x4c, 0x15, 0xc3, 0xf4, 0x1f, 0xce, 0xd6, 0x46, 0x3e, 0x4c, 0xc6, 0xa4, 0xd1, 0x8e, 0xbc, - 0x64, 0x87, 0xae, 0x7d, 0xf2, 0x20, 0x99, 0x99, 0x2c, 0xa2, 0xe8, 0xd6, 0xcd, 0x4a, 0xdc, 0xfa, - 0x94, 0x29, 0xc4, 0x59, 0xd2, 0x94, 0x55, 0xc4, 0x89, 0xeb, 0x05, 0x33, 0x53, 0x8c, 0x03, 0xa9, - 0xfd, 0x55, 0xa7, 0x85, 0x98, 0xc3, 0x98, 0xfd, 0x80, 0xfe, 0xb8, 0x49, 0xb9, 0xf4, 0x09, 0x86, - 0x98, 0xda, 0x0f, 0x24, 0x00, 0xa7, 0x38, 0x54, 0x34, 0x48, 0x92, 0x9d, 0x19, 0xc4, 0x50, 0xd5, - 0x56, 0x5b, 0x5f, 0xff, 0x14, 0xa6, 0xe5, 0xe8, 0x36, 0x0c, 0x93, 0x60, 0x7b, 0x35, 0x0a, 0xb7, - 0x66, 0x4e, 0x16, 0xe1, 0x01, 0x2b, 0x1c, 0x99, 0x9f, 0x1f, 0xa9, 0x0a, 0x23, 0x8a, 0xb1, 0x24, - 0x86, 0x1e, 0xc0, 0x4c, 0x97, 0xaf, 0xc4, 0x3f, 0xca, 0x34, 0xfb, 0x28, 0x1f, 0x17, 0x75, 0x67, - 0xd6, 0x7b, 0xe0, 0xed, 0x1f, 0x00, 0xc3, 0x3d, 0xa9, 0xdb, 0x77, 0x61, 0x42, 0x31, 0x2a, 0xf6, - 0xbd, 0xd1, 0x1c, 0x0c, 0x52, 0x5e, 0x2c, 0x15, 0xfa, 0x0a, 0x9d, 0x54, 0xca, 0xa2, 0x63, 0xcc, - 0xcb, 0xd9, 0xa4, 0x7a, 0x9f, 0x25, 0x4b, 0x3b, 0x09, 0xe1, 0x8a, 0x5d, 0x59, 0x9b, 0x54, 0x09, - 0xc0, 0x29, 0x8e, 0xfd, 0x7f, 0xb9, 0x98, 0x94, 0x72, 0xc3, 0x02, 0x27, 0xc1, 0x79, 0x18, 0xd9, - 0x0c, 0xe3, 0x84, 0x62, 0xb3, 0x36, 0x06, 0x53, 0xc1, 0xe8, 0x8a, 0x28, 0xc7, 0x0a, 0x03, 0xbd, - 0x02, 0xe3, 0x0d, 0xbd, 0x01, 0x71, 0x8c, 0x9d, 0x12, 0x55, 0xcc, 0xd6, 0xb1, 0x89, 0x8b, 0x2e, - 0xc1, 0x08, 0xb3, 0x72, 0x37, 0x42, 0x5f, 0xa8, 0x90, 0xf2, 0x54, 0x1e, 0xa9, 0x89, 0xf2, 0x7d, - 0xed, 0x37, 0x56, 0xd8, 0x54, 0x11, 0xa7, 0x5d, 0x58, 0xab, 0x89, 0x03, 0x44, 0x29, 0xe2, 0x57, - 0x58, 0x29, 0x16, 0x50, 0xfb, 0x9f, 0x95, 0xb4, 0x59, 0xa6, 0x0a, 0x10, 0x41, 0x6f, 0xc0, 0xf0, - 0x7d, 0xc7, 0x4b, 0xbc, 0xa0, 0x29, 0xa4, 0x87, 0x17, 0x0a, 0x9e, 0x26, 0xac, 0xfa, 0x1d, 0x5e, - 0x95, 0x9f, 0x7c, 0xe2, 0x0f, 0x96, 0x04, 0x29, 0xed, 0xa8, 0x1d, 0x04, 0x94, 0x76, 0xa9, 0x7f, - 0xda, 0x98, 0x57, 0xe5, 0xb4, 0xc5, 0x1f, 0x2c, 0x09, 0xa2, 0x0d, 0x00, 0xb9, 0x96, 0x88, 0x2b, - 0xac, 0xcb, 0x1f, 0xe9, 0x87, 0xfc, 0xba, 0xaa, 0xbd, 0x34, 0x41, 0xcf, 0xda, 0xf4, 0x3f, 0xd6, - 0x28, 0xdb, 0x09, 0x13, 0xc2, 0x3a, 0xbb, 0x85, 0x3e, 0x4d, 0xb7, 0xb4, 0x13, 0x25, 0xc4, 0x5d, - 0x4c, 0xb2, 0x06, 0xfa, 0x83, 0x45, 0xec, 0x75, 0x6f, 0x8b, 0xe8, 0xdb, 0x5f, 0x10, 0xc1, 0x29, - 0x3d, 0xfb, 0xbb, 0x65, 0x98, 0xe9, 0xd5, 0x5d, 0xba, 0x24, 0xc9, 0x03, 0x2f, 0x59, 0xa6, 0x62, - 0x92, 0x65, 0x2e, 0xc9, 0x15, 0x51, 0x8e, 0x15, 0x06, 0x5d, 0x1b, 0xb1, 0xd7, 0x94, 0xca, 0xd2, - 0x60, 0xba, 0x36, 0xea, 0xac, 0x14, 0x0b, 0x28, 0xc5, 0x8b, 0x88, 0x13, 0x8b, 0xcb, 0x0d, 0x6d, - 0x0d, 0x61, 0x56, 0x8a, 0x05, 0x54, 0x37, 0x88, 0x0c, 0xe4, 0x18, 0x44, 0x8c, 0x29, 0x1a, 0x7c, - 0xb8, 0x53, 0x84, 0x3e, 0x03, 0xb0, 0xe1, 0x05, 0x5e, 0xbc, 0xc9, 0xa8, 0x0f, 0xf5, 0x4d, 0x5d, - 0x09, 0x59, 0xab, 0x8a, 0x0a, 0xd6, 0x28, 0xa2, 0x97, 0x60, 0x54, 0x6d, 0xcf, 0xb5, 0xea, 0xcc, - 0xb0, 0x69, 0x10, 0x4f, 0x79, 0x55, 0x15, 0xeb, 0x78, 0xf6, 0x3b, 0xd9, 0xf5, 0x22, 0x76, 0x85, - 0x36, 0xbf, 0x56, 0xd1, 0xf9, 0x2d, 0x1d, 0x3c, 0xbf, 0xf6, 0xef, 0x97, 0x61, 0xd2, 0x68, 0xac, - 0x1d, 0x17, 0xe0, 0x68, 0xaf, 0xd1, 0x03, 0xcb, 0x49, 0x88, 0xd8, 0x93, 0xe7, 0xfb, 0xd9, 0x34, - 0xfa, 0xf1, 0x46, 0xf7, 0x02, 0xa7, 0x84, 0x36, 0xa1, 0xe2, 0x3b, 0x31, 0x33, 0xa9, 0x10, 0xb1, - 0x17, 0xfb, 0x23, 0x9b, 0xaa, 0x1f, 0x4e, 0x9c, 0x68, 0xa7, 0x07, 0x6f, 0x25, 0x25, 0x4e, 0x4f, - 0x5b, 0x2a, 0xec, 0xc8, 0x1b, 0x35, 0xd5, 0x1d, 0x2a, 0x11, 0xed, 0x60, 0x0e, 0x43, 0x97, 0x60, - 0x2c, 0x22, 0x6c, 0xa5, 0x2c, 0x53, 0x79, 0x8e, 0x2d, 0xbd, 0xc1, 0x54, 0xf0, 0xc3, 0x1a, 0x0c, - 0x1b, 0x98, 0xa9, 0xdc, 0x3f, 0x74, 0x80, 0xdc, 0xff, 0x0c, 0x0c, 0xb3, 0x1f, 0x6a, 0x55, 0xa8, - 0x2f, 0xb4, 0xc6, 0x8b, 0xb1, 0x84, 0x67, 0x17, 0xd1, 0x48, 0xc1, 0x45, 0xf4, 0x2c, 0x4c, 0x54, - 0x1d, 0xb2, 0x15, 0x06, 0x2b, 0x81, 0xdb, 0x0a, 0xbd, 0x20, 0x41, 0x33, 0x30, 0xc0, 0xce, 0x13, - 0xbe, 0xdf, 0x07, 0x28, 0x05, 0x3c, 0x40, 0x65, 0x77, 0xfb, 0x8f, 0x4a, 0x30, 0x5e, 0x25, 0x3e, - 0x49, 0x08, 0xd7, 0x7b, 0x62, 0xb4, 0x0a, 0xa8, 0x19, 0x39, 0x0d, 0x52, 0x23, 0x91, 0x17, 0xba, - 0x75, 0xd2, 0x08, 0x03, 0x76, 0x11, 0x45, 0x0f, 0xc8, 0xd3, 0x7b, 0xbb, 0x73, 0xe8, 0x72, 0x07, - 0x14, 0x77, 0xa9, 0x81, 0x5c, 0x18, 0x6f, 0x45, 0xc4, 0xb0, 0x1b, 0x5a, 0xf9, 0xa2, 0x46, 0x4d, - 0xaf, 0xc2, 0xa5, 0x61, 0xa3, 0x08, 0x9b, 0x44, 0xd1, 0x27, 0x60, 0x2a, 0x8c, 0x5a, 0x9b, 0x4e, - 0x50, 0x25, 0x2d, 0x12, 0xb8, 0x54, 0x05, 0x10, 0xd6, 0x8e, 0xe9, 0xbd, 0xdd, 0xb9, 0xa9, 0x9b, - 0x19, 0x18, 0xee, 0xc0, 0x46, 0x6f, 0xc0, 0x89, 0x56, 0x14, 0xb6, 0x9c, 0x26, 0x5b, 0x32, 0x42, - 0x5a, 0xe1, 0xbc, 0xe9, 0xfc, 0xde, 0xee, 0xdc, 0x89, 0x5a, 0x16, 0xb8, 0xbf, 0x3b, 0x77, 0x92, - 0x4d, 0x19, 0x2d, 0x49, 0x81, 0xb8, 0x93, 0x8c, 0xfd, 0x2e, 0x9c, 0xaa, 0x86, 0xf7, 0x83, 0xfb, - 0x4e, 0xe4, 0x2e, 0xd6, 0xd6, 0x34, 0xe3, 0xc4, 0xeb, 0x52, 0xf9, 0xe5, 0x17, 0x7c, 0x39, 0x27, - 0x9b, 0x46, 0x83, 0xab, 0x1d, 0xab, 0x9e, 0x4f, 0x7a, 0x98, 0x43, 0xfe, 0x51, 0xc9, 0x68, 0x33, - 0xc5, 0x57, 0x77, 0x17, 0x56, 0xcf, 0xbb, 0x8b, 0x4f, 0xc3, 0xc8, 0x86, 0x47, 0x7c, 0x17, 0x93, - 0x0d, 0xf1, 0xb5, 0x2e, 0x14, 0xb9, 0xdc, 0x59, 0xa5, 0x75, 0xa4, 0x75, 0x8c, 0x2b, 0xd1, 0xab, - 0x82, 0x0c, 0x56, 0x04, 0x51, 0x1b, 0xa6, 0xa4, 0x1e, 0x26, 0xa1, 0x62, 0xb3, 0xbf, 0x50, 0x4c, - 0xcd, 0x33, 0x9b, 0x61, 0x9f, 0x17, 0x67, 0x08, 0xe2, 0x8e, 0x26, 0xa8, 0xfe, 0xbc, 0x45, 0x8f, - 0xba, 0x01, 0xb6, 0xf4, 0x99, 0xfe, 0xcc, 0x4c, 0x01, 0xac, 0xd4, 0xfe, 0x15, 0x0b, 0x1e, 0xe9, - 0x98, 0x2d, 0x61, 0x27, 0x39, 0xb2, 0x6f, 0x94, 0x35, 0x56, 0x94, 0xf2, 0x8d, 0x15, 0xf6, 0x4d, - 0x98, 0x5e, 0xd9, 0x6a, 0x25, 0x3b, 0x55, 0xcf, 0xbc, 0x72, 0x79, 0x19, 0x86, 0xb6, 0x88, 0xeb, - 0xb5, 0xb7, 0xc4, 0x67, 0x9d, 0x93, 0xe7, 0xc2, 0x75, 0x56, 0xba, 0xbf, 0x3b, 0x37, 0x5e, 0x4f, - 0xc2, 0xc8, 0x69, 0x12, 0x5e, 0x80, 0x05, 0xba, 0xfd, 0x23, 0x0b, 0x26, 0x25, 0x7f, 0x58, 0x74, - 0xdd, 0x88, 0xc4, 0x31, 0x9a, 0x85, 0x92, 0xd7, 0x12, 0x84, 0x40, 0x10, 0x2a, 0xad, 0xd5, 0x70, - 0xc9, 0x6b, 0xa1, 0x37, 0xa0, 0xc2, 0x6f, 0xea, 0xd2, 0xc5, 0xd1, 0xe7, 0xcd, 0x1f, 0xd3, 0x0d, - 0xd7, 0x25, 0x0d, 0x9c, 0x92, 0x93, 0x52, 0x32, 0x3b, 0x79, 0xca, 0xe6, 0xbd, 0xd1, 0x15, 0x51, - 0x8e, 0x15, 0x06, 0x3a, 0x07, 0x23, 0x41, 0xe8, 0xf2, 0xcb, 0x54, 0xbe, 0x4f, 0xd9, 0x92, 0xbb, - 0x21, 0xca, 0xb0, 0x82, 0xda, 0x5f, 0xb1, 0x60, 0x4c, 0x8e, 0xb1, 0xa0, 0xc0, 0x4e, 0x37, 0x49, - 0x2a, 0xac, 0xa7, 0x9b, 0x84, 0x0a, 0xdc, 0x0c, 0x62, 0xc8, 0xd9, 0xe5, 0x7e, 0xe4, 0x6c, 0xfb, - 0xd7, 0x4a, 0x30, 0x21, 0xbb, 0x53, 0x6f, 0xdf, 0x8d, 0x09, 0x15, 0x43, 0x2a, 0x0e, 0x9f, 0x7c, - 0x22, 0xd7, 0xd9, 0xf3, 0x79, 0xba, 0x98, 0xf1, 0xcd, 0x52, 0x31, 0x67, 0x51, 0xd2, 0xc1, 0x29, - 0x49, 0xb4, 0x0d, 0x27, 0x82, 0x30, 0x61, 0xc7, 0x9b, 0x82, 0x17, 0xbb, 0xe9, 0xc8, 0xb6, 0xf3, - 0xa8, 0x68, 0xe7, 0xc4, 0x8d, 0x2c, 0x3d, 0xdc, 0xd9, 0x04, 0xba, 0x29, 0x6d, 0x4c, 0x65, 0xd6, - 0xd6, 0xb3, 0xc5, 0xda, 0xea, 0x6d, 0x62, 0xb2, 0x7f, 0xcb, 0x82, 0x8a, 0x44, 0x3b, 0x8e, 0x2b, - 0xaf, 0x3b, 0x30, 0x1c, 0xb3, 0x4f, 0x24, 0xa7, 0xeb, 0x7c, 0xb1, 0x21, 0xf0, 0xef, 0x9a, 0x9e, - 0xe9, 0xfc, 0x7f, 0x8c, 0x25, 0x35, 0x66, 0x6c, 0x57, 0x03, 0x79, 0xdf, 0x19, 0xdb, 0x55, 0xcf, - 0x7a, 0xdf, 0x6c, 0x8d, 0x1b, 0xd6, 0x00, 0x2a, 0x98, 0xb6, 0x22, 0xb2, 0xe1, 0x3d, 0xc8, 0x0a, - 0xa6, 0x35, 0x56, 0x8a, 0x05, 0x14, 0x6d, 0xc0, 0x58, 0x43, 0x9a, 0xa3, 0x53, 0x16, 0xf2, 0xe1, - 0x82, 0xb6, 0x7f, 0x75, 0x8d, 0xc4, 0x5d, 0x93, 0x96, 0x35, 0x4a, 0xd8, 0xa0, 0x4b, 0xf9, 0x54, - 0x7a, 0x53, 0x5e, 0x2e, 0x68, 0xb8, 0x89, 0x48, 0x92, 0xb6, 0xd0, 0xf3, 0x92, 0xdc, 0xfe, 0x86, - 0x05, 0x43, 0xdc, 0x7e, 0x59, 0xcc, 0x08, 0xac, 0x5d, 0x90, 0xa5, 0xf3, 0x79, 0x9b, 0x16, 0x8a, - 0xfb, 0x32, 0x74, 0x07, 0x2a, 0xec, 0x07, 0xb3, 0xc5, 0x94, 0x8b, 0xf8, 0x69, 0xf1, 0xf6, 0xf5, - 0xae, 0xde, 0x96, 0x04, 0x70, 0x4a, 0xcb, 0xfe, 0x7e, 0x99, 0xb2, 0xbe, 0x14, 0xd5, 0x38, 0xdb, - 0xad, 0xe3, 0x38, 0xdb, 0x4b, 0x47, 0x7f, 0xb6, 0xbf, 0x0b, 0x93, 0x0d, 0xed, 0x82, 0x2e, 0xfd, - 0xe2, 0x17, 0x0b, 0x2e, 0x2b, 0xed, 0x56, 0x8f, 0xdb, 0xeb, 0x96, 0x4d, 0x72, 0x38, 0x4b, 0x1f, - 0x11, 0x18, 0xe3, 0xeb, 0x41, 0xb4, 0x37, 0xc0, 0xda, 0x5b, 0x28, 0xb2, 0xc2, 0xf4, 0xc6, 0xd8, - 0x2a, 0xae, 0x6b, 0x84, 0xb0, 0x41, 0xd6, 0xfe, 0xa5, 0x41, 0x18, 0x5c, 0xd9, 0x26, 0x41, 0x72, - 0x0c, 0xac, 0x6e, 0x0b, 0x26, 0xbc, 0x60, 0x3b, 0xf4, 0xb7, 0x89, 0xcb, 0xe1, 0x87, 0x3b, 0xde, - 0x4f, 0x8b, 0x46, 0x26, 0xd6, 0x0c, 0x62, 0x38, 0x43, 0xfc, 0x28, 0x2c, 0x05, 0xaf, 0xc1, 0x10, - 0x5f, 0x19, 0xc2, 0x4c, 0x90, 0x63, 0xcf, 0x67, 0x13, 0x2b, 0x76, 0x50, 0x6a, 0xcf, 0xe0, 0x57, - 0x09, 0x82, 0x10, 0x7a, 0x07, 0x26, 0x36, 0xbc, 0x28, 0x4e, 0xa8, 0xb2, 0x1f, 0x27, 0xce, 0x56, - 0xeb, 0x10, 0x36, 0x02, 0x35, 0x23, 0xab, 0x06, 0x25, 0x9c, 0xa1, 0x8c, 0x9a, 0x30, 0x4e, 0x55, - 0xd4, 0xb4, 0xa9, 0xe1, 0xbe, 0x9b, 0x52, 0x26, 0xc2, 0x6b, 0x3a, 0x21, 0x6c, 0xd2, 0xa5, 0x2c, - 0xa9, 0xc1, 0x54, 0xda, 0x11, 0x26, 0xdd, 0x28, 0x96, 0xc4, 0x75, 0x59, 0x0e, 0xa3, 0x9c, 0x8d, - 0x79, 0xca, 0x54, 0x4c, 0xce, 0x96, 0xfa, 0xc3, 0xd8, 0xdf, 0xa2, 0x67, 0x31, 0x9d, 0xc3, 0x63, - 0x38, 0xbe, 0xae, 0x98, 0xc7, 0xd7, 0x93, 0x05, 0xbe, 0x6c, 0x8f, 0xa3, 0xeb, 0x6d, 0x18, 0xd5, - 0x3e, 0x3c, 0x5a, 0x80, 0x4a, 0x43, 0x3a, 0x73, 0x08, 0x2e, 0xae, 0x44, 0x29, 0xe5, 0xe5, 0x81, - 0x53, 0x1c, 0x3a, 0x2f, 0x54, 0x04, 0xcd, 0xba, 0x7e, 0x51, 0x01, 0x15, 0x33, 0x88, 0xfd, 0x02, - 0xc0, 0xca, 0x03, 0xd2, 0x58, 0xe4, 0x2a, 0x9e, 0x76, 0xbf, 0x67, 0xf5, 0xbe, 0xdf, 0xb3, 0xbf, - 0x69, 0xc1, 0xc4, 0xea, 0xb2, 0x21, 0xd3, 0xcf, 0x03, 0x70, 0xd9, 0xf8, 0xce, 0x9d, 0x1b, 0xd2, - 0x7e, 0xcd, 0x8d, 0x8c, 0xaa, 0x14, 0x6b, 0x18, 0xe8, 0x51, 0x28, 0xfb, 0xed, 0x40, 0x88, 0xac, - 0xc3, 0x7b, 0xbb, 0x73, 0xe5, 0x6b, 0xed, 0x00, 0xd3, 0x32, 0xcd, 0xc7, 0xaa, 0x5c, 0xd8, 0xc7, - 0x2a, 0xdf, 0xdb, 0xf8, 0x6b, 0x65, 0x98, 0x5a, 0xf5, 0xc9, 0x03, 0xa3, 0xd7, 0x4f, 0xc3, 0x90, - 0x1b, 0x79, 0xdb, 0x24, 0xca, 0x0a, 0x02, 0x55, 0x56, 0x8a, 0x05, 0xb4, 0xb0, 0xdb, 0xd7, 0x5b, - 0x9d, 0x07, 0xf9, 0xd1, 0xb9, 0xbc, 0xe5, 0x8e, 0x19, 0x6d, 0xc0, 0x30, 0xbf, 0x0f, 0x8e, 0x67, - 0x06, 0xd9, 0x52, 0x7c, 0xe5, 0xe0, 0xce, 0x64, 0xe7, 0x67, 0x5e, 0xd8, 0x57, 0xb8, 0xc3, 0x8d, - 0xe2, 0x65, 0xa2, 0x14, 0x4b, 0xe2, 0xb3, 0x1f, 0x83, 0x31, 0x1d, 0xb3, 0x2f, 0xcf, 0x9b, 0xbf, - 0x6c, 0xc1, 0xc9, 0x55, 0x3f, 0x6c, 0xdc, 0xcb, 0xf8, 0xe5, 0xbd, 0x04, 0xa3, 0x74, 0x33, 0xc5, - 0x86, 0xd3, 0xaa, 0xe1, 0x9d, 0x2b, 0x40, 0x58, 0xc7, 0xd3, 0xaa, 0xdd, 0xba, 0xb5, 0x56, 0xed, - 0xe6, 0xd4, 0x2b, 0x40, 0x58, 0xc7, 0xb3, 0x7f, 0xc7, 0x82, 0xc7, 0x2f, 0x2f, 0xaf, 0xd4, 0x48, - 0x14, 0x7b, 0x71, 0x42, 0x82, 0xa4, 0xc3, 0xaf, 0x98, 0xca, 0x8c, 0xae, 0xd6, 0x95, 0x54, 0x66, - 0xac, 0xb2, 0x5e, 0x08, 0xe8, 0xfb, 0xc5, 0xb9, 0xfe, 0x1b, 0x16, 0x9c, 0xbc, 0xec, 0x25, 0x98, - 0xb4, 0xc2, 0xac, 0x2b, 0x70, 0x44, 0x5a, 0x61, 0xec, 0x25, 0x61, 0xb4, 0x93, 0x75, 0x05, 0xc6, - 0x0a, 0x82, 0x35, 0x2c, 0xde, 0xf2, 0xb6, 0x17, 0xd3, 0x9e, 0x96, 0x4c, 0x55, 0x17, 0x8b, 0x72, - 0xac, 0x30, 0xe8, 0xc0, 0x5c, 0x2f, 0x62, 0x22, 0xc3, 0x8e, 0xd8, 0xc1, 0x6a, 0x60, 0x55, 0x09, - 0xc0, 0x29, 0x8e, 0xfd, 0x77, 0x2c, 0x38, 0x75, 0xd9, 0x6f, 0xc7, 0x09, 0x89, 0x36, 0x62, 0xa3, - 0xb3, 0x2f, 0x40, 0x85, 0x48, 0xe1, 0x5e, 0xf4, 0x55, 0x1d, 0x1a, 0x4a, 0xea, 0xe7, 0x7e, 0xc8, - 0x0a, 0xaf, 0x80, 0xbb, 0x6b, 0x7f, 0xce, 0x99, 0xbf, 0x51, 0x82, 0xf1, 0x2b, 0xeb, 0xeb, 0xb5, - 0xcb, 0x24, 0x11, 0x5c, 0x32, 0xdf, 0x28, 0x85, 0x35, 0x8d, 0xfc, 0x20, 0xe1, 0xa7, 0x9d, 0x78, - 0xfe, 0x3c, 0x0f, 0x3c, 0x99, 0x5f, 0x0b, 0x92, 0x9b, 0x51, 0x3d, 0x89, 0xbc, 0xa0, 0xd9, 0x55, - 0x87, 0x97, 0xbc, 0xbc, 0xdc, 0x8b, 0x97, 0xa3, 0x17, 0x60, 0x88, 0x45, 0xbe, 0x48, 0xe1, 0xe3, - 0x83, 0x4a, 0x4e, 0x60, 0xa5, 0xfb, 0xbb, 0x73, 0x95, 0x5b, 0x78, 0x8d, 0xff, 0xc1, 0x02, 0x15, - 0xbd, 0x05, 0xa3, 0x9b, 0x49, 0xd2, 0xba, 0x42, 0x1c, 0x97, 0x44, 0x92, 0x4f, 0x9c, 0x3b, 0x98, - 0x4f, 0xd0, 0xe9, 0xe0, 0x15, 0xd2, 0xad, 0x95, 0x96, 0xc5, 0x58, 0xa7, 0x68, 0xd7, 0x01, 0x52, - 0xd8, 0x43, 0xd2, 0x41, 0xec, 0x9f, 0x2f, 0xc1, 0xf0, 0x15, 0x27, 0x70, 0x7d, 0x12, 0xa1, 0x55, - 0x18, 0x20, 0x0f, 0x48, 0x43, 0x1c, 0xe4, 0x39, 0x5d, 0x4f, 0x0f, 0x3b, 0x6e, 0x57, 0xa3, 0xff, - 0x31, 0xab, 0x8f, 0x30, 0x0c, 0xd3, 0x7e, 0x5f, 0x56, 0x5e, 0xe2, 0xcf, 0xe5, 0xcf, 0x82, 0x5a, - 0x14, 0xfc, 0xa4, 0x14, 0x45, 0x58, 0x12, 0x62, 0x16, 0xa8, 0x46, 0xab, 0x4e, 0xd9, 0x5b, 0x52, - 0x4c, 0xb3, 0x5b, 0x5f, 0xae, 0x71, 0x74, 0x41, 0x97, 0x5b, 0xa0, 0x64, 0x21, 0x4e, 0xc9, 0xd9, - 0xeb, 0x50, 0xa1, 0x1f, 0x7f, 0xd1, 0xf7, 0x9c, 0x83, 0xcd, 0x60, 0xcf, 0x41, 0x45, 0x1a, 0xa2, - 0x62, 0xe1, 0x72, 0xce, 0xa8, 0x4a, 0x3b, 0x55, 0x8c, 0x53, 0xb8, 0x7d, 0x09, 0xa6, 0xd9, 0x2d, - 0xaf, 0x93, 0x6c, 0x1a, 0x7b, 0x31, 0x77, 0xd1, 0xdb, 0xdf, 0x1e, 0x80, 0x13, 0x6b, 0xf5, 0xe5, - 0xba, 0x69, 0x91, 0xbc, 0x04, 0x63, 0xfc, 0xd8, 0xa7, 0x4b, 0xd9, 0xf1, 0x45, 0x7d, 0x75, 0x33, - 0xb1, 0xae, 0xc1, 0xb0, 0x81, 0x89, 0x1e, 0x87, 0xb2, 0xf7, 0x6e, 0x90, 0xf5, 0x15, 0x5c, 0x7b, - 0xed, 0x06, 0xa6, 0xe5, 0x14, 0x4c, 0x25, 0x08, 0xce, 0x3a, 0x15, 0x58, 0x49, 0x11, 0xaf, 0xc2, - 0x84, 0x17, 0x37, 0x62, 0x6f, 0x2d, 0xa0, 0x7c, 0xc5, 0x69, 0xc8, 0x4d, 0x91, 0x8a, 0xfc, 0xb4, - 0xab, 0x0a, 0x8a, 0x33, 0xd8, 0x1a, 0x1f, 0x1f, 0x2c, 0x2c, 0x85, 0xe4, 0x3a, 0xa1, 0x53, 0x01, - 0xab, 0xc5, 0x46, 0x17, 0x33, 0xcf, 0x23, 0x21, 0x60, 0xf1, 0x01, 0xc7, 0x58, 0xc2, 0xd0, 0x65, - 0x38, 0xd1, 0xd8, 0x74, 0x5a, 0x8b, 0xed, 0x64, 0xb3, 0xea, 0xc5, 0x8d, 0x70, 0x9b, 0x44, 0x3b, - 0x4c, 0x00, 0x1e, 0x49, 0x6d, 0x5a, 0x0a, 0xb0, 0x7c, 0x65, 0xb1, 0x46, 0x31, 0x71, 0x67, 0x1d, - 0x53, 0x20, 0x81, 0x23, 0x10, 0x48, 0x16, 0x61, 0x52, 0xb6, 0x5a, 0x27, 0x31, 0x3b, 0x22, 0x46, - 0x59, 0x3f, 0x55, 0x2c, 0x8f, 0x28, 0x56, 0xbd, 0xcc, 0xe2, 0xdb, 0xef, 0x40, 0x45, 0x79, 0xca, - 0x49, 0x07, 0x51, 0xab, 0x87, 0x83, 0x68, 0x3e, 0x73, 0x97, 0xb6, 0xf3, 0x72, 0x57, 0xdb, 0xf9, - 0x3f, 0xb1, 0x20, 0x75, 0xf5, 0x41, 0x18, 0x2a, 0xad, 0x90, 0xdd, 0xb3, 0x45, 0xf2, 0x42, 0xfb, - 0xa9, 0x9c, 0x3d, 0xcf, 0x79, 0x0e, 0x9f, 0x90, 0x9a, 0xac, 0x8b, 0x53, 0x32, 0xe8, 0x1a, 0x0c, - 0xb7, 0x22, 0x52, 0x4f, 0x58, 0x74, 0x47, 0x1f, 0x14, 0xf9, 0x42, 0xe0, 0x35, 0xb1, 0x24, 0x61, - 0xff, 0x0b, 0x0b, 0xe0, 0x9a, 0xb7, 0xe5, 0x25, 0xd8, 0x09, 0x9a, 0xe4, 0x18, 0x14, 0xeb, 0x1b, - 0x30, 0x10, 0xb7, 0x48, 0xa3, 0xd8, 0x4d, 0x69, 0xda, 0xb3, 0x7a, 0x8b, 0x34, 0xd2, 0xcf, 0x41, - 0xff, 0x61, 0x46, 0xc7, 0xfe, 0x1e, 0xc0, 0x44, 0x8a, 0x46, 0x95, 0x1b, 0xf4, 0xbc, 0x11, 0xd6, - 0xf0, 0x68, 0x26, 0xac, 0xa1, 0xc2, 0xb0, 0xb5, 0x48, 0x86, 0x04, 0xca, 0x5b, 0xce, 0x03, 0xa1, - 0x4b, 0xbd, 0x54, 0xb4, 0x43, 0xb4, 0xa5, 0xf9, 0xeb, 0xce, 0x03, 0x2e, 0xba, 0x3e, 0x27, 0x17, - 0xd2, 0x75, 0xe7, 0xc1, 0x3e, 0xbf, 0x0f, 0x65, 0xdc, 0x89, 0x2a, 0x6f, 0x5f, 0xf8, 0xe3, 0xf4, - 0x3f, 0x3b, 0x86, 0x68, 0x73, 0xac, 0x55, 0x2f, 0x10, 0xa6, 0xe0, 0x3e, 0x5b, 0xf5, 0x82, 0x6c, - 0xab, 0x5e, 0x50, 0xa0, 0x55, 0x8f, 0xf9, 0xff, 0x0e, 0x8b, 0x1b, 0x14, 0xe6, 0x3c, 0x39, 0x7a, - 0xf1, 0xa3, 0x7d, 0x35, 0x2d, 0xae, 0x62, 0x78, 0xf3, 0x0b, 0x52, 0x5e, 0x17, 0xa5, 0xb9, 0x5d, - 0x90, 0x4d, 0xa3, 0xbf, 0x6b, 0xc1, 0x84, 0xf8, 0x8d, 0xc9, 0xbb, 0x6d, 0x12, 0x27, 0x42, 0x2e, - 0xf8, 0xc4, 0x61, 0x7a, 0x23, 0x48, 0xf0, 0x4e, 0x7d, 0x44, 0xb2, 0x5f, 0x13, 0x98, 0xdb, 0xb7, - 0x4c, 0x7f, 0xd0, 0xf7, 0x2c, 0x98, 0xde, 0x72, 0x1e, 0xf0, 0x16, 0x79, 0x19, 0x76, 0x12, 0x2f, - 0x14, 0x0e, 0xa2, 0xab, 0xfd, 0xae, 0x93, 0x0e, 0x42, 0xbc, 0xbb, 0xd2, 0xf7, 0x6b, 0xba, 0x1b, - 0x4a, 0x6e, 0xa7, 0xbb, 0xf6, 0x70, 0x76, 0x03, 0x46, 0xe4, 0xc2, 0xec, 0xa2, 0x29, 0x55, 0x75, - 0xf1, 0x27, 0xc7, 0x2e, 0x31, 0x2f, 0xad, 0x8b, 0xf3, 0xaf, 0xb5, 0x9d, 0x20, 0xf1, 0x92, 0x1d, - 0x4d, 0xb3, 0x62, 0xed, 0x88, 0xa5, 0x78, 0xa4, 0xed, 0xbc, 0x03, 0x63, 0xfa, 0xba, 0x3b, 0xd2, - 0xb6, 0xde, 0x85, 0x93, 0x5d, 0x56, 0xd5, 0x91, 0x36, 0x79, 0x1f, 0x1e, 0xed, 0xb9, 0x3e, 0x8e, - 0xb2, 0x61, 0xfb, 0x37, 0x2c, 0x9d, 0x75, 0x1e, 0x83, 0xdd, 0xea, 0xba, 0x69, 0xb7, 0x3a, 0x57, - 0x74, 0x0f, 0xf5, 0x30, 0x5e, 0x6d, 0xe8, 0xdd, 0xa7, 0x47, 0x02, 0x5a, 0x87, 0x21, 0x9f, 0x96, - 0xc8, 0x6b, 0xc3, 0xf3, 0xfd, 0xec, 0xd2, 0x54, 0x02, 0x63, 0xe5, 0x31, 0x16, 0xb4, 0xec, 0xef, - 0x59, 0x30, 0xf0, 0xe7, 0x18, 0x74, 0xd5, 0x41, 0x5a, 0x64, 0x21, 0x98, 0xc7, 0xce, 0xfd, 0x95, - 0x07, 0x09, 0x09, 0x62, 0x26, 0xc6, 0xf7, 0x72, 0x7c, 0x18, 0xa5, 0x4d, 0x49, 0x3f, 0x96, 0x57, - 0x60, 0xdc, 0x77, 0xee, 0x12, 0x5f, 0xda, 0xdc, 0xb3, 0x4a, 0xef, 0x35, 0x1d, 0x88, 0x4d, 0x5c, - 0x5a, 0x79, 0x43, 0xbf, 0x92, 0x10, 0x42, 0x92, 0xaa, 0x6c, 0xdc, 0x57, 0x60, 0x13, 0x97, 0x6a, - 0x5d, 0xf7, 0x9d, 0xa4, 0xb1, 0x29, 0x14, 0x62, 0xd5, 0xdd, 0x3b, 0xb4, 0x10, 0x73, 0x18, 0x15, - 0xf6, 0xe4, 0x8a, 0xbd, 0x4d, 0x22, 0x26, 0xec, 0x71, 0xa1, 0x5a, 0x09, 0x7b, 0xd8, 0x04, 0xe3, - 0x2c, 0x3e, 0xfa, 0x18, 0x4c, 0xd0, 0xc9, 0x09, 0xdb, 0x89, 0xf4, 0xd2, 0x19, 0x64, 0x5e, 0x3a, - 0xcc, 0xc9, 0x7b, 0xdd, 0x80, 0xe0, 0x0c, 0xa6, 0xfd, 0x16, 0x9c, 0xbc, 0x16, 0x3a, 0xee, 0x92, - 0xe3, 0x3b, 0x41, 0x83, 0x44, 0x6b, 0x41, 0x33, 0xd7, 0x03, 0x40, 0xbf, 0xa5, 0x2f, 0xe5, 0xdd, - 0xd2, 0xdb, 0x11, 0x20, 0xbd, 0x01, 0xe1, 0x5f, 0xf6, 0x26, 0x0c, 0x7b, 0xbc, 0x29, 0xb1, 0x6c, - 0x2f, 0xe4, 0x49, 0xd0, 0x1d, 0x7d, 0xd4, 0xfc, 0xa5, 0x78, 0x01, 0x96, 0x24, 0xa9, 0xbe, 0xd5, - 0x4d, 0xe4, 0xce, 0x57, 0x94, 0xed, 0xbf, 0x6a, 0xc1, 0xe4, 0x8d, 0x4c, 0x54, 0xf0, 0xd3, 0x30, - 0xc4, 0xb3, 0x54, 0x64, 0xad, 0x54, 0x75, 0x56, 0x8a, 0x05, 0xf4, 0xa1, 0x1b, 0x49, 0x7e, 0xb1, - 0x04, 0x15, 0xe6, 0xa9, 0xdc, 0xa2, 0xba, 0xd3, 0xd1, 0x8b, 0xa9, 0xd7, 0x0d, 0x31, 0x35, 0x47, - 0x51, 0x57, 0x1d, 0xeb, 0x25, 0xa5, 0xa2, 0x5b, 0x2a, 0x5a, 0xb6, 0x90, 0x8e, 0x9e, 0x12, 0xe4, - 0x11, 0x95, 0x13, 0x66, 0x70, 0xad, 0x8c, 0xa4, 0x65, 0xf7, 0xe6, 0x0a, 0xf7, 0x7d, 0x77, 0x6f, - 0xae, 0x7a, 0xd6, 0x83, 0x39, 0xd5, 0xb4, 0xce, 0x33, 0xf6, 0xfd, 0xb3, 0xcc, 0xff, 0xd4, 0xf1, - 0xbd, 0xcf, 0x12, 0x15, 0x74, 0x3e, 0x27, 0xfc, 0x49, 0x45, 0xe9, 0x3e, 0xe3, 0x33, 0xe2, 0x1f, - 0xcf, 0x29, 0x90, 0x56, 0xb1, 0xaf, 0xc0, 0x64, 0x66, 0xea, 0xd0, 0x4b, 0x30, 0xd8, 0xda, 0x74, - 0x62, 0x92, 0x71, 0x05, 0x1a, 0xac, 0xd1, 0xc2, 0xfd, 0xdd, 0xb9, 0x09, 0x55, 0x81, 0x95, 0x60, - 0x8e, 0x6d, 0x7f, 0xb1, 0x04, 0x03, 0x37, 0x42, 0xf7, 0x38, 0x96, 0xda, 0x15, 0x63, 0xa9, 0x3d, - 0x9d, 0x9f, 0x91, 0xa4, 0xe7, 0x2a, 0xab, 0x65, 0x56, 0xd9, 0xb9, 0x02, 0xb4, 0x0e, 0x5e, 0x60, - 0x5b, 0x30, 0xca, 0x32, 0x9e, 0x08, 0x5f, 0xa8, 0x17, 0x0c, 0xcd, 0x6a, 0x2e, 0xa3, 0x59, 0x4d, - 0x6a, 0xa8, 0x9a, 0x7e, 0xf5, 0x0c, 0x0c, 0x0b, 0xdf, 0x9b, 0xac, 0xf7, 0xad, 0xc0, 0xc5, 0x12, - 0x6e, 0xff, 0xf3, 0x32, 0x18, 0x19, 0x56, 0xd0, 0x6f, 0x59, 0x30, 0x1f, 0xf1, 0x48, 0x26, 0xb7, - 0xda, 0x8e, 0xbc, 0xa0, 0x59, 0x6f, 0x6c, 0x12, 0xb7, 0xed, 0x7b, 0x41, 0x73, 0xad, 0x19, 0x84, - 0xaa, 0x78, 0xe5, 0x01, 0x69, 0xb4, 0x99, 0xa9, 0xbb, 0x70, 0x62, 0x17, 0x75, 0xef, 0x7c, 0x71, - 0x6f, 0x77, 0x6e, 0x1e, 0xf7, 0xd5, 0x0a, 0xee, 0xb3, 0x57, 0xe8, 0x0f, 0x2d, 0x58, 0xe0, 0x39, - 0x46, 0x8a, 0x8f, 0xa4, 0x90, 0x46, 0x5a, 0x93, 0x44, 0x53, 0x72, 0xeb, 0x24, 0xda, 0x5a, 0x7a, - 0x59, 0x4c, 0xf2, 0x42, 0xad, 0xbf, 0x56, 0x71, 0xbf, 0xdd, 0xb4, 0xff, 0x75, 0x19, 0xc6, 0xe9, - 0x7c, 0xa6, 0x79, 0x05, 0x5e, 0x32, 0x96, 0xc9, 0x13, 0x99, 0x65, 0x72, 0xc2, 0x40, 0x7e, 0x38, - 0x29, 0x05, 0x62, 0x38, 0xe1, 0x3b, 0x71, 0x72, 0x85, 0x38, 0x51, 0x72, 0x97, 0x38, 0xec, 0x7a, - 0x37, 0xeb, 0x3a, 0x52, 0xe0, 0xc6, 0x58, 0xd9, 0xbe, 0xae, 0x65, 0x89, 0xe1, 0x4e, 0xfa, 0x68, - 0x1b, 0x10, 0xbb, 0x4a, 0x8e, 0x9c, 0x20, 0xe6, 0x63, 0xf1, 0x84, 0x69, 0xbc, 0xbf, 0x56, 0x67, - 0x45, 0xab, 0xe8, 0x5a, 0x07, 0x35, 0xdc, 0xa5, 0x05, 0xcd, 0x59, 0x60, 0xb0, 0xa8, 0xb3, 0xc0, - 0x50, 0x8e, 0xdb, 0xfb, 0x97, 0x2c, 0x38, 0x49, 0x3f, 0x8b, 0xe9, 0x22, 0x1d, 0xa3, 0x10, 0x26, - 0xe9, 0xb2, 0xf3, 0x49, 0x22, 0xcb, 0xc4, 0xfe, 0xca, 0x91, 0xac, 0x4d, 0x3a, 0xa9, 0xf8, 0x76, - 0xd5, 0x24, 0x86, 0xb3, 0xd4, 0xed, 0x6f, 0x5a, 0xc0, 0x9c, 0x16, 0x8f, 0xe1, 0x30, 0xbb, 0x6c, - 0x1e, 0x66, 0x76, 0x3e, 0xc7, 0xe8, 0x71, 0x8e, 0xbd, 0x08, 0x53, 0x14, 0x5a, 0x8b, 0xc2, 0x07, - 0x3b, 0x52, 0xd0, 0xce, 0xb7, 0x66, 0x7f, 0xa9, 0xc4, 0xb7, 0x8d, 0x0a, 0xc9, 0x44, 0x5f, 0xb6, - 0x60, 0xa4, 0xe1, 0xb4, 0x9c, 0x06, 0xcf, 0x4f, 0x55, 0xc0, 0x3a, 0x63, 0xd4, 0x9f, 0x5f, 0x16, - 0x75, 0xb9, 0x65, 0xe1, 0xc3, 0x72, 0xe8, 0xb2, 0x38, 0xd7, 0x9a, 0xa0, 0x1a, 0x9f, 0xbd, 0x07, - 0xe3, 0x06, 0xb1, 0x23, 0x55, 0x43, 0xbf, 0x6c, 0x71, 0xa6, 0xaf, 0x54, 0x85, 0xfb, 0x70, 0x22, - 0xd0, 0xfe, 0x53, 0x76, 0x26, 0x25, 0xe3, 0xf9, 0xe2, 0x6c, 0x9d, 0x71, 0x41, 0xcd, 0x41, 0x33, - 0x43, 0x10, 0x77, 0xb6, 0x61, 0xff, 0xb2, 0x05, 0x8f, 0xe8, 0x88, 0x5a, 0x0c, 0x6d, 0x9e, 0xdd, - 0xb8, 0x0a, 0x23, 0x61, 0x8b, 0x44, 0x4e, 0xaa, 0x16, 0x9d, 0x93, 0xf3, 0x7f, 0x53, 0x94, 0xef, - 0xef, 0xce, 0x4d, 0xeb, 0xd4, 0x65, 0x39, 0x56, 0x35, 0x91, 0x0d, 0x43, 0x6c, 0x5e, 0x62, 0x11, - 0xfd, 0xcc, 0xf2, 0x35, 0xb1, 0x7b, 0xa9, 0x18, 0x0b, 0x88, 0xfd, 0x37, 0x2c, 0xbe, 0xdc, 0xf4, - 0xae, 0xa3, 0xcf, 0xc1, 0xd4, 0x16, 0xd5, 0xa0, 0x56, 0x1e, 0xb4, 0x22, 0x6e, 0xf5, 0x96, 0x33, - 0xf6, 0x52, 0xf1, 0x19, 0xd3, 0x86, 0xbb, 0x34, 0x23, 0x7a, 0x3f, 0x75, 0x3d, 0x43, 0x16, 0x77, - 0x34, 0x64, 0xff, 0xfd, 0x12, 0xdf, 0xb3, 0x4c, 0x86, 0x7b, 0x06, 0x86, 0x5b, 0xa1, 0xbb, 0xbc, - 0x56, 0xc5, 0x62, 0xae, 0x14, 0xd3, 0xa9, 0xf1, 0x62, 0x2c, 0xe1, 0xe8, 0x22, 0x00, 0x79, 0x90, - 0x90, 0x28, 0x70, 0x7c, 0x75, 0x93, 0xae, 0x44, 0xa5, 0x15, 0x05, 0xc1, 0x1a, 0x16, 0xad, 0xd3, - 0x8a, 0xc2, 0x6d, 0xcf, 0x65, 0xc1, 0x1f, 0x65, 0xb3, 0x4e, 0x4d, 0x41, 0xb0, 0x86, 0x45, 0xf5, - 0xd6, 0x76, 0x10, 0xf3, 0x63, 0xcc, 0xb9, 0x2b, 0xd2, 0x0b, 0x8d, 0xa4, 0x7a, 0xeb, 0x2d, 0x1d, - 0x88, 0x4d, 0x5c, 0x74, 0x15, 0x86, 0x12, 0x87, 0xdd, 0x0f, 0x0f, 0x16, 0x71, 0xb6, 0x59, 0xa7, - 0xb8, 0x7a, 0x3e, 0x27, 0x5a, 0x15, 0x0b, 0x12, 0xf6, 0x7f, 0xaa, 0x00, 0xa4, 0x52, 0x17, 0xfa, - 0x62, 0xe7, 0x86, 0xff, 0x48, 0x51, 0x91, 0xed, 0xe1, 0xed, 0x76, 0xf4, 0x55, 0x0b, 0x46, 0x1d, - 0xdf, 0x0f, 0x1b, 0x4e, 0xc2, 0xa6, 0xa7, 0x54, 0x94, 0xf5, 0x88, 0x9e, 0x2c, 0xa6, 0x75, 0x79, - 0x67, 0x5e, 0x90, 0x77, 0xb6, 0x1a, 0x24, 0xb7, 0x3f, 0x7a, 0x17, 0xd0, 0x87, 0xa5, 0xd4, 0xce, - 0xbf, 0xf0, 0x6c, 0x56, 0x6a, 0xaf, 0x30, 0x86, 0xab, 0x09, 0xec, 0xe8, 0x2d, 0x23, 0x1d, 0xcf, - 0x40, 0x91, 0x08, 0x5e, 0x43, 0x0e, 0xc9, 0xcb, 0xc4, 0x83, 0xde, 0xd0, 0xbd, 0xd2, 0x07, 0x8b, - 0x84, 0xc8, 0x6b, 0xe2, 0x70, 0x8e, 0x47, 0x7a, 0x02, 0x93, 0xae, 0x79, 0xf2, 0x0a, 0xcf, 0xba, - 0x0b, 0xf9, 0x2d, 0x64, 0x8e, 0xec, 0xf4, 0xac, 0xcd, 0x00, 0x70, 0xb6, 0x09, 0xf4, 0x06, 0x8f, - 0x19, 0x58, 0x0b, 0x36, 0x42, 0xe1, 0x5d, 0x77, 0xbe, 0xc0, 0x37, 0xdf, 0x89, 0x13, 0xb2, 0x45, - 0xeb, 0xa4, 0x87, 0xeb, 0x0d, 0x41, 0x05, 0x2b, 0x7a, 0x68, 0x1d, 0x86, 0x58, 0xc0, 0x56, 0x3c, - 0x33, 0x52, 0xc4, 0x12, 0x67, 0xc6, 0x29, 0xa7, 0xfb, 0x87, 0xfd, 0x8d, 0xb1, 0xa0, 0x85, 0xae, - 0xc8, 0x4c, 0x05, 0xf1, 0x5a, 0x70, 0x2b, 0x26, 0x2c, 0x53, 0x41, 0x65, 0xe9, 0x43, 0x69, 0xea, - 0x01, 0x5e, 0xde, 0x35, 0x21, 0xa1, 0x51, 0x93, 0x0a, 0x36, 0xe2, 0xbf, 0xcc, 0x73, 0x38, 0x03, - 0x45, 0x3a, 0x6a, 0x66, 0x45, 0x4c, 0x27, 0xfb, 0xb6, 0x49, 0x0c, 0x67, 0xa9, 0x1f, 0xeb, 0x91, - 0x3a, 0x1b, 0xc0, 0x54, 0x76, 0x53, 0x1e, 0xe9, 0x11, 0xfe, 0xe3, 0x01, 0x98, 0x30, 0x17, 0x07, - 0x5a, 0x80, 0x8a, 0x20, 0xa2, 0xf2, 0x9e, 0xa9, 0x3d, 0x70, 0x5d, 0x02, 0x70, 0x8a, 0xc3, 0x32, - 0xc0, 0xb1, 0xea, 0x9a, 0x5f, 0x55, 0x9a, 0x01, 0x4e, 0x41, 0xb0, 0x86, 0x45, 0x25, 0xe1, 0xbb, - 0x61, 0x98, 0xa8, 0x93, 0x40, 0xad, 0x9b, 0x25, 0x56, 0x8a, 0x05, 0x94, 0x9e, 0x00, 0xf7, 0xe8, - 0xc7, 0xf4, 0x4d, 0xab, 0xa2, 0x3a, 0x01, 0xae, 0xea, 0x40, 0x6c, 0xe2, 0xd2, 0x13, 0x2d, 0x8c, - 0xd9, 0x42, 0x14, 0xf2, 0x76, 0xea, 0xa7, 0x56, 0xe7, 0x41, 0x8c, 0x12, 0x8e, 0x3e, 0x05, 0x8f, - 0xa8, 0x98, 0x43, 0xcc, 0xad, 0xb4, 0xb2, 0xc5, 0x21, 0x43, 0x65, 0x7e, 0x64, 0xb9, 0x3b, 0x1a, - 0xee, 0x55, 0x1f, 0xbd, 0x0a, 0x13, 0x42, 0x56, 0x96, 0x14, 0x87, 0x4d, 0x77, 0x83, 0xab, 0x06, - 0x14, 0x67, 0xb0, 0x51, 0x15, 0xa6, 0x68, 0x09, 0x13, 0x52, 0x25, 0x05, 0x1e, 0x3b, 0xa9, 0x8e, - 0xfa, 0xab, 0x19, 0x38, 0xee, 0xa8, 0x81, 0x16, 0x61, 0x92, 0x0b, 0x2b, 0x54, 0x31, 0x64, 0xdf, - 0x41, 0xb8, 0xc4, 0xaa, 0x8d, 0x70, 0xd3, 0x04, 0xe3, 0x2c, 0x3e, 0xba, 0x04, 0x63, 0x4e, 0xd4, - 0xd8, 0xf4, 0x12, 0xd2, 0x48, 0xda, 0x11, 0xcf, 0x03, 0xa2, 0xf9, 0x6b, 0x2c, 0x6a, 0x30, 0x6c, - 0x60, 0xda, 0x9f, 0x85, 0x93, 0x5d, 0xfc, 0xef, 0xe9, 0xc2, 0x71, 0x5a, 0x9e, 0x1c, 0x53, 0xc6, - 0xe3, 0x6c, 0xb1, 0xb6, 0x26, 0x47, 0xa3, 0x61, 0xd1, 0xd5, 0xc9, 0xcc, 0xd3, 0x5a, 0x5a, 0x52, - 0xb5, 0x3a, 0x57, 0x25, 0x00, 0xa7, 0x38, 0xf6, 0x9f, 0x55, 0x40, 0xb3, 0xde, 0x14, 0xf0, 0x32, - 0xba, 0x04, 0x63, 0x32, 0xd3, 0xae, 0x96, 0xe1, 0x52, 0x0d, 0xf3, 0xb2, 0x06, 0xc3, 0x06, 0x26, - 0xed, 0x5b, 0x20, 0x6d, 0x52, 0x59, 0xff, 0x36, 0x65, 0xac, 0xc2, 0x29, 0x0e, 0x3a, 0x0f, 0x23, - 0x31, 0xf1, 0x37, 0xae, 0x79, 0xc1, 0x3d, 0xb1, 0xb0, 0x15, 0x67, 0xae, 0x8b, 0x72, 0xac, 0x30, - 0xd0, 0x12, 0x94, 0xdb, 0x9e, 0x2b, 0x96, 0xb2, 0x14, 0x1b, 0xca, 0xb7, 0xd6, 0xaa, 0xfb, 0xbb, - 0x73, 0x4f, 0xf4, 0x4a, 0x60, 0x4c, 0xf5, 0xf3, 0x78, 0x9e, 0x6e, 0x3f, 0x5a, 0xb9, 0x9b, 0x9d, - 0x7e, 0xa8, 0x4f, 0x3b, 0xfd, 0x45, 0x00, 0x31, 0x6a, 0xb9, 0x96, 0xcb, 0xe9, 0x57, 0xbb, 0xac, - 0x20, 0x58, 0xc3, 0xa2, 0x5a, 0x7e, 0x23, 0x22, 0x8e, 0x54, 0x84, 0xb9, 0x5f, 0xf8, 0xc8, 0xe1, - 0xb5, 0xfc, 0xe5, 0x2c, 0x31, 0xdc, 0x49, 0x1f, 0x85, 0x70, 0xc2, 0x15, 0x81, 0xad, 0x69, 0xa3, - 0x95, 0xfe, 0x9d, 0xd1, 0x99, 0x4b, 0x4d, 0x96, 0x10, 0xee, 0xa4, 0x8d, 0x3e, 0x03, 0xb3, 0xb2, - 0xb0, 0x33, 0xaa, 0x98, 0x6d, 0x97, 0xf2, 0xd2, 0x99, 0xbd, 0xdd, 0xb9, 0xd9, 0x6a, 0x4f, 0x2c, - 0x7c, 0x00, 0x05, 0xf4, 0x26, 0x0c, 0xb1, 0x7b, 0x9d, 0x78, 0x66, 0x94, 0x9d, 0x78, 0x2f, 0x16, - 0x09, 0x69, 0xa0, 0xab, 0x7e, 0x9e, 0xdd, 0x0e, 0x09, 0x67, 0xdd, 0xf4, 0xb2, 0x8c, 0x15, 0x62, - 0x41, 0x13, 0xb5, 0x60, 0xd4, 0x09, 0x82, 0x30, 0x71, 0xb8, 0x20, 0x36, 0x56, 0x44, 0x96, 0xd4, - 0x9a, 0x58, 0x4c, 0xeb, 0xf2, 0x76, 0x94, 0xff, 0x9f, 0x06, 0xc1, 0x7a, 0x13, 0xe8, 0x3e, 0x4c, - 0x86, 0xf7, 0x29, 0xc3, 0x94, 0x57, 0x1b, 0xf1, 0xcc, 0xb8, 0x39, 0xb0, 0x1c, 0x43, 0xad, 0x51, - 0x59, 0xe3, 0x64, 0x26, 0x51, 0x9c, 0x6d, 0x05, 0xcd, 0x1b, 0xe6, 0xea, 0x89, 0xd4, 0x25, 0x3d, - 0x35, 0x57, 0xeb, 0xd6, 0x69, 0x16, 0xb9, 0xce, 0xdd, 0x50, 0x19, 0x47, 0x98, 0xcc, 0x44, 0xae, - 0xa7, 0x20, 0xac, 0xe3, 0xcd, 0x7e, 0x14, 0x46, 0xb5, 0x89, 0xef, 0xc7, 0xf7, 0x79, 0xf6, 0x55, - 0x98, 0xca, 0x4e, 0x68, 0x5f, 0xbe, 0xd3, 0xff, 0xab, 0x04, 0x93, 0x5d, 0xee, 0x8d, 0xee, 0x79, - 0xcc, 0x7f, 0xdf, 0x60, 0x7d, 0x57, 0xbd, 0xc0, 0xc5, 0x0c, 0x62, 0x32, 0xb0, 0x52, 0x01, 0x06, - 0x26, 0xb9, 0x69, 0xb9, 0x27, 0x37, 0x15, 0x4c, 0x6b, 0xe0, 0xbd, 0x30, 0x2d, 0xf3, 0x9c, 0x18, - 0x2c, 0x74, 0x4e, 0x3c, 0x04, 0x46, 0x67, 0x1c, 0x35, 0xc3, 0x05, 0x8e, 0x9a, 0x6f, 0x94, 0x60, - 0x2a, 0xf5, 0x13, 0x17, 0xe9, 0xb7, 0x8f, 0xfe, 0x1a, 0x62, 0xdd, 0xb8, 0x86, 0xc8, 0xcb, 0xae, - 0x9d, 0xe9, 0x5f, 0xcf, 0x2b, 0x89, 0x37, 0x33, 0x57, 0x12, 0x2f, 0xf6, 0x49, 0xf7, 0xe0, 0xeb, - 0x89, 0xef, 0x96, 0xe0, 0x54, 0xb6, 0xca, 0xb2, 0xef, 0x78, 0x5b, 0xc7, 0x30, 0x5f, 0x9f, 0x32, - 0xe6, 0xeb, 0xe5, 0xfe, 0xc6, 0xc5, 0x3a, 0xd9, 0x73, 0xd2, 0x9c, 0xcc, 0xa4, 0x7d, 0xf4, 0x30, - 0xc4, 0x0f, 0x9e, 0xb9, 0xdf, 0xb3, 0xe0, 0xd1, 0xae, 0xf5, 0x8e, 0xc1, 0xf0, 0xfa, 0xba, 0x69, - 0x78, 0x7d, 0xe1, 0x10, 0xa3, 0xeb, 0x61, 0x89, 0xfd, 0x95, 0x72, 0x8f, 0x51, 0x31, 0xd3, 0xd4, - 0x4d, 0x18, 0x75, 0x1a, 0x0d, 0x12, 0xc7, 0xd7, 0x43, 0x57, 0xe5, 0xc0, 0x7a, 0x9e, 0x9d, 0x2d, - 0x69, 0xf1, 0xfe, 0xee, 0xdc, 0x6c, 0x96, 0x44, 0x0a, 0xc6, 0x3a, 0x05, 0x33, 0x3b, 0x5f, 0xe9, - 0x88, 0xb2, 0xf3, 0x5d, 0x04, 0xd8, 0x56, 0x5a, 0x6c, 0xd6, 0xe2, 0xa5, 0xe9, 0xb7, 0x1a, 0x16, - 0xfa, 0x8b, 0x4c, 0x22, 0xe4, 0x4e, 0x1a, 0x03, 0x66, 0xc8, 0x69, 0xce, 0xf7, 0xd3, 0x1d, 0x3e, - 0x78, 0x64, 0xab, 0xb2, 0x0e, 0x2a, 0x92, 0xe8, 0x13, 0x30, 0x15, 0xf3, 0xfc, 0x09, 0xcb, 0xbe, - 0x13, 0xb3, 0x00, 0x09, 0xc1, 0x4f, 0x59, 0x90, 0x6a, 0x3d, 0x03, 0xc3, 0x1d, 0xd8, 0xf6, 0x77, - 0xca, 0xf0, 0xc1, 0x03, 0x96, 0x2d, 0x5a, 0x34, 0x6f, 0x6d, 0x9f, 0xcb, 0xda, 0x7f, 0x66, 0xbb, - 0x56, 0x36, 0x0c, 0x42, 0x99, 0xaf, 0x5d, 0x7a, 0xcf, 0x5f, 0xfb, 0x6b, 0xba, 0xb5, 0x8e, 0xfb, - 0x6d, 0x5e, 0x3e, 0xf4, 0xc6, 0xfc, 0x49, 0x35, 0xd6, 0x7f, 0xc1, 0x82, 0x27, 0xba, 0x0e, 0xcb, - 0xf0, 0x12, 0x59, 0x80, 0x4a, 0x83, 0x16, 0x6a, 0xe1, 0x4c, 0x69, 0x1c, 0xa1, 0x04, 0xe0, 0x14, - 0xc7, 0x70, 0x06, 0x29, 0xe5, 0x3a, 0x83, 0xfc, 0xb6, 0x05, 0xd3, 0xd9, 0x4e, 0x1c, 0x03, 0xdf, - 0xaa, 0x9b, 0x7c, 0x6b, 0xbe, 0xbf, 0x8f, 0xdf, 0x83, 0x65, 0xfd, 0xb7, 0x09, 0x38, 0xdd, 0x71, - 0xea, 0xf1, 0x59, 0xfc, 0x39, 0x0b, 0x4e, 0x34, 0x99, 0xf4, 0xae, 0xc5, 0x8c, 0x89, 0x71, 0xe5, - 0x04, 0xda, 0x1d, 0x18, 0x6a, 0xc6, 0x75, 0x91, 0x0e, 0x14, 0xdc, 0xd9, 0x18, 0xfa, 0x8a, 0x05, - 0xd3, 0xce, 0xfd, 0xb8, 0xe3, 0x71, 0x18, 0xb1, 0x90, 0x5e, 0xcd, 0x31, 0x96, 0xe5, 0x3c, 0x2b, - 0xb3, 0x34, 0xb3, 0xb7, 0x3b, 0x37, 0xdd, 0x0d, 0x0b, 0x77, 0x6d, 0x95, 0x7e, 0xdf, 0x4d, 0x11, - 0x3b, 0x52, 0x2c, 0xfa, 0xb1, 0x5b, 0xa4, 0x09, 0x67, 0x6b, 0x12, 0x82, 0x15, 0x45, 0xf4, 0x36, - 0x54, 0x9a, 0x32, 0x4c, 0x2c, 0xcb, 0x36, 0x7b, 0x4c, 0x73, 0xb7, 0xa8, 0x32, 0xee, 0xbb, 0xaf, - 0x40, 0x38, 0x25, 0x8a, 0xae, 0x40, 0x39, 0xd8, 0x88, 0x45, 0x40, 0x76, 0x9e, 0x0f, 0x90, 0xe9, - 0x79, 0xc5, 0x63, 0x58, 0x6f, 0xac, 0xd6, 0x31, 0x25, 0x41, 0x29, 0x45, 0x77, 0x5d, 0x61, 0x25, - 0xce, 0xa1, 0x84, 0x97, 0xaa, 0x9d, 0x94, 0xf0, 0x52, 0x15, 0x53, 0x12, 0xa8, 0x06, 0x83, 0x2c, - 0x32, 0x45, 0x98, 0x80, 0x73, 0xa2, 0xf6, 0x3b, 0xe2, 0x6f, 0x78, 0x12, 0x49, 0x56, 0x8c, 0x39, - 0x21, 0xb4, 0x0e, 0x43, 0x0d, 0xf6, 0x0e, 0x82, 0xd0, 0xcd, 0xf3, 0xf2, 0x59, 0x74, 0xbc, 0x99, - 0xc0, 0xef, 0xbd, 0x78, 0x39, 0x16, 0xb4, 0x18, 0x55, 0xd2, 0xda, 0xdc, 0x88, 0x85, 0xf2, 0x9d, - 0x47, 0xb5, 0xe3, 0x45, 0x0b, 0x41, 0x95, 0x95, 0x63, 0x41, 0x0b, 0x55, 0xa1, 0xb4, 0xd1, 0x10, - 0x81, 0x2b, 0x39, 0xa6, 0x5f, 0x33, 0x20, 0x79, 0x69, 0x68, 0x6f, 0x77, 0xae, 0xb4, 0xba, 0x8c, - 0x4b, 0x1b, 0x0d, 0xf4, 0x3a, 0x0c, 0x6f, 0xf0, 0x10, 0x53, 0x91, 0x77, 0xf6, 0x42, 0x5e, 0x1c, - 0x6c, 0x47, 0x3c, 0x2a, 0x8f, 0xcf, 0x10, 0x00, 0x2c, 0xc9, 0xb1, 0x94, 0x7c, 0x2a, 0x68, 0x56, - 0x24, 0x9e, 0x9d, 0xef, 0x2f, 0xc8, 0x56, 0xe8, 0xa4, 0xaa, 0x14, 0x6b, 0x14, 0xe9, 0x9a, 0x77, - 0xe4, 0x93, 0x2e, 0x2c, 0xe9, 0x6c, 0xee, 0x9a, 0xef, 0xfa, 0x02, 0x0c, 0x5f, 0xf3, 0x0a, 0x84, - 0x53, 0xa2, 0xa8, 0x0d, 0xe3, 0xdb, 0x71, 0x6b, 0x93, 0xc8, 0xad, 0xcf, 0x32, 0xd1, 0x8e, 0x5e, - 0xfc, 0x78, 0x4e, 0x7a, 0x61, 0x51, 0xc5, 0x8b, 0x92, 0xb6, 0xe3, 0x77, 0x70, 0x30, 0x96, 0x03, - 0xed, 0xb6, 0x4e, 0x16, 0x9b, 0xad, 0xd0, 0x4f, 0xf2, 0x6e, 0x3b, 0xbc, 0xbb, 0x93, 0x10, 0x91, - 0xa9, 0x36, 0xe7, 0x93, 0xbc, 0xc6, 0x91, 0x3b, 0x3f, 0x89, 0x00, 0x60, 0x49, 0x4e, 0x4d, 0x19, - 0xe3, 0xc6, 0x53, 0x85, 0xa7, 0xac, 0x63, 0x0c, 0xe9, 0x94, 0x31, 0xee, 0x9b, 0x12, 0x65, 0x5c, - 0xb7, 0xb5, 0x19, 0x26, 0x61, 0x90, 0xe1, 0xfd, 0x27, 0x8a, 0x70, 0xdd, 0x5a, 0x97, 0x9a, 0x9d, - 0x5c, 0xb7, 0x1b, 0x16, 0xee, 0xda, 0x2a, 0x0a, 0x60, 0xa2, 0x15, 0x46, 0xc9, 0xfd, 0x30, 0x92, - 0xeb, 0x10, 0x15, 0xd2, 0x11, 0x8d, 0x3a, 0xa2, 0x6d, 0xe6, 0x86, 0x6b, 0x42, 0x70, 0x86, 0x3a, - 0xfd, 0x74, 0x71, 0xc3, 0xf1, 0xc9, 0xda, 0xcd, 0x99, 0x93, 0x45, 0x3e, 0x5d, 0x9d, 0x23, 0x77, - 0x7e, 0x3a, 0x01, 0xc0, 0x92, 0x9c, 0xfd, 0xcb, 0x43, 0x9d, 0x82, 0x03, 0x53, 0x0d, 0xfe, 0x7a, - 0xe7, 0x4d, 0xec, 0x27, 0xfa, 0xd7, 0x80, 0x1f, 0xe2, 0x9d, 0xec, 0x57, 0x2c, 0x38, 0xdd, 0xea, - 0x2a, 0x16, 0x88, 0xa3, 0xb7, 0x5f, 0x45, 0x9a, 0x4f, 0x8b, 0x4a, 0x28, 0xdd, 0x1d, 0x8e, 0x7b, - 0xb4, 0x99, 0x15, 0xa6, 0xcb, 0xef, 0x59, 0x98, 0xbe, 0x03, 0x23, 0x4c, 0xfa, 0x4b, 0xd3, 0xc5, - 0xf4, 0x99, 0x59, 0x85, 0x1d, 0xe2, 0xcb, 0x82, 0x04, 0x56, 0xc4, 0xe8, 0xc4, 0x3d, 0x9e, 0x1d, - 0x04, 0x26, 0x0c, 0x2c, 0xd2, 0x18, 0x72, 0x4d, 0x65, 0x55, 0xcc, 0xc4, 0xe3, 0xb5, 0x83, 0x90, - 0xf7, 0xf3, 0x10, 0xf0, 0xc1, 0x8d, 0xa1, 0x6a, 0x17, 0x55, 0x69, 0xc8, 0xbc, 0x76, 0xc9, 0x57, - 0x97, 0x8e, 0x57, 0xc4, 0xff, 0x07, 0x56, 0x17, 0x89, 0x94, 0xab, 0x65, 0x1f, 0x37, 0xd5, 0xb2, - 0xa7, 0xb3, 0x6a, 0x59, 0x87, 0x31, 0xc6, 0xd0, 0xc8, 0x8a, 0xa7, 0x61, 0x2d, 0x9a, 0x0f, 0xc7, - 0xf6, 0xe1, 0x6c, 0x1e, 0xbb, 0x63, 0xae, 0x58, 0xae, 0xba, 0x84, 0x4c, 0x5d, 0xb1, 0xdc, 0xb5, - 0x2a, 0x66, 0x90, 0xa2, 0x29, 0x15, 0xec, 0x9f, 0x2f, 0x41, 0xb9, 0x16, 0xba, 0xc7, 0x60, 0x5c, - 0xba, 0x6c, 0x18, 0x97, 0x9e, 0xca, 0x7d, 0xe2, 0xaf, 0xa7, 0x29, 0xe9, 0x66, 0xc6, 0x94, 0xf4, - 0x33, 0xf9, 0xa4, 0x0e, 0x36, 0x1c, 0x7d, 0xaf, 0x0c, 0xfa, 0x23, 0x85, 0xe8, 0x3f, 0x1c, 0xc6, - 0x43, 0xb7, 0x5c, 0xec, 0xdd, 0x42, 0xd1, 0x06, 0xf3, 0xe4, 0x92, 0x71, 0x7d, 0x3f, 0xb1, 0x8e, - 0xba, 0x77, 0x88, 0xd7, 0xdc, 0x4c, 0x88, 0x9b, 0x1d, 0xd8, 0xf1, 0x39, 0xea, 0xfe, 0xa9, 0x05, - 0x93, 0x99, 0xd6, 0x91, 0xdf, 0x2d, 0x20, 0xe8, 0x90, 0xe6, 0xa2, 0x13, 0xb9, 0x11, 0x44, 0xf3, - 0x00, 0xca, 0xea, 0x2f, 0x4d, 0x32, 0x4c, 0x3a, 0x55, 0xd7, 0x02, 0x31, 0xd6, 0x30, 0xd0, 0x4b, - 0x30, 0x9a, 0x84, 0xad, 0xd0, 0x0f, 0x9b, 0x3b, 0x57, 0x89, 0x4c, 0xf6, 0xa1, 0x6e, 0x4c, 0xd6, - 0x53, 0x10, 0xd6, 0xf1, 0xec, 0xef, 0x97, 0x21, 0xfb, 0xc4, 0xe5, 0xff, 0x5f, 0xa7, 0x3f, 0x39, - 0xeb, 0xf4, 0x0f, 0x2c, 0x98, 0xa2, 0xad, 0x33, 0xd7, 0x19, 0xe9, 0x50, 0xab, 0xde, 0x84, 0xb0, - 0x0e, 0x78, 0x13, 0xe2, 0x69, 0xca, 0xed, 0xdc, 0xb0, 0x9d, 0x08, 0x23, 0x92, 0xc6, 0xc4, 0x68, - 0x29, 0x16, 0x50, 0x81, 0x47, 0xa2, 0x48, 0x44, 0x1e, 0xe9, 0x78, 0x24, 0x8a, 0xb0, 0x80, 0xca, - 0x27, 0x23, 0x06, 0x7a, 0x3c, 0x19, 0xc1, 0xd2, 0x65, 0x09, 0x77, 0x0d, 0x21, 0x56, 0x68, 0xe9, - 0xb2, 0xa4, 0x1f, 0x47, 0x8a, 0x63, 0x7f, 0xab, 0x0c, 0x63, 0xb5, 0xd0, 0x4d, 0x3d, 0xe5, 0x5f, - 0x34, 0x3c, 0xe5, 0xcf, 0x66, 0x3c, 0xe5, 0xa7, 0x74, 0xdc, 0x87, 0xe3, 0x28, 0x2f, 0xd2, 0xaa, - 0xb1, 0x47, 0x4d, 0x0e, 0xe9, 0x24, 0x6f, 0xa4, 0x55, 0x53, 0x84, 0xb0, 0x49, 0xf7, 0xa7, 0xc9, - 0x39, 0xfe, 0xff, 0x58, 0x30, 0x51, 0x0b, 0x5d, 0xba, 0x40, 0x7f, 0x9a, 0x56, 0xa3, 0x9e, 0x8c, - 0x6d, 0xe8, 0x80, 0x64, 0x6c, 0xbf, 0x6a, 0xc1, 0x70, 0x2d, 0x74, 0x8f, 0xc1, 0xc0, 0xba, 0x6a, - 0x1a, 0x58, 0x9f, 0xc8, 0xe5, 0xbc, 0x3d, 0x6c, 0xaa, 0xdf, 0x29, 0xc3, 0x38, 0xed, 0x71, 0xd8, - 0x94, 0xdf, 0xcb, 0x98, 0x1b, 0xab, 0xc0, 0xdc, 0x50, 0x91, 0x30, 0xf4, 0xfd, 0xf0, 0x7e, 0xf6, - 0xdb, 0xad, 0xb2, 0x52, 0x2c, 0xa0, 0xe8, 0x3c, 0x8c, 0xb4, 0x22, 0xb2, 0xed, 0x85, 0xed, 0x38, - 0x1b, 0xc5, 0x58, 0x13, 0xe5, 0x58, 0x61, 0xa0, 0x17, 0x61, 0x2c, 0xf6, 0x82, 0x06, 0x91, 0xce, - 0x1c, 0x03, 0xcc, 0x99, 0x83, 0xe7, 0xbd, 0xd4, 0xca, 0xb1, 0x81, 0x85, 0xee, 0x40, 0x85, 0xfd, - 0x67, 0x3b, 0xa8, 0xff, 0x37, 0x1f, 0x78, 0x6e, 0x15, 0x49, 0x00, 0xa7, 0xb4, 0xd0, 0x45, 0x80, - 0x44, 0xba, 0x9d, 0xc4, 0x22, 0xb9, 0x8c, 0x92, 0x4b, 0x95, 0x43, 0x4a, 0x8c, 0x35, 0x2c, 0xf4, - 0x1c, 0x54, 0x12, 0xc7, 0xf3, 0xaf, 0x79, 0x01, 0x89, 0x85, 0xdb, 0x8e, 0xc8, 0x61, 0x2d, 0x0a, - 0x71, 0x0a, 0xa7, 0xe7, 0x3d, 0x8b, 0xa1, 0xe6, 0xef, 0xc9, 0x8c, 0x30, 0x6c, 0x76, 0xde, 0x5f, - 0x53, 0xa5, 0x58, 0xc3, 0xb0, 0x2f, 0xc1, 0xa9, 0x5a, 0xe8, 0xd6, 0xc2, 0x28, 0x59, 0x0d, 0xa3, - 0xfb, 0x4e, 0xe4, 0xca, 0xef, 0x37, 0x27, 0x53, 0x27, 0xd3, 0x33, 0x79, 0x90, 0xdb, 0x1c, 0x8d, - 0x54, 0xc8, 0x2f, 0xb0, 0x13, 0xbf, 0xcf, 0x10, 0x8c, 0xdf, 0x2f, 0x03, 0xaa, 0x31, 0xc7, 0x18, - 0xe3, 0xf9, 0xa1, 0x4d, 0x98, 0x88, 0xc9, 0x35, 0x2f, 0x68, 0x3f, 0x10, 0xa4, 0x8a, 0xc5, 0xbc, - 0xd4, 0x57, 0xf4, 0x3a, 0xdc, 0xd2, 0x61, 0x96, 0xe1, 0x0c, 0x5d, 0xfa, 0x65, 0xa3, 0x76, 0xb0, - 0x18, 0xdf, 0x8a, 0x49, 0x24, 0x9e, 0xdb, 0xf9, 0x28, 0xbb, 0x08, 0x94, 0x85, 0xfb, 0xbb, 0x73, - 0xe7, 0x72, 0xdc, 0x1b, 0x02, 0xef, 0x01, 0xc5, 0x5c, 0xab, 0xe2, 0x94, 0x16, 0x5d, 0x68, 0xec, - 0xcf, 0x8d, 0x30, 0xc0, 0x61, 0x98, 0xc8, 0xa5, 0xc9, 0x9e, 0x6a, 0xd0, 0xca, 0xb1, 0x81, 0x85, - 0x62, 0x40, 0x71, 0xbb, 0xd5, 0xf2, 0xd9, 0xbd, 0xa4, 0xe3, 0x5f, 0x8e, 0xc2, 0x76, 0x8b, 0xfb, - 0x52, 0x97, 0x97, 0x96, 0x29, 0x0f, 0xae, 0x77, 0x40, 0xf7, 0x77, 0xe7, 0x9e, 0xc9, 0xef, 0x20, - 0xc3, 0x5d, 0xab, 0xe2, 0x2e, 0xe4, 0x11, 0x86, 0xe1, 0x8d, 0x98, 0xfd, 0x16, 0x91, 0xda, 0x97, - 0x98, 0x21, 0xb4, 0xce, 0x8a, 0xfa, 0x23, 0x2f, 0x09, 0xd9, 0x9f, 0x67, 0xc7, 0x2c, 0x7b, 0x8d, - 0x25, 0x69, 0x47, 0x04, 0x6d, 0xc1, 0x78, 0x8b, 0x1d, 0xa5, 0x49, 0x14, 0xfa, 0x3e, 0x91, 0x52, - 0xee, 0xe1, 0x1c, 0x84, 0xf8, 0xfb, 0x0b, 0x3a, 0x39, 0x6c, 0x52, 0xb7, 0xff, 0xfb, 0x04, 0xe3, - 0x98, 0xe2, 0xd2, 0x79, 0x58, 0xb8, 0x02, 0x0b, 0x79, 0xf2, 0x43, 0x45, 0xde, 0x55, 0x4b, 0x4f, - 0x23, 0xe1, 0x58, 0x8c, 0x25, 0x15, 0xf4, 0x69, 0xe6, 0xe8, 0xce, 0xd9, 0x54, 0xf1, 0xd7, 0x22, - 0x39, 0xbe, 0xe1, 0xe4, 0x2e, 0x48, 0x60, 0x8d, 0x1c, 0xba, 0x06, 0xe3, 0xe2, 0xf1, 0x0e, 0x61, - 0x2c, 0x29, 0x1b, 0x8a, 0xfe, 0x38, 0xd6, 0x81, 0xfb, 0xd9, 0x02, 0x6c, 0x56, 0x46, 0x4d, 0x78, - 0x5c, 0x7b, 0x9c, 0xaa, 0x8b, 0x33, 0x1b, 0xe7, 0x7f, 0x4f, 0xec, 0xed, 0xce, 0x3d, 0xbe, 0x7e, - 0x10, 0x22, 0x3e, 0x98, 0x0e, 0xba, 0x09, 0xa7, 0x9c, 0x46, 0xe2, 0x6d, 0x93, 0x2a, 0x71, 0x5c, - 0xdf, 0x0b, 0x88, 0x19, 0xfb, 0xff, 0xe8, 0xde, 0xee, 0xdc, 0xa9, 0xc5, 0x6e, 0x08, 0xb8, 0x7b, - 0x3d, 0xf4, 0x71, 0xa8, 0xb8, 0x41, 0x2c, 0xe6, 0x60, 0xc8, 0x78, 0x8b, 0xad, 0x52, 0xbd, 0x51, - 0x57, 0xe3, 0x4f, 0xff, 0xe0, 0xb4, 0x02, 0x7a, 0x17, 0xc6, 0xf4, 0xe0, 0x22, 0xf1, 0x06, 0xe0, - 0xcb, 0x85, 0xb4, 0x78, 0x23, 0x22, 0x87, 0xdb, 0x11, 0x95, 0xd3, 0xa8, 0x11, 0xac, 0x63, 0x34, - 0x81, 0x3e, 0x09, 0x28, 0x26, 0xd1, 0xb6, 0xd7, 0x20, 0x8b, 0x0d, 0x96, 0xb2, 0x96, 0x59, 0x9a, - 0x46, 0x8c, 0xe8, 0x09, 0x54, 0xef, 0xc0, 0xc0, 0x5d, 0x6a, 0xa1, 0x2b, 0x94, 0xff, 0xe9, 0xa5, - 0xc2, 0xc7, 0x57, 0x8a, 0xa7, 0x33, 0x55, 0xd2, 0x8a, 0x48, 0xc3, 0x49, 0x88, 0x6b, 0x52, 0xc4, - 0x99, 0x7a, 0xf4, 0x74, 0x54, 0xaf, 0x12, 0x80, 0xe9, 0x99, 0xda, 0xf9, 0x32, 0x01, 0xd5, 0xf6, - 0x36, 0xc3, 0x38, 0xb9, 0x41, 0x92, 0xfb, 0x61, 0x74, 0x4f, 0xa4, 0xf9, 0x4a, 0xf3, 0xff, 0xa5, - 0x20, 0xac, 0xe3, 0x51, 0x49, 0x8e, 0x5d, 0xe1, 0xad, 0x55, 0xd9, 0xfd, 0xc8, 0x48, 0xba, 0x77, - 0xae, 0xf0, 0x62, 0x2c, 0xe1, 0x12, 0x75, 0xad, 0xb6, 0xcc, 0xee, 0x3a, 0x32, 0xa8, 0x6b, 0xb5, - 0x65, 0x2c, 0xe1, 0x28, 0xec, 0x7c, 0xf1, 0x6e, 0xa2, 0xc8, 0xbd, 0x53, 0xe7, 0x79, 0x52, 0xf0, - 0xd1, 0xbb, 0x07, 0x30, 0xa5, 0x5e, 0xdd, 0xe3, 0x99, 0xd0, 0xe2, 0x99, 0x49, 0xb6, 0x70, 0x0e, - 0x93, 0x50, 0x4d, 0x59, 0x17, 0xd7, 0x32, 0x34, 0x71, 0x47, 0x2b, 0x46, 0x0e, 0x8b, 0xa9, 0xdc, - 0x97, 0x26, 0x16, 0xa0, 0x12, 0xb7, 0xef, 0xba, 0xe1, 0x96, 0xe3, 0x05, 0xec, 0x42, 0x42, 0x7f, - 0xb7, 0x5f, 0x02, 0x70, 0x8a, 0x83, 0x6a, 0x30, 0xe2, 0x08, 0x45, 0x52, 0x5c, 0x1c, 0xe4, 0xc4, - 0xb8, 0x4b, 0xb5, 0x93, 0xdb, 0x78, 0xe5, 0x3f, 0xac, 0xa8, 0xa0, 0x57, 0x60, 0x5c, 0x84, 0x68, - 0x09, 0x57, 0xca, 0x93, 0xa6, 0x3b, 0x7f, 0x5d, 0x07, 0x62, 0x13, 0x17, 0x35, 0x61, 0x82, 0x52, - 0x49, 0x19, 0xe0, 0xcc, 0x74, 0x7f, 0x3c, 0x54, 0xcb, 0xe9, 0xad, 0x93, 0xc1, 0x19, 0xb2, 0xc8, - 0x85, 0xc7, 0x9c, 0x76, 0x12, 0x6e, 0xd1, 0x9d, 0x60, 0xee, 0x93, 0xf5, 0xf0, 0x1e, 0x09, 0x66, - 0x4e, 0xb1, 0x15, 0x78, 0x76, 0x6f, 0x77, 0xee, 0xb1, 0xc5, 0x03, 0xf0, 0xf0, 0x81, 0x54, 0xd0, - 0x5b, 0x30, 0x9a, 0x84, 0xbe, 0xf0, 0x90, 0x8e, 0x67, 0x4e, 0x17, 0xc9, 0xac, 0xb3, 0xae, 0x2a, - 0xe8, 0xc6, 0x14, 0x45, 0x04, 0xeb, 0x14, 0xd1, 0xdb, 0x30, 0x46, 0xbf, 0xfd, 0x75, 0xa7, 0xd5, - 0xf2, 0x82, 0x66, 0x3c, 0xf3, 0x48, 0x91, 0xd9, 0x52, 0x79, 0x23, 0xcd, 0xfd, 0xcb, 0x8a, 0x48, - 0x8c, 0x0d, 0x8a, 0xb3, 0x3f, 0x0b, 0x27, 0x3a, 0x98, 0x5e, 0x5f, 0x6e, 0xaa, 0xff, 0x71, 0x10, - 0x2a, 0xca, 0x72, 0x89, 0x16, 0x4c, 0x23, 0xf5, 0xa3, 0x59, 0x23, 0xf5, 0x08, 0x15, 0x14, 0x75, - 0xbb, 0xf4, 0x67, 0xba, 0xbc, 0xe4, 0xfe, 0x6c, 0xee, 0x2e, 0x2f, 0x1e, 0x39, 0xd6, 0xc7, 0x7b, - 0xf7, 0xa9, 0xf6, 0x3a, 0x70, 0xa0, 0xf6, 0x5a, 0xf0, 0x75, 0x42, 0xaa, 0xa7, 0xb6, 0x42, 0x77, - 0xad, 0x96, 0x7d, 0x7c, 0xab, 0x46, 0x0b, 0x31, 0x87, 0x31, 0xfd, 0x82, 0x9e, 0xda, 0x4c, 0xbf, - 0x18, 0x3e, 0xa4, 0x7e, 0x21, 0x09, 0xe0, 0x94, 0x16, 0xda, 0x86, 0x13, 0x0d, 0xf3, 0x2d, 0x35, - 0x15, 0x0f, 0xf6, 0x7c, 0x1f, 0x6f, 0x99, 0xb5, 0xb5, 0x87, 0x56, 0x96, 0xb3, 0xf4, 0x70, 0x67, - 0x13, 0xe8, 0x15, 0x18, 0x79, 0x37, 0x8c, 0xd9, 0xf5, 0x89, 0x38, 0xba, 0x64, 0xdc, 0xcd, 0xc8, - 0x6b, 0x37, 0xeb, 0xac, 0x7c, 0x7f, 0x77, 0x6e, 0xb4, 0x16, 0xba, 0xf2, 0x2f, 0x56, 0x15, 0xd0, - 0x17, 0x2c, 0x38, 0x65, 0xec, 0x64, 0xd5, 0x73, 0x38, 0x4c, 0xcf, 0x1f, 0x17, 0x2d, 0x9f, 0x5a, - 0xeb, 0x46, 0x13, 0x77, 0x6f, 0xca, 0xfe, 0xb7, 0xdc, 0x54, 0x2b, 0x8c, 0x37, 0x24, 0x6e, 0xfb, - 0xc7, 0xf1, 0xe8, 0xc1, 0x4d, 0xc3, 0xae, 0xf4, 0x10, 0x2e, 0x0b, 0xfe, 0xbd, 0xc5, 0x2e, 0x0b, - 0xd6, 0xc9, 0x56, 0xcb, 0x77, 0x92, 0xe3, 0xf0, 0x62, 0xfe, 0x34, 0x8c, 0x24, 0xa2, 0xb5, 0x62, - 0x2f, 0x36, 0x68, 0xdd, 0x63, 0x97, 0x28, 0xea, 0xe8, 0x93, 0xa5, 0x58, 0x11, 0xb4, 0xff, 0x25, - 0xff, 0x2a, 0x12, 0x72, 0x0c, 0x16, 0x91, 0x1b, 0xa6, 0x45, 0xe4, 0x99, 0xc2, 0x63, 0xe9, 0x61, - 0x19, 0xf9, 0xbe, 0x39, 0x02, 0xa6, 0xa1, 0xfc, 0xe4, 0xdc, 0x66, 0xd9, 0xbf, 0x64, 0xc1, 0x74, - 0x37, 0xb7, 0x02, 0x2a, 0xc2, 0x70, 0xfd, 0x48, 0xdd, 0xf3, 0xa9, 0x59, 0xbd, 0x2d, 0xca, 0xb1, - 0xc2, 0x28, 0x9c, 0x42, 0xbd, 0xbf, 0x14, 0x55, 0x37, 0xc1, 0x7c, 0x95, 0x0f, 0xbd, 0xca, 0x83, - 0x16, 0x2c, 0xf5, 0x6c, 0x5e, 0x7f, 0x01, 0x0b, 0xf6, 0xb7, 0x4b, 0x30, 0xcd, 0x8d, 0xed, 0x8b, - 0xdb, 0xa1, 0xe7, 0xd6, 0x42, 0x57, 0x84, 0x70, 0xb8, 0x30, 0xd6, 0xd2, 0xd4, 0xdb, 0x62, 0x29, - 0x6f, 0x74, 0x85, 0x38, 0x55, 0x29, 0xf4, 0x52, 0x6c, 0x50, 0xa5, 0xad, 0x90, 0x6d, 0xaf, 0xa1, - 0x6c, 0xb7, 0xa5, 0xbe, 0x4f, 0x06, 0xd5, 0xca, 0x8a, 0x46, 0x07, 0x1b, 0x54, 0x8f, 0xe0, 0xe5, - 0x13, 0xfb, 0xef, 0x59, 0xf0, 0x48, 0x8f, 0xb4, 0x38, 0xb4, 0xb9, 0xfb, 0xec, 0x82, 0x43, 0x3c, - 0xfb, 0xa8, 0x9a, 0xe3, 0xd7, 0x1e, 0x58, 0x40, 0xd1, 0x5d, 0x00, 0x7e, 0x6d, 0x41, 0xa5, 0xe9, - 0xec, 0x9d, 0x7a, 0xc1, 0xe4, 0x13, 0x5a, 0x5e, 0x02, 0xf5, 0xec, 0xbf, 0x46, 0xd5, 0xfe, 0x66, - 0x19, 0x06, 0xf9, 0xeb, 0xe2, 0x35, 0x18, 0xde, 0xe4, 0x69, 0x7a, 0xfb, 0xcb, 0x12, 0x9c, 0xaa, - 0x2f, 0xbc, 0x00, 0x4b, 0x32, 0xe8, 0x3a, 0x9c, 0xa4, 0x27, 0x8b, 0xe7, 0xf8, 0x55, 0xe2, 0x3b, - 0x3b, 0x52, 0x1f, 0xe6, 0xcf, 0x61, 0xc8, 0xbc, 0xed, 0x27, 0xd7, 0x3a, 0x51, 0x70, 0xb7, 0x7a, - 0xe8, 0xd5, 0x8e, 0xac, 0x7a, 0x3c, 0xfd, 0xb1, 0x92, 0x85, 0x0f, 0xce, 0xac, 0x47, 0x25, 0xf6, - 0x56, 0x87, 0xe6, 0xaf, 0x3d, 0xe2, 0x6c, 0x6a, 0xfb, 0x26, 0x2e, 0xf3, 0xa1, 0x68, 0x33, 0xdf, - 0x91, 0xf5, 0xcd, 0x88, 0xc4, 0x9b, 0xa1, 0xef, 0x8a, 0xf7, 0x47, 0x53, 0x1f, 0x8a, 0x0c, 0x1c, - 0x77, 0xd4, 0xa0, 0x54, 0x36, 0x1c, 0xcf, 0x6f, 0x47, 0x24, 0xa5, 0x32, 0x64, 0x52, 0x59, 0xcd, - 0xc0, 0x71, 0x47, 0x0d, 0xba, 0xb6, 0x4e, 0x89, 0x27, 0x2b, 0x65, 0x10, 0xb8, 0x60, 0x41, 0x9f, - 0x82, 0x61, 0x19, 0x0a, 0x50, 0x28, 0x57, 0x89, 0x70, 0x90, 0x50, 0xcf, 0x5f, 0x6a, 0xcf, 0xa3, - 0x89, 0x20, 0x00, 0x49, 0xef, 0x30, 0x4f, 0x23, 0xfe, 0x89, 0x05, 0x27, 0xbb, 0xb8, 0xb4, 0x71, - 0x96, 0xd6, 0xf4, 0xe2, 0x44, 0x3d, 0xce, 0xa0, 0xb1, 0x34, 0x5e, 0x8e, 0x15, 0x06, 0xdd, 0x2d, - 0x9c, 0x69, 0x66, 0x19, 0xa5, 0x70, 0x75, 0x11, 0xd0, 0xfe, 0x18, 0x25, 0x3a, 0x0b, 0x03, 0xed, - 0x98, 0x44, 0xf2, 0x9d, 0x42, 0xc9, 0xe7, 0x6f, 0xc5, 0x24, 0xc2, 0x0c, 0x42, 0xc5, 0xd6, 0xa6, - 0xb2, 0x08, 0x6a, 0x62, 0x2b, 0xb3, 0xee, 0x61, 0x0e, 0xb3, 0xbf, 0x56, 0x86, 0xc9, 0x8c, 0x6b, - 0x2b, 0xed, 0xc8, 0x56, 0x18, 0x78, 0x49, 0xa8, 0xf2, 0xc7, 0xf1, 0xa7, 0xd1, 0x48, 0x6b, 0xf3, - 0xba, 0x28, 0xc7, 0x0a, 0x03, 0x3d, 0x2d, 0x9f, 0xa6, 0xcd, 0x3e, 0x3a, 0xb1, 0x54, 0x35, 0x5e, - 0xa7, 0x2d, 0xfa, 0x60, 0xcc, 0x93, 0x30, 0xd0, 0x0a, 0xd5, 0x4b, 0xe3, 0xea, 0x7b, 0xe2, 0xa5, - 0x6a, 0x2d, 0x0c, 0x7d, 0xcc, 0x80, 0xe8, 0x29, 0x31, 0xfa, 0xcc, 0x0d, 0x0d, 0x76, 0xdc, 0x30, - 0xd6, 0xa6, 0xe0, 0x19, 0x18, 0xbe, 0x47, 0x76, 0x22, 0x2f, 0x68, 0x66, 0xef, 0xa7, 0xae, 0xf2, - 0x62, 0x2c, 0xe1, 0x66, 0x0e, 0xf6, 0xe1, 0x23, 0x7e, 0x14, 0x66, 0x24, 0xf7, 0x1c, 0xfc, 0x8e, - 0x05, 0x93, 0x2c, 0xa9, 0xaa, 0x48, 0x41, 0xe0, 0x85, 0xc1, 0x31, 0xc8, 0x18, 0x4f, 0xc2, 0x60, - 0x44, 0x1b, 0xcd, 0xbe, 0xea, 0xc0, 0x7a, 0x82, 0x39, 0x0c, 0x3d, 0x06, 0x03, 0xac, 0x0b, 0xf4, - 0x33, 0x8e, 0xf1, 0xdc, 0xed, 0x55, 0x27, 0x71, 0x30, 0x2b, 0x65, 0xd1, 0x64, 0x98, 0xb4, 0x7c, - 0x8f, 0x77, 0x3a, 0x35, 0xe8, 0xbe, 0xdf, 0xa2, 0xc9, 0xba, 0x76, 0xf2, 0x61, 0x45, 0x93, 0x75, - 0x27, 0x7e, 0xb0, 0x9c, 0xff, 0x3f, 0x4a, 0x70, 0xa6, 0x6b, 0xbd, 0xf4, 0xa6, 0x7b, 0xd5, 0xb8, - 0xe9, 0xbe, 0x98, 0xb9, 0xe9, 0xb6, 0x0f, 0xae, 0xfd, 0x70, 0xee, 0xbe, 0xbb, 0x5f, 0x49, 0x97, - 0x8f, 0xf1, 0x4a, 0x7a, 0xa0, 0xa8, 0x88, 0x33, 0x98, 0x23, 0xe2, 0xfc, 0x9e, 0x05, 0x8f, 0x76, - 0x9d, 0xb2, 0xf7, 0x5d, 0xf8, 0x5e, 0xd7, 0x5e, 0xf6, 0xd0, 0x4e, 0x7e, 0xb1, 0xdc, 0x63, 0x54, - 0x4c, 0x4f, 0x39, 0x47, 0xb9, 0x10, 0x03, 0xc6, 0x42, 0x78, 0x1b, 0xe3, 0x1c, 0x88, 0x97, 0x61, - 0x05, 0x45, 0xb1, 0x16, 0xfe, 0xc6, 0x3b, 0xb9, 0x72, 0xc8, 0x0d, 0x35, 0x6f, 0x5a, 0xe2, 0xf5, - 0xbc, 0x0a, 0xd9, 0xa0, 0xb8, 0x3b, 0x9a, 0xe6, 0x59, 0x3e, 0x8c, 0xe6, 0x39, 0xd6, 0x5d, 0xeb, - 0x44, 0x8b, 0x30, 0xb9, 0xe5, 0x05, 0xec, 0x2d, 0x59, 0x53, 0x7a, 0x52, 0x31, 0xc8, 0xd7, 0x4d, - 0x30, 0xce, 0xe2, 0xcf, 0xbe, 0x02, 0xe3, 0x87, 0xb7, 0xae, 0xfd, 0xa8, 0x0c, 0x1f, 0x3c, 0x80, - 0x29, 0xf0, 0xd3, 0xc1, 0xf8, 0x2e, 0xda, 0xe9, 0xd0, 0xf1, 0x6d, 0x6a, 0x30, 0xbd, 0xd1, 0xf6, - 0xfd, 0x1d, 0xe6, 0x27, 0x46, 0x5c, 0x89, 0x21, 0x84, 0x1a, 0xf5, 0x68, 0xfd, 0x6a, 0x17, 0x1c, - 0xdc, 0xb5, 0x26, 0xfa, 0x24, 0xa0, 0xf0, 0x2e, 0x4b, 0x3b, 0xec, 0xa6, 0x79, 0x23, 0xd8, 0x27, - 0x28, 0xa7, 0x5b, 0xf5, 0x66, 0x07, 0x06, 0xee, 0x52, 0x8b, 0xca, 0xa9, 0xec, 0xbd, 0x7b, 0xd5, - 0xad, 0x8c, 0x9c, 0x8a, 0x75, 0x20, 0x36, 0x71, 0xd1, 0x65, 0x38, 0xe1, 0x6c, 0x3b, 0x1e, 0x4f, - 0x23, 0x26, 0x09, 0x70, 0x41, 0x55, 0xd9, 0xaf, 0x16, 0xb3, 0x08, 0xb8, 0xb3, 0x0e, 0x6a, 0x19, - 0x06, 0x49, 0xfe, 0xe0, 0xc0, 0xc7, 0x0f, 0xb1, 0x82, 0x0b, 0x9b, 0x28, 0xed, 0xff, 0x62, 0xd1, - 0xa3, 0xaf, 0xcb, 0xb3, 0xa3, 0x74, 0x46, 0x94, 0x81, 0x4d, 0x0b, 0xe7, 0x53, 0x33, 0xb2, 0xac, - 0x03, 0xb1, 0x89, 0xcb, 0x97, 0x46, 0x9c, 0xba, 0xad, 0x1b, 0xd2, 0xa6, 0x88, 0x84, 0x55, 0x18, - 0x54, 0x82, 0x76, 0xbd, 0x6d, 0x2f, 0x0e, 0x23, 0xb1, 0x81, 0xfa, 0x74, 0x62, 0x4e, 0xf9, 0x65, - 0x95, 0x93, 0xc1, 0x92, 0x9e, 0xfd, 0xf5, 0x12, 0x8c, 0xcb, 0x16, 0x5f, 0x6b, 0x87, 0x89, 0x73, - 0x0c, 0x47, 0xfa, 0x6b, 0xc6, 0x91, 0xbe, 0x50, 0x2c, 0x30, 0x98, 0x75, 0xae, 0xe7, 0x51, 0xfe, - 0xa9, 0xcc, 0x51, 0x7e, 0xa1, 0x1f, 0xa2, 0x07, 0x1f, 0xe1, 0xff, 0xc6, 0x82, 0x13, 0x06, 0xfe, - 0x31, 0x9c, 0x24, 0x35, 0xf3, 0x24, 0x79, 0xae, 0x8f, 0xd1, 0xf4, 0x38, 0x41, 0xbe, 0x55, 0xca, - 0x8c, 0x82, 0x9d, 0x1c, 0x9f, 0x83, 0x81, 0x4d, 0x27, 0x72, 0x8b, 0xe5, 0xd4, 0xec, 0xa8, 0x3e, - 0x7f, 0xc5, 0x89, 0x5c, 0xce, 0xff, 0xcf, 0xab, 0x47, 0xd1, 0x9c, 0xc8, 0xcd, 0x8d, 0xe6, 0x60, - 0x8d, 0xa2, 0x4b, 0x30, 0x14, 0x37, 0xc2, 0x96, 0xf2, 0x77, 0x3d, 0xcb, 0x1f, 0x4c, 0xa3, 0x25, - 0xfb, 0xbb, 0x73, 0xc8, 0x6c, 0x8e, 0x16, 0x63, 0x81, 0x3f, 0xdb, 0x84, 0x8a, 0x6a, 0xfa, 0x48, - 0x3d, 0xfe, 0xff, 0x6b, 0x19, 0x4e, 0x76, 0x59, 0x2b, 0xe8, 0xf3, 0xc6, 0xbc, 0xbd, 0xd2, 0xf7, - 0x62, 0x7b, 0x8f, 0x33, 0xf7, 0x79, 0xa6, 0x29, 0xb9, 0x62, 0x75, 0x1c, 0xa2, 0xf9, 0x5b, 0x31, - 0xc9, 0x36, 0x4f, 0x8b, 0xf2, 0x9b, 0xa7, 0xcd, 0x1e, 0xdb, 0xf4, 0xd3, 0x86, 0x54, 0x4f, 0x8f, - 0xf4, 0x3b, 0xff, 0x95, 0x01, 0x98, 0xee, 0x96, 0x81, 0x00, 0x7d, 0xc9, 0xca, 0x3c, 0x9c, 0xf1, + 0xbb, 0x87, 0xdd, 0x3d, 0x7b, 0xb7, 0x52, 0x04, 0xd8, 0x8a, 0x20, 0x39, 0x80, 0x92, 0xc8, 0x70, + 0x04, 0x04, 0x4e, 0x00, 0x05, 0x06, 0xe2, 0x28, 0x9f, 0x8e, 0x22, 0xe8, 0xc3, 0xb0, 0x9c, 0x20, + 0x4e, 0xe4, 0xc8, 0x40, 0xe2, 0x18, 0x30, 0x62, 0x3b, 0x30, 0xb2, 0xb6, 0x56, 0x88, 0x7f, 0x04, + 0x48, 0x10, 0xc4, 0xff, 0x36, 0x41, 0x10, 0xd4, 0x67, 0x57, 0xf5, 0xcc, 0x6c, 0xf7, 0x2c, 0x6f, + 0xd7, 0x94, 0x90, 0x7f, 0x33, 0xf5, 0x5e, 0xbd, 0xfa, 0xe8, 0xaa, 0x57, 0xef, 0xbd, 0x7a, 0xef, + 0x15, 0x9c, 0xbf, 0x77, 0x29, 0x9e, 0xf7, 0xc2, 0x85, 0x7b, 0xed, 0xbb, 0x24, 0x0a, 0x48, 0x42, + 0xe2, 0x85, 0xd6, 0xbd, 0xe6, 0x82, 0xd3, 0xf2, 0x16, 0xb6, 0x2f, 0x2c, 0x34, 0x49, 0x40, 0x22, + 0x27, 0x21, 0xee, 0x7c, 0x2b, 0x0a, 0x93, 0x10, 0x3d, 0xc6, 0xb1, 0xe7, 0x53, 0xec, 0xf9, 0xd6, + 0xbd, 0xe6, 0xbc, 0xd3, 0xf2, 0xe6, 0xb7, 0x2f, 0xcc, 0x3e, 0xdf, 0xf4, 0x92, 0xcd, 0xf6, 0xdd, + 0xf9, 0x46, 0xb8, 0xb5, 0xd0, 0x0c, 0x9b, 0xe1, 0x02, 0xab, 0x74, 0xb7, 0xbd, 0xc1, 0xfe, 0xb1, + 0x3f, 0xec, 0x17, 0x27, 0x36, 0xfb, 0xa2, 0x68, 0xda, 0x69, 0x79, 0x5b, 0x4e, 0x63, 0xd3, 0x0b, + 0x48, 0xb4, 0xa3, 0x1a, 0x8f, 0x48, 0x1c, 0xb6, 0xa3, 0x06, 0xc9, 0x76, 0xe1, 0xc0, 0x5a, 0xf1, + 0xc2, 0x16, 0x49, 0x9c, 0x2e, 0x1d, 0x9f, 0x5d, 0xe8, 0x55, 0x2b, 0x6a, 0x07, 0x89, 0xb7, 0xd5, + 0xd9, 0xcc, 0x47, 0xf2, 0x2a, 0xc4, 0x8d, 0x4d, 0xb2, 0xe5, 0x74, 0xd4, 0x7b, 0xa1, 0x57, 0xbd, + 0x76, 0xe2, 0xf9, 0x0b, 0x5e, 0x90, 0xc4, 0x49, 0x74, 0xd0, 0x98, 0x62, 0x12, 0x6d, 0x93, 0x28, + 0x1d, 0x10, 0x79, 0xe0, 0x6c, 0xb5, 0x7c, 0xd2, 0x6d, 0x4c, 0x57, 0xb4, 0x4f, 0xf7, 0xbc, 0xd3, + 0x6c, 0x46, 0xa4, 0xe9, 0x24, 0xa1, 0x56, 0xd7, 0x69, 0x79, 0x11, 0x69, 0x7a, 0x71, 0x12, 0x39, + 0x89, 0x17, 0x06, 0x0b, 0xdb, 0x17, 0x1c, 0xbf, 0xb5, 0xe9, 0x74, 0x50, 0xb2, 0xff, 0xd0, 0x82, + 0xb3, 0x8b, 0x77, 0xea, 0x2b, 0xbe, 0x13, 0x27, 0x5e, 0x63, 0xc9, 0x0f, 0x1b, 0xf7, 0xea, 0x49, + 0x18, 0x91, 0xdb, 0xa1, 0xdf, 0xde, 0x22, 0x75, 0xf6, 0x21, 0xd0, 0x79, 0x18, 0xd9, 0x66, 0xff, + 0xd7, 0xaa, 0x33, 0xd6, 0x59, 0xeb, 0x5c, 0x65, 0x69, 0xea, 0x87, 0xbb, 0x73, 0x1f, 0xd8, 0xdb, + 0x9d, 0x1b, 0xb9, 0x2d, 0xca, 0xb1, 0xc2, 0x40, 0x4f, 0xc3, 0xd0, 0x46, 0xbc, 0xbe, 0xd3, 0x22, + 0x33, 0x25, 0x86, 0x3b, 0x21, 0x70, 0x87, 0x56, 0xeb, 0xb4, 0x14, 0x0b, 0x28, 0x5a, 0x80, 0x4a, + 0xcb, 0x89, 0x12, 0x8f, 0x76, 0x70, 0xa6, 0x7c, 0xd6, 0x3a, 0x37, 0xb8, 0x74, 0x42, 0xa0, 0x56, + 0x6a, 0x12, 0x80, 0x53, 0x1c, 0xda, 0x8d, 0x88, 0x38, 0xee, 0xcd, 0xc0, 0xdf, 0x99, 0x19, 0x38, + 0x6b, 0x9d, 0x1b, 0x49, 0xbb, 0x81, 0x45, 0x39, 0x56, 0x18, 0xf6, 0xf7, 0x4a, 0x30, 0xb2, 0xb8, + 0xb1, 0xe1, 0x05, 0x5e, 0xb2, 0x83, 0xde, 0x86, 0xb1, 0x20, 0x74, 0x89, 0xfc, 0xcf, 0x46, 0x31, + 0x7a, 0xf1, 0xd9, 0xf9, 0x83, 0x16, 0xf5, 0xfc, 0x0d, 0xad, 0xc6, 0xd2, 0xd4, 0xde, 0xee, 0xdc, + 0x98, 0x5e, 0x82, 0x0d, 0x8a, 0xe8, 0x4d, 0x18, 0x6d, 0x85, 0xae, 0x6a, 0xa0, 0xc4, 0x1a, 0x78, + 0xe6, 0xe0, 0x06, 0x6a, 0x69, 0x85, 0xa5, 0xc9, 0xbd, 0xdd, 0xb9, 0x51, 0xad, 0x00, 0xeb, 0xe4, + 0x90, 0x0f, 0x93, 0xf4, 0x6f, 0x90, 0x78, 0xaa, 0x85, 0x32, 0x6b, 0xe1, 0xf9, 0xfc, 0x16, 0xb4, + 0x4a, 0x4b, 0x27, 0xf7, 0x76, 0xe7, 0x26, 0x33, 0x85, 0x38, 0x4b, 0xda, 0xfe, 0x2c, 0x4c, 0x2c, + 0x26, 0x89, 0xd3, 0xd8, 0x24, 0x2e, 0xff, 0xbe, 0xe8, 0x45, 0x18, 0x08, 0x9c, 0x2d, 0x22, 0xbe, + 0xfe, 0x59, 0x31, 0xed, 0x03, 0x37, 0x9c, 0x2d, 0xb2, 0xbf, 0x3b, 0x37, 0x75, 0x2b, 0xf0, 0xde, + 0x6d, 0x8b, 0x35, 0x43, 0xcb, 0x30, 0xc3, 0x46, 0x17, 0x01, 0x5c, 0xb2, 0xed, 0x35, 0x48, 0xcd, + 0x49, 0x36, 0xc5, 0x6a, 0x40, 0xa2, 0x2e, 0x54, 0x15, 0x04, 0x6b, 0x58, 0xf6, 0x17, 0x2c, 0xa8, + 0x2c, 0x6e, 0x87, 0x9e, 0x5b, 0x0b, 0xdd, 0x18, 0xb5, 0x61, 0xb2, 0x15, 0x91, 0x0d, 0x12, 0xa9, + 0xa2, 0x19, 0xeb, 0x6c, 0xf9, 0xdc, 0xe8, 0xc5, 0x8b, 0x39, 0xe3, 0x36, 0x2b, 0xad, 0x04, 0x49, + 0xb4, 0xb3, 0xf4, 0x88, 0x68, 0x7a, 0x32, 0x03, 0xc5, 0xd9, 0x36, 0xec, 0x5f, 0x2c, 0xc1, 0xa9, + 0xc5, 0xcf, 0xb6, 0x23, 0x52, 0xf5, 0xe2, 0x7b, 0xd9, 0xad, 0xe0, 0x7a, 0xf1, 0xbd, 0x1b, 0xe9, + 0x64, 0xa8, 0x35, 0x58, 0x15, 0xe5, 0x58, 0x61, 0xa0, 0xe7, 0x61, 0x98, 0xfe, 0xbe, 0x85, 0xd7, + 0xc4, 0xe8, 0x4f, 0x0a, 0xe4, 0xd1, 0xaa, 0x93, 0x38, 0x55, 0x0e, 0xc2, 0x12, 0x07, 0x5d, 0x87, + 0xd1, 0x06, 0xe3, 0x1c, 0xcd, 0xeb, 0xa1, 0x4b, 0xd8, 0x17, 0xae, 0x2c, 0x3d, 0x47, 0xd1, 0x97, + 0xd3, 0xe2, 0xfd, 0xdd, 0xb9, 0x19, 0xde, 0x37, 0x41, 0x42, 0x83, 0x61, 0xbd, 0x3e, 0xb2, 0xd5, + 0x46, 0x1c, 0x60, 0x94, 0xa0, 0xcb, 0x26, 0x3c, 0xa7, 0xed, 0xa9, 0x41, 0xb6, 0xa7, 0xc6, 0x7a, + 0xec, 0xa7, 0x7f, 0x64, 0x89, 0x39, 0x59, 0xf5, 0x7c, 0x93, 0x3d, 0x5c, 0x04, 0x88, 0x49, 0x23, + 0x22, 0x89, 0x36, 0x2b, 0xea, 0x33, 0xd7, 0x15, 0x04, 0x6b, 0x58, 0x74, 0xf3, 0xc7, 0x9b, 0x4e, + 0xc4, 0x56, 0x8b, 0x98, 0x1b, 0xb5, 0xf9, 0xeb, 0x12, 0x80, 0x53, 0x1c, 0x63, 0xf3, 0x97, 0x73, + 0x37, 0xff, 0x6f, 0x59, 0x30, 0xbc, 0xe4, 0x05, 0xae, 0x17, 0x34, 0xd1, 0xdb, 0x30, 0x42, 0xcf, + 0x06, 0xd7, 0x49, 0x1c, 0xb1, 0xef, 0x3f, 0x2c, 0x17, 0x8f, 0xce, 0xaa, 0xe5, 0xf2, 0x89, 0xe7, + 0x29, 0x36, 0x5d, 0x44, 0x37, 0xef, 0xbe, 0x43, 0x1a, 0xc9, 0x75, 0x92, 0x38, 0xe9, 0x70, 0xd2, + 0x32, 0xac, 0xa8, 0xa2, 0x5b, 0x30, 0x94, 0x38, 0x51, 0x93, 0x24, 0x62, 0xdb, 0xe7, 0x6c, 0x4a, + 0x4e, 0x03, 0xd3, 0x25, 0x47, 0x82, 0x06, 0x49, 0x19, 0xe4, 0x3a, 0x23, 0x82, 0x05, 0x31, 0xbb, + 0x01, 0x63, 0xcb, 0x4e, 0xcb, 0xb9, 0xeb, 0xf9, 0x5e, 0xe2, 0x91, 0x18, 0xfd, 0x0c, 0x94, 0x1d, + 0xd7, 0x65, 0x1b, 0xa0, 0xb2, 0x74, 0x6a, 0x6f, 0x77, 0xae, 0xbc, 0xe8, 0xba, 0xfb, 0xbb, 0x73, + 0xa0, 0xb0, 0x76, 0x30, 0xc5, 0x40, 0xcf, 0xc2, 0x80, 0x1b, 0x85, 0xad, 0x99, 0x12, 0xc3, 0x3c, + 0x4d, 0x77, 0x6a, 0x35, 0x0a, 0x5b, 0x19, 0x54, 0x86, 0x63, 0xff, 0xa0, 0x04, 0x68, 0x99, 0xb4, + 0x36, 0x57, 0xeb, 0xc6, 0x37, 0x3d, 0x07, 0x23, 0x5b, 0x61, 0xe0, 0x25, 0x61, 0x14, 0x8b, 0x06, + 0xd9, 0xba, 0xb8, 0x2e, 0xca, 0xb0, 0x82, 0xa2, 0xb3, 0x30, 0xd0, 0x4a, 0xb7, 0xf7, 0x98, 0x64, + 0x0d, 0x6c, 0x63, 0x33, 0x08, 0xc5, 0x68, 0xc7, 0x24, 0x12, 0xeb, 0x59, 0x61, 0xdc, 0x8a, 0x49, + 0x84, 0x19, 0x24, 0x5d, 0x41, 0x74, 0x6d, 0x89, 0xd5, 0x9a, 0x59, 0x41, 0x14, 0x82, 0x35, 0x2c, + 0xf4, 0x16, 0x54, 0xf8, 0x3f, 0x4c, 0x36, 0xd8, 0xd2, 0xcd, 0x65, 0x0a, 0xd7, 0xc2, 0x86, 0xe3, + 0x67, 0x27, 0x7f, 0x9c, 0xad, 0x38, 0x49, 0x08, 0xa7, 0x34, 0x8d, 0x15, 0x37, 0x94, 0xbb, 0xe2, + 0xfe, 0xb6, 0x05, 0x68, 0xd9, 0x0b, 0x5c, 0x12, 0x1d, 0xc3, 0xd1, 0xd9, 0xdf, 0x66, 0xf8, 0x63, + 0xda, 0xb5, 0x70, 0xab, 0x15, 0x06, 0x24, 0x48, 0x96, 0xc3, 0xc0, 0xe5, 0xc7, 0xe9, 0xc7, 0x60, + 0x20, 0xa1, 0x4d, 0xf1, 0x6e, 0x3d, 0x2d, 0x3f, 0x0b, 0x6d, 0x60, 0x7f, 0x77, 0xee, 0x74, 0x67, + 0x0d, 0xd6, 0x05, 0x56, 0x07, 0x7d, 0x14, 0x86, 0xe2, 0xc4, 0x49, 0xda, 0xb1, 0xe8, 0xe8, 0x13, + 0xb2, 0xa3, 0x75, 0x56, 0xba, 0xbf, 0x3b, 0x37, 0xa9, 0xaa, 0xf1, 0x22, 0x2c, 0x2a, 0xa0, 0x67, + 0x60, 0x78, 0x8b, 0xc4, 0xb1, 0xd3, 0x94, 0x0c, 0x6e, 0x52, 0xd4, 0x1d, 0xbe, 0xce, 0x8b, 0xb1, + 0x84, 0xa3, 0x27, 0x61, 0x90, 0x44, 0x51, 0x18, 0x89, 0x15, 0x31, 0x2e, 0x10, 0x07, 0x57, 0x68, + 0x21, 0xe6, 0x30, 0xfb, 0x3f, 0x5b, 0x30, 0xa9, 0xfa, 0xca, 0xdb, 0x3a, 0x86, 0x2d, 0xef, 0x02, + 0x34, 0xe4, 0x00, 0x63, 0xb6, 0xd1, 0xb4, 0x36, 0xba, 0x2f, 0xbf, 0xce, 0x09, 0x4d, 0xdb, 0x50, + 0x45, 0x31, 0xd6, 0xe8, 0xda, 0xff, 0xce, 0x82, 0x93, 0x99, 0xb1, 0x5d, 0xf3, 0xe2, 0x04, 0xbd, + 0xd9, 0x31, 0xbe, 0xf9, 0x62, 0xe3, 0xa3, 0xb5, 0xd9, 0xe8, 0xd4, 0x7a, 0x91, 0x25, 0xda, 0xd8, + 0x30, 0x0c, 0x7a, 0x09, 0xd9, 0x92, 0xc3, 0x7a, 0xbe, 0xe0, 0xb0, 0x78, 0xff, 0xd2, 0xaf, 0xb4, + 0x46, 0x69, 0x60, 0x4e, 0xca, 0xfe, 0xdf, 0x16, 0x54, 0x96, 0xc3, 0x60, 0xc3, 0x6b, 0x5e, 0x77, + 0x5a, 0xc7, 0xf0, 0x7d, 0xea, 0x30, 0xc0, 0xa8, 0xf3, 0x21, 0x5c, 0xc8, 0x1b, 0x82, 0xe8, 0xd8, + 0x3c, 0x3d, 0x53, 0xb9, 0xb0, 0xa0, 0xd8, 0x14, 0x2d, 0xc2, 0x8c, 0xd8, 0xec, 0xcb, 0x50, 0x51, + 0x08, 0x68, 0x0a, 0xca, 0xf7, 0x08, 0x97, 0x24, 0x2b, 0x98, 0xfe, 0x44, 0xd3, 0x30, 0xb8, 0xed, + 0xf8, 0x6d, 0xb1, 0x79, 0x31, 0xff, 0xf3, 0xb1, 0xd2, 0x25, 0xcb, 0xfe, 0x01, 0xdb, 0x81, 0xa2, + 0x91, 0x95, 0x60, 0x5b, 0x30, 0x87, 0x2f, 0x5a, 0x30, 0xed, 0x77, 0x61, 0x4a, 0x62, 0x4e, 0x0e, + 0xc3, 0xce, 0x1e, 0x13, 0xdd, 0x9e, 0xee, 0x06, 0xc5, 0x5d, 0x5b, 0xa3, 0xbc, 0x3e, 0x6c, 0xd1, + 0x05, 0xe7, 0xf8, 0xac, 0xeb, 0x42, 0x06, 0xb8, 0x29, 0xca, 0xb0, 0x82, 0xda, 0x7f, 0x66, 0xc1, + 0xb4, 0x1a, 0xc7, 0x55, 0xb2, 0x53, 0x27, 0x3e, 0x69, 0x24, 0x61, 0xf4, 0x7e, 0x19, 0xc9, 0xe3, + 0xfc, 0x9b, 0x70, 0x9e, 0x34, 0x2a, 0x08, 0x94, 0xaf, 0x92, 0x1d, 0xfe, 0x81, 0xf4, 0x81, 0x96, + 0x0f, 0x1c, 0xe8, 0x6f, 0x58, 0x30, 0xae, 0x06, 0x7a, 0x0c, 0x5b, 0xee, 0x9a, 0xb9, 0xe5, 0x7e, + 0xa6, 0xe0, 0x7a, 0xed, 0xb1, 0xd9, 0xfe, 0x56, 0x89, 0xb2, 0x0d, 0x81, 0x53, 0x8b, 0x42, 0x3a, + 0x49, 0x94, 0xe3, 0xbf, 0x4f, 0xbe, 0x52, 0x7f, 0x83, 0xbd, 0x4a, 0x76, 0xd6, 0x43, 0x2a, 0x4d, + 0x74, 0x1f, 0xac, 0xf1, 0x51, 0x07, 0x0e, 0xfc, 0xa8, 0xbf, 0x53, 0x82, 0x53, 0x6a, 0x5a, 0x8c, + 0x53, 0xfa, 0xa7, 0x72, 0x62, 0x2e, 0xc0, 0xa8, 0x4b, 0x36, 0x9c, 0xb6, 0x9f, 0x28, 0x6d, 0x62, + 0x90, 0xab, 0x99, 0xd5, 0xb4, 0x18, 0xeb, 0x38, 0x7d, 0xcc, 0xe5, 0xd7, 0x47, 0x19, 0x3f, 0x4f, + 0x1c, 0xba, 0xea, 0xa9, 0x84, 0xa7, 0xa9, 0x87, 0x63, 0xba, 0x7a, 0x28, 0x54, 0xc1, 0x27, 0x61, + 0xd0, 0xdb, 0xa2, 0x67, 0x7e, 0xc9, 0x3c, 0xca, 0xd7, 0x68, 0x21, 0xe6, 0x30, 0xf4, 0x14, 0x0c, + 0x37, 0xc2, 0xad, 0x2d, 0x27, 0x70, 0x67, 0xca, 0x4c, 0xe6, 0x1c, 0xa5, 0x62, 0xc1, 0x32, 0x2f, + 0xc2, 0x12, 0x86, 0x1e, 0x83, 0x01, 0x27, 0x6a, 0xc6, 0x33, 0x03, 0x0c, 0x67, 0x84, 0xb6, 0xb4, + 0x18, 0x35, 0x63, 0xcc, 0x4a, 0xa9, 0x2c, 0x79, 0x3f, 0x8c, 0xee, 0x79, 0x41, 0xb3, 0xea, 0x45, + 0x4c, 0x30, 0xd4, 0x64, 0xc9, 0x3b, 0x0a, 0x82, 0x35, 0x2c, 0x54, 0x83, 0xc1, 0x56, 0x18, 0x25, + 0xf1, 0xcc, 0x10, 0x9b, 0xf8, 0xe7, 0x72, 0xb7, 0x1f, 0x1f, 0x77, 0x2d, 0x8c, 0x92, 0x74, 0x28, + 0xf4, 0x5f, 0x8c, 0x39, 0x21, 0xb4, 0x0c, 0x65, 0x12, 0x6c, 0xcf, 0x0c, 0x33, 0x7a, 0x1f, 0x3a, + 0x98, 0xde, 0x4a, 0xb0, 0x7d, 0xdb, 0x89, 0x52, 0x7e, 0xb5, 0x12, 0x6c, 0x63, 0x5a, 0x1b, 0x35, + 0xa0, 0x22, 0x8d, 0x61, 0xf1, 0xcc, 0x48, 0x91, 0xa5, 0x88, 0x05, 0x3a, 0x26, 0xef, 0xb6, 0xbd, + 0x88, 0x6c, 0x91, 0x20, 0x89, 0x53, 0xc5, 0x4a, 0x42, 0x63, 0x9c, 0xd2, 0x45, 0x0d, 0x18, 0xe3, + 0xf2, 0xe7, 0xf5, 0xb0, 0x1d, 0x24, 0xf1, 0x4c, 0x85, 0x75, 0x39, 0xc7, 0x72, 0x71, 0x3b, 0xad, + 0xb1, 0x34, 0x2d, 0xc8, 0x8f, 0x69, 0x85, 0x31, 0x36, 0x88, 0xa2, 0x37, 0x61, 0xdc, 0xf7, 0xb6, + 0x49, 0x40, 0xe2, 0xb8, 0x16, 0x85, 0x77, 0xc9, 0x0c, 0xb0, 0xd1, 0x3c, 0x99, 0xa7, 0xc5, 0x87, + 0x77, 0xc9, 0xd2, 0x89, 0xbd, 0xdd, 0xb9, 0xf1, 0x6b, 0x7a, 0x6d, 0x6c, 0x12, 0x43, 0x6f, 0xc1, + 0x04, 0x15, 0x76, 0xbd, 0x94, 0xfc, 0x68, 0x71, 0xf2, 0x68, 0x6f, 0x77, 0x6e, 0x02, 0x1b, 0xd5, + 0x71, 0x86, 0x1c, 0x5a, 0x87, 0x8a, 0xef, 0x6d, 0x90, 0xc6, 0x4e, 0xc3, 0x27, 0x33, 0x63, 0x8c, + 0x76, 0xce, 0xe6, 0xbc, 0x26, 0xd1, 0xb9, 0x82, 0xa1, 0xfe, 0xe2, 0x94, 0x10, 0xba, 0x0d, 0xa7, + 0x13, 0x12, 0x6d, 0x79, 0x01, 0xb3, 0xd1, 0x09, 0xe9, 0x97, 0x99, 0x4a, 0xc6, 0xd9, 0xaa, 0x3d, + 0x23, 0x26, 0xf6, 0xf4, 0x7a, 0x57, 0x2c, 0xdc, 0xa3, 0x36, 0xba, 0x09, 0x93, 0x6c, 0x3f, 0xd5, + 0xda, 0xbe, 0x5f, 0x0b, 0x7d, 0xaf, 0xb1, 0x33, 0x33, 0xc1, 0x08, 0x3e, 0x25, 0x0d, 0x20, 0x6b, + 0x26, 0x98, 0x2a, 0x86, 0xe9, 0x3f, 0x9c, 0xad, 0x8d, 0x7c, 0x98, 0x8c, 0x49, 0xa3, 0x1d, 0x79, + 0xc9, 0x0e, 0x5d, 0xfb, 0xe4, 0x41, 0x32, 0x33, 0x59, 0x44, 0xd1, 0xad, 0x9b, 0x95, 0xb8, 0xf5, + 0x29, 0x53, 0x88, 0xb3, 0xa4, 0x29, 0xab, 0x88, 0x13, 0xd7, 0x0b, 0x66, 0xa6, 0x18, 0x07, 0x52, + 0xfb, 0xab, 0x4e, 0x0b, 0x31, 0x87, 0x31, 0xfb, 0x01, 0xfd, 0x71, 0x93, 0x72, 0xe9, 0x13, 0x0c, + 0x31, 0xb5, 0x1f, 0x48, 0x00, 0x4e, 0x71, 0xa8, 0x68, 0x90, 0x24, 0x3b, 0x33, 0x88, 0xa1, 0xaa, + 0xad, 0xb6, 0xbe, 0xfe, 0x29, 0x4c, 0xcb, 0xd1, 0x6d, 0x18, 0x26, 0xc1, 0xf6, 0x6a, 0x14, 0x6e, + 0xcd, 0x9c, 0x2c, 0xc2, 0x03, 0x56, 0x38, 0x32, 0x3f, 0x3f, 0x52, 0x15, 0x46, 0x14, 0x63, 0x49, + 0x0c, 0x3d, 0x80, 0x99, 0x2e, 0x5f, 0x89, 0x7f, 0x94, 0x69, 0xf6, 0x51, 0x3e, 0x2e, 0xea, 0xce, + 0xac, 0xf7, 0xc0, 0xdb, 0x3f, 0x00, 0x86, 0x7b, 0x52, 0xb7, 0xef, 0xc2, 0x84, 0x62, 0x54, 0xec, + 0x7b, 0xa3, 0x39, 0x18, 0xa4, 0xbc, 0x58, 0x2a, 0xf4, 0x15, 0x3a, 0xa9, 0x94, 0x45, 0xc7, 0x98, + 0x97, 0xb3, 0x49, 0xf5, 0x3e, 0x4b, 0x96, 0x76, 0x12, 0xc2, 0x15, 0xbb, 0xb2, 0x36, 0xa9, 0x12, + 0x80, 0x53, 0x1c, 0xfb, 0xff, 0x72, 0x31, 0x29, 0xe5, 0x86, 0x05, 0x4e, 0x82, 0xf3, 0x30, 0xb2, + 0x19, 0xc6, 0x09, 0xc5, 0x66, 0x6d, 0x0c, 0xa6, 0x82, 0xd1, 0x15, 0x51, 0x8e, 0x15, 0x06, 0x7a, + 0x05, 0xc6, 0x1b, 0x7a, 0x03, 0xe2, 0x18, 0x3b, 0x25, 0xaa, 0x98, 0xad, 0x63, 0x13, 0x17, 0x5d, + 0x82, 0x11, 0x66, 0xe5, 0x6e, 0x84, 0xbe, 0x50, 0x21, 0xe5, 0xa9, 0x3c, 0x52, 0x13, 0xe5, 0xfb, + 0xda, 0x6f, 0xac, 0xb0, 0xa9, 0x22, 0x4e, 0xbb, 0xb0, 0x56, 0x13, 0x07, 0x88, 0x52, 0xc4, 0xaf, + 0xb0, 0x52, 0x2c, 0xa0, 0xf6, 0x3f, 0x2f, 0x69, 0xb3, 0x4c, 0x15, 0x20, 0x82, 0xde, 0x80, 0xe1, + 0xfb, 0x8e, 0x97, 0x78, 0x41, 0x53, 0x48, 0x0f, 0x2f, 0x14, 0x3c, 0x4d, 0x58, 0xf5, 0x3b, 0xbc, + 0x2a, 0x3f, 0xf9, 0xc4, 0x1f, 0x2c, 0x09, 0x52, 0xda, 0x51, 0x3b, 0x08, 0x28, 0xed, 0x52, 0xff, + 0xb4, 0x31, 0xaf, 0xca, 0x69, 0x8b, 0x3f, 0x58, 0x12, 0x44, 0x1b, 0x00, 0x72, 0x2d, 0x11, 0x57, + 0x58, 0x97, 0x3f, 0xd2, 0x0f, 0xf9, 0x75, 0x55, 0x7b, 0x69, 0x82, 0x9e, 0xb5, 0xe9, 0x7f, 0xac, + 0x51, 0xb6, 0x13, 0x26, 0x84, 0x75, 0x76, 0x0b, 0x7d, 0x9a, 0x6e, 0x69, 0x27, 0x4a, 0x88, 0xbb, + 0x98, 0x64, 0x0d, 0xf4, 0x07, 0x8b, 0xd8, 0xeb, 0xde, 0x16, 0xd1, 0xb7, 0xbf, 0x20, 0x82, 0x53, + 0x7a, 0xf6, 0x77, 0xcb, 0x30, 0xd3, 0xab, 0xbb, 0x74, 0x49, 0x92, 0x07, 0x5e, 0xb2, 0x4c, 0xc5, + 0x24, 0xcb, 0x5c, 0x92, 0x2b, 0xa2, 0x1c, 0x2b, 0x0c, 0xba, 0x36, 0x62, 0xaf, 0x29, 0x95, 0xa5, + 0xc1, 0x74, 0x6d, 0xd4, 0x59, 0x29, 0x16, 0x50, 0x8a, 0x17, 0x11, 0x27, 0x16, 0x97, 0x1b, 0xda, + 0x1a, 0xc2, 0xac, 0x14, 0x0b, 0xa8, 0x6e, 0x10, 0x19, 0xc8, 0x31, 0x88, 0x18, 0x53, 0x34, 0xf8, + 0x70, 0xa7, 0x08, 0x7d, 0x06, 0x60, 0xc3, 0x0b, 0xbc, 0x78, 0x93, 0x51, 0x1f, 0xea, 0x9b, 0xba, + 0x12, 0xb2, 0x56, 0x15, 0x15, 0xac, 0x51, 0x44, 0x2f, 0xc1, 0xa8, 0xda, 0x9e, 0x6b, 0xd5, 0x99, + 0x61, 0xd3, 0x20, 0x9e, 0xf2, 0xaa, 0x2a, 0xd6, 0xf1, 0xec, 0x77, 0xb2, 0xeb, 0x45, 0xec, 0x0a, + 0x6d, 0x7e, 0xad, 0xa2, 0xf3, 0x5b, 0x3a, 0x78, 0x7e, 0xed, 0x3f, 0x28, 0xc3, 0xa4, 0xd1, 0x58, + 0x3b, 0x2e, 0xc0, 0xd1, 0x5e, 0xa3, 0x07, 0x96, 0x93, 0x10, 0xb1, 0x27, 0xcf, 0xf7, 0xb3, 0x69, + 0xf4, 0xe3, 0x8d, 0xee, 0x05, 0x4e, 0x09, 0x6d, 0x42, 0xc5, 0x77, 0x62, 0x66, 0x52, 0x21, 0x62, + 0x2f, 0xf6, 0x47, 0x36, 0x55, 0x3f, 0x9c, 0x38, 0xd1, 0x4e, 0x0f, 0xde, 0x4a, 0x4a, 0x9c, 0x9e, + 0xb6, 0x54, 0xd8, 0x91, 0x37, 0x6a, 0xaa, 0x3b, 0x54, 0x22, 0xda, 0xc1, 0x1c, 0x86, 0x2e, 0xc1, + 0x58, 0x44, 0xd8, 0x4a, 0x59, 0xa6, 0xf2, 0x1c, 0x5b, 0x7a, 0x83, 0xa9, 0xe0, 0x87, 0x35, 0x18, + 0x36, 0x30, 0x53, 0xb9, 0x7f, 0xe8, 0x00, 0xb9, 0xff, 0x19, 0x18, 0x66, 0x3f, 0xd4, 0xaa, 0x50, + 0x5f, 0x68, 0x8d, 0x17, 0x63, 0x09, 0xcf, 0x2e, 0xa2, 0x91, 0x82, 0x8b, 0xe8, 0x59, 0x98, 0xa8, + 0x3a, 0x64, 0x2b, 0x0c, 0x56, 0x02, 0xb7, 0x15, 0x7a, 0x41, 0x82, 0x66, 0x60, 0x80, 0x9d, 0x27, + 0x7c, 0xbf, 0x0f, 0x50, 0x0a, 0x78, 0x80, 0xca, 0xee, 0xf6, 0x1f, 0x97, 0x60, 0xbc, 0x4a, 0x7c, + 0x92, 0x10, 0xae, 0xf7, 0xc4, 0x68, 0x15, 0x50, 0x33, 0x72, 0x1a, 0xa4, 0x46, 0x22, 0x2f, 0x74, + 0xeb, 0xa4, 0x11, 0x06, 0xec, 0x22, 0x8a, 0x1e, 0x90, 0xa7, 0xf7, 0x76, 0xe7, 0xd0, 0xe5, 0x0e, + 0x28, 0xee, 0x52, 0x03, 0xb9, 0x30, 0xde, 0x8a, 0x88, 0x61, 0x37, 0xb4, 0xf2, 0x45, 0x8d, 0x9a, + 0x5e, 0x85, 0x4b, 0xc3, 0x46, 0x11, 0x36, 0x89, 0xa2, 0x4f, 0xc0, 0x54, 0x18, 0xb5, 0x36, 0x9d, + 0xa0, 0x4a, 0x5a, 0x24, 0x70, 0xa9, 0x0a, 0x20, 0xac, 0x1d, 0xd3, 0x7b, 0xbb, 0x73, 0x53, 0x37, + 0x33, 0x30, 0xdc, 0x81, 0x8d, 0xde, 0x80, 0x13, 0xad, 0x28, 0x6c, 0x39, 0x4d, 0xb6, 0x64, 0x84, + 0xb4, 0xc2, 0x79, 0xd3, 0xf9, 0xbd, 0xdd, 0xb9, 0x13, 0xb5, 0x2c, 0x70, 0x7f, 0x77, 0xee, 0x24, + 0x9b, 0x32, 0x5a, 0x92, 0x02, 0x71, 0x27, 0x19, 0xfb, 0x5d, 0x38, 0x55, 0x0d, 0xef, 0x07, 0xf7, + 0x9d, 0xc8, 0x5d, 0xac, 0xad, 0x69, 0xc6, 0x89, 0xd7, 0xa5, 0xf2, 0xcb, 0x2f, 0xf8, 0x72, 0x4e, + 0x36, 0x8d, 0x06, 0x57, 0x3b, 0x56, 0x3d, 0x9f, 0xf4, 0x30, 0x87, 0xfc, 0xe3, 0x92, 0xd1, 0x66, + 0x8a, 0xaf, 0xee, 0x2e, 0xac, 0x9e, 0x77, 0x17, 0x9f, 0x86, 0x91, 0x0d, 0x8f, 0xf8, 0x2e, 0x26, + 0x1b, 0xe2, 0x6b, 0x5d, 0x28, 0x72, 0xb9, 0xb3, 0x4a, 0xeb, 0x48, 0xeb, 0x18, 0x57, 0xa2, 0x57, + 0x05, 0x19, 0xac, 0x08, 0xa2, 0x36, 0x4c, 0x49, 0x3d, 0x4c, 0x42, 0xc5, 0x66, 0x7f, 0xa1, 0x98, + 0x9a, 0x67, 0x36, 0xc3, 0x3e, 0x2f, 0xce, 0x10, 0xc4, 0x1d, 0x4d, 0x50, 0xfd, 0x79, 0x8b, 0x1e, + 0x75, 0x03, 0x6c, 0xe9, 0x33, 0xfd, 0x99, 0x99, 0x02, 0x58, 0xa9, 0xfd, 0xab, 0x16, 0x3c, 0xd2, + 0x31, 0x5b, 0xc2, 0x4e, 0x72, 0x64, 0xdf, 0x28, 0x6b, 0xac, 0x28, 0xe5, 0x1b, 0x2b, 0xec, 0x9b, + 0x30, 0xbd, 0xb2, 0xd5, 0x4a, 0x76, 0xaa, 0x9e, 0x79, 0xe5, 0xf2, 0x32, 0x0c, 0x6d, 0x11, 0xd7, + 0x6b, 0x6f, 0x89, 0xcf, 0x3a, 0x27, 0xcf, 0x85, 0xeb, 0xac, 0x74, 0x7f, 0x77, 0x6e, 0xbc, 0x9e, + 0x84, 0x91, 0xd3, 0x24, 0xbc, 0x00, 0x0b, 0x74, 0xfb, 0x47, 0x16, 0x4c, 0x4a, 0xfe, 0xb0, 0xe8, + 0xba, 0x11, 0x89, 0x63, 0x34, 0x0b, 0x25, 0xaf, 0x25, 0x08, 0x81, 0x20, 0x54, 0x5a, 0xab, 0xe1, + 0x92, 0xd7, 0x42, 0x6f, 0x40, 0x85, 0xdf, 0xd4, 0xa5, 0x8b, 0xa3, 0xcf, 0x9b, 0x3f, 0xa6, 0x1b, + 0xae, 0x4b, 0x1a, 0x38, 0x25, 0x27, 0xa5, 0x64, 0x76, 0xf2, 0x94, 0xcd, 0x7b, 0xa3, 0x2b, 0xa2, + 0x1c, 0x2b, 0x0c, 0x74, 0x0e, 0x46, 0x82, 0xd0, 0xe5, 0x97, 0xa9, 0x7c, 0x9f, 0xb2, 0x25, 0x77, + 0x43, 0x94, 0x61, 0x05, 0xb5, 0xbf, 0x62, 0xc1, 0x98, 0x1c, 0x63, 0x41, 0x81, 0x9d, 0x6e, 0x92, + 0x54, 0x58, 0x4f, 0x37, 0x09, 0x15, 0xb8, 0x19, 0xc4, 0x90, 0xb3, 0xcb, 0xfd, 0xc8, 0xd9, 0xf6, + 0xaf, 0x97, 0x60, 0x42, 0x76, 0xa7, 0xde, 0xbe, 0x1b, 0x13, 0x2a, 0x86, 0x54, 0x1c, 0x3e, 0xf9, + 0x44, 0xae, 0xb3, 0xe7, 0xf3, 0x74, 0x31, 0xe3, 0x9b, 0xa5, 0x62, 0xce, 0xa2, 0xa4, 0x83, 0x53, + 0x92, 0x68, 0x1b, 0x4e, 0x04, 0x61, 0xc2, 0x8e, 0x37, 0x05, 0x2f, 0x76, 0xd3, 0x91, 0x6d, 0xe7, + 0x51, 0xd1, 0xce, 0x89, 0x1b, 0x59, 0x7a, 0xb8, 0xb3, 0x09, 0x74, 0x53, 0xda, 0x98, 0xca, 0xac, + 0xad, 0x67, 0x8b, 0xb5, 0xd5, 0xdb, 0xc4, 0x64, 0xff, 0xb6, 0x05, 0x15, 0x89, 0x76, 0x1c, 0x57, + 0x5e, 0x77, 0x60, 0x38, 0x66, 0x9f, 0x48, 0x4e, 0xd7, 0xf9, 0x62, 0x43, 0xe0, 0xdf, 0x35, 0x3d, + 0xd3, 0xf9, 0xff, 0x18, 0x4b, 0x6a, 0xcc, 0xd8, 0xae, 0x06, 0xf2, 0xbe, 0x33, 0xb6, 0xab, 0x9e, + 0xf5, 0xbe, 0xd9, 0x1a, 0x37, 0xac, 0x01, 0x54, 0x30, 0x6d, 0x45, 0x64, 0xc3, 0x7b, 0x90, 0x15, + 0x4c, 0x6b, 0xac, 0x14, 0x0b, 0x28, 0xda, 0x80, 0xb1, 0x86, 0x34, 0x47, 0xa7, 0x2c, 0xe4, 0xc3, + 0x05, 0x6d, 0xff, 0xea, 0x1a, 0x89, 0xbb, 0x26, 0x2d, 0x6b, 0x94, 0xb0, 0x41, 0x97, 0xf2, 0xa9, + 0xf4, 0xa6, 0xbc, 0x5c, 0xd0, 0x70, 0x13, 0x91, 0x24, 0x6d, 0xa1, 0xe7, 0x25, 0xb9, 0xfd, 0x0d, + 0x0b, 0x86, 0xb8, 0xfd, 0xb2, 0x98, 0x11, 0x58, 0xbb, 0x20, 0x4b, 0xe7, 0xf3, 0x36, 0x2d, 0x14, + 0xf7, 0x65, 0xe8, 0x0e, 0x54, 0xd8, 0x0f, 0x66, 0x8b, 0x29, 0x17, 0xf1, 0xd3, 0xe2, 0xed, 0xeb, + 0x5d, 0xbd, 0x2d, 0x09, 0xe0, 0x94, 0x96, 0xfd, 0xfd, 0x32, 0x65, 0x7d, 0x29, 0xaa, 0x71, 0xb6, + 0x5b, 0xc7, 0x71, 0xb6, 0x97, 0x8e, 0xfe, 0x6c, 0x7f, 0x17, 0x26, 0x1b, 0xda, 0x05, 0x5d, 0xfa, + 0xc5, 0x2f, 0x16, 0x5c, 0x56, 0xda, 0xad, 0x1e, 0xb7, 0xd7, 0x2d, 0x9b, 0xe4, 0x70, 0x96, 0x3e, + 0x22, 0x30, 0xc6, 0xd7, 0x83, 0x68, 0x6f, 0x80, 0xb5, 0xb7, 0x50, 0x64, 0x85, 0xe9, 0x8d, 0xb1, + 0x55, 0x5c, 0xd7, 0x08, 0x61, 0x83, 0xac, 0xfd, 0xcb, 0x83, 0x30, 0xb8, 0xb2, 0x4d, 0x82, 0xe4, + 0x18, 0x58, 0xdd, 0x16, 0x4c, 0x78, 0xc1, 0x76, 0xe8, 0x6f, 0x13, 0x97, 0xc3, 0x0f, 0x77, 0xbc, + 0x9f, 0x16, 0x8d, 0x4c, 0xac, 0x19, 0xc4, 0x70, 0x86, 0xf8, 0x51, 0x58, 0x0a, 0x5e, 0x83, 0x21, + 0xbe, 0x32, 0x84, 0x99, 0x20, 0xc7, 0x9e, 0xcf, 0x26, 0x56, 0xec, 0xa0, 0xd4, 0x9e, 0xc1, 0xaf, + 0x12, 0x04, 0x21, 0xf4, 0x0e, 0x4c, 0x6c, 0x78, 0x51, 0x9c, 0x50, 0x65, 0x3f, 0x4e, 0x9c, 0xad, + 0xd6, 0x21, 0x6c, 0x04, 0x6a, 0x46, 0x56, 0x0d, 0x4a, 0x38, 0x43, 0x19, 0x35, 0x61, 0x9c, 0xaa, + 0xa8, 0x69, 0x53, 0xc3, 0x7d, 0x37, 0xa5, 0x4c, 0x84, 0xd7, 0x74, 0x42, 0xd8, 0xa4, 0x4b, 0x59, + 0x52, 0x83, 0xa9, 0xb4, 0x23, 0x4c, 0xba, 0x51, 0x2c, 0x89, 0xeb, 0xb2, 0x1c, 0x46, 0x39, 0x1b, + 0xf3, 0x94, 0xa9, 0x98, 0x9c, 0x2d, 0xf5, 0x87, 0xb1, 0xbf, 0x45, 0xcf, 0x62, 0x3a, 0x87, 0xc7, + 0x70, 0x7c, 0x5d, 0x31, 0x8f, 0xaf, 0x27, 0x0b, 0x7c, 0xd9, 0x1e, 0x47, 0xd7, 0xdb, 0x30, 0xaa, + 0x7d, 0x78, 0xb4, 0x00, 0x95, 0x86, 0x74, 0xe6, 0x10, 0x5c, 0x5c, 0x89, 0x52, 0xca, 0xcb, 0x03, + 0xa7, 0x38, 0x74, 0x5e, 0xa8, 0x08, 0x9a, 0x75, 0xfd, 0xa2, 0x02, 0x2a, 0x66, 0x10, 0xfb, 0x05, + 0x80, 0x95, 0x07, 0xa4, 0xb1, 0xc8, 0x55, 0x3c, 0xed, 0x7e, 0xcf, 0xea, 0x7d, 0xbf, 0x67, 0x7f, + 0xd3, 0x82, 0x89, 0xd5, 0x65, 0x43, 0xa6, 0x9f, 0x07, 0xe0, 0xb2, 0xf1, 0x9d, 0x3b, 0x37, 0xa4, + 0xfd, 0x9a, 0x1b, 0x19, 0x55, 0x29, 0xd6, 0x30, 0xd0, 0xa3, 0x50, 0xf6, 0xdb, 0x81, 0x10, 0x59, + 0x87, 0xf7, 0x76, 0xe7, 0xca, 0xd7, 0xda, 0x01, 0xa6, 0x65, 0x9a, 0x8f, 0x55, 0xb9, 0xb0, 0x8f, + 0x55, 0xbe, 0xb7, 0xf1, 0xd7, 0xca, 0x30, 0xb5, 0xea, 0x93, 0x07, 0x46, 0xaf, 0x9f, 0x86, 0x21, + 0x37, 0xf2, 0xb6, 0x49, 0x94, 0x15, 0x04, 0xaa, 0xac, 0x14, 0x0b, 0x68, 0x61, 0xb7, 0xaf, 0xb7, + 0x3a, 0x0f, 0xf2, 0xa3, 0x73, 0x79, 0xcb, 0x1d, 0x33, 0xda, 0x80, 0x61, 0x7e, 0x1f, 0x1c, 0xcf, + 0x0c, 0xb2, 0xa5, 0xf8, 0xca, 0xc1, 0x9d, 0xc9, 0xce, 0xcf, 0xbc, 0xb0, 0xaf, 0x70, 0x87, 0x1b, + 0xc5, 0xcb, 0x44, 0x29, 0x96, 0xc4, 0x67, 0x3f, 0x06, 0x63, 0x3a, 0x66, 0x5f, 0x9e, 0x37, 0x7f, + 0xd5, 0x82, 0x93, 0xab, 0x7e, 0xd8, 0xb8, 0x97, 0xf1, 0xcb, 0x7b, 0x09, 0x46, 0xe9, 0x66, 0x8a, + 0x0d, 0xa7, 0x55, 0xc3, 0x3b, 0x57, 0x80, 0xb0, 0x8e, 0xa7, 0x55, 0xbb, 0x75, 0x6b, 0xad, 0xda, + 0xcd, 0xa9, 0x57, 0x80, 0xb0, 0x8e, 0x67, 0xff, 0xae, 0x05, 0x8f, 0x5f, 0x5e, 0x5e, 0xa9, 0x91, + 0x28, 0xf6, 0xe2, 0x84, 0x04, 0x49, 0x87, 0x5f, 0x31, 0x95, 0x19, 0x5d, 0xad, 0x2b, 0xa9, 0xcc, + 0x58, 0x65, 0xbd, 0x10, 0xd0, 0xf7, 0x8b, 0x73, 0xfd, 0x37, 0x2c, 0x38, 0x79, 0xd9, 0x4b, 0x30, + 0x69, 0x85, 0x59, 0x57, 0xe0, 0x88, 0xb4, 0xc2, 0xd8, 0x4b, 0xc2, 0x68, 0x27, 0xeb, 0x0a, 0x8c, + 0x15, 0x04, 0x6b, 0x58, 0xbc, 0xe5, 0x6d, 0x2f, 0xa6, 0x3d, 0x2d, 0x99, 0xaa, 0x2e, 0x16, 0xe5, + 0x58, 0x61, 0xd0, 0x81, 0xb9, 0x5e, 0xc4, 0x44, 0x86, 0x1d, 0xb1, 0x83, 0xd5, 0xc0, 0xaa, 0x12, + 0x80, 0x53, 0x1c, 0xfb, 0xef, 0x5a, 0x70, 0xea, 0xb2, 0xdf, 0x8e, 0x13, 0x12, 0x6d, 0xc4, 0x46, + 0x67, 0x5f, 0x80, 0x0a, 0x91, 0xc2, 0xbd, 0xe8, 0xab, 0x3a, 0x34, 0x94, 0xd4, 0xcf, 0xfd, 0x90, + 0x15, 0x5e, 0x01, 0x77, 0xd7, 0xfe, 0x9c, 0x33, 0x7f, 0xb3, 0x04, 0xe3, 0x57, 0xd6, 0xd7, 0x6b, + 0x97, 0x49, 0x22, 0xb8, 0x64, 0xbe, 0x51, 0x0a, 0x6b, 0x1a, 0xf9, 0x41, 0xc2, 0x4f, 0x3b, 0xf1, + 0xfc, 0x79, 0x1e, 0x78, 0x32, 0xbf, 0x16, 0x24, 0x37, 0xa3, 0x7a, 0x12, 0x79, 0x41, 0xb3, 0xab, + 0x0e, 0x2f, 0x79, 0x79, 0xb9, 0x17, 0x2f, 0x47, 0x2f, 0xc0, 0x10, 0x8b, 0x7c, 0x91, 0xc2, 0xc7, + 0x07, 0x95, 0x9c, 0xc0, 0x4a, 0xf7, 0x77, 0xe7, 0x2a, 0xb7, 0xf0, 0x1a, 0xff, 0x83, 0x05, 0x2a, + 0x7a, 0x0b, 0x46, 0x37, 0x93, 0xa4, 0x75, 0x85, 0x38, 0x2e, 0x89, 0x24, 0x9f, 0x38, 0x77, 0x30, + 0x9f, 0xa0, 0xd3, 0xc1, 0x2b, 0xa4, 0x5b, 0x2b, 0x2d, 0x8b, 0xb1, 0x4e, 0xd1, 0xae, 0x03, 0xa4, + 0xb0, 0x87, 0xa4, 0x83, 0xd8, 0x3f, 0x5f, 0x82, 0xe1, 0x2b, 0x4e, 0xe0, 0xfa, 0x24, 0x42, 0xab, + 0x30, 0x40, 0x1e, 0x90, 0x86, 0x38, 0xc8, 0x73, 0xba, 0x9e, 0x1e, 0x76, 0xdc, 0xae, 0x46, 0xff, + 0x63, 0x56, 0x1f, 0x61, 0x18, 0xa6, 0xfd, 0xbe, 0xac, 0xbc, 0xc4, 0x9f, 0xcb, 0x9f, 0x05, 0xb5, + 0x28, 0xf8, 0x49, 0x29, 0x8a, 0xb0, 0x24, 0xc4, 0x2c, 0x50, 0x8d, 0x56, 0x9d, 0xb2, 0xb7, 0xa4, + 0x98, 0x66, 0xb7, 0xbe, 0x5c, 0xe3, 0xe8, 0x82, 0x2e, 0xb7, 0x40, 0xc9, 0x42, 0x9c, 0x92, 0xb3, + 0xd7, 0xa1, 0x42, 0x3f, 0xfe, 0xa2, 0xef, 0x39, 0x07, 0x9b, 0xc1, 0x9e, 0x83, 0x8a, 0x34, 0x44, + 0xc5, 0xc2, 0xe5, 0x9c, 0x51, 0x95, 0x76, 0xaa, 0x18, 0xa7, 0x70, 0xfb, 0x12, 0x4c, 0xb3, 0x5b, + 0x5e, 0x27, 0xd9, 0x34, 0xf6, 0x62, 0xee, 0xa2, 0xb7, 0xbf, 0x3d, 0x00, 0x27, 0xd6, 0xea, 0xcb, + 0x75, 0xd3, 0x22, 0x79, 0x09, 0xc6, 0xf8, 0xb1, 0x4f, 0x97, 0xb2, 0xe3, 0x8b, 0xfa, 0xea, 0x66, + 0x62, 0x5d, 0x83, 0x61, 0x03, 0x13, 0x3d, 0x0e, 0x65, 0xef, 0xdd, 0x20, 0xeb, 0x2b, 0xb8, 0xf6, + 0xda, 0x0d, 0x4c, 0xcb, 0x29, 0x98, 0x4a, 0x10, 0x9c, 0x75, 0x2a, 0xb0, 0x92, 0x22, 0x5e, 0x85, + 0x09, 0x2f, 0x6e, 0xc4, 0xde, 0x5a, 0x40, 0xf9, 0x8a, 0xd3, 0x90, 0x9b, 0x22, 0x15, 0xf9, 0x69, + 0x57, 0x15, 0x14, 0x67, 0xb0, 0x35, 0x3e, 0x3e, 0x58, 0x58, 0x0a, 0xc9, 0x75, 0x42, 0xa7, 0x02, + 0x56, 0x8b, 0x8d, 0x2e, 0x66, 0x9e, 0x47, 0x42, 0xc0, 0xe2, 0x03, 0x8e, 0xb1, 0x84, 0xa1, 0xcb, + 0x70, 0xa2, 0xb1, 0xe9, 0xb4, 0x16, 0xdb, 0xc9, 0x66, 0xd5, 0x8b, 0x1b, 0xe1, 0x36, 0x89, 0x76, + 0x98, 0x00, 0x3c, 0x92, 0xda, 0xb4, 0x14, 0x60, 0xf9, 0xca, 0x62, 0x8d, 0x62, 0xe2, 0xce, 0x3a, + 0xa6, 0x40, 0x02, 0x47, 0x20, 0x90, 0x2c, 0xc2, 0xa4, 0x6c, 0xb5, 0x4e, 0x62, 0x76, 0x44, 0x8c, + 0xb2, 0x7e, 0xaa, 0x58, 0x1e, 0x51, 0xac, 0x7a, 0x99, 0xc5, 0xb7, 0xdf, 0x81, 0x8a, 0xf2, 0x94, + 0x93, 0x0e, 0xa2, 0x56, 0x0f, 0x07, 0xd1, 0x7c, 0xe6, 0x2e, 0x6d, 0xe7, 0xe5, 0xae, 0xb6, 0xf3, + 0x7f, 0x6a, 0x41, 0xea, 0xea, 0x83, 0x30, 0x54, 0x5a, 0x21, 0xbb, 0x67, 0x8b, 0xe4, 0x85, 0xf6, + 0x53, 0x39, 0x7b, 0x9e, 0xf3, 0x1c, 0x3e, 0x21, 0x35, 0x59, 0x17, 0xa7, 0x64, 0xd0, 0x35, 0x18, + 0x6e, 0x45, 0xa4, 0x9e, 0xb0, 0xe8, 0x8e, 0x3e, 0x28, 0xf2, 0x85, 0xc0, 0x6b, 0x62, 0x49, 0xc2, + 0xfe, 0x97, 0x16, 0xc0, 0x35, 0x6f, 0xcb, 0x4b, 0xb0, 0x13, 0x34, 0xc9, 0x31, 0x28, 0xd6, 0x37, + 0x60, 0x20, 0x6e, 0x91, 0x46, 0xb1, 0x9b, 0xd2, 0xb4, 0x67, 0xf5, 0x16, 0x69, 0xa4, 0x9f, 0x83, + 0xfe, 0xc3, 0x8c, 0x8e, 0xfd, 0x3d, 0x80, 0x89, 0x14, 0x8d, 0x2a, 0x37, 0xe8, 0x79, 0x23, 0xac, + 0xe1, 0xd1, 0x4c, 0x58, 0x43, 0x85, 0x61, 0x6b, 0x91, 0x0c, 0x09, 0x94, 0xb7, 0x9c, 0x07, 0x42, + 0x97, 0x7a, 0xa9, 0x68, 0x87, 0x68, 0x4b, 0xf3, 0xd7, 0x9d, 0x07, 0x5c, 0x74, 0x7d, 0x4e, 0x2e, + 0xa4, 0xeb, 0xce, 0x83, 0x7d, 0x7e, 0x1f, 0xca, 0xb8, 0x13, 0x55, 0xde, 0xbe, 0xf0, 0x27, 0xe9, + 0x7f, 0x76, 0x0c, 0xd1, 0xe6, 0x58, 0xab, 0x5e, 0x20, 0x4c, 0xc1, 0x7d, 0xb6, 0xea, 0x05, 0xd9, + 0x56, 0xbd, 0xa0, 0x40, 0xab, 0x1e, 0xf3, 0xff, 0x1d, 0x16, 0x37, 0x28, 0xcc, 0x79, 0x72, 0xf4, + 0xe2, 0x47, 0xfb, 0x6a, 0x5a, 0x5c, 0xc5, 0xf0, 0xe6, 0x17, 0xa4, 0xbc, 0x2e, 0x4a, 0x73, 0xbb, + 0x20, 0x9b, 0x46, 0x7f, 0xcf, 0x82, 0x09, 0xf1, 0x1b, 0x93, 0x77, 0xdb, 0x24, 0x4e, 0x84, 0x5c, + 0xf0, 0x89, 0xc3, 0xf4, 0x46, 0x90, 0xe0, 0x9d, 0xfa, 0x88, 0x64, 0xbf, 0x26, 0x30, 0xb7, 0x6f, + 0x99, 0xfe, 0xa0, 0xef, 0x59, 0x30, 0xbd, 0xe5, 0x3c, 0xe0, 0x2d, 0xf2, 0x32, 0xec, 0x24, 0x5e, + 0x28, 0x1c, 0x44, 0x57, 0xfb, 0x5d, 0x27, 0x1d, 0x84, 0x78, 0x77, 0xa5, 0xef, 0xd7, 0x74, 0x37, + 0x94, 0xdc, 0x4e, 0x77, 0xed, 0xe1, 0xec, 0x06, 0x8c, 0xc8, 0x85, 0xd9, 0x45, 0x53, 0xaa, 0xea, + 0xe2, 0x4f, 0x8e, 0x5d, 0x62, 0x5e, 0x5a, 0x17, 0xe7, 0x5f, 0x6b, 0x3b, 0x41, 0xe2, 0x25, 0x3b, + 0x9a, 0x66, 0xc5, 0xda, 0x11, 0x4b, 0xf1, 0x48, 0xdb, 0x79, 0x07, 0xc6, 0xf4, 0x75, 0x77, 0xa4, + 0x6d, 0xbd, 0x0b, 0x27, 0xbb, 0xac, 0xaa, 0x23, 0x6d, 0xf2, 0x3e, 0x3c, 0xda, 0x73, 0x7d, 0x1c, + 0x65, 0xc3, 0xf6, 0x6f, 0x5a, 0x3a, 0xeb, 0x3c, 0x06, 0xbb, 0xd5, 0x75, 0xd3, 0x6e, 0x75, 0xae, + 0xe8, 0x1e, 0xea, 0x61, 0xbc, 0xda, 0xd0, 0xbb, 0x4f, 0x8f, 0x04, 0xb4, 0x0e, 0x43, 0x3e, 0x2d, + 0x91, 0xd7, 0x86, 0xe7, 0xfb, 0xd9, 0xa5, 0xa9, 0x04, 0xc6, 0xca, 0x63, 0x2c, 0x68, 0xd9, 0xdf, + 0xb3, 0x60, 0xe0, 0x2f, 0x30, 0xe8, 0xaa, 0x83, 0xb4, 0xc8, 0x42, 0x30, 0x8f, 0x9d, 0xfb, 0x2b, + 0x0f, 0x12, 0x12, 0xc4, 0x4c, 0x8c, 0xef, 0xe5, 0xf8, 0x30, 0x4a, 0x9b, 0x92, 0x7e, 0x2c, 0xaf, + 0xc0, 0xb8, 0xef, 0xdc, 0x25, 0xbe, 0xb4, 0xb9, 0x67, 0x95, 0xde, 0x6b, 0x3a, 0x10, 0x9b, 0xb8, + 0xb4, 0xf2, 0x86, 0x7e, 0x25, 0x21, 0x84, 0x24, 0x55, 0xd9, 0xb8, 0xaf, 0xc0, 0x26, 0x2e, 0xd5, + 0xba, 0xee, 0x3b, 0x49, 0x63, 0x53, 0x28, 0xc4, 0xaa, 0xbb, 0x77, 0x68, 0x21, 0xe6, 0x30, 0x2a, + 0xec, 0xc9, 0x15, 0x7b, 0x9b, 0x44, 0x4c, 0xd8, 0xe3, 0x42, 0xb5, 0x12, 0xf6, 0xb0, 0x09, 0xc6, + 0x59, 0x7c, 0xf4, 0x31, 0x98, 0xa0, 0x93, 0x13, 0xb6, 0x13, 0xe9, 0xa5, 0x33, 0xc8, 0xbc, 0x74, + 0x98, 0x93, 0xf7, 0xba, 0x01, 0xc1, 0x19, 0x4c, 0xfb, 0x2d, 0x38, 0x79, 0x2d, 0x74, 0xdc, 0x25, + 0xc7, 0x77, 0x82, 0x06, 0x89, 0xd6, 0x82, 0x66, 0xae, 0x07, 0x80, 0x7e, 0x4b, 0x5f, 0xca, 0xbb, + 0xa5, 0xb7, 0x23, 0x40, 0x7a, 0x03, 0xc2, 0xbf, 0xec, 0x4d, 0x18, 0xf6, 0x78, 0x53, 0x62, 0xd9, + 0x5e, 0xc8, 0x93, 0xa0, 0x3b, 0xfa, 0xa8, 0xf9, 0x4b, 0xf1, 0x02, 0x2c, 0x49, 0x52, 0x7d, 0xab, + 0x9b, 0xc8, 0x9d, 0xaf, 0x28, 0xdb, 0x7f, 0xcd, 0x82, 0xc9, 0x1b, 0x99, 0xa8, 0xe0, 0xa7, 0x61, + 0x88, 0x67, 0xa9, 0xc8, 0x5a, 0xa9, 0xea, 0xac, 0x14, 0x0b, 0xe8, 0x43, 0x37, 0x92, 0xfc, 0x52, + 0x09, 0x2a, 0xcc, 0x53, 0xb9, 0x45, 0x75, 0xa7, 0xa3, 0x17, 0x53, 0xaf, 0x1b, 0x62, 0x6a, 0x8e, + 0xa2, 0xae, 0x3a, 0xd6, 0x4b, 0x4a, 0x45, 0xb7, 0x54, 0xb4, 0x6c, 0x21, 0x1d, 0x3d, 0x25, 0xc8, + 0x23, 0x2a, 0x27, 0xcc, 0xe0, 0x5a, 0x19, 0x49, 0xcb, 0xee, 0xcd, 0x15, 0xee, 0xfb, 0xee, 0xde, + 0x5c, 0xf5, 0xac, 0x07, 0x73, 0xaa, 0x69, 0x9d, 0x67, 0xec, 0xfb, 0x67, 0x99, 0xff, 0xa9, 0xe3, + 0x7b, 0x9f, 0x25, 0x2a, 0xe8, 0x7c, 0x4e, 0xf8, 0x93, 0x8a, 0xd2, 0x7d, 0xc6, 0x67, 0xc4, 0x3f, + 0x9e, 0x53, 0x20, 0xad, 0x62, 0x5f, 0x81, 0xc9, 0xcc, 0xd4, 0xa1, 0x97, 0x60, 0xb0, 0xb5, 0xe9, + 0xc4, 0x24, 0xe3, 0x0a, 0x34, 0x58, 0xa3, 0x85, 0xfb, 0xbb, 0x73, 0x13, 0xaa, 0x02, 0x2b, 0xc1, + 0x1c, 0xdb, 0xfe, 0x62, 0x09, 0x06, 0x6e, 0x84, 0xee, 0x71, 0x2c, 0xb5, 0x2b, 0xc6, 0x52, 0x7b, + 0x3a, 0x3f, 0x23, 0x49, 0xcf, 0x55, 0x56, 0xcb, 0xac, 0xb2, 0x73, 0x05, 0x68, 0x1d, 0xbc, 0xc0, + 0xb6, 0x60, 0x94, 0x65, 0x3c, 0x11, 0xbe, 0x50, 0x2f, 0x18, 0x9a, 0xd5, 0x5c, 0x46, 0xb3, 0x9a, + 0xd4, 0x50, 0x35, 0xfd, 0xea, 0x19, 0x18, 0x16, 0xbe, 0x37, 0x59, 0xef, 0x5b, 0x81, 0x8b, 0x25, + 0xdc, 0xfe, 0x17, 0x65, 0x30, 0x32, 0xac, 0xa0, 0xdf, 0xb6, 0x60, 0x3e, 0xe2, 0x91, 0x4c, 0x6e, + 0xb5, 0x1d, 0x79, 0x41, 0xb3, 0xde, 0xd8, 0x24, 0x6e, 0xdb, 0xf7, 0x82, 0xe6, 0x5a, 0x33, 0x08, + 0x55, 0xf1, 0xca, 0x03, 0xd2, 0x68, 0x33, 0x53, 0x77, 0xe1, 0xc4, 0x2e, 0xea, 0xde, 0xf9, 0xe2, + 0xde, 0xee, 0xdc, 0x3c, 0xee, 0xab, 0x15, 0xdc, 0x67, 0xaf, 0xd0, 0x1f, 0x59, 0xb0, 0xc0, 0x73, + 0x8c, 0x14, 0x1f, 0x49, 0x21, 0x8d, 0xb4, 0x26, 0x89, 0xa6, 0xe4, 0xd6, 0x49, 0xb4, 0xb5, 0xf4, + 0xb2, 0x98, 0xe4, 0x85, 0x5a, 0x7f, 0xad, 0xe2, 0x7e, 0xbb, 0x69, 0xff, 0xeb, 0x32, 0x8c, 0xd3, + 0xf9, 0x4c, 0xf3, 0x0a, 0xbc, 0x64, 0x2c, 0x93, 0x27, 0x32, 0xcb, 0xe4, 0x84, 0x81, 0xfc, 0x70, + 0x52, 0x0a, 0xc4, 0x70, 0xc2, 0x77, 0xe2, 0xe4, 0x0a, 0x71, 0xa2, 0xe4, 0x2e, 0x71, 0xd8, 0xf5, + 0x6e, 0xd6, 0x75, 0xa4, 0xc0, 0x8d, 0xb1, 0xb2, 0x7d, 0x5d, 0xcb, 0x12, 0xc3, 0x9d, 0xf4, 0xd1, + 0x36, 0x20, 0x76, 0x95, 0x1c, 0x39, 0x41, 0xcc, 0xc7, 0xe2, 0x09, 0xd3, 0x78, 0x7f, 0xad, 0xce, + 0x8a, 0x56, 0xd1, 0xb5, 0x0e, 0x6a, 0xb8, 0x4b, 0x0b, 0x9a, 0xb3, 0xc0, 0x60, 0x51, 0x67, 0x81, + 0xa1, 0x1c, 0xb7, 0xf7, 0x2f, 0x59, 0x70, 0x92, 0x7e, 0x16, 0xd3, 0x45, 0x3a, 0x46, 0x21, 0x4c, + 0xd2, 0x65, 0xe7, 0x93, 0x44, 0x96, 0x89, 0xfd, 0x95, 0x23, 0x59, 0x9b, 0x74, 0x52, 0xf1, 0xed, + 0xaa, 0x49, 0x0c, 0x67, 0xa9, 0xdb, 0xdf, 0xb4, 0x80, 0x39, 0x2d, 0x1e, 0xc3, 0x61, 0x76, 0xd9, + 0x3c, 0xcc, 0xec, 0x7c, 0x8e, 0xd1, 0xe3, 0x1c, 0x7b, 0x11, 0xa6, 0x28, 0xb4, 0x16, 0x85, 0x0f, + 0x76, 0xa4, 0xa0, 0x9d, 0x6f, 0xcd, 0xfe, 0x52, 0x89, 0x6f, 0x1b, 0x15, 0x92, 0x89, 0xbe, 0x6c, + 0xc1, 0x48, 0xc3, 0x69, 0x39, 0x0d, 0x9e, 0x9f, 0xaa, 0x80, 0x75, 0xc6, 0xa8, 0x3f, 0xbf, 0x2c, + 0xea, 0x72, 0xcb, 0xc2, 0x87, 0xe5, 0xd0, 0x65, 0x71, 0xae, 0x35, 0x41, 0x35, 0x3e, 0x7b, 0x0f, + 0xc6, 0x0d, 0x62, 0x47, 0xaa, 0x86, 0x7e, 0xd9, 0xe2, 0x4c, 0x5f, 0xa9, 0x0a, 0xf7, 0xe1, 0x44, + 0xa0, 0xfd, 0xa7, 0xec, 0x4c, 0x4a, 0xc6, 0xf3, 0xc5, 0xd9, 0x3a, 0xe3, 0x82, 0x9a, 0x83, 0x66, + 0x86, 0x20, 0xee, 0x6c, 0xc3, 0xfe, 0x15, 0x0b, 0x1e, 0xd1, 0x11, 0xb5, 0x18, 0xda, 0x3c, 0xbb, + 0x71, 0x15, 0x46, 0xc2, 0x16, 0x89, 0x9c, 0x54, 0x2d, 0x3a, 0x27, 0xe7, 0xff, 0xa6, 0x28, 0xdf, + 0xdf, 0x9d, 0x9b, 0xd6, 0xa9, 0xcb, 0x72, 0xac, 0x6a, 0x22, 0x1b, 0x86, 0xd8, 0xbc, 0xc4, 0x22, + 0xfa, 0x99, 0xe5, 0x6b, 0x62, 0xf7, 0x52, 0x31, 0x16, 0x10, 0xfb, 0x6f, 0x5a, 0x7c, 0xb9, 0xe9, + 0x5d, 0x47, 0x9f, 0x83, 0xa9, 0x2d, 0xaa, 0x41, 0xad, 0x3c, 0x68, 0x45, 0xdc, 0xea, 0x2d, 0x67, + 0xec, 0xa5, 0xe2, 0x33, 0xa6, 0x0d, 0x77, 0x69, 0x46, 0xf4, 0x7e, 0xea, 0x7a, 0x86, 0x2c, 0xee, + 0x68, 0xc8, 0xfe, 0x07, 0x25, 0xbe, 0x67, 0x99, 0x0c, 0xf7, 0x0c, 0x0c, 0xb7, 0x42, 0x77, 0x79, + 0xad, 0x8a, 0xc5, 0x5c, 0x29, 0xa6, 0x53, 0xe3, 0xc5, 0x58, 0xc2, 0xd1, 0x45, 0x00, 0xf2, 0x20, + 0x21, 0x51, 0xe0, 0xf8, 0xea, 0x26, 0x5d, 0x89, 0x4a, 0x2b, 0x0a, 0x82, 0x35, 0x2c, 0x5a, 0xa7, + 0x15, 0x85, 0xdb, 0x9e, 0xcb, 0x82, 0x3f, 0xca, 0x66, 0x9d, 0x9a, 0x82, 0x60, 0x0d, 0x8b, 0xea, + 0xad, 0xed, 0x20, 0xe6, 0xc7, 0x98, 0x73, 0x57, 0xa4, 0x17, 0x1a, 0x49, 0xf5, 0xd6, 0x5b, 0x3a, + 0x10, 0x9b, 0xb8, 0xe8, 0x2a, 0x0c, 0x25, 0x0e, 0xbb, 0x1f, 0x1e, 0x2c, 0xe2, 0x6c, 0xb3, 0x4e, + 0x71, 0xf5, 0x7c, 0x4e, 0xb4, 0x2a, 0x16, 0x24, 0xec, 0xff, 0x54, 0x01, 0x48, 0xa5, 0x2e, 0xf4, + 0xc5, 0xce, 0x0d, 0xff, 0x91, 0xa2, 0x22, 0xdb, 0xc3, 0xdb, 0xed, 0xe8, 0xab, 0x16, 0x8c, 0x3a, + 0xbe, 0x1f, 0x36, 0x9c, 0x84, 0x4d, 0x4f, 0xa9, 0x28, 0xeb, 0x11, 0x3d, 0x59, 0x4c, 0xeb, 0xf2, + 0xce, 0xbc, 0x20, 0xef, 0x6c, 0x35, 0x48, 0x6e, 0x7f, 0xf4, 0x2e, 0xa0, 0x0f, 0x4b, 0xa9, 0x9d, + 0x7f, 0xe1, 0xd9, 0xac, 0xd4, 0x5e, 0x61, 0x0c, 0x57, 0x13, 0xd8, 0xd1, 0x5b, 0x46, 0x3a, 0x9e, + 0x81, 0x22, 0x11, 0xbc, 0x86, 0x1c, 0x92, 0x97, 0x89, 0x07, 0xbd, 0xa1, 0x7b, 0xa5, 0x0f, 0x16, + 0x09, 0x91, 0xd7, 0xc4, 0xe1, 0x1c, 0x8f, 0xf4, 0x04, 0x26, 0x5d, 0xf3, 0xe4, 0x15, 0x9e, 0x75, + 0x17, 0xf2, 0x5b, 0xc8, 0x1c, 0xd9, 0xe9, 0x59, 0x9b, 0x01, 0xe0, 0x6c, 0x13, 0xe8, 0x0d, 0x1e, + 0x33, 0xb0, 0x16, 0x6c, 0x84, 0xc2, 0xbb, 0xee, 0x7c, 0x81, 0x6f, 0xbe, 0x13, 0x27, 0x64, 0x8b, + 0xd6, 0x49, 0x0f, 0xd7, 0x1b, 0x82, 0x0a, 0x56, 0xf4, 0xd0, 0x3a, 0x0c, 0xb1, 0x80, 0xad, 0x78, + 0x66, 0xa4, 0x88, 0x25, 0xce, 0x8c, 0x53, 0x4e, 0xf7, 0x0f, 0xfb, 0x1b, 0x63, 0x41, 0x0b, 0x5d, + 0x91, 0x99, 0x0a, 0xe2, 0xb5, 0xe0, 0x56, 0x4c, 0x58, 0xa6, 0x82, 0xca, 0xd2, 0x87, 0xd2, 0xd4, + 0x03, 0xbc, 0xbc, 0x6b, 0x42, 0x42, 0xa3, 0x26, 0x15, 0x6c, 0xc4, 0x7f, 0x99, 0xe7, 0x70, 0x06, + 0x8a, 0x74, 0xd4, 0xcc, 0x8a, 0x98, 0x4e, 0xf6, 0x6d, 0x93, 0x18, 0xce, 0x52, 0x3f, 0xd6, 0x23, + 0x75, 0x36, 0x80, 0xa9, 0xec, 0xa6, 0x3c, 0xd2, 0x23, 0xfc, 0xc7, 0x03, 0x30, 0x61, 0x2e, 0x0e, + 0xb4, 0x00, 0x15, 0x41, 0x44, 0xe5, 0x3d, 0x53, 0x7b, 0xe0, 0xba, 0x04, 0xe0, 0x14, 0x87, 0x65, + 0x80, 0x63, 0xd5, 0x35, 0xbf, 0xaa, 0x34, 0x03, 0x9c, 0x82, 0x60, 0x0d, 0x8b, 0x4a, 0xc2, 0x77, + 0xc3, 0x30, 0x51, 0x27, 0x81, 0x5a, 0x37, 0x4b, 0xac, 0x14, 0x0b, 0x28, 0x3d, 0x01, 0xee, 0xd1, + 0x8f, 0xe9, 0x9b, 0x56, 0x45, 0x75, 0x02, 0x5c, 0xd5, 0x81, 0xd8, 0xc4, 0xa5, 0x27, 0x5a, 0x18, + 0xb3, 0x85, 0x28, 0xe4, 0xed, 0xd4, 0x4f, 0xad, 0xce, 0x83, 0x18, 0x25, 0x1c, 0x7d, 0x0a, 0x1e, + 0x51, 0x31, 0x87, 0x98, 0x5b, 0x69, 0x65, 0x8b, 0x43, 0x86, 0xca, 0xfc, 0xc8, 0x72, 0x77, 0x34, + 0xdc, 0xab, 0x3e, 0x7a, 0x15, 0x26, 0x84, 0xac, 0x2c, 0x29, 0x0e, 0x9b, 0xee, 0x06, 0x57, 0x0d, + 0x28, 0xce, 0x60, 0xa3, 0x2a, 0x4c, 0xd1, 0x12, 0x26, 0xa4, 0x4a, 0x0a, 0x3c, 0x76, 0x52, 0x1d, + 0xf5, 0x57, 0x33, 0x70, 0xdc, 0x51, 0x03, 0x2d, 0xc2, 0x24, 0x17, 0x56, 0xa8, 0x62, 0xc8, 0xbe, + 0x83, 0x70, 0x89, 0x55, 0x1b, 0xe1, 0xa6, 0x09, 0xc6, 0x59, 0x7c, 0x74, 0x09, 0xc6, 0x9c, 0xa8, + 0xb1, 0xe9, 0x25, 0xa4, 0x91, 0xb4, 0x23, 0x9e, 0x07, 0x44, 0xf3, 0xd7, 0x58, 0xd4, 0x60, 0xd8, + 0xc0, 0xb4, 0x3f, 0x0b, 0x27, 0xbb, 0xf8, 0xdf, 0xd3, 0x85, 0xe3, 0xb4, 0x3c, 0x39, 0xa6, 0x8c, + 0xc7, 0xd9, 0x62, 0x6d, 0x4d, 0x8e, 0x46, 0xc3, 0xa2, 0xab, 0x93, 0x99, 0xa7, 0xb5, 0xb4, 0xa4, + 0x6a, 0x75, 0xae, 0x4a, 0x00, 0x4e, 0x71, 0xec, 0x3f, 0xaf, 0x80, 0x66, 0xbd, 0x29, 0xe0, 0x65, + 0x74, 0x09, 0xc6, 0x64, 0xa6, 0x5d, 0x2d, 0xc3, 0xa5, 0x1a, 0xe6, 0x65, 0x0d, 0x86, 0x0d, 0x4c, + 0xda, 0xb7, 0x40, 0xda, 0xa4, 0xb2, 0xfe, 0x6d, 0xca, 0x58, 0x85, 0x53, 0x1c, 0x74, 0x1e, 0x46, + 0x62, 0xe2, 0x6f, 0x5c, 0xf3, 0x82, 0x7b, 0x62, 0x61, 0x2b, 0xce, 0x5c, 0x17, 0xe5, 0x58, 0x61, + 0xa0, 0x25, 0x28, 0xb7, 0x3d, 0x57, 0x2c, 0x65, 0x29, 0x36, 0x94, 0x6f, 0xad, 0x55, 0xf7, 0x77, + 0xe7, 0x9e, 0xe8, 0x95, 0xc0, 0x98, 0xea, 0xe7, 0xf1, 0x3c, 0xdd, 0x7e, 0xb4, 0x72, 0x37, 0x3b, + 0xfd, 0x50, 0x9f, 0x76, 0xfa, 0x8b, 0x00, 0x62, 0xd4, 0x72, 0x2d, 0x97, 0xd3, 0xaf, 0x76, 0x59, + 0x41, 0xb0, 0x86, 0x45, 0xb5, 0xfc, 0x46, 0x44, 0x1c, 0xa9, 0x08, 0x73, 0xbf, 0xf0, 0x91, 0xc3, + 0x6b, 0xf9, 0xcb, 0x59, 0x62, 0xb8, 0x93, 0x3e, 0x0a, 0xe1, 0x84, 0x2b, 0x02, 0x5b, 0xd3, 0x46, + 0x2b, 0xfd, 0x3b, 0xa3, 0x33, 0x97, 0x9a, 0x2c, 0x21, 0xdc, 0x49, 0x1b, 0x7d, 0x06, 0x66, 0x65, + 0x61, 0x67, 0x54, 0x31, 0xdb, 0x2e, 0xe5, 0xa5, 0x33, 0x7b, 0xbb, 0x73, 0xb3, 0xd5, 0x9e, 0x58, + 0xf8, 0x00, 0x0a, 0xe8, 0x4d, 0x18, 0x62, 0xf7, 0x3a, 0xf1, 0xcc, 0x28, 0x3b, 0xf1, 0x5e, 0x2c, + 0x12, 0xd2, 0x40, 0x57, 0xfd, 0x3c, 0xbb, 0x1d, 0x12, 0xce, 0xba, 0xe9, 0x65, 0x19, 0x2b, 0xc4, + 0x82, 0x26, 0x6a, 0xc1, 0xa8, 0x13, 0x04, 0x61, 0xe2, 0x70, 0x41, 0x6c, 0xac, 0x88, 0x2c, 0xa9, + 0x35, 0xb1, 0x98, 0xd6, 0xe5, 0xed, 0x28, 0xff, 0x3f, 0x0d, 0x82, 0xf5, 0x26, 0xd0, 0x7d, 0x98, + 0x0c, 0xef, 0x53, 0x86, 0x29, 0xaf, 0x36, 0xe2, 0x99, 0x71, 0x73, 0x60, 0x39, 0x86, 0x5a, 0xa3, + 0xb2, 0xc6, 0xc9, 0x4c, 0xa2, 0x38, 0xdb, 0x0a, 0x9a, 0x37, 0xcc, 0xd5, 0x13, 0xa9, 0x4b, 0x7a, + 0x6a, 0xae, 0xd6, 0xad, 0xd3, 0x2c, 0x72, 0x9d, 0xbb, 0xa1, 0x32, 0x8e, 0x30, 0x99, 0x89, 0x5c, + 0x4f, 0x41, 0x58, 0xc7, 0x9b, 0xfd, 0x28, 0x8c, 0x6a, 0x13, 0xdf, 0x8f, 0xef, 0xf3, 0xec, 0xab, + 0x30, 0x95, 0x9d, 0xd0, 0xbe, 0x7c, 0xa7, 0xff, 0x57, 0x09, 0x26, 0xbb, 0xdc, 0x1b, 0xdd, 0xf3, + 0x98, 0xff, 0xbe, 0xc1, 0xfa, 0xae, 0x7a, 0x81, 0x8b, 0x19, 0xc4, 0x64, 0x60, 0xa5, 0x02, 0x0c, + 0x4c, 0x72, 0xd3, 0x72, 0x4f, 0x6e, 0x2a, 0x98, 0xd6, 0xc0, 0x7b, 0x61, 0x5a, 0xe6, 0x39, 0x31, + 0x58, 0xe8, 0x9c, 0x78, 0x08, 0x8c, 0xce, 0x38, 0x6a, 0x86, 0x0b, 0x1c, 0x35, 0xdf, 0x28, 0xc1, + 0x54, 0xea, 0x27, 0x2e, 0xd2, 0x6f, 0x1f, 0xfd, 0x35, 0xc4, 0xba, 0x71, 0x0d, 0x91, 0x97, 0x5d, + 0x3b, 0xd3, 0xbf, 0x9e, 0x57, 0x12, 0x6f, 0x66, 0xae, 0x24, 0x5e, 0xec, 0x93, 0xee, 0xc1, 0xd7, + 0x13, 0xdf, 0x2d, 0xc1, 0xa9, 0x6c, 0x95, 0x65, 0xdf, 0xf1, 0xb6, 0x8e, 0x61, 0xbe, 0x3e, 0x65, + 0xcc, 0xd7, 0xcb, 0xfd, 0x8d, 0x8b, 0x75, 0xb2, 0xe7, 0xa4, 0x39, 0x99, 0x49, 0xfb, 0xe8, 0x61, + 0x88, 0x1f, 0x3c, 0x73, 0xbf, 0x6f, 0xc1, 0xa3, 0x5d, 0xeb, 0x1d, 0x83, 0xe1, 0xf5, 0x75, 0xd3, + 0xf0, 0xfa, 0xc2, 0x21, 0x46, 0xd7, 0xc3, 0x12, 0xfb, 0xab, 0xe5, 0x1e, 0xa3, 0x62, 0xa6, 0xa9, + 0x9b, 0x30, 0xea, 0x34, 0x1a, 0x24, 0x8e, 0xaf, 0x87, 0xae, 0xca, 0x81, 0xf5, 0x3c, 0x3b, 0x5b, + 0xd2, 0xe2, 0xfd, 0xdd, 0xb9, 0xd9, 0x2c, 0x89, 0x14, 0x8c, 0x75, 0x0a, 0x66, 0x76, 0xbe, 0xd2, + 0x11, 0x65, 0xe7, 0xbb, 0x08, 0xb0, 0xad, 0xb4, 0xd8, 0xac, 0xc5, 0x4b, 0xd3, 0x6f, 0x35, 0x2c, + 0xf4, 0x97, 0x99, 0x44, 0xc8, 0x9d, 0x34, 0x06, 0xcc, 0x90, 0xd3, 0x9c, 0xef, 0xa7, 0x3b, 0x7c, + 0xf0, 0xc8, 0x56, 0x65, 0x1d, 0x54, 0x24, 0xd1, 0x27, 0x60, 0x2a, 0xe6, 0xf9, 0x13, 0x96, 0x7d, + 0x27, 0x66, 0x01, 0x12, 0x82, 0x9f, 0xb2, 0x20, 0xd5, 0x7a, 0x06, 0x86, 0x3b, 0xb0, 0xed, 0xef, + 0x94, 0xe1, 0x83, 0x07, 0x2c, 0x5b, 0xb4, 0x68, 0xde, 0xda, 0x3e, 0x97, 0xb5, 0xff, 0xcc, 0x76, + 0xad, 0x6c, 0x18, 0x84, 0x32, 0x5f, 0xbb, 0xf4, 0x9e, 0xbf, 0xf6, 0xd7, 0x74, 0x6b, 0x1d, 0xf7, + 0xdb, 0xbc, 0x7c, 0xe8, 0x8d, 0xf9, 0x93, 0x6a, 0xac, 0xff, 0x82, 0x05, 0x4f, 0x74, 0x1d, 0x96, + 0xe1, 0x25, 0xb2, 0x00, 0x95, 0x06, 0x2d, 0xd4, 0xc2, 0x99, 0xd2, 0x38, 0x42, 0x09, 0xc0, 0x29, + 0x8e, 0xe1, 0x0c, 0x52, 0xca, 0x75, 0x06, 0xf9, 0x1d, 0x0b, 0xa6, 0xb3, 0x9d, 0x38, 0x06, 0xbe, + 0x55, 0x37, 0xf9, 0xd6, 0x7c, 0x7f, 0x1f, 0xbf, 0x07, 0xcb, 0xfa, 0x6f, 0x13, 0x70, 0xba, 0xe3, + 0xd4, 0xe3, 0xb3, 0xf8, 0x73, 0x16, 0x9c, 0x68, 0x32, 0xe9, 0x5d, 0x8b, 0x19, 0x13, 0xe3, 0xca, + 0x09, 0xb4, 0x3b, 0x30, 0xd4, 0x8c, 0xeb, 0x22, 0x1d, 0x28, 0xb8, 0xb3, 0x31, 0xf4, 0x15, 0x0b, + 0xa6, 0x9d, 0xfb, 0x71, 0xc7, 0xe3, 0x30, 0x62, 0x21, 0xbd, 0x9a, 0x63, 0x2c, 0xcb, 0x79, 0x56, + 0x66, 0x69, 0x66, 0x6f, 0x77, 0x6e, 0xba, 0x1b, 0x16, 0xee, 0xda, 0x2a, 0xfd, 0xbe, 0x9b, 0x22, + 0x76, 0xa4, 0x58, 0xf4, 0x63, 0xb7, 0x48, 0x13, 0xce, 0xd6, 0x24, 0x04, 0x2b, 0x8a, 0xe8, 0x6d, + 0xa8, 0x34, 0x65, 0x98, 0x58, 0x96, 0x6d, 0xf6, 0x98, 0xe6, 0x6e, 0x51, 0x65, 0xdc, 0x77, 0x5f, + 0x81, 0x70, 0x4a, 0x14, 0x5d, 0x81, 0x72, 0xb0, 0x11, 0x8b, 0x80, 0xec, 0x3c, 0x1f, 0x20, 0xd3, + 0xf3, 0x8a, 0xc7, 0xb0, 0xde, 0x58, 0xad, 0x63, 0x4a, 0x82, 0x52, 0x8a, 0xee, 0xba, 0xc2, 0x4a, + 0x9c, 0x43, 0x09, 0x2f, 0x55, 0x3b, 0x29, 0xe1, 0xa5, 0x2a, 0xa6, 0x24, 0x50, 0x0d, 0x06, 0x59, + 0x64, 0x8a, 0x30, 0x01, 0xe7, 0x44, 0xed, 0x77, 0xc4, 0xdf, 0xf0, 0x24, 0x92, 0xac, 0x18, 0x73, + 0x42, 0x68, 0x1d, 0x86, 0x1a, 0xec, 0x1d, 0x04, 0xa1, 0x9b, 0xe7, 0xe5, 0xb3, 0xe8, 0x78, 0x33, + 0x81, 0xdf, 0x7b, 0xf1, 0x72, 0x2c, 0x68, 0x31, 0xaa, 0xa4, 0xb5, 0xb9, 0x11, 0x0b, 0xe5, 0x3b, + 0x8f, 0x6a, 0xc7, 0x8b, 0x16, 0x82, 0x2a, 0x2b, 0xc7, 0x82, 0x16, 0xaa, 0x42, 0x69, 0xa3, 0x21, + 0x02, 0x57, 0x72, 0x4c, 0xbf, 0x66, 0x40, 0xf2, 0xd2, 0xd0, 0xde, 0xee, 0x5c, 0x69, 0x75, 0x19, + 0x97, 0x36, 0x1a, 0xe8, 0x75, 0x18, 0xde, 0xe0, 0x21, 0xa6, 0x22, 0xef, 0xec, 0x85, 0xbc, 0x38, + 0xd8, 0x8e, 0x78, 0x54, 0x1e, 0x9f, 0x21, 0x00, 0x58, 0x92, 0x63, 0x29, 0xf9, 0x54, 0xd0, 0xac, + 0x48, 0x3c, 0x3b, 0xdf, 0x5f, 0x90, 0xad, 0xd0, 0x49, 0x55, 0x29, 0xd6, 0x28, 0xd2, 0x35, 0xef, + 0xc8, 0x27, 0x5d, 0x58, 0xd2, 0xd9, 0xdc, 0x35, 0xdf, 0xf5, 0x05, 0x18, 0xbe, 0xe6, 0x15, 0x08, + 0xa7, 0x44, 0x51, 0x1b, 0xc6, 0xb7, 0xe3, 0xd6, 0x26, 0x91, 0x5b, 0x9f, 0x65, 0xa2, 0x1d, 0xbd, + 0xf8, 0xf1, 0x9c, 0xf4, 0xc2, 0xa2, 0x8a, 0x17, 0x25, 0x6d, 0xc7, 0xef, 0xe0, 0x60, 0x2c, 0x07, + 0xda, 0x6d, 0x9d, 0x2c, 0x36, 0x5b, 0xa1, 0x9f, 0xe4, 0xdd, 0x76, 0x78, 0x77, 0x27, 0x21, 0x22, + 0x53, 0x6d, 0xce, 0x27, 0x79, 0x8d, 0x23, 0x77, 0x7e, 0x12, 0x01, 0xc0, 0x92, 0x9c, 0x9a, 0x32, + 0xc6, 0x8d, 0xa7, 0x0a, 0x4f, 0x59, 0xc7, 0x18, 0xd2, 0x29, 0x63, 0xdc, 0x37, 0x25, 0xca, 0xb8, + 0x6e, 0x6b, 0x33, 0x4c, 0xc2, 0x20, 0xc3, 0xfb, 0x4f, 0x14, 0xe1, 0xba, 0xb5, 0x2e, 0x35, 0x3b, + 0xb9, 0x6e, 0x37, 0x2c, 0xdc, 0xb5, 0x55, 0x14, 0xc0, 0x44, 0x2b, 0x8c, 0x92, 0xfb, 0x61, 0x24, + 0xd7, 0x21, 0x2a, 0xa4, 0x23, 0x1a, 0x75, 0x44, 0xdb, 0xcc, 0x0d, 0xd7, 0x84, 0xe0, 0x0c, 0x75, + 0xfa, 0xe9, 0xe2, 0x86, 0xe3, 0x93, 0xb5, 0x9b, 0x33, 0x27, 0x8b, 0x7c, 0xba, 0x3a, 0x47, 0xee, + 0xfc, 0x74, 0x02, 0x80, 0x25, 0x39, 0xfb, 0x57, 0x86, 0x3a, 0x05, 0x07, 0xa6, 0x1a, 0xfc, 0x8d, + 0xce, 0x9b, 0xd8, 0x4f, 0xf4, 0xaf, 0x01, 0x3f, 0xc4, 0x3b, 0xd9, 0xaf, 0x58, 0x70, 0xba, 0xd5, + 0x55, 0x2c, 0x10, 0x47, 0x6f, 0xbf, 0x8a, 0x34, 0x9f, 0x16, 0x95, 0x50, 0xba, 0x3b, 0x1c, 0xf7, + 0x68, 0x33, 0x2b, 0x4c, 0x97, 0xdf, 0xb3, 0x30, 0x7d, 0x07, 0x46, 0x98, 0xf4, 0x97, 0xa6, 0x8b, + 0xe9, 0x33, 0xb3, 0x0a, 0x3b, 0xc4, 0x97, 0x05, 0x09, 0xac, 0x88, 0xd1, 0x89, 0x7b, 0x3c, 0x3b, + 0x08, 0x4c, 0x18, 0x58, 0xa4, 0x31, 0xe4, 0x9a, 0xca, 0xaa, 0x98, 0x89, 0xc7, 0x6b, 0x07, 0x21, + 0xef, 0xe7, 0x21, 0xe0, 0x83, 0x1b, 0x43, 0xd5, 0x2e, 0xaa, 0xd2, 0x90, 0x79, 0xed, 0x92, 0xaf, + 0x2e, 0x1d, 0xaf, 0x88, 0xff, 0x0f, 0xad, 0x2e, 0x12, 0x29, 0x57, 0xcb, 0x3e, 0x6e, 0xaa, 0x65, + 0x4f, 0x67, 0xd5, 0xb2, 0x0e, 0x63, 0x8c, 0xa1, 0x91, 0x15, 0x4f, 0xc3, 0x5a, 0x34, 0x1f, 0x8e, + 0xed, 0xc3, 0xd9, 0x3c, 0x76, 0xc7, 0x5c, 0xb1, 0x5c, 0x75, 0x09, 0x99, 0xba, 0x62, 0xb9, 0x6b, + 0x55, 0xcc, 0x20, 0x45, 0x53, 0x2a, 0xd8, 0x3f, 0x5f, 0x82, 0x72, 0x2d, 0x74, 0x8f, 0xc1, 0xb8, + 0x74, 0xd9, 0x30, 0x2e, 0x3d, 0x95, 0xfb, 0xc4, 0x5f, 0x4f, 0x53, 0xd2, 0xcd, 0x8c, 0x29, 0xe9, + 0x67, 0xf2, 0x49, 0x1d, 0x6c, 0x38, 0xfa, 0x5e, 0x19, 0xf4, 0x47, 0x0a, 0xd1, 0x7f, 0x38, 0x8c, + 0x87, 0x6e, 0xb9, 0xd8, 0xbb, 0x85, 0xa2, 0x0d, 0xe6, 0xc9, 0x25, 0xe3, 0xfa, 0x7e, 0x62, 0x1d, + 0x75, 0xef, 0x10, 0xaf, 0xb9, 0x99, 0x10, 0x37, 0x3b, 0xb0, 0xe3, 0x73, 0xd4, 0xfd, 0x33, 0x0b, + 0x26, 0x33, 0xad, 0x23, 0xbf, 0x5b, 0x40, 0xd0, 0x21, 0xcd, 0x45, 0x27, 0x72, 0x23, 0x88, 0xe6, + 0x01, 0x94, 0xd5, 0x5f, 0x9a, 0x64, 0x98, 0x74, 0xaa, 0xae, 0x05, 0x62, 0xac, 0x61, 0xa0, 0x97, + 0x60, 0x34, 0x09, 0x5b, 0xa1, 0x1f, 0x36, 0x77, 0xae, 0x12, 0x99, 0xec, 0x43, 0xdd, 0x98, 0xac, + 0xa7, 0x20, 0xac, 0xe3, 0xd9, 0xdf, 0x2f, 0x43, 0xf6, 0x89, 0xcb, 0xff, 0xbf, 0x4e, 0x7f, 0x72, + 0xd6, 0xe9, 0x1f, 0x5a, 0x30, 0x45, 0x5b, 0x67, 0xae, 0x33, 0xd2, 0xa1, 0x56, 0xbd, 0x09, 0x61, + 0x1d, 0xf0, 0x26, 0xc4, 0xd3, 0x94, 0xdb, 0xb9, 0x61, 0x3b, 0x11, 0x46, 0x24, 0x8d, 0x89, 0xd1, + 0x52, 0x2c, 0xa0, 0x02, 0x8f, 0x44, 0x91, 0x88, 0x3c, 0xd2, 0xf1, 0x48, 0x14, 0x61, 0x01, 0x95, + 0x4f, 0x46, 0x0c, 0xf4, 0x78, 0x32, 0x82, 0xa5, 0xcb, 0x12, 0xee, 0x1a, 0x42, 0xac, 0xd0, 0xd2, + 0x65, 0x49, 0x3f, 0x8e, 0x14, 0xc7, 0xfe, 0x56, 0x19, 0xc6, 0x6a, 0xa1, 0x9b, 0x7a, 0xca, 0xbf, + 0x68, 0x78, 0xca, 0x9f, 0xcd, 0x78, 0xca, 0x4f, 0xe9, 0xb8, 0x0f, 0xc7, 0x51, 0x5e, 0xa4, 0x55, + 0x63, 0x8f, 0x9a, 0x1c, 0xd2, 0x49, 0xde, 0x48, 0xab, 0xa6, 0x08, 0x61, 0x93, 0xee, 0x4f, 0x93, + 0x73, 0xfc, 0xff, 0xb1, 0x60, 0xa2, 0x16, 0xba, 0x74, 0x81, 0xfe, 0x34, 0xad, 0x46, 0x3d, 0x19, + 0xdb, 0xd0, 0x01, 0xc9, 0xd8, 0x7e, 0xcd, 0x82, 0xe1, 0x5a, 0xe8, 0x1e, 0x83, 0x81, 0x75, 0xd5, + 0x34, 0xb0, 0x3e, 0x91, 0xcb, 0x79, 0x7b, 0xd8, 0x54, 0xbf, 0x53, 0x86, 0x71, 0xda, 0xe3, 0xb0, + 0x29, 0xbf, 0x97, 0x31, 0x37, 0x56, 0x81, 0xb9, 0xa1, 0x22, 0x61, 0xe8, 0xfb, 0xe1, 0xfd, 0xec, + 0xb7, 0x5b, 0x65, 0xa5, 0x58, 0x40, 0xd1, 0x79, 0x18, 0x69, 0x45, 0x64, 0xdb, 0x0b, 0xdb, 0x71, + 0x36, 0x8a, 0xb1, 0x26, 0xca, 0xb1, 0xc2, 0x40, 0x2f, 0xc2, 0x58, 0xec, 0x05, 0x0d, 0x22, 0x9d, + 0x39, 0x06, 0x98, 0x33, 0x07, 0xcf, 0x7b, 0xa9, 0x95, 0x63, 0x03, 0x0b, 0xdd, 0x81, 0x0a, 0xfb, + 0xcf, 0x76, 0x50, 0xff, 0x6f, 0x3e, 0xf0, 0xdc, 0x2a, 0x92, 0x00, 0x4e, 0x69, 0xa1, 0x8b, 0x00, + 0x89, 0x74, 0x3b, 0x89, 0x45, 0x72, 0x19, 0x25, 0x97, 0x2a, 0x87, 0x94, 0x18, 0x6b, 0x58, 0xe8, + 0x39, 0xa8, 0x24, 0x8e, 0xe7, 0x5f, 0xf3, 0x02, 0x12, 0x0b, 0xb7, 0x1d, 0x91, 0xc3, 0x5a, 0x14, + 0xe2, 0x14, 0x4e, 0xcf, 0x7b, 0x16, 0x43, 0xcd, 0xdf, 0x93, 0x19, 0x61, 0xd8, 0xec, 0xbc, 0xbf, + 0xa6, 0x4a, 0xb1, 0x86, 0x61, 0x5f, 0x82, 0x53, 0xb5, 0xd0, 0xad, 0x85, 0x51, 0xb2, 0x1a, 0x46, + 0xf7, 0x9d, 0xc8, 0x95, 0xdf, 0x6f, 0x4e, 0xa6, 0x4e, 0xa6, 0x67, 0xf2, 0x20, 0xb7, 0x39, 0x1a, + 0xa9, 0x90, 0x5f, 0x60, 0x27, 0x7e, 0x9f, 0x21, 0x18, 0x7f, 0x50, 0x06, 0x54, 0x63, 0x8e, 0x31, + 0xc6, 0xf3, 0x43, 0x9b, 0x30, 0x11, 0x93, 0x6b, 0x5e, 0xd0, 0x7e, 0x20, 0x48, 0x15, 0x8b, 0x79, + 0xa9, 0xaf, 0xe8, 0x75, 0xb8, 0xa5, 0xc3, 0x2c, 0xc3, 0x19, 0xba, 0xf4, 0xcb, 0x46, 0xed, 0x60, + 0x31, 0xbe, 0x15, 0x93, 0x48, 0x3c, 0xb7, 0xf3, 0x51, 0x76, 0x11, 0x28, 0x0b, 0xf7, 0x77, 0xe7, + 0xce, 0xe5, 0xb8, 0x37, 0x04, 0xde, 0x03, 0x8a, 0xb9, 0x56, 0xc5, 0x29, 0x2d, 0xba, 0xd0, 0xd8, + 0x9f, 0x1b, 0x61, 0x80, 0xc3, 0x30, 0x91, 0x4b, 0x93, 0x3d, 0xd5, 0xa0, 0x95, 0x63, 0x03, 0x0b, + 0xc5, 0x80, 0xe2, 0x76, 0xab, 0xe5, 0xb3, 0x7b, 0x49, 0xc7, 0xbf, 0x1c, 0x85, 0xed, 0x16, 0xf7, + 0xa5, 0x2e, 0x2f, 0x2d, 0x53, 0x1e, 0x5c, 0xef, 0x80, 0xee, 0xef, 0xce, 0x3d, 0x93, 0xdf, 0x41, + 0x86, 0xbb, 0x56, 0xc5, 0x5d, 0xc8, 0x23, 0x0c, 0xc3, 0x1b, 0x31, 0xfb, 0x2d, 0x22, 0xb5, 0x2f, + 0x31, 0x43, 0x68, 0x9d, 0x15, 0xf5, 0x47, 0x5e, 0x12, 0xb2, 0x3f, 0xcf, 0x8e, 0x59, 0xf6, 0x1a, + 0x4b, 0xd2, 0x8e, 0x08, 0xda, 0x82, 0xf1, 0x16, 0x3b, 0x4a, 0x93, 0x28, 0xf4, 0x7d, 0x22, 0xa5, + 0xdc, 0xc3, 0x39, 0x08, 0xf1, 0xf7, 0x17, 0x74, 0x72, 0xd8, 0xa4, 0x6e, 0xff, 0xf7, 0x09, 0xc6, + 0x31, 0xc5, 0xa5, 0xf3, 0xb0, 0x70, 0x05, 0x16, 0xf2, 0xe4, 0x87, 0x8a, 0xbc, 0xab, 0x96, 0x9e, + 0x46, 0xc2, 0xb1, 0x18, 0x4b, 0x2a, 0xe8, 0xd3, 0xcc, 0xd1, 0x9d, 0xb3, 0xa9, 0xe2, 0xaf, 0x45, + 0x72, 0x7c, 0xc3, 0xc9, 0x5d, 0x90, 0xc0, 0x1a, 0x39, 0x74, 0x0d, 0xc6, 0xc5, 0xe3, 0x1d, 0xc2, + 0x58, 0x52, 0x36, 0x14, 0xfd, 0x71, 0xac, 0x03, 0xf7, 0xb3, 0x05, 0xd8, 0xac, 0x8c, 0x9a, 0xf0, + 0xb8, 0xf6, 0x38, 0x55, 0x17, 0x67, 0x36, 0xce, 0xff, 0x9e, 0xd8, 0xdb, 0x9d, 0x7b, 0x7c, 0xfd, + 0x20, 0x44, 0x7c, 0x30, 0x1d, 0x74, 0x13, 0x4e, 0x39, 0x8d, 0xc4, 0xdb, 0x26, 0x55, 0xe2, 0xb8, + 0xbe, 0x17, 0x10, 0x33, 0xf6, 0xff, 0xd1, 0xbd, 0xdd, 0xb9, 0x53, 0x8b, 0xdd, 0x10, 0x70, 0xf7, + 0x7a, 0xe8, 0xe3, 0x50, 0x71, 0x83, 0x58, 0xcc, 0xc1, 0x90, 0xf1, 0x16, 0x5b, 0xa5, 0x7a, 0xa3, + 0xae, 0xc6, 0x9f, 0xfe, 0xc1, 0x69, 0x05, 0xf4, 0x2e, 0x8c, 0xe9, 0xc1, 0x45, 0xe2, 0x0d, 0xc0, + 0x97, 0x0b, 0x69, 0xf1, 0x46, 0x44, 0x0e, 0xb7, 0x23, 0x2a, 0xa7, 0x51, 0x23, 0x58, 0xc7, 0x68, + 0x02, 0x7d, 0x12, 0x50, 0x4c, 0xa2, 0x6d, 0xaf, 0x41, 0x16, 0x1b, 0x2c, 0x65, 0x2d, 0xb3, 0x34, + 0x8d, 0x18, 0xd1, 0x13, 0xa8, 0xde, 0x81, 0x81, 0xbb, 0xd4, 0x42, 0x57, 0x28, 0xff, 0xd3, 0x4b, + 0x85, 0x8f, 0xaf, 0x14, 0x4f, 0x67, 0xaa, 0xa4, 0x15, 0x91, 0x86, 0x93, 0x10, 0xd7, 0xa4, 0x88, + 0x33, 0xf5, 0xe8, 0xe9, 0xa8, 0x5e, 0x25, 0x00, 0xd3, 0x33, 0xb5, 0xf3, 0x65, 0x02, 0xaa, 0xed, + 0x6d, 0x86, 0x71, 0x72, 0x83, 0x24, 0xf7, 0xc3, 0xe8, 0x9e, 0x48, 0xf3, 0x95, 0xe6, 0xff, 0x4b, + 0x41, 0x58, 0xc7, 0xa3, 0x92, 0x1c, 0xbb, 0xc2, 0x5b, 0xab, 0xb2, 0xfb, 0x91, 0x91, 0x74, 0xef, + 0x5c, 0xe1, 0xc5, 0x58, 0xc2, 0x25, 0xea, 0x5a, 0x6d, 0x99, 0xdd, 0x75, 0x64, 0x50, 0xd7, 0x6a, + 0xcb, 0x58, 0xc2, 0x51, 0xd8, 0xf9, 0xe2, 0xdd, 0x44, 0x91, 0x7b, 0xa7, 0xce, 0xf3, 0xa4, 0xe0, + 0xa3, 0x77, 0x0f, 0x60, 0x4a, 0xbd, 0xba, 0xc7, 0x33, 0xa1, 0xc5, 0x33, 0x93, 0x6c, 0xe1, 0x1c, + 0x26, 0xa1, 0x9a, 0xb2, 0x2e, 0xae, 0x65, 0x68, 0xe2, 0x8e, 0x56, 0x8c, 0x1c, 0x16, 0x53, 0xb9, + 0x2f, 0x4d, 0x2c, 0x40, 0x25, 0x6e, 0xdf, 0x75, 0xc3, 0x2d, 0xc7, 0x0b, 0xd8, 0x85, 0x84, 0xfe, + 0x6e, 0xbf, 0x04, 0xe0, 0x14, 0x07, 0xd5, 0x60, 0xc4, 0x11, 0x8a, 0xa4, 0xb8, 0x38, 0xc8, 0x89, + 0x71, 0x97, 0x6a, 0x27, 0xb7, 0xf1, 0xca, 0x7f, 0x58, 0x51, 0x41, 0xaf, 0xc0, 0xb8, 0x08, 0xd1, + 0x12, 0xae, 0x94, 0x27, 0x4d, 0x77, 0xfe, 0xba, 0x0e, 0xc4, 0x26, 0x2e, 0x6a, 0xc2, 0x04, 0xa5, + 0x92, 0x32, 0xc0, 0x99, 0xe9, 0xfe, 0x78, 0xa8, 0x96, 0xd3, 0x5b, 0x27, 0x83, 0x33, 0x64, 0x91, + 0x0b, 0x8f, 0x39, 0xed, 0x24, 0xdc, 0xa2, 0x3b, 0xc1, 0xdc, 0x27, 0xeb, 0xe1, 0x3d, 0x12, 0xcc, + 0x9c, 0x62, 0x2b, 0xf0, 0xec, 0xde, 0xee, 0xdc, 0x63, 0x8b, 0x07, 0xe0, 0xe1, 0x03, 0xa9, 0xa0, + 0xb7, 0x60, 0x34, 0x09, 0x7d, 0xe1, 0x21, 0x1d, 0xcf, 0x9c, 0x2e, 0x92, 0x59, 0x67, 0x5d, 0x55, + 0xd0, 0x8d, 0x29, 0x8a, 0x08, 0xd6, 0x29, 0xa2, 0xb7, 0x61, 0x8c, 0x7e, 0xfb, 0xeb, 0x4e, 0xab, + 0xe5, 0x05, 0xcd, 0x78, 0xe6, 0x91, 0x22, 0xb3, 0xa5, 0xf2, 0x46, 0x9a, 0xfb, 0x97, 0x15, 0x91, + 0x18, 0x1b, 0x14, 0x67, 0x7f, 0x16, 0x4e, 0x74, 0x30, 0xbd, 0xbe, 0xdc, 0x54, 0xff, 0xe3, 0x20, + 0x54, 0x94, 0xe5, 0x12, 0x2d, 0x98, 0x46, 0xea, 0x47, 0xb3, 0x46, 0xea, 0x11, 0x2a, 0x28, 0xea, + 0x76, 0xe9, 0xcf, 0x74, 0x79, 0xc9, 0xfd, 0xd9, 0xdc, 0x5d, 0x5e, 0x3c, 0x72, 0xac, 0x8f, 0xf7, + 0xee, 0x53, 0xed, 0x75, 0xe0, 0x40, 0xed, 0xb5, 0xe0, 0xeb, 0x84, 0x54, 0x4f, 0x6d, 0x85, 0xee, + 0x5a, 0x2d, 0xfb, 0xf8, 0x56, 0x8d, 0x16, 0x62, 0x0e, 0x63, 0xfa, 0x05, 0x3d, 0xb5, 0x99, 0x7e, + 0x31, 0x7c, 0x48, 0xfd, 0x42, 0x12, 0xc0, 0x29, 0x2d, 0xb4, 0x0d, 0x27, 0x1a, 0xe6, 0x5b, 0x6a, + 0x2a, 0x1e, 0xec, 0xf9, 0x3e, 0xde, 0x32, 0x6b, 0x6b, 0x0f, 0xad, 0x2c, 0x67, 0xe9, 0xe1, 0xce, + 0x26, 0xd0, 0x2b, 0x30, 0xf2, 0x6e, 0x18, 0xb3, 0xeb, 0x13, 0x71, 0x74, 0xc9, 0xb8, 0x9b, 0x91, + 0xd7, 0x6e, 0xd6, 0x59, 0xf9, 0xfe, 0xee, 0xdc, 0x68, 0x2d, 0x74, 0xe5, 0x5f, 0xac, 0x2a, 0xa0, + 0x2f, 0x58, 0x70, 0xca, 0xd8, 0xc9, 0xaa, 0xe7, 0x70, 0x98, 0x9e, 0x3f, 0x2e, 0x5a, 0x3e, 0xb5, + 0xd6, 0x8d, 0x26, 0xee, 0xde, 0x94, 0xfd, 0x6f, 0xb9, 0xa9, 0x56, 0x18, 0x6f, 0x48, 0xdc, 0xf6, + 0x8f, 0xe3, 0xd1, 0x83, 0x9b, 0x86, 0x5d, 0xe9, 0x21, 0x5c, 0x16, 0xfc, 0x7b, 0x8b, 0x5d, 0x16, + 0xac, 0x93, 0xad, 0x96, 0xef, 0x24, 0xc7, 0xe1, 0xc5, 0xfc, 0x69, 0x18, 0x49, 0x44, 0x6b, 0xc5, + 0x5e, 0x6c, 0xd0, 0xba, 0xc7, 0x2e, 0x51, 0xd4, 0xd1, 0x27, 0x4b, 0xb1, 0x22, 0x68, 0xff, 0x2b, + 0xfe, 0x55, 0x24, 0xe4, 0x18, 0x2c, 0x22, 0x37, 0x4c, 0x8b, 0xc8, 0x33, 0x85, 0xc7, 0xd2, 0xc3, + 0x32, 0xf2, 0x7d, 0x73, 0x04, 0x4c, 0x43, 0xf9, 0xc9, 0xb9, 0xcd, 0xb2, 0x7f, 0xd9, 0x82, 0xe9, + 0x6e, 0x6e, 0x05, 0x54, 0x84, 0xe1, 0xfa, 0x91, 0xba, 0xe7, 0x53, 0xb3, 0x7a, 0x5b, 0x94, 0x63, + 0x85, 0x51, 0x38, 0x85, 0x7a, 0x7f, 0x29, 0xaa, 0x6e, 0x82, 0xf9, 0x2a, 0x1f, 0x7a, 0x95, 0x07, + 0x2d, 0x58, 0xea, 0xd9, 0xbc, 0xfe, 0x02, 0x16, 0xec, 0x6f, 0x97, 0x60, 0x9a, 0x1b, 0xdb, 0x17, + 0xb7, 0x43, 0xcf, 0xad, 0x85, 0xae, 0x08, 0xe1, 0x70, 0x61, 0xac, 0xa5, 0xa9, 0xb7, 0xc5, 0x52, + 0xde, 0xe8, 0x0a, 0x71, 0xaa, 0x52, 0xe8, 0xa5, 0xd8, 0xa0, 0x4a, 0x5b, 0x21, 0xdb, 0x5e, 0x43, + 0xd9, 0x6e, 0x4b, 0x7d, 0x9f, 0x0c, 0xaa, 0x95, 0x15, 0x8d, 0x0e, 0x36, 0xa8, 0x1e, 0xc1, 0xcb, + 0x27, 0xf6, 0xdf, 0xb7, 0xe0, 0x91, 0x1e, 0x69, 0x71, 0x68, 0x73, 0xf7, 0xd9, 0x05, 0x87, 0x78, + 0xf6, 0x51, 0x35, 0xc7, 0xaf, 0x3d, 0xb0, 0x80, 0xa2, 0xbb, 0x00, 0xfc, 0xda, 0x82, 0x4a, 0xd3, + 0xd9, 0x3b, 0xf5, 0x82, 0xc9, 0x27, 0xb4, 0xbc, 0x04, 0xea, 0xd9, 0x7f, 0x8d, 0xaa, 0xfd, 0xcd, + 0x32, 0x0c, 0xf2, 0xd7, 0xc5, 0x6b, 0x30, 0xbc, 0xc9, 0xd3, 0xf4, 0xf6, 0x97, 0x25, 0x38, 0x55, + 0x5f, 0x78, 0x01, 0x96, 0x64, 0xd0, 0x75, 0x38, 0x49, 0x4f, 0x16, 0xcf, 0xf1, 0xab, 0xc4, 0x77, + 0x76, 0xa4, 0x3e, 0xcc, 0x9f, 0xc3, 0x90, 0x79, 0xdb, 0x4f, 0xae, 0x75, 0xa2, 0xe0, 0x6e, 0xf5, + 0xd0, 0xab, 0x1d, 0x59, 0xf5, 0x78, 0xfa, 0x63, 0x25, 0x0b, 0x1f, 0x9c, 0x59, 0x8f, 0x4a, 0xec, + 0xad, 0x0e, 0xcd, 0x5f, 0x7b, 0xc4, 0xd9, 0xd4, 0xf6, 0x4d, 0x5c, 0xe6, 0x43, 0xd1, 0x66, 0xbe, + 0x23, 0xeb, 0x9b, 0x11, 0x89, 0x37, 0x43, 0xdf, 0x15, 0xef, 0x8f, 0xa6, 0x3e, 0x14, 0x19, 0x38, + 0xee, 0xa8, 0x41, 0xa9, 0x6c, 0x38, 0x9e, 0xdf, 0x8e, 0x48, 0x4a, 0x65, 0xc8, 0xa4, 0xb2, 0x9a, + 0x81, 0xe3, 0x8e, 0x1a, 0x74, 0x6d, 0x9d, 0x12, 0x4f, 0x56, 0xca, 0x20, 0x70, 0xc1, 0x82, 0x3e, + 0x05, 0xc3, 0x32, 0x14, 0xa0, 0x50, 0xae, 0x12, 0xe1, 0x20, 0xa1, 0x9e, 0xbf, 0xd4, 0x9e, 0x47, + 0x13, 0x41, 0x00, 0x92, 0xde, 0x61, 0x9e, 0x46, 0xfc, 0x53, 0x0b, 0x4e, 0x76, 0x71, 0x69, 0xe3, + 0x2c, 0xad, 0xe9, 0xc5, 0x89, 0x7a, 0x9c, 0x41, 0x63, 0x69, 0xbc, 0x1c, 0x2b, 0x0c, 0xba, 0x5b, + 0x38, 0xd3, 0xcc, 0x32, 0x4a, 0xe1, 0xea, 0x22, 0xa0, 0xfd, 0x31, 0x4a, 0x74, 0x16, 0x06, 0xda, + 0x31, 0x89, 0xe4, 0x3b, 0x85, 0x92, 0xcf, 0xdf, 0x8a, 0x49, 0x84, 0x19, 0x84, 0x8a, 0xad, 0x4d, + 0x65, 0x11, 0xd4, 0xc4, 0x56, 0x66, 0xdd, 0xc3, 0x1c, 0x66, 0x7f, 0xad, 0x0c, 0x93, 0x19, 0xd7, + 0x56, 0xda, 0x91, 0xad, 0x30, 0xf0, 0x92, 0x50, 0xe5, 0x8f, 0xe3, 0x4f, 0xa3, 0x91, 0xd6, 0xe6, + 0x75, 0x51, 0x8e, 0x15, 0x06, 0x7a, 0x5a, 0x3e, 0x4d, 0x9b, 0x7d, 0x74, 0x62, 0xa9, 0x6a, 0xbc, + 0x4e, 0x5b, 0xf4, 0xc1, 0x98, 0x27, 0x61, 0xa0, 0x15, 0xaa, 0x97, 0xc6, 0xd5, 0xf7, 0xc4, 0x4b, + 0xd5, 0x5a, 0x18, 0xfa, 0x98, 0x01, 0xd1, 0x53, 0x62, 0xf4, 0x99, 0x1b, 0x1a, 0xec, 0xb8, 0x61, + 0xac, 0x4d, 0xc1, 0x33, 0x30, 0x7c, 0x8f, 0xec, 0x44, 0x5e, 0xd0, 0xcc, 0xde, 0x4f, 0x5d, 0xe5, + 0xc5, 0x58, 0xc2, 0xcd, 0x1c, 0xec, 0xc3, 0x47, 0xfc, 0x28, 0xcc, 0x48, 0xee, 0x39, 0xf8, 0x1d, + 0x0b, 0x26, 0x59, 0x52, 0x55, 0x91, 0x82, 0xc0, 0x0b, 0x83, 0x63, 0x90, 0x31, 0x9e, 0x84, 0xc1, + 0x88, 0x36, 0x9a, 0x7d, 0xd5, 0x81, 0xf5, 0x04, 0x73, 0x18, 0x7a, 0x0c, 0x06, 0x58, 0x17, 0xe8, + 0x67, 0x1c, 0xe3, 0xb9, 0xdb, 0xab, 0x4e, 0xe2, 0x60, 0x56, 0xca, 0xa2, 0xc9, 0x30, 0x69, 0xf9, + 0x1e, 0xef, 0x74, 0x6a, 0xd0, 0x7d, 0xbf, 0x45, 0x93, 0x75, 0xed, 0xe4, 0xc3, 0x8a, 0x26, 0xeb, + 0x4e, 0xfc, 0x60, 0x39, 0xff, 0x7f, 0x94, 0xe0, 0x4c, 0xd7, 0x7a, 0xe9, 0x4d, 0xf7, 0xaa, 0x71, + 0xd3, 0x7d, 0x31, 0x73, 0xd3, 0x6d, 0x1f, 0x5c, 0xfb, 0xe1, 0xdc, 0x7d, 0x77, 0xbf, 0x92, 0x2e, + 0x1f, 0xe3, 0x95, 0xf4, 0x40, 0x51, 0x11, 0x67, 0x30, 0x47, 0xc4, 0xf9, 0x7d, 0x0b, 0x1e, 0xed, + 0x3a, 0x65, 0xef, 0xbb, 0xf0, 0xbd, 0xae, 0xbd, 0xec, 0xa1, 0x9d, 0xfc, 0x52, 0xb9, 0xc7, 0xa8, + 0x98, 0x9e, 0x72, 0x8e, 0x72, 0x21, 0x06, 0x8c, 0x85, 0xf0, 0x36, 0xc6, 0x39, 0x10, 0x2f, 0xc3, + 0x0a, 0x8a, 0x62, 0x2d, 0xfc, 0x8d, 0x77, 0x72, 0xe5, 0x90, 0x1b, 0x6a, 0xde, 0xb4, 0xc4, 0xeb, + 0x79, 0x15, 0xb2, 0x41, 0x71, 0x77, 0x34, 0xcd, 0xb3, 0x7c, 0x18, 0xcd, 0x73, 0xac, 0xbb, 0xd6, + 0x89, 0x16, 0x61, 0x72, 0xcb, 0x0b, 0xd8, 0x5b, 0xb2, 0xa6, 0xf4, 0xa4, 0x62, 0x90, 0xaf, 0x9b, + 0x60, 0x9c, 0xc5, 0x9f, 0x7d, 0x05, 0xc6, 0x0f, 0x6f, 0x5d, 0xfb, 0x51, 0x19, 0x3e, 0x78, 0x00, + 0x53, 0xe0, 0xa7, 0x83, 0xf1, 0x5d, 0xb4, 0xd3, 0xa1, 0xe3, 0xdb, 0xd4, 0x60, 0x7a, 0xa3, 0xed, + 0xfb, 0x3b, 0xcc, 0x4f, 0x8c, 0xb8, 0x12, 0x43, 0x08, 0x35, 0xea, 0xd1, 0xfa, 0xd5, 0x2e, 0x38, + 0xb8, 0x6b, 0x4d, 0xf4, 0x49, 0x40, 0xe1, 0x5d, 0x96, 0x76, 0xd8, 0x4d, 0xf3, 0x46, 0xb0, 0x4f, + 0x50, 0x4e, 0xb7, 0xea, 0xcd, 0x0e, 0x0c, 0xdc, 0xa5, 0x16, 0x95, 0x53, 0xd9, 0x7b, 0xf7, 0xaa, + 0x5b, 0x19, 0x39, 0x15, 0xeb, 0x40, 0x6c, 0xe2, 0xa2, 0xcb, 0x70, 0xc2, 0xd9, 0x76, 0x3c, 0x9e, + 0x46, 0x4c, 0x12, 0xe0, 0x82, 0xaa, 0xb2, 0x5f, 0x2d, 0x66, 0x11, 0x70, 0x67, 0x1d, 0xd4, 0x32, + 0x0c, 0x92, 0xfc, 0xc1, 0x81, 0x8f, 0x1f, 0x62, 0x05, 0x17, 0x36, 0x51, 0xda, 0xff, 0xc5, 0xa2, + 0x47, 0x5f, 0x97, 0x67, 0x47, 0xe9, 0x8c, 0x28, 0x03, 0x9b, 0x16, 0xce, 0xa7, 0x66, 0x64, 0x59, + 0x07, 0x62, 0x13, 0x97, 0x2f, 0x8d, 0x38, 0x75, 0x5b, 0x37, 0xa4, 0x4d, 0x11, 0x09, 0xab, 0x30, + 0xa8, 0x04, 0xed, 0x7a, 0xdb, 0x5e, 0x1c, 0x46, 0x62, 0x03, 0xf5, 0xe9, 0xc4, 0x9c, 0xf2, 0xcb, + 0x2a, 0x27, 0x83, 0x25, 0x3d, 0xfb, 0xeb, 0x25, 0x18, 0x97, 0x2d, 0xbe, 0xd6, 0x0e, 0x13, 0xe7, + 0x18, 0x8e, 0xf4, 0xd7, 0x8c, 0x23, 0x7d, 0xa1, 0x58, 0x60, 0x30, 0xeb, 0x5c, 0xcf, 0xa3, 0xfc, + 0x53, 0x99, 0xa3, 0xfc, 0x42, 0x3f, 0x44, 0x0f, 0x3e, 0xc2, 0xff, 0x8d, 0x05, 0x27, 0x0c, 0xfc, + 0x63, 0x38, 0x49, 0x6a, 0xe6, 0x49, 0xf2, 0x5c, 0x1f, 0xa3, 0xe9, 0x71, 0x82, 0x7c, 0xab, 0x94, + 0x19, 0x05, 0x3b, 0x39, 0x3e, 0x07, 0x03, 0x9b, 0x4e, 0xe4, 0x16, 0xcb, 0xa9, 0xd9, 0x51, 0x7d, + 0xfe, 0x8a, 0x13, 0xb9, 0x9c, 0xff, 0x9f, 0x57, 0x8f, 0xa2, 0x39, 0x91, 0x9b, 0x1b, 0xcd, 0xc1, + 0x1a, 0x45, 0x97, 0x60, 0x28, 0x6e, 0x84, 0x2d, 0xe5, 0xef, 0x7a, 0x96, 0x3f, 0x98, 0x46, 0x4b, + 0xf6, 0x77, 0xe7, 0x90, 0xd9, 0x1c, 0x2d, 0xc6, 0x02, 0x7f, 0xb6, 0x09, 0x15, 0xd5, 0xf4, 0x91, + 0x7a, 0xfc, 0xff, 0xd7, 0x32, 0x9c, 0xec, 0xb2, 0x56, 0xd0, 0xe7, 0x8d, 0x79, 0x7b, 0xa5, 0xef, + 0xc5, 0xf6, 0x1e, 0x67, 0xee, 0xf3, 0x4c, 0x53, 0x72, 0xc5, 0xea, 0x38, 0x44, 0xf3, 0xb7, 0x62, + 0x92, 0x6d, 0x9e, 0x16, 0xe5, 0x37, 0x4f, 0x9b, 0x3d, 0xb6, 0xe9, 0xa7, 0x0d, 0xa9, 0x9e, 0x1e, + 0xe9, 0x77, 0xfe, 0x85, 0x01, 0x98, 0xee, 0x96, 0x81, 0x00, 0x7d, 0xc9, 0xca, 0x3c, 0x9c, 0xf1, 0x6a, 0xff, 0x69, 0x0c, 0xf8, 0x6b, 0x1a, 0x22, 0x6b, 0xcf, 0xbc, 0xf9, 0x94, 0x46, 0xee, 0x8c, 0x8b, 0xd6, 0x59, 0x1c, 0x56, 0xc4, 0x1f, 0x41, 0x91, 0x5c, 0xe1, 0x13, 0x87, 0xe8, 0x8a, 0x78, 0x47, 0x25, 0xce, 0xc4, 0x61, 0xc9, 0xe2, 0xfc, 0x38, 0x2c, 0xd9, 0x87, 0x59, 0x0f, 0x46, 0xb5, - 0x71, 0x1d, 0xe9, 0x32, 0xb8, 0x47, 0x8f, 0x28, 0xad, 0xdf, 0x47, 0xba, 0x14, 0xfe, 0xb6, 0x05, + 0x71, 0x1d, 0xe9, 0x32, 0xb8, 0x47, 0x8f, 0x28, 0xad, 0xdf, 0x47, 0xba, 0x14, 0xfe, 0x8e, 0x05, 0x19, 0xe7, 0x34, 0x65, 0x96, 0xb1, 0x7a, 0x9a, 0x65, 0xce, 0xc2, 0x40, 0x14, 0xfa, 0x24, 0xfb, 0xa8, 0x03, 0x0e, 0x7d, 0x82, 0x19, 0x44, 0xbd, 0x93, 0x5c, 0xee, 0xf5, 0x4e, 0x32, 0xd5, 0xd3, - 0x7d, 0xb2, 0x4d, 0xa4, 0x91, 0x44, 0xb1, 0xf1, 0x6b, 0xb4, 0x10, 0x73, 0x98, 0xfd, 0xeb, 0x03, + 0x7d, 0xb2, 0x4d, 0xa4, 0x91, 0x44, 0xb1, 0xf1, 0x6b, 0xb4, 0x10, 0x73, 0x98, 0xfd, 0x1b, 0x03, 0x70, 0xb2, 0x4b, 0x54, 0x1f, 0xd5, 0x90, 0x9a, 0x4e, 0x42, 0xee, 0x3b, 0x3b, 0xd9, 0xe4, 0xb2, 0x97, 0x79, 0x31, 0x96, 0x70, 0xe6, 0x54, 0xcb, 0x13, 0xd4, 0x65, 0x4c, 0x57, 0x22, 0x2f, 0x9d, 0x80, 0x1e, 0xfd, 0x8b, 0xba, 0x17, 0x01, 0xe2, 0xd8, 0x5f, 0x09, 0xa8, 0x84, 0xe7, 0x0a, 0xe7, @@ -43754,19 +43814,19 @@ var fileDescriptorGenerated = []byte{ 0x12, 0x8c, 0x8a, 0x48, 0xb2, 0x5a, 0x18, 0xfa, 0xc2, 0x8c, 0xa4, 0xee, 0xe3, 0xeb, 0x29, 0x08, 0xeb, 0x78, 0x5a, 0x35, 0x66, 0x6d, 0x1c, 0xee, 0x5a, 0x8d, 0x5b, 0x1c, 0x35, 0xbc, 0x4c, 0x9e, 0x92, 0x91, 0x42, 0x79, 0x4a, 0x52, 0xc3, 0x5a, 0xa5, 0xf0, 0x45, 0x0c, 0xe4, 0x1a, 0xa0, 0x7e, - 0xa7, 0x0c, 0x43, 0xfc, 0x53, 0x1c, 0x83, 0x94, 0x57, 0x13, 0x26, 0xa5, 0x42, 0x39, 0x21, 0x78, + 0xb7, 0x0c, 0x43, 0xfc, 0x53, 0x1c, 0x83, 0x94, 0x57, 0x13, 0x26, 0xa5, 0x42, 0x39, 0x21, 0x78, 0xaf, 0xe6, 0xab, 0x4e, 0xe2, 0x70, 0xd6, 0xa4, 0x76, 0x48, 0x6a, 0x86, 0x42, 0xf3, 0xc6, 0x1e, 0x9a, 0xcd, 0x58, 0x4a, 0x80, 0xd3, 0xd0, 0x76, 0xd4, 0x26, 0x40, 0xcc, 0x5e, 0x75, 0xa5, 0x34, 0x44, 0xe6, 0xdb, 0x17, 0x0b, 0xf5, 0xa3, 0xae, 0xaa, 0xf1, 0xde, 0xa4, 0xcb, 0x52, 0x01, 0xb0, - 0x46, 0x7b, 0xf6, 0x65, 0xa8, 0x28, 0xe4, 0x3c, 0x15, 0x72, 0x4c, 0x67, 0x6d, 0x7f, 0x01, 0x26, - 0x33, 0x6d, 0xf5, 0xa5, 0x81, 0xfe, 0xa6, 0x05, 0x93, 0xbc, 0xcb, 0x2b, 0xc1, 0xb6, 0x60, 0x05, + 0x46, 0x7b, 0xf6, 0x65, 0xa8, 0x28, 0xe4, 0x3c, 0x15, 0x72, 0x4c, 0x67, 0x6d, 0x7f, 0x09, 0x26, + 0x33, 0x6d, 0xf5, 0xa5, 0x81, 0xfe, 0x96, 0x05, 0x93, 0xbc, 0xcb, 0x2b, 0xc1, 0xb6, 0x60, 0x05, 0x5f, 0xb4, 0x60, 0xda, 0xef, 0xb2, 0x13, 0xc5, 0x67, 0x3e, 0xcc, 0x1e, 0x56, 0xca, 0x67, 0x37, 0x28, 0xee, 0xda, 0x1a, 0x3a, 0x07, 0x23, 0xfc, 0x91, 0x6a, 0xc7, 0x17, 0x9e, 0xe2, 0x63, 0x3c, 0xe7, 0x37, 0x2f, 0xc3, 0x0a, 0x6a, 0xff, 0xd8, 0x82, 0x13, 0x7c, 0x10, 0x57, 0xc9, 0x8e, 0x52, 0xaf, 0xde, 0x27, 0xc3, 0x10, 0xd9, 0xcd, 0x4b, 0x3d, 0xb2, 0x9b, 0xeb, 0xa3, 0x2c, 0x1f, 0x38, 0xca, 0x6f, 0x5b, 0x20, 0x56, 0xe8, 0x31, 0xe8, 0x0f, 0x6b, 0xa6, 0xfe, 0xf0, 0xa1, 0x22, 0x8b, - 0xbe, 0x87, 0xe2, 0xf0, 0x0b, 0x25, 0x98, 0xe2, 0x08, 0xe9, 0x8d, 0xcc, 0xfb, 0xe5, 0xe3, 0xf4, - 0xf7, 0xea, 0x8e, 0x7a, 0xea, 0xb4, 0xfb, 0x48, 0x8d, 0x6f, 0x39, 0x70, 0xe0, 0xb7, 0xfc, 0x33, + 0xbe, 0x87, 0xe2, 0xf0, 0x8b, 0x25, 0x98, 0xe2, 0x08, 0xe9, 0x8d, 0xcc, 0xfb, 0xe5, 0xe3, 0xf4, + 0xf7, 0xea, 0x8e, 0x7a, 0xea, 0xb4, 0xfb, 0x48, 0x8d, 0x6f, 0x39, 0x70, 0xe0, 0xb7, 0xfc, 0x73, 0x0b, 0x10, 0x9f, 0x93, 0xec, 0x0b, 0xdf, 0xfc, 0x74, 0xd3, 0xcc, 0x01, 0x29, 0xe7, 0x50, 0x10, 0xac, 0x61, 0x3d, 0xe4, 0x21, 0x64, 0xee, 0xc3, 0xca, 0xf9, 0xf7, 0x61, 0x7d, 0x8c, 0xfa, 0x7f, 0x96, 0x21, 0xeb, 0xac, 0x89, 0xde, 0x86, 0xb1, 0x86, 0xd3, 0x72, 0xee, 0x7a, 0xbe, 0x97, 0x78, @@ -43776,9 +43836,9 @@ var fileDescriptorGenerated = []byte{ 0x42, 0x31, 0x0a, 0x18, 0x4e, 0xcb, 0x83, 0x9e, 0xfe, 0x5f, 0xf5, 0x7c, 0x22, 0xe4, 0x3c, 0x1e, 0xbf, 0x32, 0xbb, 0xb7, 0x3b, 0x77, 0x1a, 0x77, 0xc5, 0xc0, 0x3d, 0x6a, 0xda, 0x6d, 0x38, 0x59, 0x27, 0x91, 0xc7, 0xf2, 0x74, 0xba, 0xe9, 0xbe, 0xfb, 0x0c, 0x54, 0xa2, 0xcc, 0x96, 0xef, 0x33, - 0x49, 0x81, 0x96, 0xd9, 0x4d, 0x6e, 0xf1, 0x94, 0xa4, 0xfd, 0xd7, 0x4a, 0x30, 0x2c, 0x5c, 0x3a, + 0x49, 0x81, 0x96, 0xd9, 0x4d, 0x6e, 0xf1, 0x94, 0xa4, 0xfd, 0xd7, 0x4b, 0x30, 0x2c, 0x5c, 0x3a, 0x8f, 0x41, 0x50, 0xb9, 0x6a, 0x98, 0xa3, 0x9e, 0xc9, 0xe3, 0x95, 0xac, 0x5b, 0x3d, 0x0d, 0x51, - 0xf5, 0x8c, 0x21, 0xea, 0xb9, 0x62, 0xe4, 0x0e, 0x36, 0x41, 0xfd, 0xe3, 0x32, 0x4c, 0x98, 0x2e, + 0xf5, 0x8c, 0x21, 0xea, 0xb9, 0x62, 0xe4, 0x0e, 0x36, 0x41, 0xfd, 0x93, 0x32, 0x4c, 0x98, 0x2e, 0xae, 0xc7, 0x30, 0x2d, 0xaf, 0xc3, 0x70, 0x2c, 0xbc, 0xad, 0x4b, 0x45, 0xfc, 0xfb, 0xb2, 0x9f, 0x38, 0xbd, 0xb5, 0x17, 0xfe, 0xd5, 0x92, 0x5c, 0x57, 0x87, 0xee, 0xf2, 0xb1, 0x38, 0x74, 0xe7, 0x79, 0x1e, 0x0f, 0x3c, 0x0c, 0xcf, 0x63, 0xfb, 0x07, 0xec, 0x78, 0xd0, 0xcb, 0x8f, 0xe1, 0xc8, @@ -43790,61 +43850,65 @@ var fileDescriptorGenerated = []byte{ 0xbe, 0x88, 0xf4, 0xed, 0xbd, 0x5b, 0xdb, 0x89, 0xe7, 0xcf, 0x7b, 0x41, 0x12, 0x27, 0xd1, 0xfc, 0x5a, 0x90, 0xdc, 0x8c, 0xb8, 0x82, 0xa0, 0xc5, 0x1f, 0x2a, 0x5a, 0x58, 0xa3, 0x2b, 0x43, 0x4a, 0x58, 0x1b, 0x83, 0xe6, 0x6d, 0xd3, 0x0d, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0x32, 0xe3, 0xec, 0x6c, - 0x82, 0xfa, 0x0b, 0x0d, 0xfc, 0x57, 0x83, 0x6a, 0x6a, 0x99, 0x09, 0xf9, 0x86, 0x1e, 0x80, 0x58, - 0x94, 0x7d, 0xd2, 0x2e, 0xe8, 0x3e, 0xd7, 0x69, 0xbc, 0x22, 0x22, 0x1d, 0x57, 0x94, 0x2f, 0x17, - 0xe6, 0xc8, 0x7d, 0x5c, 0x4a, 0xb2, 0x44, 0x8c, 0x2c, 0xfb, 0xdc, 0x5a, 0x2d, 0x9b, 0x4b, 0x7e, - 0x59, 0x02, 0x70, 0x8a, 0x83, 0x16, 0x84, 0xf2, 0xc9, 0xad, 0x33, 0x1f, 0xcc, 0x28, 0x9f, 0x72, - 0x4a, 0x34, 0xed, 0xf3, 0x02, 0x8c, 0xaa, 0xe7, 0x79, 0x6a, 0xfc, 0x61, 0x94, 0x0a, 0x97, 0xc5, - 0x56, 0xd2, 0x62, 0xac, 0xe3, 0xa0, 0x75, 0x98, 0x8c, 0xf9, 0xdb, 0x41, 0x32, 0xb6, 0x43, 0x18, - 0x19, 0x9e, 0xcd, 0x3c, 0xe9, 0x2f, 0xc1, 0xfb, 0xac, 0x88, 0x6f, 0x65, 0x19, 0x0d, 0x92, 0x25, - 0x81, 0x5e, 0x85, 0x09, 0x5f, 0x7f, 0x18, 0xb5, 0x26, 0x6c, 0x10, 0xca, 0x45, 0xcd, 0x78, 0x36, - 0xb5, 0x86, 0x33, 0xd8, 0xe8, 0x75, 0x98, 0xd1, 0x4b, 0x44, 0x42, 0x24, 0x27, 0x68, 0x92, 0x58, - 0xbc, 0x33, 0xf2, 0xd8, 0xde, 0xee, 0xdc, 0xcc, 0xb5, 0x1e, 0x38, 0xb8, 0x67, 0x6d, 0x74, 0x09, - 0xc6, 0xe4, 0xf0, 0xb5, 0x48, 0xa8, 0xd4, 0x39, 0x52, 0x83, 0x61, 0x03, 0xf3, 0xbd, 0xdd, 0xdb, - 0x7e, 0x8e, 0x56, 0xd6, 0xce, 0x5d, 0xf4, 0x0e, 0x8c, 0xe9, 0x7d, 0xcc, 0x1e, 0xa8, 0xf9, 0x8f, - 0xcd, 0x8a, 0xf3, 0x5b, 0xf5, 0x5c, 0x87, 0x61, 0x83, 0xb6, 0x7d, 0x13, 0x86, 0xea, 0x3b, 0x71, - 0x23, 0xf1, 0x0b, 0x30, 0xa5, 0x27, 0x8d, 0x21, 0xa4, 0x1b, 0x86, 0x3d, 0x7c, 0x25, 0x46, 0x64, - 0x7f, 0xd9, 0x82, 0xc9, 0xf5, 0xe5, 0x5a, 0x3d, 0x6c, 0xdc, 0x23, 0xc9, 0x22, 0xd7, 0xcf, 0xb0, - 0xe0, 0x49, 0xd6, 0x21, 0x79, 0x4d, 0x37, 0x2e, 0x76, 0x16, 0x06, 0x36, 0xc3, 0x38, 0xc9, 0xda, - 0x38, 0xaf, 0x84, 0x71, 0x82, 0x19, 0xc4, 0xfe, 0x63, 0x0b, 0x06, 0xd9, 0xbb, 0x4e, 0x79, 0x6f, - 0x82, 0x15, 0x19, 0x17, 0x7a, 0x09, 0x86, 0xc8, 0xc6, 0x06, 0x69, 0x24, 0x62, 0x7b, 0xca, 0x78, - 0x81, 0xa1, 0x15, 0x56, 0x4a, 0x37, 0x1d, 0x6b, 0x8c, 0xff, 0xc5, 0x02, 0x19, 0x7d, 0x1a, 0x2a, - 0x89, 0xb7, 0x45, 0x16, 0x5d, 0x57, 0x18, 0x15, 0xfb, 0x73, 0x61, 0x51, 0x4c, 0x60, 0x5d, 0x12, - 0xc1, 0x29, 0x3d, 0xfb, 0xab, 0x25, 0x80, 0x34, 0x1e, 0x28, 0x6f, 0x98, 0x4b, 0x1d, 0x4f, 0x9f, - 0x3d, 0xdd, 0xe5, 0xe9, 0x33, 0x94, 0x12, 0xec, 0xf2, 0xf0, 0x99, 0x9a, 0xaa, 0x72, 0xa1, 0xa9, - 0x1a, 0xe8, 0x67, 0xaa, 0x96, 0xe1, 0x44, 0x1a, 0xcf, 0x64, 0x06, 0x86, 0xb2, 0x44, 0xa8, 0xeb, - 0x59, 0x20, 0xee, 0xc4, 0xb7, 0xbf, 0x6a, 0x81, 0x70, 0x7a, 0x2c, 0xb0, 0xa0, 0x5d, 0xf9, 0x4c, - 0x91, 0x91, 0xb1, 0xed, 0xd9, 0x22, 0xfe, 0xa0, 0x22, 0x4f, 0x9b, 0xda, 0x62, 0x46, 0x76, 0x36, - 0x83, 0xaa, 0xfd, 0x6b, 0x16, 0x8c, 0x72, 0xf0, 0x75, 0x26, 0x2b, 0xe7, 0xf7, 0xab, 0xaf, 0x2c, - 0xbb, 0xec, 0x05, 0x1f, 0x4a, 0x58, 0x65, 0x5b, 0xd5, 0x5f, 0xf0, 0x91, 0x00, 0x9c, 0xe2, 0xa0, - 0x67, 0x60, 0x38, 0x6e, 0xdf, 0x65, 0xe8, 0x19, 0x0f, 0xc8, 0x3a, 0x2f, 0xc6, 0x12, 0x6e, 0xff, - 0xd3, 0x12, 0x4c, 0x65, 0x1d, 0x60, 0x11, 0x86, 0x21, 0x2e, 0x3b, 0x67, 0xc5, 0xae, 0x83, 0xec, - 0x39, 0x9a, 0x03, 0x2d, 0xf0, 0x77, 0xa8, 0x99, 0xe1, 0x5d, 0x50, 0x42, 0x1b, 0x30, 0xea, 0x86, - 0xf7, 0x83, 0xfb, 0x4e, 0xe4, 0x2e, 0xd6, 0xd6, 0xc4, 0x97, 0xc8, 0x71, 0x59, 0xaa, 0xa6, 0x15, - 0x74, 0xf7, 0x5c, 0x66, 0x5f, 0x48, 0x41, 0x58, 0x27, 0x4c, 0x75, 0xc5, 0x46, 0x18, 0x6c, 0x78, - 0xcd, 0xeb, 0x4e, 0xab, 0xd8, 0xe5, 0xfc, 0xb2, 0x44, 0xd7, 0xda, 0x18, 0x17, 0xf9, 0x28, 0x38, - 0x00, 0xa7, 0x24, 0xed, 0x5f, 0x9d, 0x06, 0x63, 0x2d, 0x18, 0xa9, 0x70, 0xad, 0x87, 0x9e, 0x0a, - 0xf7, 0x4d, 0x18, 0x21, 0x5b, 0xad, 0x64, 0xa7, 0xea, 0x45, 0xc5, 0x12, 0x9b, 0xaf, 0x08, 0xec, - 0x4e, 0xea, 0x12, 0x82, 0x15, 0xc5, 0x1e, 0x89, 0x8d, 0xcb, 0xef, 0x8b, 0xc4, 0xc6, 0x03, 0x7f, - 0x2e, 0x89, 0x8d, 0x5f, 0x87, 0xe1, 0xa6, 0x97, 0x60, 0xd2, 0x0a, 0x45, 0x82, 0x8f, 0x9c, 0xc5, - 0x73, 0x99, 0x23, 0x77, 0xa6, 0xbc, 0x14, 0x00, 0x2c, 0xc9, 0xa1, 0x75, 0xb5, 0xa9, 0x86, 0x8a, - 0x1c, 0xf7, 0x9d, 0xf6, 0xbe, 0xae, 0xdb, 0x4a, 0x24, 0x32, 0x1e, 0x7e, 0xef, 0x89, 0x8c, 0x55, - 0xfa, 0xe1, 0x91, 0x87, 0x95, 0x7e, 0xd8, 0x48, 0xe3, 0x5c, 0x39, 0x8a, 0x34, 0xce, 0x5f, 0xb5, - 0xe0, 0x54, 0xab, 0x5b, 0x12, 0x74, 0x91, 0x48, 0xf8, 0x67, 0x0f, 0x91, 0x16, 0xde, 0x68, 0x9a, - 0x25, 0x2c, 0xe8, 0x8a, 0x86, 0xbb, 0x37, 0x2c, 0xf3, 0x41, 0x8f, 0xbe, 0xf7, 0x7c, 0xd0, 0x47, - 0x9d, 0x71, 0x38, 0xcd, 0x0e, 0x3d, 0x7e, 0x24, 0xd9, 0xa1, 0x27, 0x1e, 0x62, 0x76, 0x68, 0x2d, - 0xaf, 0xf3, 0xe4, 0xc3, 0xcd, 0xeb, 0xbc, 0x69, 0x9e, 0x4b, 0x3c, 0x8d, 0xf0, 0x4b, 0x85, 0xcf, - 0x25, 0xa3, 0x85, 0x83, 0x4f, 0x26, 0x9e, 0xe1, 0xfa, 0xc4, 0x7b, 0xcc, 0x70, 0x6d, 0xe4, 0x89, - 0x46, 0x47, 0x91, 0x27, 0xfa, 0x6d, 0xfd, 0x04, 0x3d, 0x59, 0xa4, 0x05, 0x75, 0x50, 0x76, 0xb6, - 0xd0, 0xed, 0x0c, 0xed, 0xcc, 0x44, 0x3d, 0x7d, 0xdc, 0x99, 0xa8, 0x4f, 0x1d, 0x61, 0x26, 0xea, - 0xd3, 0xc7, 0x9a, 0x89, 0xfa, 0x91, 0xf7, 0x49, 0x26, 0xea, 0x99, 0xe3, 0xca, 0x44, 0xfd, 0xe8, - 0x43, 0xcd, 0x44, 0x4d, 0x3f, 0x5d, 0x4b, 0x86, 0x91, 0xcd, 0xcc, 0x16, 0xf9, 0x74, 0x5d, 0xa3, - 0xce, 0xf8, 0xa7, 0x53, 0x20, 0x9c, 0x12, 0xb5, 0xff, 0x12, 0x9c, 0x39, 0x78, 0xe9, 0xa6, 0x1e, - 0x1b, 0xb5, 0xd4, 0x16, 0x96, 0xf1, 0xd8, 0x60, 0x62, 0xa1, 0x86, 0x55, 0x38, 0x55, 0xee, 0xb7, - 0x2c, 0x78, 0xa4, 0x47, 0x26, 0xc9, 0xc2, 0x31, 0x98, 0x2d, 0x98, 0x6c, 0x99, 0x55, 0x0b, 0x87, - 0x74, 0x1b, 0x99, 0x2b, 0x95, 0x9f, 0x7c, 0x06, 0x80, 0xb3, 0xe4, 0x97, 0x3e, 0xf4, 0xc3, 0x1f, - 0x9d, 0xf9, 0xc0, 0xef, 0xfe, 0xe8, 0xcc, 0x07, 0xfe, 0xf0, 0x47, 0x67, 0x3e, 0xf0, 0x73, 0x7b, - 0x67, 0xac, 0x1f, 0xee, 0x9d, 0xb1, 0x7e, 0x77, 0xef, 0x8c, 0xf5, 0x27, 0x7b, 0x67, 0xac, 0xaf, - 0xfe, 0xf8, 0xcc, 0x07, 0xde, 0x28, 0x6d, 0x5f, 0xf8, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xda, - 0x87, 0x52, 0x9e, 0x37, 0xcb, 0x00, 0x00, + 0x82, 0xfa, 0x0b, 0x0d, 0xfc, 0x85, 0x61, 0x35, 0xb5, 0xcc, 0x84, 0x7c, 0x43, 0x0f, 0x40, 0x2c, + 0xca, 0x3e, 0x69, 0x17, 0x74, 0x9f, 0xeb, 0x34, 0x5e, 0x11, 0x91, 0x8e, 0x2b, 0xca, 0x97, 0x0b, + 0x73, 0xe4, 0x3e, 0x2e, 0x25, 0x59, 0x22, 0x46, 0x96, 0x7d, 0x6e, 0xad, 0x96, 0xcd, 0x25, 0xbf, + 0x2c, 0x01, 0x38, 0xc5, 0x41, 0x0b, 0x42, 0xf9, 0xe4, 0xd6, 0x99, 0x0f, 0x66, 0x94, 0x4f, 0x39, + 0x25, 0x9a, 0xf6, 0x79, 0x01, 0x46, 0xd5, 0xf3, 0x3c, 0x35, 0xfe, 0x30, 0x4a, 0x85, 0xcb, 0x62, + 0x2b, 0x69, 0x31, 0xd6, 0x71, 0xd0, 0x3a, 0x4c, 0xc6, 0xfc, 0xed, 0x20, 0x19, 0xdb, 0x21, 0x8c, + 0x0c, 0xcf, 0x66, 0x9e, 0xf4, 0x97, 0xe0, 0x7d, 0x56, 0xc4, 0xb7, 0xb2, 0x8c, 0x06, 0xc9, 0x92, + 0x40, 0xaf, 0xc2, 0x84, 0xaf, 0x3f, 0x8c, 0x5a, 0x13, 0x36, 0x08, 0xe5, 0xa2, 0x66, 0x3c, 0x9b, + 0x5a, 0xc3, 0x19, 0x6c, 0xf4, 0x3a, 0xcc, 0xe8, 0x25, 0x22, 0x21, 0x92, 0x13, 0x34, 0x49, 0x2c, + 0xde, 0x19, 0x79, 0x6c, 0x6f, 0x77, 0x6e, 0xe6, 0x5a, 0x0f, 0x1c, 0xdc, 0xb3, 0x36, 0xba, 0x04, + 0x63, 0x72, 0xf8, 0x5a, 0x24, 0x54, 0xea, 0x1c, 0xa9, 0xc1, 0xb0, 0x81, 0x89, 0xee, 0xc3, 0x29, + 0xf9, 0x7f, 0x3d, 0x72, 0x36, 0x36, 0xbc, 0x86, 0x08, 0x49, 0x1b, 0x65, 0x24, 0x16, 0xa5, 0x6f, + 0xf9, 0x4a, 0x37, 0xa4, 0xfd, 0xdd, 0xb9, 0xb3, 0x62, 0xd6, 0xba, 0xc2, 0xd9, 0x47, 0xec, 0x4e, + 0x1f, 0x5d, 0x87, 0x93, 0x9b, 0xc4, 0xf1, 0x93, 0xcd, 0xe5, 0x4d, 0xd2, 0xb8, 0x27, 0x37, 0x16, + 0x8b, 0xaf, 0xd2, 0xdc, 0x07, 0xaf, 0x74, 0xa2, 0xe0, 0x6e, 0xf5, 0xde, 0xdb, 0xfd, 0xf3, 0xe7, + 0x68, 0x65, 0x4d, 0x7e, 0x40, 0xef, 0xc0, 0x98, 0x3e, 0xd7, 0x59, 0xc1, 0x20, 0xff, 0xd1, 0x5c, + 0x21, 0x87, 0xa8, 0x2f, 0xa0, 0xc3, 0xb0, 0x41, 0xdb, 0xbe, 0x09, 0x43, 0xf5, 0x9d, 0xb8, 0x91, + 0xf8, 0x05, 0x98, 0xeb, 0x93, 0xc6, 0x10, 0xd2, 0x8d, 0xcf, 0x1e, 0xf0, 0x12, 0x23, 0xb2, 0xbf, + 0x6c, 0xc1, 0xe4, 0xfa, 0x72, 0xad, 0x1e, 0x36, 0xee, 0x91, 0x64, 0x91, 0xeb, 0x99, 0x58, 0xf0, + 0x56, 0xeb, 0x90, 0x3c, 0xb3, 0x1b, 0x37, 0x3e, 0x0b, 0x03, 0x9b, 0x61, 0x9c, 0x64, 0x6d, 0xb5, + 0x57, 0xc2, 0x38, 0xc1, 0x0c, 0x62, 0xff, 0x89, 0x05, 0x83, 0xec, 0x7d, 0xaa, 0xbc, 0xb7, 0xcd, + 0x8a, 0x8c, 0x0b, 0xbd, 0x04, 0x43, 0x64, 0x63, 0x83, 0x34, 0x12, 0xc1, 0x66, 0x64, 0xdc, 0xc3, + 0xd0, 0x0a, 0x2b, 0xa5, 0xcc, 0x83, 0x35, 0xc6, 0xff, 0x62, 0x81, 0x8c, 0x3e, 0x0d, 0x95, 0xc4, + 0xdb, 0x22, 0x8b, 0xae, 0x2b, 0x8c, 0xa3, 0xfd, 0xb9, 0xe2, 0x28, 0x66, 0xb6, 0x2e, 0x89, 0xe0, + 0x94, 0x9e, 0xfd, 0xd5, 0x12, 0x40, 0x1a, 0xd7, 0x94, 0x37, 0xcc, 0xa5, 0x8e, 0x27, 0xdc, 0x9e, + 0xee, 0xf2, 0x84, 0x1b, 0x4a, 0x09, 0x76, 0x79, 0xc0, 0x4d, 0x4d, 0x55, 0xb9, 0xd0, 0x54, 0x0d, + 0xf4, 0x33, 0x55, 0xcb, 0x70, 0x22, 0x8d, 0xcb, 0x32, 0x03, 0x5c, 0x59, 0x42, 0xd7, 0xf5, 0x2c, + 0x10, 0x77, 0xe2, 0xdb, 0x5f, 0xb5, 0x40, 0x38, 0x6f, 0x16, 0x58, 0xd0, 0xae, 0x7c, 0x6e, 0xc9, + 0xc8, 0x3c, 0xf7, 0x6c, 0x11, 0xbf, 0x56, 0x91, 0x6f, 0x4e, 0x6d, 0x31, 0x23, 0xcb, 0x9c, 0x41, + 0xd5, 0xfe, 0x75, 0x0b, 0x46, 0x39, 0xf8, 0x3a, 0x93, 0xf9, 0xf3, 0xfb, 0xd5, 0x57, 0xb6, 0x60, + 0xf6, 0x12, 0x11, 0x25, 0xac, 0xb2, 0xc6, 0xea, 0x2f, 0x11, 0x49, 0x00, 0x4e, 0x71, 0xd0, 0x33, + 0x30, 0x1c, 0xb7, 0xef, 0x32, 0xf4, 0x8c, 0x27, 0x67, 0x9d, 0x17, 0x63, 0x09, 0xb7, 0xff, 0x59, + 0x09, 0xa6, 0xb2, 0x8e, 0xbc, 0x08, 0xc3, 0x10, 0xd7, 0x01, 0xb2, 0xe2, 0xe3, 0x41, 0x76, 0x29, + 0xcd, 0x11, 0x18, 0xf8, 0x7b, 0xda, 0xec, 0x02, 0x41, 0x50, 0x42, 0x1b, 0x30, 0xea, 0x86, 0xf7, + 0x83, 0xfb, 0x4e, 0xe4, 0x2e, 0xd6, 0xd6, 0xc4, 0x97, 0xc8, 0x71, 0xbd, 0xaa, 0xa6, 0x15, 0x74, + 0x37, 0x63, 0x66, 0x27, 0x49, 0x41, 0x58, 0x27, 0x4c, 0x75, 0xde, 0x46, 0x18, 0x6c, 0x78, 0xcd, + 0xeb, 0x4e, 0xab, 0x98, 0x93, 0xc1, 0xb2, 0x44, 0xd7, 0xda, 0x18, 0x17, 0x79, 0x35, 0x38, 0x00, + 0xa7, 0x24, 0xed, 0x5f, 0x9b, 0x06, 0x63, 0x2d, 0x18, 0x29, 0x7d, 0xad, 0x87, 0x9e, 0xd2, 0xf7, + 0x4d, 0x18, 0x21, 0x5b, 0xad, 0x64, 0xa7, 0xea, 0x45, 0xc5, 0x12, 0xb4, 0xaf, 0x08, 0xec, 0x4e, + 0xea, 0x12, 0x82, 0x15, 0xc5, 0x1e, 0x09, 0x9a, 0xcb, 0xef, 0x8b, 0x04, 0xcd, 0x03, 0x7f, 0x21, + 0x09, 0x9a, 0x5f, 0x87, 0xe1, 0xa6, 0x97, 0x60, 0xd2, 0x0a, 0x45, 0xa2, 0x92, 0x9c, 0xc5, 0x73, + 0x99, 0x23, 0x77, 0xa6, 0xee, 0x14, 0x00, 0x2c, 0xc9, 0xa1, 0x75, 0xb5, 0xa9, 0x86, 0x8a, 0x1c, + 0xf7, 0x9d, 0x76, 0xcb, 0xae, 0xdb, 0x4a, 0x24, 0x64, 0x1e, 0x7e, 0xef, 0x09, 0x99, 0x55, 0x1a, + 0xe5, 0x91, 0x87, 0x95, 0x46, 0xd9, 0x48, 0x47, 0x5d, 0x39, 0x8a, 0x74, 0xd4, 0x5f, 0xb5, 0xe0, + 0x54, 0xab, 0x5b, 0x32, 0x77, 0x91, 0x10, 0xf9, 0x67, 0x0f, 0x91, 0xde, 0xde, 0x68, 0x9a, 0x25, + 0x5e, 0xe8, 0x8a, 0x86, 0xbb, 0x37, 0x2c, 0xf3, 0x5a, 0x8f, 0xbe, 0xf7, 0xbc, 0xd6, 0x47, 0x9d, + 0x39, 0x39, 0xcd, 0x72, 0x3d, 0x7e, 0x24, 0x59, 0xae, 0x27, 0x1e, 0x62, 0x96, 0x6b, 0x2d, 0x3f, + 0xf5, 0xe4, 0xc3, 0xcd, 0x4f, 0xbd, 0x69, 0x9e, 0x4b, 0x3c, 0x1d, 0xf2, 0x4b, 0x85, 0xcf, 0x25, + 0xa3, 0x85, 0x83, 0x4f, 0x26, 0x9e, 0xa9, 0xfb, 0xc4, 0x7b, 0xcc, 0xd4, 0x6d, 0xe4, 0xbb, 0x46, + 0x47, 0x91, 0xef, 0xfa, 0x6d, 0xfd, 0x04, 0x3d, 0x59, 0xa4, 0x05, 0x75, 0x50, 0x76, 0xb6, 0xd0, + 0xed, 0x0c, 0xed, 0xcc, 0xa8, 0x3d, 0x7d, 0xdc, 0x19, 0xb5, 0x4f, 0x1d, 0x61, 0x46, 0xed, 0xd3, + 0xc7, 0x9a, 0x51, 0xfb, 0x91, 0xf7, 0x49, 0x46, 0xed, 0x99, 0xe3, 0xca, 0xa8, 0xfd, 0xe8, 0x43, + 0xcd, 0xa8, 0x4d, 0x3f, 0x5d, 0x4b, 0x86, 0xc3, 0xcd, 0xcc, 0x16, 0xf9, 0x74, 0x5d, 0xa3, 0xe7, + 0xf8, 0xa7, 0x53, 0x20, 0x9c, 0x12, 0xb5, 0xff, 0x0a, 0x9c, 0x39, 0x78, 0xe9, 0xa6, 0x9e, 0x27, + 0xb5, 0xd4, 0xa6, 0x97, 0xf1, 0x3c, 0x61, 0x62, 0xa1, 0x86, 0x55, 0x38, 0xe5, 0xef, 0xb7, 0x2c, + 0x78, 0xa4, 0x47, 0x46, 0xcc, 0xc2, 0xb1, 0xa4, 0x2d, 0x98, 0x6c, 0x99, 0x55, 0x0b, 0x87, 0xa6, + 0x1b, 0x19, 0x38, 0x95, 0xbf, 0x7f, 0x06, 0x80, 0xb3, 0xe4, 0x97, 0x3e, 0xf4, 0xc3, 0x1f, 0x9d, + 0xf9, 0xc0, 0xef, 0xfd, 0xe8, 0xcc, 0x07, 0xfe, 0xe8, 0x47, 0x67, 0x3e, 0xf0, 0x73, 0x7b, 0x67, + 0xac, 0x1f, 0xee, 0x9d, 0xb1, 0x7e, 0x6f, 0xef, 0x8c, 0xf5, 0xa7, 0x7b, 0x67, 0xac, 0xaf, 0xfe, + 0xf8, 0xcc, 0x07, 0xde, 0x28, 0x6d, 0x5f, 0xf8, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x97, 0xb8, + 0x99, 0xb5, 0xff, 0xcb, 0x00, 0x00, } diff --git a/pkg/api/v1/generated.proto b/pkg/api/v1/generated.proto index 355768c1163..4e19e65bf1e 100644 --- a/pkg/api/v1/generated.proto +++ b/pkg/api/v1/generated.proto @@ -3697,6 +3697,20 @@ message ServiceSpec { // Must be a valid DNS name and requires Type to be ExternalName. // +optional optional string externalName = 10; + + // externalTrafficPolicy denotes if this Service desires to route external traffic to + // local endpoints only. This preserves Source IP and avoids a second hop for + // LoadBalancer and Nodeport type services. + // +optional + optional string externalTrafficPolicy = 11; + + // healthCheckNodePort specifies the healthcheck nodePort for the service. + // If not specified, HealthCheckNodePort is created by the service api + // backend with the allocated nodePort. Will use user-specified nodePort value + // if specified by the client. Only effects when Type is set to LoadBalancer + // and ExternalTrafficPolicy is set to Local. + // +optional + optional int32 healthCheckNodePort = 12; } // ServiceStatus represents the current status of a service. diff --git a/pkg/api/v1/service/BUILD b/pkg/api/v1/service/BUILD index 6b4d348a2e7..907da2e70da 100644 --- a/pkg/api/v1/service/BUILD +++ b/pkg/api/v1/service/BUILD @@ -30,6 +30,8 @@ go_test( deps = [ "//pkg/api/v1:go_default_library", "//pkg/util/net/sets:go_default_library", + "//vendor/github.com/davecgh/go-spew/spew:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) diff --git a/pkg/api/v1/service/annotations.go b/pkg/api/v1/service/annotations.go index d6ccaeba32a..c347854367e 100644 --- a/pkg/api/v1/service/annotations.go +++ b/pkg/api/v1/service/annotations.go @@ -26,25 +26,19 @@ const ( // Not all cloud providers support this annotation, though AWS & GCE do. AnnotationLoadBalancerSourceRangesKey = "service.beta.kubernetes.io/load-balancer-source-ranges" - // AnnotationValueExternalTrafficLocal Value of annotation to specify local endpoints behaviour + // AnnotationValueExternalTrafficLocal Value of annotation to specify local endpoints behavior. AnnotationValueExternalTrafficLocal = "OnlyLocal" - // AnnotationValueExternalTrafficGlobal Value of annotation to specify global (legacy) behaviour + // AnnotationValueExternalTrafficGlobal Value of annotation to specify global (legacy) behavior. AnnotationValueExternalTrafficGlobal = "Global" - // TODO: The alpha annotations have been deprecated, remove them when we move this feature to GA. + // TODO: The beta annotations have been deprecated, remove them when we release k8s 1.8. - // AlphaAnnotationHealthCheckNodePort Annotation specifying the healthcheck nodePort for the service - // If not specified, annotation is created by the service api backend with the allocated nodePort - // Will use user-specified nodePort value if specified by the client - AlphaAnnotationHealthCheckNodePort = "service.alpha.kubernetes.io/healthcheck-nodeport" - - // AlphaAnnotationExternalTraffic An annotation that denotes if this Service desires to route external traffic to local - // endpoints only. This preserves Source IP and avoids a second hop. - AlphaAnnotationExternalTraffic = "service.alpha.kubernetes.io/external-traffic" - - // BetaAnnotationHealthCheckNodePort is the beta version of AlphaAnnotationHealthCheckNodePort. + // BetaAnnotationHealthCheckNodePort Annotation specifying the healthcheck nodePort for the service. + // If not specified, annotation is created by the service api backend with the allocated nodePort. + // Will use user-specified nodePort value if specified by the client. BetaAnnotationHealthCheckNodePort = "service.beta.kubernetes.io/healthcheck-nodeport" - // BetaAnnotationExternalTraffic is the beta version of AlphaAnnotationExternalTraffic. + // BetaAnnotationExternalTraffic An annotation that denotes if this Service desires to route + // external traffic to local endpoints only. This preserves Source IP and avoids a second hop. BetaAnnotationExternalTraffic = "service.beta.kubernetes.io/external-traffic" ) diff --git a/pkg/api/v1/service/util.go b/pkg/api/v1/service/util.go index 8ee8a54d6d3..0e48a5844d8 100644 --- a/pkg/api/v1/service/util.go +++ b/pkg/api/v1/service/util.go @@ -76,23 +76,22 @@ func RequestsOnlyLocalTraffic(service *v1.Service) bool { service.Spec.Type != v1.ServiceTypeNodePort { return false } - // First check the alpha annotation and then the beta. This is so existing - // Services continue to work till the user decides to transition to beta. - // If they transition to beta, there's no way to go back to alpha without - // rolling back the cluster. - for _, annotation := range []string{AlphaAnnotationExternalTraffic, BetaAnnotationExternalTraffic} { - if l, ok := service.Annotations[annotation]; ok { - switch l { - case AnnotationValueExternalTrafficLocal: - return true - case AnnotationValueExternalTrafficGlobal: - return false - default: - glog.Errorf("Invalid value for annotation %v: %v", annotation, l) - } + + // First check the beta annotation and then the first class field. This is so that + // existing Services continue to work till the user decides to transition to the + // first class field. + if l, ok := service.Annotations[BetaAnnotationExternalTraffic]; ok { + switch l { + case AnnotationValueExternalTrafficLocal: + return true + case AnnotationValueExternalTrafficGlobal: + return false + default: + glog.Errorf("Invalid value for annotation %v: %v", BetaAnnotationExternalTraffic, l) + return false } } - return false + return service.Spec.ExternalTrafficPolicy == v1.ServiceExternalTrafficPolicyTypeLocal } // NeedsHealthCheck Check if service needs health check. @@ -103,23 +102,62 @@ func NeedsHealthCheck(service *v1.Service) bool { return RequestsOnlyLocalTraffic(service) } -// GetServiceHealthCheckNodePort Return health check node port annotation for service, if one exists +// GetServiceHealthCheckNodePort Return health check node port for service, if one exists func GetServiceHealthCheckNodePort(service *v1.Service) int32 { - // First check the alpha annotation and then the beta. This is so existing - // Services continue to work till the user decides to transition to beta. - // If they transition to beta, there's no way to go back to alpha without - // rolling back the cluster. - for _, annotation := range []string{AlphaAnnotationHealthCheckNodePort, BetaAnnotationHealthCheckNodePort} { - if l, ok := service.Annotations[annotation]; ok { - p, err := strconv.Atoi(l) - if err != nil { - glog.Errorf("Failed to parse annotation %v: %v", annotation, err) - continue - } - return int32(p) + // First check the beta annotation and then the first class field. This is so that + // existing Services continue to work till the user decides to transition to the + // first class field. + if l, ok := service.Annotations[BetaAnnotationHealthCheckNodePort]; ok { + p, err := strconv.Atoi(l) + if err != nil { + glog.Errorf("Failed to parse annotation %v: %v", BetaAnnotationHealthCheckNodePort, err) + return 0 } + return int32(p) } - return 0 + return service.Spec.HealthCheckNodePort +} + +// SetDefaultExternalTrafficPolicyIfNeeded defaults the ExternalTrafficPolicy field +// for NodePort / LoadBalancer service to Global for consistency. +// TODO: Move this default logic to default.go once beta annotation is deprecated. +func SetDefaultExternalTrafficPolicyIfNeeded(service *v1.Service) { + if _, ok := service.Annotations[BetaAnnotationExternalTraffic]; ok { + // Don't default this field if beta annotation exists. + return + } else if (service.Spec.Type == v1.ServiceTypeNodePort || + service.Spec.Type == v1.ServiceTypeLoadBalancer) && + service.Spec.ExternalTrafficPolicy == "" { + service.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeGlobal + } +} + +// ClearExternalTrafficPolicy resets the ExternalTrafficPolicy field. +func ClearExternalTrafficPolicy(service *v1.Service) { + // First check the beta annotation and then the first class field. This is so existing + // Services continue to work till the user decides to transition to the first class field. + if _, ok := service.Annotations[BetaAnnotationExternalTraffic]; ok { + delete(service.Annotations, BetaAnnotationExternalTraffic) + return + } + service.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyType("") +} + +// SetServiceHealthCheckNodePort sets the given health check node port on service. +// It does not check whether this service needs healthCheckNodePort. +func SetServiceHealthCheckNodePort(service *v1.Service, hcNodePort int32) { + // First check the beta annotation and then the first class field. This is so that + // existing Services continue to work till the user decides to transition to the + // first class field. + if _, ok := service.Annotations[BetaAnnotationExternalTraffic]; ok { + if hcNodePort == 0 { + delete(service.Annotations, BetaAnnotationHealthCheckNodePort) + } else { + service.Annotations[BetaAnnotationHealthCheckNodePort] = fmt.Sprintf("%d", hcNodePort) + } + return + } + service.Spec.HealthCheckNodePort = hcNodePort } // GetServiceHealthCheckPathPort Return the path and nodePort programmed into the Cloud LB Health Check diff --git a/pkg/api/v1/service/util_test.go b/pkg/api/v1/service/util_test.go index 28572f3c829..1149dc1f37a 100644 --- a/pkg/api/v1/service/util_test.go +++ b/pkg/api/v1/service/util_test.go @@ -19,10 +19,15 @@ package service import ( "testing" + "fmt" + "reflect" "strings" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/kubernetes/pkg/api/v1" netsets "k8s.io/kubernetes/pkg/util/net/sets" + + "github.com/davecgh/go-spew/spew" ) func TestGetLoadBalancerSourceRanges(t *testing.T) { @@ -129,3 +134,385 @@ func TestAllowAll(t *testing.T) { checkAllowAll(true, "192.168.0.0/0") checkAllowAll(true, "192.168.0.1/32", "0.0.0.0/0") } + +func TestRequestsOnlyLocalTraffic(t *testing.T) { + checkRequestsOnlyLocalTraffic := func(requestsOnlyLocalTraffic bool, service *v1.Service) { + res := RequestsOnlyLocalTraffic(service) + if res != requestsOnlyLocalTraffic { + t.Errorf("Expected requests OnlyLocal traffic = %v, got %v", + requestsOnlyLocalTraffic, res) + } + } + + checkRequestsOnlyLocalTraffic(false, &v1.Service{}) + checkRequestsOnlyLocalTraffic(false, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeClusterIP, + }, + }) + checkRequestsOnlyLocalTraffic(false, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeNodePort, + }, + }) + checkRequestsOnlyLocalTraffic(false, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeNodePort, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeGlobal, + }, + }) + checkRequestsOnlyLocalTraffic(true, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeNodePort, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeLocal, + }, + }) + checkRequestsOnlyLocalTraffic(false, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeGlobal, + }, + }) + checkRequestsOnlyLocalTraffic(true, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeLocal, + }, + }) +} + +func TestNeedsHealthCheck(t *testing.T) { + checkNeedsHealthCheck := func(needsHealthCheck bool, service *v1.Service) { + res := NeedsHealthCheck(service) + if res != needsHealthCheck { + t.Errorf("Expected needs health check = %v, got %v", + needsHealthCheck, res) + } + } + + checkNeedsHealthCheck(false, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeClusterIP, + }, + }) + checkNeedsHealthCheck(false, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeNodePort, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeGlobal, + }, + }) + checkNeedsHealthCheck(false, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeNodePort, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeLocal, + }, + }) + checkNeedsHealthCheck(false, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeGlobal, + }, + }) + checkNeedsHealthCheck(true, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeLocal, + }, + }) + + checkNeedsHealthCheck(false, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: "invalid", + }, + }, + }) + checkNeedsHealthCheck(false, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficGlobal, + }, + }, + }) + checkNeedsHealthCheck(true, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficLocal, + }, + }, + }) +} + +func TestGetServiceHealthCheckNodePort(t *testing.T) { + checkGetServiceHealthCheckNodePort := func(healthCheckNodePort int32, service *v1.Service) { + res := GetServiceHealthCheckNodePort(service) + if res != healthCheckNodePort { + t.Errorf("Expected health check node port = %v, got %v", + healthCheckNodePort, res) + } + } + + checkGetServiceHealthCheckNodePort(0, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeClusterIP, + }, + }) + checkGetServiceHealthCheckNodePort(0, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeNodePort, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeGlobal, + }, + }) + checkGetServiceHealthCheckNodePort(0, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeGlobal, + }, + }) + checkGetServiceHealthCheckNodePort(34567, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeLocal, + HealthCheckNodePort: int32(34567), + }, + }) + checkGetServiceHealthCheckNodePort(34567, &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficLocal, + BetaAnnotationHealthCheckNodePort: "34567", + }, + }, + }) +} + +func TestSetDefaultExternalTrafficPolicyIfNeeded(t *testing.T) { + testCases := []struct { + inputService *v1.Service + expectedService *v1.Service + }{ + // First class fields cases. + { + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + }, + }, + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeGlobal, + }, + }, + }, + { + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeNodePort, + }, + }, + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeNodePort, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeGlobal, + }, + }, + }, + { + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeClusterIP, + }, + }, + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeClusterIP, + }, + }, + }, + // Beta annotations cases. + { + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficLocal, + }, + }, + }, + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficLocal, + }, + }, + }, + }, + { + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficGlobal, + }, + }, + }, + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeLoadBalancer, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficGlobal, + }, + }, + }, + }, + } + + for i, tc := range testCases { + SetDefaultExternalTrafficPolicyIfNeeded(tc.inputService) + if !reflect.DeepEqual(tc.inputService, tc.expectedService) { + t.Errorf("%v: got unexpected service", i) + spew.Dump(tc) + } + } +} + +func TestClearExternalTrafficPolicy(t *testing.T) { + testCases := []struct { + inputService *v1.Service + }{ + // First class fields cases. + { + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeClusterIP, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeGlobal, + }, + }, + }, + // Beta annotations cases. + { + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeClusterIP, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficLocal, + }, + }, + }, + }, + } + + for i, tc := range testCases { + ClearExternalTrafficPolicy(tc.inputService) + if _, ok := tc.inputService.Annotations[BetaAnnotationExternalTraffic]; ok || + tc.inputService.Spec.ExternalTrafficPolicy != "" { + t.Errorf("%v: failed to clear ExternalTrafficPolicy", i) + spew.Dump(tc) + } + } +} + +func TestSetServiceHealthCheckNodePort(t *testing.T) { + testCases := []struct { + inputService *v1.Service + hcNodePort int32 + beta bool + }{ + // First class fields cases. + { + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeClusterIP, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeGlobal, + }, + }, + 30012, + false, + }, + { + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeClusterIP, + ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeGlobal, + }, + }, + 0, + false, + }, + // Beta annotations cases. + { + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeClusterIP, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficGlobal, + }, + }, + }, + 30012, + true, + }, + { + &v1.Service{ + Spec: v1.ServiceSpec{ + Type: v1.ServiceTypeClusterIP, + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + BetaAnnotationExternalTraffic: AnnotationValueExternalTrafficGlobal, + }, + }, + }, + 0, + true, + }, + } + + for i, tc := range testCases { + SetServiceHealthCheckNodePort(tc.inputService, tc.hcNodePort) + if !tc.beta { + if tc.inputService.Spec.HealthCheckNodePort != tc.hcNodePort { + t.Errorf("%v: got HealthCheckNodePort %v, want %v", i, tc.inputService.Spec.HealthCheckNodePort, tc.hcNodePort) + } + } else { + l, ok := tc.inputService.Annotations[BetaAnnotationHealthCheckNodePort] + if tc.hcNodePort == 0 { + if ok { + t.Errorf("%v: HealthCheckNodePort set, want it to be cleared", i) + } + } else { + if !ok { + t.Errorf("%v: HealthCheckNodePort unset, want %v", i, tc.hcNodePort) + } else if l != fmt.Sprintf("%v", tc.hcNodePort) { + t.Errorf("%v: got HealthCheckNodePort %v, want %v", i, l, tc.hcNodePort) + } + } + } + } +} diff --git a/pkg/api/v1/types.generated.go b/pkg/api/v1/types.generated.go index 7e81fa3d65a..2e78f374253 100644 --- a/pkg/api/v1/types.generated.go +++ b/pkg/api/v1/types.generated.go @@ -41195,6 +41195,32 @@ func (x *ServiceType) CodecDecodeSelf(d *codec1978.Decoder) { } } +func (x ServiceExternalTrafficPolicyType) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x)) + } +} + +func (x *ServiceExternalTrafficPolicyType) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + *((*string)(x)) = r.DecodeString() + } +} + func (x *ServiceStatus) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) @@ -41802,7 +41828,7 @@ func (x *ServiceSpec) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [9]bool + var yyq2 [11]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = len(x.Ports) != 0 @@ -41814,9 +41840,11 @@ func (x *ServiceSpec) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[6] = x.LoadBalancerIP != "" yyq2[7] = len(x.LoadBalancerSourceRanges) != 0 yyq2[8] = x.ExternalName != "" + yyq2[9] = x.ExternalTrafficPolicy != "" + yyq2[10] = x.HealthCheckNodePort != 0 var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(9) + r.EncodeArrayStart(11) } else { yynn2 = 0 for _, b := range yyq2 { @@ -42064,6 +42092,46 @@ func (x *ServiceSpec) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[9] { + x.ExternalTrafficPolicy.CodecEncodeSelf(e) + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[9] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("externalTrafficPolicy")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + x.ExternalTrafficPolicy.CodecEncodeSelf(e) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[10] { + yym34 := z.EncBinary() + _ = yym34 + if false { + } else { + r.EncodeInt(int64(x.HealthCheckNodePort)) + } + } else { + r.EncodeInt(0) + } + } else { + if yyq2[10] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("healthCheckNodePort")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym35 := z.EncBinary() + _ = yym35 + if false { + } else { + r.EncodeInt(int64(x.HealthCheckNodePort)) + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -42223,6 +42291,25 @@ func (x *ServiceSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { *((*string)(yyv18)) = r.DecodeString() } } + case "externalTrafficPolicy": + if r.TryDecodeAsNil() { + x.ExternalTrafficPolicy = "" + } else { + yyv20 := &x.ExternalTrafficPolicy + yyv20.CodecDecodeSelf(d) + } + case "healthCheckNodePort": + if r.TryDecodeAsNil() { + x.HealthCheckNodePort = 0 + } else { + yyv21 := &x.HealthCheckNodePort + yym22 := z.DecBinary() + _ = yym22 + if false { + } else { + *((*int32)(yyv21)) = int32(r.DecodeInt(32)) + } + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -42234,16 +42321,16 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj20 int - var yyb20 bool - var yyhl20 bool = l >= 0 - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + var yyj23 int + var yyb23 bool + var yyhl23 bool = l >= 0 + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42251,21 +42338,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Ports = nil } else { - yyv21 := &x.Ports - yym22 := z.DecBinary() - _ = yym22 + yyv24 := &x.Ports + yym25 := z.DecBinary() + _ = yym25 if false { } else { - h.decSliceServicePort((*[]ServicePort)(yyv21), d) + h.decSliceServicePort((*[]ServicePort)(yyv24), d) } } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42273,21 +42360,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Selector = nil } else { - yyv23 := &x.Selector - yym24 := z.DecBinary() - _ = yym24 + yyv26 := &x.Selector + yym27 := z.DecBinary() + _ = yym27 if false { } else { - z.F.DecMapStringStringX(yyv23, false, d) + z.F.DecMapStringStringX(yyv26, false, d) } } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42295,21 +42382,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ClusterIP = "" } else { - yyv25 := &x.ClusterIP - yym26 := z.DecBinary() - _ = yym26 + yyv28 := &x.ClusterIP + yym29 := z.DecBinary() + _ = yym29 if false { } else { - *((*string)(yyv25)) = r.DecodeString() + *((*string)(yyv28)) = r.DecodeString() } } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42317,16 +42404,16 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Type = "" } else { - yyv27 := &x.Type - yyv27.CodecDecodeSelf(d) + yyv30 := &x.Type + yyv30.CodecDecodeSelf(d) } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42334,21 +42421,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ExternalIPs = nil } else { - yyv28 := &x.ExternalIPs - yym29 := z.DecBinary() - _ = yym29 + yyv31 := &x.ExternalIPs + yym32 := z.DecBinary() + _ = yym32 if false { } else { - z.F.DecSliceStringX(yyv28, false, d) + z.F.DecSliceStringX(yyv31, false, d) } } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42356,16 +42443,16 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.SessionAffinity = "" } else { - yyv30 := &x.SessionAffinity - yyv30.CodecDecodeSelf(d) + yyv33 := &x.SessionAffinity + yyv33.CodecDecodeSelf(d) } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42373,21 +42460,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.LoadBalancerIP = "" } else { - yyv31 := &x.LoadBalancerIP - yym32 := z.DecBinary() - _ = yym32 + yyv34 := &x.LoadBalancerIP + yym35 := z.DecBinary() + _ = yym35 if false { } else { - *((*string)(yyv31)) = r.DecodeString() + *((*string)(yyv34)) = r.DecodeString() } } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42395,21 +42482,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.LoadBalancerSourceRanges = nil } else { - yyv33 := &x.LoadBalancerSourceRanges - yym34 := z.DecBinary() - _ = yym34 + yyv36 := &x.LoadBalancerSourceRanges + yym37 := z.DecBinary() + _ = yym37 if false { } else { - z.F.DecSliceStringX(yyv33, false, d) + z.F.DecSliceStringX(yyv36, false, d) } } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42417,26 +42504,65 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ExternalName = "" } else { - yyv35 := &x.ExternalName - yym36 := z.DecBinary() - _ = yym36 + yyv38 := &x.ExternalName + yym39 := z.DecBinary() + _ = yym39 if false { } else { - *((*string)(yyv35)) = r.DecodeString() + *((*string)(yyv38)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ExternalTrafficPolicy = "" + } else { + yyv40 := &x.ExternalTrafficPolicy + yyv40.CodecDecodeSelf(d) + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.HealthCheckNodePort = 0 + } else { + yyv41 := &x.HealthCheckNodePort + yym42 := z.DecBinary() + _ = yym42 + if false { + } else { + *((*int32)(yyv41)) = int32(r.DecodeInt(32)) } } for { - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj20-1, "") + z.DecStructFieldNotFound(yyj23-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -71379,7 +71505,7 @@ func (x codecSelfer1234) decSliceService(v *[]Service, d *codec1978.Decoder) { yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 440) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 464) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/pkg/api/v1/types.go b/pkg/api/v1/types.go index 945079129c5..db730965988 100644 --- a/pkg/api/v1/types.go +++ b/pkg/api/v1/types.go @@ -2792,6 +2792,16 @@ const ( ServiceTypeExternalName ServiceType = "ExternalName" ) +// Service External Traffic Policy Type string +type ServiceExternalTrafficPolicyType string + +const ( + // ServiceExternalTrafficPolicyTypeLocal specifies local endpoints behavior. + ServiceExternalTrafficPolicyTypeLocal ServiceExternalTrafficPolicyType = "Local" + // ServiceExternalTrafficPolicyTypeGlobal specifies global (legacy) behavior. + ServiceExternalTrafficPolicyTypeGlobal ServiceExternalTrafficPolicyType = "Global" +) + // ServiceStatus represents the current status of a service. type ServiceStatus struct { // LoadBalancer contains the current status of the load-balancer, @@ -2904,6 +2914,20 @@ type ServiceSpec struct { // Must be a valid DNS name and requires Type to be ExternalName. // +optional ExternalName string `json:"externalName,omitempty" protobuf:"bytes,10,opt,name=externalName"` + + // externalTrafficPolicy denotes if this Service desires to route external traffic to + // local endpoints only. This preserves Source IP and avoids a second hop for + // LoadBalancer and Nodeport type services. + // +optional + ExternalTrafficPolicy ServiceExternalTrafficPolicyType `json:"externalTrafficPolicy,omitempty" protobuf:"bytes,11,opt,name=externalTrafficPolicy"` + + // healthCheckNodePort specifies the healthcheck nodePort for the service. + // If not specified, HealthCheckNodePort is created by the service api + // backend with the allocated nodePort. Will use user-specified nodePort value + // if specified by the client. Only effects when Type is set to LoadBalancer + // and ExternalTrafficPolicy is set to Local. + // +optional + HealthCheckNodePort int32 `json:"healthCheckNodePort,omitempty" protobuf:"bytes,12,opt,name=healthCheckNodePort"` } // ServicePort contains information on service's port. diff --git a/pkg/api/v1/types_swagger_doc_generated.go b/pkg/api/v1/types_swagger_doc_generated.go index 585b4a9da65..409a698b106 100644 --- a/pkg/api/v1/types_swagger_doc_generated.go +++ b/pkg/api/v1/types_swagger_doc_generated.go @@ -1844,6 +1844,8 @@ var map_ServiceSpec = map[string]string{ "loadBalancerIP": "Only applies to Service Type: LoadBalancer LoadBalancer will get created with the IP specified in this field. This feature depends on whether the underlying cloud-provider supports specifying the loadBalancerIP when a load balancer is created. This field will be ignored if the cloud-provider does not support the feature.", "loadBalancerSourceRanges": "If specified and supported by the platform, this will restrict traffic through the cloud-provider load-balancer will be restricted to the specified client IPs. This field will be ignored if the cloud-provider does not support the feature.\" More info: http://kubernetes.io/docs/user-guide/services-firewalls", "externalName": "externalName is the external reference that kubedns or equivalent will return as a CNAME record for this service. No proxying will be involved. Must be a valid DNS name and requires Type to be ExternalName.", + "externalTrafficPolicy": "externalTrafficPolicy denotes if this Service desires to route external traffic to local endpoints only. This preserves Source IP and avoids a second hop for LoadBalancer and Nodeport type services.", + "healthCheckNodePort": "healthCheckNodePort specifies the healthcheck nodePort for the service. If not specified, HealthCheckNodePort is created by the service api backend with the allocated nodePort. Will use user-specified nodePort value if specified by the client. Only effects when Type is set to LoadBalancer and ExternalTrafficPolicy is set to Local.", } func (ServiceSpec) SwaggerDoc() map[string]string { diff --git a/pkg/api/v1/zz_generated.conversion.go b/pkg/api/v1/zz_generated.conversion.go index 59162ce2f6e..eab98de16b4 100644 --- a/pkg/api/v1/zz_generated.conversion.go +++ b/pkg/api/v1/zz_generated.conversion.go @@ -4721,6 +4721,8 @@ func autoConvert_v1_ServiceSpec_To_api_ServiceSpec(in *ServiceSpec, out *api.Ser out.LoadBalancerIP = in.LoadBalancerIP out.LoadBalancerSourceRanges = *(*[]string)(unsafe.Pointer(&in.LoadBalancerSourceRanges)) out.ExternalName = in.ExternalName + out.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyType(in.ExternalTrafficPolicy) + out.HealthCheckNodePort = in.HealthCheckNodePort return nil } @@ -4739,6 +4741,8 @@ func autoConvert_api_ServiceSpec_To_v1_ServiceSpec(in *api.ServiceSpec, out *Ser out.LoadBalancerIP = in.LoadBalancerIP out.SessionAffinity = ServiceAffinity(in.SessionAffinity) out.LoadBalancerSourceRanges = *(*[]string)(unsafe.Pointer(&in.LoadBalancerSourceRanges)) + out.ExternalTrafficPolicy = ServiceExternalTrafficPolicyType(in.ExternalTrafficPolicy) + out.HealthCheckNodePort = in.HealthCheckNodePort return nil } diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index bf69f1fa47e..5da0b5ee804 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -2742,7 +2742,8 @@ func ValidateService(service *api.Service) field.ErrorList { } } - allErrs = append(allErrs, validateServiceExternalTrafficFields(service)...) + allErrs = append(allErrs, validateServiceExternalTrafficFieldsValue(service)...) + allErrs = append(allErrs, validateServiceExternalTrafficAPIVersion(service)...) return allErrs } @@ -2785,61 +2786,68 @@ func validateServicePort(sp *api.ServicePort, requireName, isHeadlessService boo return allErrs } -// validateServiceExternalTrafficFields validates ExternalTraffic related annotations +// validateServiceExternalTrafficFieldsValue validates ExternalTraffic related annotations // have legal value. -func validateServiceExternalTrafficFields(service *api.Service) field.ErrorList { +func validateServiceExternalTrafficFieldsValue(service *api.Service) field.ErrorList { allErrs := field.ErrorList{} - for _, annotation := range []string{apiservice.AlphaAnnotationExternalTraffic, apiservice.BetaAnnotationExternalTraffic} { - if l, ok := service.Annotations[annotation]; ok { - if l != apiservice.AnnotationValueExternalTrafficLocal && - l != apiservice.AnnotationValueExternalTrafficGlobal { - allErrs = append(allErrs, field.Invalid(field.NewPath("metadata", "annotations").Key(annotation), l, - fmt.Sprintf("ExternalTraffic must be %v or %v", apiservice.AnnotationValueExternalTrafficLocal, apiservice.AnnotationValueExternalTrafficGlobal))) - } + // Check beta annotations. + if l, ok := service.Annotations[apiservice.BetaAnnotationExternalTraffic]; ok { + if l != apiservice.AnnotationValueExternalTrafficLocal && + l != apiservice.AnnotationValueExternalTrafficGlobal { + allErrs = append(allErrs, field.Invalid(field.NewPath("metadata", "annotations").Key(apiservice.BetaAnnotationExternalTraffic), l, + fmt.Sprintf("ExternalTraffic must be %v or %v", apiservice.AnnotationValueExternalTrafficLocal, apiservice.AnnotationValueExternalTrafficGlobal))) } } - for _, annotation := range []string{apiservice.AlphaAnnotationHealthCheckNodePort, apiservice.BetaAnnotationHealthCheckNodePort} { - if l, ok := service.Annotations[annotation]; ok { - p, err := strconv.Atoi(l) - if err != nil { - allErrs = append(allErrs, field.Invalid(field.NewPath("metadata", "annotations").Key(annotation), l, - "HealthCheckNodePort must be a valid port number")) - } else if p <= 0 { - allErrs = append(allErrs, field.Invalid(field.NewPath("metadata", "annotations").Key(annotation), l, - "HealthCheckNodePort must be greater than 0")) - } + if l, ok := service.Annotations[apiservice.BetaAnnotationHealthCheckNodePort]; ok { + p, err := strconv.Atoi(l) + if err != nil { + allErrs = append(allErrs, field.Invalid(field.NewPath("metadata", "annotations").Key(apiservice.BetaAnnotationHealthCheckNodePort), l, + "HealthCheckNodePort must be a valid port number")) + } else if p <= 0 { + allErrs = append(allErrs, field.Invalid(field.NewPath("metadata", "annotations").Key(apiservice.BetaAnnotationHealthCheckNodePort), l, + "HealthCheckNodePort must be greater than 0")) } } - allErrs = append(allErrs, validateServiceExternalTrafficAPIVersion(service)...) + // Check first class fields. + if service.Spec.ExternalTrafficPolicy != "" && + service.Spec.ExternalTrafficPolicy != api.ServiceExternalTrafficPolicyTypeGlobal && + service.Spec.ExternalTrafficPolicy != api.ServiceExternalTrafficPolicyTypeLocal { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec").Child("externalTrafficPolicy"), service.Spec.ExternalTrafficPolicy, + fmt.Sprintf("ExternalTrafficPolicy must be empty, %v or %v", api.ServiceExternalTrafficPolicyTypeGlobal, api.ServiceExternalTrafficPolicyTypeLocal))) + } + if service.Spec.HealthCheckNodePort < 0 { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec").Child("healthCheckNodePort"), service.Spec.HealthCheckNodePort, + "HealthCheckNodePort must be not less than 0")) + } return allErrs } // serviceExternalTrafficStatus stores flags indicating whether ExternalTraffic -// related beta annotations and alpha annotations are set on service. +// related beta annotations and GA fields are set on service. type serviceExternalTrafficStatus struct { - alphaExternalTrafficIsSet bool - alphaHealthCheckIsSet bool - betaExternalTrafficIsSet bool - betaHealthCheckIsSet bool + betaExternalTrafficIsSet bool + betaHealthCheckIsSet bool + gaExternalTrafficIsSet bool + gaHealthCheckIsSet bool } -func (s *serviceExternalTrafficStatus) useAlphaExternalTrafficWithBeta() bool { - return s.alphaExternalTrafficIsSet && (s.betaExternalTrafficIsSet || s.betaHealthCheckIsSet) +func (s *serviceExternalTrafficStatus) useBetaExternalTrafficWithGA() bool { + return s.betaExternalTrafficIsSet && (s.gaExternalTrafficIsSet || s.gaHealthCheckIsSet) } -func (s *serviceExternalTrafficStatus) useAlphaHealthCheckWithBeta() bool { - return s.alphaHealthCheckIsSet && (s.betaExternalTrafficIsSet || s.betaHealthCheckIsSet) +func (s *serviceExternalTrafficStatus) useBetaHealthCheckWithGA() bool { + return s.betaHealthCheckIsSet && (s.gaExternalTrafficIsSet || s.gaHealthCheckIsSet) } func getServiceExternalTrafficStatus(service *api.Service) *serviceExternalTrafficStatus { s := serviceExternalTrafficStatus{} - _, s.alphaExternalTrafficIsSet = service.Annotations[apiservice.AlphaAnnotationExternalTraffic] - _, s.alphaHealthCheckIsSet = service.Annotations[apiservice.AlphaAnnotationHealthCheckNodePort] _, s.betaExternalTrafficIsSet = service.Annotations[apiservice.BetaAnnotationExternalTraffic] _, s.betaHealthCheckIsSet = service.Annotations[apiservice.BetaAnnotationHealthCheckNodePort] + s.gaExternalTrafficIsSet = service.Spec.ExternalTrafficPolicy != "" + s.gaHealthCheckIsSet = service.Spec.HealthCheckNodePort != 0 return &s } @@ -2850,16 +2858,39 @@ func validateServiceExternalTrafficAPIVersion(service *api.Service) field.ErrorL status := getServiceExternalTrafficStatus(service) - if status.useAlphaExternalTrafficWithBeta() { - fieldPath := field.NewPath("metadata", "annotations").Key(apiservice.AlphaAnnotationExternalTraffic) - msg := fmt.Sprintf("please replace the alpha annotation with beta annotation") - allErrs = append(allErrs, field.Invalid(fieldPath, apiservice.AlphaAnnotationExternalTraffic, msg)) + if status.useBetaExternalTrafficWithGA() { + fieldPath := field.NewPath("metadata", "annotations").Key(apiservice.BetaAnnotationExternalTraffic) + msg := fmt.Sprintf("please replace the beta annotation with 'ExternalTrafficPolicy' field") + allErrs = append(allErrs, field.Invalid(fieldPath, apiservice.BetaAnnotationExternalTraffic, msg)) } - if status.useAlphaHealthCheckWithBeta() { - fieldPath := field.NewPath("metadata", "annotations").Key(apiservice.AlphaAnnotationHealthCheckNodePort) - msg := fmt.Sprintf("please replace the alpha annotation with beta annotation") - allErrs = append(allErrs, field.Invalid(fieldPath, apiservice.AlphaAnnotationHealthCheckNodePort, msg)) + if status.useBetaHealthCheckWithGA() { + fieldPath := field.NewPath("metadata", "annotations").Key(apiservice.BetaAnnotationHealthCheckNodePort) + msg := fmt.Sprintf("please replace the beta annotation with 'HealthCheckNodePort' field") + allErrs = append(allErrs, field.Invalid(fieldPath, apiservice.BetaAnnotationHealthCheckNodePort, msg)) + } + + return allErrs +} + +// ValidateServiceExternalTrafficFieldsCombination validates if ExternalTrafficPolicy, +// HealthCheckNodePort and Type combination are legal. For update, it should be called +// after clearing externalTraffic related fields for the ease of transitioning between +// different service types. +func ValidateServiceExternalTrafficFieldsCombination(service *api.Service) field.ErrorList { + allErrs := field.ErrorList{} + + if service.Spec.Type != api.ServiceTypeLoadBalancer && + service.Spec.Type != api.ServiceTypeNodePort && + service.Spec.ExternalTrafficPolicy != "" { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "externalTrafficPolicy"), service.Spec.ExternalTrafficPolicy, + "ExternalTrafficPolicy can only be set on NodePort and LoadBalancer service")) + } + + if !apiservice.NeedsHealthCheck(service) && + service.Spec.HealthCheckNodePort != 0 { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "healthCheckNodePort"), service.Spec.HealthCheckNodePort, + "HealthCheckNodePort can only be set on LoadBalancer service with ExternalTrafficPolicy=Local")) } return allErrs diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 1cb675a938e..0e0352f084c 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -5656,9 +5656,19 @@ func TestValidateService(t *testing.T) { numErrs: 1, }, { - name: "LoadBalancer allows onlyLocal alpha annotations", + name: "invalid node port with clusterIP None", tweakSvc: func(s *api.Service) { - s.Annotations[service.AlphaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficLocal + s.Spec.Type = api.ServiceTypeNodePort + s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 1, Protocol: "TCP", NodePort: 1, TargetPort: intstr.FromInt(1)}) + s.Spec.ClusterIP = "None" + }, + numErrs: 1, + }, + // ESIPP section begins. + { + name: "LoadBalancer allows onlyLocal beta annotations", + tweakSvc: func(s *api.Service) { + s.Annotations[service.BetaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficLocal }, numErrs: 0, }, @@ -5689,14 +5699,68 @@ func TestValidateService(t *testing.T) { numErrs: 1, }, { - name: "invalid node port with clusterIP None", + name: "valid healthCheckNodePort beta annotation", tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeNodePort - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 1, Protocol: "TCP", NodePort: 1, TargetPort: intstr.FromInt(1)}) - s.Spec.ClusterIP = "None" + s.Spec.Type = api.ServiceTypeLoadBalancer + s.Annotations[service.BetaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficLocal + s.Annotations[service.BetaAnnotationHealthCheckNodePort] = "31100" + }, + numErrs: 0, + }, + { + name: "invalid externalTraffic field", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeLoadBalancer + s.Spec.ExternalTrafficPolicy = "invalid" }, numErrs: 1, }, + { + name: "nagative healthCheckNodePort field", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeLoadBalancer + s.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal + s.Spec.HealthCheckNodePort = -1 + }, + numErrs: 1, + }, + { + name: "nagative healthCheckNodePort field", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeLoadBalancer + s.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal + s.Spec.HealthCheckNodePort = 31100 + }, + numErrs: 0, + }, + { + name: "disallows use ExternalTraffic beta annotation with first class field", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeLoadBalancer + s.Annotations[service.BetaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficLocal + s.Spec.HealthCheckNodePort = 3001 + }, + numErrs: 1, + }, + { + name: "disallows duplicated ExternalTraffic beta annotation with first class field", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeLoadBalancer + s.Annotations[service.BetaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficLocal + s.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal + }, + numErrs: 1, + }, + { + name: "disallows use HealthCheckNodePort beta annotation with first class field", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeLoadBalancer + s.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal + s.Annotations[service.BetaAnnotationHealthCheckNodePort] = "3001" + }, + numErrs: 1, + }, + // ESIPP section ends. } for _, tc := range testCases { @@ -5709,6 +5773,75 @@ func TestValidateService(t *testing.T) { } } +func TestValidateServiceExternalTrafficFieldsCombination(t *testing.T) { + testCases := []struct { + name string + tweakSvc func(svc *api.Service) // Given a basic valid service, each test case can customize it. + numErrs int + }{ + { + name: "valid loadBalancer service with externalTrafficPolicy and healthCheckNodePort set", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeLoadBalancer + s.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal + s.Spec.HealthCheckNodePort = 34567 + }, + numErrs: 0, + }, + { + name: "valid nodePort service with externalTrafficPolicy set", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeNodePort + s.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal + }, + numErrs: 0, + }, + { + name: "valid clusterIP service with none of externalTrafficPolicy and healthCheckNodePort set", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeClusterIP + }, + numErrs: 0, + }, + { + name: "cannot set healthCheckNodePort field on loadBalancer service with externalTrafficPolicy!=Local", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeLoadBalancer + s.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeGlobal + s.Spec.HealthCheckNodePort = 34567 + }, + numErrs: 1, + }, + { + name: "cannot set healthCheckNodePort field on nodePort service", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeNodePort + s.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal + s.Spec.HealthCheckNodePort = 34567 + }, + numErrs: 1, + }, + { + name: "cannot set externalTrafficPolicy or healthCheckNodePort fields on clusterIP service", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeClusterIP + s.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal + s.Spec.HealthCheckNodePort = 34567 + }, + numErrs: 2, + }, + } + + for _, tc := range testCases { + svc := makeValidService() + tc.tweakSvc(&svc) + errs := ValidateServiceExternalTrafficFieldsCombination(&svc) + if len(errs) != tc.numErrs { + t.Errorf("Unexpected error list for case %q: %v", tc.name, errs.ToAggregate()) + } + } +} + func TestValidateReplicationControllerStatus(t *testing.T) { tests := []struct { name string @@ -7088,40 +7221,46 @@ func TestValidateServiceUpdate(t *testing.T) { numErrs: 1, }, { - name: "Service allows removing onlyLocal alpha annotations", + name: "Service allows removing onlyLocal beta annotations", tweakSvc: func(oldSvc, newSvc *api.Service) { - oldSvc.Annotations[service.AlphaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficLocal - oldSvc.Annotations[service.AlphaAnnotationHealthCheckNodePort] = "3001" + oldSvc.Annotations[service.BetaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficLocal + oldSvc.Annotations[service.BetaAnnotationHealthCheckNodePort] = "3001" }, numErrs: 0, }, { - name: "Service allows modifying onlyLocal alpha annotations", + name: "Service allows modifying onlyLocal beta annotations", tweakSvc: func(oldSvc, newSvc *api.Service) { - oldSvc.Annotations[service.AlphaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficLocal - oldSvc.Annotations[service.AlphaAnnotationHealthCheckNodePort] = "3001" - newSvc.Annotations[service.AlphaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficGlobal - newSvc.Annotations[service.AlphaAnnotationHealthCheckNodePort] = oldSvc.Annotations[service.AlphaAnnotationHealthCheckNodePort] - }, - numErrs: 0, - }, - { - name: "Service disallows promoting one of the onlyLocal pair to beta", - tweakSvc: func(oldSvc, newSvc *api.Service) { - oldSvc.Annotations[service.AlphaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficLocal - oldSvc.Annotations[service.AlphaAnnotationHealthCheckNodePort] = "3001" + oldSvc.Spec.Type = api.ServiceTypeLoadBalancer + oldSvc.Annotations[service.BetaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficLocal + oldSvc.Annotations[service.BetaAnnotationHealthCheckNodePort] = "3001" + newSvc.Spec.Type = api.ServiceTypeLoadBalancer newSvc.Annotations[service.BetaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficGlobal - newSvc.Annotations[service.AlphaAnnotationHealthCheckNodePort] = oldSvc.Annotations[service.AlphaAnnotationHealthCheckNodePort] + newSvc.Annotations[service.BetaAnnotationHealthCheckNodePort] = oldSvc.Annotations[service.BetaAnnotationHealthCheckNodePort] + }, + numErrs: 0, + }, + { + name: "Service disallows promoting one of the onlyLocal pair to GA", + tweakSvc: func(oldSvc, newSvc *api.Service) { + oldSvc.Spec.Type = api.ServiceTypeLoadBalancer + oldSvc.Annotations[service.BetaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficLocal + oldSvc.Annotations[service.BetaAnnotationHealthCheckNodePort] = "3001" + newSvc.Spec.Type = api.ServiceTypeLoadBalancer + newSvc.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal + newSvc.Annotations[service.BetaAnnotationHealthCheckNodePort] = oldSvc.Annotations[service.BetaAnnotationHealthCheckNodePort] }, numErrs: 1, }, { - name: "Service allows changing both onlyLocal annotations from alpha to beta", + name: "Service allows changing both onlyLocal annotations from beta to GA", tweakSvc: func(oldSvc, newSvc *api.Service) { - oldSvc.Annotations[service.AlphaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficLocal - oldSvc.Annotations[service.AlphaAnnotationHealthCheckNodePort] = "3001" - newSvc.Annotations[service.BetaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficLocal - newSvc.Annotations[service.BetaAnnotationHealthCheckNodePort] = oldSvc.Annotations[service.AlphaAnnotationHealthCheckNodePort] + oldSvc.Spec.Type = api.ServiceTypeLoadBalancer + oldSvc.Annotations[service.BetaAnnotationExternalTraffic] = service.AnnotationValueExternalTrafficLocal + oldSvc.Annotations[service.BetaAnnotationHealthCheckNodePort] = "3001" + newSvc.Spec.Type = api.ServiceTypeLoadBalancer + newSvc.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal + newSvc.Spec.HealthCheckNodePort = 3001 }, numErrs: 0, }, diff --git a/pkg/cloudprovider/providers/azure/azure_test.go b/pkg/cloudprovider/providers/azure/azure_test.go index eb1ce13a09d..98e9eead48c 100644 --- a/pkg/cloudprovider/providers/azure/azure_test.go +++ b/pkg/cloudprovider/providers/azure/azure_test.go @@ -66,10 +66,8 @@ func TestReconcileLoadBalancerAddPort(t *testing.T) { func TestReconcileLoadBalancerNodeHealth(t *testing.T) { az := getTestCloud() svc := getTestService("servicea", v1.ProtocolTCP, 80) - svc.Annotations = map[string]string{ - serviceapi.BetaAnnotationExternalTraffic: serviceapi.AnnotationValueExternalTrafficLocal, - serviceapi.BetaAnnotationHealthCheckNodePort: "32456", - } + svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeLocal + svc.Spec.HealthCheckNodePort = int32(32456) configProperties := getTestPublicFipConfigurationProperties() lb := getTestLoadBalancer() diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer.go index 16006ee90a9..802af418f84 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer.go @@ -311,9 +311,9 @@ func (gce *GCECloud) EnsureLoadBalancer(clusterName string, apiService *v1.Servi } // Ensure health checks are created for this target pool to pass to createTargetPool for health check links - // Alternately, if the annotation on the service was removed, we need to recreate the target pool without - // health checks. This needs to be prior to the forwarding rule deletion below otherwise it is not possible - // to delete just the target pool or http health checks later. + // Alternately, if the service has ExternalTrafficPolicy field set from Local to Global, we need to recreate + // the target pool without health checks. This needs to be prior to the forwarding rule deletion below otherwise + // it is not possible to delete just the target pool or http health checks later. var hcToCreate *compute.HttpHealthCheck hcExisting, err := gce.GetHttpHealthCheck(loadBalancerName) if err != nil && !isHTTPErrorCode(err, http.StatusNotFound) { @@ -325,7 +325,7 @@ func (gce *GCECloud) EnsureLoadBalancer(clusterName string, apiService *v1.Servi // This logic exists to detect a transition for a pre-existing service and turn on // the tpNeedsUpdate flag to delete/recreate fwdrule/tpool adding the health check // to the target pool. - glog.V(2).Infof("Annotation external-traffic=OnlyLocal added to new or pre-existing service") + glog.V(2).Infof("ExternalTrafficPolicy field set to Local on new or pre-existing service") tpNeedsUpdate = true } hcToCreate, err = gce.ensureHttpHealthCheck(loadBalancerName, path, healthCheckNodePort) diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 2827af44424..44ca87f1842 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -98,7 +98,7 @@ func init() { // To add a new feature, define a key for it above and add it here. The features will be // available throughout Kubernetes binaries. var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureSpec{ - ExternalTrafficLocalOnly: {Default: true, PreRelease: utilfeature.Beta}, + ExternalTrafficLocalOnly: {Default: true, PreRelease: utilfeature.GA}, AppArmor: {Default: true, PreRelease: utilfeature.Beta}, DynamicKubeletConfig: {Default: false, PreRelease: utilfeature.Alpha}, DynamicVolumeProvisioning: {Default: true, PreRelease: utilfeature.Alpha}, diff --git a/pkg/proxy/iptables/proxier.go b/pkg/proxy/iptables/proxier.go index 2334f9863e3..b126b66ab49 100644 --- a/pkg/proxy/iptables/proxier.go +++ b/pkg/proxy/iptables/proxier.go @@ -1055,7 +1055,7 @@ func (proxier *Proxier) syncProxyRules() { svcXlbChain := serviceLBChainName(svcNameString, protocol) if svcInfo.onlyNodeLocalEndpoints { - // Only for services with the externalTraffic annotation set to OnlyLocal + // Only for services request OnlyLocal traffic // create the per-service LB chain, retaining counters if possible. if lbChain, ok := existingNATChains[svcXlbChain]; ok { writeLine(natChains, lbChain) @@ -1371,7 +1371,7 @@ func (proxier *Proxier) syncProxyRules() { continue } - // Now write ingress loadbalancing & DNAT rules only for services that have a localOnly annotation + // Now write ingress loadbalancing & DNAT rules only for services that request OnlyLocal traffic. // TODO - This logic may be combinable with the block above that creates the svc balancer chain localEndpoints := make([]*endpointsInfo, 0) localEndpointChains := make([]utiliptables.Chain, 0) diff --git a/pkg/registry/core/service/rest.go b/pkg/registry/core/service/rest.go index c8cdba60b83..66ccf7000cc 100644 --- a/pkg/registry/core/service/rest.go +++ b/pkg/registry/core/service/rest.go @@ -162,32 +162,16 @@ func (rs *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runti } } - if shouldCheckOrAssignHealthCheckNodePort(service) { - var healthCheckNodePort int - var err error - if l, ok := service.Annotations[apiservice.BetaAnnotationHealthCheckNodePort]; ok { - healthCheckNodePort, err = strconv.Atoi(l) - if err != nil || healthCheckNodePort <= 0 { - return nil, errors.NewInternalError(fmt.Errorf("Failed to parse annotation %v: %v", apiservice.BetaAnnotationHealthCheckNodePort, err)) + // Handle ExternalTraiffc related fields during service creation. + if utilfeature.DefaultFeatureGate.Enabled(features.ExternalTrafficLocalOnly) { + apiservice.SetDefaultExternalTrafficPolicyIfNeeded(service) + if apiservice.NeedsHealthCheck(service) { + if err := rs.allocateHealthCheckNodePort(service); err != nil { + return nil, errors.NewInternalError(err) } } - if healthCheckNodePort > 0 { - // If the request has a health check nodePort in mind, attempt to reserve it - err := nodePortOp.Allocate(int(healthCheckNodePort)) - if err != nil { - return nil, errors.NewInternalError(fmt.Errorf("Failed to allocate requested HealthCheck nodePort %v: %v", healthCheckNodePort, err)) - } - } else { - // If the request has no health check nodePort specified, allocate any - healthCheckNodePort, err = nodePortOp.AllocateNext() - if err != nil { - // TODO: what error should be returned here? It's not a - // field-level validation failure (the field is valid), and it's - // not really an internal error. - return nil, errors.NewInternalError(fmt.Errorf("failed to allocate a nodePort: %v", err)) - } - // Insert the newly allocated health check port as an annotation (plan of record for Alpha) - service.Annotations[apiservice.BetaAnnotationHealthCheckNodePort] = fmt.Sprintf("%d", healthCheckNodePort) + if errs := validation.ValidateServiceExternalTrafficFieldsCombination(service); len(errs) > 0 { + return nil, errors.NewInvalid(api.Kind("Service"), service.Name, errs) } } @@ -239,13 +223,14 @@ func (rs *REST) Delete(ctx genericapirequest.Context, id string) (runtime.Object } } - if shouldCheckOrAssignHealthCheckNodePort(service) { + if utilfeature.DefaultFeatureGate.Enabled(features.ExternalTrafficLocalOnly) && + apiservice.NeedsHealthCheck(service) { nodePort := apiservice.GetServiceHealthCheckNodePort(service) if nodePort > 0 { err := rs.serviceNodePorts.Release(int(nodePort)) if err != nil { // these should be caught by an eventual reconciliation / restart - utilruntime.HandleError(fmt.Errorf("Error releasing service health check %s node port %d: %v", service.Name, nodePort, err)) + utilruntime.HandleError(fmt.Errorf("Error releasing service %s health check node port %d: %v", service.Name, nodePort, err)) } } } @@ -280,92 +265,70 @@ func (*REST) NewList() runtime.Object { return &api.ServiceList{} } +// externalTrafficPolicyUpdate adjusts ExternalTrafficPolicy during service update if needed. +// It is necessary because we default ExternalTrafficPolicy field to different values. +// (NodePort / LoadBalancer: default is Global; Other types: default is empty.) +func externalTrafficPolicyUpdate(oldService, service *api.Service) { + var neededExternalTraffic, needsExternalTraffic bool + if oldService.Spec.Type == api.ServiceTypeNodePort || + oldService.Spec.Type == api.ServiceTypeLoadBalancer { + neededExternalTraffic = true + } + if service.Spec.Type == api.ServiceTypeNodePort || + service.Spec.Type == api.ServiceTypeLoadBalancer { + needsExternalTraffic = true + } + if neededExternalTraffic && !needsExternalTraffic { + // Clear ExternalTrafficPolicy to prevent confusion from ineffective field. + apiservice.ClearExternalTrafficPolicy(service) + } +} + +// healthCheckNodePortUpdate handles HealthCheckNodePort allocation/release +// and adjusts HealthCheckNodePort during service update if needed. func (rs *REST) healthCheckNodePortUpdate(oldService, service *api.Service) (bool, error) { - // Health Check Node Port handling during updates - // - // Case 1. Transition from globalTraffic to OnlyLocal for the ESIPP annotation - // - // Allocate a health check node port or attempt to reserve the user-specified one, if provided. - // Insert health check node port as an annotation into the service's annotations - // - // Case 2. Transition from OnlyLocal to Global for the ESIPP annotation - // - // Free the existing healthCheckNodePort and clear the health check nodePort annotation - // - // Case 3. No change (Global ---stays--> Global) but prevent invalid annotation manipulations - // - // Reject insertion of the "service.alpha.kubernetes.io/healthcheck-nodeport" annotation - // - // Case 4. No change (OnlyLocal ---stays--> OnlyLocal) but prevent invalid annotation manipulations - // - // Reject deletion of the "service.alpha.kubernetes.io/healthcheck-nodeport" annotation - // Reject changing the value of the healthCheckNodePort annotation - // - oldServiceHasHealthCheckNodePort := shouldCheckOrAssignHealthCheckNodePort(oldService) + neededHealthCheckNodePort := apiservice.NeedsHealthCheck(oldService) oldHealthCheckNodePort := apiservice.GetServiceHealthCheckNodePort(oldService) - assignHealthCheckNodePort := shouldCheckOrAssignHealthCheckNodePort(service) - requestedHealthCheckNodePort := apiservice.GetServiceHealthCheckNodePort(service) + needsHealthCheckNodePort := apiservice.NeedsHealthCheck(service) + newHealthCheckNodePort := apiservice.GetServiceHealthCheckNodePort(service) switch { - case !oldServiceHasHealthCheckNodePort && assignHealthCheckNodePort: - glog.Infof("Transition from Global LB service to OnlyLocal service") - if requestedHealthCheckNodePort > 0 { - // If the request has a health check nodePort in mind, attempt to reserve it - err := rs.serviceNodePorts.Allocate(int(requestedHealthCheckNodePort)) - if err != nil { - errmsg := fmt.Sprintf("Failed to allocate requested HealthCheck nodePort %v:%v", - requestedHealthCheckNodePort, err) - el := field.ErrorList{field.Invalid(field.NewPath("metadata", "annotations"), - apiservice.BetaAnnotationHealthCheckNodePort, errmsg)} - return false, errors.NewInvalid(api.Kind("Service"), service.Name, el) - } - glog.Infof("Reserved user requested nodePort: %d", requestedHealthCheckNodePort) - } else { - // If the request has no health check nodePort specified, allocate any - healthCheckNodePort, err := rs.serviceNodePorts.AllocateNext() - if err != nil { - // TODO: what error should be returned here? It's not a - // field-level validation failure (the field is valid), and it's - // not really an internal error. - return false, errors.NewInternalError(fmt.Errorf("failed to allocate a nodePort: %v", err)) - } - // Insert the newly allocated health check port as an annotation (plan of record for Alpha) - service.Annotations[apiservice.BetaAnnotationHealthCheckNodePort] = fmt.Sprintf("%d", healthCheckNodePort) - glog.Infof("Reserved health check nodePort: %d", healthCheckNodePort) + // Case 1: Transition from don't need HealthCheckNodePort to needs HealthCheckNodePort. + // Allocate a health check node port or attempt to reserve the user-specified one if provided. + // Insert health check node port into the service's HealthCheckNodePort field if needed. + case !neededHealthCheckNodePort && needsHealthCheckNodePort: + glog.Infof("Transition to LoadBalancer type service with ExternalTrafficPolicy=Local") + if err := rs.allocateHealthCheckNodePort(service); err != nil { + return false, errors.NewInternalError(err) } - case oldServiceHasHealthCheckNodePort && !assignHealthCheckNodePort: - glog.Infof("Transition from OnlyLocal LB service to Global service") + // Case 2: Transition from needs HealthCheckNodePort to don't need HealthCheckNodePort. + // Free the existing healthCheckNodePort and clear the HealthCheckNodePort field. + case neededHealthCheckNodePort && !needsHealthCheckNodePort: + glog.Infof("Transition to non LoadBalancer type service or LoadBalancer type service with ExternalTrafficPolicy=Global") err := rs.serviceNodePorts.Release(int(oldHealthCheckNodePort)) if err != nil { - glog.Warningf("Error releasing service health check %s node port %d: %v", service.Name, oldHealthCheckNodePort, err) + glog.Warningf("error releasing service health check %s node port %d: %v", service.Name, oldHealthCheckNodePort, err) return false, errors.NewInternalError(fmt.Errorf("failed to free health check nodePort: %v", err)) - } else { - delete(service.Annotations, apiservice.BetaAnnotationHealthCheckNodePort) - delete(service.Annotations, apiservice.AlphaAnnotationHealthCheckNodePort) - glog.Infof("Freed health check nodePort: %d", oldHealthCheckNodePort) } + glog.Infof("Freed health check nodePort: %d", oldHealthCheckNodePort) + // Clear the HealthCheckNodePort field. + apiservice.SetServiceHealthCheckNodePort(service, 0) - case !oldServiceHasHealthCheckNodePort && !assignHealthCheckNodePort: - if _, ok := service.Annotations[apiservice.BetaAnnotationHealthCheckNodePort]; ok { - glog.Warningf("Attempt to insert health check node port annotation DENIED") - el := field.ErrorList{field.Invalid(field.NewPath("metadata", "annotations"), - apiservice.BetaAnnotationHealthCheckNodePort, "Cannot insert healthcheck nodePort annotation")} - return false, errors.NewInvalid(api.Kind("Service"), service.Name, el) - } - - case oldServiceHasHealthCheckNodePort && assignHealthCheckNodePort: - if _, ok := service.Annotations[apiservice.BetaAnnotationHealthCheckNodePort]; !ok { - glog.Warningf("Attempt to delete health check node port annotation DENIED") - el := field.ErrorList{field.Invalid(field.NewPath("metadata", "annotations"), - apiservice.BetaAnnotationHealthCheckNodePort, "Cannot delete healthcheck nodePort annotation")} - return false, errors.NewInvalid(api.Kind("Service"), service.Name, el) - } - if oldHealthCheckNodePort != requestedHealthCheckNodePort { - glog.Warningf("Attempt to change value of health check node port annotation DENIED") - el := field.ErrorList{field.Invalid(field.NewPath("metadata", "annotations"), - apiservice.BetaAnnotationHealthCheckNodePort, "Cannot change healthcheck nodePort during update")} + // Case 3: Remain in needs HealthCheckNodePort. + // Reject changing the value of the HealthCheckNodePort field. + case neededHealthCheckNodePort && needsHealthCheckNodePort: + if oldHealthCheckNodePort != newHealthCheckNodePort { + glog.Warningf("Attempt to change value of health check node port DENIED") + var fldPath *field.Path + if _, ok := service.Annotations[apiservice.BetaAnnotationHealthCheckNodePort]; ok { + fldPath = field.NewPath("metadata", "annotations").Key(apiservice.BetaAnnotationHealthCheckNodePort) + } else { + fldPath = field.NewPath("spec", "healthCheckNodePort") + } + el := field.ErrorList{field.Invalid(fldPath, newHealthCheckNodePort, + "cannot change healthCheckNodePort on loadBalancer service with externalTraffic=Local during update")} return false, errors.NewInvalid(api.Kind("Service"), service.Name, el) } } @@ -449,9 +412,17 @@ func (rs *REST) Update(ctx genericapirequest.Context, name string, objInfo rest. service.Status.LoadBalancer = api.LoadBalancerStatus{} } - success, err := rs.healthCheckNodePortUpdate(oldService, service) - if !success { - return nil, false, err + // Handle ExternalTraiffc related updates. + if utilfeature.DefaultFeatureGate.Enabled(features.ExternalTrafficLocalOnly) { + apiservice.SetDefaultExternalTrafficPolicyIfNeeded(service) + success, err := rs.healthCheckNodePortUpdate(oldService, service) + if !success || err != nil { + return nil, false, err + } + externalTrafficPolicyUpdate(oldService, service) + if errs := validation.ValidateServiceExternalTrafficFieldsCombination(service); len(errs) > 0 { + return nil, false, errors.NewInvalid(api.Kind("Service"), service.Name, errs) + } } out, err := rs.registry.UpdateService(ctx, service) @@ -566,10 +537,6 @@ func shouldAssignNodePorts(service *api.Service) bool { } } -func shouldCheckOrAssignHealthCheckNodePort(service *api.Service) bool { - return (utilfeature.DefaultFeatureGate.Enabled(features.ExternalTrafficLocalOnly) && apiservice.NeedsHealthCheck(service)) -} - // Loop through the service ports list, find one with the same port number and // NodePort specified, return this NodePort otherwise return 0. func findRequestedNodePort(port int, servicePorts []api.ServicePort) int { @@ -581,3 +548,26 @@ func findRequestedNodePort(port int, servicePorts []api.ServicePort) int { } return 0 } + +// allocateHealthCheckNodePort allocates health check node port to service. +func (rs *REST) allocateHealthCheckNodePort(service *api.Service) error { + healthCheckNodePort := apiservice.GetServiceHealthCheckNodePort(service) + if healthCheckNodePort != 0 { + // If the request has a health check nodePort in mind, attempt to reserve it. + err := rs.serviceNodePorts.Allocate(int(healthCheckNodePort)) + if err != nil { + return fmt.Errorf("failed to allocate requested HealthCheck NodePort %v: %v", + service.Spec.HealthCheckNodePort, err) + } + glog.Infof("Reserved user requested nodePort: %d", service.Spec.HealthCheckNodePort) + } else { + // If the request has no health check nodePort specified, allocate any. + healthCheckNodePort, err := rs.serviceNodePorts.AllocateNext() + if err != nil { + return fmt.Errorf("failed to allocate a HealthCheck NodePort %v: %v", healthCheckNodePort, err) + } + apiservice.SetServiceHealthCheckNodePort(service, int32(healthCheckNodePort)) + glog.Infof("Reserved allocated nodePort: %d", healthCheckNodePort) + } + return nil +} diff --git a/pkg/registry/core/service/rest_test.go b/pkg/registry/core/service/rest_test.go index de1c993efc7..d7f7815297e 100644 --- a/pkg/registry/core/service/rest_test.go +++ b/pkg/registry/core/service/rest_test.go @@ -959,13 +959,48 @@ func TestUpdateServiceWithConflictingNamespace(t *testing.T) { } } -// Validate allocation of a nodePort when the externalTraffic=OnlyLocal annotation is set -// and type is LoadBalancer -func TestServiceRegistryExternalTrafficAnnotationHealthCheckNodePortAllocation(t *testing.T) { +// Validate allocation of a nodePort when ExternalTrafficPolicy is set to Local +// and type is LoadBalancer. +func TestServiceRegistryExternalTrafficHealthCheckNodePortAllocation(t *testing.T) { ctx := genericapirequest.NewDefaultContext() storage, _ := NewTestREST(t, nil) svc := &api.Service{ - ObjectMeta: metav1.ObjectMeta{Name: "external-lb-esipp", + ObjectMeta: metav1.ObjectMeta{Name: "external-lb-esipp"}, + Spec: api.ServiceSpec{ + Selector: map[string]string{"bar": "baz"}, + SessionAffinity: api.ServiceAffinityNone, + Type: api.ServiceTypeLoadBalancer, + Ports: []api.ServicePort{{ + Port: 6502, + Protocol: api.ProtocolTCP, + TargetPort: intstr.FromInt(6502), + }}, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeLocal, + }, + } + created_svc, err := storage.Create(ctx, svc) + if created_svc == nil || err != nil { + t.Errorf("Unexpected failure creating service %v", err) + } + created_service := created_svc.(*api.Service) + if !service.NeedsHealthCheck(created_service) { + t.Errorf("Expecting health check needed, returned health check not needed instead") + } + port := service.GetServiceHealthCheckNodePort(created_service) + if port == 0 { + t.Errorf("Failed to allocate health check node port and set the HealthCheckNodePort") + } + +} + +// Validate allocation of a nodePort when ExternalTraffic beta annotation is set to OnlyLocal +// and type is LoadBalancer. +func TestServiceRegistryExternalTrafficHealthCheckNodePortAllocationBeta(t *testing.T) { + ctx := genericapirequest.NewDefaultContext() + storage, _ := NewTestREST(t, nil) + svc := &api.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "external-lb-esipp", Annotations: map[string]string{ service.BetaAnnotationExternalTraffic: service.AnnotationValueExternalTrafficLocal, }, @@ -987,22 +1022,60 @@ func TestServiceRegistryExternalTrafficAnnotationHealthCheckNodePortAllocation(t } created_service := created_svc.(*api.Service) if !service.NeedsHealthCheck(created_service) { - t.Errorf("Unexpected missing annotation %s", service.BetaAnnotationExternalTraffic) + t.Errorf("Expecting health check needed, returned health check not needed instead") } port := service.GetServiceHealthCheckNodePort(created_service) if port == 0 { - t.Errorf("Failed to allocate and create the health check node port annotation %s", service.BetaAnnotationHealthCheckNodePort) + t.Errorf("Failed to allocate health check node port and set the HealthCheckNodePort") } } -// Validate using the user specified nodePort when the externalTraffic=OnlyLocal annotation is set -// and type is LoadBalancer -func TestServiceRegistryExternalTrafficBetaAnnotationHealthCheckNodePortUserAllocation(t *testing.T) { +// Validate using the user specified nodePort when ExternalTrafficPolicy is set to Local +// and type is LoadBalancer. +func TestServiceRegistryExternalTrafficHealthCheckNodePortUserAllocation(t *testing.T) { ctx := genericapirequest.NewDefaultContext() storage, _ := NewTestREST(t, nil) svc := &api.Service{ - ObjectMeta: metav1.ObjectMeta{Name: "external-lb-esipp", + ObjectMeta: metav1.ObjectMeta{Name: "external-lb-esipp"}, + Spec: api.ServiceSpec{ + Selector: map[string]string{"bar": "baz"}, + SessionAffinity: api.ServiceAffinityNone, + Type: api.ServiceTypeLoadBalancer, + Ports: []api.ServicePort{{ + Port: 6502, + Protocol: api.ProtocolTCP, + TargetPort: intstr.FromInt(6502), + }}, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeLocal, + HealthCheckNodePort: int32(30200), + }, + } + created_svc, err := storage.Create(ctx, svc) + if created_svc == nil || err != nil { + t.Fatalf("Unexpected failure creating service :%v", err) + } + created_service := created_svc.(*api.Service) + if !service.NeedsHealthCheck(created_service) { + t.Errorf("Expecting health check needed, returned health check not needed instead") + } + port := service.GetServiceHealthCheckNodePort(created_service) + if port == 0 { + t.Errorf("Failed to allocate health check node port and set the HealthCheckNodePort") + } + if port != 30200 { + t.Errorf("Failed to allocate requested nodePort expected 30200, got %d", port) + } +} + +// Validate using the user specified nodePort when ExternalTraffic beta annotation is set to OnlyLocal +// and type is LoadBalancer. +func TestServiceRegistryExternalTrafficHealthCheckNodePortUserAllocationBeta(t *testing.T) { + ctx := genericapirequest.NewDefaultContext() + storage, _ := NewTestREST(t, nil) + svc := &api.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "external-lb-esipp", Annotations: map[string]string{ service.BetaAnnotationExternalTraffic: service.AnnotationValueExternalTrafficLocal, service.BetaAnnotationHealthCheckNodePort: "30200", @@ -1021,27 +1094,54 @@ func TestServiceRegistryExternalTrafficBetaAnnotationHealthCheckNodePortUserAllo } created_svc, err := storage.Create(ctx, svc) if created_svc == nil || err != nil { - t.Fatalf("Unexpected failure creating service: %v", err) + t.Fatalf("Unexpected failure creating service :%v", err) } created_service := created_svc.(*api.Service) if !service.NeedsHealthCheck(created_service) { - t.Errorf("Unexpected missing annotation %s", service.BetaAnnotationExternalTraffic) + t.Errorf("Expecting health check needed, returned health check not needed instead") } port := service.GetServiceHealthCheckNodePort(created_service) if port == 0 { - t.Errorf("Failed to allocate and create the health check node port annotation %s", service.BetaAnnotationHealthCheckNodePort) + t.Errorf("Failed to allocate health check node port and set the HealthCheckNodePort") } if port != 30200 { t.Errorf("Failed to allocate requested nodePort expected 30200, got %d", port) } } -// Validate that the service creation fails when the requested port number is -1 -func TestServiceRegistryExternalTrafficAnnotationNegative(t *testing.T) { +// Validate that the service creation fails when the requested port number is -1. +func TestServiceRegistryExternalTrafficHealthCheckNodePortNegative(t *testing.T) { ctx := genericapirequest.NewDefaultContext() storage, _ := NewTestREST(t, nil) svc := &api.Service{ - ObjectMeta: metav1.ObjectMeta{Name: "external-lb-esipp", + ObjectMeta: metav1.ObjectMeta{Name: "external-lb-esipp"}, + Spec: api.ServiceSpec{ + Selector: map[string]string{"bar": "baz"}, + SessionAffinity: api.ServiceAffinityNone, + Type: api.ServiceTypeLoadBalancer, + Ports: []api.ServicePort{{ + Port: 6502, + Protocol: api.ProtocolTCP, + TargetPort: intstr.FromInt(6502), + }}, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeLocal, + HealthCheckNodePort: int32(-1), + }, + } + created_svc, err := storage.Create(ctx, svc) + if created_svc == nil || err != nil { + return + } + t.Errorf("Unexpected creation of service with invalid HealthCheckNodePort specified") +} + +// Validate that the service creation fails when the requested port number in beta annotation is -1. +func TestServiceRegistryExternalTrafficHealthCheckNodePortNegativeBeta(t *testing.T) { + ctx := genericapirequest.NewDefaultContext() + storage, _ := NewTestREST(t, nil) + svc := &api.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "external-lb-esipp", Annotations: map[string]string{ service.BetaAnnotationExternalTraffic: service.AnnotationValueExternalTrafficLocal, service.BetaAnnotationHealthCheckNodePort: "-1", @@ -1062,15 +1162,49 @@ func TestServiceRegistryExternalTrafficAnnotationNegative(t *testing.T) { if created_svc == nil || err != nil { return } - t.Errorf("Unexpected creation of service with invalid healthCheckNodePort specified") + t.Errorf("Unexpected creation of service with invalid HealthCheckNodePort specified") } -// Validate that the health check nodePort is not allocated when the externalTraffic annotation is !"OnlyLocal" -func TestServiceRegistryExternalTrafficAnnotationGlobal(t *testing.T) { +// Validate that the health check nodePort is not allocated when ExternalTrafficPolicy is set to Global. +func TestServiceRegistryExternalTrafficGlobal(t *testing.T) { ctx := genericapirequest.NewDefaultContext() storage, _ := NewTestREST(t, nil) svc := &api.Service{ - ObjectMeta: metav1.ObjectMeta{Name: "external-lb-esipp", + ObjectMeta: metav1.ObjectMeta{Name: "external-lb-esipp"}, + Spec: api.ServiceSpec{ + Selector: map[string]string{"bar": "baz"}, + SessionAffinity: api.ServiceAffinityNone, + Type: api.ServiceTypeLoadBalancer, + Ports: []api.ServicePort{{ + Port: 6502, + Protocol: api.ProtocolTCP, + TargetPort: intstr.FromInt(6502), + }}, + ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeGlobal, + }, + } + created_svc, err := storage.Create(ctx, svc) + if created_svc == nil || err != nil { + t.Errorf("Unexpected failure creating service %v", err) + } + created_service := created_svc.(*api.Service) + if service.NeedsHealthCheck(created_service) { + t.Errorf("Expecting health check not needed, returned health check needed instead") + } + // Make sure the service does not have the health check node port allocated + port := service.GetServiceHealthCheckNodePort(created_service) + if port != 0 { + t.Errorf("Unexpected allocation of health check node port: %v", port) + } +} + +// Validate that the health check nodePort is not allocated when ExternalTraffic beta annotation is set to Global. +func TestServiceRegistryExternalTrafficGlobalBeta(t *testing.T) { + ctx := genericapirequest.NewDefaultContext() + storage, _ := NewTestREST(t, nil) + svc := &api.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "external-lb-esipp", Annotations: map[string]string{ service.BetaAnnotationExternalTraffic: service.AnnotationValueExternalTrafficGlobal, }, @@ -1091,14 +1225,47 @@ func TestServiceRegistryExternalTrafficAnnotationGlobal(t *testing.T) { t.Errorf("Unexpected failure creating service %v", err) } created_service := created_svc.(*api.Service) - // Make sure the service does not have the annotation if service.NeedsHealthCheck(created_service) { - t.Errorf("Unexpected value for annotation %s", service.BetaAnnotationExternalTraffic) + t.Errorf("Expecting health check not needed, returned health check needed instead") } // Make sure the service does not have the health check node port allocated port := service.GetServiceHealthCheckNodePort(created_service) if port != 0 { - t.Errorf("Unexpected allocation of health check node port annotation %s", service.BetaAnnotationHealthCheckNodePort) + t.Errorf("Unexpected allocation of health check node port: %v", port) + } +} + +// Validate that ExternalTraffic is default to Global for loadBalancer service. +func TestServiceRegistryExternalTrafficDefaultGlobal(t *testing.T) { + ctx := genericapirequest.NewDefaultContext() + storage, _ := NewTestREST(t, nil) + svc := &api.Service{ + ObjectMeta: metav1.ObjectMeta{Name: "external-lb-esipp"}, + Spec: api.ServiceSpec{ + Selector: map[string]string{"bar": "baz"}, + SessionAffinity: api.ServiceAffinityNone, + Type: api.ServiceTypeLoadBalancer, + Ports: []api.ServicePort{{ + Port: 6502, + Protocol: api.ProtocolTCP, + TargetPort: intstr.FromInt(6502), + }}, + }, + } + created_svc, err := storage.Create(ctx, svc) + if created_svc == nil || err != nil { + t.Errorf("Unexpected failure creating service %v", err) + } + created_service := created_svc.(*api.Service) + if service.NeedsHealthCheck(created_service) { + t.Errorf("Expecting health check not needed, returned health check needed instead") + } + // Make sure the service does not have the health check node port allocated + if port := service.GetServiceHealthCheckNodePort(created_service); port != 0 { + t.Errorf("Unexpected allocation of health check node port: %v", port) + } + if created_service.Spec.ExternalTrafficPolicy != api.ServiceExternalTrafficPolicyTypeGlobal { + t.Errorf("Expecting externalTraffic to be %v, got:%v", api.ServiceExternalTrafficPolicyTypeGlobal, created_service.Spec.ExternalTrafficPolicy) } } diff --git a/staging/src/k8s.io/client-go/pkg/api/types.go b/staging/src/k8s.io/client-go/pkg/api/types.go index 9d0ab25f521..2345673da3d 100644 --- a/staging/src/k8s.io/client-go/pkg/api/types.go +++ b/staging/src/k8s.io/client-go/pkg/api/types.go @@ -2453,6 +2453,16 @@ const ( ServiceTypeExternalName ServiceType = "ExternalName" ) +// Service External Traffic Policy Type string +type ServiceExternalTrafficPolicyType string + +const ( + // ServiceExternalTrafficPolicyTypeLocal specifies local endpoints behavior. + ServiceExternalTrafficPolicyTypeLocal ServiceExternalTrafficPolicyType = "Local" + // ServiceExternalTrafficPolicyTypeGlobal specifies global (legacy) behavior. + ServiceExternalTrafficPolicyTypeGlobal ServiceExternalTrafficPolicyType = "Global" +) + // ServiceStatus represents the current status of a service type ServiceStatus struct { // LoadBalancer contains the current status of the load-balancer, @@ -2552,6 +2562,20 @@ type ServiceSpec struct { // cloud-provider does not support the feature." // +optional LoadBalancerSourceRanges []string + + // externalTrafficPolicy denotes if this Service desires to route external traffic to + // local endpoints only. This preserves Source IP and avoids a second hop for + // LoadBalancer and Nodeport type services. + // +optional + ExternalTrafficPolicy ServiceExternalTrafficPolicyType + + // healthCheckNodePort specifies the healthcheck nodePort for the service. + // If not specified, HealthCheckNodePort is created by the service api + // backend with the allocated nodePort. Will use user-specified nodePort value + // if specified by the client. Only effects when Type is set to LoadBalancer + // and ExternalTrafficPolicy is set to Local. + // +optional + HealthCheckNodePort int32 } type ServicePort struct { diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/generated.pb.go b/staging/src/k8s.io/client-go/pkg/api/v1/generated.pb.go index b52d86d3fd8..29eab86ba0e 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/generated.pb.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/generated.pb.go @@ -8490,6 +8490,13 @@ func (m *ServiceSpec) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.ExternalName))) i += copy(dAtA[i:], m.ExternalName) + dAtA[i] = 0x5a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ExternalTrafficPolicy))) + i += copy(dAtA[i:], m.ExternalTrafficPolicy) + dAtA[i] = 0x60 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.HealthCheckNodePort)) return i, nil } @@ -11866,6 +11873,9 @@ func (m *ServiceSpec) Size() (n int) { } l = len(m.ExternalName) n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ExternalTrafficPolicy) + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.HealthCheckNodePort)) return n } @@ -14336,6 +14346,8 @@ func (this *ServiceSpec) String() string { `LoadBalancerIP:` + fmt.Sprintf("%v", this.LoadBalancerIP) + `,`, `LoadBalancerSourceRanges:` + fmt.Sprintf("%v", this.LoadBalancerSourceRanges) + `,`, `ExternalName:` + fmt.Sprintf("%v", this.ExternalName) + `,`, + `ExternalTrafficPolicy:` + fmt.Sprintf("%v", this.ExternalTrafficPolicy) + `,`, + `HealthCheckNodePort:` + fmt.Sprintf("%v", this.HealthCheckNodePort) + `,`, `}`, }, "") return s @@ -40836,6 +40848,54 @@ func (m *ServiceSpec) Unmarshal(dAtA []byte) error { } m.ExternalName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExternalTrafficPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExternalTrafficPolicy = ServiceExternalTrafficPolicyType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HealthCheckNodePort", wireType) + } + m.HealthCheckNodePort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.HealthCheckNodePort |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -43147,605 +43207,605 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 11175 bytes of a gzipped FileDescriptorProto + // 11238 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x8c, 0x24, 0xc7, 0x75, 0x98, 0x7a, 0x66, 0xbf, 0xe6, 0xed, 0xe7, 0xd5, 0xed, 0x1d, 0x97, 0x2b, 0xf2, 0xf6, 0xd8, 0x14, 0xe9, 0x23, 0x79, 0xdc, 0xd5, 0x1d, 0x49, 0xf1, 0x24, 0x2a, 0xb4, 0x76, 0x77, 0x76, 0xef, 0x56, 0xf7, 0x35, 0xac, 0xd9, 0xbb, 0xa3, 0x28, 0x46, 0x64, 0xdf, 0x74, 0xed, 0x6c, 0xf3, 0x7a, - 0xbb, 0x87, 0xdd, 0x3d, 0x7b, 0xb7, 0x52, 0x04, 0xd8, 0x8a, 0x20, 0x25, 0x80, 0x92, 0xc8, 0x70, - 0x04, 0x04, 0x4e, 0x00, 0x05, 0x06, 0xe2, 0x28, 0x9f, 0x8e, 0x22, 0xe8, 0xc3, 0xb0, 0x9c, 0x0f, - 0x27, 0x72, 0x64, 0x20, 0x71, 0x0c, 0x18, 0xb1, 0x1d, 0x18, 0x59, 0x5b, 0x2b, 0xc4, 0x3f, 0x02, - 0x24, 0x08, 0xe2, 0x7f, 0x9b, 0x20, 0x08, 0xea, 0xb3, 0xab, 0x7a, 0x66, 0xb6, 0x7b, 0x96, 0xb7, - 0x6b, 0x4a, 0xc8, 0xbf, 0x99, 0x7a, 0xaf, 0x5e, 0x7d, 0x74, 0xd5, 0xab, 0xf7, 0x5e, 0xbd, 0xf7, - 0x0a, 0xce, 0xdf, 0xbb, 0x14, 0xcf, 0x7b, 0xe1, 0xc2, 0xbd, 0xf6, 0x5d, 0x12, 0x05, 0x24, 0x21, - 0xf1, 0x42, 0xeb, 0x5e, 0x73, 0xc1, 0x69, 0x79, 0x0b, 0xdb, 0x17, 0x16, 0x9a, 0x24, 0x20, 0x91, - 0x93, 0x10, 0x77, 0xbe, 0x15, 0x85, 0x49, 0x88, 0x1e, 0xe3, 0xd8, 0xf3, 0x29, 0xf6, 0x7c, 0xeb, - 0x5e, 0x73, 0xde, 0x69, 0x79, 0xf3, 0xdb, 0x17, 0x66, 0x9f, 0x6f, 0x7a, 0xc9, 0x66, 0xfb, 0xee, - 0x7c, 0x23, 0xdc, 0x5a, 0x68, 0x86, 0xcd, 0x70, 0x81, 0x55, 0xba, 0xdb, 0xde, 0x60, 0xff, 0xd8, - 0x1f, 0xf6, 0x8b, 0x13, 0x9b, 0x7d, 0x51, 0x34, 0xed, 0xb4, 0xbc, 0x2d, 0xa7, 0xb1, 0xe9, 0x05, - 0x24, 0xda, 0x51, 0x8d, 0x47, 0x24, 0x0e, 0xdb, 0x51, 0x83, 0x64, 0xbb, 0x70, 0x60, 0xad, 0x78, - 0x61, 0x8b, 0x24, 0x4e, 0x97, 0x8e, 0xcf, 0x2e, 0xf4, 0xaa, 0x15, 0xb5, 0x83, 0xc4, 0xdb, 0xea, - 0x6c, 0xe6, 0x23, 0x79, 0x15, 0xe2, 0xc6, 0x26, 0xd9, 0x72, 0x3a, 0xea, 0xbd, 0xd0, 0xab, 0x5e, - 0x3b, 0xf1, 0xfc, 0x05, 0x2f, 0x48, 0xe2, 0x24, 0x3a, 0x68, 0x4c, 0x31, 0x89, 0xb6, 0x49, 0x94, - 0x0e, 0x88, 0x3c, 0x70, 0xb6, 0x5a, 0x3e, 0xe9, 0x36, 0xa6, 0x2b, 0xda, 0xa7, 0x7b, 0xde, 0x69, - 0x36, 0x23, 0xd2, 0x74, 0x92, 0x50, 0xab, 0xeb, 0xb4, 0xbc, 0x88, 0x34, 0xbd, 0x38, 0x89, 0x9c, - 0xc4, 0x0b, 0x83, 0x85, 0xed, 0x0b, 0x8e, 0xdf, 0xda, 0x74, 0x3a, 0x28, 0xd9, 0x7f, 0x60, 0xc1, - 0xd9, 0xc5, 0x3b, 0xf5, 0x15, 0xdf, 0x89, 0x13, 0xaf, 0xb1, 0xe4, 0x87, 0x8d, 0x7b, 0xf5, 0x24, - 0x8c, 0xc8, 0xed, 0xd0, 0x6f, 0x6f, 0x91, 0x3a, 0xfb, 0x10, 0xe8, 0x3c, 0x8c, 0x6c, 0xb3, 0xff, - 0x6b, 0xd5, 0x19, 0xeb, 0xac, 0x75, 0xae, 0xb2, 0x34, 0xf5, 0xc3, 0xdd, 0xb9, 0x0f, 0xec, 0xed, - 0xce, 0x8d, 0xdc, 0x16, 0xe5, 0x58, 0x61, 0xa0, 0xa7, 0x61, 0x68, 0x23, 0x5e, 0xdf, 0x69, 0x91, - 0x99, 0x12, 0xc3, 0x9d, 0x10, 0xb8, 0x43, 0xab, 0x75, 0x5a, 0x8a, 0x05, 0x14, 0x2d, 0x40, 0xa5, - 0xe5, 0x44, 0x89, 0x47, 0x3b, 0x38, 0x53, 0x3e, 0x6b, 0x9d, 0x1b, 0x5c, 0x3a, 0x21, 0x50, 0x2b, - 0x35, 0x09, 0xc0, 0x29, 0x0e, 0xed, 0x46, 0x44, 0x1c, 0xf7, 0x66, 0xe0, 0xef, 0xcc, 0x0c, 0x9c, - 0xb5, 0xce, 0x8d, 0xa4, 0xdd, 0xc0, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, 0x7b, 0x25, 0x18, 0x59, 0xdc, - 0xd8, 0xf0, 0x02, 0x2f, 0xd9, 0x41, 0x6f, 0xc3, 0x58, 0x10, 0xba, 0x44, 0xfe, 0x67, 0xa3, 0x18, - 0xbd, 0xf8, 0xec, 0xfc, 0x41, 0x8b, 0x7a, 0xfe, 0x86, 0x56, 0x63, 0x69, 0x6a, 0x6f, 0x77, 0x6e, - 0x4c, 0x2f, 0xc1, 0x06, 0x45, 0xf4, 0x26, 0x8c, 0xb6, 0x42, 0x57, 0x35, 0x50, 0x62, 0x0d, 0x3c, - 0x73, 0x70, 0x03, 0xb5, 0xb4, 0xc2, 0xd2, 0xe4, 0xde, 0xee, 0xdc, 0xa8, 0x56, 0x80, 0x75, 0x72, - 0xc8, 0x87, 0x49, 0xfa, 0x37, 0x48, 0x3c, 0xd5, 0x42, 0x99, 0xb5, 0xf0, 0x7c, 0x7e, 0x0b, 0x5a, - 0xa5, 0xa5, 0x93, 0x7b, 0xbb, 0x73, 0x93, 0x99, 0x42, 0x9c, 0x25, 0x6d, 0x7f, 0x16, 0x26, 0x16, - 0x93, 0xc4, 0x69, 0x6c, 0x12, 0x97, 0x7f, 0x5f, 0xf4, 0x22, 0x0c, 0x04, 0xce, 0x16, 0x11, 0x5f, - 0xff, 0xac, 0x98, 0xf6, 0x81, 0x1b, 0xce, 0x16, 0xd9, 0xdf, 0x9d, 0x9b, 0xba, 0x15, 0x78, 0xef, - 0xb6, 0xc5, 0x9a, 0xa1, 0x65, 0x98, 0x61, 0xa3, 0x8b, 0x00, 0x2e, 0xd9, 0xf6, 0x1a, 0xa4, 0xe6, - 0x24, 0x9b, 0x62, 0x35, 0x20, 0x51, 0x17, 0xaa, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x0b, 0x16, 0x54, - 0x16, 0xb7, 0x43, 0xcf, 0xad, 0x85, 0x6e, 0x8c, 0xda, 0x30, 0xd9, 0x8a, 0xc8, 0x06, 0x89, 0x54, - 0xd1, 0x8c, 0x75, 0xb6, 0x7c, 0x6e, 0xf4, 0xe2, 0xc5, 0x9c, 0x71, 0x9b, 0x95, 0x56, 0x82, 0x24, - 0xda, 0x59, 0x7a, 0x44, 0x34, 0x3d, 0x99, 0x81, 0xe2, 0x6c, 0x1b, 0xf6, 0x2f, 0x94, 0xe0, 0xd4, - 0xe2, 0x67, 0xdb, 0x11, 0xa9, 0x7a, 0xf1, 0xbd, 0xec, 0x56, 0x70, 0xbd, 0xf8, 0xde, 0x8d, 0x74, - 0x32, 0xd4, 0x1a, 0xac, 0x8a, 0x72, 0xac, 0x30, 0xd0, 0xf3, 0x30, 0x4c, 0x7f, 0xdf, 0xc2, 0x6b, - 0x62, 0xf4, 0x27, 0x05, 0xf2, 0x68, 0xd5, 0x49, 0x9c, 0x2a, 0x07, 0x61, 0x89, 0x83, 0xae, 0xc3, - 0x68, 0x83, 0x71, 0x8e, 0xe6, 0xf5, 0xd0, 0x25, 0xec, 0x0b, 0x57, 0x96, 0x9e, 0xa3, 0xe8, 0xcb, - 0x69, 0xf1, 0xfe, 0xee, 0xdc, 0x0c, 0xef, 0x9b, 0x20, 0xa1, 0xc1, 0xb0, 0x5e, 0x1f, 0xd9, 0x6a, - 0x23, 0x0e, 0x30, 0x4a, 0xd0, 0x65, 0x13, 0x9e, 0xd3, 0xf6, 0xd4, 0x20, 0xdb, 0x53, 0x63, 0x3d, - 0xf6, 0xd3, 0x3f, 0xb4, 0xc4, 0x9c, 0xac, 0x7a, 0xbe, 0xc9, 0x1e, 0x2e, 0x02, 0xc4, 0xa4, 0x11, - 0x91, 0x44, 0x9b, 0x15, 0xf5, 0x99, 0xeb, 0x0a, 0x82, 0x35, 0x2c, 0xba, 0xf9, 0xe3, 0x4d, 0x27, - 0x62, 0xab, 0x45, 0xcc, 0x8d, 0xda, 0xfc, 0x75, 0x09, 0xc0, 0x29, 0x8e, 0xb1, 0xf9, 0xcb, 0xb9, - 0x9b, 0xff, 0x37, 0x2d, 0x18, 0x5e, 0xf2, 0x02, 0xd7, 0x0b, 0x9a, 0xe8, 0x6d, 0x18, 0xa1, 0x67, - 0x83, 0xeb, 0x24, 0x8e, 0xd8, 0xf7, 0x1f, 0x96, 0x8b, 0x47, 0x67, 0xd5, 0x72, 0xf9, 0xc4, 0xf3, - 0x14, 0x9b, 0x2e, 0xa2, 0x9b, 0x77, 0xdf, 0x21, 0x8d, 0xe4, 0x3a, 0x49, 0x9c, 0x74, 0x38, 0x69, - 0x19, 0x56, 0x54, 0xd1, 0x2d, 0x18, 0x4a, 0x9c, 0xa8, 0x49, 0x12, 0xb1, 0xed, 0x73, 0x36, 0x25, - 0xa7, 0x81, 0xe9, 0x92, 0x23, 0x41, 0x83, 0xa4, 0x0c, 0x72, 0x9d, 0x11, 0xc1, 0x82, 0x98, 0xdd, - 0x80, 0xb1, 0x65, 0xa7, 0xe5, 0xdc, 0xf5, 0x7c, 0x2f, 0xf1, 0x48, 0x8c, 0x7e, 0x06, 0xca, 0x8e, - 0xeb, 0xb2, 0x0d, 0x50, 0x59, 0x3a, 0xb5, 0xb7, 0x3b, 0x57, 0x5e, 0x74, 0xdd, 0xfd, 0xdd, 0x39, - 0x50, 0x58, 0x3b, 0x98, 0x62, 0xa0, 0x67, 0x61, 0xc0, 0x8d, 0xc2, 0xd6, 0x4c, 0x89, 0x61, 0x9e, - 0xa6, 0x3b, 0xb5, 0x1a, 0x85, 0xad, 0x0c, 0x2a, 0xc3, 0xb1, 0x7f, 0x50, 0x02, 0xb4, 0x4c, 0x5a, - 0x9b, 0xab, 0x75, 0xe3, 0x9b, 0x9e, 0x83, 0x91, 0xad, 0x30, 0xf0, 0x92, 0x30, 0x8a, 0x45, 0x83, - 0x6c, 0x5d, 0x5c, 0x17, 0x65, 0x58, 0x41, 0xd1, 0x59, 0x18, 0x68, 0xa5, 0xdb, 0x7b, 0x4c, 0xb2, - 0x06, 0xb6, 0xb1, 0x19, 0x84, 0x62, 0xb4, 0x63, 0x12, 0x89, 0xf5, 0xac, 0x30, 0x6e, 0xc5, 0x24, - 0xc2, 0x0c, 0x92, 0xae, 0x20, 0xba, 0xb6, 0xc4, 0x6a, 0xcd, 0xac, 0x20, 0x0a, 0xc1, 0x1a, 0x16, - 0x7a, 0x0b, 0x2a, 0xfc, 0x1f, 0x26, 0x1b, 0x6c, 0xe9, 0xe6, 0x32, 0x85, 0x6b, 0x61, 0xc3, 0xf1, - 0xb3, 0x93, 0x3f, 0xce, 0x56, 0x9c, 0x24, 0x84, 0x53, 0x9a, 0xc6, 0x8a, 0x1b, 0xca, 0x5d, 0x71, - 0x7f, 0xcb, 0x02, 0xb4, 0xec, 0x05, 0x2e, 0x89, 0x8e, 0xe1, 0xe8, 0xec, 0x6f, 0x33, 0xfc, 0x11, - 0xed, 0x5a, 0xb8, 0xd5, 0x0a, 0x03, 0x12, 0x24, 0xcb, 0x61, 0xe0, 0xf2, 0xe3, 0xf4, 0x63, 0x30, - 0x90, 0xd0, 0xa6, 0x78, 0xb7, 0x9e, 0x96, 0x9f, 0x85, 0x36, 0xb0, 0xbf, 0x3b, 0x77, 0xba, 0xb3, - 0x06, 0xeb, 0x02, 0xab, 0x83, 0x3e, 0x0a, 0x43, 0x71, 0xe2, 0x24, 0xed, 0x58, 0x74, 0xf4, 0x09, - 0xd9, 0xd1, 0x3a, 0x2b, 0xdd, 0xdf, 0x9d, 0x9b, 0x54, 0xd5, 0x78, 0x11, 0x16, 0x15, 0xd0, 0x33, - 0x30, 0xbc, 0x45, 0xe2, 0xd8, 0x69, 0x4a, 0x06, 0x37, 0x29, 0xea, 0x0e, 0x5f, 0xe7, 0xc5, 0x58, - 0xc2, 0xd1, 0x93, 0x30, 0x48, 0xa2, 0x28, 0x8c, 0xc4, 0x8a, 0x18, 0x17, 0x88, 0x83, 0x2b, 0xb4, - 0x10, 0x73, 0x98, 0xfd, 0x9f, 0x2d, 0x98, 0x54, 0x7d, 0xe5, 0x6d, 0x1d, 0xc3, 0x96, 0x77, 0x01, - 0x1a, 0x72, 0x80, 0x31, 0xdb, 0x68, 0x5a, 0x1b, 0xdd, 0x97, 0x5f, 0xe7, 0x84, 0xa6, 0x6d, 0xa8, - 0xa2, 0x18, 0x6b, 0x74, 0xed, 0x7f, 0x67, 0xc1, 0xc9, 0xcc, 0xd8, 0xae, 0x79, 0x71, 0x82, 0xde, - 0xec, 0x18, 0xdf, 0x7c, 0xb1, 0xf1, 0xd1, 0xda, 0x6c, 0x74, 0x6a, 0xbd, 0xc8, 0x12, 0x6d, 0x6c, - 0x18, 0x06, 0xbd, 0x84, 0x6c, 0xc9, 0x61, 0x3d, 0x5f, 0x70, 0x58, 0xbc, 0x7f, 0xe9, 0x57, 0x5a, - 0xa3, 0x34, 0x30, 0x27, 0x65, 0xff, 0x6f, 0x0b, 0x2a, 0xcb, 0x61, 0xb0, 0xe1, 0x35, 0xaf, 0x3b, - 0xad, 0x63, 0xf8, 0x3e, 0x75, 0x18, 0x60, 0xd4, 0xf9, 0x10, 0x2e, 0xe4, 0x0d, 0x41, 0x74, 0x6c, - 0x9e, 0x9e, 0xa9, 0x5c, 0x58, 0x50, 0x6c, 0x8a, 0x16, 0x61, 0x46, 0x6c, 0xf6, 0x65, 0xa8, 0x28, - 0x04, 0x34, 0x05, 0xe5, 0x7b, 0x84, 0x4b, 0x92, 0x15, 0x4c, 0x7f, 0xa2, 0x69, 0x18, 0xdc, 0x76, - 0xfc, 0xb6, 0xd8, 0xbc, 0x98, 0xff, 0xf9, 0x58, 0xe9, 0x92, 0x65, 0xff, 0x80, 0xed, 0x40, 0xd1, - 0xc8, 0x4a, 0xb0, 0x2d, 0x98, 0xc3, 0x17, 0x2d, 0x98, 0xf6, 0xbb, 0x30, 0x25, 0x31, 0x27, 0x87, - 0x61, 0x67, 0x8f, 0x89, 0x6e, 0x4f, 0x77, 0x83, 0xe2, 0xae, 0xad, 0x51, 0x5e, 0x1f, 0xb6, 0xe8, - 0x82, 0x73, 0x7c, 0xd6, 0x75, 0x21, 0x03, 0xdc, 0x14, 0x65, 0x58, 0x41, 0xed, 0x3f, 0xb5, 0x60, - 0x5a, 0x8d, 0xe3, 0x2a, 0xd9, 0xa9, 0x13, 0x9f, 0x34, 0x92, 0x30, 0x7a, 0xbf, 0x8c, 0xe4, 0x71, - 0xfe, 0x4d, 0x38, 0x4f, 0x1a, 0x15, 0x04, 0xca, 0x57, 0xc9, 0x0e, 0xff, 0x40, 0xfa, 0x40, 0xcb, - 0x07, 0x0e, 0xf4, 0xd7, 0x2d, 0x18, 0x57, 0x03, 0x3d, 0x86, 0x2d, 0x77, 0xcd, 0xdc, 0x72, 0x3f, - 0x53, 0x70, 0xbd, 0xf6, 0xd8, 0x6c, 0x7f, 0xb3, 0x44, 0xd9, 0x86, 0xc0, 0xa9, 0x45, 0x21, 0x9d, - 0x24, 0xca, 0xf1, 0xdf, 0x27, 0x5f, 0xa9, 0xbf, 0xc1, 0x5e, 0x25, 0x3b, 0xeb, 0x21, 0x95, 0x26, - 0xba, 0x0f, 0xd6, 0xf8, 0xa8, 0x03, 0x07, 0x7e, 0xd4, 0xdf, 0x2e, 0xc1, 0x29, 0x35, 0x2d, 0xc6, - 0x29, 0xfd, 0x53, 0x39, 0x31, 0x17, 0x60, 0xd4, 0x25, 0x1b, 0x4e, 0xdb, 0x4f, 0x94, 0x36, 0x31, - 0xc8, 0xd5, 0xcc, 0x6a, 0x5a, 0x8c, 0x75, 0x9c, 0x3e, 0xe6, 0xf2, 0xeb, 0xa3, 0x8c, 0x9f, 0x27, - 0x0e, 0x5d, 0xf5, 0x54, 0xc2, 0xd3, 0xd4, 0xc3, 0x31, 0x5d, 0x3d, 0x14, 0xaa, 0xe0, 0x93, 0x30, - 0xe8, 0x6d, 0xd1, 0x33, 0xbf, 0x64, 0x1e, 0xe5, 0x6b, 0xb4, 0x10, 0x73, 0x18, 0x7a, 0x0a, 0x86, - 0x1b, 0xe1, 0xd6, 0x96, 0x13, 0xb8, 0x33, 0x65, 0x26, 0x73, 0x8e, 0x52, 0xb1, 0x60, 0x99, 0x17, - 0x61, 0x09, 0x43, 0x8f, 0xc1, 0x80, 0x13, 0x35, 0xe3, 0x99, 0x01, 0x86, 0x33, 0x42, 0x5b, 0x5a, - 0x8c, 0x9a, 0x31, 0x66, 0xa5, 0x54, 0x96, 0xbc, 0x1f, 0x46, 0xf7, 0xbc, 0xa0, 0x59, 0xf5, 0x22, - 0x26, 0x18, 0x6a, 0xb2, 0xe4, 0x1d, 0x05, 0xc1, 0x1a, 0x16, 0xaa, 0xc1, 0x60, 0x2b, 0x8c, 0x92, - 0x78, 0x66, 0x88, 0x4d, 0xfc, 0x73, 0xb9, 0xdb, 0x8f, 0x8f, 0xbb, 0x16, 0x46, 0x49, 0x3a, 0x14, - 0xfa, 0x2f, 0xc6, 0x9c, 0x10, 0x5a, 0x86, 0x32, 0x09, 0xb6, 0x67, 0x86, 0x19, 0xbd, 0x0f, 0x1d, - 0x4c, 0x6f, 0x25, 0xd8, 0xbe, 0xed, 0x44, 0x29, 0xbf, 0x5a, 0x09, 0xb6, 0x31, 0xad, 0x8d, 0x1a, - 0x50, 0x91, 0xc6, 0xb0, 0x78, 0x66, 0xa4, 0xc8, 0x52, 0xc4, 0x02, 0x1d, 0x93, 0x77, 0xdb, 0x5e, - 0x44, 0xb6, 0x48, 0x90, 0xc4, 0xa9, 0x62, 0x25, 0xa1, 0x31, 0x4e, 0xe9, 0xa2, 0x06, 0x8c, 0x71, - 0xf9, 0xf3, 0x7a, 0xd8, 0x0e, 0x92, 0x78, 0xa6, 0xc2, 0xba, 0x9c, 0x63, 0xb9, 0xb8, 0x9d, 0xd6, - 0x58, 0x9a, 0x16, 0xe4, 0xc7, 0xb4, 0xc2, 0x18, 0x1b, 0x44, 0xd1, 0x9b, 0x30, 0xee, 0x7b, 0xdb, - 0x24, 0x20, 0x71, 0x5c, 0x8b, 0xc2, 0xbb, 0x64, 0x06, 0xd8, 0x68, 0x9e, 0xcc, 0xd3, 0xe2, 0xc3, - 0xbb, 0x64, 0xe9, 0xc4, 0xde, 0xee, 0xdc, 0xf8, 0x35, 0xbd, 0x36, 0x36, 0x89, 0xa1, 0xb7, 0x60, - 0x82, 0x0a, 0xbb, 0x5e, 0x4a, 0x7e, 0xb4, 0x38, 0x79, 0xb4, 0xb7, 0x3b, 0x37, 0x81, 0x8d, 0xea, - 0x38, 0x43, 0x0e, 0xad, 0x43, 0xc5, 0xf7, 0x36, 0x48, 0x63, 0xa7, 0xe1, 0x93, 0x99, 0x31, 0x46, - 0x3b, 0x67, 0x73, 0x5e, 0x93, 0xe8, 0x5c, 0xc1, 0x50, 0x7f, 0x71, 0x4a, 0x08, 0xdd, 0x86, 0xd3, - 0x09, 0x89, 0xb6, 0xbc, 0x80, 0xd9, 0xe8, 0x84, 0xf4, 0xcb, 0x4c, 0x25, 0xe3, 0x6c, 0xd5, 0x9e, - 0x11, 0x13, 0x7b, 0x7a, 0xbd, 0x2b, 0x16, 0xee, 0x51, 0x1b, 0xdd, 0x84, 0x49, 0xb6, 0x9f, 0x6a, - 0x6d, 0xdf, 0xaf, 0x85, 0xbe, 0xd7, 0xd8, 0x99, 0x99, 0x60, 0x04, 0x9f, 0x92, 0x06, 0x90, 0x35, - 0x13, 0x4c, 0x15, 0xc3, 0xf4, 0x1f, 0xce, 0xd6, 0x46, 0x3e, 0x4c, 0xc6, 0xa4, 0xd1, 0x8e, 0xbc, - 0x64, 0x87, 0xae, 0x7d, 0xf2, 0x20, 0x99, 0x99, 0x2c, 0xa2, 0xe8, 0xd6, 0xcd, 0x4a, 0xdc, 0xfa, - 0x94, 0x29, 0xc4, 0x59, 0xd2, 0x94, 0x55, 0xc4, 0x89, 0xeb, 0x05, 0x33, 0x53, 0x8c, 0x03, 0xa9, - 0xfd, 0x55, 0xa7, 0x85, 0x98, 0xc3, 0x98, 0xfd, 0x80, 0xfe, 0xb8, 0x49, 0xb9, 0xf4, 0x09, 0x86, - 0x98, 0xda, 0x0f, 0x24, 0x00, 0xa7, 0x38, 0x54, 0x34, 0x48, 0x92, 0x9d, 0x19, 0xc4, 0x50, 0xd5, - 0x56, 0x5b, 0x5f, 0xff, 0x14, 0xa6, 0xe5, 0xe8, 0x36, 0x0c, 0x93, 0x60, 0x7b, 0x35, 0x0a, 0xb7, - 0x66, 0x4e, 0x16, 0xe1, 0x01, 0x2b, 0x1c, 0x99, 0x9f, 0x1f, 0xa9, 0x0a, 0x23, 0x8a, 0xb1, 0x24, - 0x86, 0x1e, 0xc0, 0x4c, 0x97, 0xaf, 0xc4, 0x3f, 0xca, 0x34, 0xfb, 0x28, 0x1f, 0x17, 0x75, 0x67, - 0xd6, 0x7b, 0xe0, 0xed, 0x1f, 0x00, 0xc3, 0x3d, 0xa9, 0xdb, 0x77, 0x61, 0x42, 0x31, 0x2a, 0xf6, - 0xbd, 0xd1, 0x1c, 0x0c, 0x52, 0x5e, 0x2c, 0x15, 0xfa, 0x0a, 0x9d, 0x54, 0xca, 0xa2, 0x63, 0xcc, - 0xcb, 0xd9, 0xa4, 0x7a, 0x9f, 0x25, 0x4b, 0x3b, 0x09, 0xe1, 0x8a, 0x5d, 0x59, 0x9b, 0x54, 0x09, - 0xc0, 0x29, 0x8e, 0xfd, 0x7f, 0xb9, 0x98, 0x94, 0x72, 0xc3, 0x02, 0x27, 0xc1, 0x79, 0x18, 0xd9, - 0x0c, 0xe3, 0x84, 0x62, 0xb3, 0x36, 0x06, 0x53, 0xc1, 0xe8, 0x8a, 0x28, 0xc7, 0x0a, 0x03, 0xbd, - 0x02, 0xe3, 0x0d, 0xbd, 0x01, 0x71, 0x8c, 0x9d, 0x12, 0x55, 0xcc, 0xd6, 0xb1, 0x89, 0x8b, 0x2e, - 0xc1, 0x08, 0xb3, 0x72, 0x37, 0x42, 0x5f, 0xa8, 0x90, 0xf2, 0x54, 0x1e, 0xa9, 0x89, 0xf2, 0x7d, - 0xed, 0x37, 0x56, 0xd8, 0x54, 0x11, 0xa7, 0x5d, 0x58, 0xab, 0x89, 0x03, 0x44, 0x29, 0xe2, 0x57, - 0x58, 0x29, 0x16, 0x50, 0xfb, 0x9f, 0x95, 0xb4, 0x59, 0xa6, 0x0a, 0x10, 0x41, 0x6f, 0xc0, 0xf0, - 0x7d, 0xc7, 0x4b, 0xbc, 0xa0, 0x29, 0xa4, 0x87, 0x17, 0x0a, 0x9e, 0x26, 0xac, 0xfa, 0x1d, 0x5e, - 0x95, 0x9f, 0x7c, 0xe2, 0x0f, 0x96, 0x04, 0x29, 0xed, 0xa8, 0x1d, 0x04, 0x94, 0x76, 0xa9, 0x7f, - 0xda, 0x98, 0x57, 0xe5, 0xb4, 0xc5, 0x1f, 0x2c, 0x09, 0xa2, 0x0d, 0x00, 0xb9, 0x96, 0x88, 0x2b, - 0xac, 0xcb, 0x1f, 0xe9, 0x87, 0xfc, 0xba, 0xaa, 0xbd, 0x34, 0x41, 0xcf, 0xda, 0xf4, 0x3f, 0xd6, - 0x28, 0xdb, 0x09, 0x13, 0xc2, 0x3a, 0xbb, 0x85, 0x3e, 0x4d, 0xb7, 0xb4, 0x13, 0x25, 0xc4, 0x5d, - 0x4c, 0xb2, 0x06, 0xfa, 0x83, 0x45, 0xec, 0x75, 0x6f, 0x8b, 0xe8, 0xdb, 0x5f, 0x10, 0xc1, 0x29, - 0x3d, 0xfb, 0xbb, 0x65, 0x98, 0xe9, 0xd5, 0x5d, 0xba, 0x24, 0xc9, 0x03, 0x2f, 0x59, 0xa6, 0x62, - 0x92, 0x65, 0x2e, 0xc9, 0x15, 0x51, 0x8e, 0x15, 0x06, 0x5d, 0x1b, 0xb1, 0xd7, 0x94, 0xca, 0xd2, - 0x60, 0xba, 0x36, 0xea, 0xac, 0x14, 0x0b, 0x28, 0xc5, 0x8b, 0x88, 0x13, 0x8b, 0xcb, 0x0d, 0x6d, - 0x0d, 0x61, 0x56, 0x8a, 0x05, 0x54, 0x37, 0x88, 0x0c, 0xe4, 0x18, 0x44, 0x8c, 0x29, 0x1a, 0x7c, - 0xb8, 0x53, 0x84, 0x3e, 0x03, 0xb0, 0xe1, 0x05, 0x5e, 0xbc, 0xc9, 0xa8, 0x0f, 0xf5, 0x4d, 0x5d, - 0x09, 0x59, 0xab, 0x8a, 0x0a, 0xd6, 0x28, 0xa2, 0x97, 0x60, 0x54, 0x6d, 0xcf, 0xb5, 0xea, 0xcc, - 0xb0, 0x69, 0x10, 0x4f, 0x79, 0x55, 0x15, 0xeb, 0x78, 0xf6, 0x3b, 0xd9, 0xf5, 0x22, 0x76, 0x85, - 0x36, 0xbf, 0x56, 0xd1, 0xf9, 0x2d, 0x1d, 0x3c, 0xbf, 0xf6, 0xef, 0x97, 0x61, 0xd2, 0x68, 0xac, - 0x1d, 0x17, 0xe0, 0x68, 0xaf, 0xd1, 0x03, 0xcb, 0x49, 0x88, 0xd8, 0x93, 0xe7, 0xfb, 0xd9, 0x34, - 0xfa, 0xf1, 0x46, 0xf7, 0x02, 0xa7, 0x84, 0x36, 0xa1, 0xe2, 0x3b, 0x31, 0x33, 0xa9, 0x10, 0xb1, - 0x17, 0xfb, 0x23, 0x9b, 0xaa, 0x1f, 0x4e, 0x9c, 0x68, 0xa7, 0x07, 0x6f, 0x25, 0x25, 0x4e, 0x4f, - 0x5b, 0x2a, 0xec, 0xc8, 0x1b, 0x35, 0xd5, 0x1d, 0x2a, 0x11, 0xed, 0x60, 0x0e, 0x43, 0x97, 0x60, - 0x2c, 0x22, 0x6c, 0xa5, 0x2c, 0x53, 0x79, 0x8e, 0x2d, 0xbd, 0xc1, 0x54, 0xf0, 0xc3, 0x1a, 0x0c, - 0x1b, 0x98, 0xa9, 0xdc, 0x3f, 0x74, 0x80, 0xdc, 0xff, 0x0c, 0x0c, 0xb3, 0x1f, 0x6a, 0x55, 0xa8, - 0x2f, 0xb4, 0xc6, 0x8b, 0xb1, 0x84, 0x67, 0x17, 0xd1, 0x48, 0xc1, 0x45, 0xf4, 0x2c, 0x4c, 0x54, - 0x1d, 0xb2, 0x15, 0x06, 0x2b, 0x81, 0xdb, 0x0a, 0xbd, 0x20, 0x41, 0x33, 0x30, 0xc0, 0xce, 0x13, - 0xbe, 0xdf, 0x07, 0x28, 0x05, 0x3c, 0x40, 0x65, 0x77, 0xfb, 0x8f, 0x4a, 0x30, 0x5e, 0x25, 0x3e, - 0x49, 0x08, 0xd7, 0x7b, 0x62, 0xb4, 0x0a, 0xa8, 0x19, 0x39, 0x0d, 0x52, 0x23, 0x91, 0x17, 0xba, - 0x75, 0xd2, 0x08, 0x03, 0x76, 0x11, 0x45, 0x0f, 0xc8, 0xd3, 0x7b, 0xbb, 0x73, 0xe8, 0x72, 0x07, - 0x14, 0x77, 0xa9, 0x81, 0x5c, 0x18, 0x6f, 0x45, 0xc4, 0xb0, 0x1b, 0x5a, 0xf9, 0xa2, 0x46, 0x4d, - 0xaf, 0xc2, 0xa5, 0x61, 0xa3, 0x08, 0x9b, 0x44, 0xd1, 0x27, 0x60, 0x2a, 0x8c, 0x5a, 0x9b, 0x4e, - 0x50, 0x25, 0x2d, 0x12, 0xb8, 0x54, 0x05, 0x10, 0xd6, 0x8e, 0xe9, 0xbd, 0xdd, 0xb9, 0xa9, 0x9b, - 0x19, 0x18, 0xee, 0xc0, 0x46, 0x6f, 0xc0, 0x89, 0x56, 0x14, 0xb6, 0x9c, 0x26, 0x5b, 0x32, 0x42, - 0x5a, 0xe1, 0xbc, 0xe9, 0xfc, 0xde, 0xee, 0xdc, 0x89, 0x5a, 0x16, 0xb8, 0xbf, 0x3b, 0x77, 0x92, - 0x4d, 0x19, 0x2d, 0x49, 0x81, 0xb8, 0x93, 0x8c, 0xfd, 0x2e, 0x9c, 0xaa, 0x86, 0xf7, 0x83, 0xfb, - 0x4e, 0xe4, 0x2e, 0xd6, 0xd6, 0x34, 0xe3, 0xc4, 0xeb, 0x52, 0xf9, 0xe5, 0x17, 0x7c, 0x39, 0x27, - 0x9b, 0x46, 0x83, 0xab, 0x1d, 0xab, 0x9e, 0x4f, 0x7a, 0x98, 0x43, 0xfe, 0x51, 0xc9, 0x68, 0x33, - 0xc5, 0x57, 0x77, 0x17, 0x56, 0xcf, 0xbb, 0x8b, 0x4f, 0xc3, 0xc8, 0x86, 0x47, 0x7c, 0x17, 0x93, - 0x0d, 0xf1, 0xb5, 0x2e, 0x14, 0xb9, 0xdc, 0x59, 0xa5, 0x75, 0xa4, 0x75, 0x8c, 0x2b, 0xd1, 0xab, - 0x82, 0x0c, 0x56, 0x04, 0x51, 0x1b, 0xa6, 0xa4, 0x1e, 0x26, 0xa1, 0x62, 0xb3, 0xbf, 0x50, 0x4c, - 0xcd, 0x33, 0x9b, 0x61, 0x9f, 0x17, 0x67, 0x08, 0xe2, 0x8e, 0x26, 0xa8, 0xfe, 0xbc, 0x45, 0x8f, - 0xba, 0x01, 0xb6, 0xf4, 0x99, 0xfe, 0xcc, 0x4c, 0x01, 0xac, 0xd4, 0xfe, 0x15, 0x0b, 0x1e, 0xe9, - 0x98, 0x2d, 0x61, 0x27, 0x39, 0xb2, 0x6f, 0x94, 0x35, 0x56, 0x94, 0xf2, 0x8d, 0x15, 0xf6, 0x4d, - 0x98, 0x5e, 0xd9, 0x6a, 0x25, 0x3b, 0x55, 0xcf, 0xbc, 0x72, 0x79, 0x19, 0x86, 0xb6, 0x88, 0xeb, - 0xb5, 0xb7, 0xc4, 0x67, 0x9d, 0x93, 0xe7, 0xc2, 0x75, 0x56, 0xba, 0xbf, 0x3b, 0x37, 0x5e, 0x4f, - 0xc2, 0xc8, 0x69, 0x12, 0x5e, 0x80, 0x05, 0xba, 0xfd, 0x23, 0x0b, 0x26, 0x25, 0x7f, 0x58, 0x74, - 0xdd, 0x88, 0xc4, 0x31, 0x9a, 0x85, 0x92, 0xd7, 0x12, 0x84, 0x40, 0x10, 0x2a, 0xad, 0xd5, 0x70, - 0xc9, 0x6b, 0xa1, 0x37, 0xa0, 0xc2, 0x6f, 0xea, 0xd2, 0xc5, 0xd1, 0xe7, 0xcd, 0x1f, 0xd3, 0x0d, - 0xd7, 0x25, 0x0d, 0x9c, 0x92, 0x93, 0x52, 0x32, 0x3b, 0x79, 0xca, 0xe6, 0xbd, 0xd1, 0x15, 0x51, - 0x8e, 0x15, 0x06, 0x3a, 0x07, 0x23, 0x41, 0xe8, 0xf2, 0xcb, 0x54, 0xbe, 0x4f, 0xd9, 0x92, 0xbb, - 0x21, 0xca, 0xb0, 0x82, 0xda, 0x5f, 0xb1, 0x60, 0x4c, 0x8e, 0xb1, 0xa0, 0xc0, 0x4e, 0x37, 0x49, - 0x2a, 0xac, 0xa7, 0x9b, 0x84, 0x0a, 0xdc, 0x0c, 0x62, 0xc8, 0xd9, 0xe5, 0x7e, 0xe4, 0x6c, 0xfb, - 0xd7, 0x4a, 0x30, 0x21, 0xbb, 0x53, 0x6f, 0xdf, 0x8d, 0x09, 0x15, 0x43, 0x2a, 0x0e, 0x9f, 0x7c, - 0x22, 0xd7, 0xd9, 0xf3, 0x79, 0xba, 0x98, 0xf1, 0xcd, 0x52, 0x31, 0x67, 0x51, 0xd2, 0xc1, 0x29, - 0x49, 0xb4, 0x0d, 0x27, 0x82, 0x30, 0x61, 0xc7, 0x9b, 0x82, 0x17, 0xbb, 0xe9, 0xc8, 0xb6, 0xf3, - 0xa8, 0x68, 0xe7, 0xc4, 0x8d, 0x2c, 0x3d, 0xdc, 0xd9, 0x04, 0xba, 0x29, 0x6d, 0x4c, 0x65, 0xd6, - 0xd6, 0xb3, 0xc5, 0xda, 0xea, 0x6d, 0x62, 0xb2, 0x7f, 0xcb, 0x82, 0x8a, 0x44, 0x3b, 0x8e, 0x2b, - 0xaf, 0x3b, 0x30, 0x1c, 0xb3, 0x4f, 0x24, 0xa7, 0xeb, 0x7c, 0xb1, 0x21, 0xf0, 0xef, 0x9a, 0x9e, - 0xe9, 0xfc, 0x7f, 0x8c, 0x25, 0x35, 0x66, 0x6c, 0x57, 0x03, 0x79, 0xdf, 0x19, 0xdb, 0x55, 0xcf, - 0x7a, 0xdf, 0x6c, 0x8d, 0x1b, 0xd6, 0x00, 0x2a, 0x98, 0xb6, 0x22, 0xb2, 0xe1, 0x3d, 0xc8, 0x0a, - 0xa6, 0x35, 0x56, 0x8a, 0x05, 0x14, 0x6d, 0xc0, 0x58, 0x43, 0x9a, 0xa3, 0x53, 0x16, 0xf2, 0xe1, - 0x82, 0xb6, 0x7f, 0x75, 0x8d, 0xc4, 0x5d, 0x93, 0x96, 0x35, 0x4a, 0xd8, 0xa0, 0x4b, 0xf9, 0x54, - 0x7a, 0x53, 0x5e, 0x2e, 0x68, 0xb8, 0x89, 0x48, 0x92, 0xb6, 0xd0, 0xf3, 0x92, 0xdc, 0xfe, 0x86, - 0x05, 0x43, 0xdc, 0x7e, 0x59, 0xcc, 0x08, 0xac, 0x5d, 0x90, 0xa5, 0xf3, 0x79, 0x9b, 0x16, 0x8a, - 0xfb, 0x32, 0x74, 0x07, 0x2a, 0xec, 0x07, 0xb3, 0xc5, 0x94, 0x8b, 0xf8, 0x69, 0xf1, 0xf6, 0xf5, - 0xae, 0xde, 0x96, 0x04, 0x70, 0x4a, 0xcb, 0xfe, 0x7e, 0x99, 0xb2, 0xbe, 0x14, 0xd5, 0x38, 0xdb, - 0xad, 0xe3, 0x38, 0xdb, 0x4b, 0x47, 0x7f, 0xb6, 0xbf, 0x0b, 0x93, 0x0d, 0xed, 0x82, 0x2e, 0xfd, - 0xe2, 0x17, 0x0b, 0x2e, 0x2b, 0xed, 0x56, 0x8f, 0xdb, 0xeb, 0x96, 0x4d, 0x72, 0x38, 0x4b, 0x1f, - 0x11, 0x18, 0xe3, 0xeb, 0x41, 0xb4, 0x37, 0xc0, 0xda, 0x5b, 0x28, 0xb2, 0xc2, 0xf4, 0xc6, 0xd8, - 0x2a, 0xae, 0x6b, 0x84, 0xb0, 0x41, 0xd6, 0xfe, 0xa5, 0x41, 0x18, 0x5c, 0xd9, 0x26, 0x41, 0x72, - 0x0c, 0xac, 0x6e, 0x0b, 0x26, 0xbc, 0x60, 0x3b, 0xf4, 0xb7, 0x89, 0xcb, 0xe1, 0x87, 0x3b, 0xde, - 0x4f, 0x8b, 0x46, 0x26, 0xd6, 0x0c, 0x62, 0x38, 0x43, 0xfc, 0x28, 0x2c, 0x05, 0xaf, 0xc1, 0x10, - 0x5f, 0x19, 0xc2, 0x4c, 0x90, 0x63, 0xcf, 0x67, 0x13, 0x2b, 0x76, 0x50, 0x6a, 0xcf, 0xe0, 0x57, - 0x09, 0x82, 0x10, 0x7a, 0x07, 0x26, 0x36, 0xbc, 0x28, 0x4e, 0xa8, 0xb2, 0x1f, 0x27, 0xce, 0x56, - 0xeb, 0x10, 0x36, 0x02, 0x35, 0x23, 0xab, 0x06, 0x25, 0x9c, 0xa1, 0x8c, 0x9a, 0x30, 0x4e, 0x55, - 0xd4, 0xb4, 0xa9, 0xe1, 0xbe, 0x9b, 0x52, 0x26, 0xc2, 0x6b, 0x3a, 0x21, 0x6c, 0xd2, 0xa5, 0x2c, - 0xa9, 0xc1, 0x54, 0xda, 0x11, 0x26, 0xdd, 0x28, 0x96, 0xc4, 0x75, 0x59, 0x0e, 0xa3, 0x9c, 0x8d, - 0x79, 0xca, 0x54, 0x4c, 0xce, 0x96, 0xfa, 0xc3, 0xd8, 0xdf, 0xa2, 0x67, 0x31, 0x9d, 0xc3, 0x63, - 0x38, 0xbe, 0xae, 0x98, 0xc7, 0xd7, 0x93, 0x05, 0xbe, 0x6c, 0x8f, 0xa3, 0xeb, 0x6d, 0x18, 0xd5, - 0x3e, 0x3c, 0x5a, 0x80, 0x4a, 0x43, 0x3a, 0x73, 0x08, 0x2e, 0xae, 0x44, 0x29, 0xe5, 0xe5, 0x81, - 0x53, 0x1c, 0x3a, 0x2f, 0x54, 0x04, 0xcd, 0xba, 0x7e, 0x51, 0x01, 0x15, 0x33, 0x88, 0xfd, 0x02, - 0xc0, 0xca, 0x03, 0xd2, 0x58, 0xe4, 0x2a, 0x9e, 0x76, 0xbf, 0x67, 0xf5, 0xbe, 0xdf, 0xb3, 0xbf, - 0x69, 0xc1, 0xc4, 0xea, 0xb2, 0x21, 0xd3, 0xcf, 0x03, 0x70, 0xd9, 0xf8, 0xce, 0x9d, 0x1b, 0xd2, - 0x7e, 0xcd, 0x8d, 0x8c, 0xaa, 0x14, 0x6b, 0x18, 0xe8, 0x51, 0x28, 0xfb, 0xed, 0x40, 0x88, 0xac, - 0xc3, 0x7b, 0xbb, 0x73, 0xe5, 0x6b, 0xed, 0x00, 0xd3, 0x32, 0xcd, 0xc7, 0xaa, 0x5c, 0xd8, 0xc7, - 0x2a, 0xdf, 0xdb, 0xf8, 0x6b, 0x65, 0x98, 0x5a, 0xf5, 0xc9, 0x03, 0xa3, 0xd7, 0x4f, 0xc3, 0x90, - 0x1b, 0x79, 0xdb, 0x24, 0xca, 0x0a, 0x02, 0x55, 0x56, 0x8a, 0x05, 0xb4, 0xb0, 0xdb, 0xd7, 0x5b, - 0x9d, 0x07, 0xf9, 0xd1, 0xb9, 0xbc, 0xe5, 0x8e, 0x19, 0x6d, 0xc0, 0x30, 0xbf, 0x0f, 0x8e, 0x67, - 0x06, 0xd9, 0x52, 0x7c, 0xe5, 0xe0, 0xce, 0x64, 0xe7, 0x67, 0x5e, 0xd8, 0x57, 0xb8, 0xc3, 0x8d, - 0xe2, 0x65, 0xa2, 0x14, 0x4b, 0xe2, 0xb3, 0x1f, 0x83, 0x31, 0x1d, 0xb3, 0x2f, 0xcf, 0x9b, 0xbf, - 0x6c, 0xc1, 0xc9, 0x55, 0x3f, 0x6c, 0xdc, 0xcb, 0xf8, 0xe5, 0xbd, 0x04, 0xa3, 0x74, 0x33, 0xc5, - 0x86, 0xd3, 0xaa, 0xe1, 0x9d, 0x2b, 0x40, 0x58, 0xc7, 0xd3, 0xaa, 0xdd, 0xba, 0xb5, 0x56, 0xed, - 0xe6, 0xd4, 0x2b, 0x40, 0x58, 0xc7, 0xb3, 0x7f, 0xc7, 0x82, 0xc7, 0x2f, 0x2f, 0xaf, 0xd4, 0x48, - 0x14, 0x7b, 0x71, 0x42, 0x82, 0xa4, 0xc3, 0xaf, 0x98, 0xca, 0x8c, 0xae, 0xd6, 0x95, 0x54, 0x66, - 0xac, 0xb2, 0x5e, 0x08, 0xe8, 0xfb, 0xc5, 0xb9, 0xfe, 0x1b, 0x16, 0x9c, 0xbc, 0xec, 0x25, 0x98, - 0xb4, 0xc2, 0xac, 0x2b, 0x70, 0x44, 0x5a, 0x61, 0xec, 0x25, 0x61, 0xb4, 0x93, 0x75, 0x05, 0xc6, - 0x0a, 0x82, 0x35, 0x2c, 0xde, 0xf2, 0xb6, 0x17, 0xd3, 0x9e, 0x96, 0x4c, 0x55, 0x17, 0x8b, 0x72, - 0xac, 0x30, 0xe8, 0xc0, 0x5c, 0x2f, 0x62, 0x22, 0xc3, 0x8e, 0xd8, 0xc1, 0x6a, 0x60, 0x55, 0x09, - 0xc0, 0x29, 0x8e, 0xfd, 0x77, 0x2c, 0x38, 0x75, 0xd9, 0x6f, 0xc7, 0x09, 0x89, 0x36, 0x62, 0xa3, - 0xb3, 0x2f, 0x40, 0x85, 0x48, 0xe1, 0x5e, 0xf4, 0x55, 0x1d, 0x1a, 0x4a, 0xea, 0xe7, 0x7e, 0xc8, - 0x0a, 0xaf, 0x80, 0xbb, 0x6b, 0x7f, 0xce, 0x99, 0xbf, 0x51, 0x82, 0xf1, 0x2b, 0xeb, 0xeb, 0xb5, - 0xcb, 0x24, 0x11, 0x5c, 0x32, 0xdf, 0x28, 0x85, 0x35, 0x8d, 0xfc, 0x20, 0xe1, 0xa7, 0x9d, 0x78, - 0xfe, 0x3c, 0x0f, 0x3c, 0x99, 0x5f, 0x0b, 0x92, 0x9b, 0x51, 0x3d, 0x89, 0xbc, 0xa0, 0xd9, 0x55, - 0x87, 0x97, 0xbc, 0xbc, 0xdc, 0x8b, 0x97, 0xa3, 0x17, 0x60, 0x88, 0x45, 0xbe, 0x48, 0xe1, 0xe3, - 0x83, 0x4a, 0x4e, 0x60, 0xa5, 0xfb, 0xbb, 0x73, 0x95, 0x5b, 0x78, 0x8d, 0xff, 0xc1, 0x02, 0x15, - 0xbd, 0x05, 0xa3, 0x9b, 0x49, 0xd2, 0xba, 0x42, 0x1c, 0x97, 0x44, 0x92, 0x4f, 0x9c, 0x3b, 0x98, - 0x4f, 0xd0, 0xe9, 0xe0, 0x15, 0xd2, 0xad, 0x95, 0x96, 0xc5, 0x58, 0xa7, 0x68, 0xd7, 0x01, 0x52, - 0xd8, 0x43, 0xd2, 0x41, 0xec, 0x9f, 0x2f, 0xc1, 0xf0, 0x15, 0x27, 0x70, 0x7d, 0x12, 0xa1, 0x55, - 0x18, 0x20, 0x0f, 0x48, 0x43, 0x1c, 0xe4, 0x39, 0x5d, 0x4f, 0x0f, 0x3b, 0x6e, 0x57, 0xa3, 0xff, - 0x31, 0xab, 0x8f, 0x30, 0x0c, 0xd3, 0x7e, 0x5f, 0x56, 0x5e, 0xe2, 0xcf, 0xe5, 0xcf, 0x82, 0x5a, - 0x14, 0xfc, 0xa4, 0x14, 0x45, 0x58, 0x12, 0x62, 0x16, 0xa8, 0x46, 0xab, 0x4e, 0xd9, 0x5b, 0x52, - 0x4c, 0xb3, 0x5b, 0x5f, 0xae, 0x71, 0x74, 0x41, 0x97, 0x5b, 0xa0, 0x64, 0x21, 0x4e, 0xc9, 0xd9, - 0xeb, 0x50, 0xa1, 0x1f, 0x7f, 0xd1, 0xf7, 0x9c, 0x83, 0xcd, 0x60, 0xcf, 0x41, 0x45, 0x1a, 0xa2, - 0x62, 0xe1, 0x72, 0xce, 0xa8, 0x4a, 0x3b, 0x55, 0x8c, 0x53, 0xb8, 0x7d, 0x09, 0xa6, 0xd9, 0x2d, - 0xaf, 0x93, 0x6c, 0x1a, 0x7b, 0x31, 0x77, 0xd1, 0xdb, 0xdf, 0x1e, 0x80, 0x13, 0x6b, 0xf5, 0xe5, - 0xba, 0x69, 0x91, 0xbc, 0x04, 0x63, 0xfc, 0xd8, 0xa7, 0x4b, 0xd9, 0xf1, 0x45, 0x7d, 0x75, 0x33, - 0xb1, 0xae, 0xc1, 0xb0, 0x81, 0x89, 0x1e, 0x87, 0xb2, 0xf7, 0x6e, 0x90, 0xf5, 0x15, 0x5c, 0x7b, - 0xed, 0x06, 0xa6, 0xe5, 0x14, 0x4c, 0x25, 0x08, 0xce, 0x3a, 0x15, 0x58, 0x49, 0x11, 0xaf, 0xc2, - 0x84, 0x17, 0x37, 0x62, 0x6f, 0x2d, 0xa0, 0x7c, 0xc5, 0x69, 0xc8, 0x4d, 0x91, 0x8a, 0xfc, 0xb4, - 0xab, 0x0a, 0x8a, 0x33, 0xd8, 0x1a, 0x1f, 0x1f, 0x2c, 0x2c, 0x85, 0xe4, 0x3a, 0xa1, 0x53, 0x01, - 0xab, 0xc5, 0x46, 0x17, 0x33, 0xcf, 0x23, 0x21, 0x60, 0xf1, 0x01, 0xc7, 0x58, 0xc2, 0xd0, 0x65, - 0x38, 0xd1, 0xd8, 0x74, 0x5a, 0x8b, 0xed, 0x64, 0xb3, 0xea, 0xc5, 0x8d, 0x70, 0x9b, 0x44, 0x3b, - 0x4c, 0x00, 0x1e, 0x49, 0x6d, 0x5a, 0x0a, 0xb0, 0x7c, 0x65, 0xb1, 0x46, 0x31, 0x71, 0x67, 0x1d, - 0x53, 0x20, 0x81, 0x23, 0x10, 0x48, 0x16, 0x61, 0x52, 0xb6, 0x5a, 0x27, 0x31, 0x3b, 0x22, 0x46, - 0x59, 0x3f, 0x55, 0x2c, 0x8f, 0x28, 0x56, 0xbd, 0xcc, 0xe2, 0xdb, 0xef, 0x40, 0x45, 0x79, 0xca, - 0x49, 0x07, 0x51, 0xab, 0x87, 0x83, 0x68, 0x3e, 0x73, 0x97, 0xb6, 0xf3, 0x72, 0x57, 0xdb, 0xf9, - 0x3f, 0xb1, 0x20, 0x75, 0xf5, 0x41, 0x18, 0x2a, 0xad, 0x90, 0xdd, 0xb3, 0x45, 0xf2, 0x42, 0xfb, - 0xa9, 0x9c, 0x3d, 0xcf, 0x79, 0x0e, 0x9f, 0x90, 0x9a, 0xac, 0x8b, 0x53, 0x32, 0xe8, 0x1a, 0x0c, - 0xb7, 0x22, 0x52, 0x4f, 0x58, 0x74, 0x47, 0x1f, 0x14, 0xf9, 0x42, 0xe0, 0x35, 0xb1, 0x24, 0x61, - 0xff, 0x0b, 0x0b, 0xe0, 0x9a, 0xb7, 0xe5, 0x25, 0xd8, 0x09, 0x9a, 0xe4, 0x18, 0x14, 0xeb, 0x1b, - 0x30, 0x10, 0xb7, 0x48, 0xa3, 0xd8, 0x4d, 0x69, 0xda, 0xb3, 0x7a, 0x8b, 0x34, 0xd2, 0xcf, 0x41, - 0xff, 0x61, 0x46, 0xc7, 0xfe, 0x1e, 0xc0, 0x44, 0x8a, 0x46, 0x95, 0x1b, 0xf4, 0xbc, 0x11, 0xd6, - 0xf0, 0x68, 0x26, 0xac, 0xa1, 0xc2, 0xb0, 0xb5, 0x48, 0x86, 0x04, 0xca, 0x5b, 0xce, 0x03, 0xa1, - 0x4b, 0xbd, 0x54, 0xb4, 0x43, 0xb4, 0xa5, 0xf9, 0xeb, 0xce, 0x03, 0x2e, 0xba, 0x3e, 0x27, 0x17, - 0xd2, 0x75, 0xe7, 0xc1, 0x3e, 0xbf, 0x0f, 0x65, 0xdc, 0x89, 0x2a, 0x6f, 0x5f, 0xf8, 0xe3, 0xf4, - 0x3f, 0x3b, 0x86, 0x68, 0x73, 0xac, 0x55, 0x2f, 0x10, 0xa6, 0xe0, 0x3e, 0x5b, 0xf5, 0x82, 0x6c, - 0xab, 0x5e, 0x50, 0xa0, 0x55, 0x8f, 0xf9, 0xff, 0x0e, 0x8b, 0x1b, 0x14, 0xe6, 0x3c, 0x39, 0x7a, - 0xf1, 0xa3, 0x7d, 0x35, 0x2d, 0xae, 0x62, 0x78, 0xf3, 0x0b, 0x52, 0x5e, 0x17, 0xa5, 0xb9, 0x5d, - 0x90, 0x4d, 0xa3, 0xbf, 0x6b, 0xc1, 0x84, 0xf8, 0x8d, 0xc9, 0xbb, 0x6d, 0x12, 0x27, 0x42, 0x2e, - 0xf8, 0xc4, 0x61, 0x7a, 0x23, 0x48, 0xf0, 0x4e, 0x7d, 0x44, 0xb2, 0x5f, 0x13, 0x98, 0xdb, 0xb7, - 0x4c, 0x7f, 0xd0, 0xf7, 0x2c, 0x98, 0xde, 0x72, 0x1e, 0xf0, 0x16, 0x79, 0x19, 0x76, 0x12, 0x2f, - 0x14, 0x0e, 0xa2, 0xab, 0xfd, 0xae, 0x93, 0x0e, 0x42, 0xbc, 0xbb, 0xd2, 0xf7, 0x6b, 0xba, 0x1b, - 0x4a, 0x6e, 0xa7, 0xbb, 0xf6, 0x70, 0x76, 0x03, 0x46, 0xe4, 0xc2, 0xec, 0xa2, 0x29, 0x55, 0x75, - 0xf1, 0x27, 0xc7, 0x2e, 0x31, 0x2f, 0xad, 0x8b, 0xf3, 0xaf, 0xb5, 0x9d, 0x20, 0xf1, 0x92, 0x1d, - 0x4d, 0xb3, 0x62, 0xed, 0x88, 0xa5, 0x78, 0xa4, 0xed, 0xbc, 0x03, 0x63, 0xfa, 0xba, 0x3b, 0xd2, - 0xb6, 0xde, 0x85, 0x93, 0x5d, 0x56, 0xd5, 0x91, 0x36, 0x79, 0x1f, 0x1e, 0xed, 0xb9, 0x3e, 0x8e, - 0xb2, 0x61, 0xfb, 0x37, 0x2c, 0x9d, 0x75, 0x1e, 0x83, 0xdd, 0xea, 0xba, 0x69, 0xb7, 0x3a, 0x57, - 0x74, 0x0f, 0xf5, 0x30, 0x5e, 0x6d, 0xe8, 0xdd, 0xa7, 0x47, 0x02, 0x5a, 0x87, 0x21, 0x9f, 0x96, - 0xc8, 0x6b, 0xc3, 0xf3, 0xfd, 0xec, 0xd2, 0x54, 0x02, 0x63, 0xe5, 0x31, 0x16, 0xb4, 0xec, 0xef, - 0x59, 0x30, 0xf0, 0xe7, 0x18, 0x74, 0xd5, 0x41, 0x5a, 0x64, 0x21, 0x98, 0xc7, 0xce, 0xfd, 0x95, - 0x07, 0x09, 0x09, 0x62, 0x26, 0xc6, 0xf7, 0x72, 0x7c, 0x18, 0xa5, 0x4d, 0x49, 0x3f, 0x96, 0x57, - 0x60, 0xdc, 0x77, 0xee, 0x12, 0x5f, 0xda, 0xdc, 0xb3, 0x4a, 0xef, 0x35, 0x1d, 0x88, 0x4d, 0x5c, - 0x5a, 0x79, 0x43, 0xbf, 0x92, 0x10, 0x42, 0x92, 0xaa, 0x6c, 0xdc, 0x57, 0x60, 0x13, 0x97, 0x6a, - 0x5d, 0xf7, 0x9d, 0xa4, 0xb1, 0x29, 0x14, 0x62, 0xd5, 0xdd, 0x3b, 0xb4, 0x10, 0x73, 0x18, 0x15, - 0xf6, 0xe4, 0x8a, 0xbd, 0x4d, 0x22, 0x26, 0xec, 0x71, 0xa1, 0x5a, 0x09, 0x7b, 0xd8, 0x04, 0xe3, - 0x2c, 0x3e, 0xfa, 0x18, 0x4c, 0xd0, 0xc9, 0x09, 0xdb, 0x89, 0xf4, 0xd2, 0x19, 0x64, 0x5e, 0x3a, - 0xcc, 0xc9, 0x7b, 0xdd, 0x80, 0xe0, 0x0c, 0xa6, 0xfd, 0x16, 0x9c, 0xbc, 0x16, 0x3a, 0xee, 0x92, - 0xe3, 0x3b, 0x41, 0x83, 0x44, 0x6b, 0x41, 0x33, 0xd7, 0x03, 0x40, 0xbf, 0xa5, 0x2f, 0xe5, 0xdd, - 0xd2, 0xdb, 0x11, 0x20, 0xbd, 0x01, 0xe1, 0x5f, 0xf6, 0x26, 0x0c, 0x7b, 0xbc, 0x29, 0xb1, 0x6c, - 0x2f, 0xe4, 0x49, 0xd0, 0x1d, 0x7d, 0xd4, 0xfc, 0xa5, 0x78, 0x01, 0x96, 0x24, 0xa9, 0xbe, 0xd5, - 0x4d, 0xe4, 0xce, 0x57, 0x94, 0xed, 0xbf, 0x6a, 0xc1, 0xe4, 0x8d, 0x4c, 0x54, 0xf0, 0xd3, 0x30, - 0xc4, 0xb3, 0x54, 0x64, 0xad, 0x54, 0x75, 0x56, 0x8a, 0x05, 0xf4, 0xa1, 0x1b, 0x49, 0x7e, 0xb1, - 0x04, 0x15, 0xe6, 0xa9, 0xdc, 0xa2, 0xba, 0xd3, 0xd1, 0x8b, 0xa9, 0xd7, 0x0d, 0x31, 0x35, 0x47, - 0x51, 0x57, 0x1d, 0xeb, 0x25, 0xa5, 0xa2, 0x5b, 0x2a, 0x5a, 0xb6, 0x90, 0x8e, 0x9e, 0x12, 0xe4, - 0x11, 0x95, 0x13, 0x66, 0x70, 0xad, 0x8c, 0xa4, 0x65, 0xf7, 0xe6, 0x0a, 0xf7, 0x7d, 0x77, 0x6f, - 0xae, 0x7a, 0xd6, 0x83, 0x39, 0xd5, 0xb4, 0xce, 0x33, 0xf6, 0xfd, 0xb3, 0xcc, 0xff, 0xd4, 0xf1, - 0xbd, 0xcf, 0x12, 0x15, 0x74, 0x3e, 0x27, 0xfc, 0x49, 0x45, 0xe9, 0x3e, 0xe3, 0x33, 0xe2, 0x1f, - 0xcf, 0x29, 0x90, 0x56, 0xb1, 0xaf, 0xc0, 0x64, 0x66, 0xea, 0xd0, 0x4b, 0x30, 0xd8, 0xda, 0x74, - 0x62, 0x92, 0x71, 0x05, 0x1a, 0xac, 0xd1, 0xc2, 0xfd, 0xdd, 0xb9, 0x09, 0x55, 0x81, 0x95, 0x60, - 0x8e, 0x6d, 0x7f, 0xb1, 0x04, 0x03, 0x37, 0x42, 0xf7, 0x38, 0x96, 0xda, 0x15, 0x63, 0xa9, 0x3d, - 0x9d, 0x9f, 0x91, 0xa4, 0xe7, 0x2a, 0xab, 0x65, 0x56, 0xd9, 0xb9, 0x02, 0xb4, 0x0e, 0x5e, 0x60, - 0x5b, 0x30, 0xca, 0x32, 0x9e, 0x08, 0x5f, 0xa8, 0x17, 0x0c, 0xcd, 0x6a, 0x2e, 0xa3, 0x59, 0x4d, - 0x6a, 0xa8, 0x9a, 0x7e, 0xf5, 0x0c, 0x0c, 0x0b, 0xdf, 0x9b, 0xac, 0xf7, 0xad, 0xc0, 0xc5, 0x12, - 0x6e, 0xff, 0xf3, 0x32, 0x18, 0x19, 0x56, 0xd0, 0x6f, 0x59, 0x30, 0x1f, 0xf1, 0x48, 0x26, 0xb7, - 0xda, 0x8e, 0xbc, 0xa0, 0x59, 0x6f, 0x6c, 0x12, 0xb7, 0xed, 0x7b, 0x41, 0x73, 0xad, 0x19, 0x84, - 0xaa, 0x78, 0xe5, 0x01, 0x69, 0xb4, 0x99, 0xa9, 0xbb, 0x70, 0x62, 0x17, 0x75, 0xef, 0x7c, 0x71, - 0x6f, 0x77, 0x6e, 0x1e, 0xf7, 0xd5, 0x0a, 0xee, 0xb3, 0x57, 0xe8, 0x0f, 0x2d, 0x58, 0xe0, 0x39, - 0x46, 0x8a, 0x8f, 0xa4, 0x90, 0x46, 0x5a, 0x93, 0x44, 0x53, 0x72, 0xeb, 0x24, 0xda, 0x5a, 0x7a, - 0x59, 0x4c, 0xf2, 0x42, 0xad, 0xbf, 0x56, 0x71, 0xbf, 0xdd, 0xb4, 0xff, 0x75, 0x19, 0xc6, 0xe9, - 0x7c, 0xa6, 0x79, 0x05, 0x5e, 0x32, 0x96, 0xc9, 0x13, 0x99, 0x65, 0x72, 0xc2, 0x40, 0x7e, 0x38, - 0x29, 0x05, 0x62, 0x38, 0xe1, 0x3b, 0x71, 0x72, 0x85, 0x38, 0x51, 0x72, 0x97, 0x38, 0xec, 0x7a, - 0x37, 0xeb, 0x3a, 0x52, 0xe0, 0xc6, 0x58, 0xd9, 0xbe, 0xae, 0x65, 0x89, 0xe1, 0x4e, 0xfa, 0x68, - 0x1b, 0x10, 0xbb, 0x4a, 0x8e, 0x9c, 0x20, 0xe6, 0x63, 0xf1, 0x84, 0x69, 0xbc, 0xbf, 0x56, 0x67, - 0x45, 0xab, 0xe8, 0x5a, 0x07, 0x35, 0xdc, 0xa5, 0x05, 0xcd, 0x59, 0x60, 0xb0, 0xa8, 0xb3, 0xc0, - 0x50, 0x8e, 0xdb, 0xfb, 0x97, 0x2c, 0x38, 0x49, 0x3f, 0x8b, 0xe9, 0x22, 0x1d, 0xa3, 0x10, 0x26, - 0xe9, 0xb2, 0xf3, 0x49, 0x22, 0xcb, 0xc4, 0xfe, 0xca, 0x91, 0xac, 0x4d, 0x3a, 0xa9, 0xf8, 0x76, - 0xd5, 0x24, 0x86, 0xb3, 0xd4, 0xed, 0x6f, 0x5a, 0xc0, 0x9c, 0x16, 0x8f, 0xe1, 0x30, 0xbb, 0x6c, - 0x1e, 0x66, 0x76, 0x3e, 0xc7, 0xe8, 0x71, 0x8e, 0xbd, 0x08, 0x53, 0x14, 0x5a, 0x8b, 0xc2, 0x07, - 0x3b, 0x52, 0xd0, 0xce, 0xb7, 0x66, 0x7f, 0xa9, 0xc4, 0xb7, 0x8d, 0x0a, 0xc9, 0x44, 0x5f, 0xb6, - 0x60, 0xa4, 0xe1, 0xb4, 0x9c, 0x06, 0xcf, 0x4f, 0x55, 0xc0, 0x3a, 0x63, 0xd4, 0x9f, 0x5f, 0x16, - 0x75, 0xb9, 0x65, 0xe1, 0xc3, 0x72, 0xe8, 0xb2, 0x38, 0xd7, 0x9a, 0xa0, 0x1a, 0x9f, 0xbd, 0x07, - 0xe3, 0x06, 0xb1, 0x23, 0x55, 0x43, 0xbf, 0x6c, 0x71, 0xa6, 0xaf, 0x54, 0x85, 0xfb, 0x70, 0x22, - 0xd0, 0xfe, 0x53, 0x76, 0x26, 0x25, 0xe3, 0xf9, 0xe2, 0x6c, 0x9d, 0x71, 0x41, 0xcd, 0x41, 0x33, - 0x43, 0x10, 0x77, 0xb6, 0x61, 0xff, 0xb2, 0x05, 0x8f, 0xe8, 0x88, 0x5a, 0x0c, 0x6d, 0x9e, 0xdd, - 0xb8, 0x0a, 0x23, 0x61, 0x8b, 0x44, 0x4e, 0xaa, 0x16, 0x9d, 0x93, 0xf3, 0x7f, 0x53, 0x94, 0xef, - 0xef, 0xce, 0x4d, 0xeb, 0xd4, 0x65, 0x39, 0x56, 0x35, 0x91, 0x0d, 0x43, 0x6c, 0x5e, 0x62, 0x11, - 0xfd, 0xcc, 0xf2, 0x35, 0xb1, 0x7b, 0xa9, 0x18, 0x0b, 0x88, 0xfd, 0x37, 0x2c, 0xbe, 0xdc, 0xf4, - 0xae, 0xa3, 0xcf, 0xc1, 0xd4, 0x16, 0xd5, 0xa0, 0x56, 0x1e, 0xb4, 0x22, 0x6e, 0xf5, 0x96, 0x33, - 0xf6, 0x52, 0xf1, 0x19, 0xd3, 0x86, 0xbb, 0x34, 0x23, 0x7a, 0x3f, 0x75, 0x3d, 0x43, 0x16, 0x77, - 0x34, 0x64, 0xff, 0xfd, 0x12, 0xdf, 0xb3, 0x4c, 0x86, 0x7b, 0x06, 0x86, 0x5b, 0xa1, 0xbb, 0xbc, - 0x56, 0xc5, 0x62, 0xae, 0x14, 0xd3, 0xa9, 0xf1, 0x62, 0x2c, 0xe1, 0xe8, 0x22, 0x00, 0x79, 0x90, - 0x90, 0x28, 0x70, 0x7c, 0x75, 0x93, 0xae, 0x44, 0xa5, 0x15, 0x05, 0xc1, 0x1a, 0x16, 0xad, 0xd3, - 0x8a, 0xc2, 0x6d, 0xcf, 0x65, 0xc1, 0x1f, 0x65, 0xb3, 0x4e, 0x4d, 0x41, 0xb0, 0x86, 0x45, 0xf5, - 0xd6, 0x76, 0x10, 0xf3, 0x63, 0xcc, 0xb9, 0x2b, 0xd2, 0x0b, 0x8d, 0xa4, 0x7a, 0xeb, 0x2d, 0x1d, - 0x88, 0x4d, 0x5c, 0x74, 0x15, 0x86, 0x12, 0x87, 0xdd, 0x0f, 0x0f, 0x16, 0x71, 0xb6, 0x59, 0xa7, - 0xb8, 0x7a, 0x3e, 0x27, 0x5a, 0x15, 0x0b, 0x12, 0xf6, 0x7f, 0xaa, 0x00, 0xa4, 0x52, 0x17, 0xfa, - 0x62, 0xe7, 0x86, 0xff, 0x48, 0x51, 0x91, 0xed, 0xe1, 0xed, 0x76, 0xf4, 0x55, 0x0b, 0x46, 0x1d, - 0xdf, 0x0f, 0x1b, 0x4e, 0xc2, 0xa6, 0xa7, 0x54, 0x94, 0xf5, 0x88, 0x9e, 0x2c, 0xa6, 0x75, 0x79, - 0x67, 0x5e, 0x90, 0x77, 0xb6, 0x1a, 0x24, 0xb7, 0x3f, 0x7a, 0x17, 0xd0, 0x87, 0xa5, 0xd4, 0xce, - 0xbf, 0xf0, 0x6c, 0x56, 0x6a, 0xaf, 0x30, 0x86, 0xab, 0x09, 0xec, 0xe8, 0x2d, 0x23, 0x1d, 0xcf, - 0x40, 0x91, 0x08, 0x5e, 0x43, 0x0e, 0xc9, 0xcb, 0xc4, 0x83, 0xde, 0xd0, 0xbd, 0xd2, 0x07, 0x8b, - 0x84, 0xc8, 0x6b, 0xe2, 0x70, 0x8e, 0x47, 0x7a, 0x02, 0x93, 0xae, 0x79, 0xf2, 0x0a, 0xcf, 0xba, - 0x0b, 0xf9, 0x2d, 0x64, 0x8e, 0xec, 0xf4, 0xac, 0xcd, 0x00, 0x70, 0xb6, 0x09, 0xf4, 0x06, 0x8f, - 0x19, 0x58, 0x0b, 0x36, 0x42, 0xe1, 0x5d, 0x77, 0xbe, 0xc0, 0x37, 0xdf, 0x89, 0x13, 0xb2, 0x45, - 0xeb, 0xa4, 0x87, 0xeb, 0x0d, 0x41, 0x05, 0x2b, 0x7a, 0x68, 0x1d, 0x86, 0x58, 0xc0, 0x56, 0x3c, - 0x33, 0x52, 0xc4, 0x12, 0x67, 0xc6, 0x29, 0xa7, 0xfb, 0x87, 0xfd, 0x8d, 0xb1, 0xa0, 0x85, 0xae, - 0xc8, 0x4c, 0x05, 0xf1, 0x5a, 0x70, 0x2b, 0x26, 0x2c, 0x53, 0x41, 0x65, 0xe9, 0x43, 0x69, 0xea, - 0x01, 0x5e, 0xde, 0x35, 0x21, 0xa1, 0x51, 0x93, 0x0a, 0x36, 0xe2, 0xbf, 0xcc, 0x73, 0x38, 0x03, - 0x45, 0x3a, 0x6a, 0x66, 0x45, 0x4c, 0x27, 0xfb, 0xb6, 0x49, 0x0c, 0x67, 0xa9, 0x1f, 0xeb, 0x91, - 0x3a, 0x1b, 0xc0, 0x54, 0x76, 0x53, 0x1e, 0xe9, 0x11, 0xfe, 0xe3, 0x01, 0x98, 0x30, 0x17, 0x07, - 0x5a, 0x80, 0x8a, 0x20, 0xa2, 0xf2, 0x9e, 0xa9, 0x3d, 0x70, 0x5d, 0x02, 0x70, 0x8a, 0xc3, 0x32, - 0xc0, 0xb1, 0xea, 0x9a, 0x5f, 0x55, 0x9a, 0x01, 0x4e, 0x41, 0xb0, 0x86, 0x45, 0x25, 0xe1, 0xbb, - 0x61, 0x98, 0xa8, 0x93, 0x40, 0xad, 0x9b, 0x25, 0x56, 0x8a, 0x05, 0x94, 0x9e, 0x00, 0xf7, 0xe8, - 0xc7, 0xf4, 0x4d, 0xab, 0xa2, 0x3a, 0x01, 0xae, 0xea, 0x40, 0x6c, 0xe2, 0xd2, 0x13, 0x2d, 0x8c, - 0xd9, 0x42, 0x14, 0xf2, 0x76, 0xea, 0xa7, 0x56, 0xe7, 0x41, 0x8c, 0x12, 0x8e, 0x3e, 0x05, 0x8f, - 0xa8, 0x98, 0x43, 0xcc, 0xad, 0xb4, 0xb2, 0xc5, 0x21, 0x43, 0x65, 0x7e, 0x64, 0xb9, 0x3b, 0x1a, - 0xee, 0x55, 0x1f, 0xbd, 0x0a, 0x13, 0x42, 0x56, 0x96, 0x14, 0x87, 0x4d, 0x77, 0x83, 0xab, 0x06, - 0x14, 0x67, 0xb0, 0x51, 0x15, 0xa6, 0x68, 0x09, 0x13, 0x52, 0x25, 0x05, 0x1e, 0x3b, 0xa9, 0x8e, - 0xfa, 0xab, 0x19, 0x38, 0xee, 0xa8, 0x81, 0x16, 0x61, 0x92, 0x0b, 0x2b, 0x54, 0x31, 0x64, 0xdf, - 0x41, 0xb8, 0xc4, 0xaa, 0x8d, 0x70, 0xd3, 0x04, 0xe3, 0x2c, 0x3e, 0xba, 0x04, 0x63, 0x4e, 0xd4, - 0xd8, 0xf4, 0x12, 0xd2, 0x48, 0xda, 0x11, 0xcf, 0x03, 0xa2, 0xf9, 0x6b, 0x2c, 0x6a, 0x30, 0x6c, - 0x60, 0xda, 0x9f, 0x85, 0x93, 0x5d, 0xfc, 0xef, 0xe9, 0xc2, 0x71, 0x5a, 0x9e, 0x1c, 0x53, 0xc6, - 0xe3, 0x6c, 0xb1, 0xb6, 0x26, 0x47, 0xa3, 0x61, 0xd1, 0xd5, 0xc9, 0xcc, 0xd3, 0x5a, 0x5a, 0x52, - 0xb5, 0x3a, 0x57, 0x25, 0x00, 0xa7, 0x38, 0xf6, 0x9f, 0x55, 0x40, 0xb3, 0xde, 0x14, 0xf0, 0x32, - 0xba, 0x04, 0x63, 0x32, 0xd3, 0xae, 0x96, 0xe1, 0x52, 0x0d, 0xf3, 0xb2, 0x06, 0xc3, 0x06, 0x26, - 0xed, 0x5b, 0x20, 0x6d, 0x52, 0x59, 0xff, 0x36, 0x65, 0xac, 0xc2, 0x29, 0x0e, 0x3a, 0x0f, 0x23, - 0x31, 0xf1, 0x37, 0xae, 0x79, 0xc1, 0x3d, 0xb1, 0xb0, 0x15, 0x67, 0xae, 0x8b, 0x72, 0xac, 0x30, - 0xd0, 0x12, 0x94, 0xdb, 0x9e, 0x2b, 0x96, 0xb2, 0x14, 0x1b, 0xca, 0xb7, 0xd6, 0xaa, 0xfb, 0xbb, - 0x73, 0x4f, 0xf4, 0x4a, 0x60, 0x4c, 0xf5, 0xf3, 0x78, 0x9e, 0x6e, 0x3f, 0x5a, 0xb9, 0x9b, 0x9d, - 0x7e, 0xa8, 0x4f, 0x3b, 0xfd, 0x45, 0x00, 0x31, 0x6a, 0xb9, 0x96, 0xcb, 0xe9, 0x57, 0xbb, 0xac, - 0x20, 0x58, 0xc3, 0xa2, 0x5a, 0x7e, 0x23, 0x22, 0x8e, 0x54, 0x84, 0xb9, 0x5f, 0xf8, 0xc8, 0xe1, - 0xb5, 0xfc, 0xe5, 0x2c, 0x31, 0xdc, 0x49, 0x1f, 0x85, 0x70, 0xc2, 0x15, 0x81, 0xad, 0x69, 0xa3, - 0x95, 0xfe, 0x9d, 0xd1, 0x99, 0x4b, 0x4d, 0x96, 0x10, 0xee, 0xa4, 0x8d, 0x3e, 0x03, 0xb3, 0xb2, - 0xb0, 0x33, 0xaa, 0x98, 0x6d, 0x97, 0xf2, 0xd2, 0x99, 0xbd, 0xdd, 0xb9, 0xd9, 0x6a, 0x4f, 0x2c, - 0x7c, 0x00, 0x05, 0xf4, 0x26, 0x0c, 0xb1, 0x7b, 0x9d, 0x78, 0x66, 0x94, 0x9d, 0x78, 0x2f, 0x16, - 0x09, 0x69, 0xa0, 0xab, 0x7e, 0x9e, 0xdd, 0x0e, 0x09, 0x67, 0xdd, 0xf4, 0xb2, 0x8c, 0x15, 0x62, - 0x41, 0x13, 0xb5, 0x60, 0xd4, 0x09, 0x82, 0x30, 0x71, 0xb8, 0x20, 0x36, 0x56, 0x44, 0x96, 0xd4, - 0x9a, 0x58, 0x4c, 0xeb, 0xf2, 0x76, 0x94, 0xff, 0x9f, 0x06, 0xc1, 0x7a, 0x13, 0xe8, 0x3e, 0x4c, - 0x86, 0xf7, 0x29, 0xc3, 0x94, 0x57, 0x1b, 0xf1, 0xcc, 0xb8, 0x39, 0xb0, 0x1c, 0x43, 0xad, 0x51, - 0x59, 0xe3, 0x64, 0x26, 0x51, 0x9c, 0x6d, 0x05, 0xcd, 0x1b, 0xe6, 0xea, 0x89, 0xd4, 0x25, 0x3d, - 0x35, 0x57, 0xeb, 0xd6, 0x69, 0x16, 0xb9, 0xce, 0xdd, 0x50, 0x19, 0x47, 0x98, 0xcc, 0x44, 0xae, - 0xa7, 0x20, 0xac, 0xe3, 0xcd, 0x7e, 0x14, 0x46, 0xb5, 0x89, 0xef, 0xc7, 0xf7, 0x79, 0xf6, 0x55, - 0x98, 0xca, 0x4e, 0x68, 0x5f, 0xbe, 0xd3, 0xff, 0xab, 0x04, 0x93, 0x5d, 0xee, 0x8d, 0xee, 0x79, - 0xcc, 0x7f, 0xdf, 0x60, 0x7d, 0x57, 0xbd, 0xc0, 0xc5, 0x0c, 0x62, 0x32, 0xb0, 0x52, 0x01, 0x06, - 0x26, 0xb9, 0x69, 0xb9, 0x27, 0x37, 0x15, 0x4c, 0x6b, 0xe0, 0xbd, 0x30, 0x2d, 0xf3, 0x9c, 0x18, - 0x2c, 0x74, 0x4e, 0x3c, 0x04, 0x46, 0x67, 0x1c, 0x35, 0xc3, 0x05, 0x8e, 0x9a, 0x6f, 0x94, 0x60, - 0x2a, 0xf5, 0x13, 0x17, 0xe9, 0xb7, 0x8f, 0xfe, 0x1a, 0x62, 0xdd, 0xb8, 0x86, 0xc8, 0xcb, 0xae, - 0x9d, 0xe9, 0x5f, 0xcf, 0x2b, 0x89, 0x37, 0x33, 0x57, 0x12, 0x2f, 0xf6, 0x49, 0xf7, 0xe0, 0xeb, - 0x89, 0xef, 0x96, 0xe0, 0x54, 0xb6, 0xca, 0xb2, 0xef, 0x78, 0x5b, 0xc7, 0x30, 0x5f, 0x9f, 0x32, - 0xe6, 0xeb, 0xe5, 0xfe, 0xc6, 0xc5, 0x3a, 0xd9, 0x73, 0xd2, 0x9c, 0xcc, 0xa4, 0x7d, 0xf4, 0x30, - 0xc4, 0x0f, 0x9e, 0xb9, 0xdf, 0xb3, 0xe0, 0xd1, 0xae, 0xf5, 0x8e, 0xc1, 0xf0, 0xfa, 0xba, 0x69, - 0x78, 0x7d, 0xe1, 0x10, 0xa3, 0xeb, 0x61, 0x89, 0xfd, 0x95, 0x72, 0x8f, 0x51, 0x31, 0xd3, 0xd4, - 0x4d, 0x18, 0x75, 0x1a, 0x0d, 0x12, 0xc7, 0xd7, 0x43, 0x57, 0xe5, 0xc0, 0x7a, 0x9e, 0x9d, 0x2d, - 0x69, 0xf1, 0xfe, 0xee, 0xdc, 0x6c, 0x96, 0x44, 0x0a, 0xc6, 0x3a, 0x05, 0x33, 0x3b, 0x5f, 0xe9, - 0x88, 0xb2, 0xf3, 0x5d, 0x04, 0xd8, 0x56, 0x5a, 0x6c, 0xd6, 0xe2, 0xa5, 0xe9, 0xb7, 0x1a, 0x16, - 0xfa, 0x8b, 0x4c, 0x22, 0xe4, 0x4e, 0x1a, 0x03, 0x66, 0xc8, 0x69, 0xce, 0xf7, 0xd3, 0x1d, 0x3e, - 0x78, 0x64, 0xab, 0xb2, 0x0e, 0x2a, 0x92, 0xe8, 0x13, 0x30, 0x15, 0xf3, 0xfc, 0x09, 0xcb, 0xbe, - 0x13, 0xb3, 0x00, 0x09, 0xc1, 0x4f, 0x59, 0x90, 0x6a, 0x3d, 0x03, 0xc3, 0x1d, 0xd8, 0xf6, 0x77, - 0xca, 0xf0, 0xc1, 0x03, 0x96, 0x2d, 0x5a, 0x34, 0x6f, 0x6d, 0x9f, 0xcb, 0xda, 0x7f, 0x66, 0xbb, - 0x56, 0x36, 0x0c, 0x42, 0x99, 0xaf, 0x5d, 0x7a, 0xcf, 0x5f, 0xfb, 0x6b, 0xba, 0xb5, 0x8e, 0xfb, - 0x6d, 0x5e, 0x3e, 0xf4, 0xc6, 0xfc, 0x49, 0x35, 0xd6, 0x7f, 0xc1, 0x82, 0x27, 0xba, 0x0e, 0xcb, - 0xf0, 0x12, 0x59, 0x80, 0x4a, 0x83, 0x16, 0x6a, 0xe1, 0x4c, 0x69, 0x1c, 0xa1, 0x04, 0xe0, 0x14, - 0xc7, 0x70, 0x06, 0x29, 0xe5, 0x3a, 0x83, 0xfc, 0xb6, 0x05, 0xd3, 0xd9, 0x4e, 0x1c, 0x03, 0xdf, - 0xaa, 0x9b, 0x7c, 0x6b, 0xbe, 0xbf, 0x8f, 0xdf, 0x83, 0x65, 0xfd, 0xb7, 0x09, 0x38, 0xdd, 0x71, - 0xea, 0xf1, 0x59, 0xfc, 0x39, 0x0b, 0x4e, 0x34, 0x99, 0xf4, 0xae, 0xc5, 0x8c, 0x89, 0x71, 0xe5, - 0x04, 0xda, 0x1d, 0x18, 0x6a, 0xc6, 0x75, 0x91, 0x0e, 0x14, 0xdc, 0xd9, 0x18, 0xfa, 0x8a, 0x05, - 0xd3, 0xce, 0xfd, 0xb8, 0xe3, 0x71, 0x18, 0xb1, 0x90, 0x5e, 0xcd, 0x31, 0x96, 0xe5, 0x3c, 0x2b, - 0xb3, 0x34, 0xb3, 0xb7, 0x3b, 0x37, 0xdd, 0x0d, 0x0b, 0x77, 0x6d, 0x95, 0x7e, 0xdf, 0x4d, 0x11, - 0x3b, 0x52, 0x2c, 0xfa, 0xb1, 0x5b, 0xa4, 0x09, 0x67, 0x6b, 0x12, 0x82, 0x15, 0x45, 0xf4, 0x36, - 0x54, 0x9a, 0x32, 0x4c, 0x2c, 0xcb, 0x36, 0x7b, 0x4c, 0x73, 0xb7, 0xa8, 0x32, 0xee, 0xbb, 0xaf, - 0x40, 0x38, 0x25, 0x8a, 0xae, 0x40, 0x39, 0xd8, 0x88, 0x45, 0x40, 0x76, 0x9e, 0x0f, 0x90, 0xe9, - 0x79, 0xc5, 0x63, 0x58, 0x6f, 0xac, 0xd6, 0x31, 0x25, 0x41, 0x29, 0x45, 0x77, 0x5d, 0x61, 0x25, - 0xce, 0xa1, 0x84, 0x97, 0xaa, 0x9d, 0x94, 0xf0, 0x52, 0x15, 0x53, 0x12, 0xa8, 0x06, 0x83, 0x2c, - 0x32, 0x45, 0x98, 0x80, 0x73, 0xa2, 0xf6, 0x3b, 0xe2, 0x6f, 0x78, 0x12, 0x49, 0x56, 0x8c, 0x39, - 0x21, 0xb4, 0x0e, 0x43, 0x0d, 0xf6, 0x0e, 0x82, 0xd0, 0xcd, 0xf3, 0xf2, 0x59, 0x74, 0xbc, 0x99, - 0xc0, 0xef, 0xbd, 0x78, 0x39, 0x16, 0xb4, 0x18, 0x55, 0xd2, 0xda, 0xdc, 0x88, 0x85, 0xf2, 0x9d, - 0x47, 0xb5, 0xe3, 0x45, 0x0b, 0x41, 0x95, 0x95, 0x63, 0x41, 0x0b, 0x55, 0xa1, 0xb4, 0xd1, 0x10, - 0x81, 0x2b, 0x39, 0xa6, 0x5f, 0x33, 0x20, 0x79, 0x69, 0x68, 0x6f, 0x77, 0xae, 0xb4, 0xba, 0x8c, - 0x4b, 0x1b, 0x0d, 0xf4, 0x3a, 0x0c, 0x6f, 0xf0, 0x10, 0x53, 0x91, 0x77, 0xf6, 0x42, 0x5e, 0x1c, - 0x6c, 0x47, 0x3c, 0x2a, 0x8f, 0xcf, 0x10, 0x00, 0x2c, 0xc9, 0xb1, 0x94, 0x7c, 0x2a, 0x68, 0x56, - 0x24, 0x9e, 0x9d, 0xef, 0x2f, 0xc8, 0x56, 0xe8, 0xa4, 0xaa, 0x14, 0x6b, 0x14, 0xe9, 0x9a, 0x77, - 0xe4, 0x93, 0x2e, 0x2c, 0xe9, 0x6c, 0xee, 0x9a, 0xef, 0xfa, 0x02, 0x0c, 0x5f, 0xf3, 0x0a, 0x84, - 0x53, 0xa2, 0xa8, 0x0d, 0xe3, 0xdb, 0x71, 0x6b, 0x93, 0xc8, 0xad, 0xcf, 0x32, 0xd1, 0x8e, 0x5e, - 0xfc, 0x78, 0x4e, 0x7a, 0x61, 0x51, 0xc5, 0x8b, 0x92, 0xb6, 0xe3, 0x77, 0x70, 0x30, 0x96, 0x03, - 0xed, 0xb6, 0x4e, 0x16, 0x9b, 0xad, 0xd0, 0x4f, 0xf2, 0x6e, 0x3b, 0xbc, 0xbb, 0x93, 0x10, 0x91, - 0xa9, 0x36, 0xe7, 0x93, 0xbc, 0xc6, 0x91, 0x3b, 0x3f, 0x89, 0x00, 0x60, 0x49, 0x4e, 0x4d, 0x19, - 0xe3, 0xc6, 0x53, 0x85, 0xa7, 0xac, 0x63, 0x0c, 0xe9, 0x94, 0x31, 0xee, 0x9b, 0x12, 0x65, 0x5c, - 0xb7, 0xb5, 0x19, 0x26, 0x61, 0x90, 0xe1, 0xfd, 0x27, 0x8a, 0x70, 0xdd, 0x5a, 0x97, 0x9a, 0x9d, - 0x5c, 0xb7, 0x1b, 0x16, 0xee, 0xda, 0x2a, 0x0a, 0x60, 0xa2, 0x15, 0x46, 0xc9, 0xfd, 0x30, 0x92, - 0xeb, 0x10, 0x15, 0xd2, 0x11, 0x8d, 0x3a, 0xa2, 0x6d, 0xe6, 0x86, 0x6b, 0x42, 0x70, 0x86, 0x3a, - 0xfd, 0x74, 0x71, 0xc3, 0xf1, 0xc9, 0xda, 0xcd, 0x99, 0x93, 0x45, 0x3e, 0x5d, 0x9d, 0x23, 0x77, - 0x7e, 0x3a, 0x01, 0xc0, 0x92, 0x9c, 0xfd, 0xcb, 0x43, 0x9d, 0x82, 0x03, 0x53, 0x0d, 0xfe, 0x7a, - 0xe7, 0x4d, 0xec, 0x27, 0xfa, 0xd7, 0x80, 0x1f, 0xe2, 0x9d, 0xec, 0x57, 0x2c, 0x38, 0xdd, 0xea, - 0x2a, 0x16, 0x88, 0xa3, 0xb7, 0x5f, 0x45, 0x9a, 0x4f, 0x8b, 0x4a, 0x28, 0xdd, 0x1d, 0x8e, 0x7b, - 0xb4, 0x99, 0x15, 0xa6, 0xcb, 0xef, 0x59, 0x98, 0xbe, 0x03, 0x23, 0x4c, 0xfa, 0x4b, 0xd3, 0xc5, - 0xf4, 0x99, 0x59, 0x85, 0x1d, 0xe2, 0xcb, 0x82, 0x04, 0x56, 0xc4, 0xe8, 0xc4, 0x3d, 0x9e, 0x1d, - 0x04, 0x26, 0x0c, 0x2c, 0xd2, 0x18, 0x72, 0x4d, 0x65, 0x55, 0xcc, 0xc4, 0xe3, 0xb5, 0x83, 0x90, - 0xf7, 0xf3, 0x10, 0xf0, 0xc1, 0x8d, 0xa1, 0x6a, 0x17, 0x55, 0x69, 0xc8, 0xbc, 0x76, 0xc9, 0x57, - 0x97, 0x8e, 0x57, 0xc4, 0xff, 0x07, 0x56, 0x17, 0x89, 0x94, 0xab, 0x65, 0x1f, 0x37, 0xd5, 0xb2, - 0xa7, 0xb3, 0x6a, 0x59, 0x87, 0x31, 0xc6, 0xd0, 0xc8, 0x8a, 0xa7, 0x61, 0x2d, 0x9a, 0x0f, 0xc7, - 0xf6, 0xe1, 0x6c, 0x1e, 0xbb, 0x63, 0xae, 0x58, 0xae, 0xba, 0x84, 0x4c, 0x5d, 0xb1, 0xdc, 0xb5, - 0x2a, 0x66, 0x90, 0xa2, 0x29, 0x15, 0xec, 0x9f, 0x2f, 0x41, 0xb9, 0x16, 0xba, 0xc7, 0x60, 0x5c, - 0xba, 0x6c, 0x18, 0x97, 0x9e, 0xca, 0x7d, 0xe2, 0xaf, 0xa7, 0x29, 0xe9, 0x66, 0xc6, 0x94, 0xf4, - 0x33, 0xf9, 0xa4, 0x0e, 0x36, 0x1c, 0x7d, 0xaf, 0x0c, 0xfa, 0x23, 0x85, 0xe8, 0x3f, 0x1c, 0xc6, - 0x43, 0xb7, 0x5c, 0xec, 0xdd, 0x42, 0xd1, 0x06, 0xf3, 0xe4, 0x92, 0x71, 0x7d, 0x3f, 0xb1, 0x8e, - 0xba, 0x77, 0x88, 0xd7, 0xdc, 0x4c, 0x88, 0x9b, 0x1d, 0xd8, 0xf1, 0x39, 0xea, 0xfe, 0xa9, 0x05, - 0x93, 0x99, 0xd6, 0x91, 0xdf, 0x2d, 0x20, 0xe8, 0x90, 0xe6, 0xa2, 0x13, 0xb9, 0x11, 0x44, 0xf3, - 0x00, 0xca, 0xea, 0x2f, 0x4d, 0x32, 0x4c, 0x3a, 0x55, 0xd7, 0x02, 0x31, 0xd6, 0x30, 0xd0, 0x4b, - 0x30, 0x9a, 0x84, 0xad, 0xd0, 0x0f, 0x9b, 0x3b, 0x57, 0x89, 0x4c, 0xf6, 0xa1, 0x6e, 0x4c, 0xd6, - 0x53, 0x10, 0xd6, 0xf1, 0xec, 0xef, 0x97, 0x21, 0xfb, 0xc4, 0xe5, 0xff, 0x5f, 0xa7, 0x3f, 0x39, - 0xeb, 0xf4, 0x0f, 0x2c, 0x98, 0xa2, 0xad, 0x33, 0xd7, 0x19, 0xe9, 0x50, 0xab, 0xde, 0x84, 0xb0, - 0x0e, 0x78, 0x13, 0xe2, 0x69, 0xca, 0xed, 0xdc, 0xb0, 0x9d, 0x08, 0x23, 0x92, 0xc6, 0xc4, 0x68, - 0x29, 0x16, 0x50, 0x81, 0x47, 0xa2, 0x48, 0x44, 0x1e, 0xe9, 0x78, 0x24, 0x8a, 0xb0, 0x80, 0xca, - 0x27, 0x23, 0x06, 0x7a, 0x3c, 0x19, 0xc1, 0xd2, 0x65, 0x09, 0x77, 0x0d, 0x21, 0x56, 0x68, 0xe9, - 0xb2, 0xa4, 0x1f, 0x47, 0x8a, 0x63, 0x7f, 0xab, 0x0c, 0x63, 0xb5, 0xd0, 0x4d, 0x3d, 0xe5, 0x5f, - 0x34, 0x3c, 0xe5, 0xcf, 0x66, 0x3c, 0xe5, 0xa7, 0x74, 0xdc, 0x87, 0xe3, 0x28, 0x2f, 0xd2, 0xaa, - 0xb1, 0x47, 0x4d, 0x0e, 0xe9, 0x24, 0x6f, 0xa4, 0x55, 0x53, 0x84, 0xb0, 0x49, 0xf7, 0xa7, 0xc9, - 0x39, 0xfe, 0xff, 0x58, 0x30, 0x51, 0x0b, 0x5d, 0xba, 0x40, 0x7f, 0x9a, 0x56, 0xa3, 0x9e, 0x8c, - 0x6d, 0xe8, 0x80, 0x64, 0x6c, 0xbf, 0x6a, 0xc1, 0x70, 0x2d, 0x74, 0x8f, 0xc1, 0xc0, 0xba, 0x6a, - 0x1a, 0x58, 0x9f, 0xc8, 0xe5, 0xbc, 0x3d, 0x6c, 0xaa, 0xdf, 0x29, 0xc3, 0x38, 0xed, 0x71, 0xd8, - 0x94, 0xdf, 0xcb, 0x98, 0x1b, 0xab, 0xc0, 0xdc, 0x50, 0x91, 0x30, 0xf4, 0xfd, 0xf0, 0x7e, 0xf6, - 0xdb, 0xad, 0xb2, 0x52, 0x2c, 0xa0, 0xe8, 0x3c, 0x8c, 0xb4, 0x22, 0xb2, 0xed, 0x85, 0xed, 0x38, - 0x1b, 0xc5, 0x58, 0x13, 0xe5, 0x58, 0x61, 0xa0, 0x17, 0x61, 0x2c, 0xf6, 0x82, 0x06, 0x91, 0xce, - 0x1c, 0x03, 0xcc, 0x99, 0x83, 0xe7, 0xbd, 0xd4, 0xca, 0xb1, 0x81, 0x85, 0xee, 0x40, 0x85, 0xfd, - 0x67, 0x3b, 0xa8, 0xff, 0x37, 0x1f, 0x78, 0x6e, 0x15, 0x49, 0x00, 0xa7, 0xb4, 0xd0, 0x45, 0x80, - 0x44, 0xba, 0x9d, 0xc4, 0x22, 0xb9, 0x8c, 0x92, 0x4b, 0x95, 0x43, 0x4a, 0x8c, 0x35, 0x2c, 0xf4, - 0x1c, 0x54, 0x12, 0xc7, 0xf3, 0xaf, 0x79, 0x01, 0x89, 0x85, 0xdb, 0x8e, 0xc8, 0x61, 0x2d, 0x0a, - 0x71, 0x0a, 0xa7, 0xe7, 0x3d, 0x8b, 0xa1, 0xe6, 0xef, 0xc9, 0x8c, 0x30, 0x6c, 0x76, 0xde, 0x5f, - 0x53, 0xa5, 0x58, 0xc3, 0xb0, 0x2f, 0xc1, 0xa9, 0x5a, 0xe8, 0xd6, 0xc2, 0x28, 0x59, 0x0d, 0xa3, - 0xfb, 0x4e, 0xe4, 0xca, 0xef, 0x37, 0x27, 0x53, 0x27, 0xd3, 0x33, 0x79, 0x90, 0xdb, 0x1c, 0x8d, - 0x54, 0xc8, 0x2f, 0xb0, 0x13, 0xbf, 0xcf, 0x10, 0x8c, 0xdf, 0x2f, 0x03, 0xaa, 0x31, 0xc7, 0x18, - 0xe3, 0xf9, 0xa1, 0x4d, 0x98, 0x88, 0xc9, 0x35, 0x2f, 0x68, 0x3f, 0x10, 0xa4, 0x8a, 0xc5, 0xbc, - 0xd4, 0x57, 0xf4, 0x3a, 0xdc, 0xd2, 0x61, 0x96, 0xe1, 0x0c, 0x5d, 0xfa, 0x65, 0xa3, 0x76, 0xb0, - 0x18, 0xdf, 0x8a, 0x49, 0x24, 0x9e, 0xdb, 0xf9, 0x28, 0xbb, 0x08, 0x94, 0x85, 0xfb, 0xbb, 0x73, - 0xe7, 0x72, 0xdc, 0x1b, 0x02, 0xef, 0x01, 0xc5, 0x5c, 0xab, 0xe2, 0x94, 0x16, 0x5d, 0x68, 0xec, - 0xcf, 0x8d, 0x30, 0xc0, 0x61, 0x98, 0xc8, 0xa5, 0xc9, 0x9e, 0x6a, 0xd0, 0xca, 0xb1, 0x81, 0x85, - 0x62, 0x40, 0x71, 0xbb, 0xd5, 0xf2, 0xd9, 0xbd, 0xa4, 0xe3, 0x5f, 0x8e, 0xc2, 0x76, 0x8b, 0xfb, - 0x52, 0x97, 0x97, 0x96, 0x29, 0x0f, 0xae, 0x77, 0x40, 0xf7, 0x77, 0xe7, 0x9e, 0xc9, 0xef, 0x20, - 0xc3, 0x5d, 0xab, 0xe2, 0x2e, 0xe4, 0x11, 0x86, 0xe1, 0x8d, 0x98, 0xfd, 0x16, 0x91, 0xda, 0x97, - 0x98, 0x21, 0xb4, 0xce, 0x8a, 0xfa, 0x23, 0x2f, 0x09, 0xd9, 0x9f, 0x67, 0xc7, 0x2c, 0x7b, 0x8d, - 0x25, 0x69, 0x47, 0x04, 0x6d, 0xc1, 0x78, 0x8b, 0x1d, 0xa5, 0x49, 0x14, 0xfa, 0x3e, 0x91, 0x52, - 0xee, 0xe1, 0x1c, 0x84, 0xf8, 0xfb, 0x0b, 0x3a, 0x39, 0x6c, 0x52, 0xb7, 0xff, 0xfb, 0x04, 0xe3, - 0x98, 0xe2, 0xd2, 0x79, 0x58, 0xb8, 0x02, 0x0b, 0x79, 0xf2, 0x43, 0x45, 0xde, 0x55, 0x4b, 0x4f, - 0x23, 0xe1, 0x58, 0x8c, 0x25, 0x15, 0xf4, 0x69, 0xe6, 0xe8, 0xce, 0xd9, 0x54, 0xf1, 0xd7, 0x22, - 0x39, 0xbe, 0xe1, 0xe4, 0x2e, 0x48, 0x60, 0x8d, 0x1c, 0xba, 0x06, 0xe3, 0xe2, 0xf1, 0x0e, 0x61, - 0x2c, 0x29, 0x1b, 0x8a, 0xfe, 0x38, 0xd6, 0x81, 0xfb, 0xd9, 0x02, 0x6c, 0x56, 0x46, 0x4d, 0x78, - 0x5c, 0x7b, 0x9c, 0xaa, 0x8b, 0x33, 0x1b, 0xe7, 0x7f, 0x4f, 0xec, 0xed, 0xce, 0x3d, 0xbe, 0x7e, - 0x10, 0x22, 0x3e, 0x98, 0x0e, 0xba, 0x09, 0xa7, 0x9c, 0x46, 0xe2, 0x6d, 0x93, 0x2a, 0x71, 0x5c, - 0xdf, 0x0b, 0x88, 0x19, 0xfb, 0xff, 0xe8, 0xde, 0xee, 0xdc, 0xa9, 0xc5, 0x6e, 0x08, 0xb8, 0x7b, - 0x3d, 0xf4, 0x71, 0xa8, 0xb8, 0x41, 0x2c, 0xe6, 0x60, 0xc8, 0x78, 0x8b, 0xad, 0x52, 0xbd, 0x51, - 0x57, 0xe3, 0x4f, 0xff, 0xe0, 0xb4, 0x02, 0x7a, 0x17, 0xc6, 0xf4, 0xe0, 0x22, 0xf1, 0x06, 0xe0, - 0xcb, 0x85, 0xb4, 0x78, 0x23, 0x22, 0x87, 0xdb, 0x11, 0x95, 0xd3, 0xa8, 0x11, 0xac, 0x63, 0x34, - 0x81, 0x3e, 0x09, 0x28, 0x26, 0xd1, 0xb6, 0xd7, 0x20, 0x8b, 0x0d, 0x96, 0xb2, 0x96, 0x59, 0x9a, - 0x46, 0x8c, 0xe8, 0x09, 0x54, 0xef, 0xc0, 0xc0, 0x5d, 0x6a, 0xa1, 0x2b, 0x94, 0xff, 0xe9, 0xa5, - 0xc2, 0xc7, 0x57, 0x8a, 0xa7, 0x33, 0x55, 0xd2, 0x8a, 0x48, 0xc3, 0x49, 0x88, 0x6b, 0x52, 0xc4, - 0x99, 0x7a, 0xf4, 0x74, 0x54, 0xaf, 0x12, 0x80, 0xe9, 0x99, 0xda, 0xf9, 0x32, 0x01, 0xd5, 0xf6, - 0x36, 0xc3, 0x38, 0xb9, 0x41, 0x92, 0xfb, 0x61, 0x74, 0x4f, 0xa4, 0xf9, 0x4a, 0xf3, 0xff, 0xa5, - 0x20, 0xac, 0xe3, 0x51, 0x49, 0x8e, 0x5d, 0xe1, 0xad, 0x55, 0xd9, 0xfd, 0xc8, 0x48, 0xba, 0x77, - 0xae, 0xf0, 0x62, 0x2c, 0xe1, 0x12, 0x75, 0xad, 0xb6, 0xcc, 0xee, 0x3a, 0x32, 0xa8, 0x6b, 0xb5, - 0x65, 0x2c, 0xe1, 0x28, 0xec, 0x7c, 0xf1, 0x6e, 0xa2, 0xc8, 0xbd, 0x53, 0xe7, 0x79, 0x52, 0xf0, - 0xd1, 0xbb, 0x07, 0x30, 0xa5, 0x5e, 0xdd, 0xe3, 0x99, 0xd0, 0xe2, 0x99, 0x49, 0xb6, 0x70, 0x0e, - 0x93, 0x50, 0x4d, 0x59, 0x17, 0xd7, 0x32, 0x34, 0x71, 0x47, 0x2b, 0x46, 0x0e, 0x8b, 0xa9, 0xdc, - 0x97, 0x26, 0x16, 0xa0, 0x12, 0xb7, 0xef, 0xba, 0xe1, 0x96, 0xe3, 0x05, 0xec, 0x42, 0x42, 0x7f, - 0xb7, 0x5f, 0x02, 0x70, 0x8a, 0x83, 0x6a, 0x30, 0xe2, 0x08, 0x45, 0x52, 0x5c, 0x1c, 0xe4, 0xc4, - 0xb8, 0x4b, 0xb5, 0x93, 0xdb, 0x78, 0xe5, 0x3f, 0xac, 0xa8, 0xa0, 0x57, 0x60, 0x5c, 0x84, 0x68, - 0x09, 0x57, 0xca, 0x93, 0xa6, 0x3b, 0x7f, 0x5d, 0x07, 0x62, 0x13, 0x17, 0x35, 0x61, 0x82, 0x52, - 0x49, 0x19, 0xe0, 0xcc, 0x74, 0x7f, 0x3c, 0x54, 0xcb, 0xe9, 0xad, 0x93, 0xc1, 0x19, 0xb2, 0xc8, - 0x85, 0xc7, 0x9c, 0x76, 0x12, 0x6e, 0xd1, 0x9d, 0x60, 0xee, 0x93, 0xf5, 0xf0, 0x1e, 0x09, 0x66, - 0x4e, 0xb1, 0x15, 0x78, 0x76, 0x6f, 0x77, 0xee, 0xb1, 0xc5, 0x03, 0xf0, 0xf0, 0x81, 0x54, 0xd0, - 0x5b, 0x30, 0x9a, 0x84, 0xbe, 0xf0, 0x90, 0x8e, 0x67, 0x4e, 0x17, 0xc9, 0xac, 0xb3, 0xae, 0x2a, - 0xe8, 0xc6, 0x14, 0x45, 0x04, 0xeb, 0x14, 0xd1, 0xdb, 0x30, 0x46, 0xbf, 0xfd, 0x75, 0xa7, 0xd5, - 0xf2, 0x82, 0x66, 0x3c, 0xf3, 0x48, 0x91, 0xd9, 0x52, 0x79, 0x23, 0xcd, 0xfd, 0xcb, 0x8a, 0x48, - 0x8c, 0x0d, 0x8a, 0xb3, 0x3f, 0x0b, 0x27, 0x3a, 0x98, 0x5e, 0x5f, 0x6e, 0xaa, 0xff, 0x71, 0x10, - 0x2a, 0xca, 0x72, 0x89, 0x16, 0x4c, 0x23, 0xf5, 0xa3, 0x59, 0x23, 0xf5, 0x08, 0x15, 0x14, 0x75, - 0xbb, 0xf4, 0x67, 0xba, 0xbc, 0xe4, 0xfe, 0x6c, 0xee, 0x2e, 0x2f, 0x1e, 0x39, 0xd6, 0xc7, 0x7b, - 0xf7, 0xa9, 0xf6, 0x3a, 0x70, 0xa0, 0xf6, 0x5a, 0xf0, 0x75, 0x42, 0xaa, 0xa7, 0xb6, 0x42, 0x77, - 0xad, 0x96, 0x7d, 0x7c, 0xab, 0x46, 0x0b, 0x31, 0x87, 0x31, 0xfd, 0x82, 0x9e, 0xda, 0x4c, 0xbf, - 0x18, 0x3e, 0xa4, 0x7e, 0x21, 0x09, 0xe0, 0x94, 0x16, 0xda, 0x86, 0x13, 0x0d, 0xf3, 0x2d, 0x35, - 0x15, 0x0f, 0xf6, 0x7c, 0x1f, 0x6f, 0x99, 0xb5, 0xb5, 0x87, 0x56, 0x96, 0xb3, 0xf4, 0x70, 0x67, - 0x13, 0xe8, 0x15, 0x18, 0x79, 0x37, 0x8c, 0xd9, 0xf5, 0x89, 0x38, 0xba, 0x64, 0xdc, 0xcd, 0xc8, - 0x6b, 0x37, 0xeb, 0xac, 0x7c, 0x7f, 0x77, 0x6e, 0xb4, 0x16, 0xba, 0xf2, 0x2f, 0x56, 0x15, 0xd0, - 0x17, 0x2c, 0x38, 0x65, 0xec, 0x64, 0xd5, 0x73, 0x38, 0x4c, 0xcf, 0x1f, 0x17, 0x2d, 0x9f, 0x5a, - 0xeb, 0x46, 0x13, 0x77, 0x6f, 0xca, 0xfe, 0xb7, 0xdc, 0x54, 0x2b, 0x8c, 0x37, 0x24, 0x6e, 0xfb, - 0xc7, 0xf1, 0xe8, 0xc1, 0x4d, 0xc3, 0xae, 0xf4, 0x10, 0x2e, 0x0b, 0xfe, 0xbd, 0xc5, 0x2e, 0x0b, - 0xd6, 0xc9, 0x56, 0xcb, 0x77, 0x92, 0xe3, 0xf0, 0x62, 0xfe, 0x34, 0x8c, 0x24, 0xa2, 0xb5, 0x62, - 0x2f, 0x36, 0x68, 0xdd, 0x63, 0x97, 0x28, 0xea, 0xe8, 0x93, 0xa5, 0x58, 0x11, 0xb4, 0xff, 0x25, - 0xff, 0x2a, 0x12, 0x72, 0x0c, 0x16, 0x91, 0x1b, 0xa6, 0x45, 0xe4, 0x99, 0xc2, 0x63, 0xe9, 0x61, - 0x19, 0xf9, 0xbe, 0x39, 0x02, 0xa6, 0xa1, 0xfc, 0xe4, 0xdc, 0x66, 0xd9, 0xbf, 0x64, 0xc1, 0x74, - 0x37, 0xb7, 0x02, 0x2a, 0xc2, 0x70, 0xfd, 0x48, 0xdd, 0xf3, 0xa9, 0x59, 0xbd, 0x2d, 0xca, 0xb1, - 0xc2, 0x28, 0x9c, 0x42, 0xbd, 0xbf, 0x14, 0x55, 0x37, 0xc1, 0x7c, 0x95, 0x0f, 0xbd, 0xca, 0x83, - 0x16, 0x2c, 0xf5, 0x6c, 0x5e, 0x7f, 0x01, 0x0b, 0xf6, 0xb7, 0x4b, 0x30, 0xcd, 0x8d, 0xed, 0x8b, - 0xdb, 0xa1, 0xe7, 0xd6, 0x42, 0x57, 0x84, 0x70, 0xb8, 0x30, 0xd6, 0xd2, 0xd4, 0xdb, 0x62, 0x29, - 0x6f, 0x74, 0x85, 0x38, 0x55, 0x29, 0xf4, 0x52, 0x6c, 0x50, 0xa5, 0xad, 0x90, 0x6d, 0xaf, 0xa1, - 0x6c, 0xb7, 0xa5, 0xbe, 0x4f, 0x06, 0xd5, 0xca, 0x8a, 0x46, 0x07, 0x1b, 0x54, 0x8f, 0xe0, 0xe5, - 0x13, 0xfb, 0xef, 0x59, 0xf0, 0x48, 0x8f, 0xb4, 0x38, 0xb4, 0xb9, 0xfb, 0xec, 0x82, 0x43, 0x3c, - 0xfb, 0xa8, 0x9a, 0xe3, 0xd7, 0x1e, 0x58, 0x40, 0xd1, 0x5d, 0x00, 0x7e, 0x6d, 0x41, 0xa5, 0xe9, - 0xec, 0x9d, 0x7a, 0xc1, 0xe4, 0x13, 0x5a, 0x5e, 0x02, 0xf5, 0xec, 0xbf, 0x46, 0xd5, 0xfe, 0x66, - 0x19, 0x06, 0xf9, 0xeb, 0xe2, 0x35, 0x18, 0xde, 0xe4, 0x69, 0x7a, 0xfb, 0xcb, 0x12, 0x9c, 0xaa, - 0x2f, 0xbc, 0x00, 0x4b, 0x32, 0xe8, 0x3a, 0x9c, 0xa4, 0x27, 0x8b, 0xe7, 0xf8, 0x55, 0xe2, 0x3b, - 0x3b, 0x52, 0x1f, 0xe6, 0xcf, 0x61, 0xc8, 0xbc, 0xed, 0x27, 0xd7, 0x3a, 0x51, 0x70, 0xb7, 0x7a, - 0xe8, 0xd5, 0x8e, 0xac, 0x7a, 0x3c, 0xfd, 0xb1, 0x92, 0x85, 0x0f, 0xce, 0xac, 0x47, 0x25, 0xf6, - 0x56, 0x87, 0xe6, 0xaf, 0x3d, 0xe2, 0x6c, 0x6a, 0xfb, 0x26, 0x2e, 0xf3, 0xa1, 0x68, 0x33, 0xdf, - 0x91, 0xf5, 0xcd, 0x88, 0xc4, 0x9b, 0xa1, 0xef, 0x8a, 0xf7, 0x47, 0x53, 0x1f, 0x8a, 0x0c, 0x1c, - 0x77, 0xd4, 0xa0, 0x54, 0x36, 0x1c, 0xcf, 0x6f, 0x47, 0x24, 0xa5, 0x32, 0x64, 0x52, 0x59, 0xcd, - 0xc0, 0x71, 0x47, 0x0d, 0xba, 0xb6, 0x4e, 0x89, 0x27, 0x2b, 0x65, 0x10, 0xb8, 0x60, 0x41, 0x9f, - 0x82, 0x61, 0x19, 0x0a, 0x50, 0x28, 0x57, 0x89, 0x70, 0x90, 0x50, 0xcf, 0x5f, 0x6a, 0xcf, 0xa3, - 0x89, 0x20, 0x00, 0x49, 0xef, 0x30, 0x4f, 0x23, 0xfe, 0x89, 0x05, 0x27, 0xbb, 0xb8, 0xb4, 0x71, - 0x96, 0xd6, 0xf4, 0xe2, 0x44, 0x3d, 0xce, 0xa0, 0xb1, 0x34, 0x5e, 0x8e, 0x15, 0x06, 0xdd, 0x2d, - 0x9c, 0x69, 0x66, 0x19, 0xa5, 0x70, 0x75, 0x11, 0xd0, 0xfe, 0x18, 0x25, 0x3a, 0x0b, 0x03, 0xed, - 0x98, 0x44, 0xf2, 0x9d, 0x42, 0xc9, 0xe7, 0x6f, 0xc5, 0x24, 0xc2, 0x0c, 0x42, 0xc5, 0xd6, 0xa6, - 0xb2, 0x08, 0x6a, 0x62, 0x2b, 0xb3, 0xee, 0x61, 0x0e, 0xb3, 0xbf, 0x56, 0x86, 0xc9, 0x8c, 0x6b, - 0x2b, 0xed, 0xc8, 0x56, 0x18, 0x78, 0x49, 0xa8, 0xf2, 0xc7, 0xf1, 0xa7, 0xd1, 0x48, 0x6b, 0xf3, - 0xba, 0x28, 0xc7, 0x0a, 0x03, 0x3d, 0x2d, 0x9f, 0xa6, 0xcd, 0x3e, 0x3a, 0xb1, 0x54, 0x35, 0x5e, - 0xa7, 0x2d, 0xfa, 0x60, 0xcc, 0x93, 0x30, 0xd0, 0x0a, 0xd5, 0x4b, 0xe3, 0xea, 0x7b, 0xe2, 0xa5, - 0x6a, 0x2d, 0x0c, 0x7d, 0xcc, 0x80, 0xe8, 0x29, 0x31, 0xfa, 0xcc, 0x0d, 0x0d, 0x76, 0xdc, 0x30, - 0xd6, 0xa6, 0xe0, 0x19, 0x18, 0xbe, 0x47, 0x76, 0x22, 0x2f, 0x68, 0x66, 0xef, 0xa7, 0xae, 0xf2, - 0x62, 0x2c, 0xe1, 0x66, 0x0e, 0xf6, 0xe1, 0x23, 0x7e, 0x14, 0x66, 0x24, 0xf7, 0x1c, 0xfc, 0x8e, - 0x05, 0x93, 0x2c, 0xa9, 0xaa, 0x48, 0x41, 0xe0, 0x85, 0xc1, 0x31, 0xc8, 0x18, 0x4f, 0xc2, 0x60, - 0x44, 0x1b, 0xcd, 0xbe, 0xea, 0xc0, 0x7a, 0x82, 0x39, 0x0c, 0x3d, 0x06, 0x03, 0xac, 0x0b, 0xf4, - 0x33, 0x8e, 0xf1, 0xdc, 0xed, 0x55, 0x27, 0x71, 0x30, 0x2b, 0x65, 0xd1, 0x64, 0x98, 0xb4, 0x7c, - 0x8f, 0x77, 0x3a, 0x35, 0xe8, 0xbe, 0xdf, 0xa2, 0xc9, 0xba, 0x76, 0xf2, 0x61, 0x45, 0x93, 0x75, - 0x27, 0x7e, 0xb0, 0x9c, 0xff, 0x3f, 0x4a, 0x70, 0xa6, 0x6b, 0xbd, 0xf4, 0xa6, 0x7b, 0xd5, 0xb8, - 0xe9, 0xbe, 0x98, 0xb9, 0xe9, 0xb6, 0x0f, 0xae, 0xfd, 0x70, 0xee, 0xbe, 0xbb, 0x5f, 0x49, 0x97, - 0x8f, 0xf1, 0x4a, 0x7a, 0xa0, 0xa8, 0x88, 0x33, 0x98, 0x23, 0xe2, 0xfc, 0x9e, 0x05, 0x8f, 0x76, - 0x9d, 0xb2, 0xf7, 0x5d, 0xf8, 0x5e, 0xd7, 0x5e, 0xf6, 0xd0, 0x4e, 0x7e, 0xb1, 0xdc, 0x63, 0x54, - 0x4c, 0x4f, 0x39, 0x47, 0xb9, 0x10, 0x03, 0xc6, 0x42, 0x78, 0x1b, 0xe3, 0x1c, 0x88, 0x97, 0x61, - 0x05, 0x45, 0xb1, 0x16, 0xfe, 0xc6, 0x3b, 0xb9, 0x72, 0xc8, 0x0d, 0x35, 0x6f, 0x5a, 0xe2, 0xf5, - 0xbc, 0x0a, 0xd9, 0xa0, 0xb8, 0x3b, 0x9a, 0xe6, 0x59, 0x3e, 0x8c, 0xe6, 0x39, 0xd6, 0x5d, 0xeb, - 0x44, 0x8b, 0x30, 0xb9, 0xe5, 0x05, 0xec, 0x2d, 0x59, 0x53, 0x7a, 0x52, 0x31, 0xc8, 0xd7, 0x4d, - 0x30, 0xce, 0xe2, 0xcf, 0xbe, 0x02, 0xe3, 0x87, 0xb7, 0xae, 0xfd, 0xa8, 0x0c, 0x1f, 0x3c, 0x80, - 0x29, 0xf0, 0xd3, 0xc1, 0xf8, 0x2e, 0xda, 0xe9, 0xd0, 0xf1, 0x6d, 0x6a, 0x30, 0xbd, 0xd1, 0xf6, - 0xfd, 0x1d, 0xe6, 0x27, 0x46, 0x5c, 0x89, 0x21, 0x84, 0x1a, 0xf5, 0x68, 0xfd, 0x6a, 0x17, 0x1c, - 0xdc, 0xb5, 0x26, 0xfa, 0x24, 0xa0, 0xf0, 0x2e, 0x4b, 0x3b, 0xec, 0xa6, 0x79, 0x23, 0xd8, 0x27, - 0x28, 0xa7, 0x5b, 0xf5, 0x66, 0x07, 0x06, 0xee, 0x52, 0x8b, 0xca, 0xa9, 0xec, 0xbd, 0x7b, 0xd5, - 0xad, 0x8c, 0x9c, 0x8a, 0x75, 0x20, 0x36, 0x71, 0xd1, 0x65, 0x38, 0xe1, 0x6c, 0x3b, 0x1e, 0x4f, - 0x23, 0x26, 0x09, 0x70, 0x41, 0x55, 0xd9, 0xaf, 0x16, 0xb3, 0x08, 0xb8, 0xb3, 0x0e, 0x6a, 0x19, - 0x06, 0x49, 0xfe, 0xe0, 0xc0, 0xc7, 0x0f, 0xb1, 0x82, 0x0b, 0x9b, 0x28, 0xed, 0xff, 0x62, 0xd1, - 0xa3, 0xaf, 0xcb, 0xb3, 0xa3, 0x74, 0x46, 0x94, 0x81, 0x4d, 0x0b, 0xe7, 0x53, 0x33, 0xb2, 0xac, - 0x03, 0xb1, 0x89, 0xcb, 0x97, 0x46, 0x9c, 0xba, 0xad, 0x1b, 0xd2, 0xa6, 0x88, 0x84, 0x55, 0x18, - 0x54, 0x82, 0x76, 0xbd, 0x6d, 0x2f, 0x0e, 0x23, 0xb1, 0x81, 0xfa, 0x74, 0x62, 0x4e, 0xf9, 0x65, - 0x95, 0x93, 0xc1, 0x92, 0x9e, 0xfd, 0xf5, 0x12, 0x8c, 0xcb, 0x16, 0x5f, 0x6b, 0x87, 0x89, 0x73, - 0x0c, 0x47, 0xfa, 0x6b, 0xc6, 0x91, 0xbe, 0x50, 0x2c, 0x30, 0x98, 0x75, 0xae, 0xe7, 0x51, 0xfe, - 0xa9, 0xcc, 0x51, 0x7e, 0xa1, 0x1f, 0xa2, 0x07, 0x1f, 0xe1, 0xff, 0xc6, 0x82, 0x13, 0x06, 0xfe, - 0x31, 0x9c, 0x24, 0x35, 0xf3, 0x24, 0x79, 0xae, 0x8f, 0xd1, 0xf4, 0x38, 0x41, 0xbe, 0x55, 0xca, - 0x8c, 0x82, 0x9d, 0x1c, 0x9f, 0x83, 0x81, 0x4d, 0x27, 0x72, 0x8b, 0xe5, 0xd4, 0xec, 0xa8, 0x3e, - 0x7f, 0xc5, 0x89, 0x5c, 0xce, 0xff, 0xcf, 0xab, 0x47, 0xd1, 0x9c, 0xc8, 0xcd, 0x8d, 0xe6, 0x60, - 0x8d, 0xa2, 0x4b, 0x30, 0x14, 0x37, 0xc2, 0x96, 0xf2, 0x77, 0x3d, 0xcb, 0x1f, 0x4c, 0xa3, 0x25, - 0xfb, 0xbb, 0x73, 0xc8, 0x6c, 0x8e, 0x16, 0x63, 0x81, 0x3f, 0xdb, 0x84, 0x8a, 0x6a, 0xfa, 0x48, - 0x3d, 0xfe, 0xff, 0x6b, 0x19, 0x4e, 0x76, 0x59, 0x2b, 0xe8, 0xf3, 0xc6, 0xbc, 0xbd, 0xd2, 0xf7, - 0x62, 0x7b, 0x8f, 0x33, 0xf7, 0x79, 0xa6, 0x29, 0xb9, 0x62, 0x75, 0x1c, 0xa2, 0xf9, 0x5b, 0x31, - 0xc9, 0x36, 0x4f, 0x8b, 0xf2, 0x9b, 0xa7, 0xcd, 0x1e, 0xdb, 0xf4, 0xd3, 0x86, 0x54, 0x4f, 0x8f, - 0xf4, 0x3b, 0xff, 0x95, 0x01, 0x98, 0xee, 0x96, 0x81, 0x00, 0x7d, 0xc9, 0xca, 0x3c, 0x9c, 0xf1, + 0xbb, 0x87, 0xdd, 0x3d, 0x7b, 0xb7, 0x52, 0x04, 0xd8, 0x8a, 0x20, 0x39, 0x80, 0x92, 0xc8, 0x70, + 0x04, 0x04, 0x4e, 0x00, 0x05, 0x06, 0xe2, 0x28, 0x9f, 0x8e, 0x22, 0xe8, 0xc3, 0xb0, 0x9c, 0x20, + 0x4e, 0xe4, 0xc8, 0x40, 0xe2, 0x18, 0x30, 0x62, 0x3b, 0x30, 0xb2, 0xb6, 0x56, 0x88, 0x7f, 0x04, + 0x48, 0x10, 0xc4, 0xff, 0x36, 0x41, 0x10, 0xd4, 0x67, 0x57, 0xf5, 0xcc, 0x6c, 0xf7, 0x2c, 0x6f, + 0xd7, 0x94, 0x90, 0x7f, 0x33, 0xf5, 0x5e, 0xbd, 0xfa, 0xe8, 0xaa, 0x57, 0xef, 0xbd, 0x7a, 0xef, + 0x15, 0x9c, 0xbf, 0x77, 0x29, 0x9e, 0xf7, 0xc2, 0x85, 0x7b, 0xed, 0xbb, 0x24, 0x0a, 0x48, 0x42, + 0xe2, 0x85, 0xd6, 0xbd, 0xe6, 0x82, 0xd3, 0xf2, 0x16, 0xb6, 0x2f, 0x2c, 0x34, 0x49, 0x40, 0x22, + 0x27, 0x21, 0xee, 0x7c, 0x2b, 0x0a, 0x93, 0x10, 0x3d, 0xc6, 0xb1, 0xe7, 0x53, 0xec, 0xf9, 0xd6, + 0xbd, 0xe6, 0xbc, 0xd3, 0xf2, 0xe6, 0xb7, 0x2f, 0xcc, 0x3e, 0xdf, 0xf4, 0x92, 0xcd, 0xf6, 0xdd, + 0xf9, 0x46, 0xb8, 0xb5, 0xd0, 0x0c, 0x9b, 0xe1, 0x02, 0xab, 0x74, 0xb7, 0xbd, 0xc1, 0xfe, 0xb1, + 0x3f, 0xec, 0x17, 0x27, 0x36, 0xfb, 0xa2, 0x68, 0xda, 0x69, 0x79, 0x5b, 0x4e, 0x63, 0xd3, 0x0b, + 0x48, 0xb4, 0xa3, 0x1a, 0x8f, 0x48, 0x1c, 0xb6, 0xa3, 0x06, 0xc9, 0x76, 0xe1, 0xc0, 0x5a, 0xf1, + 0xc2, 0x16, 0x49, 0x9c, 0x2e, 0x1d, 0x9f, 0x5d, 0xe8, 0x55, 0x2b, 0x6a, 0x07, 0x89, 0xb7, 0xd5, + 0xd9, 0xcc, 0x47, 0xf2, 0x2a, 0xc4, 0x8d, 0x4d, 0xb2, 0xe5, 0x74, 0xd4, 0x7b, 0xa1, 0x57, 0xbd, + 0x76, 0xe2, 0xf9, 0x0b, 0x5e, 0x90, 0xc4, 0x49, 0x74, 0xd0, 0x98, 0x62, 0x12, 0x6d, 0x93, 0x28, + 0x1d, 0x10, 0x79, 0xe0, 0x6c, 0xb5, 0x7c, 0xd2, 0x6d, 0x4c, 0x57, 0xb4, 0x4f, 0xf7, 0xbc, 0xd3, + 0x6c, 0x46, 0xa4, 0xe9, 0x24, 0xa1, 0x56, 0xd7, 0x69, 0x79, 0x11, 0x69, 0x7a, 0x71, 0x12, 0x39, + 0x89, 0x17, 0x06, 0x0b, 0xdb, 0x17, 0x1c, 0xbf, 0xb5, 0xe9, 0x74, 0x50, 0xb2, 0xff, 0xd0, 0x82, + 0xb3, 0x8b, 0x77, 0xea, 0x2b, 0xbe, 0x13, 0x27, 0x5e, 0x63, 0xc9, 0x0f, 0x1b, 0xf7, 0xea, 0x49, + 0x18, 0x91, 0xdb, 0xa1, 0xdf, 0xde, 0x22, 0x75, 0xf6, 0x21, 0xd0, 0x79, 0x18, 0xd9, 0x66, 0xff, + 0xd7, 0xaa, 0x33, 0xd6, 0x59, 0xeb, 0x5c, 0x65, 0x69, 0xea, 0x87, 0xbb, 0x73, 0x1f, 0xd8, 0xdb, + 0x9d, 0x1b, 0xb9, 0x2d, 0xca, 0xb1, 0xc2, 0x40, 0x4f, 0xc3, 0xd0, 0x46, 0xbc, 0xbe, 0xd3, 0x22, + 0x33, 0x25, 0x86, 0x3b, 0x21, 0x70, 0x87, 0x56, 0xeb, 0xb4, 0x14, 0x0b, 0x28, 0x5a, 0x80, 0x4a, + 0xcb, 0x89, 0x12, 0x8f, 0x76, 0x70, 0xa6, 0x7c, 0xd6, 0x3a, 0x37, 0xb8, 0x74, 0x42, 0xa0, 0x56, + 0x6a, 0x12, 0x80, 0x53, 0x1c, 0xda, 0x8d, 0x88, 0x38, 0xee, 0xcd, 0xc0, 0xdf, 0x99, 0x19, 0x38, + 0x6b, 0x9d, 0x1b, 0x49, 0xbb, 0x81, 0x45, 0x39, 0x56, 0x18, 0xf6, 0xf7, 0x4a, 0x30, 0xb2, 0xb8, + 0xb1, 0xe1, 0x05, 0x5e, 0xb2, 0x83, 0xde, 0x86, 0xb1, 0x20, 0x74, 0x89, 0xfc, 0xcf, 0x46, 0x31, + 0x7a, 0xf1, 0xd9, 0xf9, 0x83, 0x16, 0xf5, 0xfc, 0x0d, 0xad, 0xc6, 0xd2, 0xd4, 0xde, 0xee, 0xdc, + 0x98, 0x5e, 0x82, 0x0d, 0x8a, 0xe8, 0x4d, 0x18, 0x6d, 0x85, 0xae, 0x6a, 0xa0, 0xc4, 0x1a, 0x78, + 0xe6, 0xe0, 0x06, 0x6a, 0x69, 0x85, 0xa5, 0xc9, 0xbd, 0xdd, 0xb9, 0x51, 0xad, 0x00, 0xeb, 0xe4, + 0x90, 0x0f, 0x93, 0xf4, 0x6f, 0x90, 0x78, 0xaa, 0x85, 0x32, 0x6b, 0xe1, 0xf9, 0xfc, 0x16, 0xb4, + 0x4a, 0x4b, 0x27, 0xf7, 0x76, 0xe7, 0x26, 0x33, 0x85, 0x38, 0x4b, 0xda, 0xfe, 0x2c, 0x4c, 0x2c, + 0x26, 0x89, 0xd3, 0xd8, 0x24, 0x2e, 0xff, 0xbe, 0xe8, 0x45, 0x18, 0x08, 0x9c, 0x2d, 0x22, 0xbe, + 0xfe, 0x59, 0x31, 0xed, 0x03, 0x37, 0x9c, 0x2d, 0xb2, 0xbf, 0x3b, 0x37, 0x75, 0x2b, 0xf0, 0xde, + 0x6d, 0x8b, 0x35, 0x43, 0xcb, 0x30, 0xc3, 0x46, 0x17, 0x01, 0x5c, 0xb2, 0xed, 0x35, 0x48, 0xcd, + 0x49, 0x36, 0xc5, 0x6a, 0x40, 0xa2, 0x2e, 0x54, 0x15, 0x04, 0x6b, 0x58, 0xf6, 0x17, 0x2c, 0xa8, + 0x2c, 0x6e, 0x87, 0x9e, 0x5b, 0x0b, 0xdd, 0x18, 0xb5, 0x61, 0xb2, 0x15, 0x91, 0x0d, 0x12, 0xa9, + 0xa2, 0x19, 0xeb, 0x6c, 0xf9, 0xdc, 0xe8, 0xc5, 0x8b, 0x39, 0xe3, 0x36, 0x2b, 0xad, 0x04, 0x49, + 0xb4, 0xb3, 0xf4, 0x88, 0x68, 0x7a, 0x32, 0x03, 0xc5, 0xd9, 0x36, 0xec, 0x5f, 0x2c, 0xc1, 0xa9, + 0xc5, 0xcf, 0xb6, 0x23, 0x52, 0xf5, 0xe2, 0x7b, 0xd9, 0xad, 0xe0, 0x7a, 0xf1, 0xbd, 0x1b, 0xe9, + 0x64, 0xa8, 0x35, 0x58, 0x15, 0xe5, 0x58, 0x61, 0xa0, 0xe7, 0x61, 0x98, 0xfe, 0xbe, 0x85, 0xd7, + 0xc4, 0xe8, 0x4f, 0x0a, 0xe4, 0xd1, 0xaa, 0x93, 0x38, 0x55, 0x0e, 0xc2, 0x12, 0x07, 0x5d, 0x87, + 0xd1, 0x06, 0xe3, 0x1c, 0xcd, 0xeb, 0xa1, 0x4b, 0xd8, 0x17, 0xae, 0x2c, 0x3d, 0x47, 0xd1, 0x97, + 0xd3, 0xe2, 0xfd, 0xdd, 0xb9, 0x19, 0xde, 0x37, 0x41, 0x42, 0x83, 0x61, 0xbd, 0x3e, 0xb2, 0xd5, + 0x46, 0x1c, 0x60, 0x94, 0xa0, 0xcb, 0x26, 0x3c, 0xa7, 0xed, 0xa9, 0x41, 0xb6, 0xa7, 0xc6, 0x7a, + 0xec, 0xa7, 0x7f, 0x64, 0x89, 0x39, 0x59, 0xf5, 0x7c, 0x93, 0x3d, 0x5c, 0x04, 0x88, 0x49, 0x23, + 0x22, 0x89, 0x36, 0x2b, 0xea, 0x33, 0xd7, 0x15, 0x04, 0x6b, 0x58, 0x74, 0xf3, 0xc7, 0x9b, 0x4e, + 0xc4, 0x56, 0x8b, 0x98, 0x1b, 0xb5, 0xf9, 0xeb, 0x12, 0x80, 0x53, 0x1c, 0x63, 0xf3, 0x97, 0x73, + 0x37, 0xff, 0x6f, 0x59, 0x30, 0xbc, 0xe4, 0x05, 0xae, 0x17, 0x34, 0xd1, 0xdb, 0x30, 0x42, 0xcf, + 0x06, 0xd7, 0x49, 0x1c, 0xb1, 0xef, 0x3f, 0x2c, 0x17, 0x8f, 0xce, 0xaa, 0xe5, 0xf2, 0x89, 0xe7, + 0x29, 0x36, 0x5d, 0x44, 0x37, 0xef, 0xbe, 0x43, 0x1a, 0xc9, 0x75, 0x92, 0x38, 0xe9, 0x70, 0xd2, + 0x32, 0xac, 0xa8, 0xa2, 0x5b, 0x30, 0x94, 0x38, 0x51, 0x93, 0x24, 0x62, 0xdb, 0xe7, 0x6c, 0x4a, + 0x4e, 0x03, 0xd3, 0x25, 0x47, 0x82, 0x06, 0x49, 0x19, 0xe4, 0x3a, 0x23, 0x82, 0x05, 0x31, 0xbb, + 0x01, 0x63, 0xcb, 0x4e, 0xcb, 0xb9, 0xeb, 0xf9, 0x5e, 0xe2, 0x91, 0x18, 0xfd, 0x0c, 0x94, 0x1d, + 0xd7, 0x65, 0x1b, 0xa0, 0xb2, 0x74, 0x6a, 0x6f, 0x77, 0xae, 0xbc, 0xe8, 0xba, 0xfb, 0xbb, 0x73, + 0xa0, 0xb0, 0x76, 0x30, 0xc5, 0x40, 0xcf, 0xc2, 0x80, 0x1b, 0x85, 0xad, 0x99, 0x12, 0xc3, 0x3c, + 0x4d, 0x77, 0x6a, 0x35, 0x0a, 0x5b, 0x19, 0x54, 0x86, 0x63, 0xff, 0xa0, 0x04, 0x68, 0x99, 0xb4, + 0x36, 0x57, 0xeb, 0xc6, 0x37, 0x3d, 0x07, 0x23, 0x5b, 0x61, 0xe0, 0x25, 0x61, 0x14, 0x8b, 0x06, + 0xd9, 0xba, 0xb8, 0x2e, 0xca, 0xb0, 0x82, 0xa2, 0xb3, 0x30, 0xd0, 0x4a, 0xb7, 0xf7, 0x98, 0x64, + 0x0d, 0x6c, 0x63, 0x33, 0x08, 0xc5, 0x68, 0xc7, 0x24, 0x12, 0xeb, 0x59, 0x61, 0xdc, 0x8a, 0x49, + 0x84, 0x19, 0x24, 0x5d, 0x41, 0x74, 0x6d, 0x89, 0xd5, 0x9a, 0x59, 0x41, 0x14, 0x82, 0x35, 0x2c, + 0xf4, 0x16, 0x54, 0xf8, 0x3f, 0x4c, 0x36, 0xd8, 0xd2, 0xcd, 0x65, 0x0a, 0xd7, 0xc2, 0x86, 0xe3, + 0x67, 0x27, 0x7f, 0x9c, 0xad, 0x38, 0x49, 0x08, 0xa7, 0x34, 0x8d, 0x15, 0x37, 0x94, 0xbb, 0xe2, + 0xfe, 0xb6, 0x05, 0x68, 0xd9, 0x0b, 0x5c, 0x12, 0x1d, 0xc3, 0xd1, 0xd9, 0xdf, 0x66, 0xf8, 0x63, + 0xda, 0xb5, 0x70, 0xab, 0x15, 0x06, 0x24, 0x48, 0x96, 0xc3, 0xc0, 0xe5, 0xc7, 0xe9, 0xc7, 0x60, + 0x20, 0xa1, 0x4d, 0xf1, 0x6e, 0x3d, 0x2d, 0x3f, 0x0b, 0x6d, 0x60, 0x7f, 0x77, 0xee, 0x74, 0x67, + 0x0d, 0xd6, 0x05, 0x56, 0x07, 0x7d, 0x14, 0x86, 0xe2, 0xc4, 0x49, 0xda, 0xb1, 0xe8, 0xe8, 0x13, + 0xb2, 0xa3, 0x75, 0x56, 0xba, 0xbf, 0x3b, 0x37, 0xa9, 0xaa, 0xf1, 0x22, 0x2c, 0x2a, 0xa0, 0x67, + 0x60, 0x78, 0x8b, 0xc4, 0xb1, 0xd3, 0x94, 0x0c, 0x6e, 0x52, 0xd4, 0x1d, 0xbe, 0xce, 0x8b, 0xb1, + 0x84, 0xa3, 0x27, 0x61, 0x90, 0x44, 0x51, 0x18, 0x89, 0x15, 0x31, 0x2e, 0x10, 0x07, 0x57, 0x68, + 0x21, 0xe6, 0x30, 0xfb, 0x3f, 0x5b, 0x30, 0xa9, 0xfa, 0xca, 0xdb, 0x3a, 0x86, 0x2d, 0xef, 0x02, + 0x34, 0xe4, 0x00, 0x63, 0xb6, 0xd1, 0xb4, 0x36, 0xba, 0x2f, 0xbf, 0xce, 0x09, 0x4d, 0xdb, 0x50, + 0x45, 0x31, 0xd6, 0xe8, 0xda, 0xff, 0xce, 0x82, 0x93, 0x99, 0xb1, 0x5d, 0xf3, 0xe2, 0x04, 0xbd, + 0xd9, 0x31, 0xbe, 0xf9, 0x62, 0xe3, 0xa3, 0xb5, 0xd9, 0xe8, 0xd4, 0x7a, 0x91, 0x25, 0xda, 0xd8, + 0x30, 0x0c, 0x7a, 0x09, 0xd9, 0x92, 0xc3, 0x7a, 0xbe, 0xe0, 0xb0, 0x78, 0xff, 0xd2, 0xaf, 0xb4, + 0x46, 0x69, 0x60, 0x4e, 0xca, 0xfe, 0xdf, 0x16, 0x54, 0x96, 0xc3, 0x60, 0xc3, 0x6b, 0x5e, 0x77, + 0x5a, 0xc7, 0xf0, 0x7d, 0xea, 0x30, 0xc0, 0xa8, 0xf3, 0x21, 0x5c, 0xc8, 0x1b, 0x82, 0xe8, 0xd8, + 0x3c, 0x3d, 0x53, 0xb9, 0xb0, 0xa0, 0xd8, 0x14, 0x2d, 0xc2, 0x8c, 0xd8, 0xec, 0xcb, 0x50, 0x51, + 0x08, 0x68, 0x0a, 0xca, 0xf7, 0x08, 0x97, 0x24, 0x2b, 0x98, 0xfe, 0x44, 0xd3, 0x30, 0xb8, 0xed, + 0xf8, 0x6d, 0xb1, 0x79, 0x31, 0xff, 0xf3, 0xb1, 0xd2, 0x25, 0xcb, 0xfe, 0x01, 0xdb, 0x81, 0xa2, + 0x91, 0x95, 0x60, 0x5b, 0x30, 0x87, 0x2f, 0x5a, 0x30, 0xed, 0x77, 0x61, 0x4a, 0x62, 0x4e, 0x0e, + 0xc3, 0xce, 0x1e, 0x13, 0xdd, 0x9e, 0xee, 0x06, 0xc5, 0x5d, 0x5b, 0xa3, 0xbc, 0x3e, 0x6c, 0xd1, + 0x05, 0xe7, 0xf8, 0xac, 0xeb, 0x42, 0x06, 0xb8, 0x29, 0xca, 0xb0, 0x82, 0xda, 0x7f, 0x66, 0xc1, + 0xb4, 0x1a, 0xc7, 0x55, 0xb2, 0x53, 0x27, 0x3e, 0x69, 0x24, 0x61, 0xf4, 0x7e, 0x19, 0xc9, 0xe3, + 0xfc, 0x9b, 0x70, 0x9e, 0x34, 0x2a, 0x08, 0x94, 0xaf, 0x92, 0x1d, 0xfe, 0x81, 0xf4, 0x81, 0x96, + 0x0f, 0x1c, 0xe8, 0x6f, 0x58, 0x30, 0xae, 0x06, 0x7a, 0x0c, 0x5b, 0xee, 0x9a, 0xb9, 0xe5, 0x7e, + 0xa6, 0xe0, 0x7a, 0xed, 0xb1, 0xd9, 0xfe, 0x56, 0x89, 0xb2, 0x0d, 0x81, 0x53, 0x8b, 0x42, 0x3a, + 0x49, 0x94, 0xe3, 0xbf, 0x4f, 0xbe, 0x52, 0x7f, 0x83, 0xbd, 0x4a, 0x76, 0xd6, 0x43, 0x2a, 0x4d, + 0x74, 0x1f, 0xac, 0xf1, 0x51, 0x07, 0x0e, 0xfc, 0xa8, 0xbf, 0x53, 0x82, 0x53, 0x6a, 0x5a, 0x8c, + 0x53, 0xfa, 0xa7, 0x72, 0x62, 0x2e, 0xc0, 0xa8, 0x4b, 0x36, 0x9c, 0xb6, 0x9f, 0x28, 0x6d, 0x62, + 0x90, 0xab, 0x99, 0xd5, 0xb4, 0x18, 0xeb, 0x38, 0x7d, 0xcc, 0xe5, 0xd7, 0x47, 0x19, 0x3f, 0x4f, + 0x1c, 0xba, 0xea, 0xa9, 0x84, 0xa7, 0xa9, 0x87, 0x63, 0xba, 0x7a, 0x28, 0x54, 0xc1, 0x27, 0x61, + 0xd0, 0xdb, 0xa2, 0x67, 0x7e, 0xc9, 0x3c, 0xca, 0xd7, 0x68, 0x21, 0xe6, 0x30, 0xf4, 0x14, 0x0c, + 0x37, 0xc2, 0xad, 0x2d, 0x27, 0x70, 0x67, 0xca, 0x4c, 0xe6, 0x1c, 0xa5, 0x62, 0xc1, 0x32, 0x2f, + 0xc2, 0x12, 0x86, 0x1e, 0x83, 0x01, 0x27, 0x6a, 0xc6, 0x33, 0x03, 0x0c, 0x67, 0x84, 0xb6, 0xb4, + 0x18, 0x35, 0x63, 0xcc, 0x4a, 0xa9, 0x2c, 0x79, 0x3f, 0x8c, 0xee, 0x79, 0x41, 0xb3, 0xea, 0x45, + 0x4c, 0x30, 0xd4, 0x64, 0xc9, 0x3b, 0x0a, 0x82, 0x35, 0x2c, 0x54, 0x83, 0xc1, 0x56, 0x18, 0x25, + 0xf1, 0xcc, 0x10, 0x9b, 0xf8, 0xe7, 0x72, 0xb7, 0x1f, 0x1f, 0x77, 0x2d, 0x8c, 0x92, 0x74, 0x28, + 0xf4, 0x5f, 0x8c, 0x39, 0x21, 0xb4, 0x0c, 0x65, 0x12, 0x6c, 0xcf, 0x0c, 0x33, 0x7a, 0x1f, 0x3a, + 0x98, 0xde, 0x4a, 0xb0, 0x7d, 0xdb, 0x89, 0x52, 0x7e, 0xb5, 0x12, 0x6c, 0x63, 0x5a, 0x1b, 0x35, + 0xa0, 0x22, 0x8d, 0x61, 0xf1, 0xcc, 0x48, 0x91, 0xa5, 0x88, 0x05, 0x3a, 0x26, 0xef, 0xb6, 0xbd, + 0x88, 0x6c, 0x91, 0x20, 0x89, 0x53, 0xc5, 0x4a, 0x42, 0x63, 0x9c, 0xd2, 0x45, 0x0d, 0x18, 0xe3, + 0xf2, 0xe7, 0xf5, 0xb0, 0x1d, 0x24, 0xf1, 0x4c, 0x85, 0x75, 0x39, 0xc7, 0x72, 0x71, 0x3b, 0xad, + 0xb1, 0x34, 0x2d, 0xc8, 0x8f, 0x69, 0x85, 0x31, 0x36, 0x88, 0xa2, 0x37, 0x61, 0xdc, 0xf7, 0xb6, + 0x49, 0x40, 0xe2, 0xb8, 0x16, 0x85, 0x77, 0xc9, 0x0c, 0xb0, 0xd1, 0x3c, 0x99, 0xa7, 0xc5, 0x87, + 0x77, 0xc9, 0xd2, 0x89, 0xbd, 0xdd, 0xb9, 0xf1, 0x6b, 0x7a, 0x6d, 0x6c, 0x12, 0x43, 0x6f, 0xc1, + 0x04, 0x15, 0x76, 0xbd, 0x94, 0xfc, 0x68, 0x71, 0xf2, 0x68, 0x6f, 0x77, 0x6e, 0x02, 0x1b, 0xd5, + 0x71, 0x86, 0x1c, 0x5a, 0x87, 0x8a, 0xef, 0x6d, 0x90, 0xc6, 0x4e, 0xc3, 0x27, 0x33, 0x63, 0x8c, + 0x76, 0xce, 0xe6, 0xbc, 0x26, 0xd1, 0xb9, 0x82, 0xa1, 0xfe, 0xe2, 0x94, 0x10, 0xba, 0x0d, 0xa7, + 0x13, 0x12, 0x6d, 0x79, 0x01, 0xb3, 0xd1, 0x09, 0xe9, 0x97, 0x99, 0x4a, 0xc6, 0xd9, 0xaa, 0x3d, + 0x23, 0x26, 0xf6, 0xf4, 0x7a, 0x57, 0x2c, 0xdc, 0xa3, 0x36, 0xba, 0x09, 0x93, 0x6c, 0x3f, 0xd5, + 0xda, 0xbe, 0x5f, 0x0b, 0x7d, 0xaf, 0xb1, 0x33, 0x33, 0xc1, 0x08, 0x3e, 0x25, 0x0d, 0x20, 0x6b, + 0x26, 0x98, 0x2a, 0x86, 0xe9, 0x3f, 0x9c, 0xad, 0x8d, 0x7c, 0x98, 0x8c, 0x49, 0xa3, 0x1d, 0x79, + 0xc9, 0x0e, 0x5d, 0xfb, 0xe4, 0x41, 0x32, 0x33, 0x59, 0x44, 0xd1, 0xad, 0x9b, 0x95, 0xb8, 0xf5, + 0x29, 0x53, 0x88, 0xb3, 0xa4, 0x29, 0xab, 0x88, 0x13, 0xd7, 0x0b, 0x66, 0xa6, 0x18, 0x07, 0x52, + 0xfb, 0xab, 0x4e, 0x0b, 0x31, 0x87, 0x31, 0xfb, 0x01, 0xfd, 0x71, 0x93, 0x72, 0xe9, 0x13, 0x0c, + 0x31, 0xb5, 0x1f, 0x48, 0x00, 0x4e, 0x71, 0xa8, 0x68, 0x90, 0x24, 0x3b, 0x33, 0x88, 0xa1, 0xaa, + 0xad, 0xb6, 0xbe, 0xfe, 0x29, 0x4c, 0xcb, 0xd1, 0x6d, 0x18, 0x26, 0xc1, 0xf6, 0x6a, 0x14, 0x6e, + 0xcd, 0x9c, 0x2c, 0xc2, 0x03, 0x56, 0x38, 0x32, 0x3f, 0x3f, 0x52, 0x15, 0x46, 0x14, 0x63, 0x49, + 0x0c, 0x3d, 0x80, 0x99, 0x2e, 0x5f, 0x89, 0x7f, 0x94, 0x69, 0xf6, 0x51, 0x3e, 0x2e, 0xea, 0xce, + 0xac, 0xf7, 0xc0, 0xdb, 0x3f, 0x00, 0x86, 0x7b, 0x52, 0xb7, 0xef, 0xc2, 0x84, 0x62, 0x54, 0xec, + 0x7b, 0xa3, 0x39, 0x18, 0xa4, 0xbc, 0x58, 0x2a, 0xf4, 0x15, 0x3a, 0xa9, 0x94, 0x45, 0xc7, 0x98, + 0x97, 0xb3, 0x49, 0xf5, 0x3e, 0x4b, 0x96, 0x76, 0x12, 0xc2, 0x15, 0xbb, 0xb2, 0x36, 0xa9, 0x12, + 0x80, 0x53, 0x1c, 0xfb, 0xff, 0x72, 0x31, 0x29, 0xe5, 0x86, 0x05, 0x4e, 0x82, 0xf3, 0x30, 0xb2, + 0x19, 0xc6, 0x09, 0xc5, 0x66, 0x6d, 0x0c, 0xa6, 0x82, 0xd1, 0x15, 0x51, 0x8e, 0x15, 0x06, 0x7a, + 0x05, 0xc6, 0x1b, 0x7a, 0x03, 0xe2, 0x18, 0x3b, 0x25, 0xaa, 0x98, 0xad, 0x63, 0x13, 0x17, 0x5d, + 0x82, 0x11, 0x66, 0xe5, 0x6e, 0x84, 0xbe, 0x50, 0x21, 0xe5, 0xa9, 0x3c, 0x52, 0x13, 0xe5, 0xfb, + 0xda, 0x6f, 0xac, 0xb0, 0xa9, 0x22, 0x4e, 0xbb, 0xb0, 0x56, 0x13, 0x07, 0x88, 0x52, 0xc4, 0xaf, + 0xb0, 0x52, 0x2c, 0xa0, 0xf6, 0x3f, 0x2f, 0x69, 0xb3, 0x4c, 0x15, 0x20, 0x82, 0xde, 0x80, 0xe1, + 0xfb, 0x8e, 0x97, 0x78, 0x41, 0x53, 0x48, 0x0f, 0x2f, 0x14, 0x3c, 0x4d, 0x58, 0xf5, 0x3b, 0xbc, + 0x2a, 0x3f, 0xf9, 0xc4, 0x1f, 0x2c, 0x09, 0x52, 0xda, 0x51, 0x3b, 0x08, 0x28, 0xed, 0x52, 0xff, + 0xb4, 0x31, 0xaf, 0xca, 0x69, 0x8b, 0x3f, 0x58, 0x12, 0x44, 0x1b, 0x00, 0x72, 0x2d, 0x11, 0x57, + 0x58, 0x97, 0x3f, 0xd2, 0x0f, 0xf9, 0x75, 0x55, 0x7b, 0x69, 0x82, 0x9e, 0xb5, 0xe9, 0x7f, 0xac, + 0x51, 0xb6, 0x13, 0x26, 0x84, 0x75, 0x76, 0x0b, 0x7d, 0x9a, 0x6e, 0x69, 0x27, 0x4a, 0x88, 0xbb, + 0x98, 0x64, 0x0d, 0xf4, 0x07, 0x8b, 0xd8, 0xeb, 0xde, 0x16, 0xd1, 0xb7, 0xbf, 0x20, 0x82, 0x53, + 0x7a, 0xf6, 0x77, 0xcb, 0x30, 0xd3, 0xab, 0xbb, 0x74, 0x49, 0x92, 0x07, 0x5e, 0xb2, 0x4c, 0xc5, + 0x24, 0xcb, 0x5c, 0x92, 0x2b, 0xa2, 0x1c, 0x2b, 0x0c, 0xba, 0x36, 0x62, 0xaf, 0x29, 0x95, 0xa5, + 0xc1, 0x74, 0x6d, 0xd4, 0x59, 0x29, 0x16, 0x50, 0x8a, 0x17, 0x11, 0x27, 0x16, 0x97, 0x1b, 0xda, + 0x1a, 0xc2, 0xac, 0x14, 0x0b, 0xa8, 0x6e, 0x10, 0x19, 0xc8, 0x31, 0x88, 0x18, 0x53, 0x34, 0xf8, + 0x70, 0xa7, 0x08, 0x7d, 0x06, 0x60, 0xc3, 0x0b, 0xbc, 0x78, 0x93, 0x51, 0x1f, 0xea, 0x9b, 0xba, + 0x12, 0xb2, 0x56, 0x15, 0x15, 0xac, 0x51, 0x44, 0x2f, 0xc1, 0xa8, 0xda, 0x9e, 0x6b, 0xd5, 0x99, + 0x61, 0xd3, 0x20, 0x9e, 0xf2, 0xaa, 0x2a, 0xd6, 0xf1, 0xec, 0x77, 0xb2, 0xeb, 0x45, 0xec, 0x0a, + 0x6d, 0x7e, 0xad, 0xa2, 0xf3, 0x5b, 0x3a, 0x78, 0x7e, 0xed, 0x3f, 0x28, 0xc3, 0xa4, 0xd1, 0x58, + 0x3b, 0x2e, 0xc0, 0xd1, 0x5e, 0xa3, 0x07, 0x96, 0x93, 0x10, 0xb1, 0x27, 0xcf, 0xf7, 0xb3, 0x69, + 0xf4, 0xe3, 0x8d, 0xee, 0x05, 0x4e, 0x09, 0x6d, 0x42, 0xc5, 0x77, 0x62, 0x66, 0x52, 0x21, 0x62, + 0x2f, 0xf6, 0x47, 0x36, 0x55, 0x3f, 0x9c, 0x38, 0xd1, 0x4e, 0x0f, 0xde, 0x4a, 0x4a, 0x9c, 0x9e, + 0xb6, 0x54, 0xd8, 0x91, 0x37, 0x6a, 0xaa, 0x3b, 0x54, 0x22, 0xda, 0xc1, 0x1c, 0x86, 0x2e, 0xc1, + 0x58, 0x44, 0xd8, 0x4a, 0x59, 0xa6, 0xf2, 0x1c, 0x5b, 0x7a, 0x83, 0xa9, 0xe0, 0x87, 0x35, 0x18, + 0x36, 0x30, 0x53, 0xb9, 0x7f, 0xe8, 0x00, 0xb9, 0xff, 0x19, 0x18, 0x66, 0x3f, 0xd4, 0xaa, 0x50, + 0x5f, 0x68, 0x8d, 0x17, 0x63, 0x09, 0xcf, 0x2e, 0xa2, 0x91, 0x82, 0x8b, 0xe8, 0x59, 0x98, 0xa8, + 0x3a, 0x64, 0x2b, 0x0c, 0x56, 0x02, 0xb7, 0x15, 0x7a, 0x41, 0x82, 0x66, 0x60, 0x80, 0x9d, 0x27, + 0x7c, 0xbf, 0x0f, 0x50, 0x0a, 0x78, 0x80, 0xca, 0xee, 0xf6, 0x1f, 0x97, 0x60, 0xbc, 0x4a, 0x7c, + 0x92, 0x10, 0xae, 0xf7, 0xc4, 0x68, 0x15, 0x50, 0x33, 0x72, 0x1a, 0xa4, 0x46, 0x22, 0x2f, 0x74, + 0xeb, 0xa4, 0x11, 0x06, 0xec, 0x22, 0x8a, 0x1e, 0x90, 0xa7, 0xf7, 0x76, 0xe7, 0xd0, 0xe5, 0x0e, + 0x28, 0xee, 0x52, 0x03, 0xb9, 0x30, 0xde, 0x8a, 0x88, 0x61, 0x37, 0xb4, 0xf2, 0x45, 0x8d, 0x9a, + 0x5e, 0x85, 0x4b, 0xc3, 0x46, 0x11, 0x36, 0x89, 0xa2, 0x4f, 0xc0, 0x54, 0x18, 0xb5, 0x36, 0x9d, + 0xa0, 0x4a, 0x5a, 0x24, 0x70, 0xa9, 0x0a, 0x20, 0xac, 0x1d, 0xd3, 0x7b, 0xbb, 0x73, 0x53, 0x37, + 0x33, 0x30, 0xdc, 0x81, 0x8d, 0xde, 0x80, 0x13, 0xad, 0x28, 0x6c, 0x39, 0x4d, 0xb6, 0x64, 0x84, + 0xb4, 0xc2, 0x79, 0xd3, 0xf9, 0xbd, 0xdd, 0xb9, 0x13, 0xb5, 0x2c, 0x70, 0x7f, 0x77, 0xee, 0x24, + 0x9b, 0x32, 0x5a, 0x92, 0x02, 0x71, 0x27, 0x19, 0xfb, 0x5d, 0x38, 0x55, 0x0d, 0xef, 0x07, 0xf7, + 0x9d, 0xc8, 0x5d, 0xac, 0xad, 0x69, 0xc6, 0x89, 0xd7, 0xa5, 0xf2, 0xcb, 0x2f, 0xf8, 0x72, 0x4e, + 0x36, 0x8d, 0x06, 0x57, 0x3b, 0x56, 0x3d, 0x9f, 0xf4, 0x30, 0x87, 0xfc, 0xe3, 0x92, 0xd1, 0x66, + 0x8a, 0xaf, 0xee, 0x2e, 0xac, 0x9e, 0x77, 0x17, 0x9f, 0x86, 0x91, 0x0d, 0x8f, 0xf8, 0x2e, 0x26, + 0x1b, 0xe2, 0x6b, 0x5d, 0x28, 0x72, 0xb9, 0xb3, 0x4a, 0xeb, 0x48, 0xeb, 0x18, 0x57, 0xa2, 0x57, + 0x05, 0x19, 0xac, 0x08, 0xa2, 0x36, 0x4c, 0x49, 0x3d, 0x4c, 0x42, 0xc5, 0x66, 0x7f, 0xa1, 0x98, + 0x9a, 0x67, 0x36, 0xc3, 0x3e, 0x2f, 0xce, 0x10, 0xc4, 0x1d, 0x4d, 0x50, 0xfd, 0x79, 0x8b, 0x1e, + 0x75, 0x03, 0x6c, 0xe9, 0x33, 0xfd, 0x99, 0x99, 0x02, 0x58, 0xa9, 0xfd, 0xab, 0x16, 0x3c, 0xd2, + 0x31, 0x5b, 0xc2, 0x4e, 0x72, 0x64, 0xdf, 0x28, 0x6b, 0xac, 0x28, 0xe5, 0x1b, 0x2b, 0xec, 0x9b, + 0x30, 0xbd, 0xb2, 0xd5, 0x4a, 0x76, 0xaa, 0x9e, 0x79, 0xe5, 0xf2, 0x32, 0x0c, 0x6d, 0x11, 0xd7, + 0x6b, 0x6f, 0x89, 0xcf, 0x3a, 0x27, 0xcf, 0x85, 0xeb, 0xac, 0x74, 0x7f, 0x77, 0x6e, 0xbc, 0x9e, + 0x84, 0x91, 0xd3, 0x24, 0xbc, 0x00, 0x0b, 0x74, 0xfb, 0x47, 0x16, 0x4c, 0x4a, 0xfe, 0xb0, 0xe8, + 0xba, 0x11, 0x89, 0x63, 0x34, 0x0b, 0x25, 0xaf, 0x25, 0x08, 0x81, 0x20, 0x54, 0x5a, 0xab, 0xe1, + 0x92, 0xd7, 0x42, 0x6f, 0x40, 0x85, 0xdf, 0xd4, 0xa5, 0x8b, 0xa3, 0xcf, 0x9b, 0x3f, 0xa6, 0x1b, + 0xae, 0x4b, 0x1a, 0x38, 0x25, 0x27, 0xa5, 0x64, 0x76, 0xf2, 0x94, 0xcd, 0x7b, 0xa3, 0x2b, 0xa2, + 0x1c, 0x2b, 0x0c, 0x74, 0x0e, 0x46, 0x82, 0xd0, 0xe5, 0x97, 0xa9, 0x7c, 0x9f, 0xb2, 0x25, 0x77, + 0x43, 0x94, 0x61, 0x05, 0xb5, 0xbf, 0x62, 0xc1, 0x98, 0x1c, 0x63, 0x41, 0x81, 0x9d, 0x6e, 0x92, + 0x54, 0x58, 0x4f, 0x37, 0x09, 0x15, 0xb8, 0x19, 0xc4, 0x90, 0xb3, 0xcb, 0xfd, 0xc8, 0xd9, 0xf6, + 0xaf, 0x97, 0x60, 0x42, 0x76, 0xa7, 0xde, 0xbe, 0x1b, 0x13, 0x2a, 0x86, 0x54, 0x1c, 0x3e, 0xf9, + 0x44, 0xae, 0xb3, 0xe7, 0xf3, 0x74, 0x31, 0xe3, 0x9b, 0xa5, 0x62, 0xce, 0xa2, 0xa4, 0x83, 0x53, + 0x92, 0x68, 0x1b, 0x4e, 0x04, 0x61, 0xc2, 0x8e, 0x37, 0x05, 0x2f, 0x76, 0xd3, 0x91, 0x6d, 0xe7, + 0x51, 0xd1, 0xce, 0x89, 0x1b, 0x59, 0x7a, 0xb8, 0xb3, 0x09, 0x74, 0x53, 0xda, 0x98, 0xca, 0xac, + 0xad, 0x67, 0x8b, 0xb5, 0xd5, 0xdb, 0xc4, 0x64, 0xff, 0xb6, 0x05, 0x15, 0x89, 0x76, 0x1c, 0x57, + 0x5e, 0x77, 0x60, 0x38, 0x66, 0x9f, 0x48, 0x4e, 0xd7, 0xf9, 0x62, 0x43, 0xe0, 0xdf, 0x35, 0x3d, + 0xd3, 0xf9, 0xff, 0x18, 0x4b, 0x6a, 0xcc, 0xd8, 0xae, 0x06, 0xf2, 0xbe, 0x33, 0xb6, 0xab, 0x9e, + 0xf5, 0xbe, 0xd9, 0x1a, 0x37, 0xac, 0x01, 0x54, 0x30, 0x6d, 0x45, 0x64, 0xc3, 0x7b, 0x90, 0x15, + 0x4c, 0x6b, 0xac, 0x14, 0x0b, 0x28, 0xda, 0x80, 0xb1, 0x86, 0x34, 0x47, 0xa7, 0x2c, 0xe4, 0xc3, + 0x05, 0x6d, 0xff, 0xea, 0x1a, 0x89, 0xbb, 0x26, 0x2d, 0x6b, 0x94, 0xb0, 0x41, 0x97, 0xf2, 0xa9, + 0xf4, 0xa6, 0xbc, 0x5c, 0xd0, 0x70, 0x13, 0x91, 0x24, 0x6d, 0xa1, 0xe7, 0x25, 0xb9, 0xfd, 0x0d, + 0x0b, 0x86, 0xb8, 0xfd, 0xb2, 0x98, 0x11, 0x58, 0xbb, 0x20, 0x4b, 0xe7, 0xf3, 0x36, 0x2d, 0x14, + 0xf7, 0x65, 0xe8, 0x0e, 0x54, 0xd8, 0x0f, 0x66, 0x8b, 0x29, 0x17, 0xf1, 0xd3, 0xe2, 0xed, 0xeb, + 0x5d, 0xbd, 0x2d, 0x09, 0xe0, 0x94, 0x96, 0xfd, 0xfd, 0x32, 0x65, 0x7d, 0x29, 0xaa, 0x71, 0xb6, + 0x5b, 0xc7, 0x71, 0xb6, 0x97, 0x8e, 0xfe, 0x6c, 0x7f, 0x17, 0x26, 0x1b, 0xda, 0x05, 0x5d, 0xfa, + 0xc5, 0x2f, 0x16, 0x5c, 0x56, 0xda, 0xad, 0x1e, 0xb7, 0xd7, 0x2d, 0x9b, 0xe4, 0x70, 0x96, 0x3e, + 0x22, 0x30, 0xc6, 0xd7, 0x83, 0x68, 0x6f, 0x80, 0xb5, 0xb7, 0x50, 0x64, 0x85, 0xe9, 0x8d, 0xb1, + 0x55, 0x5c, 0xd7, 0x08, 0x61, 0x83, 0xac, 0xfd, 0xcb, 0x83, 0x30, 0xb8, 0xb2, 0x4d, 0x82, 0xe4, + 0x18, 0x58, 0xdd, 0x16, 0x4c, 0x78, 0xc1, 0x76, 0xe8, 0x6f, 0x13, 0x97, 0xc3, 0x0f, 0x77, 0xbc, + 0x9f, 0x16, 0x8d, 0x4c, 0xac, 0x19, 0xc4, 0x70, 0x86, 0xf8, 0x51, 0x58, 0x0a, 0x5e, 0x83, 0x21, + 0xbe, 0x32, 0x84, 0x99, 0x20, 0xc7, 0x9e, 0xcf, 0x26, 0x56, 0xec, 0xa0, 0xd4, 0x9e, 0xc1, 0xaf, + 0x12, 0x04, 0x21, 0xf4, 0x0e, 0x4c, 0x6c, 0x78, 0x51, 0x9c, 0x50, 0x65, 0x3f, 0x4e, 0x9c, 0xad, + 0xd6, 0x21, 0x6c, 0x04, 0x6a, 0x46, 0x56, 0x0d, 0x4a, 0x38, 0x43, 0x19, 0x35, 0x61, 0x9c, 0xaa, + 0xa8, 0x69, 0x53, 0xc3, 0x7d, 0x37, 0xa5, 0x4c, 0x84, 0xd7, 0x74, 0x42, 0xd8, 0xa4, 0x4b, 0x59, + 0x52, 0x83, 0xa9, 0xb4, 0x23, 0x4c, 0xba, 0x51, 0x2c, 0x89, 0xeb, 0xb2, 0x1c, 0x46, 0x39, 0x1b, + 0xf3, 0x94, 0xa9, 0x98, 0x9c, 0x2d, 0xf5, 0x87, 0xb1, 0xbf, 0x45, 0xcf, 0x62, 0x3a, 0x87, 0xc7, + 0x70, 0x7c, 0x5d, 0x31, 0x8f, 0xaf, 0x27, 0x0b, 0x7c, 0xd9, 0x1e, 0x47, 0xd7, 0xdb, 0x30, 0xaa, + 0x7d, 0x78, 0xb4, 0x00, 0x95, 0x86, 0x74, 0xe6, 0x10, 0x5c, 0x5c, 0x89, 0x52, 0xca, 0xcb, 0x03, + 0xa7, 0x38, 0x74, 0x5e, 0xa8, 0x08, 0x9a, 0x75, 0xfd, 0xa2, 0x02, 0x2a, 0x66, 0x10, 0xfb, 0x05, + 0x80, 0x95, 0x07, 0xa4, 0xb1, 0xc8, 0x55, 0x3c, 0xed, 0x7e, 0xcf, 0xea, 0x7d, 0xbf, 0x67, 0x7f, + 0xd3, 0x82, 0x89, 0xd5, 0x65, 0x43, 0xa6, 0x9f, 0x07, 0xe0, 0xb2, 0xf1, 0x9d, 0x3b, 0x37, 0xa4, + 0xfd, 0x9a, 0x1b, 0x19, 0x55, 0x29, 0xd6, 0x30, 0xd0, 0xa3, 0x50, 0xf6, 0xdb, 0x81, 0x10, 0x59, + 0x87, 0xf7, 0x76, 0xe7, 0xca, 0xd7, 0xda, 0x01, 0xa6, 0x65, 0x9a, 0x8f, 0x55, 0xb9, 0xb0, 0x8f, + 0x55, 0xbe, 0xb7, 0xf1, 0xd7, 0xca, 0x30, 0xb5, 0xea, 0x93, 0x07, 0x46, 0xaf, 0x9f, 0x86, 0x21, + 0x37, 0xf2, 0xb6, 0x49, 0x94, 0x15, 0x04, 0xaa, 0xac, 0x14, 0x0b, 0x68, 0x61, 0xb7, 0xaf, 0xb7, + 0x3a, 0x0f, 0xf2, 0xa3, 0x73, 0x79, 0xcb, 0x1d, 0x33, 0xda, 0x80, 0x61, 0x7e, 0x1f, 0x1c, 0xcf, + 0x0c, 0xb2, 0xa5, 0xf8, 0xca, 0xc1, 0x9d, 0xc9, 0xce, 0xcf, 0xbc, 0xb0, 0xaf, 0x70, 0x87, 0x1b, + 0xc5, 0xcb, 0x44, 0x29, 0x96, 0xc4, 0x67, 0x3f, 0x06, 0x63, 0x3a, 0x66, 0x5f, 0x9e, 0x37, 0x7f, + 0xd5, 0x82, 0x93, 0xab, 0x7e, 0xd8, 0xb8, 0x97, 0xf1, 0xcb, 0x7b, 0x09, 0x46, 0xe9, 0x66, 0x8a, + 0x0d, 0xa7, 0x55, 0xc3, 0x3b, 0x57, 0x80, 0xb0, 0x8e, 0xa7, 0x55, 0xbb, 0x75, 0x6b, 0xad, 0xda, + 0xcd, 0xa9, 0x57, 0x80, 0xb0, 0x8e, 0x67, 0xff, 0xae, 0x05, 0x8f, 0x5f, 0x5e, 0x5e, 0xa9, 0x91, + 0x28, 0xf6, 0xe2, 0x84, 0x04, 0x49, 0x87, 0x5f, 0x31, 0x95, 0x19, 0x5d, 0xad, 0x2b, 0xa9, 0xcc, + 0x58, 0x65, 0xbd, 0x10, 0xd0, 0xf7, 0x8b, 0x73, 0xfd, 0x37, 0x2c, 0x38, 0x79, 0xd9, 0x4b, 0x30, + 0x69, 0x85, 0x59, 0x57, 0xe0, 0x88, 0xb4, 0xc2, 0xd8, 0x4b, 0xc2, 0x68, 0x27, 0xeb, 0x0a, 0x8c, + 0x15, 0x04, 0x6b, 0x58, 0xbc, 0xe5, 0x6d, 0x2f, 0xa6, 0x3d, 0x2d, 0x99, 0xaa, 0x2e, 0x16, 0xe5, + 0x58, 0x61, 0xd0, 0x81, 0xb9, 0x5e, 0xc4, 0x44, 0x86, 0x1d, 0xb1, 0x83, 0xd5, 0xc0, 0xaa, 0x12, + 0x80, 0x53, 0x1c, 0xfb, 0xef, 0x5a, 0x70, 0xea, 0xb2, 0xdf, 0x8e, 0x13, 0x12, 0x6d, 0xc4, 0x46, + 0x67, 0x5f, 0x80, 0x0a, 0x91, 0xc2, 0xbd, 0xe8, 0xab, 0x3a, 0x34, 0x94, 0xd4, 0xcf, 0xfd, 0x90, + 0x15, 0x5e, 0x01, 0x77, 0xd7, 0xfe, 0x9c, 0x33, 0x7f, 0xb3, 0x04, 0xe3, 0x57, 0xd6, 0xd7, 0x6b, + 0x97, 0x49, 0x22, 0xb8, 0x64, 0xbe, 0x51, 0x0a, 0x6b, 0x1a, 0xf9, 0x41, 0xc2, 0x4f, 0x3b, 0xf1, + 0xfc, 0x79, 0x1e, 0x78, 0x32, 0xbf, 0x16, 0x24, 0x37, 0xa3, 0x7a, 0x12, 0x79, 0x41, 0xb3, 0xab, + 0x0e, 0x2f, 0x79, 0x79, 0xb9, 0x17, 0x2f, 0x47, 0x2f, 0xc0, 0x10, 0x8b, 0x7c, 0x91, 0xc2, 0xc7, + 0x07, 0x95, 0x9c, 0xc0, 0x4a, 0xf7, 0x77, 0xe7, 0x2a, 0xb7, 0xf0, 0x1a, 0xff, 0x83, 0x05, 0x2a, + 0x7a, 0x0b, 0x46, 0x37, 0x93, 0xa4, 0x75, 0x85, 0x38, 0x2e, 0x89, 0x24, 0x9f, 0x38, 0x77, 0x30, + 0x9f, 0xa0, 0xd3, 0xc1, 0x2b, 0xa4, 0x5b, 0x2b, 0x2d, 0x8b, 0xb1, 0x4e, 0xd1, 0xae, 0x03, 0xa4, + 0xb0, 0x87, 0xa4, 0x83, 0xd8, 0x3f, 0x5f, 0x82, 0xe1, 0x2b, 0x4e, 0xe0, 0xfa, 0x24, 0x42, 0xab, + 0x30, 0x40, 0x1e, 0x90, 0x86, 0x38, 0xc8, 0x73, 0xba, 0x9e, 0x1e, 0x76, 0xdc, 0xae, 0x46, 0xff, + 0x63, 0x56, 0x1f, 0x61, 0x18, 0xa6, 0xfd, 0xbe, 0xac, 0xbc, 0xc4, 0x9f, 0xcb, 0x9f, 0x05, 0xb5, + 0x28, 0xf8, 0x49, 0x29, 0x8a, 0xb0, 0x24, 0xc4, 0x2c, 0x50, 0x8d, 0x56, 0x9d, 0xb2, 0xb7, 0xa4, + 0x98, 0x66, 0xb7, 0xbe, 0x5c, 0xe3, 0xe8, 0x82, 0x2e, 0xb7, 0x40, 0xc9, 0x42, 0x9c, 0x92, 0xb3, + 0xd7, 0xa1, 0x42, 0x3f, 0xfe, 0xa2, 0xef, 0x39, 0x07, 0x9b, 0xc1, 0x9e, 0x83, 0x8a, 0x34, 0x44, + 0xc5, 0xc2, 0xe5, 0x9c, 0x51, 0x95, 0x76, 0xaa, 0x18, 0xa7, 0x70, 0xfb, 0x12, 0x4c, 0xb3, 0x5b, + 0x5e, 0x27, 0xd9, 0x34, 0xf6, 0x62, 0xee, 0xa2, 0xb7, 0xbf, 0x3d, 0x00, 0x27, 0xd6, 0xea, 0xcb, + 0x75, 0xd3, 0x22, 0x79, 0x09, 0xc6, 0xf8, 0xb1, 0x4f, 0x97, 0xb2, 0xe3, 0x8b, 0xfa, 0xea, 0x66, + 0x62, 0x5d, 0x83, 0x61, 0x03, 0x13, 0x3d, 0x0e, 0x65, 0xef, 0xdd, 0x20, 0xeb, 0x2b, 0xb8, 0xf6, + 0xda, 0x0d, 0x4c, 0xcb, 0x29, 0x98, 0x4a, 0x10, 0x9c, 0x75, 0x2a, 0xb0, 0x92, 0x22, 0x5e, 0x85, + 0x09, 0x2f, 0x6e, 0xc4, 0xde, 0x5a, 0x40, 0xf9, 0x8a, 0xd3, 0x90, 0x9b, 0x22, 0x15, 0xf9, 0x69, + 0x57, 0x15, 0x14, 0x67, 0xb0, 0x35, 0x3e, 0x3e, 0x58, 0x58, 0x0a, 0xc9, 0x75, 0x42, 0xa7, 0x02, + 0x56, 0x8b, 0x8d, 0x2e, 0x66, 0x9e, 0x47, 0x42, 0xc0, 0xe2, 0x03, 0x8e, 0xb1, 0x84, 0xa1, 0xcb, + 0x70, 0xa2, 0xb1, 0xe9, 0xb4, 0x16, 0xdb, 0xc9, 0x66, 0xd5, 0x8b, 0x1b, 0xe1, 0x36, 0x89, 0x76, + 0x98, 0x00, 0x3c, 0x92, 0xda, 0xb4, 0x14, 0x60, 0xf9, 0xca, 0x62, 0x8d, 0x62, 0xe2, 0xce, 0x3a, + 0xa6, 0x40, 0x02, 0x47, 0x20, 0x90, 0x2c, 0xc2, 0xa4, 0x6c, 0xb5, 0x4e, 0x62, 0x76, 0x44, 0x8c, + 0xb2, 0x7e, 0xaa, 0x58, 0x1e, 0x51, 0xac, 0x7a, 0x99, 0xc5, 0xb7, 0xdf, 0x81, 0x8a, 0xf2, 0x94, + 0x93, 0x0e, 0xa2, 0x56, 0x0f, 0x07, 0xd1, 0x7c, 0xe6, 0x2e, 0x6d, 0xe7, 0xe5, 0xae, 0xb6, 0xf3, + 0x7f, 0x6a, 0x41, 0xea, 0xea, 0x83, 0x30, 0x54, 0x5a, 0x21, 0xbb, 0x67, 0x8b, 0xe4, 0x85, 0xf6, + 0x53, 0x39, 0x7b, 0x9e, 0xf3, 0x1c, 0x3e, 0x21, 0x35, 0x59, 0x17, 0xa7, 0x64, 0xd0, 0x35, 0x18, + 0x6e, 0x45, 0xa4, 0x9e, 0xb0, 0xe8, 0x8e, 0x3e, 0x28, 0xf2, 0x85, 0xc0, 0x6b, 0x62, 0x49, 0xc2, + 0xfe, 0x97, 0x16, 0xc0, 0x35, 0x6f, 0xcb, 0x4b, 0xb0, 0x13, 0x34, 0xc9, 0x31, 0x28, 0xd6, 0x37, + 0x60, 0x20, 0x6e, 0x91, 0x46, 0xb1, 0x9b, 0xd2, 0xb4, 0x67, 0xf5, 0x16, 0x69, 0xa4, 0x9f, 0x83, + 0xfe, 0xc3, 0x8c, 0x8e, 0xfd, 0x3d, 0x80, 0x89, 0x14, 0x8d, 0x2a, 0x37, 0xe8, 0x79, 0x23, 0xac, + 0xe1, 0xd1, 0x4c, 0x58, 0x43, 0x85, 0x61, 0x6b, 0x91, 0x0c, 0x09, 0x94, 0xb7, 0x9c, 0x07, 0x42, + 0x97, 0x7a, 0xa9, 0x68, 0x87, 0x68, 0x4b, 0xf3, 0xd7, 0x9d, 0x07, 0x5c, 0x74, 0x7d, 0x4e, 0x2e, + 0xa4, 0xeb, 0xce, 0x83, 0x7d, 0x7e, 0x1f, 0xca, 0xb8, 0x13, 0x55, 0xde, 0xbe, 0xf0, 0x27, 0xe9, + 0x7f, 0x76, 0x0c, 0xd1, 0xe6, 0x58, 0xab, 0x5e, 0x20, 0x4c, 0xc1, 0x7d, 0xb6, 0xea, 0x05, 0xd9, + 0x56, 0xbd, 0xa0, 0x40, 0xab, 0x1e, 0xf3, 0xff, 0x1d, 0x16, 0x37, 0x28, 0xcc, 0x79, 0x72, 0xf4, + 0xe2, 0x47, 0xfb, 0x6a, 0x5a, 0x5c, 0xc5, 0xf0, 0xe6, 0x17, 0xa4, 0xbc, 0x2e, 0x4a, 0x73, 0xbb, + 0x20, 0x9b, 0x46, 0x7f, 0xcf, 0x82, 0x09, 0xf1, 0x1b, 0x93, 0x77, 0xdb, 0x24, 0x4e, 0x84, 0x5c, + 0xf0, 0x89, 0xc3, 0xf4, 0x46, 0x90, 0xe0, 0x9d, 0xfa, 0x88, 0x64, 0xbf, 0x26, 0x30, 0xb7, 0x6f, + 0x99, 0xfe, 0xa0, 0xef, 0x59, 0x30, 0xbd, 0xe5, 0x3c, 0xe0, 0x2d, 0xf2, 0x32, 0xec, 0x24, 0x5e, + 0x28, 0x1c, 0x44, 0x57, 0xfb, 0x5d, 0x27, 0x1d, 0x84, 0x78, 0x77, 0xa5, 0xef, 0xd7, 0x74, 0x37, + 0x94, 0xdc, 0x4e, 0x77, 0xed, 0xe1, 0xec, 0x06, 0x8c, 0xc8, 0x85, 0xd9, 0x45, 0x53, 0xaa, 0xea, + 0xe2, 0x4f, 0x8e, 0x5d, 0x62, 0x5e, 0x5a, 0x17, 0xe7, 0x5f, 0x6b, 0x3b, 0x41, 0xe2, 0x25, 0x3b, + 0x9a, 0x66, 0xc5, 0xda, 0x11, 0x4b, 0xf1, 0x48, 0xdb, 0x79, 0x07, 0xc6, 0xf4, 0x75, 0x77, 0xa4, + 0x6d, 0xbd, 0x0b, 0x27, 0xbb, 0xac, 0xaa, 0x23, 0x6d, 0xf2, 0x3e, 0x3c, 0xda, 0x73, 0x7d, 0x1c, + 0x65, 0xc3, 0xf6, 0x6f, 0x5a, 0x3a, 0xeb, 0x3c, 0x06, 0xbb, 0xd5, 0x75, 0xd3, 0x6e, 0x75, 0xae, + 0xe8, 0x1e, 0xea, 0x61, 0xbc, 0xda, 0xd0, 0xbb, 0x4f, 0x8f, 0x04, 0xb4, 0x0e, 0x43, 0x3e, 0x2d, + 0x91, 0xd7, 0x86, 0xe7, 0xfb, 0xd9, 0xa5, 0xa9, 0x04, 0xc6, 0xca, 0x63, 0x2c, 0x68, 0xd9, 0xdf, + 0xb3, 0x60, 0xe0, 0x2f, 0x30, 0xe8, 0xaa, 0x83, 0xb4, 0xc8, 0x42, 0x30, 0x8f, 0x9d, 0xfb, 0x2b, + 0x0f, 0x12, 0x12, 0xc4, 0x4c, 0x8c, 0xef, 0xe5, 0xf8, 0x30, 0x4a, 0x9b, 0x92, 0x7e, 0x2c, 0xaf, + 0xc0, 0xb8, 0xef, 0xdc, 0x25, 0xbe, 0xb4, 0xb9, 0x67, 0x95, 0xde, 0x6b, 0x3a, 0x10, 0x9b, 0xb8, + 0xb4, 0xf2, 0x86, 0x7e, 0x25, 0x21, 0x84, 0x24, 0x55, 0xd9, 0xb8, 0xaf, 0xc0, 0x26, 0x2e, 0xd5, + 0xba, 0xee, 0x3b, 0x49, 0x63, 0x53, 0x28, 0xc4, 0xaa, 0xbb, 0x77, 0x68, 0x21, 0xe6, 0x30, 0x2a, + 0xec, 0xc9, 0x15, 0x7b, 0x9b, 0x44, 0x4c, 0xd8, 0xe3, 0x42, 0xb5, 0x12, 0xf6, 0xb0, 0x09, 0xc6, + 0x59, 0x7c, 0xf4, 0x31, 0x98, 0xa0, 0x93, 0x13, 0xb6, 0x13, 0xe9, 0xa5, 0x33, 0xc8, 0xbc, 0x74, + 0x98, 0x93, 0xf7, 0xba, 0x01, 0xc1, 0x19, 0x4c, 0xfb, 0x2d, 0x38, 0x79, 0x2d, 0x74, 0xdc, 0x25, + 0xc7, 0x77, 0x82, 0x06, 0x89, 0xd6, 0x82, 0x66, 0xae, 0x07, 0x80, 0x7e, 0x4b, 0x5f, 0xca, 0xbb, + 0xa5, 0xb7, 0x23, 0x40, 0x7a, 0x03, 0xc2, 0xbf, 0xec, 0x4d, 0x18, 0xf6, 0x78, 0x53, 0x62, 0xd9, + 0x5e, 0xc8, 0x93, 0xa0, 0x3b, 0xfa, 0xa8, 0xf9, 0x4b, 0xf1, 0x02, 0x2c, 0x49, 0x52, 0x7d, 0xab, + 0x9b, 0xc8, 0x9d, 0xaf, 0x28, 0xdb, 0x7f, 0xcd, 0x82, 0xc9, 0x1b, 0x99, 0xa8, 0xe0, 0xa7, 0x61, + 0x88, 0x67, 0xa9, 0xc8, 0x5a, 0xa9, 0xea, 0xac, 0x14, 0x0b, 0xe8, 0x43, 0x37, 0x92, 0xfc, 0x52, + 0x09, 0x2a, 0xcc, 0x53, 0xb9, 0x45, 0x75, 0xa7, 0xa3, 0x17, 0x53, 0xaf, 0x1b, 0x62, 0x6a, 0x8e, + 0xa2, 0xae, 0x3a, 0xd6, 0x4b, 0x4a, 0x45, 0xb7, 0x54, 0xb4, 0x6c, 0x21, 0x1d, 0x3d, 0x25, 0xc8, + 0x23, 0x2a, 0x27, 0xcc, 0xe0, 0x5a, 0x19, 0x49, 0xcb, 0xee, 0xcd, 0x15, 0xee, 0xfb, 0xee, 0xde, + 0x5c, 0xf5, 0xac, 0x07, 0x73, 0xaa, 0x69, 0x9d, 0x67, 0xec, 0xfb, 0x67, 0x99, 0xff, 0xa9, 0xe3, + 0x7b, 0x9f, 0x25, 0x2a, 0xe8, 0x7c, 0x4e, 0xf8, 0x93, 0x8a, 0xd2, 0x7d, 0xc6, 0x67, 0xc4, 0x3f, + 0x9e, 0x53, 0x20, 0xad, 0x62, 0x5f, 0x81, 0xc9, 0xcc, 0xd4, 0xa1, 0x97, 0x60, 0xb0, 0xb5, 0xe9, + 0xc4, 0x24, 0xe3, 0x0a, 0x34, 0x58, 0xa3, 0x85, 0xfb, 0xbb, 0x73, 0x13, 0xaa, 0x02, 0x2b, 0xc1, + 0x1c, 0xdb, 0xfe, 0x62, 0x09, 0x06, 0x6e, 0x84, 0xee, 0x71, 0x2c, 0xb5, 0x2b, 0xc6, 0x52, 0x7b, + 0x3a, 0x3f, 0x23, 0x49, 0xcf, 0x55, 0x56, 0xcb, 0xac, 0xb2, 0x73, 0x05, 0x68, 0x1d, 0xbc, 0xc0, + 0xb6, 0x60, 0x94, 0x65, 0x3c, 0x11, 0xbe, 0x50, 0x2f, 0x18, 0x9a, 0xd5, 0x5c, 0x46, 0xb3, 0x9a, + 0xd4, 0x50, 0x35, 0xfd, 0xea, 0x19, 0x18, 0x16, 0xbe, 0x37, 0x59, 0xef, 0x5b, 0x81, 0x8b, 0x25, + 0xdc, 0xfe, 0x17, 0x65, 0x30, 0x32, 0xac, 0xa0, 0xdf, 0xb6, 0x60, 0x3e, 0xe2, 0x91, 0x4c, 0x6e, + 0xb5, 0x1d, 0x79, 0x41, 0xb3, 0xde, 0xd8, 0x24, 0x6e, 0xdb, 0xf7, 0x82, 0xe6, 0x5a, 0x33, 0x08, + 0x55, 0xf1, 0xca, 0x03, 0xd2, 0x68, 0x33, 0x53, 0x77, 0xe1, 0xc4, 0x2e, 0xea, 0xde, 0xf9, 0xe2, + 0xde, 0xee, 0xdc, 0x3c, 0xee, 0xab, 0x15, 0xdc, 0x67, 0xaf, 0xd0, 0x1f, 0x59, 0xb0, 0xc0, 0x73, + 0x8c, 0x14, 0x1f, 0x49, 0x21, 0x8d, 0xb4, 0x26, 0x89, 0xa6, 0xe4, 0xd6, 0x49, 0xb4, 0xb5, 0xf4, + 0xb2, 0x98, 0xe4, 0x85, 0x5a, 0x7f, 0xad, 0xe2, 0x7e, 0xbb, 0x69, 0xff, 0xeb, 0x32, 0x8c, 0xd3, + 0xf9, 0x4c, 0xf3, 0x0a, 0xbc, 0x64, 0x2c, 0x93, 0x27, 0x32, 0xcb, 0xe4, 0x84, 0x81, 0xfc, 0x70, + 0x52, 0x0a, 0xc4, 0x70, 0xc2, 0x77, 0xe2, 0xe4, 0x0a, 0x71, 0xa2, 0xe4, 0x2e, 0x71, 0xd8, 0xf5, + 0x6e, 0xd6, 0x75, 0xa4, 0xc0, 0x8d, 0xb1, 0xb2, 0x7d, 0x5d, 0xcb, 0x12, 0xc3, 0x9d, 0xf4, 0xd1, + 0x36, 0x20, 0x76, 0x95, 0x1c, 0x39, 0x41, 0xcc, 0xc7, 0xe2, 0x09, 0xd3, 0x78, 0x7f, 0xad, 0xce, + 0x8a, 0x56, 0xd1, 0xb5, 0x0e, 0x6a, 0xb8, 0x4b, 0x0b, 0x9a, 0xb3, 0xc0, 0x60, 0x51, 0x67, 0x81, + 0xa1, 0x1c, 0xb7, 0xf7, 0x2f, 0x59, 0x70, 0x92, 0x7e, 0x16, 0xd3, 0x45, 0x3a, 0x46, 0x21, 0x4c, + 0xd2, 0x65, 0xe7, 0x93, 0x44, 0x96, 0x89, 0xfd, 0x95, 0x23, 0x59, 0x9b, 0x74, 0x52, 0xf1, 0xed, + 0xaa, 0x49, 0x0c, 0x67, 0xa9, 0xdb, 0xdf, 0xb4, 0x80, 0x39, 0x2d, 0x1e, 0xc3, 0x61, 0x76, 0xd9, + 0x3c, 0xcc, 0xec, 0x7c, 0x8e, 0xd1, 0xe3, 0x1c, 0x7b, 0x11, 0xa6, 0x28, 0xb4, 0x16, 0x85, 0x0f, + 0x76, 0xa4, 0xa0, 0x9d, 0x6f, 0xcd, 0xfe, 0x52, 0x89, 0x6f, 0x1b, 0x15, 0x92, 0x89, 0xbe, 0x6c, + 0xc1, 0x48, 0xc3, 0x69, 0x39, 0x0d, 0x9e, 0x9f, 0xaa, 0x80, 0x75, 0xc6, 0xa8, 0x3f, 0xbf, 0x2c, + 0xea, 0x72, 0xcb, 0xc2, 0x87, 0xe5, 0xd0, 0x65, 0x71, 0xae, 0x35, 0x41, 0x35, 0x3e, 0x7b, 0x0f, + 0xc6, 0x0d, 0x62, 0x47, 0xaa, 0x86, 0x7e, 0xd9, 0xe2, 0x4c, 0x5f, 0xa9, 0x0a, 0xf7, 0xe1, 0x44, + 0xa0, 0xfd, 0xa7, 0xec, 0x4c, 0x4a, 0xc6, 0xf3, 0xc5, 0xd9, 0x3a, 0xe3, 0x82, 0x9a, 0x83, 0x66, + 0x86, 0x20, 0xee, 0x6c, 0xc3, 0xfe, 0x15, 0x0b, 0x1e, 0xd1, 0x11, 0xb5, 0x18, 0xda, 0x3c, 0xbb, + 0x71, 0x15, 0x46, 0xc2, 0x16, 0x89, 0x9c, 0x54, 0x2d, 0x3a, 0x27, 0xe7, 0xff, 0xa6, 0x28, 0xdf, + 0xdf, 0x9d, 0x9b, 0xd6, 0xa9, 0xcb, 0x72, 0xac, 0x6a, 0x22, 0x1b, 0x86, 0xd8, 0xbc, 0xc4, 0x22, + 0xfa, 0x99, 0xe5, 0x6b, 0x62, 0xf7, 0x52, 0x31, 0x16, 0x10, 0xfb, 0x6f, 0x5a, 0x7c, 0xb9, 0xe9, + 0x5d, 0x47, 0x9f, 0x83, 0xa9, 0x2d, 0xaa, 0x41, 0xad, 0x3c, 0x68, 0x45, 0xdc, 0xea, 0x2d, 0x67, + 0xec, 0xa5, 0xe2, 0x33, 0xa6, 0x0d, 0x77, 0x69, 0x46, 0xf4, 0x7e, 0xea, 0x7a, 0x86, 0x2c, 0xee, + 0x68, 0xc8, 0xfe, 0x07, 0x25, 0xbe, 0x67, 0x99, 0x0c, 0xf7, 0x0c, 0x0c, 0xb7, 0x42, 0x77, 0x79, + 0xad, 0x8a, 0xc5, 0x5c, 0x29, 0xa6, 0x53, 0xe3, 0xc5, 0x58, 0xc2, 0xd1, 0x45, 0x00, 0xf2, 0x20, + 0x21, 0x51, 0xe0, 0xf8, 0xea, 0x26, 0x5d, 0x89, 0x4a, 0x2b, 0x0a, 0x82, 0x35, 0x2c, 0x5a, 0xa7, + 0x15, 0x85, 0xdb, 0x9e, 0xcb, 0x82, 0x3f, 0xca, 0x66, 0x9d, 0x9a, 0x82, 0x60, 0x0d, 0x8b, 0xea, + 0xad, 0xed, 0x20, 0xe6, 0xc7, 0x98, 0x73, 0x57, 0xa4, 0x17, 0x1a, 0x49, 0xf5, 0xd6, 0x5b, 0x3a, + 0x10, 0x9b, 0xb8, 0xe8, 0x2a, 0x0c, 0x25, 0x0e, 0xbb, 0x1f, 0x1e, 0x2c, 0xe2, 0x6c, 0xb3, 0x4e, + 0x71, 0xf5, 0x7c, 0x4e, 0xb4, 0x2a, 0x16, 0x24, 0xec, 0xff, 0x54, 0x01, 0x48, 0xa5, 0x2e, 0xf4, + 0xc5, 0xce, 0x0d, 0xff, 0x91, 0xa2, 0x22, 0xdb, 0xc3, 0xdb, 0xed, 0xe8, 0xab, 0x16, 0x8c, 0x3a, + 0xbe, 0x1f, 0x36, 0x9c, 0x84, 0x4d, 0x4f, 0xa9, 0x28, 0xeb, 0x11, 0x3d, 0x59, 0x4c, 0xeb, 0xf2, + 0xce, 0xbc, 0x20, 0xef, 0x6c, 0x35, 0x48, 0x6e, 0x7f, 0xf4, 0x2e, 0xa0, 0x0f, 0x4b, 0xa9, 0x9d, + 0x7f, 0xe1, 0xd9, 0xac, 0xd4, 0x5e, 0x61, 0x0c, 0x57, 0x13, 0xd8, 0xd1, 0x5b, 0x46, 0x3a, 0x9e, + 0x81, 0x22, 0x11, 0xbc, 0x86, 0x1c, 0x92, 0x97, 0x89, 0x07, 0xbd, 0xa1, 0x7b, 0xa5, 0x0f, 0x16, + 0x09, 0x91, 0xd7, 0xc4, 0xe1, 0x1c, 0x8f, 0xf4, 0x04, 0x26, 0x5d, 0xf3, 0xe4, 0x15, 0x9e, 0x75, + 0x17, 0xf2, 0x5b, 0xc8, 0x1c, 0xd9, 0xe9, 0x59, 0x9b, 0x01, 0xe0, 0x6c, 0x13, 0xe8, 0x0d, 0x1e, + 0x33, 0xb0, 0x16, 0x6c, 0x84, 0xc2, 0xbb, 0xee, 0x7c, 0x81, 0x6f, 0xbe, 0x13, 0x27, 0x64, 0x8b, + 0xd6, 0x49, 0x0f, 0xd7, 0x1b, 0x82, 0x0a, 0x56, 0xf4, 0xd0, 0x3a, 0x0c, 0xb1, 0x80, 0xad, 0x78, + 0x66, 0xa4, 0x88, 0x25, 0xce, 0x8c, 0x53, 0x4e, 0xf7, 0x0f, 0xfb, 0x1b, 0x63, 0x41, 0x0b, 0x5d, + 0x91, 0x99, 0x0a, 0xe2, 0xb5, 0xe0, 0x56, 0x4c, 0x58, 0xa6, 0x82, 0xca, 0xd2, 0x87, 0xd2, 0xd4, + 0x03, 0xbc, 0xbc, 0x6b, 0x42, 0x42, 0xa3, 0x26, 0x15, 0x6c, 0xc4, 0x7f, 0x99, 0xe7, 0x70, 0x06, + 0x8a, 0x74, 0xd4, 0xcc, 0x8a, 0x98, 0x4e, 0xf6, 0x6d, 0x93, 0x18, 0xce, 0x52, 0x3f, 0xd6, 0x23, + 0x75, 0x36, 0x80, 0xa9, 0xec, 0xa6, 0x3c, 0xd2, 0x23, 0xfc, 0xc7, 0x03, 0x30, 0x61, 0x2e, 0x0e, + 0xb4, 0x00, 0x15, 0x41, 0x44, 0xe5, 0x3d, 0x53, 0x7b, 0xe0, 0xba, 0x04, 0xe0, 0x14, 0x87, 0x65, + 0x80, 0x63, 0xd5, 0x35, 0xbf, 0xaa, 0x34, 0x03, 0x9c, 0x82, 0x60, 0x0d, 0x8b, 0x4a, 0xc2, 0x77, + 0xc3, 0x30, 0x51, 0x27, 0x81, 0x5a, 0x37, 0x4b, 0xac, 0x14, 0x0b, 0x28, 0x3d, 0x01, 0xee, 0xd1, + 0x8f, 0xe9, 0x9b, 0x56, 0x45, 0x75, 0x02, 0x5c, 0xd5, 0x81, 0xd8, 0xc4, 0xa5, 0x27, 0x5a, 0x18, + 0xb3, 0x85, 0x28, 0xe4, 0xed, 0xd4, 0x4f, 0xad, 0xce, 0x83, 0x18, 0x25, 0x1c, 0x7d, 0x0a, 0x1e, + 0x51, 0x31, 0x87, 0x98, 0x5b, 0x69, 0x65, 0x8b, 0x43, 0x86, 0xca, 0xfc, 0xc8, 0x72, 0x77, 0x34, + 0xdc, 0xab, 0x3e, 0x7a, 0x15, 0x26, 0x84, 0xac, 0x2c, 0x29, 0x0e, 0x9b, 0xee, 0x06, 0x57, 0x0d, + 0x28, 0xce, 0x60, 0xa3, 0x2a, 0x4c, 0xd1, 0x12, 0x26, 0xa4, 0x4a, 0x0a, 0x3c, 0x76, 0x52, 0x1d, + 0xf5, 0x57, 0x33, 0x70, 0xdc, 0x51, 0x03, 0x2d, 0xc2, 0x24, 0x17, 0x56, 0xa8, 0x62, 0xc8, 0xbe, + 0x83, 0x70, 0x89, 0x55, 0x1b, 0xe1, 0xa6, 0x09, 0xc6, 0x59, 0x7c, 0x74, 0x09, 0xc6, 0x9c, 0xa8, + 0xb1, 0xe9, 0x25, 0xa4, 0x91, 0xb4, 0x23, 0x9e, 0x07, 0x44, 0xf3, 0xd7, 0x58, 0xd4, 0x60, 0xd8, + 0xc0, 0xb4, 0x3f, 0x0b, 0x27, 0xbb, 0xf8, 0xdf, 0xd3, 0x85, 0xe3, 0xb4, 0x3c, 0x39, 0xa6, 0x8c, + 0xc7, 0xd9, 0x62, 0x6d, 0x4d, 0x8e, 0x46, 0xc3, 0xa2, 0xab, 0x93, 0x99, 0xa7, 0xb5, 0xb4, 0xa4, + 0x6a, 0x75, 0xae, 0x4a, 0x00, 0x4e, 0x71, 0xec, 0x3f, 0xaf, 0x80, 0x66, 0xbd, 0x29, 0xe0, 0x65, + 0x74, 0x09, 0xc6, 0x64, 0xa6, 0x5d, 0x2d, 0xc3, 0xa5, 0x1a, 0xe6, 0x65, 0x0d, 0x86, 0x0d, 0x4c, + 0xda, 0xb7, 0x40, 0xda, 0xa4, 0xb2, 0xfe, 0x6d, 0xca, 0x58, 0x85, 0x53, 0x1c, 0x74, 0x1e, 0x46, + 0x62, 0xe2, 0x6f, 0x5c, 0xf3, 0x82, 0x7b, 0x62, 0x61, 0x2b, 0xce, 0x5c, 0x17, 0xe5, 0x58, 0x61, + 0xa0, 0x25, 0x28, 0xb7, 0x3d, 0x57, 0x2c, 0x65, 0x29, 0x36, 0x94, 0x6f, 0xad, 0x55, 0xf7, 0x77, + 0xe7, 0x9e, 0xe8, 0x95, 0xc0, 0x98, 0xea, 0xe7, 0xf1, 0x3c, 0xdd, 0x7e, 0xb4, 0x72, 0x37, 0x3b, + 0xfd, 0x50, 0x9f, 0x76, 0xfa, 0x8b, 0x00, 0x62, 0xd4, 0x72, 0x2d, 0x97, 0xd3, 0xaf, 0x76, 0x59, + 0x41, 0xb0, 0x86, 0x45, 0xb5, 0xfc, 0x46, 0x44, 0x1c, 0xa9, 0x08, 0x73, 0xbf, 0xf0, 0x91, 0xc3, + 0x6b, 0xf9, 0xcb, 0x59, 0x62, 0xb8, 0x93, 0x3e, 0x0a, 0xe1, 0x84, 0x2b, 0x02, 0x5b, 0xd3, 0x46, + 0x2b, 0xfd, 0x3b, 0xa3, 0x33, 0x97, 0x9a, 0x2c, 0x21, 0xdc, 0x49, 0x1b, 0x7d, 0x06, 0x66, 0x65, + 0x61, 0x67, 0x54, 0x31, 0xdb, 0x2e, 0xe5, 0xa5, 0x33, 0x7b, 0xbb, 0x73, 0xb3, 0xd5, 0x9e, 0x58, + 0xf8, 0x00, 0x0a, 0xe8, 0x4d, 0x18, 0x62, 0xf7, 0x3a, 0xf1, 0xcc, 0x28, 0x3b, 0xf1, 0x5e, 0x2c, + 0x12, 0xd2, 0x40, 0x57, 0xfd, 0x3c, 0xbb, 0x1d, 0x12, 0xce, 0xba, 0xe9, 0x65, 0x19, 0x2b, 0xc4, + 0x82, 0x26, 0x6a, 0xc1, 0xa8, 0x13, 0x04, 0x61, 0xe2, 0x70, 0x41, 0x6c, 0xac, 0x88, 0x2c, 0xa9, + 0x35, 0xb1, 0x98, 0xd6, 0xe5, 0xed, 0x28, 0xff, 0x3f, 0x0d, 0x82, 0xf5, 0x26, 0xd0, 0x7d, 0x98, + 0x0c, 0xef, 0x53, 0x86, 0x29, 0xaf, 0x36, 0xe2, 0x99, 0x71, 0x73, 0x60, 0x39, 0x86, 0x5a, 0xa3, + 0xb2, 0xc6, 0xc9, 0x4c, 0xa2, 0x38, 0xdb, 0x0a, 0x9a, 0x37, 0xcc, 0xd5, 0x13, 0xa9, 0x4b, 0x7a, + 0x6a, 0xae, 0xd6, 0xad, 0xd3, 0x2c, 0x72, 0x9d, 0xbb, 0xa1, 0x32, 0x8e, 0x30, 0x99, 0x89, 0x5c, + 0x4f, 0x41, 0x58, 0xc7, 0x9b, 0xfd, 0x28, 0x8c, 0x6a, 0x13, 0xdf, 0x8f, 0xef, 0xf3, 0xec, 0xab, + 0x30, 0x95, 0x9d, 0xd0, 0xbe, 0x7c, 0xa7, 0xff, 0x57, 0x09, 0x26, 0xbb, 0xdc, 0x1b, 0xdd, 0xf3, + 0x98, 0xff, 0xbe, 0xc1, 0xfa, 0xae, 0x7a, 0x81, 0x8b, 0x19, 0xc4, 0x64, 0x60, 0xa5, 0x02, 0x0c, + 0x4c, 0x72, 0xd3, 0x72, 0x4f, 0x6e, 0x2a, 0x98, 0xd6, 0xc0, 0x7b, 0x61, 0x5a, 0xe6, 0x39, 0x31, + 0x58, 0xe8, 0x9c, 0x78, 0x08, 0x8c, 0xce, 0x38, 0x6a, 0x86, 0x0b, 0x1c, 0x35, 0xdf, 0x28, 0xc1, + 0x54, 0xea, 0x27, 0x2e, 0xd2, 0x6f, 0x1f, 0xfd, 0x35, 0xc4, 0xba, 0x71, 0x0d, 0x91, 0x97, 0x5d, + 0x3b, 0xd3, 0xbf, 0x9e, 0x57, 0x12, 0x6f, 0x66, 0xae, 0x24, 0x5e, 0xec, 0x93, 0xee, 0xc1, 0xd7, + 0x13, 0xdf, 0x2d, 0xc1, 0xa9, 0x6c, 0x95, 0x65, 0xdf, 0xf1, 0xb6, 0x8e, 0x61, 0xbe, 0x3e, 0x65, + 0xcc, 0xd7, 0xcb, 0xfd, 0x8d, 0x8b, 0x75, 0xb2, 0xe7, 0xa4, 0x39, 0x99, 0x49, 0xfb, 0xe8, 0x61, + 0x88, 0x1f, 0x3c, 0x73, 0xbf, 0x6f, 0xc1, 0xa3, 0x5d, 0xeb, 0x1d, 0x83, 0xe1, 0xf5, 0x75, 0xd3, + 0xf0, 0xfa, 0xc2, 0x21, 0x46, 0xd7, 0xc3, 0x12, 0xfb, 0xab, 0xe5, 0x1e, 0xa3, 0x62, 0xa6, 0xa9, + 0x9b, 0x30, 0xea, 0x34, 0x1a, 0x24, 0x8e, 0xaf, 0x87, 0xae, 0xca, 0x81, 0xf5, 0x3c, 0x3b, 0x5b, + 0xd2, 0xe2, 0xfd, 0xdd, 0xb9, 0xd9, 0x2c, 0x89, 0x14, 0x8c, 0x75, 0x0a, 0x66, 0x76, 0xbe, 0xd2, + 0x11, 0x65, 0xe7, 0xbb, 0x08, 0xb0, 0xad, 0xb4, 0xd8, 0xac, 0xc5, 0x4b, 0xd3, 0x6f, 0x35, 0x2c, + 0xf4, 0x97, 0x99, 0x44, 0xc8, 0x9d, 0x34, 0x06, 0xcc, 0x90, 0xd3, 0x9c, 0xef, 0xa7, 0x3b, 0x7c, + 0xf0, 0xc8, 0x56, 0x65, 0x1d, 0x54, 0x24, 0xd1, 0x27, 0x60, 0x2a, 0xe6, 0xf9, 0x13, 0x96, 0x7d, + 0x27, 0x66, 0x01, 0x12, 0x82, 0x9f, 0xb2, 0x20, 0xd5, 0x7a, 0x06, 0x86, 0x3b, 0xb0, 0xed, 0xef, + 0x94, 0xe1, 0x83, 0x07, 0x2c, 0x5b, 0xb4, 0x68, 0xde, 0xda, 0x3e, 0x97, 0xb5, 0xff, 0xcc, 0x76, + 0xad, 0x6c, 0x18, 0x84, 0x32, 0x5f, 0xbb, 0xf4, 0x9e, 0xbf, 0xf6, 0xd7, 0x74, 0x6b, 0x1d, 0xf7, + 0xdb, 0xbc, 0x7c, 0xe8, 0x8d, 0xf9, 0x93, 0x6a, 0xac, 0xff, 0x82, 0x05, 0x4f, 0x74, 0x1d, 0x96, + 0xe1, 0x25, 0xb2, 0x00, 0x95, 0x06, 0x2d, 0xd4, 0xc2, 0x99, 0xd2, 0x38, 0x42, 0x09, 0xc0, 0x29, + 0x8e, 0xe1, 0x0c, 0x52, 0xca, 0x75, 0x06, 0xf9, 0x1d, 0x0b, 0xa6, 0xb3, 0x9d, 0x38, 0x06, 0xbe, + 0x55, 0x37, 0xf9, 0xd6, 0x7c, 0x7f, 0x1f, 0xbf, 0x07, 0xcb, 0xfa, 0x6f, 0x13, 0x70, 0xba, 0xe3, + 0xd4, 0xe3, 0xb3, 0xf8, 0x73, 0x16, 0x9c, 0x68, 0x32, 0xe9, 0x5d, 0x8b, 0x19, 0x13, 0xe3, 0xca, + 0x09, 0xb4, 0x3b, 0x30, 0xd4, 0x8c, 0xeb, 0x22, 0x1d, 0x28, 0xb8, 0xb3, 0x31, 0xf4, 0x15, 0x0b, + 0xa6, 0x9d, 0xfb, 0x71, 0xc7, 0xe3, 0x30, 0x62, 0x21, 0xbd, 0x9a, 0x63, 0x2c, 0xcb, 0x79, 0x56, + 0x66, 0x69, 0x66, 0x6f, 0x77, 0x6e, 0xba, 0x1b, 0x16, 0xee, 0xda, 0x2a, 0xfd, 0xbe, 0x9b, 0x22, + 0x76, 0xa4, 0x58, 0xf4, 0x63, 0xb7, 0x48, 0x13, 0xce, 0xd6, 0x24, 0x04, 0x2b, 0x8a, 0xe8, 0x6d, + 0xa8, 0x34, 0x65, 0x98, 0x58, 0x96, 0x6d, 0xf6, 0x98, 0xe6, 0x6e, 0x51, 0x65, 0xdc, 0x77, 0x5f, + 0x81, 0x70, 0x4a, 0x14, 0x5d, 0x81, 0x72, 0xb0, 0x11, 0x8b, 0x80, 0xec, 0x3c, 0x1f, 0x20, 0xd3, + 0xf3, 0x8a, 0xc7, 0xb0, 0xde, 0x58, 0xad, 0x63, 0x4a, 0x82, 0x52, 0x8a, 0xee, 0xba, 0xc2, 0x4a, + 0x9c, 0x43, 0x09, 0x2f, 0x55, 0x3b, 0x29, 0xe1, 0xa5, 0x2a, 0xa6, 0x24, 0x50, 0x0d, 0x06, 0x59, + 0x64, 0x8a, 0x30, 0x01, 0xe7, 0x44, 0xed, 0x77, 0xc4, 0xdf, 0xf0, 0x24, 0x92, 0xac, 0x18, 0x73, + 0x42, 0x68, 0x1d, 0x86, 0x1a, 0xec, 0x1d, 0x04, 0xa1, 0x9b, 0xe7, 0xe5, 0xb3, 0xe8, 0x78, 0x33, + 0x81, 0xdf, 0x7b, 0xf1, 0x72, 0x2c, 0x68, 0x31, 0xaa, 0xa4, 0xb5, 0xb9, 0x11, 0x0b, 0xe5, 0x3b, + 0x8f, 0x6a, 0xc7, 0x8b, 0x16, 0x82, 0x2a, 0x2b, 0xc7, 0x82, 0x16, 0xaa, 0x42, 0x69, 0xa3, 0x21, + 0x02, 0x57, 0x72, 0x4c, 0xbf, 0x66, 0x40, 0xf2, 0xd2, 0xd0, 0xde, 0xee, 0x5c, 0x69, 0x75, 0x19, + 0x97, 0x36, 0x1a, 0xe8, 0x75, 0x18, 0xde, 0xe0, 0x21, 0xa6, 0x22, 0xef, 0xec, 0x85, 0xbc, 0x38, + 0xd8, 0x8e, 0x78, 0x54, 0x1e, 0x9f, 0x21, 0x00, 0x58, 0x92, 0x63, 0x29, 0xf9, 0x54, 0xd0, 0xac, + 0x48, 0x3c, 0x3b, 0xdf, 0x5f, 0x90, 0xad, 0xd0, 0x49, 0x55, 0x29, 0xd6, 0x28, 0xd2, 0x35, 0xef, + 0xc8, 0x27, 0x5d, 0x58, 0xd2, 0xd9, 0xdc, 0x35, 0xdf, 0xf5, 0x05, 0x18, 0xbe, 0xe6, 0x15, 0x08, + 0xa7, 0x44, 0x51, 0x1b, 0xc6, 0xb7, 0xe3, 0xd6, 0x26, 0x91, 0x5b, 0x9f, 0x65, 0xa2, 0x1d, 0xbd, + 0xf8, 0xf1, 0x9c, 0xf4, 0xc2, 0xa2, 0x8a, 0x17, 0x25, 0x6d, 0xc7, 0xef, 0xe0, 0x60, 0x2c, 0x07, + 0xda, 0x6d, 0x9d, 0x2c, 0x36, 0x5b, 0xa1, 0x9f, 0xe4, 0xdd, 0x76, 0x78, 0x77, 0x27, 0x21, 0x22, + 0x53, 0x6d, 0xce, 0x27, 0x79, 0x8d, 0x23, 0x77, 0x7e, 0x12, 0x01, 0xc0, 0x92, 0x9c, 0x9a, 0x32, + 0xc6, 0x8d, 0xa7, 0x0a, 0x4f, 0x59, 0xc7, 0x18, 0xd2, 0x29, 0x63, 0xdc, 0x37, 0x25, 0xca, 0xb8, + 0x6e, 0x6b, 0x33, 0x4c, 0xc2, 0x20, 0xc3, 0xfb, 0x4f, 0x14, 0xe1, 0xba, 0xb5, 0x2e, 0x35, 0x3b, + 0xb9, 0x6e, 0x37, 0x2c, 0xdc, 0xb5, 0x55, 0x14, 0xc0, 0x44, 0x2b, 0x8c, 0x92, 0xfb, 0x61, 0x24, + 0xd7, 0x21, 0x2a, 0xa4, 0x23, 0x1a, 0x75, 0x44, 0xdb, 0xcc, 0x0d, 0xd7, 0x84, 0xe0, 0x0c, 0x75, + 0xfa, 0xe9, 0xe2, 0x86, 0xe3, 0x93, 0xb5, 0x9b, 0x33, 0x27, 0x8b, 0x7c, 0xba, 0x3a, 0x47, 0xee, + 0xfc, 0x74, 0x02, 0x80, 0x25, 0x39, 0xfb, 0x57, 0x86, 0x3a, 0x05, 0x07, 0xa6, 0x1a, 0xfc, 0x8d, + 0xce, 0x9b, 0xd8, 0x4f, 0xf4, 0xaf, 0x01, 0x3f, 0xc4, 0x3b, 0xd9, 0xaf, 0x58, 0x70, 0xba, 0xd5, + 0x55, 0x2c, 0x10, 0x47, 0x6f, 0xbf, 0x8a, 0x34, 0x9f, 0x16, 0x95, 0x50, 0xba, 0x3b, 0x1c, 0xf7, + 0x68, 0x33, 0x2b, 0x4c, 0x97, 0xdf, 0xb3, 0x30, 0x7d, 0x07, 0x46, 0x98, 0xf4, 0x97, 0xa6, 0x8b, + 0xe9, 0x33, 0xb3, 0x0a, 0x3b, 0xc4, 0x97, 0x05, 0x09, 0xac, 0x88, 0xd1, 0x89, 0x7b, 0x3c, 0x3b, + 0x08, 0x4c, 0x18, 0x58, 0xa4, 0x31, 0xe4, 0x9a, 0xca, 0xaa, 0x98, 0x89, 0xc7, 0x6b, 0x07, 0x21, + 0xef, 0xe7, 0x21, 0xe0, 0x83, 0x1b, 0x43, 0xd5, 0x2e, 0xaa, 0xd2, 0x90, 0x79, 0xed, 0x92, 0xaf, + 0x2e, 0x1d, 0xaf, 0x88, 0xff, 0x0f, 0xad, 0x2e, 0x12, 0x29, 0x57, 0xcb, 0x3e, 0x6e, 0xaa, 0x65, + 0x4f, 0x67, 0xd5, 0xb2, 0x0e, 0x63, 0x8c, 0xa1, 0x91, 0x15, 0x4f, 0xc3, 0x5a, 0x34, 0x1f, 0x8e, + 0xed, 0xc3, 0xd9, 0x3c, 0x76, 0xc7, 0x5c, 0xb1, 0x5c, 0x75, 0x09, 0x99, 0xba, 0x62, 0xb9, 0x6b, + 0x55, 0xcc, 0x20, 0x45, 0x53, 0x2a, 0xd8, 0x3f, 0x5f, 0x82, 0x72, 0x2d, 0x74, 0x8f, 0xc1, 0xb8, + 0x74, 0xd9, 0x30, 0x2e, 0x3d, 0x95, 0xfb, 0xc4, 0x5f, 0x4f, 0x53, 0xd2, 0xcd, 0x8c, 0x29, 0xe9, + 0x67, 0xf2, 0x49, 0x1d, 0x6c, 0x38, 0xfa, 0x5e, 0x19, 0xf4, 0x47, 0x0a, 0xd1, 0x7f, 0x38, 0x8c, + 0x87, 0x6e, 0xb9, 0xd8, 0xbb, 0x85, 0xa2, 0x0d, 0xe6, 0xc9, 0x25, 0xe3, 0xfa, 0x7e, 0x62, 0x1d, + 0x75, 0xef, 0x10, 0xaf, 0xb9, 0x99, 0x10, 0x37, 0x3b, 0xb0, 0xe3, 0x73, 0xd4, 0xfd, 0x33, 0x0b, + 0x26, 0x33, 0xad, 0x23, 0xbf, 0x5b, 0x40, 0xd0, 0x21, 0xcd, 0x45, 0x27, 0x72, 0x23, 0x88, 0xe6, + 0x01, 0x94, 0xd5, 0x5f, 0x9a, 0x64, 0x98, 0x74, 0xaa, 0xae, 0x05, 0x62, 0xac, 0x61, 0xa0, 0x97, + 0x60, 0x34, 0x09, 0x5b, 0xa1, 0x1f, 0x36, 0x77, 0xae, 0x12, 0x99, 0xec, 0x43, 0xdd, 0x98, 0xac, + 0xa7, 0x20, 0xac, 0xe3, 0xd9, 0xdf, 0x2f, 0x43, 0xf6, 0x89, 0xcb, 0xff, 0xbf, 0x4e, 0x7f, 0x72, + 0xd6, 0xe9, 0x1f, 0x5a, 0x30, 0x45, 0x5b, 0x67, 0xae, 0x33, 0xd2, 0xa1, 0x56, 0xbd, 0x09, 0x61, + 0x1d, 0xf0, 0x26, 0xc4, 0xd3, 0x94, 0xdb, 0xb9, 0x61, 0x3b, 0x11, 0x46, 0x24, 0x8d, 0x89, 0xd1, + 0x52, 0x2c, 0xa0, 0x02, 0x8f, 0x44, 0x91, 0x88, 0x3c, 0xd2, 0xf1, 0x48, 0x14, 0x61, 0x01, 0x95, + 0x4f, 0x46, 0x0c, 0xf4, 0x78, 0x32, 0x82, 0xa5, 0xcb, 0x12, 0xee, 0x1a, 0x42, 0xac, 0xd0, 0xd2, + 0x65, 0x49, 0x3f, 0x8e, 0x14, 0xc7, 0xfe, 0x56, 0x19, 0xc6, 0x6a, 0xa1, 0x9b, 0x7a, 0xca, 0xbf, + 0x68, 0x78, 0xca, 0x9f, 0xcd, 0x78, 0xca, 0x4f, 0xe9, 0xb8, 0x0f, 0xc7, 0x51, 0x5e, 0xa4, 0x55, + 0x63, 0x8f, 0x9a, 0x1c, 0xd2, 0x49, 0xde, 0x48, 0xab, 0xa6, 0x08, 0x61, 0x93, 0xee, 0x4f, 0x93, + 0x73, 0xfc, 0xff, 0xb1, 0x60, 0xa2, 0x16, 0xba, 0x74, 0x81, 0xfe, 0x34, 0xad, 0x46, 0x3d, 0x19, + 0xdb, 0xd0, 0x01, 0xc9, 0xd8, 0x7e, 0xcd, 0x82, 0xe1, 0x5a, 0xe8, 0x1e, 0x83, 0x81, 0x75, 0xd5, + 0x34, 0xb0, 0x3e, 0x91, 0xcb, 0x79, 0x7b, 0xd8, 0x54, 0xbf, 0x53, 0x86, 0x71, 0xda, 0xe3, 0xb0, + 0x29, 0xbf, 0x97, 0x31, 0x37, 0x56, 0x81, 0xb9, 0xa1, 0x22, 0x61, 0xe8, 0xfb, 0xe1, 0xfd, 0xec, + 0xb7, 0x5b, 0x65, 0xa5, 0x58, 0x40, 0xd1, 0x79, 0x18, 0x69, 0x45, 0x64, 0xdb, 0x0b, 0xdb, 0x71, + 0x36, 0x8a, 0xb1, 0x26, 0xca, 0xb1, 0xc2, 0x40, 0x2f, 0xc2, 0x58, 0xec, 0x05, 0x0d, 0x22, 0x9d, + 0x39, 0x06, 0x98, 0x33, 0x07, 0xcf, 0x7b, 0xa9, 0x95, 0x63, 0x03, 0x0b, 0xdd, 0x81, 0x0a, 0xfb, + 0xcf, 0x76, 0x50, 0xff, 0x6f, 0x3e, 0xf0, 0xdc, 0x2a, 0x92, 0x00, 0x4e, 0x69, 0xa1, 0x8b, 0x00, + 0x89, 0x74, 0x3b, 0x89, 0x45, 0x72, 0x19, 0x25, 0x97, 0x2a, 0x87, 0x94, 0x18, 0x6b, 0x58, 0xe8, + 0x39, 0xa8, 0x24, 0x8e, 0xe7, 0x5f, 0xf3, 0x02, 0x12, 0x0b, 0xb7, 0x1d, 0x91, 0xc3, 0x5a, 0x14, + 0xe2, 0x14, 0x4e, 0xcf, 0x7b, 0x16, 0x43, 0xcd, 0xdf, 0x93, 0x19, 0x61, 0xd8, 0xec, 0xbc, 0xbf, + 0xa6, 0x4a, 0xb1, 0x86, 0x61, 0x5f, 0x82, 0x53, 0xb5, 0xd0, 0xad, 0x85, 0x51, 0xb2, 0x1a, 0x46, + 0xf7, 0x9d, 0xc8, 0x95, 0xdf, 0x6f, 0x4e, 0xa6, 0x4e, 0xa6, 0x67, 0xf2, 0x20, 0xb7, 0x39, 0x1a, + 0xa9, 0x90, 0x5f, 0x60, 0x27, 0x7e, 0x9f, 0x21, 0x18, 0x7f, 0x50, 0x06, 0x54, 0x63, 0x8e, 0x31, + 0xc6, 0xf3, 0x43, 0x9b, 0x30, 0x11, 0x93, 0x6b, 0x5e, 0xd0, 0x7e, 0x20, 0x48, 0x15, 0x8b, 0x79, + 0xa9, 0xaf, 0xe8, 0x75, 0xb8, 0xa5, 0xc3, 0x2c, 0xc3, 0x19, 0xba, 0xf4, 0xcb, 0x46, 0xed, 0x60, + 0x31, 0xbe, 0x15, 0x93, 0x48, 0x3c, 0xb7, 0xf3, 0x51, 0x76, 0x11, 0x28, 0x0b, 0xf7, 0x77, 0xe7, + 0xce, 0xe5, 0xb8, 0x37, 0x04, 0xde, 0x03, 0x8a, 0xb9, 0x56, 0xc5, 0x29, 0x2d, 0xba, 0xd0, 0xd8, + 0x9f, 0x1b, 0x61, 0x80, 0xc3, 0x30, 0x91, 0x4b, 0x93, 0x3d, 0xd5, 0xa0, 0x95, 0x63, 0x03, 0x0b, + 0xc5, 0x80, 0xe2, 0x76, 0xab, 0xe5, 0xb3, 0x7b, 0x49, 0xc7, 0xbf, 0x1c, 0x85, 0xed, 0x16, 0xf7, + 0xa5, 0x2e, 0x2f, 0x2d, 0x53, 0x1e, 0x5c, 0xef, 0x80, 0xee, 0xef, 0xce, 0x3d, 0x93, 0xdf, 0x41, + 0x86, 0xbb, 0x56, 0xc5, 0x5d, 0xc8, 0x23, 0x0c, 0xc3, 0x1b, 0x31, 0xfb, 0x2d, 0x22, 0xb5, 0x2f, + 0x31, 0x43, 0x68, 0x9d, 0x15, 0xf5, 0x47, 0x5e, 0x12, 0xb2, 0x3f, 0xcf, 0x8e, 0x59, 0xf6, 0x1a, + 0x4b, 0xd2, 0x8e, 0x08, 0xda, 0x82, 0xf1, 0x16, 0x3b, 0x4a, 0x93, 0x28, 0xf4, 0x7d, 0x22, 0xa5, + 0xdc, 0xc3, 0x39, 0x08, 0xf1, 0xf7, 0x17, 0x74, 0x72, 0xd8, 0xa4, 0x6e, 0xff, 0xf7, 0x09, 0xc6, + 0x31, 0xc5, 0xa5, 0xf3, 0xb0, 0x70, 0x05, 0x16, 0xf2, 0xe4, 0x87, 0x8a, 0xbc, 0xab, 0x96, 0x9e, + 0x46, 0xc2, 0xb1, 0x18, 0x4b, 0x2a, 0xe8, 0xd3, 0xcc, 0xd1, 0x9d, 0xb3, 0xa9, 0xe2, 0xaf, 0x45, + 0x72, 0x7c, 0xc3, 0xc9, 0x5d, 0x90, 0xc0, 0x1a, 0x39, 0x74, 0x0d, 0xc6, 0xc5, 0xe3, 0x1d, 0xc2, + 0x58, 0x52, 0x36, 0x14, 0xfd, 0x71, 0xac, 0x03, 0xf7, 0xb3, 0x05, 0xd8, 0xac, 0x8c, 0x9a, 0xf0, + 0xb8, 0xf6, 0x38, 0x55, 0x17, 0x67, 0x36, 0xce, 0xff, 0x9e, 0xd8, 0xdb, 0x9d, 0x7b, 0x7c, 0xfd, + 0x20, 0x44, 0x7c, 0x30, 0x1d, 0x74, 0x13, 0x4e, 0x39, 0x8d, 0xc4, 0xdb, 0x26, 0x55, 0xe2, 0xb8, + 0xbe, 0x17, 0x10, 0x33, 0xf6, 0xff, 0xd1, 0xbd, 0xdd, 0xb9, 0x53, 0x8b, 0xdd, 0x10, 0x70, 0xf7, + 0x7a, 0xe8, 0xe3, 0x50, 0x71, 0x83, 0x58, 0xcc, 0xc1, 0x90, 0xf1, 0x16, 0x5b, 0xa5, 0x7a, 0xa3, + 0xae, 0xc6, 0x9f, 0xfe, 0xc1, 0x69, 0x05, 0xf4, 0x2e, 0x8c, 0xe9, 0xc1, 0x45, 0xe2, 0x0d, 0xc0, + 0x97, 0x0b, 0x69, 0xf1, 0x46, 0x44, 0x0e, 0xb7, 0x23, 0x2a, 0xa7, 0x51, 0x23, 0x58, 0xc7, 0x68, + 0x02, 0x7d, 0x12, 0x50, 0x4c, 0xa2, 0x6d, 0xaf, 0x41, 0x16, 0x1b, 0x2c, 0x65, 0x2d, 0xb3, 0x34, + 0x8d, 0x18, 0xd1, 0x13, 0xa8, 0xde, 0x81, 0x81, 0xbb, 0xd4, 0x42, 0x57, 0x28, 0xff, 0xd3, 0x4b, + 0x85, 0x8f, 0xaf, 0x14, 0x4f, 0x67, 0xaa, 0xa4, 0x15, 0x91, 0x86, 0x93, 0x10, 0xd7, 0xa4, 0x88, + 0x33, 0xf5, 0xe8, 0xe9, 0xa8, 0x5e, 0x25, 0x00, 0xd3, 0x33, 0xb5, 0xf3, 0x65, 0x02, 0xaa, 0xed, + 0x6d, 0x86, 0x71, 0x72, 0x83, 0x24, 0xf7, 0xc3, 0xe8, 0x9e, 0x48, 0xf3, 0x95, 0xe6, 0xff, 0x4b, + 0x41, 0x58, 0xc7, 0xa3, 0x92, 0x1c, 0xbb, 0xc2, 0x5b, 0xab, 0xb2, 0xfb, 0x91, 0x91, 0x74, 0xef, + 0x5c, 0xe1, 0xc5, 0x58, 0xc2, 0x25, 0xea, 0x5a, 0x6d, 0x99, 0xdd, 0x75, 0x64, 0x50, 0xd7, 0x6a, + 0xcb, 0x58, 0xc2, 0x51, 0xd8, 0xf9, 0xe2, 0xdd, 0x44, 0x91, 0x7b, 0xa7, 0xce, 0xf3, 0xa4, 0xe0, + 0xa3, 0x77, 0x0f, 0x60, 0x4a, 0xbd, 0xba, 0xc7, 0x33, 0xa1, 0xc5, 0x33, 0x93, 0x6c, 0xe1, 0x1c, + 0x26, 0xa1, 0x9a, 0xb2, 0x2e, 0xae, 0x65, 0x68, 0xe2, 0x8e, 0x56, 0x8c, 0x1c, 0x16, 0x53, 0xb9, + 0x2f, 0x4d, 0x2c, 0x40, 0x25, 0x6e, 0xdf, 0x75, 0xc3, 0x2d, 0xc7, 0x0b, 0xd8, 0x85, 0x84, 0xfe, + 0x6e, 0xbf, 0x04, 0xe0, 0x14, 0x07, 0xd5, 0x60, 0xc4, 0x11, 0x8a, 0xa4, 0xb8, 0x38, 0xc8, 0x89, + 0x71, 0x97, 0x6a, 0x27, 0xb7, 0xf1, 0xca, 0x7f, 0x58, 0x51, 0x41, 0xaf, 0xc0, 0xb8, 0x08, 0xd1, + 0x12, 0xae, 0x94, 0x27, 0x4d, 0x77, 0xfe, 0xba, 0x0e, 0xc4, 0x26, 0x2e, 0x6a, 0xc2, 0x04, 0xa5, + 0x92, 0x32, 0xc0, 0x99, 0xe9, 0xfe, 0x78, 0xa8, 0x96, 0xd3, 0x5b, 0x27, 0x83, 0x33, 0x64, 0x91, + 0x0b, 0x8f, 0x39, 0xed, 0x24, 0xdc, 0xa2, 0x3b, 0xc1, 0xdc, 0x27, 0xeb, 0xe1, 0x3d, 0x12, 0xcc, + 0x9c, 0x62, 0x2b, 0xf0, 0xec, 0xde, 0xee, 0xdc, 0x63, 0x8b, 0x07, 0xe0, 0xe1, 0x03, 0xa9, 0xa0, + 0xb7, 0x60, 0x34, 0x09, 0x7d, 0xe1, 0x21, 0x1d, 0xcf, 0x9c, 0x2e, 0x92, 0x59, 0x67, 0x5d, 0x55, + 0xd0, 0x8d, 0x29, 0x8a, 0x08, 0xd6, 0x29, 0xa2, 0xb7, 0x61, 0x8c, 0x7e, 0xfb, 0xeb, 0x4e, 0xab, + 0xe5, 0x05, 0xcd, 0x78, 0xe6, 0x91, 0x22, 0xb3, 0xa5, 0xf2, 0x46, 0x9a, 0xfb, 0x97, 0x15, 0x91, + 0x18, 0x1b, 0x14, 0x67, 0x7f, 0x16, 0x4e, 0x74, 0x30, 0xbd, 0xbe, 0xdc, 0x54, 0xff, 0xe3, 0x20, + 0x54, 0x94, 0xe5, 0x12, 0x2d, 0x98, 0x46, 0xea, 0x47, 0xb3, 0x46, 0xea, 0x11, 0x2a, 0x28, 0xea, + 0x76, 0xe9, 0xcf, 0x74, 0x79, 0xc9, 0xfd, 0xd9, 0xdc, 0x5d, 0x5e, 0x3c, 0x72, 0xac, 0x8f, 0xf7, + 0xee, 0x53, 0xed, 0x75, 0xe0, 0x40, 0xed, 0xb5, 0xe0, 0xeb, 0x84, 0x54, 0x4f, 0x6d, 0x85, 0xee, + 0x5a, 0x2d, 0xfb, 0xf8, 0x56, 0x8d, 0x16, 0x62, 0x0e, 0x63, 0xfa, 0x05, 0x3d, 0xb5, 0x99, 0x7e, + 0x31, 0x7c, 0x48, 0xfd, 0x42, 0x12, 0xc0, 0x29, 0x2d, 0xb4, 0x0d, 0x27, 0x1a, 0xe6, 0x5b, 0x6a, + 0x2a, 0x1e, 0xec, 0xf9, 0x3e, 0xde, 0x32, 0x6b, 0x6b, 0x0f, 0xad, 0x2c, 0x67, 0xe9, 0xe1, 0xce, + 0x26, 0xd0, 0x2b, 0x30, 0xf2, 0x6e, 0x18, 0xb3, 0xeb, 0x13, 0x71, 0x74, 0xc9, 0xb8, 0x9b, 0x91, + 0xd7, 0x6e, 0xd6, 0x59, 0xf9, 0xfe, 0xee, 0xdc, 0x68, 0x2d, 0x74, 0xe5, 0x5f, 0xac, 0x2a, 0xa0, + 0x2f, 0x58, 0x70, 0xca, 0xd8, 0xc9, 0xaa, 0xe7, 0x70, 0x98, 0x9e, 0x3f, 0x2e, 0x5a, 0x3e, 0xb5, + 0xd6, 0x8d, 0x26, 0xee, 0xde, 0x94, 0xfd, 0x6f, 0xb9, 0xa9, 0x56, 0x18, 0x6f, 0x48, 0xdc, 0xf6, + 0x8f, 0xe3, 0xd1, 0x83, 0x9b, 0x86, 0x5d, 0xe9, 0x21, 0x5c, 0x16, 0xfc, 0x7b, 0x8b, 0x5d, 0x16, + 0xac, 0x93, 0xad, 0x96, 0xef, 0x24, 0xc7, 0xe1, 0xc5, 0xfc, 0x69, 0x18, 0x49, 0x44, 0x6b, 0xc5, + 0x5e, 0x6c, 0xd0, 0xba, 0xc7, 0x2e, 0x51, 0xd4, 0xd1, 0x27, 0x4b, 0xb1, 0x22, 0x68, 0xff, 0x2b, + 0xfe, 0x55, 0x24, 0xe4, 0x18, 0x2c, 0x22, 0x37, 0x4c, 0x8b, 0xc8, 0x33, 0x85, 0xc7, 0xd2, 0xc3, + 0x32, 0xf2, 0x7d, 0x73, 0x04, 0x4c, 0x43, 0xf9, 0xc9, 0xb9, 0xcd, 0xb2, 0x7f, 0xd9, 0x82, 0xe9, + 0x6e, 0x6e, 0x05, 0x54, 0x84, 0xe1, 0xfa, 0x91, 0xba, 0xe7, 0x53, 0xb3, 0x7a, 0x5b, 0x94, 0x63, + 0x85, 0x51, 0x38, 0x85, 0x7a, 0x7f, 0x29, 0xaa, 0x6e, 0x82, 0xf9, 0x2a, 0x1f, 0x7a, 0x95, 0x07, + 0x2d, 0x58, 0xea, 0xd9, 0xbc, 0xfe, 0x02, 0x16, 0xec, 0x6f, 0x97, 0x60, 0x9a, 0x1b, 0xdb, 0x17, + 0xb7, 0x43, 0xcf, 0xad, 0x85, 0xae, 0x08, 0xe1, 0x70, 0x61, 0xac, 0xa5, 0xa9, 0xb7, 0xc5, 0x52, + 0xde, 0xe8, 0x0a, 0x71, 0xaa, 0x52, 0xe8, 0xa5, 0xd8, 0xa0, 0x4a, 0x5b, 0x21, 0xdb, 0x5e, 0x43, + 0xd9, 0x6e, 0x4b, 0x7d, 0x9f, 0x0c, 0xaa, 0x95, 0x15, 0x8d, 0x0e, 0x36, 0xa8, 0x1e, 0xc1, 0xcb, + 0x27, 0xf6, 0xdf, 0xb7, 0xe0, 0x91, 0x1e, 0x69, 0x71, 0x68, 0x73, 0xf7, 0xd9, 0x05, 0x87, 0x78, + 0xf6, 0x51, 0x35, 0xc7, 0xaf, 0x3d, 0xb0, 0x80, 0xa2, 0xbb, 0x00, 0xfc, 0xda, 0x82, 0x4a, 0xd3, + 0xd9, 0x3b, 0xf5, 0x82, 0xc9, 0x27, 0xb4, 0xbc, 0x04, 0xea, 0xd9, 0x7f, 0x8d, 0xaa, 0xfd, 0xcd, + 0x32, 0x0c, 0xf2, 0xd7, 0xc5, 0x6b, 0x30, 0xbc, 0xc9, 0xd3, 0xf4, 0xf6, 0x97, 0x25, 0x38, 0x55, + 0x5f, 0x78, 0x01, 0x96, 0x64, 0xd0, 0x75, 0x38, 0x49, 0x4f, 0x16, 0xcf, 0xf1, 0xab, 0xc4, 0x77, + 0x76, 0xa4, 0x3e, 0xcc, 0x9f, 0xc3, 0x90, 0x79, 0xdb, 0x4f, 0xae, 0x75, 0xa2, 0xe0, 0x6e, 0xf5, + 0xd0, 0xab, 0x1d, 0x59, 0xf5, 0x78, 0xfa, 0x63, 0x25, 0x0b, 0x1f, 0x9c, 0x59, 0x8f, 0x4a, 0xec, + 0xad, 0x0e, 0xcd, 0x5f, 0x7b, 0xc4, 0xd9, 0xd4, 0xf6, 0x4d, 0x5c, 0xe6, 0x43, 0xd1, 0x66, 0xbe, + 0x23, 0xeb, 0x9b, 0x11, 0x89, 0x37, 0x43, 0xdf, 0x15, 0xef, 0x8f, 0xa6, 0x3e, 0x14, 0x19, 0x38, + 0xee, 0xa8, 0x41, 0xa9, 0x6c, 0x38, 0x9e, 0xdf, 0x8e, 0x48, 0x4a, 0x65, 0xc8, 0xa4, 0xb2, 0x9a, + 0x81, 0xe3, 0x8e, 0x1a, 0x74, 0x6d, 0x9d, 0x12, 0x4f, 0x56, 0xca, 0x20, 0x70, 0xc1, 0x82, 0x3e, + 0x05, 0xc3, 0x32, 0x14, 0xa0, 0x50, 0xae, 0x12, 0xe1, 0x20, 0xa1, 0x9e, 0xbf, 0xd4, 0x9e, 0x47, + 0x13, 0x41, 0x00, 0x92, 0xde, 0x61, 0x9e, 0x46, 0xfc, 0x53, 0x0b, 0x4e, 0x76, 0x71, 0x69, 0xe3, + 0x2c, 0xad, 0xe9, 0xc5, 0x89, 0x7a, 0x9c, 0x41, 0x63, 0x69, 0xbc, 0x1c, 0x2b, 0x0c, 0xba, 0x5b, + 0x38, 0xd3, 0xcc, 0x32, 0x4a, 0xe1, 0xea, 0x22, 0xa0, 0xfd, 0x31, 0x4a, 0x74, 0x16, 0x06, 0xda, + 0x31, 0x89, 0xe4, 0x3b, 0x85, 0x92, 0xcf, 0xdf, 0x8a, 0x49, 0x84, 0x19, 0x84, 0x8a, 0xad, 0x4d, + 0x65, 0x11, 0xd4, 0xc4, 0x56, 0x66, 0xdd, 0xc3, 0x1c, 0x66, 0x7f, 0xad, 0x0c, 0x93, 0x19, 0xd7, + 0x56, 0xda, 0x91, 0xad, 0x30, 0xf0, 0x92, 0x50, 0xe5, 0x8f, 0xe3, 0x4f, 0xa3, 0x91, 0xd6, 0xe6, + 0x75, 0x51, 0x8e, 0x15, 0x06, 0x7a, 0x5a, 0x3e, 0x4d, 0x9b, 0x7d, 0x74, 0x62, 0xa9, 0x6a, 0xbc, + 0x4e, 0x5b, 0xf4, 0xc1, 0x98, 0x27, 0x61, 0xa0, 0x15, 0xaa, 0x97, 0xc6, 0xd5, 0xf7, 0xc4, 0x4b, + 0xd5, 0x5a, 0x18, 0xfa, 0x98, 0x01, 0xd1, 0x53, 0x62, 0xf4, 0x99, 0x1b, 0x1a, 0xec, 0xb8, 0x61, + 0xac, 0x4d, 0xc1, 0x33, 0x30, 0x7c, 0x8f, 0xec, 0x44, 0x5e, 0xd0, 0xcc, 0xde, 0x4f, 0x5d, 0xe5, + 0xc5, 0x58, 0xc2, 0xcd, 0x1c, 0xec, 0xc3, 0x47, 0xfc, 0x28, 0xcc, 0x48, 0xee, 0x39, 0xf8, 0x1d, + 0x0b, 0x26, 0x59, 0x52, 0x55, 0x91, 0x82, 0xc0, 0x0b, 0x83, 0x63, 0x90, 0x31, 0x9e, 0x84, 0xc1, + 0x88, 0x36, 0x9a, 0x7d, 0xd5, 0x81, 0xf5, 0x04, 0x73, 0x18, 0x7a, 0x0c, 0x06, 0x58, 0x17, 0xe8, + 0x67, 0x1c, 0xe3, 0xb9, 0xdb, 0xab, 0x4e, 0xe2, 0x60, 0x56, 0xca, 0xa2, 0xc9, 0x30, 0x69, 0xf9, + 0x1e, 0xef, 0x74, 0x6a, 0xd0, 0x7d, 0xbf, 0x45, 0x93, 0x75, 0xed, 0xe4, 0xc3, 0x8a, 0x26, 0xeb, + 0x4e, 0xfc, 0x60, 0x39, 0xff, 0x7f, 0x94, 0xe0, 0x4c, 0xd7, 0x7a, 0xe9, 0x4d, 0xf7, 0xaa, 0x71, + 0xd3, 0x7d, 0x31, 0x73, 0xd3, 0x6d, 0x1f, 0x5c, 0xfb, 0xe1, 0xdc, 0x7d, 0x77, 0xbf, 0x92, 0x2e, + 0x1f, 0xe3, 0x95, 0xf4, 0x40, 0x51, 0x11, 0x67, 0x30, 0x47, 0xc4, 0xf9, 0x7d, 0x0b, 0x1e, 0xed, + 0x3a, 0x65, 0xef, 0xbb, 0xf0, 0xbd, 0xae, 0xbd, 0xec, 0xa1, 0x9d, 0xfc, 0x52, 0xb9, 0xc7, 0xa8, + 0x98, 0x9e, 0x72, 0x8e, 0x72, 0x21, 0x06, 0x8c, 0x85, 0xf0, 0x36, 0xc6, 0x39, 0x10, 0x2f, 0xc3, + 0x0a, 0x8a, 0x62, 0x2d, 0xfc, 0x8d, 0x77, 0x72, 0xe5, 0x90, 0x1b, 0x6a, 0xde, 0xb4, 0xc4, 0xeb, + 0x79, 0x15, 0xb2, 0x41, 0x71, 0x77, 0x34, 0xcd, 0xb3, 0x7c, 0x18, 0xcd, 0x73, 0xac, 0xbb, 0xd6, + 0x89, 0x16, 0x61, 0x72, 0xcb, 0x0b, 0xd8, 0x5b, 0xb2, 0xa6, 0xf4, 0xa4, 0x62, 0x90, 0xaf, 0x9b, + 0x60, 0x9c, 0xc5, 0x9f, 0x7d, 0x05, 0xc6, 0x0f, 0x6f, 0x5d, 0xfb, 0x51, 0x19, 0x3e, 0x78, 0x00, + 0x53, 0xe0, 0xa7, 0x83, 0xf1, 0x5d, 0xb4, 0xd3, 0xa1, 0xe3, 0xdb, 0xd4, 0x60, 0x7a, 0xa3, 0xed, + 0xfb, 0x3b, 0xcc, 0x4f, 0x8c, 0xb8, 0x12, 0x43, 0x08, 0x35, 0xea, 0xd1, 0xfa, 0xd5, 0x2e, 0x38, + 0xb8, 0x6b, 0x4d, 0xf4, 0x49, 0x40, 0xe1, 0x5d, 0x96, 0x76, 0xd8, 0x4d, 0xf3, 0x46, 0xb0, 0x4f, + 0x50, 0x4e, 0xb7, 0xea, 0xcd, 0x0e, 0x0c, 0xdc, 0xa5, 0x16, 0x95, 0x53, 0xd9, 0x7b, 0xf7, 0xaa, + 0x5b, 0x19, 0x39, 0x15, 0xeb, 0x40, 0x6c, 0xe2, 0xa2, 0xcb, 0x70, 0xc2, 0xd9, 0x76, 0x3c, 0x9e, + 0x46, 0x4c, 0x12, 0xe0, 0x82, 0xaa, 0xb2, 0x5f, 0x2d, 0x66, 0x11, 0x70, 0x67, 0x1d, 0xd4, 0x32, + 0x0c, 0x92, 0xfc, 0xc1, 0x81, 0x8f, 0x1f, 0x62, 0x05, 0x17, 0x36, 0x51, 0xda, 0xff, 0xc5, 0xa2, + 0x47, 0x5f, 0x97, 0x67, 0x47, 0xe9, 0x8c, 0x28, 0x03, 0x9b, 0x16, 0xce, 0xa7, 0x66, 0x64, 0x59, + 0x07, 0x62, 0x13, 0x97, 0x2f, 0x8d, 0x38, 0x75, 0x5b, 0x37, 0xa4, 0x4d, 0x11, 0x09, 0xab, 0x30, + 0xa8, 0x04, 0xed, 0x7a, 0xdb, 0x5e, 0x1c, 0x46, 0x62, 0x03, 0xf5, 0xe9, 0xc4, 0x9c, 0xf2, 0xcb, + 0x2a, 0x27, 0x83, 0x25, 0x3d, 0xfb, 0xeb, 0x25, 0x18, 0x97, 0x2d, 0xbe, 0xd6, 0x0e, 0x13, 0xe7, + 0x18, 0x8e, 0xf4, 0xd7, 0x8c, 0x23, 0x7d, 0xa1, 0x58, 0x60, 0x30, 0xeb, 0x5c, 0xcf, 0xa3, 0xfc, + 0x53, 0x99, 0xa3, 0xfc, 0x42, 0x3f, 0x44, 0x0f, 0x3e, 0xc2, 0xff, 0x8d, 0x05, 0x27, 0x0c, 0xfc, + 0x63, 0x38, 0x49, 0x6a, 0xe6, 0x49, 0xf2, 0x5c, 0x1f, 0xa3, 0xe9, 0x71, 0x82, 0x7c, 0xab, 0x94, + 0x19, 0x05, 0x3b, 0x39, 0x3e, 0x07, 0x03, 0x9b, 0x4e, 0xe4, 0x16, 0xcb, 0xa9, 0xd9, 0x51, 0x7d, + 0xfe, 0x8a, 0x13, 0xb9, 0x9c, 0xff, 0x9f, 0x57, 0x8f, 0xa2, 0x39, 0x91, 0x9b, 0x1b, 0xcd, 0xc1, + 0x1a, 0x45, 0x97, 0x60, 0x28, 0x6e, 0x84, 0x2d, 0xe5, 0xef, 0x7a, 0x96, 0x3f, 0x98, 0x46, 0x4b, + 0xf6, 0x77, 0xe7, 0x90, 0xd9, 0x1c, 0x2d, 0xc6, 0x02, 0x7f, 0xb6, 0x09, 0x15, 0xd5, 0xf4, 0x91, + 0x7a, 0xfc, 0xff, 0xd7, 0x32, 0x9c, 0xec, 0xb2, 0x56, 0xd0, 0xe7, 0x8d, 0x79, 0x7b, 0xa5, 0xef, + 0xc5, 0xf6, 0x1e, 0x67, 0xee, 0xf3, 0x4c, 0x53, 0x72, 0xc5, 0xea, 0x38, 0x44, 0xf3, 0xb7, 0x62, + 0x92, 0x6d, 0x9e, 0x16, 0xe5, 0x37, 0x4f, 0x9b, 0x3d, 0xb6, 0xe9, 0xa7, 0x0d, 0xa9, 0x9e, 0x1e, + 0xe9, 0x77, 0xfe, 0x85, 0x01, 0x98, 0xee, 0x96, 0x81, 0x00, 0x7d, 0xc9, 0xca, 0x3c, 0x9c, 0xf1, 0x6a, 0xff, 0x69, 0x0c, 0xf8, 0x6b, 0x1a, 0x22, 0x6b, 0xcf, 0xbc, 0xf9, 0x94, 0x46, 0xee, 0x8c, 0x8b, 0xd6, 0x59, 0x1c, 0x56, 0xc4, 0x1f, 0x41, 0x91, 0x5c, 0xe1, 0x13, 0x87, 0xe8, 0x8a, 0x78, 0x47, 0x25, 0xce, 0xc4, 0x61, 0xc9, 0xe2, 0xfc, 0x38, 0x2c, 0xd9, 0x87, 0x59, 0x0f, 0x46, 0xb5, - 0x71, 0x1d, 0xe9, 0x32, 0xb8, 0x47, 0x8f, 0x28, 0xad, 0xdf, 0x47, 0xba, 0x14, 0xfe, 0xb6, 0x05, + 0x71, 0x1d, 0xe9, 0x32, 0xb8, 0x47, 0x8f, 0x28, 0xad, 0xdf, 0x47, 0xba, 0x14, 0xfe, 0x8e, 0x05, 0x19, 0xe7, 0x34, 0x65, 0x96, 0xb1, 0x7a, 0x9a, 0x65, 0xce, 0xc2, 0x40, 0x14, 0xfa, 0x24, 0xfb, 0xa8, 0x03, 0x0e, 0x7d, 0x82, 0x19, 0x44, 0xbd, 0x93, 0x5c, 0xee, 0xf5, 0x4e, 0x32, 0xd5, 0xd3, - 0x7d, 0xb2, 0x4d, 0xa4, 0x91, 0x44, 0xb1, 0xf1, 0x6b, 0xb4, 0x10, 0x73, 0x98, 0xfd, 0xeb, 0x03, + 0x7d, 0xb2, 0x4d, 0xa4, 0x91, 0x44, 0xb1, 0xf1, 0x6b, 0xb4, 0x10, 0x73, 0x98, 0xfd, 0x1b, 0x03, 0x70, 0xb2, 0x4b, 0x54, 0x1f, 0xd5, 0x90, 0x9a, 0x4e, 0x42, 0xee, 0x3b, 0x3b, 0xd9, 0xe4, 0xb2, 0x97, 0x79, 0x31, 0x96, 0x70, 0xe6, 0x54, 0xcb, 0x13, 0xd4, 0x65, 0x4c, 0x57, 0x22, 0x2f, 0x9d, 0x80, 0x1e, 0xfd, 0x8b, 0xba, 0x17, 0x01, 0xe2, 0xd8, 0x5f, 0x09, 0xa8, 0x84, 0xe7, 0x0a, 0xe7, @@ -43754,19 +43814,19 @@ var fileDescriptorGenerated = []byte{ 0x12, 0x8c, 0x8a, 0x48, 0xb2, 0x5a, 0x18, 0xfa, 0xc2, 0x8c, 0xa4, 0xee, 0xe3, 0xeb, 0x29, 0x08, 0xeb, 0x78, 0x5a, 0x35, 0x66, 0x6d, 0x1c, 0xee, 0x5a, 0x8d, 0x5b, 0x1c, 0x35, 0xbc, 0x4c, 0x9e, 0x92, 0x91, 0x42, 0x79, 0x4a, 0x52, 0xc3, 0x5a, 0xa5, 0xf0, 0x45, 0x0c, 0xe4, 0x1a, 0xa0, 0x7e, - 0xa7, 0x0c, 0x43, 0xfc, 0x53, 0x1c, 0x83, 0x94, 0x57, 0x13, 0x26, 0xa5, 0x42, 0x39, 0x21, 0x78, + 0xb7, 0x0c, 0x43, 0xfc, 0x53, 0x1c, 0x83, 0x94, 0x57, 0x13, 0x26, 0xa5, 0x42, 0x39, 0x21, 0x78, 0xaf, 0xe6, 0xab, 0x4e, 0xe2, 0x70, 0xd6, 0xa4, 0x76, 0x48, 0x6a, 0x86, 0x42, 0xf3, 0xc6, 0x1e, 0x9a, 0xcd, 0x58, 0x4a, 0x80, 0xd3, 0xd0, 0x76, 0xd4, 0x26, 0x40, 0xcc, 0x5e, 0x75, 0xa5, 0x34, 0x44, 0xe6, 0xdb, 0x17, 0x0b, 0xf5, 0xa3, 0xae, 0xaa, 0xf1, 0xde, 0xa4, 0xcb, 0x52, 0x01, 0xb0, - 0x46, 0x7b, 0xf6, 0x65, 0xa8, 0x28, 0xe4, 0x3c, 0x15, 0x72, 0x4c, 0x67, 0x6d, 0x7f, 0x01, 0x26, - 0x33, 0x6d, 0xf5, 0xa5, 0x81, 0xfe, 0xa6, 0x05, 0x93, 0xbc, 0xcb, 0x2b, 0xc1, 0xb6, 0x60, 0x05, + 0x46, 0x7b, 0xf6, 0x65, 0xa8, 0x28, 0xe4, 0x3c, 0x15, 0x72, 0x4c, 0x67, 0x6d, 0x7f, 0x09, 0x26, + 0x33, 0x6d, 0xf5, 0xa5, 0x81, 0xfe, 0x96, 0x05, 0x93, 0xbc, 0xcb, 0x2b, 0xc1, 0xb6, 0x60, 0x05, 0x5f, 0xb4, 0x60, 0xda, 0xef, 0xb2, 0x13, 0xc5, 0x67, 0x3e, 0xcc, 0x1e, 0x56, 0xca, 0x67, 0x37, 0x28, 0xee, 0xda, 0x1a, 0x3a, 0x07, 0x23, 0xfc, 0x91, 0x6a, 0xc7, 0x17, 0x9e, 0xe2, 0x63, 0x3c, 0xe7, 0x37, 0x2f, 0xc3, 0x0a, 0x6a, 0xff, 0xd8, 0x82, 0x13, 0x7c, 0x10, 0x57, 0xc9, 0x8e, 0x52, 0xaf, 0xde, 0x27, 0xc3, 0x10, 0xd9, 0xcd, 0x4b, 0x3d, 0xb2, 0x9b, 0xeb, 0xa3, 0x2c, 0x1f, 0x38, 0xca, 0x6f, 0x5b, 0x20, 0x56, 0xe8, 0x31, 0xe8, 0x0f, 0x6b, 0xa6, 0xfe, 0xf0, 0xa1, 0x22, 0x8b, - 0xbe, 0x87, 0xe2, 0xf0, 0x0b, 0x25, 0x98, 0xe2, 0x08, 0xe9, 0x8d, 0xcc, 0xfb, 0xe5, 0xe3, 0xf4, - 0xf7, 0xea, 0x8e, 0x7a, 0xea, 0xb4, 0xfb, 0x48, 0x8d, 0x6f, 0x39, 0x70, 0xe0, 0xb7, 0xfc, 0x33, + 0xbe, 0x87, 0xe2, 0xf0, 0x8b, 0x25, 0x98, 0xe2, 0x08, 0xe9, 0x8d, 0xcc, 0xfb, 0xe5, 0xe3, 0xf4, + 0xf7, 0xea, 0x8e, 0x7a, 0xea, 0xb4, 0xfb, 0x48, 0x8d, 0x6f, 0x39, 0x70, 0xe0, 0xb7, 0xfc, 0x73, 0x0b, 0x10, 0x9f, 0x93, 0xec, 0x0b, 0xdf, 0xfc, 0x74, 0xd3, 0xcc, 0x01, 0x29, 0xe7, 0x50, 0x10, 0xac, 0x61, 0x3d, 0xe4, 0x21, 0x64, 0xee, 0xc3, 0xca, 0xf9, 0xf7, 0x61, 0x7d, 0x8c, 0xfa, 0x7f, 0x96, 0x21, 0xeb, 0xac, 0x89, 0xde, 0x86, 0xb1, 0x86, 0xd3, 0x72, 0xee, 0x7a, 0xbe, 0x97, 0x78, @@ -43776,9 +43836,9 @@ var fileDescriptorGenerated = []byte{ 0x42, 0x31, 0x0a, 0x18, 0x4e, 0xcb, 0x83, 0x9e, 0xfe, 0x5f, 0xf5, 0x7c, 0x22, 0xe4, 0x3c, 0x1e, 0xbf, 0x32, 0xbb, 0xb7, 0x3b, 0x77, 0x1a, 0x77, 0xc5, 0xc0, 0x3d, 0x6a, 0xda, 0x6d, 0x38, 0x59, 0x27, 0x91, 0xc7, 0xf2, 0x74, 0xba, 0xe9, 0xbe, 0xfb, 0x0c, 0x54, 0xa2, 0xcc, 0x96, 0xef, 0x33, - 0x49, 0x81, 0x96, 0xd9, 0x4d, 0x6e, 0xf1, 0x94, 0xa4, 0xfd, 0xd7, 0x4a, 0x30, 0x2c, 0x5c, 0x3a, + 0x49, 0x81, 0x96, 0xd9, 0x4d, 0x6e, 0xf1, 0x94, 0xa4, 0xfd, 0xd7, 0x4b, 0x30, 0x2c, 0x5c, 0x3a, 0x8f, 0x41, 0x50, 0xb9, 0x6a, 0x98, 0xa3, 0x9e, 0xc9, 0xe3, 0x95, 0xac, 0x5b, 0x3d, 0x0d, 0x51, - 0xf5, 0x8c, 0x21, 0xea, 0xb9, 0x62, 0xe4, 0x0e, 0x36, 0x41, 0xfd, 0xe3, 0x32, 0x4c, 0x98, 0x2e, + 0xf5, 0x8c, 0x21, 0xea, 0xb9, 0x62, 0xe4, 0x0e, 0x36, 0x41, 0xfd, 0x93, 0x32, 0x4c, 0x98, 0x2e, 0xae, 0xc7, 0x30, 0x2d, 0xaf, 0xc3, 0x70, 0x2c, 0xbc, 0xad, 0x4b, 0x45, 0xfc, 0xfb, 0xb2, 0x9f, 0x38, 0xbd, 0xb5, 0x17, 0xfe, 0xd5, 0x92, 0x5c, 0x57, 0x87, 0xee, 0xf2, 0xb1, 0x38, 0x74, 0xe7, 0x79, 0x1e, 0x0f, 0x3c, 0x0c, 0xcf, 0x63, 0xfb, 0x07, 0xec, 0x78, 0xd0, 0xcb, 0x8f, 0xe1, 0xc8, @@ -43790,61 +43850,65 @@ var fileDescriptorGenerated = []byte{ 0xbe, 0x88, 0xf4, 0xed, 0xbd, 0x5b, 0xdb, 0x89, 0xe7, 0xcf, 0x7b, 0x41, 0x12, 0x27, 0xd1, 0xfc, 0x5a, 0x90, 0xdc, 0x8c, 0xb8, 0x82, 0xa0, 0xc5, 0x1f, 0x2a, 0x5a, 0x58, 0xa3, 0x2b, 0x43, 0x4a, 0x58, 0x1b, 0x83, 0xe6, 0x6d, 0xd3, 0x0d, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0x32, 0xe3, 0xec, 0x6c, - 0x82, 0xfa, 0x0b, 0x0d, 0xfc, 0x57, 0x83, 0x6a, 0x6a, 0x99, 0x09, 0xf9, 0x86, 0x1e, 0x80, 0x58, - 0x94, 0x7d, 0xd2, 0x2e, 0xe8, 0x3e, 0xd7, 0x69, 0xbc, 0x22, 0x22, 0x1d, 0x57, 0x94, 0x2f, 0x17, - 0xe6, 0xc8, 0x7d, 0x5c, 0x4a, 0xb2, 0x44, 0x8c, 0x2c, 0xfb, 0xdc, 0x5a, 0x2d, 0x9b, 0x4b, 0x7e, - 0x59, 0x02, 0x70, 0x8a, 0x83, 0x16, 0x84, 0xf2, 0xc9, 0xad, 0x33, 0x1f, 0xcc, 0x28, 0x9f, 0x72, - 0x4a, 0x34, 0xed, 0xf3, 0x02, 0x8c, 0xaa, 0xe7, 0x79, 0x6a, 0xfc, 0x61, 0x94, 0x0a, 0x97, 0xc5, - 0x56, 0xd2, 0x62, 0xac, 0xe3, 0xa0, 0x75, 0x98, 0x8c, 0xf9, 0xdb, 0x41, 0x32, 0xb6, 0x43, 0x18, - 0x19, 0x9e, 0xcd, 0x3c, 0xe9, 0x2f, 0xc1, 0xfb, 0xac, 0x88, 0x6f, 0x65, 0x19, 0x0d, 0x92, 0x25, - 0x81, 0x5e, 0x85, 0x09, 0x5f, 0x7f, 0x18, 0xb5, 0x26, 0x6c, 0x10, 0xca, 0x45, 0xcd, 0x78, 0x36, - 0xb5, 0x86, 0x33, 0xd8, 0xe8, 0x75, 0x98, 0xd1, 0x4b, 0x44, 0x42, 0x24, 0x27, 0x68, 0x92, 0x58, - 0xbc, 0x33, 0xf2, 0xd8, 0xde, 0xee, 0xdc, 0xcc, 0xb5, 0x1e, 0x38, 0xb8, 0x67, 0x6d, 0x74, 0x09, - 0xc6, 0xe4, 0xf0, 0xb5, 0x48, 0xa8, 0xd4, 0x39, 0x52, 0x83, 0x61, 0x03, 0xf3, 0xbd, 0xdd, 0xdb, - 0x7e, 0x8e, 0x56, 0xd6, 0xce, 0x5d, 0xf4, 0x0e, 0x8c, 0xe9, 0x7d, 0xcc, 0x1e, 0xa8, 0xf9, 0x8f, - 0xcd, 0x8a, 0xf3, 0x5b, 0xf5, 0x5c, 0x87, 0x61, 0x83, 0xb6, 0x7d, 0x13, 0x86, 0xea, 0x3b, 0x71, - 0x23, 0xf1, 0x0b, 0x30, 0xa5, 0x27, 0x8d, 0x21, 0xa4, 0x1b, 0x86, 0x3d, 0x7c, 0x25, 0x46, 0x64, - 0x7f, 0xd9, 0x82, 0xc9, 0xf5, 0xe5, 0x5a, 0x3d, 0x6c, 0xdc, 0x23, 0xc9, 0x22, 0xd7, 0xcf, 0xb0, - 0xe0, 0x49, 0xd6, 0x21, 0x79, 0x4d, 0x37, 0x2e, 0x76, 0x16, 0x06, 0x36, 0xc3, 0x38, 0xc9, 0xda, - 0x38, 0xaf, 0x84, 0x71, 0x82, 0x19, 0xc4, 0xfe, 0x63, 0x0b, 0x06, 0xd9, 0xbb, 0x4e, 0x79, 0x6f, - 0x82, 0x15, 0x19, 0x17, 0x7a, 0x09, 0x86, 0xc8, 0xc6, 0x06, 0x69, 0x24, 0x62, 0x7b, 0xca, 0x78, - 0x81, 0xa1, 0x15, 0x56, 0x4a, 0x37, 0x1d, 0x6b, 0x8c, 0xff, 0xc5, 0x02, 0x19, 0x7d, 0x1a, 0x2a, - 0x89, 0xb7, 0x45, 0x16, 0x5d, 0x57, 0x18, 0x15, 0xfb, 0x73, 0x61, 0x51, 0x4c, 0x60, 0x5d, 0x12, - 0xc1, 0x29, 0x3d, 0xfb, 0xab, 0x25, 0x80, 0x34, 0x1e, 0x28, 0x6f, 0x98, 0x4b, 0x1d, 0x4f, 0x9f, - 0x3d, 0xdd, 0xe5, 0xe9, 0x33, 0x94, 0x12, 0xec, 0xf2, 0xf0, 0x99, 0x9a, 0xaa, 0x72, 0xa1, 0xa9, - 0x1a, 0xe8, 0x67, 0xaa, 0x96, 0xe1, 0x44, 0x1a, 0xcf, 0x64, 0x06, 0x86, 0xb2, 0x44, 0xa8, 0xeb, - 0x59, 0x20, 0xee, 0xc4, 0xb7, 0xbf, 0x6a, 0x81, 0x70, 0x7a, 0x2c, 0xb0, 0xa0, 0x5d, 0xf9, 0x4c, - 0x91, 0x91, 0xb1, 0xed, 0xd9, 0x22, 0xfe, 0xa0, 0x22, 0x4f, 0x9b, 0xda, 0x62, 0x46, 0x76, 0x36, - 0x83, 0xaa, 0xfd, 0x6b, 0x16, 0x8c, 0x72, 0xf0, 0x75, 0x26, 0x2b, 0xe7, 0xf7, 0xab, 0xaf, 0x2c, - 0xbb, 0xec, 0x05, 0x1f, 0x4a, 0x58, 0x65, 0x5b, 0xd5, 0x5f, 0xf0, 0x91, 0x00, 0x9c, 0xe2, 0xa0, - 0x67, 0x60, 0x38, 0x6e, 0xdf, 0x65, 0xe8, 0x19, 0x0f, 0xc8, 0x3a, 0x2f, 0xc6, 0x12, 0x6e, 0xff, - 0xd3, 0x12, 0x4c, 0x65, 0x1d, 0x60, 0x11, 0x86, 0x21, 0x2e, 0x3b, 0x67, 0xc5, 0xae, 0x83, 0xec, - 0x39, 0x9a, 0x03, 0x2d, 0xf0, 0x77, 0xa8, 0x99, 0xe1, 0x5d, 0x50, 0x42, 0x1b, 0x30, 0xea, 0x86, - 0xf7, 0x83, 0xfb, 0x4e, 0xe4, 0x2e, 0xd6, 0xd6, 0xc4, 0x97, 0xc8, 0x71, 0x59, 0xaa, 0xa6, 0x15, - 0x74, 0xf7, 0x5c, 0x66, 0x5f, 0x48, 0x41, 0x58, 0x27, 0x4c, 0x75, 0xc5, 0x46, 0x18, 0x6c, 0x78, - 0xcd, 0xeb, 0x4e, 0xab, 0xd8, 0xe5, 0xfc, 0xb2, 0x44, 0xd7, 0xda, 0x18, 0x17, 0xf9, 0x28, 0x38, - 0x00, 0xa7, 0x24, 0xed, 0x5f, 0x9d, 0x06, 0x63, 0x2d, 0x18, 0xa9, 0x70, 0xad, 0x87, 0x9e, 0x0a, - 0xf7, 0x4d, 0x18, 0x21, 0x5b, 0xad, 0x64, 0xa7, 0xea, 0x45, 0xc5, 0x12, 0x9b, 0xaf, 0x08, 0xec, - 0x4e, 0xea, 0x12, 0x82, 0x15, 0xc5, 0x1e, 0x89, 0x8d, 0xcb, 0xef, 0x8b, 0xc4, 0xc6, 0x03, 0x7f, - 0x2e, 0x89, 0x8d, 0x5f, 0x87, 0xe1, 0xa6, 0x97, 0x60, 0xd2, 0x0a, 0x45, 0x82, 0x8f, 0x9c, 0xc5, - 0x73, 0x99, 0x23, 0x77, 0xa6, 0xbc, 0x14, 0x00, 0x2c, 0xc9, 0xa1, 0x75, 0xb5, 0xa9, 0x86, 0x8a, - 0x1c, 0xf7, 0x9d, 0xf6, 0xbe, 0xae, 0xdb, 0x4a, 0x24, 0x32, 0x1e, 0x7e, 0xef, 0x89, 0x8c, 0x55, - 0xfa, 0xe1, 0x91, 0x87, 0x95, 0x7e, 0xd8, 0x48, 0xe3, 0x5c, 0x39, 0x8a, 0x34, 0xce, 0x5f, 0xb5, - 0xe0, 0x54, 0xab, 0x5b, 0x12, 0x74, 0x91, 0x48, 0xf8, 0x67, 0x0f, 0x91, 0x16, 0xde, 0x68, 0x9a, - 0x25, 0x2c, 0xe8, 0x8a, 0x86, 0xbb, 0x37, 0x2c, 0xf3, 0x41, 0x8f, 0xbe, 0xf7, 0x7c, 0xd0, 0x47, - 0x9d, 0x71, 0x38, 0xcd, 0x0e, 0x3d, 0x7e, 0x24, 0xd9, 0xa1, 0x27, 0x1e, 0x62, 0x76, 0x68, 0x2d, - 0xaf, 0xf3, 0xe4, 0xc3, 0xcd, 0xeb, 0xbc, 0x69, 0x9e, 0x4b, 0x3c, 0x8d, 0xf0, 0x4b, 0x85, 0xcf, - 0x25, 0xa3, 0x85, 0x83, 0x4f, 0x26, 0x9e, 0xe1, 0xfa, 0xc4, 0x7b, 0xcc, 0x70, 0x6d, 0xe4, 0x89, - 0x46, 0x47, 0x91, 0x27, 0xfa, 0x6d, 0xfd, 0x04, 0x3d, 0x59, 0xa4, 0x05, 0x75, 0x50, 0x76, 0xb6, - 0xd0, 0xed, 0x0c, 0xed, 0xcc, 0x44, 0x3d, 0x7d, 0xdc, 0x99, 0xa8, 0x4f, 0x1d, 0x61, 0x26, 0xea, - 0xd3, 0xc7, 0x9a, 0x89, 0xfa, 0x91, 0xf7, 0x49, 0x26, 0xea, 0x99, 0xe3, 0xca, 0x44, 0xfd, 0xe8, - 0x43, 0xcd, 0x44, 0x4d, 0x3f, 0x5d, 0x4b, 0x86, 0x91, 0xcd, 0xcc, 0x16, 0xf9, 0x74, 0x5d, 0xa3, - 0xce, 0xf8, 0xa7, 0x53, 0x20, 0x9c, 0x12, 0xb5, 0xff, 0x12, 0x9c, 0x39, 0x78, 0xe9, 0xa6, 0x1e, - 0x1b, 0xb5, 0xd4, 0x16, 0x96, 0xf1, 0xd8, 0x60, 0x62, 0xa1, 0x86, 0x55, 0x38, 0x55, 0xee, 0xb7, - 0x2c, 0x78, 0xa4, 0x47, 0x26, 0xc9, 0xc2, 0x31, 0x98, 0x2d, 0x98, 0x6c, 0x99, 0x55, 0x0b, 0x87, - 0x74, 0x1b, 0x99, 0x2b, 0x95, 0x9f, 0x7c, 0x06, 0x80, 0xb3, 0xe4, 0x97, 0x3e, 0xf4, 0xc3, 0x1f, - 0x9d, 0xf9, 0xc0, 0xef, 0xfe, 0xe8, 0xcc, 0x07, 0xfe, 0xf0, 0x47, 0x67, 0x3e, 0xf0, 0x73, 0x7b, - 0x67, 0xac, 0x1f, 0xee, 0x9d, 0xb1, 0x7e, 0x77, 0xef, 0x8c, 0xf5, 0x27, 0x7b, 0x67, 0xac, 0xaf, - 0xfe, 0xf8, 0xcc, 0x07, 0xde, 0x28, 0x6d, 0x5f, 0xf8, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xda, - 0x87, 0x52, 0x9e, 0x37, 0xcb, 0x00, 0x00, + 0x82, 0xfa, 0x0b, 0x0d, 0xfc, 0x85, 0x61, 0x35, 0xb5, 0xcc, 0x84, 0x7c, 0x43, 0x0f, 0x40, 0x2c, + 0xca, 0x3e, 0x69, 0x17, 0x74, 0x9f, 0xeb, 0x34, 0x5e, 0x11, 0x91, 0x8e, 0x2b, 0xca, 0x97, 0x0b, + 0x73, 0xe4, 0x3e, 0x2e, 0x25, 0x59, 0x22, 0x46, 0x96, 0x7d, 0x6e, 0xad, 0x96, 0xcd, 0x25, 0xbf, + 0x2c, 0x01, 0x38, 0xc5, 0x41, 0x0b, 0x42, 0xf9, 0xe4, 0xd6, 0x99, 0x0f, 0x66, 0x94, 0x4f, 0x39, + 0x25, 0x9a, 0xf6, 0x79, 0x01, 0x46, 0xd5, 0xf3, 0x3c, 0x35, 0xfe, 0x30, 0x4a, 0x85, 0xcb, 0x62, + 0x2b, 0x69, 0x31, 0xd6, 0x71, 0xd0, 0x3a, 0x4c, 0xc6, 0xfc, 0xed, 0x20, 0x19, 0xdb, 0x21, 0x8c, + 0x0c, 0xcf, 0x66, 0x9e, 0xf4, 0x97, 0xe0, 0x7d, 0x56, 0xc4, 0xb7, 0xb2, 0x8c, 0x06, 0xc9, 0x92, + 0x40, 0xaf, 0xc2, 0x84, 0xaf, 0x3f, 0x8c, 0x5a, 0x13, 0x36, 0x08, 0xe5, 0xa2, 0x66, 0x3c, 0x9b, + 0x5a, 0xc3, 0x19, 0x6c, 0xf4, 0x3a, 0xcc, 0xe8, 0x25, 0x22, 0x21, 0x92, 0x13, 0x34, 0x49, 0x2c, + 0xde, 0x19, 0x79, 0x6c, 0x6f, 0x77, 0x6e, 0xe6, 0x5a, 0x0f, 0x1c, 0xdc, 0xb3, 0x36, 0xba, 0x04, + 0x63, 0x72, 0xf8, 0x5a, 0x24, 0x54, 0xea, 0x1c, 0xa9, 0xc1, 0xb0, 0x81, 0x89, 0xee, 0xc3, 0x29, + 0xf9, 0x7f, 0x3d, 0x72, 0x36, 0x36, 0xbc, 0x86, 0x08, 0x49, 0x1b, 0x65, 0x24, 0x16, 0xa5, 0x6f, + 0xf9, 0x4a, 0x37, 0xa4, 0xfd, 0xdd, 0xb9, 0xb3, 0x62, 0xd6, 0xba, 0xc2, 0xd9, 0x47, 0xec, 0x4e, + 0x1f, 0x5d, 0x87, 0x93, 0x9b, 0xc4, 0xf1, 0x93, 0xcd, 0xe5, 0x4d, 0xd2, 0xb8, 0x27, 0x37, 0x16, + 0x8b, 0xaf, 0xd2, 0xdc, 0x07, 0xaf, 0x74, 0xa2, 0xe0, 0x6e, 0xf5, 0xde, 0xdb, 0xfd, 0xf3, 0xe7, + 0x68, 0x65, 0x4d, 0x7e, 0x40, 0xef, 0xc0, 0x98, 0x3e, 0xd7, 0x59, 0xc1, 0x20, 0xff, 0xd1, 0x5c, + 0x21, 0x87, 0xa8, 0x2f, 0xa0, 0xc3, 0xb0, 0x41, 0xdb, 0xbe, 0x09, 0x43, 0xf5, 0x9d, 0xb8, 0x91, + 0xf8, 0x05, 0x98, 0xeb, 0x93, 0xc6, 0x10, 0xd2, 0x8d, 0xcf, 0x1e, 0xf0, 0x12, 0x23, 0xb2, 0xbf, + 0x6c, 0xc1, 0xe4, 0xfa, 0x72, 0xad, 0x1e, 0x36, 0xee, 0x91, 0x64, 0x91, 0xeb, 0x99, 0x58, 0xf0, + 0x56, 0xeb, 0x90, 0x3c, 0xb3, 0x1b, 0x37, 0x3e, 0x0b, 0x03, 0x9b, 0x61, 0x9c, 0x64, 0x6d, 0xb5, + 0x57, 0xc2, 0x38, 0xc1, 0x0c, 0x62, 0xff, 0x89, 0x05, 0x83, 0xec, 0x7d, 0xaa, 0xbc, 0xb7, 0xcd, + 0x8a, 0x8c, 0x0b, 0xbd, 0x04, 0x43, 0x64, 0x63, 0x83, 0x34, 0x12, 0xc1, 0x66, 0x64, 0xdc, 0xc3, + 0xd0, 0x0a, 0x2b, 0xa5, 0xcc, 0x83, 0x35, 0xc6, 0xff, 0x62, 0x81, 0x8c, 0x3e, 0x0d, 0x95, 0xc4, + 0xdb, 0x22, 0x8b, 0xae, 0x2b, 0x8c, 0xa3, 0xfd, 0xb9, 0xe2, 0x28, 0x66, 0xb6, 0x2e, 0x89, 0xe0, + 0x94, 0x9e, 0xfd, 0xd5, 0x12, 0x40, 0x1a, 0xd7, 0x94, 0x37, 0xcc, 0xa5, 0x8e, 0x27, 0xdc, 0x9e, + 0xee, 0xf2, 0x84, 0x1b, 0x4a, 0x09, 0x76, 0x79, 0xc0, 0x4d, 0x4d, 0x55, 0xb9, 0xd0, 0x54, 0x0d, + 0xf4, 0x33, 0x55, 0xcb, 0x70, 0x22, 0x8d, 0xcb, 0x32, 0x03, 0x5c, 0x59, 0x42, 0xd7, 0xf5, 0x2c, + 0x10, 0x77, 0xe2, 0xdb, 0x5f, 0xb5, 0x40, 0x38, 0x6f, 0x16, 0x58, 0xd0, 0xae, 0x7c, 0x6e, 0xc9, + 0xc8, 0x3c, 0xf7, 0x6c, 0x11, 0xbf, 0x56, 0x91, 0x6f, 0x4e, 0x6d, 0x31, 0x23, 0xcb, 0x9c, 0x41, + 0xd5, 0xfe, 0x75, 0x0b, 0x46, 0x39, 0xf8, 0x3a, 0x93, 0xf9, 0xf3, 0xfb, 0xd5, 0x57, 0xb6, 0x60, + 0xf6, 0x12, 0x11, 0x25, 0xac, 0xb2, 0xc6, 0xea, 0x2f, 0x11, 0x49, 0x00, 0x4e, 0x71, 0xd0, 0x33, + 0x30, 0x1c, 0xb7, 0xef, 0x32, 0xf4, 0x8c, 0x27, 0x67, 0x9d, 0x17, 0x63, 0x09, 0xb7, 0xff, 0x59, + 0x09, 0xa6, 0xb2, 0x8e, 0xbc, 0x08, 0xc3, 0x10, 0xd7, 0x01, 0xb2, 0xe2, 0xe3, 0x41, 0x76, 0x29, + 0xcd, 0x11, 0x18, 0xf8, 0x7b, 0xda, 0xec, 0x02, 0x41, 0x50, 0x42, 0x1b, 0x30, 0xea, 0x86, 0xf7, + 0x83, 0xfb, 0x4e, 0xe4, 0x2e, 0xd6, 0xd6, 0xc4, 0x97, 0xc8, 0x71, 0xbd, 0xaa, 0xa6, 0x15, 0x74, + 0x37, 0x63, 0x66, 0x27, 0x49, 0x41, 0x58, 0x27, 0x4c, 0x75, 0xde, 0x46, 0x18, 0x6c, 0x78, 0xcd, + 0xeb, 0x4e, 0xab, 0x98, 0x93, 0xc1, 0xb2, 0x44, 0xd7, 0xda, 0x18, 0x17, 0x79, 0x35, 0x38, 0x00, + 0xa7, 0x24, 0xed, 0x5f, 0x9b, 0x06, 0x63, 0x2d, 0x18, 0x29, 0x7d, 0xad, 0x87, 0x9e, 0xd2, 0xf7, + 0x4d, 0x18, 0x21, 0x5b, 0xad, 0x64, 0xa7, 0xea, 0x45, 0xc5, 0x12, 0xb4, 0xaf, 0x08, 0xec, 0x4e, + 0xea, 0x12, 0x82, 0x15, 0xc5, 0x1e, 0x09, 0x9a, 0xcb, 0xef, 0x8b, 0x04, 0xcd, 0x03, 0x7f, 0x21, + 0x09, 0x9a, 0x5f, 0x87, 0xe1, 0xa6, 0x97, 0x60, 0xd2, 0x0a, 0x45, 0xa2, 0x92, 0x9c, 0xc5, 0x73, + 0x99, 0x23, 0x77, 0xa6, 0xee, 0x14, 0x00, 0x2c, 0xc9, 0xa1, 0x75, 0xb5, 0xa9, 0x86, 0x8a, 0x1c, + 0xf7, 0x9d, 0x76, 0xcb, 0xae, 0xdb, 0x4a, 0x24, 0x64, 0x1e, 0x7e, 0xef, 0x09, 0x99, 0x55, 0x1a, + 0xe5, 0x91, 0x87, 0x95, 0x46, 0xd9, 0x48, 0x47, 0x5d, 0x39, 0x8a, 0x74, 0xd4, 0x5f, 0xb5, 0xe0, + 0x54, 0xab, 0x5b, 0x32, 0x77, 0x91, 0x10, 0xf9, 0x67, 0x0f, 0x91, 0xde, 0xde, 0x68, 0x9a, 0x25, + 0x5e, 0xe8, 0x8a, 0x86, 0xbb, 0x37, 0x2c, 0xf3, 0x5a, 0x8f, 0xbe, 0xf7, 0xbc, 0xd6, 0x47, 0x9d, + 0x39, 0x39, 0xcd, 0x72, 0x3d, 0x7e, 0x24, 0x59, 0xae, 0x27, 0x1e, 0x62, 0x96, 0x6b, 0x2d, 0x3f, + 0xf5, 0xe4, 0xc3, 0xcd, 0x4f, 0xbd, 0x69, 0x9e, 0x4b, 0x3c, 0x1d, 0xf2, 0x4b, 0x85, 0xcf, 0x25, + 0xa3, 0x85, 0x83, 0x4f, 0x26, 0x9e, 0xa9, 0xfb, 0xc4, 0x7b, 0xcc, 0xd4, 0x6d, 0xe4, 0xbb, 0x46, + 0x47, 0x91, 0xef, 0xfa, 0x6d, 0xfd, 0x04, 0x3d, 0x59, 0xa4, 0x05, 0x75, 0x50, 0x76, 0xb6, 0xd0, + 0xed, 0x0c, 0xed, 0xcc, 0xa8, 0x3d, 0x7d, 0xdc, 0x19, 0xb5, 0x4f, 0x1d, 0x61, 0x46, 0xed, 0xd3, + 0xc7, 0x9a, 0x51, 0xfb, 0x91, 0xf7, 0x49, 0x46, 0xed, 0x99, 0xe3, 0xca, 0xa8, 0xfd, 0xe8, 0x43, + 0xcd, 0xa8, 0x4d, 0x3f, 0x5d, 0x4b, 0x86, 0xc3, 0xcd, 0xcc, 0x16, 0xf9, 0x74, 0x5d, 0xa3, 0xe7, + 0xf8, 0xa7, 0x53, 0x20, 0x9c, 0x12, 0xb5, 0xff, 0x0a, 0x9c, 0x39, 0x78, 0xe9, 0xa6, 0x9e, 0x27, + 0xb5, 0xd4, 0xa6, 0x97, 0xf1, 0x3c, 0x61, 0x62, 0xa1, 0x86, 0x55, 0x38, 0xe5, 0xef, 0xb7, 0x2c, + 0x78, 0xa4, 0x47, 0x46, 0xcc, 0xc2, 0xb1, 0xa4, 0x2d, 0x98, 0x6c, 0x99, 0x55, 0x0b, 0x87, 0xa6, + 0x1b, 0x19, 0x38, 0x95, 0xbf, 0x7f, 0x06, 0x80, 0xb3, 0xe4, 0x97, 0x3e, 0xf4, 0xc3, 0x1f, 0x9d, + 0xf9, 0xc0, 0xef, 0xfd, 0xe8, 0xcc, 0x07, 0xfe, 0xe8, 0x47, 0x67, 0x3e, 0xf0, 0x73, 0x7b, 0x67, + 0xac, 0x1f, 0xee, 0x9d, 0xb1, 0x7e, 0x6f, 0xef, 0x8c, 0xf5, 0xa7, 0x7b, 0x67, 0xac, 0xaf, 0xfe, + 0xf8, 0xcc, 0x07, 0xde, 0x28, 0x6d, 0x5f, 0xf8, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x97, 0xb8, + 0x99, 0xb5, 0xff, 0xcb, 0x00, 0x00, } diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/generated.proto b/staging/src/k8s.io/client-go/pkg/api/v1/generated.proto index 355768c1163..4e19e65bf1e 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/generated.proto +++ b/staging/src/k8s.io/client-go/pkg/api/v1/generated.proto @@ -3697,6 +3697,20 @@ message ServiceSpec { // Must be a valid DNS name and requires Type to be ExternalName. // +optional optional string externalName = 10; + + // externalTrafficPolicy denotes if this Service desires to route external traffic to + // local endpoints only. This preserves Source IP and avoids a second hop for + // LoadBalancer and Nodeport type services. + // +optional + optional string externalTrafficPolicy = 11; + + // healthCheckNodePort specifies the healthcheck nodePort for the service. + // If not specified, HealthCheckNodePort is created by the service api + // backend with the allocated nodePort. Will use user-specified nodePort value + // if specified by the client. Only effects when Type is set to LoadBalancer + // and ExternalTrafficPolicy is set to Local. + // +optional + optional int32 healthCheckNodePort = 12; } // ServiceStatus represents the current status of a service. diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/types.generated.go b/staging/src/k8s.io/client-go/pkg/api/v1/types.generated.go index 7e81fa3d65a..2e78f374253 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/types.generated.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/types.generated.go @@ -41195,6 +41195,32 @@ func (x *ServiceType) CodecDecodeSelf(d *codec1978.Decoder) { } } +func (x ServiceExternalTrafficPolicyType) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x)) + } +} + +func (x *ServiceExternalTrafficPolicyType) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + *((*string)(x)) = r.DecodeString() + } +} + func (x *ServiceStatus) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) @@ -41802,7 +41828,7 @@ func (x *ServiceSpec) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [9]bool + var yyq2 [11]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = len(x.Ports) != 0 @@ -41814,9 +41840,11 @@ func (x *ServiceSpec) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[6] = x.LoadBalancerIP != "" yyq2[7] = len(x.LoadBalancerSourceRanges) != 0 yyq2[8] = x.ExternalName != "" + yyq2[9] = x.ExternalTrafficPolicy != "" + yyq2[10] = x.HealthCheckNodePort != 0 var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(9) + r.EncodeArrayStart(11) } else { yynn2 = 0 for _, b := range yyq2 { @@ -42064,6 +42092,46 @@ func (x *ServiceSpec) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[9] { + x.ExternalTrafficPolicy.CodecEncodeSelf(e) + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[9] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("externalTrafficPolicy")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + x.ExternalTrafficPolicy.CodecEncodeSelf(e) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[10] { + yym34 := z.EncBinary() + _ = yym34 + if false { + } else { + r.EncodeInt(int64(x.HealthCheckNodePort)) + } + } else { + r.EncodeInt(0) + } + } else { + if yyq2[10] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("healthCheckNodePort")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym35 := z.EncBinary() + _ = yym35 + if false { + } else { + r.EncodeInt(int64(x.HealthCheckNodePort)) + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -42223,6 +42291,25 @@ func (x *ServiceSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { *((*string)(yyv18)) = r.DecodeString() } } + case "externalTrafficPolicy": + if r.TryDecodeAsNil() { + x.ExternalTrafficPolicy = "" + } else { + yyv20 := &x.ExternalTrafficPolicy + yyv20.CodecDecodeSelf(d) + } + case "healthCheckNodePort": + if r.TryDecodeAsNil() { + x.HealthCheckNodePort = 0 + } else { + yyv21 := &x.HealthCheckNodePort + yym22 := z.DecBinary() + _ = yym22 + if false { + } else { + *((*int32)(yyv21)) = int32(r.DecodeInt(32)) + } + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -42234,16 +42321,16 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj20 int - var yyb20 bool - var yyhl20 bool = l >= 0 - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + var yyj23 int + var yyb23 bool + var yyhl23 bool = l >= 0 + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42251,21 +42338,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Ports = nil } else { - yyv21 := &x.Ports - yym22 := z.DecBinary() - _ = yym22 + yyv24 := &x.Ports + yym25 := z.DecBinary() + _ = yym25 if false { } else { - h.decSliceServicePort((*[]ServicePort)(yyv21), d) + h.decSliceServicePort((*[]ServicePort)(yyv24), d) } } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42273,21 +42360,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Selector = nil } else { - yyv23 := &x.Selector - yym24 := z.DecBinary() - _ = yym24 + yyv26 := &x.Selector + yym27 := z.DecBinary() + _ = yym27 if false { } else { - z.F.DecMapStringStringX(yyv23, false, d) + z.F.DecMapStringStringX(yyv26, false, d) } } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42295,21 +42382,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ClusterIP = "" } else { - yyv25 := &x.ClusterIP - yym26 := z.DecBinary() - _ = yym26 + yyv28 := &x.ClusterIP + yym29 := z.DecBinary() + _ = yym29 if false { } else { - *((*string)(yyv25)) = r.DecodeString() + *((*string)(yyv28)) = r.DecodeString() } } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42317,16 +42404,16 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Type = "" } else { - yyv27 := &x.Type - yyv27.CodecDecodeSelf(d) + yyv30 := &x.Type + yyv30.CodecDecodeSelf(d) } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42334,21 +42421,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ExternalIPs = nil } else { - yyv28 := &x.ExternalIPs - yym29 := z.DecBinary() - _ = yym29 + yyv31 := &x.ExternalIPs + yym32 := z.DecBinary() + _ = yym32 if false { } else { - z.F.DecSliceStringX(yyv28, false, d) + z.F.DecSliceStringX(yyv31, false, d) } } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42356,16 +42443,16 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.SessionAffinity = "" } else { - yyv30 := &x.SessionAffinity - yyv30.CodecDecodeSelf(d) + yyv33 := &x.SessionAffinity + yyv33.CodecDecodeSelf(d) } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42373,21 +42460,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.LoadBalancerIP = "" } else { - yyv31 := &x.LoadBalancerIP - yym32 := z.DecBinary() - _ = yym32 + yyv34 := &x.LoadBalancerIP + yym35 := z.DecBinary() + _ = yym35 if false { } else { - *((*string)(yyv31)) = r.DecodeString() + *((*string)(yyv34)) = r.DecodeString() } } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42395,21 +42482,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.LoadBalancerSourceRanges = nil } else { - yyv33 := &x.LoadBalancerSourceRanges - yym34 := z.DecBinary() - _ = yym34 + yyv36 := &x.LoadBalancerSourceRanges + yym37 := z.DecBinary() + _ = yym37 if false { } else { - z.F.DecSliceStringX(yyv33, false, d) + z.F.DecSliceStringX(yyv36, false, d) } } - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -42417,26 +42504,65 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ExternalName = "" } else { - yyv35 := &x.ExternalName - yym36 := z.DecBinary() - _ = yym36 + yyv38 := &x.ExternalName + yym39 := z.DecBinary() + _ = yym39 if false { } else { - *((*string)(yyv35)) = r.DecodeString() + *((*string)(yyv38)) = r.DecodeString() + } + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ExternalTrafficPolicy = "" + } else { + yyv40 := &x.ExternalTrafficPolicy + yyv40.CodecDecodeSelf(d) + } + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l + } else { + yyb23 = r.CheckBreak() + } + if yyb23 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.HealthCheckNodePort = 0 + } else { + yyv41 := &x.HealthCheckNodePort + yym42 := z.DecBinary() + _ = yym42 + if false { + } else { + *((*int32)(yyv41)) = int32(r.DecodeInt(32)) } } for { - yyj20++ - if yyhl20 { - yyb20 = yyj20 > l + yyj23++ + if yyhl23 { + yyb23 = yyj23 > l } else { - yyb20 = r.CheckBreak() + yyb23 = r.CheckBreak() } - if yyb20 { + if yyb23 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj20-1, "") + z.DecStructFieldNotFound(yyj23-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -71379,7 +71505,7 @@ func (x codecSelfer1234) decSliceService(v *[]Service, d *codec1978.Decoder) { yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 440) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 464) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/types.go b/staging/src/k8s.io/client-go/pkg/api/v1/types.go index 945079129c5..db730965988 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/types.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/types.go @@ -2792,6 +2792,16 @@ const ( ServiceTypeExternalName ServiceType = "ExternalName" ) +// Service External Traffic Policy Type string +type ServiceExternalTrafficPolicyType string + +const ( + // ServiceExternalTrafficPolicyTypeLocal specifies local endpoints behavior. + ServiceExternalTrafficPolicyTypeLocal ServiceExternalTrafficPolicyType = "Local" + // ServiceExternalTrafficPolicyTypeGlobal specifies global (legacy) behavior. + ServiceExternalTrafficPolicyTypeGlobal ServiceExternalTrafficPolicyType = "Global" +) + // ServiceStatus represents the current status of a service. type ServiceStatus struct { // LoadBalancer contains the current status of the load-balancer, @@ -2904,6 +2914,20 @@ type ServiceSpec struct { // Must be a valid DNS name and requires Type to be ExternalName. // +optional ExternalName string `json:"externalName,omitempty" protobuf:"bytes,10,opt,name=externalName"` + + // externalTrafficPolicy denotes if this Service desires to route external traffic to + // local endpoints only. This preserves Source IP and avoids a second hop for + // LoadBalancer and Nodeport type services. + // +optional + ExternalTrafficPolicy ServiceExternalTrafficPolicyType `json:"externalTrafficPolicy,omitempty" protobuf:"bytes,11,opt,name=externalTrafficPolicy"` + + // healthCheckNodePort specifies the healthcheck nodePort for the service. + // If not specified, HealthCheckNodePort is created by the service api + // backend with the allocated nodePort. Will use user-specified nodePort value + // if specified by the client. Only effects when Type is set to LoadBalancer + // and ExternalTrafficPolicy is set to Local. + // +optional + HealthCheckNodePort int32 `json:"healthCheckNodePort,omitempty" protobuf:"bytes,12,opt,name=healthCheckNodePort"` } // ServicePort contains information on service's port. diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/client-go/pkg/api/v1/types_swagger_doc_generated.go index 585b4a9da65..409a698b106 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/types_swagger_doc_generated.go @@ -1844,6 +1844,8 @@ var map_ServiceSpec = map[string]string{ "loadBalancerIP": "Only applies to Service Type: LoadBalancer LoadBalancer will get created with the IP specified in this field. This feature depends on whether the underlying cloud-provider supports specifying the loadBalancerIP when a load balancer is created. This field will be ignored if the cloud-provider does not support the feature.", "loadBalancerSourceRanges": "If specified and supported by the platform, this will restrict traffic through the cloud-provider load-balancer will be restricted to the specified client IPs. This field will be ignored if the cloud-provider does not support the feature.\" More info: http://kubernetes.io/docs/user-guide/services-firewalls", "externalName": "externalName is the external reference that kubedns or equivalent will return as a CNAME record for this service. No proxying will be involved. Must be a valid DNS name and requires Type to be ExternalName.", + "externalTrafficPolicy": "externalTrafficPolicy denotes if this Service desires to route external traffic to local endpoints only. This preserves Source IP and avoids a second hop for LoadBalancer and Nodeport type services.", + "healthCheckNodePort": "healthCheckNodePort specifies the healthcheck nodePort for the service. If not specified, HealthCheckNodePort is created by the service api backend with the allocated nodePort. Will use user-specified nodePort value if specified by the client. Only effects when Type is set to LoadBalancer and ExternalTrafficPolicy is set to Local.", } func (ServiceSpec) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.conversion.go b/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.conversion.go index e83f26d2039..999119de856 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.conversion.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.conversion.go @@ -4721,6 +4721,8 @@ func autoConvert_v1_ServiceSpec_To_api_ServiceSpec(in *ServiceSpec, out *api.Ser out.LoadBalancerIP = in.LoadBalancerIP out.LoadBalancerSourceRanges = *(*[]string)(unsafe.Pointer(&in.LoadBalancerSourceRanges)) out.ExternalName = in.ExternalName + out.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyType(in.ExternalTrafficPolicy) + out.HealthCheckNodePort = in.HealthCheckNodePort return nil } @@ -4739,6 +4741,8 @@ func autoConvert_api_ServiceSpec_To_v1_ServiceSpec(in *api.ServiceSpec, out *Ser out.LoadBalancerIP = in.LoadBalancerIP out.SessionAffinity = ServiceAffinity(in.SessionAffinity) out.LoadBalancerSourceRanges = *(*[]string)(unsafe.Pointer(&in.LoadBalancerSourceRanges)) + out.ExternalTrafficPolicy = ServiceExternalTrafficPolicyType(in.ExternalTrafficPolicy) + out.HealthCheckNodePort = in.HealthCheckNodePort return nil } diff --git a/test/e2e/firewall.go b/test/e2e/firewall.go index f018c5b5435..d6640e18084 100644 --- a/test/e2e/firewall.go +++ b/test/e2e/firewall.go @@ -60,7 +60,7 @@ var _ = framework.KubeDescribe("Firewall rule", func() { nodesSet := sets.NewString(nodesNames...) // OnlyLocal service is needed to examine which exact nodes the requests are being forwarded to by the Load Balancer on GCE - By("Creating a LoadBalancer type service with onlyLocal annotation") + By("Creating a LoadBalancer type service with ExternalTrafficPolicy=Local") svc := jig.CreateOnlyLocalLoadBalancerService(ns, serviceName, framework.LoadBalancerCreateTimeoutDefault, false, func(svc *v1.Service) { svc.Spec.Ports = []v1.ServicePort{{Protocol: "TCP", Port: framework.FirewallTestHttpPort}} diff --git a/test/e2e/framework/BUILD b/test/e2e/framework/BUILD index 807a378c4dc..3d7cb7ae1a0 100644 --- a/test/e2e/framework/BUILD +++ b/test/e2e/framework/BUILD @@ -45,7 +45,6 @@ go_library( "//pkg/api/v1/helper:go_default_library", "//pkg/api/v1/node:go_default_library", "//pkg/api/v1/pod:go_default_library", - "//pkg/api/v1/service:go_default_library", "//pkg/apis/apps/v1beta1:go_default_library", "//pkg/apis/authorization/v1beta1:go_default_library", "//pkg/apis/batch:go_default_library", diff --git a/test/e2e/framework/service_util.go b/test/e2e/framework/service_util.go index 58a61a694ff..777ffabb3c8 100644 --- a/test/e2e/framework/service_util.go +++ b/test/e2e/framework/service_util.go @@ -34,7 +34,6 @@ import ( "k8s.io/apimachinery/pkg/util/uuid" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/api/v1/service" "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/client/retry" @@ -189,15 +188,15 @@ func (j *ServiceTestJig) ChangeServiceType(namespace, name string, newType v1.Se } } -// CreateOnlyLocalNodePortService creates a loadbalancer service and sanity checks its -// nodePort. If createPod is true, it also creates an RC with 1 replica of +// CreateOnlyLocalNodePortService creates a NodePort service with +// ExternalTrafficPolicy set to Local and sanity checks its nodePort. +// If createPod is true, it also creates an RC with 1 replica of // the standard netexec container used everywhere in this test. func (j *ServiceTestJig) CreateOnlyLocalNodePortService(namespace, serviceName string, createPod bool) *v1.Service { - By("creating a service " + namespace + "/" + serviceName + " with type=NodePort and annotation for local-traffic-only") + By("creating a service " + namespace + "/" + serviceName + " with type=NodePort and ExternalTrafficPolicy=Local") svc := j.CreateTCPServiceOrFail(namespace, func(svc *v1.Service) { svc.Spec.Type = v1.ServiceTypeNodePort - svc.ObjectMeta.Annotations = map[string]string{ - service.BetaAnnotationExternalTraffic: service.AnnotationValueExternalTrafficLocal} + svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeLocal svc.Spec.Ports = []v1.ServicePort{{Protocol: "TCP", Port: 80}} }) @@ -209,18 +208,18 @@ func (j *ServiceTestJig) CreateOnlyLocalNodePortService(namespace, serviceName s return svc } -// CreateOnlyLocalLoadBalancerService creates a loadbalancer service and waits for it to -// acquire an ingress IP. If createPod is true, it also creates an RC with 1 -// replica of the standard netexec container used everywhere in this test. +// CreateOnlyLocalLoadBalancerService creates a loadbalancer service with +// ExternalTrafficPolicy set to Local and waits for it to acquire an ingress IP. +// If createPod is true, it also creates an RC with 1 replica of +// the standard netexec container used everywhere in this test. func (j *ServiceTestJig) CreateOnlyLocalLoadBalancerService(namespace, serviceName string, timeout time.Duration, createPod bool, tweak func(svc *v1.Service)) *v1.Service { - By("creating a service " + namespace + "/" + serviceName + " with type=LoadBalancer and annotation for local-traffic-only") + By("creating a service " + namespace + "/" + serviceName + " with type=LoadBalancer and ExternalTrafficPolicy=Local") svc := j.CreateTCPServiceOrFail(namespace, func(svc *v1.Service) { svc.Spec.Type = v1.ServiceTypeLoadBalancer // We need to turn affinity off for our LB distribution tests svc.Spec.SessionAffinity = v1.ServiceAffinityNone - svc.ObjectMeta.Annotations = map[string]string{ - service.BetaAnnotationExternalTraffic: service.AnnotationValueExternalTrafficLocal} + svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeLocal if tweak != nil { tweak(svc) } diff --git a/test/e2e/service.go b/test/e2e/service.go index c1c785cf21f..2724ddad6a5 100644 --- a/test/e2e/service.go +++ b/test/e2e/service.go @@ -1441,7 +1441,7 @@ var _ = framework.KubeDescribe("ESIPP [Slow]", func() { } }) - It("should handle updates to source ip annotation", func() { + It("should handle updates to ExternalTrafficPolicy field", func() { namespace := f.Namespace.Name serviceName := "external-local" jig := framework.NewServiceTestJig(cs, serviceName) @@ -1458,16 +1458,15 @@ var _ = framework.KubeDescribe("ESIPP [Slow]", func() { Expect(cs.Core().Services(svc.Namespace).Delete(svc.Name, nil)).NotTo(HaveOccurred()) }() - // save the health check node port because it disappears when lift the annotation. + // save the health check node port because it disappears when ESIPP is turned off. healthCheckNodePort := int(service.GetServiceHealthCheckNodePort(svc)) By("turning ESIPP off") svc = jig.UpdateServiceOrFail(svc.Namespace, svc.Name, func(svc *v1.Service) { - svc.ObjectMeta.Annotations[service.BetaAnnotationExternalTraffic] = - service.AnnotationValueExternalTrafficGlobal + svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeGlobal }) if service.GetServiceHealthCheckNodePort(svc) > 0 { - framework.Failf("Service HealthCheck NodePort annotation still present") + framework.Failf("Service HealthCheck NodePort still present") } endpointNodeMap := jig.GetEndpointNodes(svc) @@ -1525,13 +1524,11 @@ var _ = framework.KubeDescribe("ESIPP [Slow]", func() { // If the health check nodePort has NOT been freed, the new service // creation will fail. - By("turning ESIPP annotation back on") + By("setting ExternalTraffic field back to OnlyLocal") svc = jig.UpdateServiceOrFail(svc.Namespace, svc.Name, func(svc *v1.Service) { - svc.ObjectMeta.Annotations[service.BetaAnnotationExternalTraffic] = - service.AnnotationValueExternalTrafficLocal + svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeLocal // Request the same healthCheckNodePort as before, to test the user-requested allocation path - svc.ObjectMeta.Annotations[service.BetaAnnotationHealthCheckNodePort] = - fmt.Sprintf("%d", healthCheckNodePort) + svc.Spec.HealthCheckNodePort = int32(healthCheckNodePort) }) pollErr = wait.PollImmediate(framework.Poll, framework.KubeProxyLagTimeout, func() (bool, error) { content := jig.GetHTTPContent(ingressIP, svcTCPPort, framework.KubeProxyLagTimeout, path)