diff --git a/api/jsonschema/schema.json b/api/jsonschema/schema.json index e02fb0938c..6491d09d56 100644 --- a/api/jsonschema/schema.json +++ b/api/jsonschema/schema.json @@ -1669,6 +1669,14 @@ "type": "array", "x-kubernetes-patch-merge-key": "type", "x-kubernetes-patch-strategy": "merge" + }, + "lastUpdated": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + }, + "observedGeneration": { + "description": "The generation observed by the controller.", + "format": "int64", + "type": "integer" } }, "type": "object" @@ -3913,6 +3921,14 @@ "type": "array", "x-kubernetes-patch-merge-key": "type", "x-kubernetes-patch-strategy": "merge" + }, + "lastUpdated": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + }, + "observedGeneration": { + "description": "The generation observed by the controller.", + "format": "int64", + "type": "integer" } }, "type": "object" diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 4a6ebe91cd..2ddfb035aa 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -1656,6 +1656,14 @@ }, "x-kubernetes-patch-merge-key": "type", "x-kubernetes-patch-strategy": "merge" + }, + "lastUpdated": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + }, + "observedGeneration": { + "description": "The generation observed by the controller.", + "type": "integer", + "format": "int64" } } }, @@ -3888,6 +3896,14 @@ }, "x-kubernetes-patch-merge-key": "type", "x-kubernetes-patch-strategy": "merge" + }, + "lastUpdated": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + }, + "observedGeneration": { + "description": "The generation observed by the controller.", + "type": "integer", + "format": "int64" } } }, diff --git a/docs/APIs.md b/docs/APIs.md index 04e0fc61ba..59fe34a1d0 100644 --- a/docs/APIs.md +++ b/docs/APIs.md @@ -8252,6 +8252,41 @@ Status + + + + +lastUpdated
+ +Kubernetes meta/v1.Time + + + + +(Optional) + + + + + + + + +observedGeneration
int64 + + + + +(Optional) +

+ +The generation observed by the controller. +

+ + + + + @@ -18461,6 +18496,41 @@ Status + + + + +lastUpdated
+ +Kubernetes meta/v1.Time + + + + +(Optional) + + + + + + + + +observedGeneration
int64 + + + + +(Optional) +

+ +The generation observed by the controller. +

+ + + + + diff --git a/pkg/apis/events/v1alpha1/const.go b/pkg/apis/events/v1alpha1/const.go index 2df5b93130..7739df3e93 100644 --- a/pkg/apis/events/v1alpha1/const.go +++ b/pkg/apis/events/v1alpha1/const.go @@ -7,6 +7,28 @@ import ( corev1 "k8s.io/api/core/v1" ) +const ( + Project = "argo-events" + + KeyComponent = "app.kubernetes.io/component" + KeyPartOf = "app.kubernetes.io/part-of" + KeyManagedBy = "app.kubernetes.io/managed-by" + KeyAppName = "app.kubernetes.io/name" + KeyHash = "events.argoproj.io/hash" // hash of the object + KeyEventSourceName = "events.argoproj.io/eventsource-name" + KeySensorName = "events.argoproj.io/sensor-name" + + // controllers + ControllerEventBus = "eventbus-controller" + ControllerEventSource = "eventsource-controller" + ControllerSensor = "sensor-controller" + + // components + ComponentEventBus = "eventbus" + ComponentEventSource = "eventsourcd" + ComponentSensor = "sensor" +) + // EventSourceType is the type of event source type EventSourceType string diff --git a/pkg/apis/events/v1alpha1/eventsource_types.go b/pkg/apis/events/v1alpha1/eventsource_types.go index 84dbbf2e06..f382146ff5 100644 --- a/pkg/apis/events/v1alpha1/eventsource_types.go +++ b/pkg/apis/events/v1alpha1/eventsource_types.go @@ -1,6 +1,8 @@ package v1alpha1 import ( + "fmt" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -122,6 +124,14 @@ func (e EventSourceSpec) GetReplicas() int32 { return replicas } +func (es EventSource) GetDeploymentName() string { + return fmt.Sprintf("%s-es", es.Name) +} + +func (es EventSource) GetServiceName() string { + return fmt.Sprintf("%s-es-svc", es.Name) +} + // Service holds the service information eventsource exposes type Service struct { // Metadata sets the pods's metadata, i.e. annotations and labels @@ -1497,6 +1507,11 @@ const ( // EventSourceStatus holds the status of the event-source resource type EventSourceStatus struct { Status `json:",inline" protobuf:"bytes,1,opt,name=status"` + // +optional + LastUpdated metav1.Time `json:"lastUpdated,omitempty" protobuf:"bytes,2,opt,name=lastUpdated"` + // The generation observed by the controller. + // +optional + ObservedGeneration int64 `json:"observedGeneration,omitempty" protobuf:"varint,3,opt,name=observedGeneration"` } // InitConditions sets conditions to Unknown state. @@ -1523,3 +1538,8 @@ func (es *EventSourceStatus) MarkDeployed() { func (es *EventSourceStatus) MarkDeployFailed(reason, message string) { es.MarkFalse(EventSourceConditionDeployed, reason, message) } + +// SetObservedGeneration sets the Status ObservedGeneration +func (pls *EventSourceStatus) SetObservedGeneration(value int64) { + pls.ObservedGeneration = value +} diff --git a/pkg/apis/events/v1alpha1/generated.pb.go b/pkg/apis/events/v1alpha1/generated.pb.go index cbebb4c13c..4f7d1f32b1 100644 --- a/pkg/apis/events/v1alpha1/generated.pb.go +++ b/pkg/apis/events/v1alpha1/generated.pb.go @@ -3929,818 +3929,823 @@ func init() { } var fileDescriptor_e864cc3344a263b9 = []byte{ - // 12961 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xc9, - 0x75, 0xd8, 0xcd, 0x27, 0x39, 0x8f, 0x9f, 0x5b, 0xfb, 0x71, 0xbc, 0xf5, 0xdd, 0x72, 0x3d, 0x07, - 0x5d, 0xee, 0xec, 0x13, 0x29, 0x9d, 0x24, 0x7b, 0x7d, 0x8a, 0xcf, 0x1a, 0x7e, 0xed, 0x72, 0x97, - 0xe4, 0x72, 0xdf, 0x70, 0x77, 0xf5, 0xe5, 0xbb, 0x6b, 0xce, 0x14, 0x87, 0x7d, 0x9c, 0xe9, 0x9e, - 0xed, 0xee, 0xe1, 0x2e, 0x2f, 0x90, 0x7c, 0xb6, 0xa4, 0xb3, 0x24, 0x2b, 0x92, 0x2c, 0x08, 0x86, - 0x12, 0x38, 0x46, 0x0c, 0x23, 0xb1, 0x9d, 0xc4, 0x41, 0x10, 0x03, 0xce, 0xdf, 0x20, 0x41, 0x12, - 0x21, 0x70, 0x00, 0x1b, 0xb0, 0x63, 0x23, 0x09, 0x16, 0xd1, 0xca, 0x49, 0x80, 0x00, 0xca, 0xc7, - 0xaf, 0x24, 0x9b, 0x3f, 0x41, 0x7d, 0x76, 0x75, 0x4f, 0x0f, 0xc9, 0x61, 0xcf, 0x70, 0x6f, 0x11, - 0xff, 0x22, 0xa7, 0xde, 0xab, 0xf7, 0xaa, 0xeb, 0xe3, 0xd5, 0xab, 0x57, 0xef, 0xbd, 0x82, 0x6b, - 0x0d, 0x3b, 0xd8, 0xed, 0x6c, 0xcf, 0xd5, 0xdc, 0xd6, 0xbc, 0xe5, 0x35, 0xdc, 0xb6, 0xe7, 0xbe, - 0xc3, 0xff, 0xf9, 0x30, 0xdd, 0xa7, 0x4e, 0xe0, 0xcf, 0xb7, 0xf7, 0x1a, 0xf3, 0x56, 0xdb, 0xf6, - 0xe7, 0xe5, 0xef, 0xfd, 0x8f, 0x5a, 0xcd, 0xf6, 0xae, 0xf5, 0xd1, 0xf9, 0x06, 0x75, 0xa8, 0x67, - 0x05, 0xb4, 0x3e, 0xd7, 0xf6, 0xdc, 0xc0, 0x25, 0x57, 0x42, 0x4a, 0x73, 0x8a, 0x12, 0xff, 0xe7, - 0x2d, 0x51, 0x73, 0xae, 0xbd, 0xd7, 0x98, 0x63, 0x94, 0xe6, 0xe4, 0x6f, 0x45, 0xe9, 0xe2, 0x87, - 0x8d, 0x36, 0x34, 0xdc, 0x86, 0x3b, 0xcf, 0x09, 0x6e, 0x77, 0x76, 0xf8, 0x2f, 0xfe, 0x83, 0xff, - 0x27, 0x18, 0x5d, 0x2c, 0xef, 0x5d, 0xf1, 0xe7, 0x6c, 0x97, 0xb5, 0x6a, 0xbe, 0xe6, 0x7a, 0x74, - 0x7e, 0xbf, 0xab, 0x31, 0x17, 0x3f, 0x1e, 0xe2, 0xb4, 0xac, 0xda, 0xae, 0xed, 0x50, 0xef, 0x40, - 0x7d, 0xca, 0xbc, 0x47, 0x7d, 0xb7, 0xe3, 0xd5, 0x68, 0x5f, 0xb5, 0xfc, 0xf9, 0x16, 0x0d, 0xac, - 0x24, 0x5e, 0xf3, 0xbd, 0x6a, 0x79, 0x1d, 0x27, 0xb0, 0x5b, 0xdd, 0x6c, 0x7e, 0xea, 0xa8, 0x0a, - 0x7e, 0x6d, 0x97, 0xb6, 0xac, 0x78, 0xbd, 0xf2, 0xff, 0xc9, 0xc0, 0x99, 0xca, 0xfa, 0xad, 0xcd, - 0x45, 0xd7, 0xf1, 0x3b, 0x2d, 0xba, 0xe8, 0x3a, 0x3b, 0x76, 0x83, 0x7c, 0x02, 0xc6, 0x6a, 0xa2, - 0xc0, 0xdb, 0xb2, 0x1a, 0x33, 0x99, 0xcb, 0x99, 0x97, 0x4b, 0x0b, 0x67, 0xbf, 0xff, 0x70, 0xf6, - 0x99, 0x47, 0x0f, 0x67, 0xc7, 0x16, 0x43, 0x10, 0x9a, 0x78, 0xe4, 0x15, 0x18, 0xb1, 0x3a, 0x81, - 0x5b, 0xa9, 0xed, 0xcd, 0x64, 0x2f, 0x67, 0x5e, 0x1e, 0x5d, 0x98, 0x92, 0x55, 0x46, 0x2a, 0xa2, - 0x18, 0x15, 0x9c, 0xcc, 0x43, 0x89, 0x3e, 0xa8, 0x35, 0x3b, 0xbe, 0xbd, 0x4f, 0x67, 0x72, 0x1c, - 0xf9, 0x8c, 0x44, 0x2e, 0x2d, 0x2b, 0x00, 0x86, 0x38, 0x8c, 0xb6, 0xe3, 0xae, 0xb9, 0x35, 0xab, - 0x39, 0x93, 0x8f, 0xd2, 0xde, 0x10, 0xc5, 0xa8, 0xe0, 0xe4, 0x25, 0x28, 0x3a, 0xee, 0x5d, 0xcb, - 0x0e, 0x66, 0x0a, 0x1c, 0x73, 0x52, 0x62, 0x16, 0x37, 0x78, 0x29, 0x4a, 0x68, 0xf9, 0xbf, 0x8e, - 0xc1, 0x14, 0xfb, 0xf6, 0x65, 0x36, 0x77, 0xaa, 0x7c, 0xf8, 0xc8, 0x0b, 0x90, 0xeb, 0x78, 0x4d, - 0xf9, 0xc5, 0x63, 0xb2, 0x62, 0xee, 0x36, 0xae, 0x21, 0x2b, 0x27, 0x57, 0x60, 0x9c, 0x3e, 0xa8, - 0xed, 0x5a, 0x4e, 0x83, 0x6e, 0x58, 0x2d, 0xca, 0x3f, 0xb3, 0xb4, 0x70, 0x4e, 0xe2, 0x8d, 0x2f, - 0x1b, 0x30, 0x8c, 0x60, 0x9a, 0x35, 0xb7, 0x0e, 0xda, 0xe2, 0x9b, 0x13, 0x6a, 0x32, 0x18, 0x46, - 0x30, 0xc9, 0x6b, 0x00, 0x9e, 0xdb, 0x09, 0x6c, 0xa7, 0x71, 0x83, 0x1e, 0xf0, 0x8f, 0x2f, 0x2d, - 0x10, 0x59, 0x0f, 0x50, 0x43, 0xd0, 0xc0, 0x22, 0xef, 0x67, 0xe0, 0x4c, 0xcd, 0x75, 0x1c, 0x5a, - 0x0b, 0x6c, 0xd7, 0x59, 0xb0, 0x6a, 0x7b, 0xee, 0xce, 0x0e, 0xef, 0x8e, 0xb1, 0xd7, 0x2a, 0x73, - 0x27, 0x5d, 0x55, 0x73, 0x92, 0xd0, 0xc2, 0xf9, 0x47, 0x0f, 0x67, 0xcf, 0x2c, 0xc6, 0xe9, 0x63, - 0x37, 0x4b, 0xf2, 0x2a, 0x8c, 0xbe, 0xe3, 0xbb, 0xce, 0x82, 0x5b, 0x3f, 0x98, 0x29, 0xf2, 0xd1, - 0x98, 0x96, 0x4d, 0x1f, 0xbd, 0x5e, 0xbd, 0xb9, 0xc1, 0xca, 0x51, 0x63, 0x90, 0x37, 0x21, 0x17, - 0x34, 0xfd, 0x99, 0x11, 0xde, 0xce, 0xc5, 0x93, 0xb7, 0x73, 0x6b, 0xad, 0x2a, 0x66, 0xf2, 0xc2, - 0x08, 0x1b, 0xbe, 0xad, 0xb5, 0x2a, 0x32, 0xc2, 0xe4, 0x2b, 0x19, 0x18, 0x65, 0x4b, 0xae, 0x6e, - 0x05, 0xd6, 0xcc, 0xe8, 0xe5, 0xdc, 0xcb, 0x63, 0xaf, 0xdd, 0x3d, 0x39, 0x97, 0xd8, 0xdc, 0x99, - 0x5b, 0x97, 0x94, 0x97, 0x9d, 0xc0, 0x3b, 0x08, 0xbf, 0x53, 0x15, 0xa3, 0x66, 0x4d, 0xbe, 0x93, - 0x81, 0x29, 0x35, 0xc6, 0x4b, 0xb4, 0xd6, 0xb4, 0x3c, 0x3a, 0x53, 0xe2, 0x1f, 0x5d, 0x4d, 0xd9, - 0x9c, 0x28, 0x51, 0xd9, 0x09, 0x67, 0x1f, 0x3d, 0x9c, 0x9d, 0x8a, 0x81, 0x30, 0xde, 0x00, 0x36, - 0x67, 0xc6, 0xef, 0x75, 0x68, 0x47, 0xb7, 0x08, 0x78, 0x8b, 0x36, 0xd3, 0xb5, 0xe8, 0x96, 0x41, - 0x51, 0x36, 0x67, 0x9a, 0x4d, 0x78, 0xb3, 0x1c, 0x23, 0x7c, 0xc9, 0xbb, 0x50, 0xe2, 0xbf, 0x17, - 0x6c, 0xa7, 0x3e, 0x33, 0xc6, 0x1b, 0xb1, 0x3e, 0x80, 0x46, 0x30, 0x72, 0xb2, 0x05, 0x13, 0x4c, - 0xcc, 0xe8, 0x42, 0x0c, 0xd9, 0x11, 0x0f, 0x46, 0xa4, 0x44, 0x9b, 0x19, 0xe7, 0x9c, 0x6f, 0xa4, - 0xe3, 0x1c, 0x91, 0xab, 0x0b, 0x63, 0x4c, 0x5e, 0xc9, 0x22, 0x54, 0x8c, 0x88, 0x05, 0x79, 0xab, - 0x13, 0xec, 0xce, 0x4c, 0xa4, 0x9d, 0xf6, 0x0b, 0x96, 0x6f, 0xd7, 0x2a, 0x9d, 0x60, 0x77, 0x61, - 0xf4, 0xd1, 0xc3, 0xd9, 0x3c, 0xfb, 0x0f, 0x39, 0x69, 0x82, 0x50, 0xea, 0x78, 0xcd, 0x2a, 0xad, - 0x79, 0x34, 0x98, 0x99, 0xe4, 0x7c, 0x3e, 0x34, 0x27, 0xb6, 0x0c, 0x46, 0x6a, 0x8e, 0xed, 0x79, - 0x73, 0xfb, 0x1f, 0x9d, 0x13, 0x18, 0x37, 0xe8, 0x41, 0x95, 0x36, 0x69, 0x2d, 0x70, 0x3d, 0xd1, - 0x55, 0xb7, 0x71, 0x4d, 0x40, 0x30, 0x24, 0x43, 0x5c, 0x28, 0xee, 0xd8, 0xcd, 0x80, 0x7a, 0x33, - 0x53, 0x69, 0x7b, 0xca, 0x58, 0x45, 0x2b, 0x9c, 0xe4, 0x02, 0x30, 0x79, 0x2d, 0xfe, 0x47, 0xc9, - 0xe6, 0xe2, 0x27, 0x61, 0x22, 0xb2, 0xc4, 0xc8, 0x34, 0xe4, 0xf6, 0xe8, 0x81, 0x10, 0xd6, 0xc8, - 0xfe, 0x25, 0xe7, 0xa0, 0xb0, 0x6f, 0x35, 0x3b, 0x52, 0x30, 0xa3, 0xf8, 0xf1, 0x7a, 0xf6, 0x4a, - 0xa6, 0xfc, 0x47, 0x19, 0x78, 0xae, 0xe7, 0x0a, 0x61, 0xbb, 0x4b, 0xbd, 0xe3, 0x59, 0xdb, 0x4d, - 0xca, 0xa9, 0x19, 0xbb, 0xcb, 0x92, 0x28, 0x46, 0x05, 0x67, 0xe2, 0x98, 0x6d, 0x62, 0x4b, 0xb4, - 0x49, 0x03, 0x2a, 0xf7, 0x39, 0x2d, 0x8e, 0x2b, 0x1a, 0x82, 0x06, 0x16, 0x93, 0x82, 0xb6, 0x13, - 0x50, 0xcf, 0xb1, 0x9a, 0x72, 0xb3, 0xd3, 0xd2, 0x61, 0x55, 0x96, 0xa3, 0xc6, 0x30, 0xf6, 0xaf, - 0xfc, 0xa1, 0xfb, 0xd7, 0xcf, 0xc2, 0xd9, 0x84, 0xc9, 0x6d, 0x54, 0xcf, 0x1c, 0x5a, 0xfd, 0xb7, - 0xb2, 0x70, 0x21, 0x79, 0x85, 0x92, 0xcb, 0x90, 0x77, 0xd8, 0xf6, 0x26, 0xb6, 0xc1, 0x71, 0x49, - 0x20, 0xcf, 0xb7, 0x35, 0x0e, 0x31, 0x3b, 0x2c, 0xdb, 0x57, 0x87, 0xe5, 0x8e, 0xd5, 0x61, 0x11, - 0xf5, 0x20, 0x7f, 0x0c, 0xf5, 0xe0, 0x98, 0x7b, 0x3e, 0x23, 0x6c, 0x79, 0x8d, 0x4e, 0x8b, 0xcd, - 0x3f, 0xbe, 0x21, 0x95, 0x42, 0xc2, 0x15, 0x05, 0xc0, 0x10, 0xa7, 0xfc, 0x38, 0x0f, 0xd3, 0x95, - 0xbb, 0xd5, 0x35, 0xab, 0xb5, 0x5d, 0xb7, 0xb6, 0x3c, 0xbb, 0xd1, 0xa0, 0x1e, 0xdb, 0xcc, 0x77, - 0x3a, 0x0e, 0xdf, 0xe8, 0x36, 0xc2, 0x7e, 0xd2, 0x9b, 0xf9, 0x8a, 0x01, 0xc3, 0x08, 0x26, 0x5b, - 0x88, 0x56, 0xad, 0x46, 0x7d, 0x9f, 0xed, 0xe5, 0xd9, 0xbe, 0x17, 0x62, 0x45, 0xd5, 0xc5, 0x90, - 0x0c, 0xa3, 0xe9, 0x2b, 0x74, 0xde, 0xbf, 0xfd, 0xd1, 0xd4, 0xc5, 0x18, 0x92, 0x61, 0xfd, 0xe9, - 0xd1, 0x86, 0xed, 0x3a, 0x52, 0xe1, 0xd0, 0xfd, 0x89, 0xbc, 0x14, 0x25, 0x94, 0x74, 0x60, 0xa4, - 0x6d, 0x1d, 0x34, 0x5d, 0xab, 0x3e, 0x53, 0xe0, 0xfb, 0xe9, 0xf5, 0x14, 0xbb, 0xb6, 0xe8, 0xdd, - 0x4d, 0xcb, 0xb3, 0x5a, 0x94, 0x09, 0x01, 0x3d, 0xa7, 0x36, 0x05, 0x0b, 0x54, 0xbc, 0xc8, 0x17, - 0x01, 0xda, 0x0a, 0x8d, 0x8d, 0xe3, 0xa0, 0x39, 0xeb, 0xf9, 0xa9, 0x8b, 0x7c, 0x34, 0x38, 0x92, - 0xd7, 0x61, 0xd2, 0x76, 0xf6, 0xdd, 0x9a, 0xc5, 0x06, 0x96, 0xeb, 0x73, 0x23, 0x42, 0x2f, 0x7b, - 0xf4, 0x70, 0x76, 0x72, 0x35, 0x02, 0xc1, 0x18, 0x26, 0x5b, 0x3a, 0x9e, 0xdb, 0xa4, 0x15, 0xdc, - 0x98, 0x19, 0xe5, 0x95, 0xf4, 0x67, 0xa2, 0x28, 0x46, 0x05, 0x2f, 0xbf, 0x02, 0xc5, 0x4a, 0xcb, - 0xed, 0x38, 0x01, 0x99, 0x55, 0x82, 0x8d, 0x4d, 0xb5, 0xf1, 0x85, 0xd2, 0xa3, 0x87, 0xb3, 0x85, - 0x3b, 0xac, 0x40, 0xca, 0xb8, 0xf2, 0x8f, 0xb2, 0x70, 0xb6, 0xe2, 0x35, 0xdc, 0xbb, 0xae, 0xb7, - 0xb7, 0xd3, 0x74, 0xef, 0xab, 0xa9, 0xea, 0x40, 0x51, 0x9c, 0x4c, 0x78, 0xcd, 0x54, 0xbd, 0x54, - 0xf1, 0x02, 0x7b, 0xc7, 0xaa, 0x05, 0x6b, 0xf2, 0x6b, 0x84, 0x90, 0x16, 0x62, 0x1b, 0x25, 0x17, - 0x72, 0x0d, 0x4a, 0x6e, 0x9b, 0x1d, 0x31, 0xd8, 0xdc, 0x11, 0xea, 0xf1, 0x4f, 0xa8, 0x05, 0x76, - 0x53, 0x01, 0x1e, 0x3f, 0x9c, 0x3d, 0x6f, 0x36, 0x56, 0x03, 0x30, 0xac, 0x1c, 0x1b, 0xe3, 0xdc, - 0xa9, 0x8f, 0xf1, 0xf3, 0x90, 0xb7, 0xbc, 0x86, 0x3f, 0x93, 0xbf, 0x9c, 0x7b, 0xb9, 0x24, 0x77, - 0x54, 0xaf, 0xe1, 0x23, 0x2f, 0x2d, 0xbf, 0x5f, 0x80, 0xe9, 0x78, 0x87, 0x90, 0xcf, 0x43, 0xd6, - 0xff, 0x98, 0xec, 0xe8, 0xa5, 0x93, 0x37, 0xb5, 0xfa, 0x31, 0x45, 0x79, 0xa1, 0xf8, 0xe8, 0xe1, - 0x6c, 0xb6, 0xfa, 0x31, 0xcc, 0xfa, 0x1f, 0x23, 0x65, 0x28, 0xda, 0x4e, 0xd3, 0x76, 0xd4, 0xb1, - 0x83, 0x77, 0xff, 0x2a, 0x2f, 0x41, 0x09, 0x21, 0x75, 0xc8, 0xef, 0xd8, 0x4d, 0x2a, 0xc5, 0xc0, - 0xca, 0xc9, 0xdb, 0xb0, 0x62, 0x37, 0xa9, 0x6e, 0x05, 0xff, 0x78, 0x56, 0x82, 0x9c, 0x3a, 0x79, - 0x5b, 0x9c, 0x92, 0xf2, 0x9c, 0xc9, 0xf2, 0xc9, 0x99, 0xdc, 0xc6, 0x35, 0xcd, 0x63, 0x24, 0x72, - 0xd0, 0xba, 0x0d, 0xa5, 0x1a, 0xdf, 0x8b, 0x5a, 0x56, 0x5b, 0x9e, 0x5b, 0x5e, 0x4e, 0x92, 0x69, - 0x62, 0xc3, 0x5a, 0xb7, 0xda, 0x5d, 0x62, 0x6d, 0x51, 0x55, 0xc7, 0x90, 0x12, 0x6b, 0x78, 0xc3, - 0x0e, 0xb8, 0xe0, 0x4f, 0xd5, 0xf0, 0xab, 0x76, 0x10, 0x6d, 0xf8, 0x55, 0x3b, 0x40, 0x46, 0x9a, - 0xb8, 0x30, 0xaa, 0x6c, 0x01, 0xf2, 0x1c, 0x93, 0x82, 0xcd, 0x8d, 0x2b, 0x55, 0x94, 0xc4, 0x16, - 0xc6, 0x99, 0xb6, 0xa0, 0x7e, 0xa1, 0x66, 0x52, 0xfe, 0xfd, 0x3c, 0x9c, 0xaf, 0xbc, 0xdb, 0xf1, - 0x28, 0x57, 0xa2, 0xae, 0x75, 0xb6, 0x7d, 0xb5, 0xf4, 0x2f, 0x43, 0x7e, 0xe7, 0x5e, 0xdd, 0x89, - 0xef, 0xe2, 0x2b, 0xb7, 0x96, 0x36, 0x90, 0x43, 0x98, 0x28, 0xda, 0xed, 0x6c, 0x1b, 0x27, 0x59, - 0x2d, 0x8a, 0xae, 0x89, 0x62, 0x54, 0x70, 0xd2, 0x86, 0xb3, 0xfe, 0xae, 0xe5, 0xd1, 0xba, 0xde, - 0x82, 0x78, 0xb5, 0xbe, 0xb6, 0x9b, 0x67, 0x1f, 0x3d, 0x9c, 0x3d, 0x5b, 0xed, 0xa6, 0x82, 0x49, - 0xa4, 0x49, 0x1d, 0xa6, 0x62, 0xc5, 0x72, 0xc2, 0x1d, 0x93, 0x1b, 0x3f, 0xf5, 0xc4, 0xb8, 0x61, - 0x9c, 0xe4, 0xff, 0xa7, 0x1b, 0x58, 0xf9, 0xbd, 0x02, 0x3c, 0x17, 0xce, 0x1a, 0xff, 0x5a, 0x67, - 0xdb, 0xb4, 0x82, 0x1c, 0x3d, 0x73, 0x7a, 0x4c, 0x87, 0xec, 0xa9, 0x4e, 0x87, 0xdc, 0xe0, 0xa7, - 0x83, 0xb1, 0x22, 0xf2, 0x47, 0xac, 0x88, 0x6f, 0x99, 0xc6, 0x04, 0x31, 0x77, 0xac, 0x14, 0x9b, - 0x6b, 0xaf, 0xc1, 0xe8, 0xc3, 0xac, 0x10, 0x9e, 0xc8, 0x8a, 0x4f, 0xc1, 0x89, 0xec, 0xd7, 0x8a, - 0xf0, 0x3c, 0xff, 0x6a, 0x7e, 0x00, 0xa9, 0x06, 0xae, 0x67, 0x35, 0xa8, 0x39, 0x0b, 0xaf, 0x03, - 0xf1, 0x45, 0x69, 0xa5, 0x56, 0x63, 0x5a, 0x90, 0xa1, 0x6b, 0x5f, 0x94, 0xdd, 0x40, 0xaa, 0x5d, - 0x18, 0x98, 0x50, 0x8b, 0x34, 0x60, 0x3a, 0x34, 0x4e, 0x55, 0x03, 0xcf, 0x76, 0x1a, 0xfd, 0x4d, - 0xd6, 0x73, 0x8f, 0x1e, 0xce, 0x4e, 0x2f, 0xc6, 0x48, 0x60, 0x17, 0x51, 0x76, 0xc0, 0xe0, 0xd6, - 0x04, 0x2d, 0x1d, 0x8d, 0x03, 0xc6, 0x2d, 0x05, 0xc0, 0x10, 0x27, 0x62, 0x21, 0xcb, 0x1f, 0x69, - 0x21, 0x7b, 0x01, 0x72, 0xf5, 0xe6, 0x3d, 0x79, 0xc8, 0xd1, 0xf6, 0xc9, 0xa5, 0xb5, 0x5b, 0xc8, - 0xca, 0xc9, 0x77, 0xcc, 0x39, 0x29, 0xa4, 0x4a, 0x3d, 0xe5, 0x9c, 0xec, 0x31, 0x3a, 0x27, 0x9a, - 0x96, 0x23, 0xa7, 0x32, 0x2d, 0xc9, 0x27, 0x61, 0xa2, 0x4e, 0x6b, 0x6e, 0x9d, 0xae, 0x53, 0xdf, - 0xb7, 0x1a, 0x94, 0xeb, 0xd9, 0xa3, 0x0b, 0xe7, 0x65, 0x1b, 0x27, 0x96, 0x4c, 0x20, 0x46, 0x71, - 0xc9, 0x22, 0x9c, 0xb9, 0x6f, 0xd9, 0xc1, 0x96, 0xdd, 0xa2, 0xab, 0x4e, 0x95, 0xd6, 0x5c, 0xa7, - 0xee, 0x73, 0xe3, 0x5c, 0x41, 0x98, 0x3d, 0xef, 0xc6, 0x81, 0xd8, 0x8d, 0x9f, 0x6e, 0x61, 0xfc, - 0x59, 0x11, 0x2e, 0xf2, 0xae, 0xaf, 0x52, 0x6f, 0xdf, 0xae, 0xd1, 0x85, 0x8e, 0x6f, 0x2e, 0x8b, - 0xa4, 0xa9, 0x9c, 0x19, 0xfa, 0x54, 0xce, 0x1e, 0x63, 0x2a, 0xcf, 0x43, 0x29, 0x70, 0xdb, 0x76, - 0x2d, 0x69, 0xee, 0x6f, 0x29, 0x00, 0x86, 0x38, 0x64, 0x09, 0xa6, 0xfd, 0xce, 0xb6, 0x5f, 0xf3, - 0xec, 0xb6, 0x3e, 0x4b, 0x0b, 0xb1, 0x3b, 0x23, 0xeb, 0x4d, 0x57, 0x63, 0x70, 0xec, 0xaa, 0xa1, - 0xac, 0xc6, 0x85, 0x61, 0x59, 0x8d, 0xfb, 0xb3, 0x61, 0x7f, 0xdb, 0x5c, 0x82, 0x23, 0x7c, 0x09, - 0x6e, 0xa7, 0x5c, 0x82, 0x89, 0xf3, 0xe0, 0x44, 0x0b, 0x70, 0xf4, 0x74, 0x16, 0xe0, 0x67, 0xe0, - 0xd9, 0x9d, 0x4e, 0xb3, 0x79, 0x70, 0xab, 0x63, 0x35, 0xed, 0x1d, 0x9b, 0xd6, 0xd9, 0x38, 0xf9, - 0x6d, 0xab, 0x26, 0xcc, 0xdc, 0xa5, 0x85, 0x59, 0xd9, 0xda, 0x67, 0x57, 0x92, 0xd1, 0xb0, 0x57, - 0xfd, 0x74, 0x2b, 0xeb, 0xbd, 0x02, 0x5c, 0x88, 0xf5, 0xa8, 0x52, 0x96, 0xff, 0x72, 0x55, 0x9d, - 0xf2, 0xaa, 0x32, 0x14, 0xef, 0xe2, 0x13, 0x53, 0xbc, 0x47, 0x4e, 0x5d, 0xf1, 0xfe, 0x51, 0x16, - 0x46, 0xd4, 0xe5, 0xd8, 0x3d, 0x18, 0xad, 0x77, 0xa4, 0xa9, 0x44, 0xcc, 0xb5, 0xab, 0x27, 0x6f, - 0xc9, 0xaa, 0x13, 0xfc, 0xd4, 0xc7, 0x6f, 0x7a, 0x62, 0x96, 0x89, 0xd3, 0xe2, 0x92, 0x24, 0x8e, - 0x9a, 0x0d, 0xa9, 0x43, 0x91, 0x1d, 0x5a, 0x5d, 0x4f, 0x6a, 0x3f, 0x9f, 0x4a, 0x21, 0x9a, 0xb8, - 0x65, 0x4a, 0xae, 0x7f, 0x4e, 0x13, 0x25, 0x6d, 0xc6, 0xe5, 0x1d, 0x3b, 0x60, 0x02, 0x27, 0x37, - 0x48, 0x2e, 0xd7, 0x39, 0x4d, 0x94, 0xb4, 0xc9, 0x8b, 0x50, 0xf0, 0x03, 0xda, 0xf6, 0xf9, 0xe4, - 0x2e, 0x2c, 0x4c, 0xc8, 0x9e, 0x2f, 0x54, 0x59, 0x21, 0x0a, 0x58, 0xf9, 0xf7, 0x32, 0x50, 0xd2, - 0xf7, 0x22, 0xe4, 0x26, 0x8c, 0x76, 0x7c, 0xea, 0x69, 0xe3, 0xf6, 0xb1, 0x57, 0x37, 0xef, 0xcf, - 0xdb, 0xb2, 0x2a, 0x6a, 0x22, 0x8c, 0x60, 0xdb, 0xf2, 0xfd, 0xfb, 0xae, 0x57, 0xef, 0x4f, 0x9f, - 0xe4, 0x04, 0x37, 0x65, 0x55, 0xd4, 0x44, 0xca, 0x7f, 0x9a, 0x81, 0x89, 0x05, 0x3b, 0xd8, 0xee, - 0xd4, 0xf6, 0x68, 0xc0, 0xdb, 0xdc, 0x82, 0xc2, 0x36, 0xfb, 0x00, 0xd9, 0xe0, 0xb5, 0x14, 0xf7, - 0x43, 0x8a, 0x6e, 0x78, 0x51, 0xc4, 0x0d, 0x89, 0xfc, 0x27, 0x0a, 0x2e, 0xe4, 0x36, 0x80, 0x6b, - 0x75, 0x82, 0xdd, 0x2d, 0x77, 0x8f, 0x3a, 0xfd, 0x7d, 0xd3, 0x24, 0x9b, 0xf7, 0x37, 0x2b, 0xaa, - 0x32, 0x1a, 0x84, 0xca, 0x7f, 0x90, 0x01, 0xd2, 0xcd, 0xff, 0x29, 0x18, 0x90, 0x7f, 0x37, 0x02, - 0xe7, 0x74, 0xc3, 0x63, 0xc7, 0x93, 0x3a, 0xbf, 0xad, 0xb8, 0xe6, 0xba, 0x7b, 0x37, 0x9d, 0x15, - 0xdb, 0xb1, 0xfd, 0x5d, 0x79, 0xe7, 0xa2, 0x8f, 0x27, 0x4b, 0x5d, 0x18, 0x98, 0x50, 0x8b, 0x7c, - 0xdd, 0x54, 0x1a, 0xb2, 0x5c, 0x28, 0x7d, 0x7e, 0x00, 0xe3, 0x7c, 0x52, 0x75, 0x61, 0xe4, 0x3e, - 0xdd, 0xde, 0x75, 0xdd, 0x3d, 0xb9, 0x7c, 0xaf, 0x9d, 0xbc, 0x29, 0x77, 0x05, 0xa1, 0x45, 0xd7, - 0x09, 0xe8, 0x83, 0x40, 0x5c, 0x80, 0xca, 0x32, 0x54, 0x5c, 0x08, 0x95, 0x17, 0xa0, 0xf9, 0xb4, - 0x32, 0x30, 0xb2, 0x70, 0xba, 0x2e, 0x41, 0xcb, 0x50, 0x14, 0x15, 0xf8, 0x69, 0x5d, 0xda, 0x4f, - 0xc5, 0x91, 0x1b, 0x25, 0x84, 0x7c, 0x18, 0x0a, 0xee, 0x7d, 0x47, 0x9e, 0xa0, 0x4b, 0x0b, 0xcf, - 0xca, 0x6e, 0x9a, 0x5a, 0xa2, 0x6d, 0x8f, 0xd6, 0xac, 0x80, 0xd6, 0x6f, 0x32, 0x30, 0x0a, 0x2c, - 0xf2, 0x57, 0x01, 0x58, 0xeb, 0x68, 0x8d, 0xdf, 0xbd, 0x88, 0x3b, 0x80, 0xe7, 0x65, 0x9d, 0x73, - 0x61, 0x9d, 0x4d, 0x8d, 0x83, 0x06, 0x3e, 0xb9, 0x06, 0x93, 0x1e, 0x6d, 0xbb, 0xbe, 0x1d, 0xb8, - 0xde, 0x41, 0xb5, 0xd9, 0x69, 0xc8, 0x0b, 0x81, 0xcb, 0x92, 0xc2, 0x4c, 0x48, 0x01, 0x23, 0x78, - 0x18, 0xab, 0x47, 0x7e, 0x39, 0x03, 0xe3, 0xba, 0xc8, 0xa6, 0xec, 0xc0, 0x92, 0x4b, 0x77, 0x6d, - 0xae, 0xbb, 0x32, 0xe4, 0x1c, 0x5e, 0x70, 0xa1, 0xc1, 0x0a, 0x23, 0x8c, 0x0d, 0x5d, 0x13, 0x9e, - 0x02, 0x1b, 0xc4, 0xbb, 0x70, 0x36, 0xe1, 0x43, 0xd9, 0xce, 0x22, 0x66, 0x81, 0x30, 0x36, 0xe8, - 0x9d, 0x25, 0x32, 0xf6, 0x6f, 0x74, 0x8d, 0x9e, 0xd0, 0xe6, 0x2e, 0x48, 0xec, 0xc9, 0xc3, 0xc7, - 0xac, 0xfc, 0x9f, 0xc6, 0xe0, 0xa2, 0x66, 0xce, 0x14, 0x52, 0xea, 0x99, 0xe2, 0xc5, 0x58, 0x85, - 0x99, 0x53, 0x59, 0x85, 0xd1, 0xb9, 0x9c, 0x4d, 0x3d, 0x97, 0x73, 0x27, 0x9c, 0xcb, 0x2f, 0xc3, - 0xa8, 0xa4, 0xab, 0xee, 0x5e, 0x84, 0x68, 0x96, 0x65, 0xa8, 0xa1, 0xe4, 0xaf, 0xc7, 0x67, 0xbd, - 0xb0, 0xc2, 0x55, 0x07, 0x30, 0xeb, 0xc5, 0x78, 0xf4, 0x39, 0xf7, 0x43, 0x01, 0x53, 0xec, 0x29, - 0x60, 0xf6, 0xe0, 0x05, 0x7f, 0xcf, 0x6e, 0x2f, 0x78, 0x96, 0x53, 0xdb, 0x45, 0xba, 0xe3, 0x2f, - 0x72, 0x77, 0x84, 0xfa, 0x4d, 0xe7, 0x66, 0x9b, 0x3a, 0x9b, 0xc8, 0x85, 0xc8, 0xe8, 0xc2, 0x87, - 0x24, 0xbb, 0x17, 0xaa, 0x87, 0x21, 0xe3, 0xe1, 0xb4, 0xc8, 0x55, 0x38, 0xe3, 0x3a, 0xc2, 0x6a, - 0xb3, 0x49, 0x3d, 0x01, 0x95, 0xc6, 0x90, 0xe7, 0x24, 0x83, 0x33, 0x37, 0xe3, 0x08, 0xd8, 0x5d, - 0x87, 0x7c, 0x1a, 0xc6, 0xc4, 0x7d, 0xb3, 0xd0, 0x0a, 0x4a, 0xfd, 0x6c, 0xac, 0x53, 0x8f, 0x1e, - 0xce, 0x8e, 0x55, 0xc2, 0xda, 0x68, 0x92, 0x22, 0x6f, 0xc2, 0x84, 0x9c, 0x80, 0xd2, 0x3b, 0x05, - 0xfa, 0xa1, 0x7d, 0xe6, 0xd1, 0xc3, 0xd9, 0x89, 0xbb, 0x66, 0x7d, 0x8c, 0x92, 0x23, 0x77, 0xe0, - 0xc2, 0xb6, 0x1a, 0x54, 0x9f, 0x0f, 0xea, 0x82, 0xe5, 0xd3, 0xdb, 0xb8, 0xc6, 0x3d, 0x8b, 0x4a, - 0x0b, 0x97, 0x64, 0x3f, 0x5c, 0x88, 0x0d, 0xbd, 0xc4, 0xc2, 0x1e, 0xb5, 0x7b, 0xec, 0xfe, 0xe3, - 0x27, 0xda, 0xfd, 0x23, 0x26, 0x83, 0x89, 0xb4, 0x26, 0x83, 0xde, 0x32, 0xe5, 0x44, 0x26, 0x83, - 0xc9, 0xd3, 0x31, 0x19, 0xc8, 0xe3, 0xe6, 0xd4, 0xb0, 0x8e, 0x9b, 0x9f, 0x84, 0x89, 0xda, 0x2e, - 0xad, 0xed, 0x71, 0x7f, 0x9b, 0x7d, 0xab, 0x39, 0x33, 0xcd, 0x87, 0x5f, 0xdb, 0x04, 0x17, 0x4d, - 0x20, 0x46, 0x71, 0xd3, 0xed, 0x31, 0xdf, 0xca, 0xc0, 0x73, 0x3d, 0xe5, 0x0a, 0x79, 0x2d, 0x22, - 0x75, 0x33, 0x51, 0xef, 0xce, 0x1e, 0xb2, 0x36, 0xed, 0xce, 0xf3, 0x87, 0x59, 0x28, 0x2d, 0x74, - 0x7c, 0xe9, 0xec, 0xb3, 0x0d, 0x79, 0xc7, 0x0a, 0xfc, 0xf4, 0xd7, 0xd6, 0x1b, 0x95, 0x2d, 0xd5, - 0xf7, 0x5c, 0xf5, 0x62, 0xbf, 0x91, 0xd3, 0x26, 0xfb, 0x50, 0x7a, 0x87, 0x06, 0x7e, 0xe0, 0x51, - 0xab, 0x25, 0xd5, 0xf2, 0xd5, 0x93, 0x33, 0xba, 0x4e, 0x83, 0x2a, 0x27, 0x65, 0xba, 0xf3, 0xe9, - 0x42, 0x0c, 0x59, 0x91, 0x1a, 0x14, 0xf6, 0xac, 0x9d, 0x3d, 0x4b, 0x2a, 0xb2, 0x0b, 0x29, 0xae, - 0x62, 0x19, 0x99, 0x85, 0x8e, 0x2f, 0x4e, 0x4c, 0xfc, 0x17, 0x0a, 0xda, 0xe5, 0xef, 0x16, 0xe0, - 0xec, 0xa2, 0xd5, 0xa4, 0x4e, 0xdd, 0x8a, 0xec, 0xe0, 0xaf, 0xc2, 0xa8, 0x5f, 0xdb, 0xa5, 0xf5, - 0x4e, 0x53, 0xdd, 0x5a, 0xe8, 0x15, 0x57, 0x95, 0xe5, 0xa8, 0x31, 0xb4, 0x8f, 0x18, 0x9b, 0x9b, - 0xd9, 0x28, 0xb6, 0x9e, 0x96, 0x1a, 0x83, 0xbc, 0x0e, 0x93, 0xd2, 0xf9, 0xc9, 0x75, 0x96, 0xac, - 0x80, 0x0a, 0x07, 0x09, 0xe9, 0x80, 0xb2, 0x1c, 0x81, 0x60, 0x0c, 0x93, 0x71, 0x0a, 0xec, 0x16, - 0x7d, 0xd7, 0x75, 0x94, 0x5d, 0x48, 0x73, 0xda, 0x92, 0xe5, 0xa8, 0x31, 0xc8, 0xd7, 0xba, 0xaf, - 0xb9, 0x3e, 0x77, 0xf2, 0x6e, 0x4c, 0xe8, 0xa7, 0x3e, 0xa4, 0xd2, 0x17, 0x60, 0xac, 0x4d, 0x3d, - 0xdf, 0xf6, 0x03, 0xea, 0xd4, 0xa8, 0xbc, 0xe5, 0xba, 0x9e, 0x52, 0x34, 0x6d, 0x86, 0x14, 0xc5, - 0x5e, 0x65, 0x14, 0xa0, 0xc9, 0xef, 0xd4, 0xed, 0xa8, 0xe9, 0xe4, 0xce, 0x03, 0x38, 0xb7, 0x68, - 0x05, 0xb5, 0xdd, 0x4e, 0x5b, 0x2c, 0x13, 0x65, 0x02, 0x7a, 0x05, 0x46, 0xa8, 0x63, 0x6d, 0x37, - 0x69, 0x3d, 0xee, 0xeb, 0xb8, 0x2c, 0x8a, 0x51, 0xc1, 0xc9, 0x27, 0x60, 0xac, 0x65, 0x3d, 0x50, - 0x66, 0x24, 0x39, 0x2d, 0x75, 0x1c, 0xc0, 0x7a, 0x08, 0x42, 0x13, 0xaf, 0xfc, 0x67, 0x59, 0x28, - 0x2d, 0xba, 0x4e, 0xdd, 0xe6, 0xfc, 0x3e, 0x0a, 0xf9, 0xe0, 0xa0, 0xad, 0x96, 0xc0, 0x0b, 0xea, - 0x32, 0x79, 0xeb, 0xa0, 0x4d, 0x1f, 0x33, 0xc1, 0xab, 0x10, 0xb9, 0xb3, 0x14, 0x47, 0x25, 0x6b, - 0x50, 0xf4, 0x03, 0x2b, 0xe8, 0xf8, 0x92, 0xe5, 0xc7, 0x95, 0xf7, 0x59, 0x95, 0x97, 0x3e, 0x7e, - 0x38, 0x9b, 0x10, 0xb0, 0x31, 0xa7, 0x29, 0x09, 0x2c, 0x94, 0x34, 0xc8, 0x3e, 0x90, 0xa6, 0xe5, - 0x07, 0x5b, 0x9e, 0xe5, 0xf8, 0x82, 0x93, 0xad, 0x3d, 0x17, 0x7e, 0xc2, 0xd0, 0x33, 0x74, 0xe0, - 0x44, 0x38, 0x6c, 0x6c, 0xe6, 0x31, 0xcd, 0x83, 0xd5, 0x08, 0xb7, 0xf5, 0xb5, 0x2e, 0x6a, 0x98, - 0xc0, 0x41, 0xf8, 0xd0, 0x59, 0x7e, 0x92, 0x0f, 0x1d, 0x2b, 0x45, 0x09, 0x65, 0x03, 0xd2, 0x92, - 0x17, 0x55, 0x85, 0xe8, 0x9d, 0xb3, 0xba, 0xa2, 0x52, 0xf0, 0x72, 0x03, 0xce, 0xeb, 0xaf, 0xf4, - 0x91, 0xfa, 0x34, 0x58, 0x38, 0xe0, 0xbc, 0x2e, 0x43, 0xbe, 0xe6, 0xb9, 0x5d, 0x37, 0xf6, 0x8b, - 0x9e, 0xeb, 0x20, 0x87, 0x44, 0x56, 0x7d, 0xf6, 0xa8, 0x55, 0x5f, 0xfe, 0x66, 0x06, 0x9e, 0x8d, - 0x71, 0x5a, 0xf4, 0xec, 0x80, 0x7a, 0xb6, 0x45, 0x7c, 0x28, 0x6e, 0x73, 0xae, 0x72, 0xcb, 0xb8, - 0x99, 0x42, 0x1c, 0x24, 0x7d, 0x8c, 0x58, 0x0a, 0xe2, 0x7f, 0x94, 0xac, 0xca, 0x5f, 0x84, 0x73, - 0xda, 0xd7, 0xc7, 0x58, 0xa0, 0xc7, 0x70, 0x55, 0x5d, 0x82, 0xe9, 0x9a, 0x47, 0xad, 0x80, 0xae, - 0xee, 0x6c, 0xb8, 0xc1, 0xf2, 0x03, 0xdb, 0x0f, 0xa4, 0xcf, 0xaa, 0x36, 0x87, 0x2f, 0xc6, 0xe0, - 0xd8, 0x55, 0xa3, 0xfc, 0x07, 0x59, 0x38, 0xc3, 0xce, 0x4f, 0x16, 0x9b, 0x21, 0x5b, 0xb4, 0xd5, - 0x6e, 0x5a, 0x01, 0x25, 0x9f, 0x81, 0x92, 0x72, 0xc4, 0x51, 0x1b, 0x68, 0xa2, 0x9b, 0x92, 0xf6, - 0xdb, 0xa1, 0xf7, 0x3a, 0xb6, 0x47, 0xb9, 0x6b, 0x69, 0x68, 0xc5, 0x57, 0x50, 0x1f, 0x43, 0x6a, - 0x64, 0x1b, 0xa6, 0xec, 0x96, 0xd5, 0xa0, 0x9b, 0x9d, 0x66, 0x73, 0xd3, 0x6d, 0xda, 0x35, 0x75, - 0x26, 0xbb, 0xa2, 0x6c, 0x12, 0xab, 0x51, 0xf0, 0xe3, 0x87, 0xb3, 0x2f, 0x24, 0xac, 0x8a, 0x10, - 0x01, 0xe3, 0x04, 0x19, 0x0f, 0x9f, 0xd6, 0x3a, 0x9e, 0x1d, 0x1c, 0xc8, 0xb3, 0xa1, 0x5c, 0x16, - 0x2f, 0xf6, 0x50, 0xbf, 0x4d, 0x54, 0xe9, 0x51, 0x11, 0x2d, 0xc4, 0x38, 0xc1, 0xf2, 0x3f, 0x2a, - 0xc0, 0xc4, 0x62, 0xc7, 0x0f, 0xdc, 0x96, 0xba, 0x6a, 0x99, 0x87, 0x92, 0xd0, 0xa5, 0x99, 0x16, - 0x9e, 0x89, 0x5e, 0x68, 0x54, 0x15, 0x00, 0x43, 0x1c, 0xb6, 0x90, 0x38, 0x55, 0xe5, 0x6b, 0xac, - 0x17, 0x12, 0x67, 0x4e, 0x51, 0x42, 0xc9, 0x6d, 0x80, 0x1a, 0xf5, 0x02, 0x79, 0x90, 0xc8, 0xf5, - 0x6d, 0xba, 0x5c, 0xd4, 0x95, 0xd1, 0x20, 0xc4, 0xfd, 0x10, 0x78, 0x5b, 0xd8, 0xa4, 0xba, 0xb9, - 0x4f, 0x3d, 0xcf, 0xae, 0xab, 0x9d, 0x33, 0xf4, 0x43, 0xe8, 0xc2, 0xc0, 0x84, 0x5a, 0xc4, 0x87, - 0xbc, 0xdf, 0xa6, 0x35, 0xb9, 0x91, 0xde, 0x4a, 0xb1, 0x72, 0xcc, 0x2e, 0x9d, 0xab, 0xb6, 0x69, - 0x4d, 0x6c, 0x9f, 0x7a, 0x05, 0xb0, 0x22, 0xe4, 0xcc, 0x9e, 0xb8, 0xb7, 0xac, 0x71, 0xd5, 0x33, - 0x72, 0x7a, 0x57, 0x3d, 0x17, 0x7f, 0x1a, 0x4a, 0xba, 0x5f, 0xfa, 0xda, 0x39, 0x7f, 0x94, 0x01, - 0x58, 0xb2, 0x02, 0x4b, 0xec, 0xc6, 0x4c, 0xc4, 0xb4, 0xad, 0x60, 0x37, 0x2e, 0x62, 0x36, 0xad, - 0x60, 0x17, 0x39, 0x84, 0xbc, 0x2a, 0xb7, 0xb8, 0x6c, 0xe4, 0x96, 0x4d, 0x6d, 0x71, 0xfc, 0x96, - 0xd8, 0xd8, 0xdd, 0xb4, 0x2f, 0xaf, 0x50, 0xd9, 0xba, 0x7c, 0x79, 0xc9, 0xa7, 0x00, 0x6a, 0x6e, - 0x8b, 0x75, 0x60, 0xe0, 0x7a, 0x72, 0xa2, 0x29, 0x3b, 0x0a, 0x2c, 0x6a, 0xc8, 0xe3, 0xc8, 0x2f, - 0x34, 0xea, 0x70, 0x61, 0x2f, 0x65, 0x94, 0xdc, 0x53, 0x42, 0x61, 0x2f, 0xcb, 0x51, 0x63, 0x94, - 0xff, 0x22, 0x07, 0xe3, 0xcb, 0x2d, 0xcb, 0x6e, 0xaa, 0x15, 0x1a, 0x9d, 0x30, 0x99, 0x53, 0x9f, - 0x30, 0xaf, 0x1a, 0xb7, 0x02, 0xb1, 0xbd, 0x2a, 0xc1, 0xe4, 0xff, 0x39, 0x18, 0xf7, 0x5b, 0x41, - 0x5b, 0xd9, 0xee, 0xfb, 0x5b, 0xf8, 0x3c, 0x18, 0xa9, 0xba, 0xbe, 0xb5, 0xa9, 0x4d, 0xff, 0x11, - 0x62, 0x6c, 0xf0, 0x77, 0x5d, 0x3f, 0x90, 0xa3, 0xa0, 0x07, 0xff, 0x9a, 0xeb, 0x07, 0xc8, 0x21, - 0x7c, 0x7a, 0xb8, 0x9e, 0x08, 0x3c, 0x28, 0x18, 0xd3, 0xc3, 0xf5, 0x02, 0xe4, 0x10, 0x72, 0x01, - 0xb2, 0x81, 0x2b, 0x6d, 0x42, 0xdc, 0xa1, 0x77, 0xcb, 0xc5, 0x6c, 0xe0, 0x72, 0x37, 0x3b, 0xcf, - 0x6d, 0x49, 0xbb, 0x71, 0xe8, 0x66, 0xe7, 0xb9, 0x2d, 0xe4, 0x10, 0xa6, 0x1a, 0xf8, 0x9d, 0x6d, - 0x76, 0xee, 0x8b, 0xfb, 0x8a, 0x57, 0x45, 0x31, 0x2a, 0x38, 0x23, 0xb6, 0xed, 0xd6, 0x0f, 0xe4, - 0x05, 0xbb, 0x26, 0xc6, 0xbd, 0x13, 0x38, 0xa4, 0xfc, 0x37, 0x46, 0x80, 0x2c, 0xb7, 0xf8, 0xdd, - 0x99, 0x79, 0x4c, 0x79, 0x09, 0x8a, 0xdb, 0x9e, 0xbb, 0xa7, 0xad, 0x9d, 0x5a, 0xba, 0x2e, 0xf0, - 0x52, 0x94, 0x50, 0x76, 0x52, 0xad, 0xed, 0x5a, 0x8e, 0x43, 0x9b, 0xa1, 0x7d, 0x50, 0x0f, 0xe4, - 0xa2, 0x86, 0xa0, 0x81, 0xc5, 0x03, 0x49, 0xc5, 0x2f, 0xe3, 0xf6, 0x3a, 0x0c, 0x24, 0x0d, 0x41, - 0x68, 0xe2, 0x45, 0x6e, 0x85, 0xf2, 0x83, 0xbe, 0x15, 0x2a, 0x0c, 0xe0, 0x56, 0xa8, 0x47, 0x80, - 0x65, 0xf1, 0xc9, 0x06, 0x58, 0x8e, 0x1c, 0x37, 0xc0, 0x72, 0x74, 0x58, 0x56, 0x96, 0xaf, 0x9a, - 0x87, 0x45, 0x71, 0x07, 0xf1, 0xd9, 0x14, 0x87, 0xa4, 0xae, 0xc9, 0x7a, 0x22, 0x0b, 0xd6, 0xd3, - 0x70, 0x11, 0xf1, 0x1b, 0x19, 0x28, 0x70, 0x36, 0xa4, 0xc5, 0x23, 0x10, 0xb9, 0x2e, 0x96, 0x49, - 0xeb, 0xc4, 0xcf, 0x29, 0x46, 0xac, 0xfe, 0x4a, 0x4d, 0x53, 0x3c, 0xc8, 0xf3, 0x90, 0x97, 0x97, - 0x8e, 0x99, 0x97, 0xc7, 0x85, 0xdd, 0x86, 0x6d, 0x7d, 0xc8, 0x4b, 0x5f, 0x1f, 0xfd, 0xde, 0xdf, - 0x9e, 0x7d, 0xe6, 0xbd, 0xff, 0x70, 0xf9, 0x99, 0xf2, 0xf7, 0xb3, 0x30, 0xca, 0xc9, 0x2d, 0x74, - 0x7c, 0xf2, 0xb6, 0x31, 0xca, 0xa2, 0x91, 0x1f, 0x39, 0xde, 0x39, 0xea, 0x26, 0x97, 0x55, 0xac, - 0x9b, 0x42, 0xd1, 0x11, 0x96, 0x19, 0xa3, 0xb7, 0x2b, 0xf5, 0xa4, 0xec, 0x40, 0xba, 0x60, 0xa1, - 0xe3, 0x33, 0x4d, 0x20, 0x51, 0x39, 0x6a, 0xeb, 0xb3, 0x66, 0xea, 0xcb, 0x4e, 0xcd, 0x8b, 0xd3, - 0x33, 0xd4, 0xd4, 0xc8, 0x79, 0xb4, 0xfc, 0xa7, 0x19, 0x18, 0x57, 0xa8, 0x6b, 0xb6, 0x1f, 0x90, - 0xcf, 0x77, 0x75, 0xe7, 0xdc, 0xf1, 0xba, 0x93, 0xd5, 0xe6, 0x9d, 0xa9, 0x17, 0x82, 0x2a, 0x31, - 0xba, 0xb2, 0x01, 0x05, 0x3b, 0xa0, 0x2d, 0x5f, 0xde, 0x2b, 0x2f, 0xa4, 0xff, 0xbe, 0xf0, 0x42, - 0x6c, 0x95, 0x11, 0x46, 0x41, 0xbf, 0xfc, 0x27, 0xb9, 0xf0, 0xbb, 0x58, 0x07, 0x93, 0xb7, 0x22, - 0x96, 0xc5, 0x4a, 0x3a, 0xcb, 0x22, 0xe3, 0x1b, 0x37, 0x2b, 0xfa, 0xdd, 0x66, 0xc5, 0x95, 0x01, - 0x98, 0x15, 0xf9, 0x27, 0x3e, 0x51, 0x9b, 0x22, 0x13, 0xa4, 0x53, 0x9a, 0xe5, 0xf2, 0x03, 0x37, - 0xb0, 0x6b, 0x72, 0x27, 0x1c, 0xa0, 0xdd, 0x94, 0x1f, 0xe0, 0x74, 0xa1, 0xe0, 0x82, 0x71, 0xb6, - 0xe5, 0xff, 0x92, 0x81, 0xc9, 0xe8, 0xcc, 0x26, 0xbb, 0x7a, 0xcd, 0x64, 0xd2, 0xfa, 0xf7, 0x1c, - 0xbe, 0x56, 0xc8, 0x1e, 0x14, 0x45, 0xf4, 0x8e, 0x1c, 0xde, 0x34, 0xd1, 0xd1, 0xca, 0xe2, 0x1d, - 0x32, 0x13, 0xbf, 0x51, 0xb2, 0x28, 0xff, 0xcf, 0xac, 0x9c, 0xc0, 0x52, 0x4a, 0x92, 0x8b, 0x90, - 0xb5, 0xeb, 0x52, 0x2d, 0x02, 0x59, 0x29, 0xbb, 0xba, 0x84, 0x59, 0xbb, 0xce, 0x0f, 0xa5, 0x22, - 0xcc, 0x27, 0x1b, 0x55, 0x9b, 0x62, 0x01, 0x71, 0x9f, 0x80, 0x31, 0x26, 0x67, 0xf6, 0xa9, 0xe7, - 0xdb, 0xae, 0x13, 0x57, 0x81, 0xd8, 0x3a, 0xb9, 0x23, 0x40, 0x68, 0xe2, 0x31, 0x75, 0x8e, 0x1f, - 0x29, 0x62, 0x7a, 0xa7, 0x71, 0x8c, 0xa8, 0xc0, 0x14, 0x5b, 0xdf, 0x5c, 0x90, 0x3b, 0x01, 0x47, - 0x2e, 0xc4, 0x9c, 0x16, 0xac, 0xc0, 0x5a, 0x14, 0x60, 0x5e, 0x2f, 0x8e, 0x6f, 0xaa, 0x97, 0xc5, - 0x23, 0xd4, 0xcb, 0x35, 0xc8, 0x07, 0x76, 0x4b, 0xc5, 0x34, 0xf5, 0x63, 0x36, 0x0b, 0xdb, 0x6e, - 0xb7, 0x58, 0xdb, 0xed, 0x16, 0x35, 0xf6, 0x95, 0x6f, 0xe6, 0x61, 0x8a, 0xf7, 0xf9, 0x12, 0x6d, - 0x53, 0xa7, 0x4e, 0x9d, 0xda, 0xc1, 0x31, 0x6c, 0x3a, 0x15, 0x98, 0xa2, 0xe1, 0xa6, 0x6c, 0xb8, - 0x52, 0xea, 0x6f, 0x5f, 0x8e, 0x82, 0x31, 0x8e, 0xcf, 0x43, 0x8c, 0x59, 0x51, 0x92, 0x5b, 0xe5, - 0xb2, 0x02, 0x60, 0x88, 0x43, 0xf6, 0x61, 0x44, 0xec, 0xf4, 0xbe, 0x5c, 0x89, 0x37, 0x53, 0x4a, - 0xd2, 0xf0, 0x8b, 0xa5, 0x56, 0xc1, 0x77, 0x68, 0xf1, 0xbf, 0x8f, 0x8a, 0x19, 0xf9, 0xc5, 0x0c, - 0x94, 0x02, 0xcf, 0x72, 0xfc, 0x1d, 0xd7, 0x6b, 0x49, 0xed, 0x75, 0x6b, 0x60, 0xac, 0xb7, 0x14, - 0x65, 0x2a, 0xe3, 0xe6, 0x74, 0x01, 0x86, 0x5c, 0x89, 0x0d, 0x17, 0x64, 0x73, 0xd6, 0xdc, 0x86, - 0x5d, 0xb3, 0x9a, 0x22, 0x62, 0xd3, 0x55, 0x7e, 0x32, 0x1f, 0x55, 0xb7, 0xa8, 0x2b, 0x89, 0x58, - 0x8f, 0x1f, 0xce, 0x4e, 0xc5, 0x8a, 0xb0, 0x07, 0xc1, 0xf2, 0xef, 0x16, 0xe0, 0x7c, 0x62, 0xf7, - 0x90, 0x6d, 0x39, 0x05, 0x53, 0x5f, 0x54, 0xb1, 0x89, 0x28, 0xbb, 0x7c, 0x34, 0x3a, 0x31, 0x4d, - 0xed, 0x2b, 0x7b, 0x0a, 0xda, 0xd7, 0x8e, 0xd4, 0xbe, 0x44, 0x74, 0x6b, 0x8a, 0x4f, 0x0a, 0xcd, - 0x15, 0xe1, 0x7a, 0x09, 0xf5, 0x38, 0x62, 0x43, 0x81, 0x3e, 0x68, 0x7b, 0xc2, 0xa1, 0x22, 0x15, - 0xa3, 0xe5, 0x07, 0x6d, 0x4f, 0x32, 0xd2, 0x5a, 0x00, 0x2b, 0xf3, 0x51, 0x70, 0x20, 0x6f, 0xc3, - 0x59, 0xc6, 0x32, 0x3e, 0x4f, 0x84, 0x68, 0x9a, 0x93, 0x55, 0xce, 0x2e, 0x75, 0xa3, 0x24, 0x4d, - 0x92, 0x24, 0x52, 0x8c, 0x03, 0x63, 0x95, 0x3c, 0x13, 0x35, 0x87, 0xe5, 0x6e, 0x94, 0x44, 0x0e, - 0x09, 0xa4, 0xb8, 0x6c, 0xe7, 0xce, 0xd0, 0xf2, 0x68, 0x1e, 0xca, 0x76, 0x5e, 0x8a, 0x12, 0x5a, - 0x7e, 0x1b, 0x2e, 0xf6, 0x5e, 0x4e, 0x6c, 0xf7, 0x78, 0xe7, 0x5e, 0x7c, 0xf7, 0xb8, 0x7e, 0x0b, - 0xb3, 0xef, 0xdc, 0x33, 0x38, 0x64, 0x0f, 0xe5, 0xf0, 0x7e, 0x16, 0xa6, 0xe3, 0xb7, 0x54, 0xa4, - 0x03, 0x23, 0x35, 0x71, 0xb3, 0x23, 0xd7, 0xc2, 0x46, 0x9a, 0x0b, 0xb9, 0xee, 0x2b, 0x22, 0x39, - 0x59, 0x05, 0x04, 0x15, 0x2f, 0xf2, 0xd7, 0x54, 0x4c, 0xee, 0xba, 0xd5, 0x96, 0xab, 0x63, 0x23, - 0x95, 0xe9, 0xbf, 0xcb, 0x9a, 0x6f, 0x46, 0xee, 0xae, 0x87, 0x91, 0xbb, 0xeb, 0x56, 0xbb, 0xfc, - 0xc7, 0x59, 0x18, 0x33, 0xad, 0x16, 0xc3, 0x3f, 0x82, 0xec, 0x45, 0x8e, 0x20, 0xab, 0x03, 0x39, - 0x3e, 0xf6, 0x3c, 0x85, 0xf8, 0xb1, 0x53, 0xc8, 0x60, 0x4e, 0xab, 0x47, 0x1c, 0x44, 0xae, 0xc2, - 0x99, 0xae, 0xa3, 0x2d, 0x79, 0x0d, 0x80, 0x2d, 0x09, 0xea, 0xfb, 0xb6, 0xbe, 0x4f, 0xd2, 0x1d, - 0xb5, 0xac, 0x21, 0x68, 0x60, 0x95, 0xff, 0x7d, 0x06, 0xcc, 0x0d, 0xf7, 0x14, 0x0e, 0x35, 0xef, - 0x44, 0x0f, 0x35, 0xcb, 0x03, 0xe9, 0xae, 0x1e, 0xe7, 0x9a, 0x5f, 0x59, 0x8a, 0x7c, 0x1d, 0x3f, - 0xda, 0x5c, 0x81, 0x71, 0x2a, 0x75, 0xe2, 0xa4, 0x0c, 0x20, 0xcb, 0x06, 0x0c, 0x23, 0x98, 0xa4, - 0x69, 0x98, 0x66, 0xb3, 0x69, 0x4f, 0x10, 0xca, 0x98, 0x2b, 0xec, 0x54, 0xdd, 0xa6, 0x5d, 0xb2, - 0x0b, 0x23, 0xbe, 0x88, 0x75, 0x91, 0x13, 0x2b, 0xc5, 0x29, 0x4c, 0x05, 0xcd, 0x70, 0xe9, 0x20, - 0x7f, 0xa0, 0x22, 0x4f, 0x0e, 0xa0, 0xd0, 0xb2, 0x1d, 0xdb, 0x95, 0x5b, 0xcc, 0xd6, 0xc0, 0xd6, - 0xcb, 0xdc, 0x3a, 0x23, 0x2b, 0x0c, 0x3e, 0x7a, 0x80, 0x78, 0x19, 0x0a, 0x8e, 0x3c, 0xad, 0x57, - 0x4d, 0x3a, 0x16, 0xc8, 0x9b, 0x95, 0xbb, 0x83, 0x63, 0xaf, 0x5d, 0x16, 0xa2, 0x26, 0x27, 0x55, - 0x8c, 0x9a, 0x35, 0xe9, 0xc8, 0xe4, 0x0b, 0xc5, 0xb4, 0x6e, 0x88, 0xf1, 0x26, 0xac, 0xd8, 0x4d, - 0x1a, 0xbb, 0xde, 0x31, 0xb2, 0x31, 0xb0, 0xcf, 0x37, 0x72, 0x0e, 0x0c, 0xf8, 0xf3, 0xd5, 0xe5, - 0x64, 0xec, 0xf3, 0xbb, 0x33, 0x11, 0x30, 0x45, 0x55, 0xbb, 0xac, 0x8a, 0xe4, 0x6a, 0x77, 0x06, - 0xd7, 0x0c, 0xe9, 0xe4, 0x27, 0x5a, 0xa1, 0x8f, 0x29, 0x5d, 0x4e, 0xac, 0x1d, 0xc8, 0x5b, 0xad, - 0x7b, 0x6d, 0x69, 0x7b, 0x1c, 0xe0, 0x10, 0x54, 0x5a, 0xf7, 0xda, 0xb1, 0x21, 0xa8, 0xac, 0xdf, - 0xda, 0x44, 0xce, 0x8e, 0x4d, 0x7e, 0x61, 0x13, 0x80, 0x41, 0x4f, 0x7e, 0x6e, 0x15, 0x88, 0x4d, - 0xfe, 0x88, 0xa5, 0xa0, 0x03, 0xf9, 0xd6, 0xbd, 0x20, 0x98, 0x19, 0x1b, 0xf4, 0x17, 0xaf, 0xdf, - 0x0b, 0x82, 0xd8, 0x17, 0xaf, 0xdf, 0xda, 0xda, 0x42, 0xce, 0x8e, 0xb1, 0xe5, 0xb6, 0x9d, 0xf1, - 0x41, 0xb3, 0xdd, 0xb0, 0x02, 0x3f, 0xc6, 0xd6, 0xb0, 0xf8, 0xdc, 0x83, 0x9c, 0xef, 0xf8, 0xd2, - 0x49, 0x12, 0x07, 0xc7, 0xb5, 0xea, 0x48, 0xa6, 0x3a, 0xa6, 0xba, 0xba, 0x51, 0x45, 0xc6, 0x8b, - 0xb3, 0xbc, 0xe7, 0xcf, 0x4c, 0x0e, 0x9c, 0xe5, 0xbd, 0x2e, 0x96, 0xb7, 0x18, 0xcb, 0x7b, 0x3e, - 0xf9, 0x02, 0x14, 0xdb, 0x9d, 0xed, 0x6a, 0x67, 0x7b, 0x66, 0x8a, 0x73, 0xbd, 0x3d, 0x38, 0xae, - 0x9b, 0x9c, 0xae, 0x60, 0xac, 0xf5, 0x02, 0x51, 0x88, 0x92, 0x29, 0x63, 0x2f, 0xf8, 0xcd, 0x4c, - 0x0f, 0x9a, 0xfd, 0x55, 0x4e, 0x28, 0xc6, 0x5e, 0x14, 0xa2, 0x64, 0x2a, 0xd9, 0x37, 0xad, 0xed, - 0x99, 0x33, 0x43, 0x60, 0xdf, 0xb4, 0x12, 0xd8, 0x37, 0x2d, 0xc1, 0xbe, 0x69, 0x6d, 0xb3, 0x99, - 0xbd, 0x5b, 0xdf, 0xf1, 0x67, 0xc8, 0xa0, 0x67, 0xf6, 0xb5, 0xfa, 0x4e, 0x7c, 0x66, 0x5f, 0x5b, - 0x5a, 0xa9, 0x22, 0x67, 0xc7, 0x44, 0x88, 0xdf, 0xb4, 0x6a, 0x7b, 0x33, 0x67, 0x07, 0x2d, 0x42, - 0xaa, 0x8c, 0x6c, 0x4c, 0x84, 0xf0, 0x32, 0x14, 0x1c, 0xc9, 0xaf, 0x66, 0x60, 0x4c, 0xe6, 0x4c, - 0xb8, 0xea, 0xd9, 0xf5, 0x99, 0x73, 0xa9, 0x2f, 0x6e, 0xe2, 0x2d, 0x08, 0x89, 0x8b, 0x76, 0x84, - 0xf6, 0xaf, 0x10, 0x82, 0x66, 0x1b, 0xc8, 0xdf, 0xca, 0xc0, 0xa4, 0x15, 0xc9, 0x89, 0x31, 0x73, - 0x9e, 0x37, 0xeb, 0xe7, 0x07, 0x28, 0xd3, 0xa3, 0x39, 0x37, 0x78, 0xcb, 0xb4, 0x0f, 0x6d, 0x14, - 0x88, 0xb1, 0xc6, 0xb0, 0x49, 0xea, 0x07, 0x9e, 0xdd, 0xa6, 0x33, 0x17, 0x06, 0x3d, 0x49, 0xab, - 0x9c, 0x6e, 0x6c, 0x92, 0x8a, 0x42, 0x94, 0x4c, 0xf9, 0x5e, 0x4b, 0xc5, 0xf5, 0xd8, 0xcc, 0xb3, - 0x83, 0xde, 0x6b, 0xd5, 0xbd, 0x5b, 0x74, 0xaf, 0x95, 0xa5, 0xa8, 0xf8, 0xb2, 0x19, 0xeb, 0xd1, - 0xba, 0xed, 0xcf, 0xcc, 0x0c, 0x7a, 0xc6, 0x22, 0x23, 0x1b, 0x9b, 0xb1, 0xbc, 0x0c, 0x05, 0x47, - 0x26, 0x93, 0x1d, 0xff, 0xde, 0xcc, 0x73, 0x83, 0x96, 0xc9, 0x1b, 0xfe, 0xbd, 0x98, 0x4c, 0xde, - 0xa8, 0xde, 0x42, 0xc6, 0x4b, 0xc8, 0xe4, 0xa6, 0x6f, 0x79, 0x33, 0x17, 0x07, 0x2f, 0x93, 0x19, - 0xdd, 0x2e, 0x99, 0xcc, 0x0a, 0x51, 0x32, 0xe5, 0x03, 0xce, 0x93, 0x37, 0xdb, 0xb5, 0x99, 0x1f, - 0x1b, 0xf4, 0x80, 0x5f, 0x15, 0x84, 0x63, 0x03, 0x2e, 0x4b, 0x51, 0xf1, 0x25, 0x2f, 0x33, 0x3d, - 0xb3, 0xdd, 0xb4, 0x6b, 0x96, 0x3f, 0xf3, 0xbc, 0xf0, 0x76, 0x10, 0xaa, 0xa0, 0x28, 0x43, 0x0d, - 0x25, 0xbf, 0x99, 0x81, 0xa9, 0x58, 0xe0, 0xc4, 0xcc, 0x0b, 0xbc, 0xd5, 0x6f, 0x0e, 0xae, 0xd5, - 0x0b, 0x51, 0x06, 0xa2, 0xf5, 0xda, 0x00, 0x1c, 0x77, 0xb9, 0x8f, 0xb7, 0x87, 0x7c, 0x2d, 0x03, - 0x25, 0x5d, 0x36, 0x73, 0x89, 0xb7, 0xee, 0xd3, 0x43, 0x68, 0x9d, 0x68, 0x97, 0xb6, 0x2d, 0x87, - 0xf1, 0x66, 0x21, 0x77, 0x2e, 0x81, 0xf9, 0xcc, 0x16, 0x57, 0x31, 0x33, 0xb3, 0x83, 0x96, 0xc0, - 0x18, 0x12, 0x8f, 0x49, 0x60, 0x03, 0x82, 0x66, 0x1b, 0xf8, 0x18, 0x5a, 0xd1, 0x64, 0x09, 0x33, - 0x97, 0x07, 0x3d, 0x86, 0xf1, 0xfc, 0x16, 0xd1, 0x31, 0x8c, 0x41, 0x31, 0xde, 0x1e, 0xf2, 0xbb, - 0x19, 0x38, 0x63, 0xc5, 0xb3, 0xd4, 0xcc, 0xfc, 0x38, 0x6f, 0xe5, 0xdb, 0x03, 0x6e, 0x65, 0x24, - 0x11, 0x0e, 0x6f, 0xa7, 0x8e, 0xa1, 0xea, 0x82, 0x63, 0x77, 0xab, 0x98, 0x5e, 0xe1, 0xef, 0x04, - 0xed, 0x99, 0xf2, 0xa0, 0xf5, 0x8a, 0xea, 0x4e, 0x10, 0x3f, 0x9a, 0x54, 0x57, 0xb6, 0x36, 0x91, - 0xb3, 0xe3, 0xda, 0x14, 0xf5, 0x3c, 0x3b, 0x98, 0x79, 0x71, 0xe0, 0xda, 0x14, 0xa7, 0x1b, 0xd7, - 0xa6, 0x78, 0x21, 0x4a, 0xa6, 0x17, 0xbf, 0x08, 0x10, 0x9e, 0xdf, 0x13, 0x5c, 0x22, 0x3e, 0x6b, - 0xba, 0x44, 0x0c, 0x28, 0x6b, 0xa2, 0xe1, 0x58, 0x71, 0xf1, 0xeb, 0x19, 0x98, 0x88, 0x9c, 0xe0, - 0x13, 0xda, 0x50, 0x8b, 0xb6, 0x61, 0x7d, 0xa0, 0xe1, 0x0d, 0x66, 0x63, 0x7e, 0x29, 0x03, 0x25, - 0x7d, 0x96, 0x4f, 0x68, 0xc8, 0x5b, 0xd1, 0x86, 0xac, 0xa6, 0x4b, 0xdf, 0xd8, 0xa3, 0x11, 0xac, - 0x47, 0x22, 0x87, 0xfa, 0xa1, 0xf6, 0x88, 0xe6, 0x94, 0xdc, 0x98, 0xaf, 0x66, 0x60, 0xdc, 0x3c, - 0xda, 0x27, 0xb4, 0x65, 0x3b, 0xda, 0x96, 0xb5, 0xd4, 0x61, 0xb0, 0x87, 0x0c, 0x8e, 0x3e, 0xe5, - 0x0f, 0x75, 0x70, 0x62, 0x89, 0xe3, 0xcd, 0x46, 0x7c, 0x39, 0x03, 0x10, 0x1e, 0xf9, 0x13, 0x5a, - 0xf1, 0x76, 0xb4, 0x15, 0xd7, 0x53, 0x7a, 0x1f, 0x1c, 0xd2, 0x17, 0xfa, 0xfc, 0x3f, 0xd4, 0xbe, - 0x58, 0xbf, 0xb5, 0xb5, 0xd5, 0xa3, 0x11, 0x5f, 0xca, 0x40, 0x49, 0x5b, 0x03, 0x86, 0xda, 0x15, - 0x1b, 0x95, 0xad, 0xaa, 0x50, 0xed, 0xbb, 0x5b, 0xf1, 0x5e, 0x06, 0x46, 0x95, 0x75, 0x20, 0xa1, - 0x11, 0x6f, 0x46, 0x1b, 0x91, 0xc2, 0x7b, 0xa8, 0xba, 0x51, 0xed, 0xd1, 0x11, 0xbc, 0x09, 0xf7, - 0x4e, 0xa3, 0x09, 0xb7, 0x7a, 0x35, 0xe1, 0xfd, 0x0c, 0x8c, 0x19, 0xa6, 0x83, 0x84, 0x56, 0x58, - 0xd1, 0x56, 0xa4, 0xb8, 0xc0, 0x90, 0x7c, 0x7a, 0x37, 0xc4, 0x30, 0x22, 0x0c, 0xb5, 0x21, 0x92, - 0xcf, 0xa1, 0x0d, 0x51, 0xe6, 0x84, 0x61, 0x37, 0x84, 0xf1, 0xe9, 0xbd, 0x56, 0xb5, 0x69, 0x61, - 0xa8, 0x6b, 0xf5, 0xda, 0xd2, 0x4a, 0xf5, 0x10, 0xb9, 0x15, 0xda, 0x19, 0x86, 0xba, 0x58, 0x05, - 0x9b, 0xe4, 0x66, 0x7c, 0x3b, 0x03, 0xd3, 0x71, 0x63, 0x43, 0x42, 0x63, 0x76, 0xa2, 0x8d, 0xd9, - 0x4c, 0xe3, 0xbe, 0x14, 0x32, 0x4b, 0x6e, 0xd2, 0xaf, 0x65, 0xe0, 0x6c, 0x82, 0xa1, 0x21, 0xa1, - 0x55, 0x76, 0xb4, 0x55, 0xd5, 0x21, 0x24, 0x13, 0x8d, 0x4f, 0x60, 0xc3, 0xd4, 0x30, 0xd4, 0x09, - 0x2c, 0xf9, 0xf4, 0xd6, 0x01, 0x4c, 0x93, 0xc3, 0x50, 0x75, 0x80, 0x6e, 0x9f, 0xe2, 0xf8, 0x34, - 0x0e, 0x8d, 0x0f, 0x43, 0x9d, 0xc6, 0x82, 0x4d, 0x6f, 0x81, 0xaf, 0x4c, 0x11, 0x43, 0x15, 0xf8, - 0x1b, 0xd5, 0x5b, 0x87, 0x0a, 0x7c, 0x6d, 0x97, 0x18, 0xb2, 0xc0, 0xe7, 0x7c, 0x7a, 0xcf, 0x0e, - 0xd3, 0x3e, 0x31, 0xd4, 0xd9, 0xa1, 0x18, 0x25, 0x37, 0xe5, 0x7b, 0x19, 0x23, 0x15, 0x94, 0x61, - 0x74, 0x48, 0x68, 0xd2, 0x3b, 0xd1, 0x26, 0x6d, 0x0d, 0x23, 0x9d, 0x83, 0xd9, 0xb4, 0x6f, 0x64, - 0x60, 0x32, 0x6a, 0x71, 0x48, 0x68, 0x54, 0x3d, 0xda, 0xa8, 0x8d, 0xc1, 0x66, 0x98, 0x8a, 0xcb, - 0xe1, 0xb8, 0xc9, 0x61, 0xa8, 0x72, 0xd8, 0x64, 0xd6, 0x7b, 0xf0, 0x92, 0xac, 0x0d, 0x43, 0x1d, - 0xbc, 0xde, 0xe9, 0x3b, 0xcd, 0xa6, 0xfd, 0x7a, 0x46, 0xa6, 0xa5, 0xec, 0x32, 0x31, 0x24, 0x34, - 0xae, 0x19, 0x6d, 0xdc, 0x9d, 0xe1, 0xa4, 0xf7, 0x8d, 0x2b, 0x18, 0xda, 0xc6, 0x30, 0x54, 0x05, - 0xa3, 0xba, 0xb2, 0xb5, 0x79, 0x98, 0xba, 0x15, 0xda, 0x1b, 0x86, 0xab, 0x6e, 0x09, 0x3e, 0x89, - 0x0d, 0x29, 0x7f, 0x21, 0xe2, 0x34, 0x73, 0xda, 0x0e, 0xd1, 0xe5, 0xdf, 0xc8, 0x00, 0x84, 0x3e, - 0x78, 0xe4, 0x32, 0xe4, 0xe9, 0x83, 0xb6, 0x17, 0x77, 0x95, 0x65, 0x18, 0xc8, 0x21, 0xc4, 0x81, - 0xe2, 0x8e, 0x4d, 0x9b, 0x75, 0xe5, 0x2a, 0x93, 0xc2, 0xa1, 0x51, 0x46, 0x58, 0xae, 0x30, 0x72, - 0x61, 0x03, 0xf9, 0x4f, 0x1f, 0x25, 0x97, 0xf2, 0x47, 0x60, 0xdc, 0x7c, 0x3b, 0xe2, 0xe8, 0xe8, - 0xc9, 0xf2, 0x3f, 0xce, 0xc3, 0x54, 0xcc, 0x5e, 0xa1, 0xbd, 0x73, 0xb7, 0xc2, 0xcc, 0x01, 0x51, - 0xef, 0x5c, 0xee, 0xd0, 0x1c, 0xe2, 0x90, 0x6f, 0x64, 0x60, 0xea, 0xbe, 0x15, 0xd4, 0x76, 0x19, - 0xe1, 0x45, 0xd3, 0x65, 0x3c, 0xc5, 0x7c, 0xbc, 0x1b, 0x25, 0x18, 0x1a, 0x26, 0x63, 0x00, 0x8c, - 0xb3, 0x26, 0xaf, 0xc0, 0x48, 0xdb, 0x6d, 0x36, 0x6d, 0xa7, 0x21, 0x5f, 0x3c, 0x0a, 0xc3, 0x54, - 0x45, 0x31, 0x2a, 0x78, 0xf4, 0x51, 0xba, 0x7c, 0x5a, 0xf7, 0x8d, 0x58, 0x47, 0x9e, 0x28, 0x60, - 0xaa, 0xf0, 0x14, 0x04, 0x4c, 0xfd, 0xab, 0x3c, 0x90, 0xee, 0xdd, 0xfa, 0xa8, 0xf7, 0x1b, 0x5f, - 0x8a, 0x84, 0x13, 0x94, 0x7a, 0x45, 0x02, 0x88, 0x64, 0x2c, 0x32, 0xe6, 0xbc, 0xeb, 0xc1, 0x2e, - 0x51, 0x8e, 0x1a, 0xa3, 0xcf, 0x14, 0xee, 0x5f, 0xed, 0x4e, 0xa8, 0xf2, 0xd9, 0x41, 0x6a, 0x2c, - 0x7d, 0x0c, 0xf9, 0x6d, 0xfe, 0x34, 0xd7, 0xae, 0x0c, 0x98, 0x2f, 0xf6, 0x1d, 0x30, 0x5f, 0xd1, - 0x95, 0xd1, 0x20, 0x74, 0xea, 0x09, 0xdf, 0xd3, 0xcd, 0xa4, 0x3f, 0x2d, 0xc2, 0x99, 0x2e, 0x89, - 0x7f, 0xfa, 0xe9, 0xf7, 0x5e, 0x85, 0x51, 0xf6, 0x77, 0x23, 0x21, 0xe6, 0xf9, 0x9a, 0x2c, 0x47, - 0x8d, 0x61, 0xa4, 0x9a, 0xcb, 0xf5, 0x4c, 0x35, 0x67, 0x45, 0xd2, 0x6a, 0x0e, 0xe5, 0x5d, 0xc1, - 0x4f, 0xc2, 0x84, 0xb0, 0xf3, 0xab, 0xa4, 0x6a, 0x85, 0x68, 0x56, 0xad, 0xab, 0x26, 0x10, 0xa3, - 0xb8, 0x3d, 0x52, 0xa8, 0x15, 0x4f, 0x94, 0x42, 0xed, 0x97, 0xbb, 0xb3, 0xae, 0x7f, 0x66, 0x80, - 0x0a, 0x40, 0x1f, 0x6b, 0xca, 0x4c, 0x5f, 0x38, 0x7a, 0x68, 0xfa, 0xc2, 0x79, 0x28, 0xf9, 0x7e, - 0xf3, 0x0e, 0xf5, 0xec, 0x1d, 0x11, 0xb6, 0x6d, 0x3c, 0x72, 0x57, 0x55, 0x00, 0x0c, 0x71, 0x9e, - 0xb2, 0x90, 0xd6, 0xf7, 0x0b, 0xdc, 0x40, 0xa6, 0x15, 0x81, 0x23, 0x44, 0xf3, 0x1b, 0x30, 0x59, - 0x6b, 0xba, 0x0e, 0x5d, 0xb2, 0x3d, 0x2e, 0x61, 0x0e, 0xe2, 0x49, 0xcd, 0x16, 0x23, 0x50, 0x8c, - 0x61, 0x93, 0x1a, 0x14, 0x6a, 0x1e, 0xad, 0xfb, 0xe9, 0xc3, 0xf2, 0xae, 0xda, 0xc1, 0x22, 0xa3, - 0x24, 0xc2, 0xf2, 0xf8, 0xbf, 0x28, 0x68, 0xf3, 0x54, 0x03, 0xfe, 0x2e, 0x97, 0x83, 0x5c, 0x64, - 0xe6, 0xfb, 0x4f, 0x35, 0x50, 0xbd, 0xa6, 0xab, 0x63, 0x84, 0x18, 0x93, 0x00, 0x3b, 0x76, 0x93, - 0x32, 0x2d, 0x22, 0x9e, 0xb4, 0x61, 0x45, 0x96, 0xa3, 0xc6, 0x10, 0x61, 0xfb, 0x96, 0x53, 0xdb, - 0x95, 0x81, 0x0f, 0x46, 0xd8, 0x3e, 0x4f, 0x07, 0x29, 0xa1, 0xac, 0xdb, 0x03, 0xab, 0x21, 0x03, - 0x19, 0x74, 0xb7, 0x6f, 0x59, 0x0d, 0x64, 0xe5, 0x0c, 0xec, 0xd1, 0x1d, 0x99, 0x5d, 0x40, 0x83, - 0x91, 0xee, 0x20, 0x2b, 0x27, 0x2d, 0x28, 0x7a, 0xb4, 0xe5, 0x06, 0xea, 0x7d, 0xda, 0xd5, 0x54, - 0xdd, 0x8a, 0x9c, 0x94, 0x54, 0xa6, 0x40, 0xa4, 0x42, 0x62, 0x25, 0x28, 0x99, 0x90, 0x2a, 0x9c, - 0x57, 0xbb, 0xea, 0x6a, 0xc3, 0x71, 0x3d, 0x7a, 0xcd, 0xf5, 0x79, 0x62, 0x3c, 0xe0, 0xcb, 0x43, - 0x25, 0x8f, 0x3a, 0xbf, 0x9a, 0x84, 0x84, 0xc9, 0x75, 0xcb, 0xff, 0x20, 0x03, 0xa3, 0x6a, 0x4c, - 0x9f, 0x82, 0x84, 0xd3, 0xb7, 0x60, 0x2a, 0xd6, 0x55, 0xc7, 0x08, 0x88, 0x7b, 0x1e, 0xf2, 0x1d, - 0xaf, 0x29, 0x74, 0x7c, 0xf9, 0x58, 0xdd, 0x6d, 0x5c, 0xab, 0x22, 0x2f, 0x2d, 0xff, 0x61, 0x06, - 0x26, 0x85, 0x31, 0xbb, 0xd2, 0x6e, 0x8b, 0x7e, 0xb8, 0x0d, 0xd0, 0xf6, 0xec, 0x7d, 0x2b, 0xa0, - 0x2a, 0xef, 0x60, 0x7f, 0x5b, 0xff, 0xa6, 0xae, 0x8c, 0x06, 0x21, 0xf2, 0x22, 0x14, 0xac, 0x76, - 0x7b, 0x75, 0x89, 0x77, 0x45, 0x2e, 0xf4, 0xde, 0xa9, 0xb0, 0x42, 0x14, 0x30, 0xb6, 0xd4, 0x6d, - 0xc7, 0x0f, 0xac, 0x66, 0x93, 0x87, 0x9b, 0xac, 0x2e, 0xf1, 0x35, 0x9b, 0x0b, 0x97, 0xfa, 0x6a, - 0x04, 0x8a, 0x31, 0xec, 0xf2, 0xdf, 0x1f, 0x83, 0x33, 0x5d, 0xb6, 0x79, 0x23, 0x58, 0x33, 0xd7, - 0x15, 0xac, 0x69, 0xec, 0xe6, 0xd9, 0x53, 0xd9, 0xcd, 0x75, 0x1e, 0xe9, 0xdc, 0x71, 0xf3, 0x48, - 0x87, 0x39, 0x1a, 0x65, 0xcc, 0x67, 0x42, 0xee, 0xdd, 0x30, 0xaf, 0x23, 0x1a, 0xf8, 0xc7, 0x4a, - 0x6c, 0x7d, 0x13, 0x46, 0xad, 0xb6, 0x2d, 0xd2, 0xb7, 0x16, 0xfb, 0x9e, 0xa6, 0x95, 0xcd, 0x55, - 0x91, 0xbb, 0x55, 0x13, 0xe9, 0x4e, 0xdc, 0x3a, 0x32, 0xd8, 0xc4, 0xad, 0xa6, 0x0a, 0x3e, 0x7a, - 0xa4, 0x0a, 0xfe, 0x12, 0x14, 0xad, 0x5a, 0x60, 0xef, 0x53, 0xb9, 0x91, 0x6a, 0x69, 0x58, 0xe1, - 0xa5, 0x28, 0xa1, 0xf2, 0x65, 0x7b, 0x15, 0x11, 0xcb, 0xc5, 0x4a, 0xf4, 0x65, 0x7b, 0x1d, 0x2c, - 0x6b, 0xe2, 0x71, 0x3d, 0x87, 0xcf, 0x97, 0x68, 0xf2, 0xd8, 0x50, 0xcf, 0x31, 0x81, 0x18, 0xc5, - 0x25, 0x15, 0x98, 0x12, 0x05, 0xb7, 0xdb, 0xec, 0xf8, 0xcc, 0xaa, 0x8f, 0x47, 0x67, 0xc5, 0xd5, - 0x28, 0x18, 0xe3, 0xf8, 0x3d, 0x54, 0xa5, 0x89, 0xf4, 0xaa, 0xd2, 0x64, 0x6a, 0x55, 0x29, 0xbe, - 0x0e, 0xfb, 0x50, 0x95, 0xbe, 0x12, 0xcf, 0xdf, 0x2c, 0xbc, 0x9d, 0x53, 0xa8, 0x35, 0x6c, 0x51, - 0xd5, 0xcd, 0x0c, 0xcd, 0xc7, 0xca, 0xdb, 0xfc, 0xd3, 0x30, 0xe1, 0x7a, 0x0d, 0xcb, 0xb1, 0xdf, - 0xe5, 0x12, 0xc6, 0xe7, 0x6e, 0xcf, 0x25, 0x31, 0x47, 0x6f, 0x9a, 0x00, 0x8c, 0xe2, 0x91, 0x0e, - 0x94, 0x1a, 0x4a, 0xac, 0xce, 0x9c, 0x49, 0x2b, 0x58, 0xa2, 0x12, 0x5a, 0xc4, 0xc2, 0xe9, 0x32, - 0x0c, 0x39, 0x19, 0x7a, 0x20, 0x79, 0x0a, 0xf4, 0xc0, 0xff, 0x3b, 0xc2, 0xa5, 0x75, 0xf4, 0x02, - 0xf3, 0xf4, 0xcf, 0x57, 0x3f, 0x03, 0x25, 0xa9, 0x79, 0xcb, 0xdd, 0xa9, 0xb4, 0xf0, 0x63, 0x3a, - 0x1a, 0x35, 0x9e, 0xdd, 0x7c, 0x75, 0x09, 0x43, 0xec, 0x63, 0x1d, 0xb6, 0x62, 0x19, 0xb2, 0xf3, - 0x83, 0xcb, 0x90, 0x5d, 0x85, 0xf3, 0x22, 0x1f, 0x67, 0xb5, 0xba, 0xc6, 0x0f, 0x02, 0xb6, 0x78, - 0x6d, 0x56, 0x3e, 0x02, 0xa7, 0x75, 0xa2, 0xe5, 0x24, 0x24, 0x4c, 0xae, 0x2b, 0x05, 0x5a, 0xd3, - 0xd2, 0x02, 0xad, 0xd8, 0x25, 0xd0, 0x42, 0x20, 0x46, 0x71, 0x7b, 0x48, 0xa3, 0xd1, 0xf4, 0xd2, - 0xa8, 0x34, 0x00, 0x69, 0x14, 0x9d, 0x67, 0x27, 0x3c, 0xb8, 0xc1, 0xa1, 0x07, 0xb7, 0x4f, 0xc3, - 0x98, 0x78, 0x29, 0x5b, 0x8c, 0xf5, 0x58, 0xdf, 0x63, 0x5d, 0x0d, 0x6b, 0xa3, 0x49, 0xca, 0x58, - 0xd9, 0xe3, 0xa7, 0x93, 0x76, 0xbb, 0x0c, 0xc5, 0x86, 0xe7, 0x76, 0xda, 0x22, 0xa4, 0x46, 0x4e, - 0xed, 0xab, 0xbc, 0x04, 0x25, 0x24, 0xdd, 0xea, 0xff, 0x66, 0x09, 0xa6, 0x62, 0x7e, 0x03, 0x89, - 0xb6, 0xda, 0xcc, 0x93, 0xb3, 0xd5, 0x5e, 0x8e, 0x64, 0xef, 0x4b, 0x4a, 0xb5, 0xd1, 0x95, 0x3c, - 0x3c, 0x77, 0xfc, 0xe4, 0xe1, 0xe4, 0x27, 0xa1, 0x64, 0xd5, 0xeb, 0x1e, 0xf5, 0x7d, 0xaa, 0x1e, - 0x34, 0x10, 0x6f, 0xb9, 0xab, 0x42, 0x0c, 0xe1, 0xdc, 0x0a, 0x54, 0xdf, 0xf1, 0xd9, 0x39, 0x23, - 0x7e, 0x06, 0x64, 0xbd, 0xc8, 0xca, 0x51, 0x63, 0x90, 0x3a, 0x4c, 0xed, 0x79, 0xdb, 0x8b, 0x8b, - 0x56, 0x6d, 0x97, 0x9e, 0xc4, 0x88, 0xc7, 0x13, 0xc0, 0xdc, 0x88, 0x52, 0xc0, 0x38, 0x49, 0xc9, - 0xe5, 0x06, 0x3d, 0x08, 0xac, 0xed, 0x93, 0xe8, 0x7a, 0x8a, 0x8b, 0x49, 0x01, 0xe3, 0x24, 0x99, - 0x66, 0xb6, 0xe7, 0x6d, 0xab, 0x03, 0x96, 0x3c, 0x90, 0x6a, 0xcd, 0xec, 0x46, 0x08, 0x42, 0x13, - 0x8f, 0x75, 0xd8, 0x9e, 0xb7, 0x8d, 0xd4, 0x6a, 0xb6, 0x64, 0xea, 0x3b, 0xdd, 0x61, 0x37, 0x64, - 0x39, 0x6a, 0x0c, 0xd2, 0x06, 0xc2, 0xbe, 0x8e, 0x8f, 0xbb, 0x0e, 0x33, 0x97, 0xd6, 0x94, 0xe3, - 0xbf, 0x2f, 0x7d, 0x81, 0xc9, 0xb7, 0x1b, 0x5d, 0x74, 0x30, 0x81, 0x36, 0xf9, 0x0c, 0x3c, 0xbb, - 0xe7, 0x6d, 0xcb, 0x2b, 0xc0, 0x4d, 0xcf, 0x76, 0x6a, 0x76, 0xdb, 0x12, 0xd9, 0xf0, 0xc6, 0xa2, - 0x4f, 0xe1, 0xdd, 0x48, 0x46, 0xc3, 0x5e, 0xf5, 0xa3, 0x17, 0x07, 0xe3, 0x69, 0x2f, 0x0e, 0x62, - 0x8b, 0xf4, 0x44, 0x17, 0x07, 0x13, 0x4f, 0x81, 0x3a, 0xf2, 0xe5, 0x11, 0x18, 0xbb, 0xb6, 0xb5, - 0xb5, 0xa9, 0x72, 0x5d, 0x1e, 0x61, 0x96, 0x32, 0x72, 0x97, 0x66, 0x4f, 0xf1, 0x99, 0x3a, 0x99, - 0xa8, 0x2f, 0x37, 0xac, 0x44, 0x7d, 0x2f, 0x41, 0xb1, 0x45, 0x83, 0x5d, 0xb7, 0x1e, 0xcf, 0x4d, - 0xbd, 0xce, 0x4b, 0x51, 0x42, 0x63, 0x99, 0x40, 0x0b, 0xa7, 0x9e, 0x09, 0xf4, 0x15, 0x18, 0x09, - 0xec, 0x16, 0x75, 0x3b, 0x42, 0xb2, 0xe5, 0xc2, 0x2e, 0xdb, 0x12, 0xc5, 0xa8, 0xe0, 0xa4, 0x0d, - 0xa5, 0x6d, 0x65, 0xa8, 0x96, 0x02, 0x6a, 0x20, 0x36, 0x6f, 0x2e, 0xac, 0xf5, 0x4f, 0x0c, 0x99, - 0x90, 0x2f, 0xc0, 0xc8, 0x2e, 0xb5, 0xea, 0xac, 0x67, 0x46, 0xd3, 0x46, 0x22, 0x19, 0x53, 0x72, - 0xee, 0x9a, 0x20, 0x1a, 0x0b, 0xc7, 0x91, 0xa5, 0xa8, 0x78, 0x92, 0x5f, 0x80, 0x09, 0x71, 0xfa, - 0x95, 0x10, 0xa9, 0x3e, 0xad, 0xa4, 0x89, 0xf0, 0x0f, 0xc9, 0x89, 0xe3, 0x8f, 0x59, 0xe2, 0x63, - 0x94, 0xdf, 0xc5, 0xd7, 0x61, 0xdc, 0x6c, 0x6a, 0xbf, 0xaf, 0x62, 0x4c, 0x44, 0x9e, 0x2c, 0x24, - 0x2f, 0x1b, 0x79, 0xe2, 0x73, 0xfa, 0xdc, 0xa6, 0x92, 0xe8, 0x9a, 0xdb, 0xb1, 0x78, 0x2a, 0xe1, - 0xa7, 0x3e, 0x7e, 0x47, 0x3e, 0x95, 0x90, 0x8b, 0x3c, 0x95, 0xc0, 0xcb, 0x51, 0x63, 0xf0, 0x54, - 0x2b, 0x81, 0x77, 0x47, 0xef, 0xda, 0x66, 0x48, 0x1d, 0xc3, 0x94, 0xd0, 0xf2, 0x2f, 0x4d, 0xc2, - 0xb8, 0x99, 0x02, 0x8e, 0xcd, 0x3d, 0x95, 0xb5, 0x2b, 0x13, 0xcd, 0x8e, 0xa5, 0x32, 0x76, 0x29, - 0x78, 0x24, 0x32, 0x2a, 0x7b, 0x68, 0x64, 0xd4, 0xb7, 0x45, 0xe2, 0xd0, 0x68, 0x1e, 0xf1, 0xf4, - 0x49, 0x3f, 0xba, 0x52, 0x93, 0xeb, 0x14, 0xa2, 0xd1, 0x62, 0xec, 0x66, 0x4e, 0x7e, 0x27, 0x03, - 0xcf, 0x79, 0x94, 0x89, 0x1d, 0xea, 0x75, 0x55, 0x90, 0x27, 0x99, 0x81, 0x36, 0xed, 0x85, 0x47, - 0x0f, 0x67, 0x9f, 0xc3, 0x5e, 0x1c, 0xb1, 0x77, 0x63, 0xc8, 0xdf, 0xc9, 0xc0, 0x4c, 0x8b, 0x06, - 0x9e, 0x5d, 0xf3, 0xbb, 0x5b, 0x5a, 0x18, 0x7c, 0x4b, 0x9f, 0x7f, 0xf4, 0x70, 0x76, 0x66, 0xbd, - 0x07, 0x43, 0xec, 0xd9, 0x14, 0xf2, 0x5e, 0x26, 0xe9, 0xa5, 0x8a, 0x14, 0x61, 0x14, 0x46, 0x92, - 0x9c, 0x6a, 0xe0, 0x59, 0x01, 0x6d, 0x1c, 0x1c, 0xf1, 0x58, 0x45, 0x33, 0x72, 0x21, 0x96, 0xf2, - 0x4a, 0x44, 0x6d, 0xb7, 0x62, 0x5a, 0x27, 0xe8, 0x00, 0xdf, 0xc9, 0xc0, 0xb8, 0xe3, 0xd6, 0xa9, - 0xd2, 0x91, 0xa4, 0x40, 0xfc, 0xf4, 0x60, 0xb2, 0x31, 0xce, 0x6d, 0x18, 0xa4, 0x85, 0x58, 0xd4, - 0x76, 0x1d, 0x13, 0x84, 0x91, 0x36, 0x90, 0xdb, 0x30, 0x16, 0xb8, 0x4d, 0xea, 0x49, 0xab, 0x8e, - 0x10, 0x8f, 0x97, 0x92, 0xd4, 0xbc, 0x2d, 0x8d, 0x16, 0xaa, 0x9c, 0x61, 0x99, 0x8f, 0x26, 0x1d, - 0x42, 0xbb, 0xb3, 0xe6, 0x0b, 0x0d, 0xf2, 0xa5, 0x24, 0xd2, 0x9b, 0x6e, 0xfd, 0x44, 0x89, 0xf3, - 0x89, 0x03, 0xd3, 0x3a, 0x5f, 0xbf, 0xd0, 0x91, 0x7d, 0x99, 0xe4, 0x21, 0x51, 0x53, 0x5d, 0x73, - 0x6b, 0x56, 0x53, 0x24, 0x32, 0x42, 0xba, 0x43, 0x3d, 0x9e, 0x4f, 0x49, 0xbf, 0x70, 0xb0, 0x1a, - 0xa3, 0x84, 0x5d, 0xb4, 0xc9, 0x55, 0x38, 0xd3, 0xf6, 0x6c, 0x97, 0x37, 0xa1, 0x69, 0xf9, 0x22, - 0xaf, 0x8d, 0x30, 0x54, 0xea, 0x40, 0xb7, 0xcd, 0x38, 0x02, 0x76, 0xd7, 0x11, 0x07, 0x69, 0x51, - 0xc8, 0x35, 0xc2, 0x82, 0x3a, 0x48, 0x8b, 0x32, 0xd4, 0x50, 0xb2, 0x02, 0xa3, 0xd6, 0xce, 0x8e, - 0xed, 0x30, 0x4c, 0xf1, 0xce, 0xd4, 0xf3, 0x49, 0x9f, 0x56, 0x91, 0x38, 0xd2, 0x16, 0x2d, 0x7f, - 0xa1, 0xae, 0xab, 0x32, 0xf4, 0xdb, 0x35, 0xf3, 0xcd, 0x7f, 0xfe, 0x96, 0x54, 0x2c, 0x43, 0x7f, - 0x14, 0x03, 0x13, 0x6a, 0xb1, 0xd6, 0xfb, 0x34, 0x08, 0x6c, 0xa7, 0xe1, 0xcb, 0x37, 0xa2, 0x38, - 0xd7, 0xaa, 0x2c, 0x43, 0x0d, 0x65, 0x07, 0x3b, 0x3f, 0xb0, 0xbc, 0xa0, 0xe2, 0x35, 0x7c, 0x9e, - 0xaa, 0x40, 0x1e, 0xec, 0xaa, 0xaa, 0x10, 0x43, 0x38, 0xf9, 0x38, 0x8c, 0xfb, 0x46, 0xee, 0x4d, - 0x6e, 0xb9, 0x2b, 0xc9, 0x2b, 0x41, 0xa3, 0x1c, 0x23, 0x58, 0x64, 0x0e, 0xa0, 0x65, 0x3d, 0x90, - 0xda, 0xe1, 0xcc, 0x59, 0xb1, 0x7f, 0x31, 0x75, 0x69, 0x5d, 0x97, 0xa2, 0x81, 0x71, 0xf1, 0xe7, - 0xe0, 0x4c, 0xd7, 0x52, 0xe9, 0x6b, 0x5b, 0xfe, 0xed, 0x2c, 0x4c, 0xc5, 0xd2, 0x84, 0x1e, 0xa5, - 0x21, 0x7f, 0x0e, 0xc6, 0x85, 0xb9, 0x4a, 0x9e, 0x0d, 0xb3, 0x7d, 0xdf, 0x89, 0x56, 0x8c, 0xea, - 0x18, 0x21, 0x46, 0xae, 0xc4, 0xba, 0x2d, 0x17, 0xcd, 0xb3, 0x74, 0x48, 0xd7, 0x49, 0x0d, 0x3a, - 0x3f, 0x24, 0x0d, 0xba, 0x3c, 0x07, 0x63, 0x37, 0xae, 0x54, 0x55, 0x78, 0x5b, 0x98, 0xd4, 0x3f, - 0xc3, 0x13, 0x29, 0x77, 0x25, 0xf5, 0x2f, 0x7f, 0x33, 0x07, 0x67, 0x8c, 0x0a, 0xf2, 0x05, 0x8e, - 0x5f, 0x80, 0x62, 0xd3, 0xda, 0xa6, 0x4d, 0x95, 0x65, 0x3f, 0xc5, 0x01, 0xae, 0x8b, 0xf8, 0xdc, - 0x1a, 0xa7, 0x1c, 0x8b, 0xcf, 0x14, 0x85, 0x28, 0xd9, 0x92, 0x5d, 0x18, 0xd9, 0x96, 0xd9, 0xcb, - 0xb3, 0x83, 0xca, 0x5e, 0xce, 0x0d, 0xb0, 0x2a, 0x67, 0xb9, 0x22, 0xcf, 0xed, 0x98, 0x9e, 0xe7, - 0x7a, 0x37, 0x55, 0xee, 0x72, 0xa9, 0xc1, 0x4b, 0x07, 0xab, 0xd0, 0x8e, 0x99, 0x84, 0x84, 0xc9, - 0x75, 0x2f, 0xfe, 0x0c, 0x8c, 0x19, 0x5f, 0xd9, 0xd7, 0x54, 0xff, 0x17, 0x39, 0x18, 0x55, 0x19, - 0x78, 0x8f, 0x9a, 0xe3, 0x2f, 0x42, 0x81, 0xbf, 0xaf, 0x2e, 0x6d, 0x44, 0xfa, 0x5a, 0x93, 0xbf, - 0xbf, 0x8e, 0x02, 0x66, 0xea, 0x8b, 0xb9, 0x23, 0xf4, 0xc5, 0x21, 0x4f, 0x4e, 0xb2, 0x0d, 0x79, - 0xdf, 0xf2, 0x9b, 0x52, 0x25, 0x4a, 0x13, 0x54, 0x5b, 0xa9, 0xae, 0x99, 0x6f, 0xba, 0xb1, 0xdf, - 0xc8, 0x69, 0x93, 0xaf, 0x64, 0x60, 0xa2, 0xe6, 0x3a, 0x7e, 0xa7, 0x45, 0x3d, 0x6e, 0x31, 0x94, - 0x5a, 0xce, 0x5a, 0xca, 0x90, 0xc4, 0x45, 0x93, 0xa6, 0x38, 0x85, 0x44, 0x8a, 0x30, 0xca, 0x95, - 0xbf, 0x2c, 0xdd, 0x5d, 0x91, 0xcc, 0x43, 0x89, 0xdb, 0x2f, 0x8d, 0xf4, 0x6c, 0xda, 0xbb, 0xe6, - 0xaa, 0x02, 0x60, 0x88, 0xc3, 0xce, 0x09, 0x6e, 0xb3, 0x4e, 0xf5, 0xeb, 0x40, 0x7a, 0xc5, 0xdc, - 0xe4, 0xa5, 0x28, 0xa1, 0x6c, 0x9f, 0xf4, 0xe8, 0xb6, 0xd5, 0xb4, 0x0c, 0x5d, 0x4c, 0x0e, 0xb8, - 0xde, 0x27, 0x31, 0x8e, 0x80, 0xdd, 0x75, 0xca, 0xff, 0x79, 0x14, 0xa6, 0xe3, 0x41, 0x98, 0x47, - 0x4d, 0xc4, 0x79, 0x28, 0xb5, 0x2d, 0x2f, 0xb0, 0x8d, 0xf7, 0xb8, 0xf4, 0x57, 0x6d, 0x2a, 0x00, - 0x86, 0x38, 0xe1, 0xcc, 0xcd, 0x1d, 0x32, 0x73, 0x93, 0x5f, 0x33, 0xc8, 0x9f, 0xfe, 0x6b, 0x06, - 0x72, 0x5d, 0x14, 0x86, 0xb5, 0x2e, 0x4c, 0x4f, 0xcd, 0xe2, 0x91, 0x9e, 0x9a, 0xef, 0x77, 0x3b, - 0x95, 0x7d, 0x7a, 0x70, 0xf1, 0xb6, 0xfd, 0x5d, 0x94, 0xc6, 0x96, 0xda, 0xe8, 0x93, 0x58, 0x6a, - 0x64, 0x13, 0xce, 0x35, 0xed, 0x96, 0xf4, 0x8c, 0xf3, 0x37, 0xa9, 0x57, 0xa5, 0x35, 0xd7, 0xa9, - 0x73, 0xc3, 0x6b, 0x2e, 0x74, 0x58, 0x58, 0x4b, 0xc0, 0xc1, 0xc4, 0x9a, 0xa6, 0xcc, 0x84, 0x23, - 0x64, 0xa6, 0x92, 0x69, 0x63, 0x43, 0x94, 0x69, 0xa7, 0x7e, 0xff, 0x12, 0x3a, 0x24, 0x4f, 0x1c, - 0xe6, 0x90, 0x9c, 0xce, 0xe4, 0xf9, 0x37, 0x01, 0xc6, 0xf9, 0x78, 0x1f, 0xd3, 0xe6, 0x79, 0xac, - 0xdd, 0x2e, 0x22, 0x89, 0x72, 0x5c, 0xcd, 0x3f, 0x5c, 0x12, 0x45, 0x4d, 0x89, 0xf9, 0x53, 0x37, - 0x25, 0x5e, 0x81, 0x71, 0x4f, 0x3c, 0xbf, 0x56, 0xaf, 0xd4, 0xf6, 0x7c, 0xf9, 0x5e, 0x8f, 0xe1, - 0x1f, 0x10, 0xc2, 0x30, 0x82, 0xc9, 0xa4, 0x46, 0xcd, 0x6d, 0xf1, 0x6c, 0xa7, 0x71, 0xa9, 0xb1, - 0x28, 0xcb, 0x51, 0x63, 0x90, 0x37, 0x60, 0x72, 0xa7, 0xd9, 0xf1, 0x77, 0x57, 0x18, 0x0d, 0xea, - 0xd4, 0xc4, 0xbb, 0x2c, 0x85, 0xd0, 0xbb, 0x69, 0x25, 0x02, 0xc5, 0x18, 0xf6, 0xd0, 0xdf, 0x68, - 0x31, 0x2c, 0xda, 0xa5, 0x53, 0xb4, 0x68, 0xff, 0x2c, 0x4c, 0xe9, 0xb9, 0x60, 0x3b, 0x0d, 0xe5, - 0xd4, 0x57, 0x12, 0xa7, 0xe1, 0xcd, 0x28, 0x08, 0xe3, 0xb8, 0xa6, 0xa0, 0x18, 0x3b, 0xa6, 0xa0, - 0x18, 0x1f, 0xa2, 0xa0, 0xf8, 0x7a, 0x06, 0x26, 0xfd, 0xda, 0x2e, 0x6d, 0x59, 0x48, 0x1b, 0xb6, - 0x1f, 0x78, 0x07, 0xf2, 0xf2, 0x23, 0x45, 0x50, 0x5d, 0x35, 0x42, 0x4f, 0x32, 0xe6, 0x0f, 0xba, - 0x46, 0x21, 0x18, 0xe3, 0x4c, 0xbe, 0x18, 0xda, 0xa1, 0x27, 0xd3, 0x26, 0x97, 0x31, 0xe5, 0xc4, - 0x89, 0x0d, 0xd1, 0x53, 0x4f, 0x91, 0x21, 0xfa, 0x26, 0xc0, 0x9a, 0xdb, 0x50, 0x92, 0xb1, 0x02, - 0x53, 0xea, 0x8d, 0x5d, 0xb1, 0x43, 0x89, 0x88, 0xae, 0x7c, 0x78, 0x9d, 0xbc, 0x1a, 0x05, 0x63, - 0x1c, 0xbf, 0xfc, 0xfb, 0x45, 0x98, 0x8a, 0x65, 0xb5, 0x18, 0x88, 0xc0, 0x65, 0x52, 0xa8, 0x69, - 0x53, 0x27, 0x58, 0xad, 0x4b, 0x65, 0x2e, 0x94, 0x42, 0xa2, 0x7c, 0x09, 0x35, 0xc6, 0x07, 0x47, - 0xa5, 0x33, 0x55, 0xae, 0xc2, 0x71, 0x1f, 0xa8, 0x2a, 0x0e, 0x4b, 0xf8, 0x7d, 0xa5, 0x5b, 0xa5, - 0xbb, 0x3b, 0xb0, 0xe4, 0x25, 0x27, 0xba, 0x33, 0x3d, 0x9d, 0xa7, 0x84, 0x75, 0x30, 0x48, 0x69, - 0x68, 0xc1, 0x20, 0xe9, 0x74, 0x94, 0xaf, 0xe7, 0x40, 0xf7, 0x13, 0x93, 0xae, 0x63, 0x96, 0xe3, - 0xb8, 0x81, 0xb4, 0xdc, 0x66, 0xd2, 0x4a, 0x35, 0x45, 0x79, 0xae, 0x12, 0x52, 0x8d, 0xe5, 0x41, - 0x33, 0x20, 0x68, 0x32, 0x27, 0xfb, 0xda, 0x44, 0x23, 0x2e, 0x80, 0x37, 0x06, 0xd0, 0x8c, 0x63, - 0x58, 0x66, 0x2e, 0xbe, 0x01, 0xd3, 0xf1, 0xd6, 0xf6, 0xd3, 0xa3, 0x69, 0x4c, 0x23, 0x7f, 0x92, - 0x85, 0xd1, 0x8d, 0xca, 0x56, 0x95, 0xdf, 0x72, 0xd6, 0xa1, 0xc0, 0xaf, 0x3c, 0xa5, 0x8b, 0xce, - 0x40, 0xa6, 0x0e, 0x37, 0x8f, 0xf1, 0x9f, 0x28, 0x88, 0x93, 0x15, 0x26, 0x02, 0xf7, 0xa8, 0xd3, - 0x9f, 0xf9, 0xb0, 0x24, 0xa4, 0xe4, 0x1e, 0x75, 0x50, 0x54, 0x27, 0x8b, 0x90, 0x77, 0xd8, 0x77, - 0xf6, 0xf5, 0x08, 0xa4, 0x78, 0x57, 0x8a, 0xe9, 0x1d, 0xbc, 0x32, 0x7f, 0x48, 0xd6, 0xa3, 0x75, - 0xea, 0x04, 0xb6, 0xd5, 0xec, 0xcf, 0x97, 0x4f, 0x3c, 0x24, 0xab, 0x2b, 0xa3, 0x41, 0xa8, 0xfc, - 0x83, 0x0c, 0x8c, 0xc8, 0xa7, 0xac, 0x48, 0x13, 0x8a, 0x8e, 0xc5, 0x1d, 0x96, 0x53, 0xbb, 0x3f, - 0x6e, 0x70, 0x3a, 0xfa, 0x5a, 0x88, 0xaf, 0x7e, 0x51, 0x86, 0x92, 0x07, 0xd9, 0x85, 0x22, 0x15, - 0x8f, 0x48, 0x65, 0x07, 0xf8, 0xca, 0xbf, 0xf0, 0x83, 0x14, 0xcf, 0x46, 0x49, 0xfa, 0xe5, 0x1f, - 0x66, 0x00, 0x42, 0x94, 0xa3, 0x36, 0xbe, 0x9f, 0x84, 0x52, 0xad, 0xd9, 0xf1, 0x03, 0xea, 0x69, - 0xa7, 0x4c, 0xf1, 0x04, 0x84, 0x2a, 0xc4, 0x10, 0x4e, 0x5e, 0x95, 0x22, 0x4c, 0x6c, 0x7e, 0x33, - 0x4a, 0xfa, 0x3c, 0x7e, 0x38, 0x3b, 0xce, 0x03, 0x11, 0x95, 0xa9, 0x45, 0x84, 0xa6, 0xc5, 0xcd, - 0xd2, 0xf9, 0x01, 0x9a, 0xa5, 0xcb, 0xbf, 0x57, 0x84, 0xe9, 0x78, 0xd2, 0xa8, 0xa3, 0xbe, 0xd5, - 0x78, 0x6c, 0x29, 0x7b, 0xc4, 0x63, 0x4b, 0xc9, 0x9b, 0x77, 0xee, 0xc9, 0x6e, 0xde, 0xf9, 0xe3, - 0x6e, 0xde, 0x43, 0xb3, 0xde, 0x44, 0xec, 0x31, 0xc5, 0xb4, 0xf6, 0x98, 0xf8, 0xf8, 0xf5, 0xb1, - 0x7b, 0xbf, 0x2d, 0x67, 0x62, 0xea, 0x7b, 0x55, 0x25, 0x64, 0xbb, 0x02, 0x2b, 0x4f, 0x5d, 0x3f, - 0x98, 0x85, 0xc2, 0xbd, 0x0e, 0xed, 0x50, 0xe9, 0x44, 0xc7, 0x05, 0x2b, 0xcf, 0x0d, 0x81, 0xa2, - 0x3c, 0xdd, 0xee, 0xfe, 0x0f, 0x73, 0x30, 0xc6, 0xbe, 0xf5, 0x98, 0x06, 0x88, 0x3e, 0x96, 0x8a, - 0x71, 0x9a, 0xcd, 0x9d, 0xe2, 0x69, 0xf6, 0x49, 0x1b, 0x33, 0x86, 0xbc, 0xd4, 0xca, 0x3f, 0x2c, - 0xc0, 0x64, 0x34, 0x39, 0x10, 0xf9, 0x04, 0x8c, 0xed, 0xba, 0x7e, 0x20, 0xdd, 0x56, 0xe5, 0xd8, - 0x69, 0xf5, 0xe9, 0x5a, 0x08, 0x42, 0x13, 0xef, 0xd8, 0x57, 0x27, 0xf2, 0xfd, 0xdf, 0xf8, 0xd5, - 0x89, 0x7c, 0x23, 0x18, 0x15, 0xfc, 0x2f, 0x0f, 0x36, 0xc9, 0xb2, 0xf1, 0xcb, 0xdd, 0x07, 0x9b, - 0x3b, 0x83, 0xca, 0x0b, 0xf5, 0x01, 0x3e, 0xd7, 0xa4, 0x13, 0x4b, 0xbf, 0x3a, 0x05, 0x93, 0x51, - 0xed, 0x89, 0x8d, 0xaa, 0xf6, 0xe4, 0xca, 0x70, 0xbb, 0x9d, 0xf1, 0xe4, 0x49, 0x97, 0x37, 0x97, - 0x52, 0x49, 0xb2, 0xc7, 0x52, 0x49, 0xe2, 0x5e, 0x41, 0xb9, 0xd3, 0xf7, 0x0a, 0x4a, 0x76, 0x3f, - 0xcb, 0x3f, 0x49, 0xf7, 0xb3, 0xa7, 0xc5, 0xa7, 0xeb, 0xbb, 0x71, 0x17, 0xa7, 0x62, 0xda, 0xdc, - 0x1d, 0xd1, 0xa9, 0x37, 0x18, 0x27, 0xa7, 0x91, 0x01, 0x39, 0x39, 0x99, 0xee, 0x63, 0xa3, 0x43, - 0x77, 0x1f, 0x4b, 0x70, 0xa9, 0x2a, 0x0d, 0xc1, 0xa5, 0xaa, 0x0c, 0xc5, 0x96, 0xf5, 0xa0, 0xd2, - 0x50, 0x81, 0x9f, 0x5c, 0xa0, 0xac, 0xf3, 0x12, 0x94, 0x90, 0x53, 0x77, 0xbb, 0x4a, 0xf6, 0x5d, - 0x1a, 0x3f, 0x91, 0xef, 0x52, 0xa2, 0x0b, 0xd7, 0x44, 0x4a, 0x17, 0xae, 0xc9, 0x63, 0xbb, 0x70, - 0x4d, 0xa5, 0x70, 0xe1, 0xfa, 0x10, 0x8c, 0xb4, 0xac, 0x07, 0xeb, 0xbe, 0xf4, 0xba, 0xca, 0x0b, - 0x27, 0x92, 0x75, 0x51, 0x84, 0x0a, 0xc6, 0x1a, 0xd6, 0xb2, 0x1e, 0x2c, 0x1c, 0x04, 0xd4, 0xe7, - 0x01, 0x97, 0xd2, 0x3b, 0x6b, 0x5d, 0x96, 0xa1, 0x86, 0x4a, 0x82, 0xd5, 0xce, 0xb6, 0xcf, 0x7d, - 0xad, 0x42, 0x82, 0xac, 0x08, 0x15, 0xac, 0x5f, 0x0f, 0x2b, 0xb2, 0x06, 0xe7, 0x3c, 0x6b, 0x27, - 0xb8, 0x46, 0x2d, 0x2f, 0xd8, 0xa6, 0x56, 0xa0, 0x9c, 0x58, 0xce, 0xe9, 0x1d, 0xe0, 0x1c, 0x26, - 0xc0, 0x31, 0xb1, 0x16, 0x59, 0x85, 0xb3, 0xac, 0x7c, 0xb9, 0x29, 0x54, 0x0b, 0x45, 0xec, 0xbc, - 0x08, 0x0f, 0x7e, 0xf4, 0x70, 0xf6, 0x2c, 0x76, 0x83, 0x31, 0xa9, 0x0e, 0xf9, 0x14, 0x4c, 0xb3, - 0xe2, 0x35, 0x6a, 0xf9, 0x54, 0xd1, 0xb9, 0x20, 0xbc, 0xa5, 0xd8, 0x4c, 0xc4, 0x18, 0x0c, 0xbb, - 0xb0, 0xc9, 0x22, 0x9c, 0x61, 0x65, 0x8b, 0x6e, 0xab, 0x65, 0xeb, 0xef, 0x7a, 0x56, 0x44, 0x3a, - 0x71, 0xa7, 0x86, 0x38, 0x10, 0xbb, 0xf1, 0xd3, 0x7b, 0xa0, 0x7d, 0x2b, 0x0f, 0xd3, 0x37, 0xdb, - 0xd4, 0xb9, 0xbb, 0x6b, 0xfb, 0x7b, 0xea, 0xbc, 0x70, 0x19, 0xf2, 0x4c, 0xa7, 0x8c, 0x27, 0x40, - 0x60, 0x4a, 0x27, 0x72, 0x88, 0x79, 0x3f, 0x94, 0x3d, 0xe2, 0x7e, 0x68, 0x1e, 0x4a, 0x8e, 0xd5, - 0xa2, 0x7e, 0xdb, 0xaa, 0x75, 0xbd, 0xfc, 0xbb, 0xa1, 0x00, 0x18, 0xe2, 0x10, 0x84, 0x12, 0xdb, - 0xbf, 0x4f, 0x10, 0xd9, 0x29, 0x02, 0xbd, 0x54, 0x5d, 0x0c, 0xc9, 0x90, 0xd7, 0x00, 0x2c, 0x3e, - 0x7e, 0x7c, 0x8d, 0x16, 0xa2, 0xcf, 0x2c, 0x56, 0x34, 0x04, 0x0d, 0x2c, 0xf3, 0xac, 0x53, 0x7c, - 0x62, 0x67, 0x9d, 0x91, 0xd3, 0x3e, 0xeb, 0x94, 0x3f, 0x03, 0x67, 0xba, 0xe2, 0xba, 0xd9, 0xb1, - 0x42, 0x24, 0x58, 0xc8, 0x44, 0x8f, 0x15, 0x91, 0xb4, 0x0a, 0xb3, 0x50, 0xe0, 0xa3, 0x28, 0xd3, - 0x62, 0xf0, 0x43, 0x2d, 0x1f, 0x61, 0x14, 0xe5, 0x65, 0x84, 0x71, 0x33, 0xa9, 0xdd, 0xd1, 0xc9, - 0xea, 0x74, 0x2a, 0x8e, 0x6c, 0xaf, 0x54, 0x1c, 0xe5, 0xef, 0x65, 0xe1, 0x6c, 0x82, 0x62, 0xc6, - 0x16, 0xa8, 0x7c, 0xe0, 0x28, 0x94, 0xcd, 0x99, 0x70, 0x81, 0x56, 0x63, 0x30, 0xec, 0xc2, 0x26, - 0x6f, 0xb1, 0x39, 0x53, 0xa3, 0xbe, 0xbf, 0xee, 0xd6, 0x55, 0x0b, 0x7e, 0x4e, 0xcc, 0x17, 0x55, - 0xfa, 0xf8, 0xe1, 0xec, 0x87, 0xc5, 0xcc, 0x9c, 0xb7, 0xda, 0xf6, 0x3c, 0x9b, 0x99, 0xf3, 0xfb, - 0x86, 0xa2, 0x18, 0xdc, 0x71, 0x9b, 0x9d, 0x16, 0x0d, 0x2b, 0xa0, 0x41, 0x92, 0xbc, 0x09, 0xb0, - 0xcf, 0xe1, 0x55, 0xfb, 0x5d, 0xa5, 0x9e, 0x1e, 0xfa, 0x6a, 0xe7, 0x9c, 0x7a, 0xfc, 0x6f, 0xee, - 0x56, 0xc7, 0x72, 0x02, 0x26, 0xe0, 0xb9, 0xf0, 0xbc, 0xa3, 0xa9, 0xa0, 0x41, 0xb1, 0xfc, 0xeb, - 0x45, 0x38, 0xd3, 0x95, 0xdd, 0x9b, 0x7b, 0x12, 0xe8, 0xc8, 0xec, 0x98, 0xa7, 0x56, 0x62, 0x3c, - 0xf6, 0x1b, 0x30, 0xc9, 0x8f, 0x8d, 0x9b, 0xb1, 0x78, 0x6e, 0x7d, 0xc3, 0xbe, 0x15, 0x81, 0x62, - 0x0c, 0xfb, 0x78, 0x3e, 0x51, 0x6f, 0xc0, 0xa4, 0xdf, 0xd9, 0x16, 0xcf, 0xf0, 0x8a, 0x24, 0x25, - 0xf9, 0x28, 0x93, 0x6a, 0x04, 0x8a, 0x31, 0x6c, 0xd2, 0x80, 0xe9, 0xd0, 0xf4, 0x2b, 0x6d, 0x90, - 0x85, 0x7e, 0x64, 0x07, 0x9f, 0x15, 0x8b, 0x31, 0x12, 0xd8, 0x45, 0x94, 0x6c, 0xc3, 0x45, 0x11, - 0x57, 0x6d, 0x36, 0x28, 0x96, 0x4e, 0xab, 0x2c, 0x1b, 0x7d, 0x71, 0xa9, 0x27, 0x26, 0x1e, 0x42, - 0x25, 0x72, 0xd6, 0x1d, 0x39, 0xf2, 0xac, 0x1b, 0x89, 0xe9, 0x1e, 0x4d, 0x1b, 0xd3, 0xdd, 0x35, - 0x61, 0x4e, 0x74, 0x1c, 0x2d, 0x3d, 0x05, 0xc7, 0xd1, 0xbf, 0x37, 0xc6, 0x96, 0x47, 0x2c, 0x17, - 0x32, 0x53, 0x5a, 0xf9, 0x8c, 0x14, 0xd7, 0x60, 0x52, 0x69, 0xe5, 0x53, 0xd5, 0x47, 0x09, 0x39, - 0x46, 0x08, 0xb3, 0xb4, 0xb8, 0xe5, 0x7a, 0x58, 0xdc, 0xda, 0x70, 0x36, 0x68, 0xfa, 0x5b, 0x5e, - 0xc7, 0x0f, 0x16, 0xa9, 0x17, 0x9c, 0xc8, 0x68, 0xce, 0xf5, 0x95, 0xad, 0xb5, 0x6a, 0x9c, 0x0a, - 0x26, 0x91, 0x66, 0xd3, 0x36, 0x68, 0xfa, 0x95, 0x66, 0xd3, 0xbd, 0xaf, 0xf2, 0xb9, 0x84, 0x66, - 0x17, 0x69, 0x50, 0xd1, 0xd3, 0x76, 0x6b, 0xad, 0xda, 0x03, 0x13, 0x0f, 0xa1, 0x42, 0xd6, 0xf9, - 0x57, 0xdd, 0xb1, 0x9a, 0x76, 0xdd, 0x0a, 0x78, 0x3e, 0x28, 0x2e, 0xbb, 0xc5, 0x9a, 0xd0, 0xd9, - 0x1f, 0xb6, 0xd6, 0xaa, 0x71, 0x14, 0x4c, 0xaa, 0xa7, 0x6c, 0x38, 0x23, 0x43, 0xb4, 0x6f, 0x27, - 0x98, 0xb6, 0x46, 0x9f, 0xac, 0x69, 0xab, 0xd4, 0xdf, 0x72, 0x87, 0xf4, 0xcb, 0x3d, 0xb6, 0x00, - 0xfa, 0x58, 0xee, 0x75, 0x98, 0xd2, 0x1a, 0x96, 0x9c, 0xc1, 0x63, 0x7d, 0x47, 0xaa, 0x57, 0xa2, - 0x14, 0x30, 0x4e, 0xf2, 0xf4, 0x9d, 0x04, 0x7f, 0x3b, 0x03, 0xd3, 0xac, 0x11, 0x95, 0x60, 0x97, - 0x3a, 0xef, 0x72, 0x2d, 0x49, 0x3d, 0x81, 0x6a, 0x0d, 0xb2, 0xa3, 0x2b, 0x31, 0x1e, 0xa2, 0xc3, - 0xf5, 0x61, 0x36, 0x0e, 0xc6, 0xae, 0x46, 0xb1, 0x4d, 0x2f, 0x2c, 0x93, 0x23, 0x30, 0xd9, 0xf7, - 0xa6, 0x57, 0x89, 0x91, 0xc0, 0x2e, 0xa2, 0xa9, 0xe4, 0xec, 0xc5, 0x45, 0x38, 0x9f, 0xf8, 0xa9, - 0x7d, 0x09, 0xeb, 0xef, 0x00, 0x4c, 0x88, 0x2e, 0x1c, 0xa4, 0x57, 0x65, 0x54, 0xd7, 0xce, 0x9d, - 0xfa, 0xbd, 0x82, 0x71, 0xc4, 0xc8, 0x9f, 0xe2, 0x11, 0xa3, 0xc7, 0xf6, 0x53, 0x78, 0x52, 0xdb, - 0x4f, 0x71, 0x98, 0xdb, 0xcf, 0x48, 0xba, 0xed, 0x67, 0x68, 0x8e, 0xa1, 0x09, 0xd2, 0xb3, 0x34, - 0x78, 0xe9, 0x99, 0xbc, 0xc9, 0xc1, 0xe9, 0x6f, 0x72, 0xbf, 0x95, 0x24, 0x55, 0xc7, 0xd2, 0xbe, - 0x31, 0x1b, 0x11, 0x09, 0x43, 0x92, 0xa8, 0xe3, 0xc3, 0x90, 0xa8, 0x03, 0x11, 0x8a, 0xbf, 0x94, - 0x81, 0x12, 0x5a, 0x01, 0xe5, 0x11, 0x00, 0xe4, 0x35, 0xc8, 0x77, 0x1c, 0x5b, 0x59, 0x6d, 0x2e, - 0x29, 0xad, 0xf4, 0xb6, 0x63, 0x07, 0x8f, 0x1f, 0xce, 0x4e, 0x6a, 0x44, 0xca, 0x4a, 0x90, 0xe3, - 0x92, 0x0a, 0x4c, 0x71, 0x4f, 0x68, 0x9f, 0x47, 0x09, 0x30, 0x80, 0x0c, 0xa8, 0xd7, 0x0e, 0x98, - 0x18, 0x05, 0x63, 0x1c, 0xbf, 0xfc, 0xe5, 0xa2, 0x7c, 0x7c, 0x62, 0x00, 0xb7, 0x97, 0x83, 0xce, - 0xee, 0xd9, 0xbf, 0xf1, 0xe9, 0x22, 0x64, 0xeb, 0xdb, 0x5c, 0x11, 0x2f, 0x84, 0x69, 0x2d, 0x97, - 0x16, 0x30, 0x5b, 0xdf, 0x26, 0x2f, 0xc3, 0xa8, 0xbc, 0x16, 0x55, 0xa9, 0x1f, 0x39, 0x5b, 0x79, - 0x67, 0xea, 0xa3, 0x86, 0x0e, 0xfd, 0xfa, 0x71, 0xb0, 0xa1, 0x32, 0xf1, 0xd1, 0xfb, 0x20, 0x3b, - 0x56, 0xf6, 0xa7, 0x2b, 0xbf, 0x6a, 0xa4, 0x9f, 0x85, 0xa8, 0x13, 0x6f, 0x77, 0x6e, 0xd9, 0x74, - 0xa7, 0xc9, 0x7f, 0x52, 0x84, 0x0b, 0xc9, 0xcf, 0xa2, 0x7c, 0x60, 0x16, 0x83, 0x98, 0xdb, 0xb9, - 0xc4, 0xb9, 0xfd, 0x21, 0x18, 0x11, 0xf1, 0xbc, 0x2a, 0x69, 0x16, 0xb7, 0xdf, 0x8b, 0x6f, 0xf1, - 0x51, 0xc1, 0xc8, 0x75, 0x20, 0xe2, 0x6e, 0x60, 0xd1, 0xed, 0x38, 0xc1, 0x26, 0xf5, 0x90, 0x5a, - 0x75, 0x19, 0xdb, 0xa1, 0xaf, 0x4f, 0xd6, 0xbb, 0x30, 0x30, 0xa1, 0x16, 0x4f, 0xf3, 0xd5, 0x15, - 0xd0, 0x68, 0xa6, 0xf9, 0x3a, 0x2c, 0x36, 0x6a, 0xd8, 0x87, 0xc3, 0x6f, 0x74, 0x1b, 0x55, 0xde, - 0x1c, 0xf4, 0x7b, 0x39, 0x1f, 0x60, 0xcb, 0xca, 0x69, 0xae, 0x9c, 0x3f, 0xce, 0xc3, 0xd9, 0x84, - 0x77, 0x4b, 0xa3, 0xb2, 0x3b, 0x73, 0x0c, 0xd9, 0xdd, 0xd4, 0x9d, 0x94, 0x3a, 0xeb, 0xb0, 0x6a, - 0xcf, 0x21, 0x3d, 0xf4, 0x8d, 0x0c, 0x9c, 0xe3, 0xe1, 0xac, 0xea, 0xc6, 0x43, 0x56, 0x91, 0x86, - 0xdc, 0xd7, 0x0f, 0x33, 0xe4, 0xfa, 0x73, 0x6c, 0x64, 0xd9, 0xea, 0xbd, 0x9a, 0x40, 0x21, 0x0c, - 0xed, 0x4b, 0x82, 0x62, 0x22, 0x57, 0xb2, 0x08, 0xa0, 0x9f, 0x67, 0x51, 0x6b, 0xf8, 0x45, 0x76, - 0xf4, 0xd0, 0xef, 0xb7, 0xf8, 0x8f, 0x79, 0xa8, 0xac, 0xd1, 0xd1, 0xdc, 0x60, 0x65, 0x54, 0x23, - 0x5f, 0xeb, 0x7e, 0x2c, 0xe3, 0x73, 0x03, 0x7d, 0x8c, 0xf6, 0xf8, 0x53, 0x3e, 0xdd, 0x9c, 0xfa, - 0xcd, 0x1c, 0x4c, 0x46, 0xc7, 0x90, 0xbc, 0x04, 0xc5, 0xb6, 0x47, 0x77, 0xec, 0x07, 0x72, 0x2e, - 0x85, 0x4f, 0xbf, 0xf3, 0x52, 0x94, 0x50, 0xf2, 0x4e, 0xcc, 0x01, 0x7d, 0x21, 0x4d, 0x5c, 0x8d, - 0x72, 0x53, 0xee, 0x91, 0x0e, 0xe0, 0x1d, 0xfd, 0x5a, 0x50, 0x6e, 0xf0, 0xbc, 0xa2, 0x2f, 0x05, - 0x91, 0xcf, 0x41, 0xa9, 0xe6, 0x51, 0x2b, 0xa0, 0xf5, 0x85, 0x03, 0x69, 0x69, 0xfc, 0x89, 0xe3, - 0xcd, 0xd1, 0x2d, 0xbb, 0x45, 0xc3, 0xa5, 0xb7, 0xa8, 0x88, 0x60, 0x48, 0x8f, 0xdf, 0xaf, 0xed, - 0x04, 0xd4, 0xe3, 0xc9, 0x38, 0xa4, 0x39, 0x31, 0xbc, 0x5f, 0xd3, 0x10, 0x34, 0xb0, 0xca, 0x7f, - 0x58, 0x04, 0x08, 0x5f, 0x91, 0x66, 0x12, 0x87, 0x3a, 0xf5, 0xb6, 0x6b, 0x3b, 0x4a, 0x85, 0xd5, - 0xb3, 0x63, 0x59, 0x96, 0xa3, 0xc6, 0x20, 0x3b, 0x50, 0x94, 0x4f, 0xc9, 0x67, 0xd3, 0xba, 0x4b, - 0x54, 0x3f, 0xb6, 0xc0, 0x29, 0x89, 0x55, 0x2e, 0xfe, 0x47, 0x49, 0x9d, 0xcd, 0x1a, 0x8f, 0x36, - 0xc2, 0x24, 0x03, 0xba, 0x77, 0x91, 0x97, 0xa2, 0x84, 0x46, 0xf2, 0x67, 0xe7, 0x8f, 0xcc, 0x9f, - 0x8d, 0x50, 0x12, 0xf7, 0x40, 0x37, 0xe8, 0x41, 0x7f, 0xc7, 0x6e, 0x71, 0xc5, 0xa9, 0xea, 0x62, - 0x48, 0x86, 0xd1, 0xf4, 0x15, 0x7a, 0x7f, 0x79, 0x29, 0x45, 0x1a, 0x15, 0x55, 0x8c, 0x21, 0x19, - 0x23, 0x15, 0xef, 0x48, 0xcf, 0x54, 0xbc, 0x3b, 0x31, 0x15, 0x30, 0xd5, 0x48, 0x1c, 0x22, 0x6f, - 0xdf, 0xeb, 0x4e, 0x5d, 0x8b, 0x83, 0x78, 0xbe, 0xbc, 0x8f, 0x5d, 0xf8, 0x4d, 0x98, 0xa8, 0x59, - 0x8b, 0x94, 0x55, 0xb4, 0x6b, 0x56, 0x40, 0xe5, 0x39, 0xba, 0x9f, 0x24, 0xec, 0x8b, 0x15, 0xa3, - 0x3e, 0x46, 0xc9, 0xa5, 0x13, 0x79, 0x37, 0x60, 0x54, 0xcd, 0x64, 0xf2, 0x82, 0x51, 0x2f, 0xb4, - 0x8d, 0xb1, 0xc1, 0xe5, 0x44, 0x8e, 0xbe, 0x55, 0xfd, 0x2c, 0x23, 0xd6, 0xa7, 0xe0, 0x7c, 0x09, - 0x8a, 0x7e, 0x67, 0x87, 0xe1, 0xc5, 0x5e, 0x7b, 0xaa, 0xf2, 0x52, 0x94, 0xd0, 0xf2, 0xff, 0xca, - 0x00, 0x84, 0xb1, 0x9e, 0x6c, 0x9b, 0x6f, 0x51, 0x76, 0x72, 0xb2, 0xfd, 0x56, 0x7c, 0x9b, 0x5f, - 0x57, 0x00, 0x0c, 0x71, 0xc8, 0x6d, 0x00, 0xa6, 0x78, 0x9c, 0x24, 0xff, 0x0d, 0xbf, 0x2d, 0xbd, - 0xad, 0x2b, 0xa3, 0x41, 0x88, 0x58, 0x30, 0xa9, 0x34, 0x65, 0x49, 0xba, 0xaf, 0xa0, 0x16, 0x1e, - 0x39, 0xba, 0x19, 0x21, 0x80, 0x31, 0x82, 0xe5, 0xbf, 0x3b, 0x02, 0x53, 0xb1, 0x47, 0xf7, 0x9e, - 0xfa, 0xa7, 0xd7, 0xcc, 0x17, 0x3e, 0x72, 0x83, 0x7e, 0xe1, 0x23, 0x3f, 0x88, 0x63, 0x4f, 0xfc, - 0x15, 0x99, 0xc2, 0x20, 0x5f, 0x91, 0x59, 0x83, 0x11, 0x99, 0x4e, 0xb8, 0x3f, 0x99, 0xcb, 0x8f, - 0x57, 0xea, 0xd8, 0xa7, 0x48, 0x0c, 0x38, 0x5e, 0x32, 0x36, 0xd5, 0x3e, 0xc8, 0xc7, 0xfa, 0x4d, - 0x38, 0xd7, 0x76, 0x9b, 0x4d, 0x15, 0xed, 0xbb, 0xd4, 0x11, 0x8e, 0x91, 0x32, 0x3c, 0x42, 0xeb, - 0xc3, 0x9b, 0x09, 0x38, 0x98, 0x58, 0x33, 0x9d, 0x2c, 0xfd, 0xb7, 0x45, 0x98, 0x8c, 0x3e, 0x10, - 0xff, 0x44, 0x5e, 0x28, 0xe3, 0x97, 0x14, 0x15, 0xcf, 0x89, 0xbf, 0x50, 0xb6, 0x25, 0xcb, 0x51, - 0x63, 0x44, 0x35, 0x8a, 0xdc, 0x10, 0x34, 0x8a, 0xfc, 0x60, 0x34, 0x8a, 0x50, 0x9f, 0x2a, 0x1c, - 0xaa, 0x4f, 0xbd, 0x02, 0x23, 0x9e, 0xdb, 0xa4, 0x15, 0xdc, 0x90, 0x66, 0x01, 0x7d, 0x9b, 0x81, - 0xa2, 0x18, 0x15, 0x7c, 0xc0, 0xbe, 0xf8, 0xd1, 0x61, 0xef, 0x63, 0xcd, 0x5c, 0x85, 0x33, 0xfb, - 0xf2, 0x0e, 0xa1, 0x6a, 0x37, 0x1c, 0x2b, 0x08, 0x9f, 0x52, 0xd1, 0xde, 0xa0, 0x77, 0xe2, 0x08, - 0xd8, 0x5d, 0xe7, 0x89, 0x9c, 0xf5, 0xb5, 0xe6, 0x0d, 0x47, 0x69, 0xde, 0xe9, 0x16, 0xd6, 0x3f, - 0x1d, 0x81, 0xc9, 0xea, 0xad, 0xc8, 0xc2, 0x8a, 0xcc, 0xdc, 0xcc, 0x10, 0x66, 0x6e, 0x76, 0xd0, - 0x33, 0xf7, 0xf0, 0x93, 0xc0, 0x8b, 0x2a, 0xb4, 0x2b, 0x1f, 0xbd, 0x78, 0x34, 0xc3, 0xbb, 0x48, - 0x85, 0xed, 0xe1, 0xc2, 0x8d, 0x53, 0x25, 0x3e, 0x28, 0xf0, 0xac, 0x3e, 0xc6, 0xc6, 0x1b, 0x01, - 0x63, 0x1c, 0xbf, 0x9f, 0x15, 0xd2, 0x9f, 0x3f, 0xd1, 0x1b, 0x30, 0xc9, 0x1b, 0x29, 0x5d, 0x9d, - 0x57, 0xeb, 0x32, 0x3b, 0xbc, 0x76, 0xc5, 0xba, 0x65, 0x42, 0x97, 0x30, 0x86, 0x1d, 0x5d, 0x8f, - 0xa5, 0xd4, 0xeb, 0xf1, 0xd6, 0x09, 0xd7, 0xe3, 0x0b, 0x90, 0xab, 0x37, 0xef, 0xc9, 0xa7, 0xcc, - 0xb4, 0x0e, 0xbc, 0xb4, 0x76, 0x0b, 0x59, 0xb9, 0xb1, 0xca, 0xc6, 0x4e, 0x7f, 0x95, 0x8d, 0x1f, - 0x79, 0xbe, 0x65, 0x4a, 0x0b, 0xf5, 0x7d, 0xdb, 0x75, 0x84, 0x1f, 0xec, 0x44, 0xff, 0x4a, 0x8b, - 0x51, 0x1d, 0x23, 0xc4, 0xd2, 0x2d, 0xe1, 0x7f, 0x9d, 0x81, 0x73, 0x49, 0xb9, 0x53, 0x8e, 0xba, - 0x90, 0x7f, 0x15, 0x46, 0x45, 0x22, 0x95, 0xd5, 0xba, 0xbc, 0x63, 0xd2, 0xdf, 0x2f, 0xc8, 0xad, - 0x2e, 0xa1, 0xc6, 0x20, 0xd4, 0x88, 0x3e, 0x1e, 0x50, 0x14, 0xbc, 0x3e, 0xe7, 0x84, 0x81, 0x9f, - 0xe5, 0xdf, 0xc9, 0xc0, 0xb8, 0x99, 0xeb, 0xe4, 0x18, 0x6f, 0xbf, 0xed, 0x43, 0x89, 0x77, 0xc6, - 0x8a, 0xe7, 0xb6, 0xd2, 0x2b, 0xde, 0x77, 0x14, 0x29, 0x31, 0x7f, 0x84, 0xfc, 0xd1, 0x85, 0x18, - 0xb2, 0x2a, 0xff, 0x02, 0x8c, 0xea, 0x28, 0x94, 0x23, 0xce, 0x77, 0xf3, 0x50, 0x72, 0xdb, 0x32, - 0xb6, 0x24, 0x9e, 0xb6, 0xee, 0xa6, 0x02, 0x60, 0x88, 0xc3, 0x64, 0x96, 0x18, 0xed, 0x98, 0x8b, - 0x66, 0x24, 0xa5, 0xe6, 0x3f, 0xcb, 0x42, 0xb1, 0x4a, 0x1d, 0xdf, 0xf5, 0xc8, 0xdb, 0xc6, 0x0a, - 0x17, 0x22, 0xfb, 0x23, 0xc7, 0x33, 0x25, 0x89, 0xd0, 0x0d, 0x36, 0xf9, 0x42, 0xf3, 0x50, 0x58, - 0x66, 0xac, 0xde, 0x1d, 0xc8, 0xfb, 0x6d, 0x3a, 0x80, 0x00, 0x7a, 0xd1, 0xe2, 0x6a, 0x9b, 0xd6, - 0xc2, 0xd1, 0x64, 0xbf, 0x90, 0xd3, 0x27, 0x8e, 0x7e, 0x4a, 0x5c, 0xcc, 0xb4, 0x95, 0xd4, 0x9c, - 0x0e, 0x7f, 0x50, 0xfc, 0x8f, 0xd9, 0xe1, 0x97, 0x23, 0xae, 0xd9, 0x7e, 0x40, 0x3e, 0xdf, 0xd5, - 0x91, 0x73, 0xc7, 0xeb, 0x48, 0x56, 0x9b, 0x77, 0xa3, 0x5e, 0x44, 0xaa, 0x24, 0x12, 0xe7, 0x53, - 0xb0, 0x03, 0xda, 0x52, 0x96, 0xcc, 0x4f, 0xa5, 0xfd, 0xb6, 0x70, 0x62, 0xac, 0x32, 0xb2, 0x28, - 0xa8, 0x97, 0xbf, 0x5f, 0x54, 0xdf, 0xc4, 0x3a, 0x96, 0x7c, 0x29, 0x03, 0xe3, 0x75, 0xda, 0xa6, - 0x4e, 0x9d, 0x3a, 0x35, 0x9b, 0xaa, 0x7c, 0x22, 0xab, 0x29, 0x05, 0xec, 0x92, 0x22, 0x69, 0x04, - 0x6a, 0x2d, 0x19, 0x6c, 0x30, 0xc2, 0x94, 0xb8, 0x30, 0x1a, 0x08, 0xb7, 0x00, 0xf5, 0xf9, 0x95, - 0xd4, 0xbe, 0x35, 0x86, 0x06, 0x2e, 0x49, 0xa3, 0x66, 0x42, 0x9a, 0x30, 0x1a, 0x44, 0x13, 0xcc, - 0xa7, 0xb0, 0x84, 0xe9, 0xf0, 0x39, 0x7e, 0xa8, 0xd5, 0xe1, 0x72, 0x9a, 0x03, 0xb9, 0x0e, 0x44, - 0xa6, 0x68, 0x5d, 0xb1, 0xec, 0x26, 0xad, 0xa3, 0xdb, 0x71, 0xea, 0xd2, 0xf2, 0xa8, 0x2f, 0xe2, - 0x96, 0xbb, 0x30, 0x30, 0xa1, 0x16, 0xb9, 0x02, 0xe3, 0x9c, 0xff, 0x42, 0xc7, 0x37, 0xc2, 0x23, - 0x74, 0x27, 0x2f, 0x1b, 0x30, 0x8c, 0x60, 0x46, 0x12, 0xf1, 0x17, 0x0f, 0x4d, 0xc4, 0xbf, 0x06, - 0xe7, 0x3c, 0xba, 0x6f, 0xb3, 0x3d, 0xe8, 0x9a, 0xed, 0x07, 0xae, 0x77, 0xc0, 0x7d, 0x11, 0x64, - 0xb2, 0x36, 0x11, 0xc8, 0x93, 0x00, 0xc7, 0xc4, 0x5a, 0xe4, 0xbb, 0x19, 0x98, 0x68, 0xba, 0x8d, - 0x86, 0xed, 0x34, 0x84, 0x95, 0x5b, 0x5e, 0xd1, 0xdd, 0x1d, 0x84, 0x9c, 0x98, 0x5b, 0x33, 0x29, - 0x0b, 0x45, 0x43, 0x5f, 0x4a, 0x46, 0x60, 0x18, 0x6d, 0xc4, 0xc5, 0x4f, 0x01, 0xe9, 0xae, 0xdb, - 0xd7, 0xe6, 0xfa, 0x80, 0x6d, 0x47, 0xa1, 0x18, 0x21, 0xbb, 0x5a, 0x3c, 0x09, 0xe9, 0x90, 0x66, - 0x09, 0x1f, 0x2e, 0x98, 0xfe, 0x5b, 0x06, 0x46, 0x64, 0xdc, 0x5b, 0x24, 0x1a, 0x31, 0x33, 0xf4, - 0x68, 0xc4, 0x25, 0x28, 0xb4, 0x5d, 0x2f, 0x50, 0xcb, 0x74, 0x36, 0x59, 0xc7, 0x11, 0x2f, 0xf2, - 0xb8, 0x5e, 0x10, 0x0a, 0x21, 0xf6, 0xcb, 0x47, 0x51, 0x99, 0xed, 0x79, 0x2a, 0x77, 0xc9, 0x66, - 0xdc, 0xd3, 0x43, 0xe5, 0x37, 0xd9, 0x0c, 0xf3, 0x9b, 0x6c, 0x96, 0x1f, 0xe5, 0x61, 0xba, 0xda, - 0xb4, 0x6a, 0x7b, 0xe6, 0x61, 0xe4, 0x4d, 0x98, 0xf0, 0xed, 0x86, 0x63, 0x3b, 0x0d, 0x69, 0x2c, - 0xca, 0xf4, 0x6d, 0xe1, 0xad, 0x9a, 0xf5, 0x31, 0x4a, 0x6e, 0x60, 0x79, 0x77, 0x0c, 0x6b, 0x44, - 0xee, 0x54, 0xac, 0x11, 0x11, 0x8f, 0x93, 0x7c, 0x5a, 0x8f, 0x93, 0x78, 0xbf, 0x9f, 0xc8, 0x34, - 0x55, 0x78, 0x0a, 0x62, 0x0c, 0x7e, 0x1e, 0xc6, 0xf8, 0xb7, 0x56, 0xd9, 0xc6, 0x14, 0xbd, 0x55, - 0xcf, 0x1c, 0x75, 0xab, 0xce, 0x74, 0x51, 0xbb, 0xa6, 0x35, 0x38, 0xad, 0xbd, 0xac, 0xd6, 0x5c, - 0x07, 0x39, 0xa4, 0xfc, 0xcf, 0x33, 0x92, 0xfe, 0xd6, 0xae, 0x47, 0xad, 0x3a, 0xa9, 0xc2, 0xf9, - 0x16, 0xf5, 0x7d, 0xab, 0x41, 0x2b, 0x8d, 0x86, 0x47, 0x1b, 0x5c, 0xbb, 0xbb, 0xa1, 0x35, 0x45, - 0x9d, 0xf4, 0x7b, 0x3d, 0x09, 0x09, 0x93, 0xeb, 0x92, 0xb7, 0xe0, 0xb9, 0x6d, 0xcf, 0xb5, 0xea, - 0x35, 0x8b, 0x29, 0x18, 0x1c, 0x63, 0xcb, 0x95, 0x4e, 0x4f, 0x32, 0x79, 0xf3, 0x8f, 0x4b, 0xc2, - 0xcf, 0x2d, 0xf4, 0x42, 0xc4, 0xde, 0x34, 0xca, 0xff, 0x3b, 0x0f, 0xe3, 0xe2, 0x2b, 0xa4, 0x6b, - 0x6f, 0xd4, 0x2d, 0x37, 0x73, 0xea, 0x6e, 0xb9, 0xb7, 0x01, 0x7c, 0xde, 0x9e, 0xfe, 0x97, 0x2a, - 0xbf, 0x61, 0xa8, 0xea, 0xca, 0x68, 0x10, 0xea, 0x27, 0xed, 0xc6, 0x2b, 0x30, 0x22, 0x07, 0x43, - 0x9a, 0x11, 0x34, 0xaa, 0xec, 0x3d, 0x54, 0x70, 0xf2, 0x09, 0x18, 0xb3, 0x82, 0xc0, 0xaa, 0xed, - 0xb6, 0xe4, 0x9b, 0xc4, 0x11, 0xef, 0xa2, 0x4a, 0x08, 0x42, 0x13, 0x8f, 0x3f, 0x68, 0xde, 0x74, - 0x6b, 0x7b, 0x7e, 0xd7, 0x83, 0xe6, 0xbc, 0x14, 0x25, 0x94, 0xb4, 0xa0, 0x18, 0xf0, 0xc9, 0x25, - 0x7d, 0x6d, 0x96, 0x53, 0xae, 0x7a, 0x31, 0x53, 0x43, 0x76, 0xe2, 0x37, 0x4a, 0x26, 0x8c, 0x9d, - 0xcf, 0xd7, 0x8a, 0xb4, 0x3c, 0xa7, 0x65, 0x27, 0x16, 0x9e, 0xb1, 0xeb, 0xf1, 0xdf, 0x28, 0x99, - 0x94, 0xff, 0x47, 0x0e, 0x48, 0x35, 0xb0, 0x9c, 0xba, 0xe5, 0xd5, 0x6f, 0x5c, 0xd1, 0x09, 0x73, - 0xd8, 0xa9, 0x40, 0x38, 0x73, 0x08, 0xf9, 0x9f, 0x62, 0xf2, 0xa9, 0x6b, 0xc6, 0x35, 0x57, 0xbc, - 0x05, 0x2a, 0x64, 0x8c, 0x90, 0x3a, 0x28, 0xb9, 0x90, 0x8d, 0xee, 0x03, 0xdb, 0x47, 0xba, 0x0e, - 0x6c, 0x8f, 0x1f, 0xce, 0xfe, 0xd8, 0x8d, 0xce, 0x36, 0xf5, 0x1c, 0x1a, 0x50, 0x5f, 0x79, 0x37, - 0x24, 0x9e, 0xe7, 0x9e, 0xb4, 0x5f, 0xfb, 0x0e, 0x4c, 0xb4, 0xad, 0xa0, 0xa6, 0x33, 0x72, 0xc8, - 0x49, 0xfc, 0x29, 0xa5, 0x45, 0x6d, 0x9a, 0xc0, 0xc7, 0x0f, 0x67, 0xff, 0x4a, 0x18, 0x44, 0xa9, - 0xcf, 0x3c, 0xf3, 0xed, 0xbd, 0xc6, 0x7c, 0x70, 0xd0, 0xa6, 0xfe, 0x1c, 0x47, 0xe7, 0xf7, 0x60, - 0x51, 0xb2, 0xe4, 0x35, 0x80, 0xa6, 0xbd, 0x4f, 0xc5, 0x09, 0x32, 0xee, 0x76, 0xb0, 0xa6, 0x21, - 0x68, 0x60, 0x95, 0x7f, 0x31, 0x03, 0x52, 0xf7, 0x21, 0xf7, 0x01, 0x6a, 0xae, 0x53, 0xb7, 0xcd, - 0xb4, 0x87, 0x8b, 0xa9, 0x92, 0x5f, 0x08, 0x5a, 0x61, 0x1b, 0x74, 0x91, 0x8f, 0x06, 0xab, 0xf2, - 0x3c, 0x8c, 0x8b, 0x26, 0xc8, 0x77, 0x29, 0x66, 0xa1, 0x60, 0x35, 0x9b, 0xee, 0x7d, 0xde, 0x86, - 0x82, 0xd8, 0xef, 0xb9, 0x9b, 0x3b, 0x8a, 0xf2, 0xf2, 0x5f, 0x14, 0xe0, 0x82, 0x0c, 0x59, 0xbd, - 0xea, 0xd9, 0xf5, 0x27, 0x7a, 0x31, 0x11, 0x3a, 0x05, 0x64, 0x7b, 0x3a, 0x05, 0x84, 0xbb, 0x74, - 0xea, 0xb7, 0xb6, 0x8c, 0xcf, 0x3e, 0xdc, 0xba, 0xa6, 0x6f, 0x4b, 0xf2, 0x47, 0xde, 0x96, 0xbc, - 0xa4, 0xbd, 0x47, 0x62, 0xb7, 0x10, 0x3d, 0xbd, 0x3f, 0x8a, 0x87, 0xda, 0x7c, 0x23, 0x21, 0xeb, - 0x23, 0x83, 0x09, 0x59, 0x7f, 0x09, 0x8a, 0x56, 0xdb, 0xbe, 0x8d, 0x6b, 0xd2, 0xfc, 0x1a, 0xbe, - 0xb1, 0xbe, 0xb9, 0x7a, 0x1b, 0xd7, 0x50, 0x42, 0xa3, 0x9e, 0x8a, 0xa5, 0xb4, 0x9e, 0x8a, 0xc9, - 0x93, 0xec, 0xb4, 0xdc, 0xb6, 0x6a, 0x70, 0xa6, 0x6b, 0xb8, 0x07, 0xee, 0x7f, 0xf0, 0x7e, 0x9e, - 0x71, 0xf1, 0xec, 0x36, 0x7d, 0xa2, 0xcb, 0xe8, 0x93, 0x30, 0x21, 0xfc, 0xa7, 0x24, 0x44, 0xaa, - 0x52, 0xa1, 0xfb, 0xab, 0x09, 0xc4, 0x28, 0x2e, 0x59, 0xe5, 0x93, 0xa3, 0xef, 0xbb, 0x3e, 0x90, - 0xf3, 0x87, 0x69, 0x7b, 0x92, 0x00, 0xf9, 0x28, 0x8c, 0xf1, 0xf6, 0x8b, 0xde, 0x96, 0x9e, 0x83, - 0x3c, 0xad, 0xd1, 0x72, 0x58, 0x8c, 0x26, 0x4e, 0x34, 0x04, 0xb1, 0x90, 0x36, 0x04, 0xb1, 0x6b, - 0x2c, 0x4e, 0x6b, 0xb6, 0x7d, 0x29, 0x07, 0x25, 0xed, 0xff, 0x4b, 0x3e, 0x07, 0xe3, 0xc2, 0x1b, - 0xe7, 0x24, 0x27, 0x3f, 0x6e, 0x71, 0x17, 0xbe, 0x3d, 0xca, 0x4d, 0xc0, 0x24, 0xc6, 0xc3, 0xd3, - 0x79, 0xae, 0x68, 0x83, 0x41, 0xb6, 0xff, 0xf0, 0xf4, 0x18, 0x09, 0xec, 0x22, 0x4a, 0xea, 0x30, - 0x25, 0xca, 0x42, 0x7f, 0x87, 0x5c, 0xdf, 0x51, 0x45, 0x8b, 0x51, 0x0a, 0x18, 0x27, 0x49, 0xae, - 0x03, 0x51, 0xbe, 0x6c, 0xd5, 0x3d, 0xbb, 0xcd, 0xdf, 0x3a, 0x3f, 0x88, 0x5b, 0x9f, 0x56, 0xbb, - 0x30, 0x30, 0xa1, 0x56, 0xf9, 0x3b, 0xa3, 0xa0, 0x0d, 0x5c, 0xa7, 0x6c, 0x79, 0x48, 0x4e, 0x06, - 0x94, 0x3d, 0x51, 0x32, 0xa0, 0xeb, 0x50, 0xd2, 0xc9, 0xb6, 0x64, 0x97, 0xbf, 0xd0, 0xe3, 0x89, - 0x63, 0x81, 0x24, 0x53, 0xaf, 0xaa, 0x9f, 0x18, 0x56, 0x27, 0xcb, 0x30, 0x22, 0xd2, 0x38, 0xa8, - 0x5c, 0x87, 0x17, 0x93, 0x28, 0x89, 0xac, 0x0f, 0x46, 0xe6, 0x15, 0x51, 0x05, 0x55, 0xdd, 0xa4, - 0x34, 0x4f, 0x85, 0x21, 0xa4, 0x79, 0xfa, 0x66, 0x72, 0xa6, 0xae, 0xad, 0xf4, 0xd6, 0xcf, 0x0f, - 0x56, 0x8e, 0xae, 0xa4, 0x54, 0x55, 0xa3, 0xa7, 0xfd, 0x42, 0x60, 0x29, 0x65, 0x7a, 0x29, 0x38, - 0x76, 0x7a, 0xa9, 0xb1, 0x93, 0xa7, 0x97, 0x4a, 0x9f, 0x96, 0xa8, 0x0a, 0xb0, 0x65, 0xb7, 0x94, - 0xeb, 0xf6, 0x8b, 0x50, 0xe0, 0x4f, 0xfb, 0xc5, 0xb3, 0xcf, 0x08, 0x9f, 0x62, 0x01, 0x23, 0x97, - 0x21, 0xef, 0x07, 0x6e, 0x3b, 0x6e, 0x2d, 0xa9, 0x06, 0x6e, 0x1b, 0x39, 0xa4, 0xfc, 0xa5, 0x22, - 0x8c, 0xa8, 0x13, 0x9e, 0x6f, 0x58, 0xeb, 0x53, 0x3f, 0x86, 0x2f, 0x89, 0x1e, 0x69, 0xb4, 0x8f, - 0x1e, 0xcb, 0xb2, 0xa7, 0x7e, 0x2c, 0xdb, 0x83, 0x62, 0x9b, 0x1f, 0x38, 0xa4, 0x80, 0xba, 0x9a, - 0x9e, 0x37, 0x27, 0x27, 0xf4, 0x0a, 0xf1, 0x3f, 0x4a, 0x16, 0xe4, 0x5d, 0x98, 0xf0, 0x68, 0xe0, - 0x1d, 0x44, 0xce, 0x80, 0x03, 0x09, 0x3a, 0xe5, 0x66, 0x56, 0x34, 0x69, 0x63, 0x94, 0x15, 0x69, - 0x43, 0xc9, 0x53, 0xe1, 0x8e, 0xe9, 0xb3, 0xb6, 0xea, 0xc8, 0x49, 0x21, 0xb2, 0xf5, 0x4f, 0x0c, - 0x99, 0x08, 0x2b, 0xcc, 0x1a, 0xb5, 0xfc, 0xe0, 0xa6, 0x7a, 0x81, 0x76, 0xd4, 0xb4, 0xc2, 0x68, - 0x10, 0x9a, 0x78, 0xe4, 0x1e, 0x40, 0xbd, 0x79, 0x4f, 0x76, 0xa6, 0x3c, 0x39, 0x0c, 0xe0, 0x9e, - 0x8a, 0x5b, 0xa1, 0x96, 0x34, 0x61, 0x34, 0x98, 0x94, 0xff, 0x7b, 0x06, 0xa6, 0xe3, 0x33, 0x87, - 0xec, 0x41, 0xce, 0xf7, 0x54, 0xce, 0xf9, 0xcd, 0xc1, 0x4d, 0x49, 0x79, 0xab, 0xcd, 0x63, 0xab, - 0xaa, 0x5e, 0x0d, 0x19, 0x17, 0xb6, 0x52, 0xf5, 0xc3, 0x6f, 0xc6, 0x4a, 0x5d, 0xa2, 0x7e, 0x80, - 0x1c, 0x42, 0xd6, 0x4c, 0x7b, 0x88, 0xb0, 0x95, 0xcd, 0x25, 0xd9, 0x43, 0x9e, 0x8b, 0xf3, 0x4b, - 0xb2, 0x86, 0x94, 0xbf, 0x96, 0x83, 0x0b, 0xc9, 0x0d, 0x23, 0x6f, 0xc0, 0xa4, 0xbe, 0x35, 0x3c, - 0x30, 0x72, 0x44, 0x69, 0x5f, 0x97, 0xa5, 0x08, 0x14, 0x63, 0xd8, 0xe4, 0x35, 0x6e, 0x41, 0x60, - 0xdb, 0xa0, 0xf2, 0x34, 0x2a, 0x45, 0x0e, 0xff, 0x12, 0x82, 0x06, 0x16, 0xa9, 0xc0, 0x94, 0xfc, - 0x15, 0x79, 0x90, 0xba, 0x14, 0xfa, 0xfe, 0x2c, 0x46, 0xc1, 0x18, 0xc7, 0x27, 0xaf, 0xc0, 0x08, - 0x53, 0x60, 0x94, 0x5f, 0x9e, 0x61, 0x1e, 0x5c, 0x12, 0xc5, 0xa8, 0xe0, 0xe4, 0x0a, 0x8c, 0xb3, - 0x7f, 0x23, 0x29, 0x3e, 0x8d, 0xcb, 0xbd, 0x25, 0x03, 0x86, 0x11, 0xcc, 0xf0, 0x8d, 0xcd, 0x62, - 0x98, 0xa3, 0xda, 0x74, 0x08, 0x60, 0x1f, 0xdf, 0xf1, 0x29, 0x5a, 0xf7, 0x97, 0xd4, 0xab, 0xc7, - 0x86, 0xf5, 0xe5, 0xb6, 0x86, 0xa0, 0x81, 0x55, 0xfe, 0x61, 0x06, 0x26, 0x22, 0xb2, 0x83, 0xec, - 0x40, 0x6e, 0xef, 0x8a, 0xba, 0xdf, 0xba, 0x31, 0xc0, 0x07, 0x39, 0xc5, 0xac, 0xbb, 0x71, 0xc5, - 0x47, 0xc6, 0x80, 0xbc, 0xa3, 0xaf, 0xd2, 0xb2, 0xa9, 0x6f, 0xfa, 0x0d, 0xdb, 0x8d, 0xb4, 0xe7, - 0x45, 0x2f, 0xd3, 0xfe, 0xe5, 0x24, 0x4c, 0xc5, 0x36, 0x85, 0x63, 0x78, 0x96, 0xbc, 0x16, 0x31, - 0x47, 0x75, 0x4f, 0xa6, 0x04, 0x4b, 0x12, 0x69, 0x88, 0xde, 0xcb, 0xa5, 0x7d, 0xa0, 0xae, 0xdb, - 0x08, 0x1a, 0xeb, 0xbe, 0x2f, 0x65, 0x60, 0x9c, 0x51, 0xba, 0xeb, 0x7a, 0x7b, 0x3b, 0x4d, 0xf7, - 0xbe, 0x14, 0xe7, 0xeb, 0x69, 0x2c, 0xa3, 0x21, 0x35, 0x7d, 0xc1, 0xce, 0x5f, 0x02, 0x30, 0x00, - 0x18, 0x61, 0x4a, 0x6a, 0x90, 0xdf, 0x0d, 0x82, 0xb6, 0x94, 0xe9, 0x29, 0x8c, 0xc3, 0xd7, 0xb6, - 0xb6, 0x36, 0x15, 0x53, 0x9e, 0x0d, 0x9e, 0x15, 0x20, 0x27, 0x4e, 0xee, 0x43, 0xc9, 0xba, 0xef, - 0xaf, 0x59, 0xad, 0xed, 0xba, 0x25, 0xbd, 0xba, 0xd3, 0x18, 0x80, 0xef, 0x56, 0x05, 0x29, 0xc5, - 0x4e, 0x98, 0x7c, 0x54, 0x29, 0x86, 0xbc, 0x88, 0x07, 0xc5, 0x5a, 0xc7, 0x0f, 0xdc, 0x96, 0xdc, - 0x09, 0x52, 0xec, 0xcf, 0x8b, 0x9c, 0x8e, 0x62, 0x29, 0x42, 0x4f, 0xcc, 0x22, 0x94, 0x9c, 0x48, - 0x03, 0x0a, 0x7b, 0xd6, 0xce, 0x9e, 0x4a, 0x3b, 0xbb, 0x32, 0x98, 0xb7, 0xac, 0x84, 0xb4, 0xe0, - 0x25, 0x28, 0xe8, 0xb3, 0xa1, 0x73, 0xac, 0xc0, 0x97, 0x4e, 0xad, 0xcb, 0xe9, 0xb2, 0xf8, 0x47, - 0x86, 0x8e, 0x15, 0x20, 0x27, 0xce, 0xbe, 0x86, 0x5f, 0xb8, 0xc8, 0xc8, 0x9c, 0x95, 0xb4, 0x97, - 0x15, 0xe6, 0xd7, 0xf0, 0x12, 0x14, 0xf4, 0xd9, 0x1c, 0x71, 0x55, 0xda, 0x4c, 0xa9, 0x2a, 0xa7, - 0x98, 0x23, 0xf1, 0x0c, 0x9c, 0x62, 0x8e, 0xe8, 0x52, 0x0c, 0x79, 0x91, 0xb7, 0x20, 0xd7, 0x74, - 0x1b, 0xe9, 0x5f, 0x5b, 0x0b, 0x5f, 0xe1, 0x12, 0x0b, 0x7d, 0xcd, 0x6d, 0x20, 0xa3, 0x4c, 0x7e, - 0x25, 0x03, 0x93, 0xd6, 0xbb, 0x1d, 0x4f, 0x58, 0x64, 0xae, 0x75, 0xb6, 0x7d, 0xe9, 0x7c, 0x78, - 0x33, 0xc5, 0x1a, 0x88, 0xd0, 0x53, 0x7c, 0x79, 0xc8, 0x4c, 0x14, 0x84, 0x31, 0xd6, 0x5c, 0x65, - 0xe5, 0x39, 0x3e, 0x64, 0x62, 0xa3, 0xab, 0x03, 0xca, 0x15, 0x22, 0x55, 0x56, 0x5e, 0x84, 0x92, - 0x05, 0xf9, 0x6e, 0x86, 0x6f, 0xcd, 0x4a, 0xce, 0x52, 0x9f, 0x06, 0xf2, 0x71, 0xb5, 0x5b, 0x03, - 0xb8, 0x15, 0x10, 0x04, 0x17, 0x3d, 0x3b, 0xa0, 0x9e, 0x6d, 0x45, 0x76, 0x7b, 0x13, 0x01, 0xe3, - 0x4d, 0x20, 0xdf, 0xca, 0xc0, 0x14, 0xef, 0x16, 0x69, 0x8a, 0x58, 0xe8, 0x88, 0xac, 0xbd, 0xa9, - 0x34, 0xb5, 0x4a, 0x94, 0xa0, 0xea, 0x16, 0x91, 0x55, 0x26, 0x0a, 0xc3, 0x38, 0x77, 0xb6, 0xcc, - 0x68, 0xcb, 0xb2, 0x9b, 0x3c, 0x29, 0x70, 0xaa, 0x65, 0xb6, 0xcc, 0xc8, 0x44, 0x96, 0x19, 0x2f, - 0x41, 0x41, 0xbf, 0x5c, 0x83, 0xb1, 0xdb, 0xb8, 0xa6, 0x63, 0x44, 0x8f, 0x4e, 0x18, 0xfa, 0x1a, - 0xc0, 0x3e, 0xb7, 0x2b, 0x2d, 0x52, 0x4f, 0x3d, 0x2d, 0xac, 0xf7, 0xd0, 0x3b, 0x1a, 0x82, 0x06, - 0x56, 0xf9, 0xcf, 0x32, 0x30, 0x15, 0xf3, 0xc3, 0x14, 0xfe, 0xb7, 0xca, 0x0b, 0x9c, 0xee, 0x9c, - 0xc0, 0x1a, 0x58, 0x35, 0xaa, 0x63, 0x84, 0x18, 0x69, 0xf0, 0x69, 0xb6, 0x63, 0x37, 0xd6, 0xad, - 0xb6, 0xa4, 0x2f, 0x74, 0x92, 0x97, 0x7b, 0x58, 0x8c, 0x34, 0x6a, 0xcc, 0x4e, 0x17, 0x25, 0x82, - 0x71, 0xaa, 0xe5, 0xef, 0x65, 0x20, 0x1e, 0xc1, 0x45, 0xe6, 0xa1, 0x54, 0xb7, 0x3d, 0x4e, 0xe5, - 0x20, 0x1e, 0x70, 0xb6, 0xa4, 0x00, 0x18, 0xe2, 0xe8, 0x4e, 0xcf, 0x1e, 0xd6, 0xe9, 0xec, 0x2f, - 0xd2, 0x06, 0x7d, 0xd0, 0x96, 0xca, 0xac, 0x71, 0x16, 0x55, 0x10, 0x34, 0xb0, 0xca, 0xff, 0xa6, - 0x00, 0x93, 0x51, 0x3b, 0x79, 0x9f, 0x11, 0xc0, 0x2f, 0x41, 0xb1, 0x45, 0x83, 0x5d, 0xb7, 0x1e, - 0x37, 0xf7, 0xaf, 0xf3, 0x52, 0x94, 0x50, 0xde, 0x7c, 0xd7, 0x0b, 0x64, 0xb3, 0xc2, 0xe6, 0xbb, - 0x5e, 0x80, 0x1c, 0xa2, 0x1c, 0x97, 0xf3, 0x3d, 0x1c, 0x97, 0x1b, 0x30, 0xed, 0x53, 0x6f, 0x9f, - 0x7a, 0x86, 0xed, 0xb6, 0xff, 0xd4, 0xa2, 0xd5, 0x18, 0x09, 0xec, 0x22, 0x4a, 0xea, 0x30, 0x25, - 0xca, 0x42, 0xdb, 0x6d, 0xb1, 0x6f, 0xdb, 0x6d, 0x35, 0x4a, 0x01, 0xe3, 0x24, 0x07, 0x1c, 0x2e, - 0x13, 0x1d, 0xc2, 0x3e, 0xfc, 0x78, 0x6e, 0x03, 0x58, 0x9d, 0x60, 0x57, 0x7e, 0xe7, 0x68, 0xdf, - 0x3e, 0x16, 0x15, 0x5d, 0x19, 0x0d, 0x42, 0xe4, 0x75, 0x98, 0x0c, 0xd3, 0x87, 0xf3, 0xbc, 0xba, - 0xe2, 0xb5, 0x64, 0xbe, 0xd7, 0xac, 0x47, 0x20, 0x18, 0xc3, 0x4c, 0x77, 0x99, 0xf0, 0xed, 0x2c, - 0x10, 0xd9, 0x19, 0xe6, 0xb5, 0xd2, 0x57, 0x33, 0x30, 0x79, 0x3f, 0xd2, 0x47, 0x03, 0xbf, 0x5e, - 0xd2, 0x67, 0xd5, 0x68, 0x39, 0xc6, 0xf8, 0x1a, 0x77, 0xb2, 0xd9, 0x53, 0xf1, 0x9c, 0x5a, 0x78, - 0xf3, 0xfb, 0x3f, 0xb8, 0xf4, 0xcc, 0x1f, 0xfd, 0xe0, 0xd2, 0x33, 0x7f, 0xfe, 0x83, 0x4b, 0xcf, - 0xbc, 0xf7, 0xe8, 0x52, 0xe6, 0xfb, 0x8f, 0x2e, 0x65, 0xfe, 0xe8, 0xd1, 0xa5, 0xcc, 0x9f, 0x3f, - 0xba, 0x94, 0xf9, 0x8f, 0x8f, 0x2e, 0x65, 0xbe, 0xfd, 0xc3, 0x4b, 0xcf, 0x7c, 0xf6, 0x4a, 0xd8, - 0x8a, 0x79, 0xd5, 0x0a, 0xfe, 0xcf, 0x87, 0x05, 0x57, 0xee, 0x07, 0xc0, 0x5a, 0x31, 0x2f, 0x7f, - 0xab, 0x56, 0xfc, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa5, 0x2c, 0xff, 0x37, 0xfa, 0x1a, 0x01, - 0x00, + // 13052 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x6c, 0x24, 0xd9, + 0x75, 0x18, 0xbc, 0xfd, 0x24, 0xfb, 0xf0, 0x35, 0x73, 0x67, 0x76, 0x96, 0x3b, 0xde, 0x1d, 0x8e, + 0x7b, 0xa1, 0xfd, 0x76, 0xed, 0x15, 0x29, 0xad, 0x24, 0x7b, 0xbc, 0xfa, 0xbc, 0x56, 0xf3, 0x35, + 0xc3, 0x19, 0xbe, 0xe6, 0x34, 0x39, 0xa3, 0x97, 0x57, 0x5b, 0xec, 0xbe, 0x6c, 0xd6, 0xb2, 0xbb, + 0xaa, 0xa7, 0xaa, 0x9a, 0x33, 0xdc, 0xc0, 0xf2, 0xda, 0x92, 0xd6, 0x92, 0xac, 0x48, 0xb2, 0x20, + 0x18, 0x4a, 0xe0, 0x18, 0x31, 0x8c, 0xc4, 0x76, 0x62, 0x07, 0x41, 0x0c, 0x38, 0x7f, 0x83, 0x04, + 0x49, 0x84, 0xc0, 0x01, 0x6c, 0xc0, 0x8e, 0x8d, 0x24, 0x18, 0x44, 0x23, 0x27, 0x01, 0x02, 0x38, + 0x8f, 0x5f, 0x49, 0x26, 0x7f, 0x82, 0xfb, 0xac, 0x5b, 0xd5, 0xd5, 0x24, 0x9b, 0xd5, 0xcd, 0xd9, + 0x41, 0xfc, 0x8b, 0xec, 0x7b, 0xce, 0x3d, 0xe7, 0xd6, 0x7d, 0x9c, 0x7b, 0xee, 0xb9, 0xe7, 0x9c, + 0x0b, 0x37, 0x1a, 0x76, 0xb0, 0xd7, 0xd9, 0x99, 0xad, 0xb9, 0xad, 0x39, 0xcb, 0x6b, 0xb8, 0x6d, + 0xcf, 0x7d, 0x87, 0xff, 0xf3, 0x61, 0x7a, 0x40, 0x9d, 0xc0, 0x9f, 0x6b, 0xef, 0x37, 0xe6, 0xac, + 0xb6, 0xed, 0xcf, 0xc9, 0xdf, 0x07, 0x1f, 0xb5, 0x9a, 0xed, 0x3d, 0xeb, 0xa3, 0x73, 0x0d, 0xea, + 0x50, 0xcf, 0x0a, 0x68, 0x7d, 0xb6, 0xed, 0xb9, 0x81, 0x4b, 0xae, 0x85, 0x94, 0x66, 0x15, 0x25, + 0xfe, 0xcf, 0x17, 0x44, 0xcd, 0xd9, 0xf6, 0x7e, 0x63, 0x96, 0x51, 0x9a, 0x95, 0xbf, 0x15, 0xa5, + 0xcb, 0x1f, 0x36, 0xda, 0xd0, 0x70, 0x1b, 0xee, 0x1c, 0x27, 0xb8, 0xd3, 0xd9, 0xe5, 0xbf, 0xf8, + 0x0f, 0xfe, 0x9f, 0x60, 0x74, 0xb9, 0xbc, 0x7f, 0xcd, 0x9f, 0xb5, 0x5d, 0xd6, 0xaa, 0xb9, 0x9a, + 0xeb, 0xd1, 0xb9, 0x83, 0xae, 0xc6, 0x5c, 0xfe, 0x78, 0x88, 0xd3, 0xb2, 0x6a, 0x7b, 0xb6, 0x43, + 0xbd, 0x43, 0xf5, 0x29, 0x73, 0x1e, 0xf5, 0xdd, 0x8e, 0x57, 0xa3, 0x7d, 0xd5, 0xf2, 0xe7, 0x5a, + 0x34, 0xb0, 0x92, 0x78, 0xcd, 0xf5, 0xaa, 0xe5, 0x75, 0x9c, 0xc0, 0x6e, 0x75, 0xb3, 0xf9, 0x89, + 0xe3, 0x2a, 0xf8, 0xb5, 0x3d, 0xda, 0xb2, 0xe2, 0xf5, 0xca, 0xff, 0x3b, 0x03, 0xe7, 0x2b, 0x6b, + 0xb7, 0x37, 0x17, 0x5c, 0xc7, 0xef, 0xb4, 0xe8, 0x82, 0xeb, 0xec, 0xda, 0x0d, 0xf2, 0x09, 0x18, + 0xab, 0x89, 0x02, 0x6f, 0xcb, 0x6a, 0x4c, 0x67, 0xae, 0x66, 0x5e, 0x29, 0xcd, 0x5f, 0xf8, 0xfe, + 0xc3, 0x99, 0x67, 0x1e, 0x3d, 0x9c, 0x19, 0x5b, 0x08, 0x41, 0x68, 0xe2, 0x91, 0x57, 0x61, 0xc4, + 0xea, 0x04, 0x6e, 0xa5, 0xb6, 0x3f, 0x9d, 0xbd, 0x9a, 0x79, 0x65, 0x74, 0x7e, 0x4a, 0x56, 0x19, + 0xa9, 0x88, 0x62, 0x54, 0x70, 0x32, 0x07, 0x25, 0xfa, 0xa0, 0xd6, 0xec, 0xf8, 0xf6, 0x01, 0x9d, + 0xce, 0x71, 0xe4, 0xf3, 0x12, 0xb9, 0xb4, 0xa4, 0x00, 0x18, 0xe2, 0x30, 0xda, 0x8e, 0xbb, 0xea, + 0xd6, 0xac, 0xe6, 0x74, 0x3e, 0x4a, 0x7b, 0x5d, 0x14, 0xa3, 0x82, 0x93, 0x97, 0xa1, 0xe8, 0xb8, + 0x77, 0x2d, 0x3b, 0x98, 0x2e, 0x70, 0xcc, 0x49, 0x89, 0x59, 0x5c, 0xe7, 0xa5, 0x28, 0xa1, 0xe5, + 0xff, 0x32, 0x06, 0x53, 0xec, 0xdb, 0x97, 0xd8, 0xdc, 0xa9, 0xf2, 0xe1, 0x23, 0x2f, 0x42, 0xae, + 0xe3, 0x35, 0xe5, 0x17, 0x8f, 0xc9, 0x8a, 0xb9, 0x6d, 0x5c, 0x45, 0x56, 0x4e, 0xae, 0xc1, 0x38, + 0x7d, 0x50, 0xdb, 0xb3, 0x9c, 0x06, 0x5d, 0xb7, 0x5a, 0x94, 0x7f, 0x66, 0x69, 0xfe, 0xa2, 0xc4, + 0x1b, 0x5f, 0x32, 0x60, 0x18, 0xc1, 0x34, 0x6b, 0x6e, 0x1d, 0xb6, 0xc5, 0x37, 0x27, 0xd4, 0x64, + 0x30, 0x8c, 0x60, 0x92, 0xd7, 0x01, 0x3c, 0xb7, 0x13, 0xd8, 0x4e, 0xe3, 0x16, 0x3d, 0xe4, 0x1f, + 0x5f, 0x9a, 0x27, 0xb2, 0x1e, 0xa0, 0x86, 0xa0, 0x81, 0x45, 0xde, 0xcf, 0xc0, 0xf9, 0x9a, 0xeb, + 0x38, 0xb4, 0x16, 0xd8, 0xae, 0x33, 0x6f, 0xd5, 0xf6, 0xdd, 0xdd, 0x5d, 0xde, 0x1d, 0x63, 0xaf, + 0x57, 0x66, 0x4f, 0xbb, 0xaa, 0x66, 0x25, 0xa1, 0xf9, 0x67, 0x1f, 0x3d, 0x9c, 0x39, 0xbf, 0x10, + 0xa7, 0x8f, 0xdd, 0x2c, 0xc9, 0x6b, 0x30, 0xfa, 0x8e, 0xef, 0x3a, 0xf3, 0x6e, 0xfd, 0x70, 0xba, + 0xc8, 0x47, 0xe3, 0x9c, 0x6c, 0xfa, 0xe8, 0xcd, 0xea, 0xc6, 0x3a, 0x2b, 0x47, 0x8d, 0x41, 0xde, + 0x82, 0x5c, 0xd0, 0xf4, 0xa7, 0x47, 0x78, 0x3b, 0x17, 0x4e, 0xdf, 0xce, 0xad, 0xd5, 0xaa, 0x98, + 0xc9, 0xf3, 0x23, 0x6c, 0xf8, 0xb6, 0x56, 0xab, 0xc8, 0x08, 0x93, 0xaf, 0x64, 0x60, 0x94, 0x2d, + 0xb9, 0xba, 0x15, 0x58, 0xd3, 0xa3, 0x57, 0x73, 0xaf, 0x8c, 0xbd, 0x7e, 0xf7, 0xf4, 0x5c, 0x62, + 0x73, 0x67, 0x76, 0x4d, 0x52, 0x5e, 0x72, 0x02, 0xef, 0x30, 0xfc, 0x4e, 0x55, 0x8c, 0x9a, 0x35, + 0xf9, 0x4e, 0x06, 0xa6, 0xd4, 0x18, 0x2f, 0xd2, 0x5a, 0xd3, 0xf2, 0xe8, 0x74, 0x89, 0x7f, 0x74, + 0x35, 0x65, 0x73, 0xa2, 0x44, 0x65, 0x27, 0x5c, 0x78, 0xf4, 0x70, 0x66, 0x2a, 0x06, 0xc2, 0x78, + 0x03, 0xd8, 0x9c, 0x19, 0xbf, 0xd7, 0xa1, 0x1d, 0xdd, 0x22, 0xe0, 0x2d, 0xda, 0x4c, 0xd7, 0xa2, + 0xdb, 0x06, 0x45, 0xd9, 0x9c, 0x73, 0x6c, 0xc2, 0x9b, 0xe5, 0x18, 0xe1, 0x4b, 0xde, 0x85, 0x12, + 0xff, 0x3d, 0x6f, 0x3b, 0xf5, 0xe9, 0x31, 0xde, 0x88, 0xb5, 0x01, 0x34, 0x82, 0x91, 0x93, 0x2d, + 0x98, 0x60, 0x62, 0x46, 0x17, 0x62, 0xc8, 0x8e, 0x78, 0x30, 0x22, 0x25, 0xda, 0xf4, 0x38, 0xe7, + 0x7c, 0x2b, 0x1d, 0xe7, 0x88, 0x5c, 0x9d, 0x1f, 0x63, 0xf2, 0x4a, 0x16, 0xa1, 0x62, 0x44, 0x2c, + 0xc8, 0x5b, 0x9d, 0x60, 0x6f, 0x7a, 0x22, 0xed, 0xb4, 0x9f, 0xb7, 0x7c, 0xbb, 0x56, 0xe9, 0x04, + 0x7b, 0xf3, 0xa3, 0x8f, 0x1e, 0xce, 0xe4, 0xd9, 0x7f, 0xc8, 0x49, 0x13, 0x84, 0x52, 0xc7, 0x6b, + 0x56, 0x69, 0xcd, 0xa3, 0xc1, 0xf4, 0x24, 0xe7, 0xf3, 0xa1, 0x59, 0xb1, 0x65, 0x30, 0x52, 0xb3, + 0x6c, 0xcf, 0x9b, 0x3d, 0xf8, 0xe8, 0xac, 0xc0, 0xb8, 0x45, 0x0f, 0xab, 0xb4, 0x49, 0x6b, 0x81, + 0xeb, 0x89, 0xae, 0xda, 0xc6, 0x55, 0x01, 0xc1, 0x90, 0x0c, 0x71, 0xa1, 0xb8, 0x6b, 0x37, 0x03, + 0xea, 0x4d, 0x4f, 0xa5, 0xed, 0x29, 0x63, 0x15, 0x2d, 0x73, 0x92, 0xf3, 0xc0, 0xe4, 0xb5, 0xf8, + 0x1f, 0x25, 0x9b, 0xcb, 0x9f, 0x84, 0x89, 0xc8, 0x12, 0x23, 0xe7, 0x20, 0xb7, 0x4f, 0x0f, 0x85, + 0xb0, 0x46, 0xf6, 0x2f, 0xb9, 0x08, 0x85, 0x03, 0xab, 0xd9, 0x91, 0x82, 0x19, 0xc5, 0x8f, 0x37, + 0xb2, 0xd7, 0x32, 0xe5, 0x3f, 0xca, 0xc0, 0xf3, 0x3d, 0x57, 0x08, 0xdb, 0x5d, 0xea, 0x1d, 0xcf, + 0xda, 0x69, 0x52, 0x4e, 0xcd, 0xd8, 0x5d, 0x16, 0x45, 0x31, 0x2a, 0x38, 0x13, 0xc7, 0x6c, 0x13, + 0x5b, 0xa4, 0x4d, 0x1a, 0x50, 0xb9, 0xcf, 0x69, 0x71, 0x5c, 0xd1, 0x10, 0x34, 0xb0, 0x98, 0x14, + 0xb4, 0x9d, 0x80, 0x7a, 0x8e, 0xd5, 0x94, 0x9b, 0x9d, 0x96, 0x0e, 0x2b, 0xb2, 0x1c, 0x35, 0x86, + 0xb1, 0x7f, 0xe5, 0x8f, 0xdc, 0xbf, 0x7e, 0x1a, 0x2e, 0x24, 0x4c, 0x6e, 0xa3, 0x7a, 0xe6, 0xc8, + 0xea, 0xbf, 0x99, 0x85, 0x4b, 0xc9, 0x2b, 0x94, 0x5c, 0x85, 0xbc, 0xc3, 0xb6, 0x37, 0xb1, 0x0d, + 0x8e, 0x4b, 0x02, 0x79, 0xbe, 0xad, 0x71, 0x88, 0xd9, 0x61, 0xd9, 0xbe, 0x3a, 0x2c, 0x77, 0xa2, + 0x0e, 0x8b, 0xa8, 0x07, 0xf9, 0x13, 0xa8, 0x07, 0x27, 0xdc, 0xf3, 0x19, 0x61, 0xcb, 0x6b, 0x74, + 0x5a, 0x6c, 0xfe, 0xf1, 0x0d, 0xa9, 0x14, 0x12, 0xae, 0x28, 0x00, 0x86, 0x38, 0xe5, 0xc7, 0x79, + 0x38, 0x57, 0xb9, 0x5b, 0x5d, 0xb5, 0x5a, 0x3b, 0x75, 0x6b, 0xcb, 0xb3, 0x1b, 0x0d, 0xea, 0xb1, + 0xcd, 0x7c, 0xb7, 0xe3, 0xf0, 0x8d, 0x6e, 0x3d, 0xec, 0x27, 0xbd, 0x99, 0x2f, 0x1b, 0x30, 0x8c, + 0x60, 0xb2, 0x85, 0x68, 0xd5, 0x6a, 0xd4, 0xf7, 0xd9, 0x5e, 0x9e, 0xed, 0x7b, 0x21, 0x56, 0x54, + 0x5d, 0x0c, 0xc9, 0x30, 0x9a, 0xbe, 0x42, 0xe7, 0xfd, 0xdb, 0x1f, 0x4d, 0x5d, 0x8c, 0x21, 0x19, + 0xd6, 0x9f, 0x1e, 0x6d, 0xd8, 0xae, 0x23, 0x15, 0x0e, 0xdd, 0x9f, 0xc8, 0x4b, 0x51, 0x42, 0x49, + 0x07, 0x46, 0xda, 0xd6, 0x61, 0xd3, 0xb5, 0xea, 0xd3, 0x05, 0xbe, 0x9f, 0xde, 0x4c, 0xb1, 0x6b, + 0x8b, 0xde, 0xdd, 0xb4, 0x3c, 0xab, 0x45, 0x99, 0x10, 0xd0, 0x73, 0x6a, 0x53, 0xb0, 0x40, 0xc5, + 0x8b, 0x7c, 0x11, 0xa0, 0xad, 0xd0, 0xd8, 0x38, 0x0e, 0x9a, 0xb3, 0x9e, 0x9f, 0xba, 0xc8, 0x47, + 0x83, 0x23, 0x79, 0x03, 0x26, 0x6d, 0xe7, 0xc0, 0xad, 0x59, 0x6c, 0x60, 0xb9, 0x3e, 0x37, 0x22, + 0xf4, 0xb2, 0x47, 0x0f, 0x67, 0x26, 0x57, 0x22, 0x10, 0x8c, 0x61, 0xb2, 0xa5, 0xe3, 0xb9, 0x4d, + 0x5a, 0xc1, 0xf5, 0xe9, 0x51, 0x5e, 0x49, 0x7f, 0x26, 0x8a, 0x62, 0x54, 0xf0, 0xf2, 0xab, 0x50, + 0xac, 0xb4, 0xdc, 0x8e, 0x13, 0x90, 0x19, 0x25, 0xd8, 0xd8, 0x54, 0x1b, 0x9f, 0x2f, 0x3d, 0x7a, + 0x38, 0x53, 0xb8, 0xc3, 0x0a, 0xa4, 0x8c, 0x2b, 0xff, 0x65, 0x16, 0x2e, 0x54, 0xbc, 0x86, 0x7b, + 0xd7, 0xf5, 0xf6, 0x77, 0x9b, 0xee, 0x7d, 0x35, 0x55, 0x1d, 0x28, 0x8a, 0x93, 0x09, 0xaf, 0x99, + 0xaa, 0x97, 0x2a, 0x5e, 0x60, 0xef, 0x5a, 0xb5, 0x60, 0x55, 0x7e, 0x8d, 0x10, 0xd2, 0x42, 0x6c, + 0xa3, 0xe4, 0x42, 0x6e, 0x40, 0xc9, 0x6d, 0xb3, 0x23, 0x06, 0x9b, 0x3b, 0x42, 0x3d, 0xfe, 0x31, + 0xb5, 0xc0, 0x36, 0x14, 0xe0, 0xf1, 0xc3, 0x99, 0x67, 0xcd, 0xc6, 0x6a, 0x00, 0x86, 0x95, 0x63, + 0x63, 0x9c, 0x3b, 0xf3, 0x31, 0x7e, 0x01, 0xf2, 0x96, 0xd7, 0xf0, 0xa7, 0xf3, 0x57, 0x73, 0xaf, + 0x94, 0xe4, 0x8e, 0xea, 0x35, 0x7c, 0xe4, 0xa5, 0xe5, 0xf7, 0x0b, 0x70, 0x2e, 0xde, 0x21, 0xe4, + 0xf3, 0x90, 0xf5, 0x3f, 0x26, 0x3b, 0x7a, 0xf1, 0xf4, 0x4d, 0xad, 0x7e, 0x4c, 0x51, 0x9e, 0x2f, + 0x3e, 0x7a, 0x38, 0x93, 0xad, 0x7e, 0x0c, 0xb3, 0xfe, 0xc7, 0x48, 0x19, 0x8a, 0xb6, 0xd3, 0xb4, + 0x1d, 0x75, 0xec, 0xe0, 0xdd, 0xbf, 0xc2, 0x4b, 0x50, 0x42, 0x48, 0x1d, 0xf2, 0xbb, 0x76, 0x93, + 0x4a, 0x31, 0xb0, 0x7c, 0xfa, 0x36, 0x2c, 0xdb, 0x4d, 0xaa, 0x5b, 0xc1, 0x3f, 0x9e, 0x95, 0x20, + 0xa7, 0x4e, 0xde, 0x16, 0xa7, 0xa4, 0x3c, 0x67, 0xb2, 0x74, 0x7a, 0x26, 0xdb, 0xb8, 0xaa, 0x79, + 0x8c, 0x44, 0x0e, 0x5a, 0xdb, 0x50, 0xaa, 0xf1, 0xbd, 0xa8, 0x65, 0xb5, 0xe5, 0xb9, 0xe5, 0x95, + 0x24, 0x99, 0x26, 0x36, 0xac, 0x35, 0xab, 0xdd, 0x25, 0xd6, 0x16, 0x54, 0x75, 0x0c, 0x29, 0xb1, + 0x86, 0x37, 0xec, 0x80, 0x0b, 0xfe, 0x54, 0x0d, 0xbf, 0x6e, 0x07, 0xd1, 0x86, 0x5f, 0xb7, 0x03, + 0x64, 0xa4, 0x89, 0x0b, 0xa3, 0xca, 0x16, 0x20, 0xcf, 0x31, 0x29, 0xd8, 0xdc, 0xba, 0x56, 0x45, + 0x49, 0x6c, 0x7e, 0x9c, 0x69, 0x0b, 0xea, 0x17, 0x6a, 0x26, 0xe5, 0xdf, 0xcf, 0xc3, 0xb3, 0x95, + 0x77, 0x3b, 0x1e, 0xe5, 0x4a, 0xd4, 0x8d, 0xce, 0x8e, 0xaf, 0x96, 0xfe, 0x55, 0xc8, 0xef, 0xde, + 0xab, 0x3b, 0xf1, 0x5d, 0x7c, 0xf9, 0xf6, 0xe2, 0x3a, 0x72, 0x08, 0x13, 0x45, 0x7b, 0x9d, 0x1d, + 0xe3, 0x24, 0xab, 0x45, 0xd1, 0x0d, 0x51, 0x8c, 0x0a, 0x4e, 0xda, 0x70, 0xc1, 0xdf, 0xb3, 0x3c, + 0x5a, 0xd7, 0x5b, 0x10, 0xaf, 0xd6, 0xd7, 0x76, 0xf3, 0xdc, 0xa3, 0x87, 0x33, 0x17, 0xaa, 0xdd, + 0x54, 0x30, 0x89, 0x34, 0xa9, 0xc3, 0x54, 0xac, 0x58, 0x4e, 0xb8, 0x13, 0x72, 0xe3, 0xa7, 0x9e, + 0x18, 0x37, 0x8c, 0x93, 0xfc, 0x7f, 0x74, 0x03, 0x2b, 0xbf, 0x57, 0x80, 0xe7, 0xc3, 0x59, 0xe3, + 0xdf, 0xe8, 0xec, 0x98, 0x56, 0x90, 0xe3, 0x67, 0x4e, 0x8f, 0xe9, 0x90, 0x3d, 0xd3, 0xe9, 0x90, + 0x1b, 0xfc, 0x74, 0x30, 0x56, 0x44, 0xfe, 0x98, 0x15, 0xf1, 0x2d, 0xd3, 0x98, 0x20, 0xe6, 0x8e, + 0x95, 0x62, 0x73, 0xed, 0x35, 0x18, 0x7d, 0x98, 0x15, 0xc2, 0x13, 0x59, 0xf1, 0x29, 0x38, 0x91, + 0xfd, 0x6a, 0x11, 0x5e, 0xe0, 0x5f, 0xcd, 0x0f, 0x20, 0xd5, 0xc0, 0xf5, 0xac, 0x06, 0x35, 0x67, + 0xe1, 0x4d, 0x20, 0xbe, 0x28, 0xad, 0xd4, 0x6a, 0x4c, 0x0b, 0x32, 0x74, 0xed, 0xcb, 0xb2, 0x1b, + 0x48, 0xb5, 0x0b, 0x03, 0x13, 0x6a, 0x91, 0x06, 0x9c, 0x0b, 0x8d, 0x53, 0xd5, 0xc0, 0xb3, 0x9d, + 0x46, 0x7f, 0x93, 0xf5, 0xe2, 0xa3, 0x87, 0x33, 0xe7, 0x16, 0x62, 0x24, 0xb0, 0x8b, 0x28, 0x3b, + 0x60, 0x70, 0x6b, 0x82, 0x96, 0x8e, 0xc6, 0x01, 0xe3, 0xb6, 0x02, 0x60, 0x88, 0x13, 0xb1, 0x90, + 0xe5, 0x8f, 0xb5, 0x90, 0xbd, 0x08, 0xb9, 0x7a, 0xf3, 0x9e, 0x3c, 0xe4, 0x68, 0xfb, 0xe4, 0xe2, + 0xea, 0x6d, 0x64, 0xe5, 0xe4, 0x3b, 0xe6, 0x9c, 0x14, 0x52, 0xa5, 0x9e, 0x72, 0x4e, 0xf6, 0x18, + 0x9d, 0x53, 0x4d, 0xcb, 0x91, 0x33, 0x99, 0x96, 0xe4, 0x93, 0x30, 0x51, 0xa7, 0x35, 0xb7, 0x4e, + 0xd7, 0xa8, 0xef, 0x5b, 0x0d, 0xca, 0xf5, 0xec, 0xd1, 0xf9, 0x67, 0x65, 0x1b, 0x27, 0x16, 0x4d, + 0x20, 0x46, 0x71, 0xc9, 0x02, 0x9c, 0xbf, 0x6f, 0xd9, 0xc1, 0x96, 0xdd, 0xa2, 0x2b, 0x4e, 0x95, + 0xd6, 0x5c, 0xa7, 0xee, 0x73, 0xe3, 0x5c, 0x41, 0x98, 0x3d, 0xef, 0xc6, 0x81, 0xd8, 0x8d, 0x9f, + 0x6e, 0x61, 0xfc, 0x59, 0x11, 0x2e, 0xf3, 0xae, 0xaf, 0x52, 0xef, 0xc0, 0xae, 0xd1, 0xf9, 0x8e, + 0x6f, 0x2e, 0x8b, 0xa4, 0xa9, 0x9c, 0x19, 0xfa, 0x54, 0xce, 0x9e, 0x60, 0x2a, 0xcf, 0x41, 0x29, + 0x70, 0xdb, 0x76, 0x2d, 0x69, 0xee, 0x6f, 0x29, 0x00, 0x86, 0x38, 0x64, 0x11, 0xce, 0xf9, 0x9d, + 0x1d, 0xbf, 0xe6, 0xd9, 0x6d, 0x7d, 0x96, 0x16, 0x62, 0x77, 0x5a, 0xd6, 0x3b, 0x57, 0x8d, 0xc1, + 0xb1, 0xab, 0x86, 0xb2, 0x1a, 0x17, 0x86, 0x65, 0x35, 0xee, 0xcf, 0x86, 0xfd, 0x6d, 0x73, 0x09, + 0x8e, 0xf0, 0x25, 0xb8, 0x93, 0x72, 0x09, 0x26, 0xce, 0x83, 0x53, 0x2d, 0xc0, 0xd1, 0xb3, 0x59, + 0x80, 0x9f, 0x81, 0xe7, 0x76, 0x3b, 0xcd, 0xe6, 0xe1, 0xed, 0x8e, 0xd5, 0xb4, 0x77, 0x6d, 0x5a, + 0x67, 0xe3, 0xe4, 0xb7, 0xad, 0x9a, 0x30, 0x73, 0x97, 0xe6, 0x67, 0x64, 0x6b, 0x9f, 0x5b, 0x4e, + 0x46, 0xc3, 0x5e, 0xf5, 0xd3, 0xad, 0xac, 0xf7, 0x0a, 0x70, 0x29, 0xd6, 0xa3, 0x4a, 0x59, 0xfe, + 0xab, 0x55, 0x75, 0xc6, 0xab, 0xca, 0x50, 0xbc, 0x8b, 0x4f, 0x4c, 0xf1, 0x1e, 0x39, 0x73, 0xc5, + 0xfb, 0x2f, 0xb3, 0x30, 0xa2, 0x2e, 0xc7, 0xee, 0xc1, 0x68, 0xbd, 0x23, 0x4d, 0x25, 0x62, 0xae, + 0x5d, 0x3f, 0x7d, 0x4b, 0x56, 0x9c, 0xe0, 0x27, 0x3e, 0xbe, 0xe1, 0x89, 0x59, 0x26, 0x4e, 0x8b, + 0x8b, 0x92, 0x38, 0x6a, 0x36, 0xa4, 0x0e, 0x45, 0x76, 0x68, 0x75, 0x3d, 0xa9, 0xfd, 0x7c, 0x2a, + 0x85, 0x68, 0xe2, 0x96, 0x29, 0xb9, 0xfe, 0x39, 0x4d, 0x94, 0xb4, 0x19, 0x97, 0x77, 0xec, 0x80, + 0x09, 0x9c, 0xdc, 0x20, 0xb9, 0xdc, 0xe4, 0x34, 0x51, 0xd2, 0x26, 0x2f, 0x41, 0xc1, 0x0f, 0x68, + 0xdb, 0xe7, 0x93, 0xbb, 0x30, 0x3f, 0x21, 0x7b, 0xbe, 0x50, 0x65, 0x85, 0x28, 0x60, 0xe5, 0xdf, + 0xcb, 0x40, 0x49, 0xdf, 0x8b, 0x90, 0x0d, 0x18, 0xed, 0xf8, 0xd4, 0xd3, 0xc6, 0xed, 0x13, 0xaf, + 0x6e, 0xde, 0x9f, 0xdb, 0xb2, 0x2a, 0x6a, 0x22, 0x8c, 0x60, 0xdb, 0xf2, 0xfd, 0xfb, 0xae, 0x57, + 0xef, 0x4f, 0x9f, 0xe4, 0x04, 0x37, 0x65, 0x55, 0xd4, 0x44, 0xca, 0x7f, 0x9a, 0x81, 0x89, 0x79, + 0x3b, 0xd8, 0xe9, 0xd4, 0xf6, 0x69, 0xc0, 0xdb, 0xdc, 0x82, 0xc2, 0x0e, 0xfb, 0x00, 0xd9, 0xe0, + 0xd5, 0x14, 0xf7, 0x43, 0x8a, 0x6e, 0x78, 0x51, 0xc4, 0x0d, 0x89, 0xfc, 0x27, 0x0a, 0x2e, 0x64, + 0x1b, 0xc0, 0xb5, 0x3a, 0xc1, 0xde, 0x96, 0xbb, 0x4f, 0x9d, 0xfe, 0xbe, 0x69, 0x92, 0xcd, 0xfb, + 0x8d, 0x8a, 0xaa, 0x8c, 0x06, 0xa1, 0xf2, 0x1f, 0x64, 0x80, 0x74, 0xf3, 0x7f, 0x0a, 0x06, 0xe4, + 0xdf, 0x8e, 0xc0, 0x45, 0xdd, 0xf0, 0xd8, 0xf1, 0xa4, 0xce, 0x6f, 0x2b, 0x6e, 0xb8, 0xee, 0xfe, + 0x86, 0xb3, 0x6c, 0x3b, 0xb6, 0xbf, 0x27, 0xef, 0x5c, 0xf4, 0xf1, 0x64, 0xb1, 0x0b, 0x03, 0x13, + 0x6a, 0x91, 0xaf, 0x9b, 0x4a, 0x43, 0x96, 0x0b, 0xa5, 0xcf, 0x0f, 0x60, 0x9c, 0x4f, 0xab, 0x2e, + 0x8c, 0xdc, 0xa7, 0x3b, 0x7b, 0xae, 0xbb, 0x2f, 0x97, 0xef, 0x8d, 0xd3, 0x37, 0xe5, 0xae, 0x20, + 0xb4, 0xe0, 0x3a, 0x01, 0x7d, 0x10, 0x88, 0x0b, 0x50, 0x59, 0x86, 0x8a, 0x0b, 0xa1, 0xf2, 0x02, + 0x34, 0x9f, 0x56, 0x06, 0x46, 0x16, 0x4e, 0xd7, 0x25, 0x68, 0x19, 0x8a, 0xa2, 0x02, 0x3f, 0xad, + 0x4b, 0xfb, 0xa9, 0x38, 0x72, 0xa3, 0x84, 0x90, 0x0f, 0x43, 0xc1, 0xbd, 0xef, 0xc8, 0x13, 0x74, + 0x69, 0xfe, 0x39, 0xd9, 0x4d, 0x53, 0x8b, 0xb4, 0xed, 0xd1, 0x9a, 0x15, 0xd0, 0xfa, 0x06, 0x03, + 0xa3, 0xc0, 0x22, 0xff, 0x3f, 0x00, 0x6b, 0x1d, 0xad, 0xf1, 0xbb, 0x17, 0x71, 0x07, 0xf0, 0x82, + 0xac, 0x73, 0x31, 0xac, 0xb3, 0xa9, 0x71, 0xd0, 0xc0, 0x27, 0x37, 0x60, 0xd2, 0xa3, 0x6d, 0xd7, + 0xb7, 0x03, 0xd7, 0x3b, 0xac, 0x36, 0x3b, 0x0d, 0x79, 0x21, 0x70, 0x55, 0x52, 0x98, 0x0e, 0x29, + 0x60, 0x04, 0x0f, 0x63, 0xf5, 0xc8, 0x2f, 0x65, 0x60, 0x5c, 0x17, 0xd9, 0x94, 0x1d, 0x58, 0x72, + 0xe9, 0xae, 0xcd, 0x75, 0x57, 0x86, 0x9c, 0xc3, 0x0b, 0x2e, 0x34, 0x58, 0x61, 0x84, 0xb1, 0xa1, + 0x6b, 0xc2, 0x53, 0x60, 0x83, 0x78, 0x17, 0x2e, 0x24, 0x7c, 0x28, 0xdb, 0x59, 0xc4, 0x2c, 0x10, + 0xc6, 0x06, 0xbd, 0xb3, 0x44, 0xc6, 0xfe, 0xcd, 0xae, 0xd1, 0x13, 0xda, 0xdc, 0x25, 0x89, 0x3d, + 0x79, 0xf4, 0x98, 0x95, 0xff, 0xe3, 0x18, 0x5c, 0xd6, 0xcc, 0x99, 0x42, 0x4a, 0x3d, 0x53, 0xbc, + 0x18, 0xab, 0x30, 0x73, 0x26, 0xab, 0x30, 0x3a, 0x97, 0xb3, 0xa9, 0xe7, 0x72, 0xee, 0x94, 0x73, + 0xf9, 0x15, 0x18, 0x95, 0x74, 0xd5, 0xdd, 0x8b, 0x10, 0xcd, 0xb2, 0x0c, 0x35, 0x94, 0xfc, 0xf5, + 0xf8, 0xac, 0x17, 0x56, 0xb8, 0xea, 0x00, 0x66, 0xbd, 0x18, 0x8f, 0x3e, 0xe7, 0x7e, 0x28, 0x60, + 0x8a, 0x3d, 0x05, 0xcc, 0x3e, 0xbc, 0xe8, 0xef, 0xdb, 0xed, 0x79, 0xcf, 0x72, 0x6a, 0x7b, 0x48, + 0x77, 0xfd, 0x05, 0xee, 0x8e, 0x50, 0xdf, 0x70, 0x36, 0xda, 0xd4, 0xd9, 0x44, 0x2e, 0x44, 0x46, + 0xe7, 0x3f, 0x24, 0xd9, 0xbd, 0x58, 0x3d, 0x0a, 0x19, 0x8f, 0xa6, 0x45, 0xae, 0xc3, 0x79, 0xd7, + 0x11, 0x56, 0x9b, 0x4d, 0xea, 0x09, 0xa8, 0x34, 0x86, 0x3c, 0x2f, 0x19, 0x9c, 0xdf, 0x88, 0x23, + 0x60, 0x77, 0x1d, 0xf2, 0x69, 0x18, 0x13, 0xf7, 0xcd, 0x42, 0x2b, 0x28, 0xf5, 0xb3, 0xb1, 0x4e, + 0x3d, 0x7a, 0x38, 0x33, 0x56, 0x09, 0x6b, 0xa3, 0x49, 0x8a, 0xbc, 0x05, 0x13, 0x72, 0x02, 0x4a, + 0xef, 0x14, 0xe8, 0x87, 0xf6, 0xf9, 0x47, 0x0f, 0x67, 0x26, 0xee, 0x9a, 0xf5, 0x31, 0x4a, 0x8e, + 0xdc, 0x81, 0x4b, 0x3b, 0x6a, 0x50, 0x7d, 0x3e, 0xa8, 0xf3, 0x96, 0x4f, 0xb7, 0x71, 0x95, 0x7b, + 0x16, 0x95, 0xe6, 0xaf, 0xc8, 0x7e, 0xb8, 0x14, 0x1b, 0x7a, 0x89, 0x85, 0x3d, 0x6a, 0xf7, 0xd8, + 0xfd, 0xc7, 0x4f, 0xb5, 0xfb, 0x47, 0x4c, 0x06, 0x13, 0x69, 0x4d, 0x06, 0xbd, 0x65, 0xca, 0xa9, + 0x4c, 0x06, 0x93, 0x67, 0x63, 0x32, 0x90, 0xc7, 0xcd, 0xa9, 0x61, 0x1d, 0x37, 0x3f, 0x09, 0x13, + 0xb5, 0x3d, 0x5a, 0xdb, 0xe7, 0xfe, 0x36, 0x07, 0x56, 0x73, 0xfa, 0x1c, 0x1f, 0x7e, 0x6d, 0x13, + 0x5c, 0x30, 0x81, 0x18, 0xc5, 0x4d, 0xb7, 0xc7, 0x7c, 0x2b, 0x03, 0xcf, 0xf7, 0x94, 0x2b, 0xe4, + 0xf5, 0x88, 0xd4, 0xcd, 0x44, 0xbd, 0x3b, 0x7b, 0xc8, 0xda, 0xb4, 0x3b, 0xcf, 0x1f, 0x66, 0xa1, + 0x34, 0xdf, 0xf1, 0xa5, 0xb3, 0xcf, 0x0e, 0xe4, 0x1d, 0x2b, 0xf0, 0xd3, 0x5f, 0x5b, 0xaf, 0x57, + 0xb6, 0x54, 0xdf, 0x73, 0xd5, 0x8b, 0xfd, 0x46, 0x4e, 0x9b, 0x1c, 0x40, 0xe9, 0x1d, 0x1a, 0xf8, + 0x81, 0x47, 0xad, 0x96, 0x54, 0xcb, 0x57, 0x4e, 0xcf, 0xe8, 0x26, 0x0d, 0xaa, 0x9c, 0x94, 0xe9, + 0xce, 0xa7, 0x0b, 0x31, 0x64, 0x45, 0x6a, 0x50, 0xd8, 0xb7, 0x76, 0xf7, 0x2d, 0xa9, 0xc8, 0xce, + 0xa7, 0xb8, 0x8a, 0x65, 0x64, 0xe6, 0x3b, 0xbe, 0x38, 0x31, 0xf1, 0x5f, 0x28, 0x68, 0x97, 0xbf, + 0x5b, 0x80, 0x0b, 0x0b, 0x56, 0x93, 0x3a, 0x75, 0x2b, 0xb2, 0x83, 0xbf, 0x06, 0xa3, 0x7e, 0x6d, + 0x8f, 0xd6, 0x3b, 0x4d, 0x75, 0x6b, 0xa1, 0x57, 0x5c, 0x55, 0x96, 0xa3, 0xc6, 0xd0, 0x3e, 0x62, + 0x6c, 0x6e, 0x66, 0xa3, 0xd8, 0x7a, 0x5a, 0x6a, 0x0c, 0xf2, 0x06, 0x4c, 0x4a, 0xe7, 0x27, 0xd7, + 0x59, 0xb4, 0x02, 0x2a, 0x1c, 0x24, 0xa4, 0x03, 0xca, 0x52, 0x04, 0x82, 0x31, 0x4c, 0xc6, 0x29, + 0xb0, 0x5b, 0xf4, 0x5d, 0xd7, 0x51, 0x76, 0x21, 0xcd, 0x69, 0x4b, 0x96, 0xa3, 0xc6, 0x20, 0x5f, + 0xeb, 0xbe, 0xe6, 0xfa, 0xdc, 0xe9, 0xbb, 0x31, 0xa1, 0x9f, 0xfa, 0x90, 0x4a, 0x3f, 0x07, 0x63, + 0x6d, 0xea, 0xf9, 0xb6, 0x1f, 0x50, 0xa7, 0x46, 0xe5, 0x2d, 0xd7, 0xcd, 0x94, 0xa2, 0x69, 0x33, + 0xa4, 0x28, 0xf6, 0x2a, 0xa3, 0x00, 0x4d, 0x7e, 0x67, 0x6e, 0x47, 0x4d, 0x27, 0x77, 0x1e, 0xc0, + 0xc5, 0x05, 0x2b, 0xa8, 0xed, 0x75, 0xda, 0x62, 0x99, 0x28, 0x13, 0xd0, 0xab, 0x30, 0x42, 0x1d, + 0x6b, 0xa7, 0x49, 0xeb, 0x71, 0x5f, 0xc7, 0x25, 0x51, 0x8c, 0x0a, 0x4e, 0x3e, 0x01, 0x63, 0x2d, + 0xeb, 0x81, 0x32, 0x23, 0xc9, 0x69, 0xa9, 0xe3, 0x00, 0xd6, 0x42, 0x10, 0x9a, 0x78, 0xe5, 0x3f, + 0xcb, 0x42, 0x69, 0xc1, 0x75, 0xea, 0x36, 0xe7, 0xf7, 0x51, 0xc8, 0x07, 0x87, 0x6d, 0xb5, 0x04, + 0x5e, 0x54, 0x97, 0xc9, 0x5b, 0x87, 0x6d, 0xfa, 0x98, 0x09, 0x5e, 0x85, 0xc8, 0x9d, 0xa5, 0x38, + 0x2a, 0x59, 0x85, 0xa2, 0x1f, 0x58, 0x41, 0xc7, 0x97, 0x2c, 0x3f, 0xae, 0xbc, 0xcf, 0xaa, 0xbc, + 0xf4, 0xf1, 0xc3, 0x99, 0x84, 0x80, 0x8d, 0x59, 0x4d, 0x49, 0x60, 0xa1, 0xa4, 0x41, 0x0e, 0x80, + 0x34, 0x2d, 0x3f, 0xd8, 0xf2, 0x2c, 0xc7, 0x17, 0x9c, 0x6c, 0xed, 0xb9, 0xf0, 0x63, 0x86, 0x9e, + 0xa1, 0x03, 0x27, 0xc2, 0x61, 0x63, 0x33, 0x8f, 0x69, 0x1e, 0xac, 0x46, 0xb8, 0xad, 0xaf, 0x76, + 0x51, 0xc3, 0x04, 0x0e, 0xc2, 0x87, 0xce, 0xf2, 0x93, 0x7c, 0xe8, 0x58, 0x29, 0x4a, 0x28, 0x1b, + 0x90, 0x96, 0xbc, 0xa8, 0x2a, 0x44, 0xef, 0x9c, 0xd5, 0x15, 0x95, 0x82, 0x97, 0x1b, 0xf0, 0xac, + 0xfe, 0x4a, 0x1f, 0xa9, 0x4f, 0x83, 0xf9, 0x43, 0xce, 0xeb, 0x2a, 0xe4, 0x6b, 0x9e, 0xdb, 0x75, + 0x63, 0xbf, 0xe0, 0xb9, 0x0e, 0x72, 0x48, 0x64, 0xd5, 0x67, 0x8f, 0x5b, 0xf5, 0xe5, 0x6f, 0x66, + 0xe0, 0xb9, 0x18, 0xa7, 0x05, 0xcf, 0x0e, 0xa8, 0x67, 0x5b, 0xc4, 0x87, 0xe2, 0x0e, 0xe7, 0x2a, + 0xb7, 0x8c, 0x8d, 0x14, 0xe2, 0x20, 0xe9, 0x63, 0xc4, 0x52, 0x10, 0xff, 0xa3, 0x64, 0x55, 0xfe, + 0x22, 0x5c, 0xd4, 0xbe, 0x3e, 0xc6, 0x02, 0x3d, 0x81, 0xab, 0xea, 0x22, 0x9c, 0xab, 0x79, 0xd4, + 0x0a, 0xe8, 0xca, 0xee, 0xba, 0x1b, 0x2c, 0x3d, 0xb0, 0xfd, 0x40, 0xfa, 0xac, 0x6a, 0x73, 0xf8, + 0x42, 0x0c, 0x8e, 0x5d, 0x35, 0xca, 0x7f, 0x90, 0x85, 0xf3, 0xec, 0xfc, 0x64, 0xb1, 0x19, 0xb2, + 0x45, 0x5b, 0xed, 0xa6, 0x15, 0x50, 0xf2, 0x19, 0x28, 0x29, 0x47, 0x1c, 0xb5, 0x81, 0x26, 0xba, + 0x29, 0x69, 0xbf, 0x1d, 0x7a, 0xaf, 0x63, 0x7b, 0x94, 0xbb, 0x96, 0x86, 0x56, 0x7c, 0x05, 0xf5, + 0x31, 0xa4, 0x46, 0x76, 0x60, 0xca, 0x6e, 0x59, 0x0d, 0xba, 0xd9, 0x69, 0x36, 0x37, 0xdd, 0xa6, + 0x5d, 0x53, 0x67, 0xb2, 0x6b, 0xca, 0x26, 0xb1, 0x12, 0x05, 0x3f, 0x7e, 0x38, 0xf3, 0x62, 0xc2, + 0xaa, 0x08, 0x11, 0x30, 0x4e, 0x90, 0xf1, 0xf0, 0x69, 0xad, 0xe3, 0xd9, 0xc1, 0xa1, 0x3c, 0x1b, + 0xca, 0x65, 0xf1, 0x52, 0x0f, 0xf5, 0xdb, 0x44, 0x95, 0x1e, 0x15, 0xd1, 0x42, 0x8c, 0x13, 0x2c, + 0xff, 0xc3, 0x02, 0x4c, 0x2c, 0x74, 0xfc, 0xc0, 0x6d, 0xa9, 0xab, 0x96, 0x39, 0x28, 0x09, 0x5d, + 0x9a, 0x69, 0xe1, 0x99, 0xe8, 0x85, 0x46, 0x55, 0x01, 0x30, 0xc4, 0x61, 0x0b, 0x89, 0x53, 0x55, + 0xbe, 0xc6, 0x7a, 0x21, 0x71, 0xe6, 0x14, 0x25, 0x94, 0x6c, 0x03, 0xd4, 0xa8, 0x17, 0xc8, 0x83, + 0x44, 0xae, 0x6f, 0xd3, 0xe5, 0x82, 0xae, 0x8c, 0x06, 0x21, 0xee, 0x87, 0xc0, 0xdb, 0xc2, 0x26, + 0xd5, 0xc6, 0x01, 0xf5, 0x3c, 0xbb, 0xae, 0x76, 0xce, 0xd0, 0x0f, 0xa1, 0x0b, 0x03, 0x13, 0x6a, + 0x11, 0x1f, 0xf2, 0x7e, 0x9b, 0xd6, 0xe4, 0x46, 0x7a, 0x3b, 0xc5, 0xca, 0x31, 0xbb, 0x74, 0xb6, + 0xda, 0xa6, 0x35, 0xb1, 0x7d, 0xea, 0x15, 0xc0, 0x8a, 0x90, 0x33, 0x7b, 0xe2, 0xde, 0xb2, 0xc6, + 0x55, 0xcf, 0xc8, 0xd9, 0x5d, 0xf5, 0x5c, 0xfe, 0x49, 0x28, 0xe9, 0x7e, 0xe9, 0x6b, 0xe7, 0xfc, + 0xcb, 0x0c, 0xc0, 0xa2, 0x15, 0x58, 0x62, 0x37, 0x66, 0x22, 0xa6, 0x6d, 0x05, 0x7b, 0x71, 0x11, + 0xb3, 0x69, 0x05, 0x7b, 0xc8, 0x21, 0xe4, 0x35, 0xb9, 0xc5, 0x65, 0x23, 0xb7, 0x6c, 0x6a, 0x8b, + 0xe3, 0xb7, 0xc4, 0xc6, 0xee, 0xa6, 0x7d, 0x79, 0x85, 0xca, 0xd6, 0xe5, 0xcb, 0x4b, 0x3e, 0x05, + 0x50, 0x73, 0x5b, 0xac, 0x03, 0x03, 0xd7, 0x93, 0x13, 0x4d, 0xd9, 0x51, 0x60, 0x41, 0x43, 0x1e, + 0x47, 0x7e, 0xa1, 0x51, 0x87, 0x0b, 0x7b, 0x29, 0xa3, 0xe4, 0x9e, 0x12, 0x0a, 0x7b, 0x59, 0x8e, + 0x1a, 0xa3, 0xfc, 0x17, 0x39, 0x18, 0x5f, 0x6a, 0x59, 0x76, 0x53, 0xad, 0xd0, 0xe8, 0x84, 0xc9, + 0x9c, 0xf9, 0x84, 0x79, 0xcd, 0xb8, 0x15, 0x88, 0xed, 0x55, 0x09, 0x26, 0xff, 0xcf, 0xc1, 0xb8, + 0xdf, 0x0a, 0xda, 0xca, 0x76, 0xdf, 0xdf, 0xc2, 0xe7, 0xc1, 0x48, 0xd5, 0xb5, 0xad, 0x4d, 0x6d, + 0xfa, 0x8f, 0x10, 0x63, 0x83, 0xbf, 0xe7, 0xfa, 0x81, 0x1c, 0x05, 0x3d, 0xf8, 0x37, 0x5c, 0x3f, + 0x40, 0x0e, 0xe1, 0xd3, 0xc3, 0xf5, 0x44, 0xe0, 0x41, 0xc1, 0x98, 0x1e, 0xae, 0x17, 0x20, 0x87, + 0x90, 0x4b, 0x90, 0x0d, 0x5c, 0x69, 0x13, 0xe2, 0x0e, 0xbd, 0x5b, 0x2e, 0x66, 0x03, 0x97, 0xbb, + 0xd9, 0x79, 0x6e, 0x4b, 0xda, 0x8d, 0x43, 0x37, 0x3b, 0xcf, 0x6d, 0x21, 0x87, 0x30, 0xd5, 0xc0, + 0xef, 0xec, 0xb0, 0x73, 0x5f, 0xdc, 0x57, 0xbc, 0x2a, 0x8a, 0x51, 0xc1, 0x19, 0xb1, 0x1d, 0xb7, + 0x7e, 0x28, 0x2f, 0xd8, 0x35, 0x31, 0xee, 0x9d, 0xc0, 0x21, 0xe5, 0xbf, 0x31, 0x02, 0x64, 0xa9, + 0xc5, 0xef, 0xce, 0xcc, 0x63, 0xca, 0xcb, 0x50, 0xdc, 0xf1, 0xdc, 0x7d, 0x6d, 0xed, 0xd4, 0xd2, + 0x75, 0x9e, 0x97, 0xa2, 0x84, 0xb2, 0x93, 0x6a, 0x6d, 0xcf, 0x72, 0x1c, 0xda, 0x0c, 0xed, 0x83, + 0x7a, 0x20, 0x17, 0x34, 0x04, 0x0d, 0x2c, 0x1e, 0x48, 0x2a, 0x7e, 0x19, 0xb7, 0xd7, 0x61, 0x20, + 0x69, 0x08, 0x42, 0x13, 0x2f, 0x72, 0x2b, 0x94, 0x1f, 0xf4, 0xad, 0x50, 0x61, 0x00, 0xb7, 0x42, + 0x3d, 0x02, 0x2c, 0x8b, 0x4f, 0x36, 0xc0, 0x72, 0xe4, 0xa4, 0x01, 0x96, 0xa3, 0xc3, 0xb2, 0xb2, + 0x7c, 0xd5, 0x3c, 0x2c, 0x8a, 0x3b, 0x88, 0xcf, 0xa6, 0x38, 0x24, 0x75, 0x4d, 0xd6, 0x53, 0x59, + 0xb0, 0x9e, 0x86, 0x8b, 0x88, 0x5f, 0xcf, 0x40, 0x81, 0xb3, 0x21, 0x2d, 0x1e, 0x81, 0xc8, 0x75, + 0xb1, 0x4c, 0x5a, 0x27, 0x7e, 0x4e, 0x31, 0x62, 0xf5, 0x57, 0x6a, 0x9a, 0xe2, 0x41, 0x5e, 0x80, + 0xbc, 0xbc, 0x74, 0xcc, 0xbc, 0x32, 0x2e, 0xec, 0x36, 0x6c, 0xeb, 0x43, 0x5e, 0xfa, 0xc6, 0xe8, + 0xf7, 0xfe, 0xf6, 0xcc, 0x33, 0xef, 0xfd, 0xfb, 0xab, 0xcf, 0x94, 0xbf, 0x9f, 0x85, 0x51, 0x4e, + 0x6e, 0xbe, 0xe3, 0x93, 0xb7, 0x8d, 0x51, 0x16, 0x8d, 0xfc, 0xc8, 0xc9, 0xce, 0x51, 0x1b, 0x5c, + 0x56, 0xb1, 0x6e, 0x0a, 0x45, 0x47, 0x58, 0x66, 0x8c, 0xde, 0x9e, 0xd4, 0x93, 0xb2, 0x03, 0xe9, + 0x82, 0xf9, 0x8e, 0xcf, 0x34, 0x81, 0x44, 0xe5, 0xa8, 0xad, 0xcf, 0x9a, 0xa9, 0x2f, 0x3b, 0x35, + 0x2f, 0x4e, 0xcf, 0x50, 0x53, 0x23, 0xe7, 0xd1, 0xf2, 0x9f, 0x66, 0x60, 0x5c, 0xa1, 0xae, 0xda, + 0x7e, 0x40, 0x3e, 0xdf, 0xd5, 0x9d, 0xb3, 0x27, 0xeb, 0x4e, 0x56, 0x9b, 0x77, 0xa6, 0x5e, 0x08, + 0xaa, 0xc4, 0xe8, 0xca, 0x06, 0x14, 0xec, 0x80, 0xb6, 0x7c, 0x79, 0xaf, 0x3c, 0x9f, 0xfe, 0xfb, + 0xc2, 0x0b, 0xb1, 0x15, 0x46, 0x18, 0x05, 0xfd, 0xf2, 0x9f, 0xe4, 0xc2, 0xef, 0x62, 0x1d, 0x4c, + 0xbe, 0x10, 0xb1, 0x2c, 0x56, 0xd2, 0x59, 0x16, 0x19, 0xdf, 0xb8, 0x59, 0xd1, 0xef, 0x36, 0x2b, + 0x2e, 0x0f, 0xc0, 0xac, 0xc8, 0x3f, 0xf1, 0x89, 0xda, 0x14, 0x99, 0x20, 0x9d, 0xd2, 0x2c, 0x97, + 0x1e, 0xb8, 0x81, 0x5d, 0x93, 0x3b, 0xe1, 0x00, 0xed, 0xa6, 0xfc, 0x00, 0xa7, 0x0b, 0x05, 0x17, + 0x8c, 0xb3, 0x2d, 0xff, 0xe7, 0x0c, 0x4c, 0x46, 0x67, 0x36, 0xd9, 0xd3, 0x6b, 0x26, 0x93, 0xd6, + 0xbf, 0xe7, 0xe8, 0xb5, 0x42, 0xf6, 0xa1, 0x28, 0xa2, 0x77, 0xe4, 0xf0, 0xa6, 0x89, 0x8e, 0x56, + 0x16, 0xef, 0x90, 0x99, 0xf8, 0x8d, 0x92, 0x45, 0xf9, 0x7f, 0x64, 0xe5, 0x04, 0x96, 0x52, 0x92, + 0x5c, 0x86, 0xac, 0x5d, 0x97, 0x6a, 0x11, 0xc8, 0x4a, 0xd9, 0x95, 0x45, 0xcc, 0xda, 0x75, 0x7e, + 0x28, 0x15, 0x61, 0x3e, 0xd9, 0xa8, 0xda, 0x14, 0x0b, 0x88, 0xfb, 0x04, 0x8c, 0x31, 0x39, 0x73, + 0x40, 0x3d, 0xdf, 0x76, 0x9d, 0xb8, 0x0a, 0xc4, 0xd6, 0xc9, 0x1d, 0x01, 0x42, 0x13, 0x8f, 0xa9, + 0x73, 0xfc, 0x48, 0x11, 0xd3, 0x3b, 0x8d, 0x63, 0x44, 0x05, 0xa6, 0xd8, 0xfa, 0xe6, 0x82, 0xdc, + 0x09, 0x38, 0x72, 0x21, 0xe6, 0xb4, 0x60, 0x05, 0xd6, 0x82, 0x00, 0xf3, 0x7a, 0x71, 0x7c, 0x53, + 0xbd, 0x2c, 0x1e, 0xa3, 0x5e, 0xae, 0x42, 0x3e, 0xb0, 0x5b, 0x2a, 0xa6, 0xa9, 0x1f, 0xb3, 0x59, + 0xd8, 0x76, 0xbb, 0xc5, 0xda, 0x6e, 0xb7, 0xa8, 0xb1, 0xaf, 0x7c, 0x33, 0x0f, 0x53, 0xbc, 0xcf, + 0x17, 0x69, 0x9b, 0x3a, 0x75, 0xea, 0xd4, 0x0e, 0x4f, 0x60, 0xd3, 0xa9, 0xc0, 0x14, 0x0d, 0x37, + 0x65, 0xc3, 0x95, 0x52, 0x7f, 0xfb, 0x52, 0x14, 0x8c, 0x71, 0x7c, 0x1e, 0x62, 0xcc, 0x8a, 0x92, + 0xdc, 0x2a, 0x97, 0x14, 0x00, 0x43, 0x1c, 0x72, 0x00, 0x23, 0x62, 0xa7, 0xf7, 0xe5, 0x4a, 0xdc, + 0x48, 0x29, 0x49, 0xc3, 0x2f, 0x96, 0x5a, 0x05, 0xdf, 0xa1, 0xc5, 0xff, 0x3e, 0x2a, 0x66, 0xe4, + 0x17, 0x32, 0x50, 0x0a, 0x3c, 0xcb, 0xf1, 0x77, 0x5d, 0xaf, 0x25, 0xb5, 0xd7, 0xad, 0x81, 0xb1, + 0xde, 0x52, 0x94, 0xa9, 0x8c, 0x9b, 0xd3, 0x05, 0x18, 0x72, 0x25, 0x36, 0x5c, 0x92, 0xcd, 0x59, + 0x75, 0x1b, 0x76, 0xcd, 0x6a, 0x8a, 0x88, 0x4d, 0x57, 0xf9, 0xc9, 0x7c, 0x54, 0xdd, 0xa2, 0x2e, + 0x27, 0x62, 0x3d, 0x7e, 0x38, 0x33, 0x15, 0x2b, 0xc2, 0x1e, 0x04, 0xcb, 0xbf, 0x53, 0x80, 0x67, + 0x13, 0xbb, 0x87, 0xec, 0xc8, 0x29, 0x98, 0xfa, 0xa2, 0x8a, 0x4d, 0x44, 0xd9, 0xe5, 0xa3, 0xd1, + 0x89, 0x69, 0x6a, 0x5f, 0xd9, 0x33, 0xd0, 0xbe, 0x76, 0xa5, 0xf6, 0x25, 0xa2, 0x5b, 0x53, 0x7c, + 0x52, 0x68, 0xae, 0x08, 0xd7, 0x4b, 0xa8, 0xc7, 0x11, 0x1b, 0x0a, 0xf4, 0x41, 0xdb, 0x13, 0x0e, + 0x15, 0xa9, 0x18, 0x2d, 0x3d, 0x68, 0x7b, 0x92, 0x91, 0xd6, 0x02, 0x58, 0x99, 0x8f, 0x82, 0x03, + 0x79, 0x1b, 0x2e, 0x30, 0x96, 0xf1, 0x79, 0x22, 0x44, 0xd3, 0xac, 0xac, 0x72, 0x61, 0xb1, 0x1b, + 0x25, 0x69, 0x92, 0x24, 0x91, 0x62, 0x1c, 0x18, 0xab, 0xe4, 0x99, 0xa8, 0x39, 0x2c, 0x75, 0xa3, + 0x24, 0x72, 0x48, 0x20, 0xc5, 0x65, 0x3b, 0x77, 0x86, 0x96, 0x47, 0xf3, 0x50, 0xb6, 0xf3, 0x52, + 0x94, 0xd0, 0xf2, 0xdb, 0x70, 0xb9, 0xf7, 0x72, 0x62, 0xbb, 0xc7, 0x3b, 0xf7, 0xe2, 0xbb, 0xc7, + 0xcd, 0xdb, 0x98, 0x7d, 0xe7, 0x9e, 0xc1, 0x21, 0x7b, 0x24, 0x87, 0xf7, 0xb3, 0x70, 0x2e, 0x7e, + 0x4b, 0x45, 0x3a, 0x30, 0x52, 0x13, 0x37, 0x3b, 0x72, 0x2d, 0xac, 0xa7, 0xb9, 0x90, 0xeb, 0xbe, + 0x22, 0x92, 0x93, 0x55, 0x40, 0x50, 0xf1, 0x22, 0x7f, 0x4d, 0xc5, 0xe4, 0xae, 0x59, 0x6d, 0xb9, + 0x3a, 0xd6, 0x53, 0x99, 0xfe, 0xbb, 0xac, 0xf9, 0x66, 0xe4, 0xee, 0x5a, 0x18, 0xb9, 0xbb, 0x66, + 0xb5, 0xcb, 0x7f, 0x9c, 0x85, 0x31, 0xd3, 0x6a, 0x31, 0xfc, 0x23, 0xc8, 0x7e, 0xe4, 0x08, 0xb2, + 0x32, 0x90, 0xe3, 0x63, 0xcf, 0x53, 0x88, 0x1f, 0x3b, 0x85, 0x0c, 0xe6, 0xb4, 0x7a, 0xcc, 0x41, + 0xe4, 0x3a, 0x9c, 0xef, 0x3a, 0xda, 0x92, 0xd7, 0x01, 0xd8, 0x92, 0xa0, 0xbe, 0x6f, 0xeb, 0xfb, + 0x24, 0xdd, 0x51, 0x4b, 0x1a, 0x82, 0x06, 0x56, 0xf9, 0xdf, 0x65, 0xc0, 0xdc, 0x70, 0xcf, 0xe0, + 0x50, 0xf3, 0x4e, 0xf4, 0x50, 0xb3, 0x34, 0x90, 0xee, 0xea, 0x71, 0xae, 0xf9, 0xe5, 0xc5, 0xc8, + 0xd7, 0xf1, 0xa3, 0xcd, 0x35, 0x18, 0xa7, 0x52, 0x27, 0x4e, 0xca, 0x00, 0xb2, 0x64, 0xc0, 0x30, + 0x82, 0x49, 0x9a, 0x86, 0x69, 0x36, 0x9b, 0xf6, 0x04, 0xa1, 0x8c, 0xb9, 0xc2, 0x4e, 0xd5, 0x6d, + 0xda, 0x25, 0x7b, 0x30, 0xe2, 0x8b, 0x58, 0x17, 0x39, 0xb1, 0x52, 0x9c, 0xc2, 0x54, 0xd0, 0x0c, + 0x97, 0x0e, 0xf2, 0x07, 0x2a, 0xf2, 0xe4, 0x10, 0x0a, 0x2d, 0xdb, 0xb1, 0x5d, 0xb9, 0xc5, 0x6c, + 0x0d, 0x6c, 0xbd, 0xcc, 0xae, 0x31, 0xb2, 0xc2, 0xe0, 0xa3, 0x07, 0x88, 0x97, 0xa1, 0xe0, 0xc8, + 0xd3, 0x7a, 0xd5, 0xa4, 0x63, 0x81, 0xbc, 0x59, 0xb9, 0x3b, 0x38, 0xf6, 0xda, 0x65, 0x21, 0x6a, + 0x72, 0x52, 0xc5, 0xa8, 0x59, 0x93, 0x8e, 0x4c, 0xbe, 0x50, 0x4c, 0xeb, 0x86, 0x18, 0x6f, 0xc2, + 0xb2, 0xdd, 0xa4, 0xb1, 0xeb, 0x1d, 0x23, 0x1b, 0x03, 0xfb, 0x7c, 0x23, 0xe7, 0xc0, 0x80, 0x3f, + 0x5f, 0x5d, 0x4e, 0xc6, 0x3e, 0xbf, 0x3b, 0x13, 0x01, 0x53, 0x54, 0xb5, 0xcb, 0xaa, 0x48, 0xae, + 0x76, 0x67, 0x70, 0xcd, 0x90, 0x4e, 0x7e, 0xa2, 0x15, 0xfa, 0x98, 0xd2, 0xe5, 0xc4, 0xda, 0x81, + 0xbc, 0xd5, 0xba, 0xd7, 0x96, 0xb6, 0xc7, 0x01, 0x0e, 0x41, 0xa5, 0x75, 0xaf, 0x1d, 0x1b, 0x82, + 0xca, 0xda, 0xed, 0x4d, 0xe4, 0xec, 0xd8, 0xe4, 0x17, 0x36, 0x01, 0x18, 0xf4, 0xe4, 0xe7, 0x56, + 0x81, 0xd8, 0xe4, 0x8f, 0x58, 0x0a, 0x3a, 0x90, 0x6f, 0xdd, 0x0b, 0x82, 0xe9, 0xb1, 0x41, 0x7f, + 0xf1, 0xda, 0xbd, 0x20, 0x88, 0x7d, 0xf1, 0xda, 0xed, 0xad, 0x2d, 0xe4, 0xec, 0x18, 0x5b, 0x6e, + 0xdb, 0x19, 0x1f, 0x34, 0xdb, 0x75, 0x2b, 0xf0, 0x63, 0x6c, 0x0d, 0x8b, 0xcf, 0x3d, 0xc8, 0xf9, + 0x8e, 0x2f, 0x9d, 0x24, 0x71, 0x70, 0x5c, 0xab, 0x8e, 0x64, 0xaa, 0x63, 0xaa, 0xab, 0xeb, 0x55, + 0x64, 0xbc, 0x38, 0xcb, 0x7b, 0xfe, 0xf4, 0xe4, 0xc0, 0x59, 0xde, 0xeb, 0x62, 0x79, 0x9b, 0xb1, + 0xbc, 0xe7, 0x93, 0x9f, 0x83, 0x62, 0xbb, 0xb3, 0x53, 0xed, 0xec, 0x4c, 0x4f, 0x71, 0xae, 0xdb, + 0x83, 0xe3, 0xba, 0xc9, 0xe9, 0x0a, 0xc6, 0x5a, 0x2f, 0x10, 0x85, 0x28, 0x99, 0x32, 0xf6, 0x82, + 0xdf, 0xf4, 0xb9, 0x41, 0xb3, 0xbf, 0xce, 0x09, 0xc5, 0xd8, 0x8b, 0x42, 0x94, 0x4c, 0x25, 0xfb, + 0xa6, 0xb5, 0x33, 0x7d, 0x7e, 0x08, 0xec, 0x9b, 0x56, 0x02, 0xfb, 0xa6, 0x25, 0xd8, 0x37, 0xad, + 0x1d, 0x36, 0xb3, 0xf7, 0xea, 0xbb, 0xfe, 0x34, 0x19, 0xf4, 0xcc, 0xbe, 0x51, 0xdf, 0x8d, 0xcf, + 0xec, 0x1b, 0x8b, 0xcb, 0x55, 0xe4, 0xec, 0x98, 0x08, 0xf1, 0x9b, 0x56, 0x6d, 0x7f, 0xfa, 0xc2, + 0xa0, 0x45, 0x48, 0x95, 0x91, 0x8d, 0x89, 0x10, 0x5e, 0x86, 0x82, 0x23, 0xf9, 0x95, 0x0c, 0x8c, + 0xc9, 0x9c, 0x09, 0xd7, 0x3d, 0xbb, 0x3e, 0x7d, 0x31, 0xf5, 0xc5, 0x4d, 0xbc, 0x05, 0x21, 0x71, + 0xd1, 0x8e, 0xd0, 0xfe, 0x15, 0x42, 0xd0, 0x6c, 0x03, 0xf9, 0x5b, 0x19, 0x98, 0xb4, 0x22, 0x39, + 0x31, 0xa6, 0x9f, 0xe5, 0xcd, 0xfa, 0xd9, 0x01, 0xca, 0xf4, 0x68, 0xce, 0x0d, 0xde, 0x32, 0xed, + 0x43, 0x1b, 0x05, 0x62, 0xac, 0x31, 0x6c, 0x92, 0xfa, 0x81, 0x67, 0xb7, 0xe9, 0xf4, 0xa5, 0x41, + 0x4f, 0xd2, 0x2a, 0xa7, 0x1b, 0x9b, 0xa4, 0xa2, 0x10, 0x25, 0x53, 0xbe, 0xd7, 0x52, 0x71, 0x3d, + 0x36, 0xfd, 0xdc, 0xa0, 0xf7, 0x5a, 0x75, 0xef, 0x16, 0xdd, 0x6b, 0x65, 0x29, 0x2a, 0xbe, 0x6c, + 0xc6, 0x7a, 0xb4, 0x6e, 0xfb, 0xd3, 0xd3, 0x83, 0x9e, 0xb1, 0xc8, 0xc8, 0xc6, 0x66, 0x2c, 0x2f, + 0x43, 0xc1, 0x91, 0xc9, 0x64, 0xc7, 0xbf, 0x37, 0xfd, 0xfc, 0xa0, 0x65, 0xf2, 0xba, 0x7f, 0x2f, + 0x26, 0x93, 0xd7, 0xab, 0xb7, 0x91, 0xf1, 0x12, 0x32, 0xb9, 0xe9, 0x5b, 0xde, 0xf4, 0xe5, 0xc1, + 0xcb, 0x64, 0x46, 0xb7, 0x4b, 0x26, 0xb3, 0x42, 0x94, 0x4c, 0xf9, 0x80, 0xf3, 0xe4, 0xcd, 0x76, + 0x6d, 0xfa, 0x47, 0x06, 0x3d, 0xe0, 0xd7, 0x05, 0xe1, 0xd8, 0x80, 0xcb, 0x52, 0x54, 0x7c, 0xc9, + 0x2b, 0x4c, 0xcf, 0x6c, 0x37, 0xed, 0x9a, 0xe5, 0x4f, 0xbf, 0x20, 0xbc, 0x1d, 0x84, 0x2a, 0x28, + 0xca, 0x50, 0x43, 0xc9, 0x6f, 0x64, 0x60, 0x2a, 0x16, 0x38, 0x31, 0xfd, 0x22, 0x6f, 0xf5, 0x5b, + 0x83, 0x6b, 0xf5, 0x7c, 0x94, 0x81, 0x68, 0xbd, 0x36, 0x00, 0xc7, 0x5d, 0xee, 0xe3, 0xed, 0x21, + 0x5f, 0xcb, 0x40, 0x49, 0x97, 0x4d, 0x5f, 0xe1, 0xad, 0xfb, 0xf4, 0x10, 0x5a, 0x27, 0xda, 0xa5, + 0x6d, 0xcb, 0x61, 0xbc, 0x59, 0xc8, 0x9d, 0x4b, 0x60, 0x3e, 0xb3, 0xc5, 0x55, 0xcc, 0xf4, 0xcc, + 0xa0, 0x25, 0x30, 0x86, 0xc4, 0x63, 0x12, 0xd8, 0x80, 0xa0, 0xd9, 0x06, 0x3e, 0x86, 0x56, 0x34, + 0x59, 0xc2, 0xf4, 0xd5, 0x41, 0x8f, 0x61, 0x3c, 0xbf, 0x45, 0x74, 0x0c, 0x63, 0x50, 0x8c, 0xb7, + 0x87, 0xfc, 0x4e, 0x06, 0xce, 0x5b, 0xf1, 0x2c, 0x35, 0xd3, 0x3f, 0xca, 0x5b, 0xf9, 0xf6, 0x80, + 0x5b, 0x19, 0x49, 0x84, 0xc3, 0xdb, 0xa9, 0x63, 0xa8, 0xba, 0xe0, 0xd8, 0xdd, 0x2a, 0xa6, 0x57, + 0xf8, 0xbb, 0x41, 0x7b, 0xba, 0x3c, 0x68, 0xbd, 0xa2, 0xba, 0x1b, 0xc4, 0x8f, 0x26, 0xd5, 0xe5, + 0xad, 0x4d, 0xe4, 0xec, 0xb8, 0x36, 0x45, 0x3d, 0xcf, 0x0e, 0xa6, 0x5f, 0x1a, 0xb8, 0x36, 0xc5, + 0xe9, 0xc6, 0xb5, 0x29, 0x5e, 0x88, 0x92, 0xe9, 0xe5, 0x2f, 0x02, 0x84, 0xe7, 0xf7, 0x04, 0x97, + 0x88, 0xcf, 0x9a, 0x2e, 0x11, 0x03, 0xca, 0x9a, 0x68, 0x38, 0x56, 0x5c, 0xfe, 0x7a, 0x06, 0x26, + 0x22, 0x27, 0xf8, 0x84, 0x36, 0xd4, 0xa2, 0x6d, 0x58, 0x1b, 0x68, 0x78, 0x83, 0xd9, 0x98, 0x5f, + 0xcc, 0x40, 0x49, 0x9f, 0xe5, 0x13, 0x1a, 0xf2, 0x85, 0x68, 0x43, 0x56, 0xd2, 0xa5, 0x6f, 0xec, + 0xd1, 0x08, 0xd6, 0x23, 0x91, 0x43, 0xfd, 0x50, 0x7b, 0x44, 0x73, 0x4a, 0x6e, 0xcc, 0x57, 0x33, + 0x30, 0x6e, 0x1e, 0xed, 0x13, 0xda, 0xb2, 0x13, 0x6d, 0xcb, 0x6a, 0xea, 0x30, 0xd8, 0x23, 0x06, + 0x47, 0x9f, 0xf2, 0x87, 0x3a, 0x38, 0xb1, 0xc4, 0xf1, 0x66, 0x23, 0xbe, 0x9c, 0x01, 0x08, 0x8f, + 0xfc, 0x09, 0xad, 0x78, 0x3b, 0xda, 0x8a, 0x9b, 0x29, 0xbd, 0x0f, 0x8e, 0xe8, 0x0b, 0x7d, 0xfe, + 0x1f, 0x6a, 0x5f, 0xac, 0xdd, 0xde, 0xda, 0xea, 0xd1, 0x88, 0x2f, 0x65, 0xa0, 0xa4, 0xad, 0x01, + 0x43, 0xed, 0x8a, 0xf5, 0xca, 0x56, 0x55, 0xa8, 0xf6, 0xdd, 0xad, 0x78, 0x2f, 0x03, 0xa3, 0xca, + 0x3a, 0x90, 0xd0, 0x88, 0xb7, 0xa2, 0x8d, 0x48, 0xe1, 0x3d, 0x54, 0x5d, 0xaf, 0xf6, 0xe8, 0x08, + 0xde, 0x84, 0x7b, 0x67, 0xd1, 0x84, 0xdb, 0xbd, 0x9a, 0xf0, 0x7e, 0x06, 0xc6, 0x0c, 0xd3, 0x41, + 0x42, 0x2b, 0xac, 0x68, 0x2b, 0x52, 0x5c, 0x60, 0x48, 0x3e, 0xbd, 0x1b, 0x62, 0x18, 0x11, 0x86, + 0xda, 0x10, 0xc9, 0xe7, 0xc8, 0x86, 0x28, 0x73, 0xc2, 0xb0, 0x1b, 0xc2, 0xf8, 0xf4, 0x5e, 0xab, + 0xda, 0xb4, 0x30, 0xd4, 0xb5, 0x7a, 0x63, 0x71, 0xb9, 0x7a, 0x84, 0xdc, 0x0a, 0xed, 0x0c, 0x43, + 0x5d, 0xac, 0x82, 0x4d, 0x72, 0x33, 0xbe, 0x9d, 0x81, 0x73, 0x71, 0x63, 0x43, 0x42, 0x63, 0x76, + 0xa3, 0x8d, 0xd9, 0x4c, 0xe3, 0xbe, 0x14, 0x32, 0x4b, 0x6e, 0xd2, 0xaf, 0x66, 0xe0, 0x42, 0x82, + 0xa1, 0x21, 0xa1, 0x55, 0x76, 0xb4, 0x55, 0xd5, 0x21, 0x24, 0x13, 0x8d, 0x4f, 0x60, 0xc3, 0xd4, + 0x30, 0xd4, 0x09, 0x2c, 0xf9, 0xf4, 0xd6, 0x01, 0x4c, 0x93, 0xc3, 0x50, 0x75, 0x80, 0x6e, 0x9f, + 0xe2, 0xf8, 0x34, 0x0e, 0x8d, 0x0f, 0x43, 0x9d, 0xc6, 0x82, 0x4d, 0x6f, 0x81, 0xaf, 0x4c, 0x11, + 0x43, 0x15, 0xf8, 0xeb, 0xd5, 0xdb, 0x47, 0x0a, 0x7c, 0x6d, 0x97, 0x18, 0xb2, 0xc0, 0xe7, 0x7c, + 0x7a, 0xcf, 0x0e, 0xd3, 0x3e, 0x31, 0xd4, 0xd9, 0xa1, 0x18, 0x25, 0x37, 0xe5, 0x7b, 0x19, 0x23, + 0x15, 0x94, 0x61, 0x74, 0x48, 0x68, 0xd2, 0x3b, 0xd1, 0x26, 0x6d, 0x0d, 0x23, 0x9d, 0x83, 0xd9, + 0xb4, 0x6f, 0x64, 0x60, 0x32, 0x6a, 0x71, 0x48, 0x68, 0x54, 0x3d, 0xda, 0xa8, 0xf5, 0xc1, 0x66, + 0x98, 0x8a, 0xcb, 0xe1, 0xb8, 0xc9, 0x61, 0xa8, 0x72, 0xd8, 0x64, 0xd6, 0x7b, 0xf0, 0x92, 0xac, + 0x0d, 0x43, 0x1d, 0xbc, 0xde, 0xe9, 0x3b, 0xcd, 0xa6, 0xfd, 0x5a, 0x46, 0xa6, 0xa5, 0xec, 0x32, + 0x31, 0x24, 0x34, 0xae, 0x19, 0x6d, 0xdc, 0x9d, 0xe1, 0xa4, 0xf7, 0x8d, 0x2b, 0x18, 0xda, 0xc6, + 0x30, 0x54, 0x05, 0xa3, 0xba, 0xbc, 0xb5, 0x79, 0x94, 0xba, 0x15, 0xda, 0x1b, 0x86, 0xab, 0x6e, + 0x09, 0x3e, 0x89, 0x0d, 0x29, 0xff, 0x6e, 0x36, 0xe2, 0x35, 0x73, 0xe6, 0x1e, 0xd1, 0x16, 0x8c, + 0x35, 0x2d, 0x3f, 0xd8, 0x6e, 0xd7, 0xad, 0x80, 0xaa, 0x1c, 0x77, 0xfd, 0xf8, 0xe3, 0x6a, 0xcb, + 0xdf, 0x6a, 0x48, 0x06, 0x4d, 0x9a, 0xe4, 0x26, 0x10, 0x77, 0x87, 0xcb, 0xb7, 0xfa, 0x75, 0xf1, + 0x5e, 0xa0, 0xf2, 0x5c, 0xce, 0x85, 0x01, 0xaf, 0x1b, 0x5d, 0x18, 0x98, 0x50, 0xab, 0xfc, 0xeb, + 0x19, 0x80, 0xd0, 0x67, 0x90, 0x5c, 0x85, 0x3c, 0x7d, 0xd0, 0xf6, 0xe2, 0xae, 0xbd, 0x0c, 0x03, + 0x39, 0x84, 0x38, 0x50, 0xdc, 0xb5, 0x69, 0xb3, 0xae, 0x5c, 0x7b, 0x52, 0x38, 0x60, 0xca, 0x88, + 0xd0, 0x65, 0x46, 0x2e, 0xec, 0x4f, 0xfe, 0xd3, 0x47, 0xc9, 0xa5, 0xfc, 0x11, 0x18, 0x37, 0xdf, + 0xba, 0x38, 0x3e, 0xda, 0xb3, 0xfc, 0x8f, 0xf2, 0x30, 0x15, 0xb3, 0xaf, 0x68, 0x6f, 0xe2, 0xad, + 0x30, 0xd3, 0x41, 0xd4, 0x9b, 0x98, 0x3b, 0x60, 0x87, 0x38, 0xe4, 0x1b, 0x19, 0x98, 0xba, 0x6f, + 0x05, 0xb5, 0x3d, 0x46, 0x78, 0xc1, 0x74, 0x71, 0x4f, 0xb1, 0x7e, 0xee, 0x46, 0x09, 0x86, 0x86, + 0xd4, 0x18, 0x00, 0xe3, 0xac, 0xc9, 0xab, 0x30, 0xd2, 0x76, 0x9b, 0x4d, 0xdb, 0x69, 0xc8, 0x17, + 0x9a, 0xc2, 0xb0, 0x5a, 0x51, 0x8c, 0x0a, 0x1e, 0x7d, 0x44, 0x2f, 0x9f, 0xd6, 0xdd, 0x24, 0xd6, + 0x91, 0xa7, 0x0a, 0xf0, 0x2a, 0x3c, 0x05, 0x01, 0x5e, 0xff, 0x32, 0x0f, 0xa4, 0x5b, 0xbb, 0x38, + 0xee, 0xbd, 0xc9, 0x97, 0x23, 0xe1, 0x0f, 0xa5, 0x5e, 0x91, 0x0b, 0x22, 0x79, 0x8c, 0x8c, 0x91, + 0xef, 0x7a, 0x60, 0x4c, 0x94, 0xa3, 0xc6, 0xe8, 0x33, 0xe5, 0xfc, 0x57, 0xbb, 0x13, 0xc0, 0x7c, + 0x76, 0x90, 0x1a, 0x56, 0x1f, 0x43, 0xbe, 0xcd, 0x9f, 0x12, 0xdb, 0x93, 0x01, 0xfe, 0xc5, 0xbe, + 0x03, 0xfc, 0x2b, 0xba, 0x32, 0x1a, 0x84, 0xce, 0x3c, 0x41, 0x7d, 0xba, 0x99, 0xf4, 0xa7, 0x45, + 0x38, 0xdf, 0xb5, 0x43, 0x9d, 0x7d, 0xba, 0xc0, 0xd7, 0x60, 0x94, 0xfd, 0x5d, 0x4f, 0x88, 0xd1, + 0xbe, 0x21, 0xcb, 0x51, 0x63, 0x18, 0xa9, 0xf1, 0x72, 0x3d, 0x53, 0xe3, 0x59, 0x91, 0x34, 0xa0, + 0x43, 0x79, 0x07, 0xf1, 0x93, 0x30, 0x21, 0xee, 0x25, 0x54, 0x12, 0xb8, 0x42, 0x34, 0x0b, 0xd8, + 0x75, 0x13, 0x88, 0x51, 0xdc, 0x1e, 0x29, 0xdf, 0x8a, 0xa7, 0x4a, 0xf9, 0xf6, 0x4b, 0xdd, 0x59, + 0xe2, 0x3f, 0x33, 0x40, 0x85, 0xa5, 0x8f, 0x35, 0x65, 0xa6, 0x5b, 0x1c, 0x3d, 0x32, 0xdd, 0xe2, + 0x1c, 0x94, 0x7c, 0xbf, 0x79, 0x87, 0x7a, 0xf6, 0xae, 0x08, 0x33, 0x37, 0x1e, 0xe5, 0xab, 0x2a, + 0x00, 0x86, 0x38, 0x4f, 0x59, 0x08, 0xee, 0xfb, 0x05, 0x6e, 0xd0, 0xd3, 0x8a, 0xc0, 0x31, 0xa2, + 0xf9, 0x4d, 0x98, 0xac, 0x35, 0x5d, 0x87, 0x2e, 0xda, 0x1e, 0x97, 0x30, 0x87, 0xf1, 0x24, 0x6c, + 0x0b, 0x11, 0x28, 0xc6, 0xb0, 0x49, 0x0d, 0x0a, 0x35, 0x8f, 0xd6, 0xfd, 0xf4, 0x61, 0x84, 0xd7, + 0xed, 0x60, 0x81, 0x51, 0x12, 0x61, 0x84, 0xfc, 0x5f, 0x14, 0xb4, 0x79, 0x6a, 0x04, 0x7f, 0x8f, + 0xcb, 0x41, 0x2e, 0x32, 0xf3, 0xfd, 0xa7, 0x46, 0xa8, 0xde, 0xd0, 0xd5, 0x31, 0x42, 0x8c, 0x49, + 0x80, 0x5d, 0xbb, 0x49, 0x99, 0x16, 0x11, 0x4f, 0x32, 0xb1, 0x2c, 0xcb, 0x51, 0x63, 0x88, 0x34, + 0x03, 0x96, 0x53, 0xdb, 0x93, 0x81, 0x1a, 0x46, 0x9a, 0x01, 0x9e, 0xbe, 0x52, 0x42, 0x59, 0xb7, + 0x07, 0x56, 0x43, 0x06, 0x5e, 0xe8, 0x6e, 0xdf, 0xb2, 0x1a, 0xc8, 0xca, 0x19, 0xd8, 0xa3, 0xbb, + 0x32, 0x1b, 0x82, 0x06, 0x23, 0xdd, 0x45, 0x56, 0x4e, 0x5a, 0x50, 0xf4, 0x68, 0xcb, 0x0d, 0xd4, + 0x7b, 0xba, 0x2b, 0xa9, 0xba, 0x15, 0x39, 0x29, 0xa9, 0x4c, 0x81, 0x48, 0xdd, 0xc4, 0x4a, 0x50, + 0x32, 0x21, 0x55, 0x78, 0x56, 0xed, 0xaa, 0x2b, 0x0d, 0xc7, 0xf5, 0xe8, 0x0d, 0xd7, 0xe7, 0x89, + 0xfc, 0x80, 0x2f, 0x0f, 0x95, 0xec, 0xea, 0xd9, 0x95, 0x24, 0x24, 0x4c, 0xae, 0x5b, 0xfe, 0xdd, + 0x0c, 0x8c, 0xaa, 0x31, 0x7d, 0x0a, 0x12, 0x64, 0xdf, 0x86, 0xa9, 0x58, 0x57, 0x9d, 0x20, 0x80, + 0xef, 0x05, 0xc8, 0x77, 0xbc, 0xa6, 0xd0, 0xf1, 0xe5, 0xe3, 0x7a, 0xdb, 0xb8, 0x5a, 0x45, 0x5e, + 0x5a, 0xfe, 0xc3, 0x0c, 0x4c, 0x0a, 0xe3, 0x7b, 0xa5, 0xdd, 0x16, 0xfd, 0xb0, 0x0d, 0xd0, 0xf6, + 0xec, 0x03, 0x2b, 0xa0, 0x2a, 0x4f, 0x62, 0x7f, 0x5b, 0xff, 0xa6, 0xae, 0x8c, 0x06, 0x21, 0xf2, + 0x12, 0x14, 0xac, 0x76, 0x7b, 0x65, 0x91, 0x77, 0x45, 0x2e, 0xf4, 0x36, 0xaa, 0xb0, 0x42, 0x14, + 0x30, 0xb6, 0xd4, 0x6d, 0xc7, 0x0f, 0xac, 0x66, 0x93, 0x9f, 0x69, 0x56, 0x16, 0xe5, 0x59, 0x48, + 0x2f, 0xf5, 0x95, 0x08, 0x14, 0x63, 0xd8, 0xe5, 0xbf, 0x3f, 0x06, 0xe7, 0xbb, 0xee, 0x12, 0x8c, + 0xe0, 0xd2, 0x5c, 0x57, 0x70, 0xa9, 0xb1, 0x9b, 0x67, 0xcf, 0x64, 0x37, 0xd7, 0x79, 0xaf, 0x73, + 0x27, 0xcd, 0x7b, 0x1d, 0xe6, 0x94, 0x94, 0x31, 0xaa, 0x09, 0xb9, 0x82, 0xc3, 0x3c, 0x94, 0x68, + 0xe0, 0x9f, 0x28, 0x11, 0xf7, 0x06, 0x8c, 0x5a, 0x6d, 0x5b, 0xa4, 0x9b, 0x2d, 0xf6, 0x3d, 0x4d, + 0x2b, 0x9b, 0x2b, 0x22, 0xd7, 0xac, 0x26, 0xd2, 0x9d, 0x68, 0x76, 0x64, 0xb0, 0x89, 0x66, 0x4d, + 0x15, 0x7c, 0xf4, 0x58, 0x15, 0xfc, 0x65, 0x28, 0x5a, 0xb5, 0xc0, 0x3e, 0xa0, 0x72, 0x23, 0xd5, + 0xd2, 0xb0, 0xc2, 0x4b, 0x51, 0x42, 0xe5, 0x4b, 0xfc, 0x2a, 0x82, 0x97, 0x8b, 0x95, 0xe8, 0x4b, + 0xfc, 0x3a, 0xb8, 0xd7, 0xc4, 0xe3, 0x7a, 0x0e, 0x9f, 0x2f, 0xd1, 0x64, 0xb7, 0xa1, 0x9e, 0x63, + 0x02, 0x31, 0x8a, 0x4b, 0x2a, 0x30, 0x25, 0x0a, 0xb6, 0xdb, 0xec, 0xf8, 0xcc, 0xaa, 0x8f, 0x47, + 0x67, 0xc5, 0xf5, 0x28, 0x18, 0xe3, 0xf8, 0x3d, 0x54, 0xa5, 0x89, 0xf4, 0xaa, 0xd2, 0x64, 0x6a, + 0x55, 0x29, 0xbe, 0x0e, 0xfb, 0x50, 0x95, 0xbe, 0x12, 0xcf, 0x37, 0x2d, 0xbc, 0xb3, 0x53, 0xa8, + 0x35, 0x6c, 0x51, 0xd5, 0xcd, 0x8c, 0xd2, 0x27, 0xca, 0x33, 0xfd, 0x93, 0x30, 0xe1, 0x7a, 0x0d, + 0xcb, 0xb1, 0xdf, 0xe5, 0x12, 0xc6, 0xe7, 0x6e, 0xda, 0x25, 0x31, 0x47, 0x37, 0x4c, 0x00, 0x46, + 0xf1, 0x48, 0x07, 0x4a, 0x0d, 0x25, 0x56, 0xa7, 0xcf, 0xa7, 0x15, 0x2c, 0x51, 0x09, 0x2d, 0x62, + 0xf7, 0x74, 0x19, 0x86, 0x9c, 0x0c, 0x3d, 0x90, 0x3c, 0x05, 0x7a, 0xe0, 0xff, 0x19, 0xe1, 0xd2, + 0x3a, 0x7a, 0xe1, 0x7a, 0xf6, 0xe7, 0xab, 0x9f, 0x82, 0x92, 0xd4, 0xbc, 0xe5, 0xee, 0x54, 0x9a, + 0xff, 0x11, 0x1d, 0x3d, 0x1b, 0xcf, 0xc6, 0xbe, 0xb2, 0x88, 0x21, 0xf6, 0x89, 0x0e, 0x5b, 0xb1, + 0x8c, 0xde, 0xf9, 0xc1, 0x65, 0xf4, 0xae, 0xc2, 0xb3, 0x22, 0x7f, 0x68, 0xb5, 0xba, 0xca, 0x0f, + 0x02, 0xb6, 0x78, 0x1d, 0x57, 0x3e, 0x5a, 0xa7, 0x75, 0xa2, 0xa5, 0x24, 0x24, 0x4c, 0xae, 0x2b, + 0x05, 0x5a, 0xd3, 0xd2, 0x02, 0xad, 0xd8, 0x25, 0xd0, 0x42, 0x20, 0x46, 0x71, 0x7b, 0x48, 0xa3, + 0xd1, 0xf4, 0xd2, 0xa8, 0x34, 0x00, 0x69, 0x14, 0x9d, 0x67, 0xa7, 0x3c, 0xb8, 0xc1, 0x91, 0x07, + 0xb7, 0x4f, 0xc3, 0x98, 0x78, 0xd9, 0x5b, 0x8c, 0xf5, 0x58, 0xdf, 0x63, 0x5d, 0x0d, 0x6b, 0xa3, + 0x49, 0xca, 0x58, 0xd9, 0xe3, 0x67, 0x93, 0x26, 0xbc, 0x0c, 0xc5, 0x86, 0xe7, 0x76, 0xda, 0x22, + 0x04, 0x48, 0x4e, 0xed, 0xeb, 0xbc, 0x04, 0x25, 0x24, 0xdd, 0xea, 0xff, 0x66, 0x09, 0xa6, 0x62, + 0x7e, 0x0e, 0x89, 0xb6, 0xda, 0xcc, 0x93, 0xb3, 0xd5, 0x5e, 0x8d, 0x64, 0x1b, 0x4c, 0x4a, 0x0d, + 0xd2, 0x95, 0xec, 0x3c, 0x77, 0xf2, 0x64, 0xe7, 0xe4, 0xc7, 0xa1, 0x64, 0xd5, 0xeb, 0x1e, 0xf5, + 0x7d, 0xaa, 0x1e, 0x60, 0x10, 0x6f, 0xcf, 0xab, 0x42, 0x0c, 0xe1, 0xdc, 0x0a, 0x54, 0xdf, 0xf5, + 0xd9, 0x39, 0x23, 0x7e, 0x06, 0x64, 0xbd, 0xc8, 0xca, 0x51, 0x63, 0x90, 0x3a, 0x4c, 0xed, 0x7b, + 0x3b, 0x0b, 0x0b, 0x56, 0x6d, 0x8f, 0x9e, 0xc6, 0x88, 0xc7, 0x13, 0xd6, 0xdc, 0x8a, 0x52, 0xc0, + 0x38, 0x49, 0xc9, 0xe5, 0x16, 0x3d, 0x0c, 0xac, 0x9d, 0xd3, 0xe8, 0x7a, 0x8a, 0x8b, 0x49, 0x01, + 0xe3, 0x24, 0x99, 0x66, 0xb6, 0xef, 0xed, 0xa8, 0x03, 0x96, 0x3c, 0x90, 0x6a, 0xcd, 0xec, 0x56, + 0x08, 0x42, 0x13, 0x8f, 0x75, 0xd8, 0xbe, 0xb7, 0x83, 0xd4, 0x6a, 0xb6, 0x64, 0xaa, 0x3e, 0xdd, + 0x61, 0xb7, 0x64, 0x39, 0x6a, 0x0c, 0xd2, 0x06, 0xc2, 0xbe, 0x8e, 0x8f, 0xbb, 0x0e, 0x8b, 0x97, + 0xd6, 0x94, 0x93, 0xbf, 0x87, 0x7d, 0x89, 0xc9, 0xb7, 0x5b, 0x5d, 0x74, 0x30, 0x81, 0x36, 0xf9, + 0x0c, 0x3c, 0xb7, 0xef, 0xed, 0xc8, 0x2b, 0xcb, 0x4d, 0xcf, 0x76, 0x6a, 0x76, 0xdb, 0x12, 0xd9, + 0xfb, 0xc6, 0xa2, 0x4f, 0xf7, 0xdd, 0x4a, 0x46, 0xc3, 0x5e, 0xf5, 0xa3, 0x17, 0x07, 0xe3, 0x69, + 0x2f, 0x0e, 0x62, 0x8b, 0xf4, 0x54, 0x17, 0x07, 0x13, 0x4f, 0x81, 0x3a, 0xf2, 0xe5, 0x11, 0x18, + 0xbb, 0xb1, 0xb5, 0xb5, 0xa9, 0x72, 0x73, 0x1e, 0x63, 0x96, 0x32, 0x72, 0xad, 0x66, 0xcf, 0xf0, + 0x59, 0x3d, 0x99, 0x58, 0x30, 0x37, 0xac, 0xc4, 0x82, 0x2f, 0x43, 0xb1, 0x45, 0x83, 0x3d, 0xb7, + 0x1e, 0xcf, 0xa5, 0xbd, 0xc6, 0x4b, 0x51, 0x42, 0x63, 0x99, 0x4b, 0x0b, 0x67, 0x9e, 0xb9, 0xf4, + 0x55, 0x18, 0x09, 0xec, 0x16, 0x75, 0x3b, 0x42, 0xb2, 0xe5, 0xc2, 0x2e, 0xdb, 0x12, 0xc5, 0xa8, + 0xe0, 0xa4, 0x0d, 0xa5, 0x1d, 0x65, 0xa8, 0x96, 0x02, 0x6a, 0x20, 0x36, 0x6f, 0x2e, 0xac, 0xf5, + 0x4f, 0x0c, 0x99, 0x90, 0x9f, 0x83, 0x91, 0x3d, 0x6a, 0xd5, 0x59, 0xcf, 0x8c, 0xa6, 0x8d, 0x9c, + 0x32, 0xa6, 0xe4, 0xec, 0x0d, 0x41, 0x34, 0x16, 0x3e, 0x24, 0x4b, 0x51, 0xf1, 0x24, 0x3f, 0x0f, + 0x13, 0xe2, 0xf4, 0x2b, 0x21, 0x52, 0x7d, 0x5a, 0x4e, 0x93, 0x91, 0x20, 0x24, 0x27, 0x8e, 0x3f, + 0x66, 0x89, 0x8f, 0x51, 0x7e, 0x97, 0xdf, 0x80, 0x71, 0xb3, 0xa9, 0xfd, 0xbe, 0xe2, 0x31, 0x11, + 0x79, 0x62, 0x91, 0xbc, 0x62, 0xe4, 0xb5, 0xcf, 0xe9, 0x73, 0x9b, 0x4a, 0xfa, 0x6b, 0x6e, 0xc7, + 0xe2, 0x69, 0x87, 0x9f, 0xf8, 0xf8, 0x1d, 0xf9, 0xb4, 0x43, 0x2e, 0xf2, 0xb4, 0x03, 0x2f, 0x47, + 0x8d, 0xc1, 0x53, 0xc3, 0x04, 0xde, 0x1d, 0xbd, 0x6b, 0x9b, 0x21, 0x80, 0x0c, 0x53, 0x42, 0xcb, + 0xbf, 0x38, 0x09, 0xe3, 0x66, 0xca, 0x3a, 0x36, 0xf7, 0x54, 0x96, 0xb1, 0x4c, 0x34, 0x9b, 0x97, + 0xca, 0x30, 0xa6, 0xe0, 0x91, 0x48, 0xae, 0xec, 0x91, 0x91, 0x5c, 0xdf, 0x16, 0x89, 0x4e, 0xa3, + 0x79, 0xcf, 0xd3, 0x27, 0x29, 0xe9, 0x4a, 0xa5, 0xae, 0x53, 0x9e, 0x46, 0x8b, 0xb1, 0x9b, 0x39, + 0xf9, 0xed, 0x0c, 0x3c, 0xef, 0x51, 0x26, 0x76, 0xa8, 0xd7, 0x55, 0x41, 0x9e, 0x64, 0x06, 0xda, + 0xb4, 0x17, 0x1f, 0x3d, 0x9c, 0x79, 0x1e, 0x7b, 0x71, 0xc4, 0xde, 0x8d, 0x21, 0x7f, 0x27, 0x03, + 0xd3, 0x2d, 0x1a, 0x78, 0x76, 0xcd, 0xef, 0x6e, 0x69, 0x61, 0xf0, 0x2d, 0x7d, 0xe1, 0xd1, 0xc3, + 0x99, 0xe9, 0xb5, 0x1e, 0x0c, 0xb1, 0x67, 0x53, 0xc8, 0x7b, 0x99, 0xa4, 0x97, 0x35, 0x52, 0x84, + 0x7d, 0x18, 0x49, 0x7d, 0xaa, 0x81, 0x67, 0x05, 0xb4, 0x71, 0x78, 0xcc, 0xe3, 0x1a, 0xcd, 0xc8, + 0x85, 0x58, 0xca, 0x2b, 0x11, 0xb5, 0xdd, 0x8a, 0x69, 0x9d, 0xa0, 0x03, 0x7c, 0x27, 0x03, 0xe3, + 0x8e, 0x5b, 0xa7, 0x4a, 0x47, 0x92, 0x02, 0xf1, 0xd3, 0x83, 0xc9, 0x1e, 0x39, 0xbb, 0x6e, 0x90, + 0x16, 0x62, 0x51, 0xdb, 0x75, 0x4c, 0x10, 0x46, 0xda, 0x40, 0xb6, 0x61, 0x2c, 0x70, 0x9b, 0xd2, + 0x73, 0x46, 0x89, 0xc7, 0x2b, 0x49, 0x6a, 0xde, 0x96, 0x46, 0x0b, 0x55, 0xce, 0xb0, 0xcc, 0x47, + 0x93, 0x0e, 0xa1, 0xdd, 0x59, 0xfe, 0x85, 0x06, 0xf9, 0x72, 0x12, 0xe9, 0x4d, 0xb7, 0x7e, 0xaa, + 0x44, 0xff, 0xc4, 0x81, 0x73, 0xfa, 0x7d, 0x01, 0xa1, 0x23, 0xfb, 0x32, 0x29, 0x45, 0xa2, 0xa6, + 0xba, 0xea, 0xd6, 0xac, 0xa6, 0x48, 0xbc, 0x84, 0x74, 0x97, 0x7a, 0x3c, 0xff, 0x93, 0x7e, 0x91, + 0x61, 0x25, 0x46, 0x09, 0xbb, 0x68, 0x93, 0xeb, 0x70, 0xbe, 0xed, 0xd9, 0x2e, 0x6f, 0x42, 0xd3, + 0xf2, 0x45, 0x1e, 0x1e, 0x61, 0xa8, 0xd4, 0x81, 0x79, 0x9b, 0x71, 0x04, 0xec, 0xae, 0x23, 0x0e, + 0xd2, 0xa2, 0x90, 0x6b, 0x84, 0x05, 0x75, 0x90, 0x16, 0x65, 0xa8, 0xa1, 0x64, 0x19, 0x46, 0xad, + 0xdd, 0x5d, 0xdb, 0x61, 0x98, 0xe2, 0x5d, 0xac, 0x17, 0x92, 0x3e, 0xad, 0x22, 0x71, 0xa4, 0x2d, + 0x5a, 0xfe, 0x42, 0x5d, 0x57, 0xbd, 0x28, 0x60, 0xd7, 0x68, 0xa5, 0x56, 0x73, 0x3b, 0x32, 0x09, + 0xe1, 0x54, 0xf7, 0x8b, 0x02, 0x51, 0x0c, 0x4c, 0xa8, 0xc5, 0x5a, 0xef, 0xd3, 0x20, 0xb0, 0x9d, + 0x86, 0x2f, 0xdf, 0xb4, 0xe2, 0x5c, 0xab, 0xb2, 0x0c, 0x35, 0x94, 0x1d, 0xec, 0xfc, 0xc0, 0xf2, + 0x82, 0x8a, 0xd7, 0xf0, 0x79, 0x6a, 0x05, 0x79, 0xb0, 0xab, 0xaa, 0x42, 0x0c, 0xe1, 0xe4, 0xe3, + 0x30, 0xee, 0x1b, 0xb9, 0x42, 0xb9, 0xe5, 0xae, 0x24, 0xaf, 0x04, 0x8d, 0x72, 0x8c, 0x60, 0x91, + 0x59, 0x80, 0x96, 0xf5, 0x40, 0x6a, 0x87, 0xd3, 0x17, 0xc4, 0xfe, 0xc5, 0xd4, 0xa5, 0x35, 0x5d, + 0x8a, 0x06, 0xc6, 0xe5, 0x9f, 0x81, 0xf3, 0x5d, 0x4b, 0xa5, 0xaf, 0x6d, 0xf9, 0xb7, 0xb2, 0x30, + 0x15, 0x4b, 0x6b, 0x7a, 0x9c, 0x86, 0xfc, 0x39, 0x18, 0x17, 0xe6, 0x2a, 0x79, 0x36, 0xcc, 0xf6, + 0x7d, 0x27, 0x5a, 0x31, 0xaa, 0x63, 0x84, 0x18, 0xb9, 0x16, 0xeb, 0xb6, 0x5c, 0x34, 0x2f, 0xd4, + 0x11, 0x5d, 0x27, 0x35, 0xe8, 0xfc, 0x90, 0x34, 0xe8, 0xf2, 0x2c, 0x8c, 0xdd, 0xba, 0x56, 0x55, + 0xe1, 0x78, 0xe1, 0x23, 0x04, 0x19, 0x9e, 0xf8, 0xb9, 0xeb, 0x11, 0x82, 0xf2, 0x37, 0x73, 0x70, + 0xde, 0xa8, 0x20, 0x5f, 0x0c, 0xf9, 0x79, 0x28, 0x36, 0xad, 0x1d, 0xda, 0x54, 0xaf, 0x02, 0xa4, + 0x38, 0xc0, 0x75, 0x11, 0x9f, 0x5d, 0xe5, 0x94, 0x63, 0xf1, 0xa4, 0xa2, 0x10, 0x25, 0x5b, 0xb2, + 0x07, 0x23, 0x3b, 0x32, 0xdb, 0x7a, 0x76, 0x50, 0xd9, 0xd6, 0xb9, 0x01, 0x56, 0xe5, 0x58, 0x57, + 0xe4, 0xb9, 0x1d, 0xd3, 0xf3, 0x5c, 0x6f, 0x43, 0xe5, 0x5a, 0x97, 0x1a, 0xbc, 0x74, 0xb0, 0x0a, + 0xed, 0x98, 0x49, 0x48, 0x98, 0x5c, 0xf7, 0xf2, 0x4f, 0xc1, 0x98, 0xf1, 0x95, 0x7d, 0x4d, 0xf5, + 0x7f, 0x9e, 0x83, 0x51, 0x95, 0x31, 0xf8, 0xb8, 0x39, 0xfe, 0x12, 0x14, 0xf8, 0x7b, 0xf0, 0xd2, + 0x46, 0xa4, 0xaf, 0x35, 0xf9, 0x7b, 0xf1, 0x28, 0x60, 0xa6, 0xbe, 0x98, 0x3b, 0x46, 0x5f, 0x1c, + 0xf2, 0xe4, 0x24, 0x3b, 0x90, 0xf7, 0x2d, 0xbf, 0x29, 0x55, 0xa2, 0x34, 0x41, 0xc0, 0x95, 0xea, + 0xaa, 0xf9, 0x06, 0x1d, 0xfb, 0x8d, 0x9c, 0x36, 0xf9, 0x4a, 0x06, 0x26, 0x6a, 0xae, 0xe3, 0x77, + 0x5a, 0xd4, 0xe3, 0x16, 0x43, 0xa9, 0xe5, 0xac, 0xa6, 0x0c, 0xa1, 0x5c, 0x30, 0x69, 0x8a, 0x53, + 0x48, 0xa4, 0x08, 0xa3, 0x5c, 0xf9, 0x4b, 0xd8, 0xdd, 0x15, 0xc9, 0x1c, 0x94, 0xb8, 0xfd, 0xd2, + 0x48, 0x27, 0xa7, 0xbd, 0x6b, 0xae, 0x2b, 0x00, 0x86, 0x38, 0xec, 0x9c, 0xe0, 0x36, 0xeb, 0x54, + 0xbf, 0x66, 0xa4, 0x57, 0xcc, 0x06, 0x2f, 0x45, 0x09, 0x65, 0xfb, 0xa4, 0x47, 0x77, 0xac, 0xa6, + 0x65, 0xe8, 0x62, 0x72, 0xc0, 0xf5, 0x3e, 0x89, 0x71, 0x04, 0xec, 0xae, 0x53, 0xfe, 0x4f, 0xa3, + 0x70, 0x2e, 0x1e, 0x34, 0x7a, 0xdc, 0x44, 0x9c, 0x83, 0x52, 0xdb, 0xf2, 0x02, 0xdb, 0x78, 0x3f, + 0x4c, 0x7f, 0xd5, 0xa6, 0x02, 0x60, 0x88, 0x13, 0xce, 0xdc, 0xdc, 0x11, 0x33, 0x37, 0xf9, 0xf5, + 0x85, 0xfc, 0xd9, 0xbf, 0xbe, 0x20, 0xd7, 0x45, 0x61, 0x58, 0xeb, 0xc2, 0xf4, 0xd4, 0x2c, 0x1e, + 0xeb, 0xa9, 0xf9, 0x7e, 0xb7, 0x53, 0xd9, 0xa7, 0x07, 0x17, 0x1f, 0xdc, 0xdf, 0x45, 0x69, 0x6c, + 0xa9, 0x8d, 0x3e, 0x89, 0xa5, 0x46, 0x36, 0xe1, 0x62, 0xd3, 0x6e, 0x49, 0xcf, 0x38, 0x7f, 0x93, + 0x7a, 0x55, 0x5a, 0x73, 0x9d, 0x3a, 0x37, 0xbc, 0xe6, 0x42, 0x87, 0x85, 0xd5, 0x04, 0x1c, 0x4c, + 0xac, 0x69, 0xca, 0x4c, 0x38, 0x46, 0x66, 0x2a, 0x99, 0x36, 0x36, 0x44, 0x99, 0x76, 0xe6, 0xf7, + 0x2f, 0xa1, 0x43, 0xf2, 0xc4, 0x51, 0x0e, 0xc9, 0xe9, 0x4c, 0x9e, 0x7f, 0x13, 0x60, 0x9c, 0x8f, + 0xf7, 0x09, 0x6d, 0x9e, 0x27, 0xda, 0xed, 0x22, 0x92, 0x28, 0xc7, 0xd5, 0xfc, 0xa3, 0x25, 0x51, + 0xd4, 0x94, 0x98, 0x3f, 0x73, 0x53, 0xe2, 0x35, 0x18, 0xf7, 0xc4, 0x73, 0x71, 0xf5, 0x4a, 0x6d, + 0xdf, 0x97, 0xef, 0x0b, 0x19, 0xfe, 0x01, 0x21, 0x0c, 0x23, 0x98, 0x4c, 0x6a, 0xd4, 0xdc, 0x16, + 0xcf, 0xce, 0x1a, 0x97, 0x1a, 0x0b, 0xb2, 0x1c, 0x35, 0x06, 0x79, 0x13, 0x26, 0x77, 0x9b, 0x1d, + 0x7f, 0x6f, 0x99, 0xd1, 0xa0, 0x4e, 0x4d, 0xbc, 0x23, 0x53, 0x08, 0xbd, 0x9b, 0x96, 0x23, 0x50, + 0x8c, 0x61, 0x0f, 0xfd, 0x4d, 0x19, 0xc3, 0xa2, 0x5d, 0x3a, 0x43, 0x8b, 0xf6, 0x4f, 0xc3, 0x94, + 0x9e, 0x0b, 0xb6, 0xd3, 0x50, 0x4e, 0x7d, 0x25, 0x71, 0x1a, 0xde, 0x8c, 0x82, 0x30, 0x8e, 0x6b, + 0x0a, 0x8a, 0xb1, 0x13, 0x0a, 0x8a, 0xf1, 0x21, 0x0a, 0x8a, 0xaf, 0x67, 0x60, 0xd2, 0xaf, 0xed, + 0xd1, 0x96, 0x85, 0xb4, 0x61, 0xfb, 0x81, 0x77, 0x28, 0x2f, 0x3f, 0x52, 0x04, 0x01, 0x56, 0x23, + 0xf4, 0x24, 0x63, 0xfe, 0x00, 0x6d, 0x14, 0x82, 0x31, 0xce, 0xe4, 0x8b, 0xa1, 0x1d, 0x7a, 0x32, + 0x6d, 0x32, 0x1c, 0x53, 0x4e, 0x9c, 0xda, 0x10, 0x3d, 0xf5, 0x14, 0x19, 0xa2, 0x37, 0x00, 0x56, + 0xdd, 0x86, 0x92, 0x8c, 0x15, 0x98, 0x52, 0x6f, 0x02, 0x8b, 0x1d, 0x4a, 0x04, 0xa0, 0xe5, 0xc3, + 0xeb, 0xe4, 0x95, 0x28, 0x18, 0xe3, 0xf8, 0xe5, 0xdf, 0x2f, 0xc2, 0x54, 0x2c, 0x0b, 0xc7, 0x40, + 0x04, 0x2e, 0x93, 0x42, 0x4d, 0x9b, 0x3a, 0xc1, 0x4a, 0x5d, 0x2a, 0x73, 0xa1, 0x14, 0x12, 0xe5, + 0x8b, 0xa8, 0x31, 0x3e, 0x38, 0x2a, 0x9d, 0xa9, 0x72, 0x15, 0x4e, 0xfa, 0xa0, 0x56, 0x71, 0x58, + 0xc2, 0xef, 0x2b, 0xdd, 0x2a, 0xdd, 0xdd, 0x81, 0x25, 0x5b, 0x39, 0xd5, 0x9d, 0xe9, 0xd9, 0x3c, + 0x7d, 0xac, 0x83, 0x41, 0x4a, 0x43, 0x0b, 0x06, 0x49, 0xa7, 0xa3, 0x7c, 0x3d, 0x07, 0xba, 0x9f, + 0x98, 0x74, 0x1d, 0xb3, 0x1c, 0xc7, 0x0d, 0xa4, 0xe5, 0x36, 0x93, 0x56, 0xaa, 0x29, 0xca, 0xb3, + 0x95, 0x90, 0x6a, 0x2c, 0x6f, 0x9b, 0x01, 0x41, 0x93, 0x39, 0x39, 0xd0, 0x26, 0x1a, 0x71, 0x01, + 0xbc, 0x3e, 0x80, 0x66, 0x9c, 0xc0, 0x32, 0x73, 0xf9, 0x4d, 0x38, 0x17, 0x6f, 0x6d, 0x3f, 0x3d, + 0x9a, 0xc6, 0x34, 0xf2, 0x27, 0x59, 0x18, 0x5d, 0xaf, 0x6c, 0x55, 0xf9, 0x2d, 0x67, 0x1d, 0x0a, + 0xfc, 0xca, 0x53, 0xba, 0xe8, 0x0c, 0x64, 0xea, 0x70, 0xf3, 0x18, 0xff, 0x89, 0x82, 0x38, 0x59, + 0x66, 0x22, 0x70, 0x9f, 0x3a, 0xfd, 0x99, 0x0f, 0x4b, 0x42, 0x4a, 0xee, 0x53, 0x07, 0x45, 0x75, + 0xb2, 0x00, 0x79, 0x87, 0x7d, 0x67, 0x5f, 0x8f, 0x56, 0x8a, 0x77, 0xb0, 0x98, 0xde, 0xc1, 0x2b, + 0xf3, 0x87, 0x6f, 0x3d, 0x5a, 0xa7, 0x4e, 0x60, 0x5b, 0xcd, 0xfe, 0x7c, 0xf9, 0xc4, 0xc3, 0xb7, + 0xba, 0x32, 0x1a, 0x84, 0xca, 0x3f, 0xc8, 0xc0, 0x88, 0x7c, 0x7a, 0x8b, 0x34, 0xa1, 0xe8, 0x58, + 0xdc, 0x61, 0x39, 0xb5, 0xfb, 0xe3, 0x3a, 0xa7, 0xa3, 0xaf, 0x85, 0xf8, 0xea, 0x17, 0x65, 0x28, + 0x79, 0x90, 0x3d, 0x28, 0x52, 0xf1, 0xe8, 0x55, 0xea, 0xb4, 0x70, 0xec, 0x03, 0xcc, 0x08, 0x0e, + 0xf9, 0xcc, 0x95, 0xa4, 0x5f, 0xfe, 0x61, 0x06, 0x20, 0x44, 0x39, 0x6e, 0xe3, 0xfb, 0x71, 0x28, + 0xd5, 0x9a, 0x1d, 0x3f, 0xa0, 0x9e, 0x76, 0xca, 0x14, 0x4f, 0x56, 0xa8, 0x42, 0x0c, 0xe1, 0xe4, + 0x35, 0x29, 0xc2, 0xc4, 0xe6, 0x37, 0xad, 0xa4, 0xcf, 0xe3, 0x87, 0x33, 0xe3, 0x3c, 0x10, 0x51, + 0x99, 0x5a, 0x44, 0x68, 0x5a, 0xdc, 0x2c, 0x9d, 0x1f, 0xa0, 0x59, 0xba, 0xfc, 0x7b, 0x45, 0x38, + 0x17, 0x4f, 0x72, 0x75, 0xdc, 0xb7, 0x1a, 0x8f, 0x43, 0x65, 0x8f, 0x79, 0x1c, 0x2a, 0x79, 0xf3, + 0xce, 0x3d, 0xd9, 0xcd, 0x3b, 0x7f, 0xd2, 0xcd, 0x7b, 0x68, 0xd6, 0x9b, 0x88, 0x3d, 0xa6, 0x98, + 0xd6, 0x1e, 0x13, 0x1f, 0xbf, 0x3e, 0x76, 0xef, 0xb7, 0xe5, 0x4c, 0x4c, 0x7d, 0xaf, 0xaa, 0x84, + 0x6c, 0x57, 0x60, 0xe5, 0x99, 0xeb, 0x07, 0x33, 0x50, 0xb8, 0xd7, 0xa1, 0x1d, 0x2a, 0x9d, 0xe8, + 0xb8, 0x60, 0xe5, 0xb9, 0x2c, 0x50, 0x94, 0xa7, 0xdb, 0xdd, 0xff, 0x41, 0x0e, 0xc6, 0xd8, 0xb7, + 0x9e, 0xd0, 0x00, 0xd1, 0xc7, 0x52, 0x31, 0x4e, 0xb3, 0xb9, 0x33, 0x3c, 0xcd, 0x3e, 0x69, 0x63, + 0xc6, 0x90, 0x97, 0x5a, 0xf9, 0x87, 0x05, 0x98, 0x8c, 0x26, 0x33, 0x22, 0x9f, 0x80, 0xb1, 0x3d, + 0xd7, 0x0f, 0xa4, 0xdb, 0xaa, 0x1c, 0x3b, 0xad, 0x3e, 0xdd, 0x08, 0x41, 0x68, 0xe2, 0x9d, 0xf8, + 0xea, 0x44, 0xbe, 0x57, 0x1c, 0xbf, 0x3a, 0x91, 0x6f, 0x1a, 0xa3, 0x82, 0xff, 0xd5, 0xc1, 0x26, + 0x59, 0x36, 0x7e, 0xb9, 0xfb, 0x60, 0x73, 0x67, 0x50, 0x79, 0xac, 0x3e, 0xc0, 0xe7, 0x9a, 0x74, + 0x62, 0xe9, 0x57, 0xa6, 0x60, 0x32, 0xaa, 0x3d, 0xb1, 0x51, 0xd5, 0x9e, 0x5c, 0x19, 0x6e, 0xb7, + 0x33, 0x9e, 0x68, 0xe9, 0xf2, 0xe6, 0x52, 0x2a, 0x49, 0xf6, 0x44, 0x2a, 0x49, 0xdc, 0x2b, 0x28, + 0x77, 0xf6, 0x5e, 0x41, 0xc9, 0xee, 0x67, 0xf9, 0x27, 0xe9, 0x7e, 0xf6, 0xb4, 0xf8, 0x74, 0x7d, + 0x37, 0xee, 0xe2, 0x54, 0x4c, 0x9b, 0xbb, 0x23, 0x3a, 0xf5, 0x06, 0xe3, 0xe4, 0x34, 0x32, 0x20, + 0x27, 0x27, 0xd3, 0x7d, 0x6c, 0x74, 0xe8, 0xee, 0x63, 0x09, 0x2e, 0x55, 0xa5, 0x21, 0xb8, 0x54, + 0x95, 0xa1, 0xd8, 0xb2, 0x1e, 0x54, 0x1a, 0x2a, 0xf0, 0x93, 0x0b, 0x94, 0x35, 0x5e, 0x82, 0x12, + 0x72, 0xe6, 0x6e, 0x57, 0xc9, 0xbe, 0x4b, 0xe3, 0xa7, 0xf2, 0x5d, 0x4a, 0x74, 0xe1, 0x9a, 0x48, + 0xe9, 0xc2, 0x35, 0x79, 0x62, 0x17, 0xae, 0xa9, 0x14, 0x2e, 0x5c, 0x1f, 0x82, 0x91, 0x96, 0xf5, + 0x60, 0xcd, 0x97, 0x5e, 0x57, 0x79, 0xe1, 0x44, 0xb2, 0x26, 0x8a, 0x50, 0xc1, 0x58, 0xc3, 0x5a, + 0xd6, 0x83, 0xf9, 0xc3, 0x80, 0xfa, 0x3c, 0xe0, 0x52, 0x7a, 0x67, 0xad, 0xc9, 0x32, 0xd4, 0x50, + 0x49, 0xb0, 0xda, 0xd9, 0xf1, 0xb9, 0xaf, 0x55, 0x48, 0x90, 0x15, 0xa1, 0x82, 0xf5, 0xeb, 0x61, + 0x45, 0x56, 0xe1, 0xa2, 0x67, 0xed, 0x06, 0x37, 0xa8, 0xe5, 0x05, 0x3b, 0xd4, 0x0a, 0x94, 0x13, + 0xcb, 0x45, 0xbd, 0x03, 0x5c, 0xc4, 0x04, 0x38, 0x26, 0xd6, 0x22, 0x2b, 0x70, 0x81, 0x95, 0x2f, + 0x35, 0x85, 0x6a, 0xa1, 0x88, 0x3d, 0x2b, 0xc2, 0x83, 0x1f, 0x3d, 0x9c, 0xb9, 0x80, 0xdd, 0x60, + 0x4c, 0xaa, 0x43, 0x3e, 0x05, 0xe7, 0x58, 0xf1, 0x2a, 0xb5, 0x7c, 0xaa, 0xe8, 0x5c, 0x12, 0xde, + 0x52, 0x6c, 0x26, 0x62, 0x0c, 0x86, 0x5d, 0xd8, 0x64, 0x01, 0xce, 0xb3, 0xb2, 0x05, 0xb7, 0xd5, + 0xb2, 0xf5, 0x77, 0x3d, 0x27, 0x22, 0x9d, 0xb8, 0x53, 0x43, 0x1c, 0x88, 0xdd, 0xf8, 0xe9, 0x3d, + 0xd0, 0xbe, 0x95, 0x87, 0x73, 0x1b, 0x6d, 0xea, 0xdc, 0xdd, 0xb3, 0xfd, 0x7d, 0x75, 0x5e, 0xb8, + 0x0a, 0x79, 0xa6, 0x53, 0xc6, 0x13, 0x20, 0x30, 0xa5, 0x13, 0x39, 0xc4, 0xbc, 0x1f, 0xca, 0x1e, + 0x73, 0x3f, 0x34, 0x07, 0x25, 0xc7, 0x6a, 0x51, 0xbf, 0x6d, 0xd5, 0xba, 0x5e, 0x2a, 0x5e, 0x57, + 0x00, 0x0c, 0x71, 0x08, 0x42, 0x89, 0xed, 0xdf, 0xa7, 0x88, 0xec, 0x14, 0x81, 0x5e, 0xaa, 0x2e, + 0x86, 0x64, 0xc8, 0xeb, 0x00, 0x16, 0x1f, 0x3f, 0xbe, 0x46, 0x0b, 0xd1, 0x67, 0x21, 0x2b, 0x1a, + 0x82, 0x06, 0x96, 0x79, 0xd6, 0x29, 0x3e, 0xb1, 0xb3, 0xce, 0xc8, 0x59, 0x9f, 0x75, 0xca, 0x9f, + 0x81, 0xf3, 0x5d, 0x71, 0xdd, 0xec, 0x58, 0x21, 0x12, 0x2c, 0x64, 0xa2, 0xc7, 0x8a, 0x48, 0x5a, + 0x85, 0x19, 0x28, 0xf0, 0x51, 0x94, 0x69, 0x31, 0xf8, 0xa1, 0x96, 0x8f, 0x30, 0x8a, 0xf2, 0x32, + 0xc2, 0xb8, 0x99, 0xd4, 0xee, 0xf8, 0x64, 0x75, 0x3a, 0x15, 0x47, 0xb6, 0x57, 0x2a, 0x8e, 0xf2, + 0xf7, 0xb2, 0x70, 0x21, 0x41, 0x31, 0x63, 0x0b, 0x54, 0x3e, 0xc8, 0x14, 0xca, 0xe6, 0x4c, 0xb8, + 0x40, 0xab, 0x31, 0x18, 0x76, 0x61, 0x93, 0x2f, 0xb0, 0x39, 0x53, 0xa3, 0xbe, 0xbf, 0xe6, 0xd6, + 0x55, 0x0b, 0x7e, 0x46, 0xcc, 0x17, 0x55, 0xfa, 0xf8, 0xe1, 0xcc, 0x87, 0xc5, 0xcc, 0x9c, 0xb3, + 0xda, 0xf6, 0x1c, 0x9b, 0x99, 0x73, 0x07, 0x86, 0xa2, 0x18, 0xdc, 0x71, 0x9b, 0x9d, 0x16, 0x0d, + 0x2b, 0xa0, 0x41, 0x92, 0xbc, 0x05, 0x70, 0xc0, 0xe1, 0x55, 0xfb, 0x5d, 0xa5, 0x9e, 0x1e, 0xf9, + 0xca, 0xe8, 0xac, 0x7a, 0xac, 0x70, 0xf6, 0x76, 0xc7, 0x72, 0x02, 0x26, 0xe0, 0xb9, 0xf0, 0xbc, + 0xa3, 0xa9, 0xa0, 0x41, 0xb1, 0xfc, 0x6b, 0x45, 0x38, 0xdf, 0x95, 0x8d, 0x9c, 0x7b, 0x12, 0xe8, + 0xc8, 0xec, 0x98, 0xa7, 0x56, 0x62, 0x3c, 0xf6, 0x9b, 0x30, 0xc9, 0x8f, 0x8d, 0x9b, 0xb1, 0x78, + 0x6e, 0x7d, 0xc3, 0xbe, 0x15, 0x81, 0x62, 0x0c, 0xfb, 0x64, 0x3e, 0x51, 0x6f, 0xc2, 0xa4, 0xdf, + 0xd9, 0x11, 0xcf, 0x06, 0x8b, 0x24, 0x25, 0xf9, 0x28, 0x93, 0x6a, 0x04, 0x8a, 0x31, 0x6c, 0xd2, + 0x80, 0x73, 0xa1, 0xe9, 0x57, 0xda, 0x20, 0x0b, 0xfd, 0xc8, 0x0e, 0x3e, 0x2b, 0x16, 0x62, 0x24, + 0xb0, 0x8b, 0x28, 0xd9, 0x81, 0xcb, 0x22, 0xae, 0xda, 0x6c, 0x50, 0x2c, 0x9d, 0x56, 0x59, 0x36, + 0xfa, 0xf2, 0x62, 0x4f, 0x4c, 0x3c, 0x82, 0x4a, 0xe4, 0xac, 0x3b, 0x72, 0xec, 0x59, 0x37, 0x12, + 0xd3, 0x3d, 0x9a, 0x36, 0xa6, 0xbb, 0x6b, 0xc2, 0x9c, 0xea, 0x38, 0x5a, 0x7a, 0x0a, 0x8e, 0xa3, + 0x7f, 0x6f, 0x8c, 0x2d, 0x8f, 0x58, 0xee, 0x66, 0xa6, 0xb4, 0xf2, 0x19, 0x29, 0xae, 0xc1, 0xa4, + 0xd2, 0xca, 0xa7, 0xaa, 0x8f, 0x12, 0x72, 0x82, 0x10, 0x66, 0x69, 0x71, 0xcb, 0xf5, 0xb0, 0xb8, + 0xb5, 0xe1, 0x42, 0xd0, 0xf4, 0xb7, 0xbc, 0x8e, 0x1f, 0x2c, 0x50, 0x2f, 0x38, 0x95, 0xd1, 0x9c, + 0xeb, 0x2b, 0x5b, 0xab, 0xd5, 0x38, 0x15, 0x4c, 0x22, 0xcd, 0xa6, 0x6d, 0xd0, 0xf4, 0x2b, 0xcd, + 0xa6, 0x7b, 0x5f, 0xe5, 0x73, 0x09, 0xcd, 0x2e, 0xd2, 0xa0, 0xa2, 0xa7, 0xed, 0xd6, 0x6a, 0xb5, + 0x07, 0x26, 0x1e, 0x41, 0x85, 0xac, 0xf1, 0xaf, 0xba, 0x63, 0x35, 0xed, 0xba, 0x15, 0xf0, 0x7c, + 0x50, 0x5c, 0x76, 0x8b, 0x35, 0xa1, 0xb3, 0x3f, 0x6c, 0xad, 0x56, 0xe3, 0x28, 0x98, 0x54, 0x4f, + 0xd9, 0x70, 0x46, 0x86, 0x68, 0xdf, 0x4e, 0x30, 0x6d, 0x8d, 0x3e, 0x59, 0xd3, 0x56, 0xa9, 0xbf, + 0xe5, 0x0e, 0xe9, 0x97, 0x7b, 0x6c, 0x01, 0xf4, 0xb1, 0xdc, 0xeb, 0x30, 0xa5, 0x35, 0x2c, 0x39, + 0x83, 0xc7, 0xfa, 0x8e, 0x54, 0xaf, 0x44, 0x29, 0x60, 0x9c, 0xe4, 0xd9, 0x3b, 0x09, 0xfe, 0x56, + 0x06, 0xce, 0xb1, 0x46, 0x54, 0x82, 0x3d, 0xea, 0xbc, 0xcb, 0xb5, 0x24, 0xf5, 0x64, 0xab, 0x35, + 0xc8, 0x8e, 0xae, 0xc4, 0x78, 0x88, 0x0e, 0xd7, 0x87, 0xd9, 0x38, 0x18, 0xbb, 0x1a, 0xc5, 0x36, + 0xbd, 0xb0, 0x4c, 0x8e, 0xc0, 0x64, 0xdf, 0x9b, 0x5e, 0x25, 0x46, 0x02, 0xbb, 0x88, 0xa6, 0x92, + 0xb3, 0x97, 0x17, 0xe0, 0xd9, 0xc4, 0x4f, 0xed, 0x4b, 0x58, 0x7f, 0x07, 0x60, 0x42, 0x74, 0xe1, + 0x20, 0xbd, 0x2a, 0xa3, 0xba, 0x76, 0xee, 0xcc, 0xef, 0x15, 0x8c, 0x23, 0x46, 0xfe, 0x0c, 0x8f, + 0x18, 0x3d, 0xb6, 0x9f, 0xc2, 0x93, 0xda, 0x7e, 0x8a, 0xc3, 0xdc, 0x7e, 0x46, 0xd2, 0x6d, 0x3f, + 0x43, 0x73, 0x0c, 0x4d, 0x90, 0x9e, 0xa5, 0xc1, 0x4b, 0xcf, 0xe4, 0x4d, 0x0e, 0xce, 0x7e, 0x93, + 0xfb, 0xcd, 0x24, 0xa9, 0x3a, 0x96, 0xf6, 0x4d, 0xdc, 0x88, 0x48, 0x18, 0x92, 0x44, 0x1d, 0x1f, + 0x86, 0x44, 0x1d, 0x88, 0x50, 0xfc, 0xc5, 0x0c, 0x94, 0xd0, 0x0a, 0x28, 0x8f, 0x00, 0x20, 0xaf, + 0x43, 0xbe, 0xe3, 0xd8, 0xca, 0x6a, 0x73, 0x45, 0x69, 0xa5, 0xdb, 0x8e, 0x1d, 0x3c, 0x7e, 0x38, + 0x33, 0xa9, 0x11, 0x29, 0x2b, 0x41, 0x8e, 0x4b, 0x2a, 0x30, 0xc5, 0x3d, 0xa1, 0x7d, 0x1e, 0x25, + 0xc0, 0x00, 0x32, 0xa0, 0x5e, 0x3b, 0x60, 0x62, 0x14, 0x8c, 0x71, 0xfc, 0xf2, 0x97, 0x8b, 0xf2, + 0xb1, 0x8c, 0x01, 0xdc, 0x5e, 0x0e, 0x3a, 0xbb, 0x67, 0xff, 0xc6, 0xa7, 0xcb, 0x90, 0xad, 0xef, + 0x70, 0x45, 0xbc, 0x10, 0xa6, 0xb5, 0x5c, 0x9c, 0xc7, 0x6c, 0x7d, 0x87, 0xbc, 0x02, 0xa3, 0xf2, + 0x5a, 0x54, 0xa5, 0x7e, 0xe4, 0x6c, 0xe5, 0x9d, 0xa9, 0x8f, 0x1a, 0x3a, 0xf4, 0xeb, 0xc7, 0xc1, + 0x86, 0xca, 0xc4, 0x47, 0xef, 0x83, 0xec, 0x58, 0xd9, 0x9f, 0xae, 0xfc, 0x9a, 0x91, 0x7e, 0x16, + 0xa2, 0x4e, 0xbc, 0xdd, 0xb9, 0x65, 0xd3, 0x9d, 0x26, 0xff, 0x71, 0x11, 0x2e, 0x25, 0x3f, 0xe3, + 0xf2, 0x81, 0x59, 0x0c, 0x62, 0x6e, 0xe7, 0x12, 0xe7, 0xf6, 0x87, 0x60, 0x44, 0xc4, 0xf3, 0xaa, + 0xa4, 0x59, 0xdc, 0x7e, 0x2f, 0xbe, 0xc5, 0x47, 0x05, 0x23, 0x37, 0x81, 0x88, 0xbb, 0x81, 0x05, + 0xb7, 0xe3, 0x04, 0x9b, 0xd4, 0x43, 0x6a, 0xd5, 0x65, 0x6c, 0x87, 0xbe, 0x3e, 0x59, 0xeb, 0xc2, + 0xc0, 0x84, 0x5a, 0x3c, 0xcd, 0x57, 0x57, 0x40, 0xa3, 0x99, 0xe6, 0xeb, 0xa8, 0xd8, 0xa8, 0x61, + 0x1f, 0x0e, 0xbf, 0xd1, 0x6d, 0x54, 0x79, 0x6b, 0xd0, 0xef, 0xfb, 0x7c, 0x80, 0x2d, 0x2b, 0x67, + 0xb9, 0x72, 0xfe, 0x38, 0x0f, 0x17, 0x12, 0xde, 0x59, 0x8d, 0xca, 0xee, 0xcc, 0x09, 0x64, 0x77, + 0x53, 0x77, 0x52, 0xea, 0xac, 0xc3, 0xaa, 0x3d, 0x47, 0xf4, 0xd0, 0x37, 0x32, 0x70, 0x91, 0x87, + 0xb3, 0xaa, 0x1b, 0x0f, 0x59, 0x45, 0x1a, 0x72, 0xdf, 0x38, 0xd9, 0x9b, 0x36, 0xd7, 0x13, 0x28, + 0x84, 0xa1, 0x7d, 0x49, 0x50, 0x4c, 0xe4, 0x4a, 0x16, 0x00, 0xf4, 0xf3, 0x2c, 0x6a, 0x0d, 0xbf, + 0xc4, 0x8e, 0x1e, 0xfa, 0xfd, 0x16, 0xff, 0x31, 0x0f, 0x95, 0x35, 0x3a, 0x9a, 0x1b, 0xac, 0x8c, + 0x6a, 0xe4, 0x6b, 0xdd, 0x8f, 0x65, 0x7c, 0x6e, 0xa0, 0x8f, 0xe7, 0x9e, 0x7c, 0xca, 0xa7, 0x9b, + 0x53, 0xbf, 0x91, 0x83, 0xc9, 0xe8, 0x18, 0x92, 0x97, 0xa1, 0xd8, 0xf6, 0xe8, 0xae, 0xfd, 0x40, + 0xce, 0xa5, 0xf0, 0xa9, 0x7a, 0x5e, 0x8a, 0x12, 0x4a, 0xde, 0x89, 0x39, 0xa0, 0xcf, 0xa7, 0x89, + 0xab, 0x51, 0x6e, 0xca, 0x3d, 0xd2, 0x01, 0xbc, 0xa3, 0x5f, 0x0b, 0xca, 0x0d, 0x9e, 0x57, 0xf4, + 0xa5, 0x20, 0xf2, 0x39, 0x28, 0xd5, 0x3c, 0x6a, 0x05, 0xb4, 0x3e, 0x7f, 0x28, 0x2d, 0x8d, 0xfd, + 0xbc, 0xbb, 0xa4, 0x97, 0xde, 0x82, 0x22, 0x82, 0x21, 0x3d, 0x7e, 0xbf, 0xb6, 0x1b, 0x50, 0x8f, + 0x27, 0xe3, 0x90, 0xe6, 0xc4, 0xf0, 0x7e, 0x4d, 0x43, 0xd0, 0xc0, 0x2a, 0xff, 0x61, 0x11, 0x20, + 0x7c, 0xf5, 0x9a, 0x49, 0x1c, 0xea, 0xd4, 0xdb, 0xae, 0xed, 0x28, 0x15, 0x56, 0xcf, 0x8e, 0x25, + 0x59, 0x8e, 0x1a, 0x83, 0xec, 0x42, 0x51, 0x3e, 0x7d, 0x9f, 0x4d, 0xeb, 0x2e, 0x51, 0xfd, 0xd8, + 0x3c, 0xa7, 0x24, 0x56, 0xb9, 0xf8, 0x1f, 0x25, 0x75, 0x36, 0x6b, 0x3c, 0xda, 0x08, 0x93, 0x0c, + 0xe8, 0xde, 0x45, 0x5e, 0x8a, 0x12, 0x1a, 0xc9, 0x9f, 0x9d, 0x3f, 0x36, 0x7f, 0x36, 0x42, 0x49, + 0xdc, 0x03, 0xdd, 0xa2, 0x87, 0xfd, 0x1d, 0xbb, 0xc5, 0x15, 0xa7, 0xaa, 0x8b, 0x21, 0x19, 0x46, + 0xd3, 0x57, 0xe8, 0xfd, 0xe5, 0xa5, 0x14, 0x69, 0x54, 0x54, 0x31, 0x86, 0x64, 0x8c, 0x54, 0xbc, + 0x23, 0x3d, 0x53, 0xf1, 0xee, 0xc6, 0x54, 0xc0, 0x54, 0x23, 0x71, 0x84, 0xbc, 0x7d, 0xaf, 0x3b, + 0x75, 0x2d, 0x0e, 0xe2, 0xb9, 0xf5, 0x3e, 0x76, 0xe1, 0xb7, 0x60, 0xa2, 0x66, 0x2d, 0x50, 0x56, + 0xd1, 0xae, 0x59, 0x01, 0x95, 0xe7, 0xe8, 0x7e, 0x92, 0xb0, 0x2f, 0x54, 0x8c, 0xfa, 0x18, 0x25, + 0x97, 0x4e, 0xe4, 0xdd, 0x82, 0x51, 0x35, 0x93, 0xc9, 0x8b, 0x46, 0xbd, 0xd0, 0x36, 0xc6, 0x06, + 0x97, 0x13, 0x39, 0xfe, 0x56, 0xf5, 0xb3, 0x8c, 0x58, 0x9f, 0x82, 0xf3, 0x65, 0x28, 0xfa, 0x9d, + 0x5d, 0x86, 0x17, 0x7b, 0xed, 0xa9, 0xca, 0x4b, 0x51, 0x42, 0xcb, 0xff, 0x33, 0x03, 0x10, 0xc6, + 0x7a, 0xb2, 0x6d, 0xbe, 0x45, 0xd9, 0xc9, 0xc9, 0xf6, 0x5b, 0xf1, 0x6d, 0x7e, 0x4d, 0x01, 0x30, + 0xc4, 0x21, 0xdb, 0x00, 0x4c, 0xf1, 0x38, 0x4d, 0xfe, 0x1b, 0x7e, 0x5b, 0xba, 0xad, 0x2b, 0xa3, + 0x41, 0x88, 0x58, 0x30, 0xa9, 0x34, 0x65, 0x49, 0xba, 0xaf, 0xa0, 0x16, 0x1e, 0x39, 0xba, 0x19, + 0x21, 0x80, 0x31, 0x82, 0xe5, 0xbf, 0x3b, 0x02, 0x53, 0xb1, 0x47, 0x02, 0x9f, 0xfa, 0xa7, 0xd7, + 0xcc, 0x17, 0x3e, 0x72, 0x83, 0x7e, 0xe1, 0x23, 0x3f, 0x88, 0x63, 0x4f, 0xfc, 0x15, 0x99, 0xc2, + 0x20, 0x5f, 0x91, 0x59, 0x85, 0x11, 0x99, 0x4e, 0xb8, 0x3f, 0x99, 0xcb, 0x8f, 0x57, 0xea, 0xd8, + 0xa7, 0x48, 0x0c, 0x38, 0x5e, 0x32, 0x36, 0xd5, 0x3e, 0xc8, 0xc7, 0xfa, 0x4d, 0xb8, 0xd8, 0x76, + 0x9b, 0x4d, 0x15, 0xed, 0xbb, 0xd8, 0x91, 0xaf, 0x36, 0x96, 0xa2, 0x6f, 0x73, 0x6c, 0x26, 0xe0, + 0x60, 0x62, 0xcd, 0x74, 0xb2, 0xf4, 0xdf, 0x14, 0x61, 0x32, 0xfa, 0xa0, 0xfd, 0x13, 0x79, 0xa1, + 0x8c, 0x5f, 0x52, 0x54, 0x3c, 0x27, 0xfe, 0x42, 0xd9, 0x96, 0x2c, 0x47, 0x8d, 0x11, 0xd5, 0x28, + 0x72, 0x43, 0xd0, 0x28, 0xf2, 0x83, 0xd1, 0x28, 0x42, 0x7d, 0xaa, 0x70, 0xa4, 0x3e, 0xf5, 0x2a, + 0x8c, 0x78, 0x6e, 0x93, 0x56, 0x70, 0x5d, 0x9a, 0x05, 0xf4, 0x6d, 0x06, 0x8a, 0x62, 0x54, 0xf0, + 0x01, 0xfb, 0xe2, 0x47, 0x87, 0xbd, 0x8f, 0x35, 0x73, 0x1d, 0xce, 0x1f, 0xc8, 0x3b, 0x84, 0xaa, + 0xdd, 0x70, 0xac, 0x20, 0x7c, 0x4a, 0x45, 0x7b, 0x83, 0xde, 0x89, 0x23, 0x60, 0x77, 0x9d, 0x27, + 0x72, 0xd6, 0xd7, 0x9a, 0x37, 0x1c, 0xa7, 0x79, 0xa7, 0x5b, 0x58, 0xff, 0x64, 0x04, 0x26, 0xab, + 0xb7, 0x23, 0x0b, 0x2b, 0x32, 0x73, 0x33, 0x43, 0x98, 0xb9, 0xd9, 0x41, 0xcf, 0xdc, 0xa3, 0x4f, + 0x02, 0x2f, 0xa9, 0xd0, 0xae, 0x7c, 0xf4, 0xe2, 0xd1, 0x0c, 0xef, 0x22, 0x15, 0xb6, 0x87, 0x0b, + 0x37, 0x4e, 0x95, 0xf8, 0xa0, 0xc0, 0xb3, 0xfa, 0x18, 0x1b, 0x6f, 0x04, 0x8c, 0x71, 0xfc, 0x7e, + 0x56, 0x48, 0x7f, 0xfe, 0x44, 0x6f, 0xc2, 0x24, 0x6f, 0xa4, 0x74, 0x75, 0x5e, 0xa9, 0xcb, 0xec, + 0xf0, 0xda, 0x15, 0xeb, 0xb6, 0x09, 0x5d, 0xc4, 0x18, 0x76, 0x74, 0x3d, 0x96, 0x52, 0xaf, 0xc7, + 0xdb, 0xa7, 0x5c, 0x8f, 0x2f, 0x42, 0xae, 0xde, 0xbc, 0x27, 0x9f, 0x32, 0xd3, 0x3a, 0xf0, 0xe2, + 0xea, 0x6d, 0x64, 0xe5, 0xc6, 0x2a, 0x1b, 0x3b, 0xfb, 0x55, 0x36, 0x7e, 0xec, 0xf9, 0x96, 0x29, + 0x2d, 0xd4, 0xf7, 0x6d, 0xd7, 0x11, 0x7e, 0xb0, 0x13, 0xfd, 0x2b, 0x2d, 0x46, 0x75, 0x8c, 0x10, + 0x4b, 0xb7, 0x84, 0xff, 0x55, 0x06, 0x2e, 0x26, 0xe5, 0x4e, 0x39, 0xee, 0x42, 0xfe, 0x35, 0x18, + 0x15, 0x89, 0x54, 0x56, 0xea, 0xf2, 0x8e, 0x49, 0x7f, 0xbf, 0x20, 0xb7, 0xb2, 0x88, 0x1a, 0x83, + 0x50, 0x23, 0xfa, 0x78, 0x40, 0x51, 0xf0, 0xfa, 0x9c, 0x13, 0x06, 0x7e, 0x96, 0x7f, 0x3b, 0x03, + 0xe3, 0x66, 0xae, 0x93, 0x13, 0xbc, 0xfd, 0x76, 0x00, 0x25, 0xde, 0x19, 0xcb, 0x9e, 0xdb, 0x4a, + 0xaf, 0x78, 0xdf, 0x51, 0xa4, 0xc4, 0xfc, 0x11, 0xf2, 0x47, 0x17, 0x62, 0xc8, 0xaa, 0xfc, 0xf3, + 0x30, 0xaa, 0xa3, 0x50, 0x8e, 0x39, 0xdf, 0xcd, 0x41, 0xc9, 0x6d, 0xab, 0x87, 0xaf, 0x63, 0x69, + 0xeb, 0x36, 0x14, 0x00, 0x43, 0x1c, 0x26, 0xb3, 0xc4, 0x68, 0xc7, 0x5c, 0x34, 0x23, 0x29, 0x35, + 0xff, 0x69, 0x16, 0x8a, 0x55, 0xea, 0xf8, 0xae, 0x47, 0xde, 0x36, 0x56, 0xb8, 0x10, 0xd9, 0x1f, + 0x39, 0x99, 0x29, 0x49, 0x84, 0x6e, 0xb0, 0xc9, 0x17, 0x9a, 0x87, 0xc2, 0x32, 0x63, 0xf5, 0xee, + 0x42, 0xde, 0x6f, 0xd3, 0x01, 0x04, 0xd0, 0x8b, 0x16, 0x57, 0xdb, 0xb4, 0x16, 0x8e, 0x26, 0xfb, + 0x85, 0x9c, 0x3e, 0x71, 0xf4, 0xcb, 0xe7, 0x62, 0xa6, 0x2d, 0xa7, 0xe6, 0x74, 0xe4, 0xfb, 0xe7, + 0xe5, 0x3f, 0x66, 0x87, 0x5f, 0x8e, 0xb8, 0x6a, 0xfb, 0x01, 0xf9, 0x7c, 0x57, 0x47, 0xce, 0x9e, + 0xac, 0x23, 0x59, 0x6d, 0xde, 0x8d, 0x7a, 0x11, 0xa9, 0x92, 0x48, 0x9c, 0x4f, 0xc1, 0x0e, 0x68, + 0x4b, 0x59, 0x32, 0x3f, 0x95, 0xf6, 0xdb, 0xc2, 0x89, 0xb1, 0xc2, 0xc8, 0xa2, 0xa0, 0x5e, 0xfe, + 0x7e, 0x51, 0x7d, 0x13, 0xeb, 0x58, 0xf2, 0xa5, 0x0c, 0x8c, 0xd7, 0x69, 0x9b, 0x3a, 0x75, 0xea, + 0xd4, 0x6c, 0xaa, 0xf2, 0x89, 0xac, 0xa4, 0x14, 0xb0, 0x8b, 0x8a, 0xa4, 0x11, 0xa8, 0xb5, 0x68, + 0xb0, 0xc1, 0x08, 0x53, 0xe2, 0xc2, 0x68, 0x20, 0xdc, 0x02, 0xd4, 0xe7, 0x57, 0x52, 0xfb, 0xd6, + 0x18, 0x1a, 0xb8, 0x24, 0x8d, 0x9a, 0x09, 0x69, 0xc2, 0x68, 0x10, 0x4d, 0x30, 0x9f, 0xc2, 0x12, + 0xa6, 0xc3, 0xe7, 0xf8, 0xa1, 0x56, 0x87, 0xcb, 0x69, 0x0e, 0xe4, 0x26, 0x10, 0x99, 0xa2, 0x75, + 0xd9, 0xb2, 0x9b, 0xb4, 0x8e, 0x6e, 0xc7, 0xa9, 0x4b, 0xcb, 0xa3, 0xbe, 0x88, 0x5b, 0xea, 0xc2, + 0xc0, 0x84, 0x5a, 0xe4, 0x1a, 0x8c, 0x73, 0xfe, 0xf3, 0x1d, 0xdf, 0x08, 0x8f, 0xd0, 0x9d, 0xbc, + 0x64, 0xc0, 0x30, 0x82, 0x19, 0x49, 0xc4, 0x5f, 0x3c, 0x32, 0x11, 0xff, 0x2a, 0x5c, 0xf4, 0xe8, + 0x81, 0xcd, 0xf6, 0xa0, 0x1b, 0xb6, 0x1f, 0xb8, 0xde, 0x21, 0xf7, 0x45, 0x90, 0xc9, 0xda, 0x44, + 0x20, 0x4f, 0x02, 0x1c, 0x13, 0x6b, 0x91, 0xef, 0x66, 0x60, 0xa2, 0xe9, 0x36, 0x1a, 0xb6, 0xd3, + 0x10, 0x56, 0x6e, 0x79, 0x45, 0x77, 0x77, 0x10, 0x72, 0x62, 0x76, 0xd5, 0xa4, 0x2c, 0x14, 0x0d, + 0x7d, 0x29, 0x19, 0x81, 0x61, 0xb4, 0x11, 0x97, 0x3f, 0x05, 0xa4, 0xbb, 0x6e, 0xbf, 0x09, 0xa1, + 0xc7, 0x4d, 0x39, 0x42, 0xf6, 0xb4, 0x7c, 0x12, 0xe2, 0x21, 0xcd, 0x1a, 0x3e, 0x52, 0x32, 0x11, + 0x0b, 0xc6, 0x9a, 0x96, 0x1f, 0x6c, 0xb7, 0xd9, 0x69, 0x44, 0xdd, 0x38, 0xf7, 0x73, 0x43, 0xa0, + 0x6f, 0xb4, 0x57, 0x43, 0x32, 0x68, 0xd2, 0x64, 0x93, 0xd6, 0xdd, 0xf1, 0xa9, 0x77, 0x40, 0xeb, + 0xfc, 0x21, 0x75, 0x4b, 0x67, 0x33, 0xcc, 0x85, 0x93, 0x76, 0xa3, 0x0b, 0x03, 0x13, 0x6a, 0x95, + 0xff, 0x6b, 0x06, 0x46, 0x64, 0x9c, 0x5e, 0x24, 0x7a, 0x32, 0x33, 0xf4, 0xe8, 0xc9, 0x45, 0x28, + 0xb4, 0x5d, 0x2f, 0x50, 0x62, 0x65, 0x26, 0x59, 0x27, 0x13, 0x2f, 0x08, 0xb9, 0x5e, 0x10, 0x0a, + 0x4d, 0xf6, 0xcb, 0x47, 0x51, 0x99, 0xed, 0xd1, 0x2a, 0xd7, 0xca, 0x66, 0xdc, 0x33, 0x45, 0xe5, + 0x63, 0xd9, 0x0c, 0xf3, 0xb1, 0x6c, 0x96, 0x1f, 0xe5, 0xe1, 0x5c, 0xb5, 0x69, 0xd5, 0xf6, 0xcd, + 0xc3, 0xd3, 0x5b, 0x30, 0xe1, 0xdb, 0x0d, 0xc7, 0x76, 0x1a, 0xd2, 0xb8, 0x95, 0xe9, 0xdb, 0x22, + 0x5d, 0x35, 0xeb, 0x63, 0x94, 0xdc, 0xc0, 0xf2, 0x04, 0x19, 0xd6, 0x93, 0xdc, 0x99, 0x58, 0x4f, + 0x22, 0x1e, 0x32, 0xf9, 0xb4, 0x1e, 0x32, 0xf1, 0x7e, 0x3f, 0x95, 0x29, 0xad, 0xf0, 0x14, 0xc4, + 0x44, 0xfc, 0x2c, 0x8c, 0xf1, 0x6f, 0xad, 0xb2, 0x8d, 0x34, 0xea, 0x05, 0x90, 0x39, 0xce, 0x0b, + 0x80, 0xe9, 0xce, 0x76, 0x4d, 0x6b, 0x9c, 0x5a, 0xdb, 0x5a, 0xa9, 0xb9, 0x0e, 0x72, 0x48, 0xf9, + 0x9f, 0x65, 0x24, 0xfd, 0xad, 0x3d, 0x8f, 0x5a, 0x75, 0x52, 0x85, 0x67, 0x5b, 0xd4, 0xf7, 0xad, + 0x06, 0xad, 0x34, 0x1a, 0x1e, 0x6d, 0xf0, 0xa5, 0x7d, 0x4b, 0x6b, 0xb6, 0x3a, 0x49, 0xf9, 0x5a, + 0x12, 0x12, 0x26, 0xd7, 0x25, 0x5f, 0x80, 0xe7, 0x77, 0x3c, 0xd7, 0xaa, 0xd7, 0x2c, 0xa6, 0x10, + 0x71, 0x8c, 0x2d, 0x57, 0x3a, 0x69, 0xc9, 0x64, 0xd3, 0x3f, 0x2a, 0x09, 0x3f, 0x3f, 0xdf, 0x0b, + 0x11, 0x7b, 0xd3, 0x28, 0xff, 0xaf, 0x3c, 0x8c, 0x8b, 0xaf, 0x90, 0xae, 0xc8, 0x51, 0x37, 0xe2, + 0xcc, 0x99, 0xbb, 0x11, 0x6f, 0x03, 0xf8, 0xbc, 0x3d, 0xfd, 0x2f, 0x55, 0x7e, 0x23, 0x52, 0xd5, + 0x95, 0xd1, 0x20, 0xd4, 0x4f, 0x9a, 0x90, 0x57, 0x61, 0x44, 0x0e, 0x86, 0x34, 0x7b, 0x68, 0x54, + 0xd9, 0x7b, 0xa8, 0xe0, 0xe4, 0x13, 0x30, 0x66, 0x05, 0x81, 0x55, 0xdb, 0x6b, 0xc9, 0x37, 0x94, + 0x23, 0xde, 0x50, 0x95, 0x10, 0x84, 0x26, 0x1e, 0x7f, 0x80, 0xbd, 0xe9, 0xd6, 0xf6, 0xfd, 0xae, + 0x07, 0xd8, 0x79, 0x29, 0x4a, 0x28, 0x69, 0x41, 0x31, 0xe0, 0x93, 0x4b, 0xfa, 0x06, 0x2d, 0xa5, + 0x5c, 0xf5, 0x62, 0xa6, 0x86, 0xec, 0xc4, 0x6f, 0x94, 0x4c, 0x18, 0x3b, 0x9f, 0xaf, 0x15, 0x69, + 0x29, 0x4f, 0xcb, 0x4e, 0x2c, 0x3c, 0x63, 0x93, 0xe6, 0xbf, 0x51, 0x32, 0x29, 0xff, 0xf7, 0x1c, + 0x90, 0x6a, 0x60, 0x39, 0x75, 0xcb, 0xab, 0xdf, 0xba, 0xa6, 0x13, 0xfc, 0xb0, 0x53, 0x8c, 0x70, + 0x3e, 0x11, 0xf2, 0x3f, 0xc5, 0xe4, 0x53, 0xd7, 0xa2, 0xab, 0xae, 0x78, 0xbb, 0x54, 0xc8, 0x18, + 0x21, 0x75, 0x50, 0x72, 0x21, 0xeb, 0xdd, 0x07, 0xcc, 0x8f, 0x74, 0x1d, 0x30, 0x1f, 0x3f, 0x9c, + 0xf9, 0x91, 0x5b, 0x9d, 0x1d, 0xea, 0x39, 0x34, 0xa0, 0xbe, 0xf2, 0xc6, 0x48, 0x3c, 0x7f, 0x3e, + 0x69, 0x3f, 0xfc, 0x5d, 0x98, 0x68, 0x5b, 0x41, 0x4d, 0x67, 0x10, 0x91, 0x93, 0xf8, 0x53, 0x4a, + 0xeb, 0xdb, 0x34, 0x81, 0x8f, 0x1f, 0xce, 0xfc, 0x7f, 0x61, 0xd0, 0xa7, 0xd6, 0x8a, 0xe6, 0xda, + 0xfb, 0x8d, 0xb9, 0xe0, 0xb0, 0x4d, 0xfd, 0x59, 0x8e, 0xce, 0xef, 0xed, 0xa2, 0x64, 0xc9, 0xeb, + 0x00, 0x4d, 0xfb, 0x80, 0x8a, 0x13, 0x6f, 0xdc, 0x4d, 0x62, 0x55, 0x43, 0xd0, 0xc0, 0x2a, 0xff, + 0x42, 0x06, 0xa4, 0xaa, 0x46, 0xee, 0x03, 0xd4, 0x5c, 0xa7, 0x6e, 0x9b, 0x69, 0x1a, 0x17, 0x52, + 0x25, 0xeb, 0x10, 0xb4, 0xc2, 0x36, 0xe8, 0x22, 0x1f, 0x0d, 0x56, 0xe5, 0x39, 0x18, 0x17, 0x4d, + 0x90, 0xef, 0x68, 0xcc, 0x40, 0xc1, 0x6a, 0x36, 0xdd, 0xfb, 0xbc, 0x0d, 0x05, 0xb1, 0xdf, 0x73, + 0xb7, 0x7c, 0x14, 0xe5, 0xe5, 0xbf, 0x28, 0xc0, 0x25, 0x19, 0x62, 0x7b, 0xdd, 0xb3, 0xeb, 0x4f, + 0xf4, 0x22, 0x25, 0x74, 0x62, 0xc8, 0xf6, 0x74, 0x62, 0x08, 0x77, 0xe9, 0xd4, 0x6f, 0x83, 0x19, + 0x9f, 0x7d, 0xb4, 0x35, 0x50, 0xdf, 0xee, 0xe4, 0x8f, 0xbd, 0xdd, 0x79, 0x59, 0x7b, 0xbb, 0xc4, + 0x6e, 0x4d, 0x7a, 0x7a, 0xab, 0x14, 0x8f, 0xb4, 0x51, 0x47, 0x42, 0xec, 0x47, 0x06, 0x13, 0x62, + 0xff, 0x32, 0x14, 0xad, 0xb6, 0xbd, 0x8d, 0xab, 0xd2, 0x5c, 0x1c, 0xbe, 0x09, 0xbf, 0xb9, 0xb2, + 0x8d, 0xab, 0x28, 0xa1, 0x51, 0xcf, 0xca, 0x52, 0x5a, 0xcf, 0xca, 0xe4, 0x49, 0x76, 0x56, 0x6e, + 0x66, 0x35, 0x38, 0xdf, 0x35, 0xdc, 0x03, 0xf7, 0x97, 0x78, 0x3f, 0xcf, 0xb8, 0x78, 0x76, 0x9b, + 0x3e, 0xd1, 0x65, 0xf4, 0x49, 0x98, 0x10, 0xfe, 0x5e, 0x12, 0x22, 0x55, 0xa9, 0xd0, 0x5d, 0xd7, + 0x04, 0x62, 0x14, 0x97, 0xac, 0xf0, 0xc9, 0xd1, 0xf7, 0xdd, 0x24, 0xc8, 0xf9, 0xc3, 0xb4, 0x3d, + 0x49, 0x80, 0x7c, 0x14, 0xc6, 0x78, 0xfb, 0x45, 0x6f, 0x4b, 0x4f, 0x47, 0x9e, 0x86, 0x69, 0x29, + 0x2c, 0x46, 0x13, 0x27, 0x1a, 0x32, 0x59, 0x48, 0x1b, 0x32, 0xd9, 0x35, 0x16, 0x67, 0x35, 0xdb, + 0xbe, 0x94, 0x83, 0x92, 0xf6, 0x57, 0x26, 0x9f, 0x83, 0x71, 0xe1, 0x3d, 0x74, 0x9a, 0x93, 0x1f, + 0xbf, 0x21, 0x10, 0xbe, 0x48, 0xca, 0xad, 0xc1, 0x24, 0xc6, 0xc3, 0xe9, 0x79, 0x6e, 0x6b, 0x83, + 0x41, 0xb6, 0xff, 0x70, 0xfa, 0x18, 0x09, 0xec, 0x22, 0x4a, 0xea, 0x30, 0x25, 0xca, 0x42, 0xff, + 0x8c, 0x5c, 0xdf, 0x51, 0x50, 0x0b, 0x51, 0x0a, 0x18, 0x27, 0x49, 0x6e, 0x02, 0x51, 0xbe, 0x77, + 0xd5, 0x7d, 0xbb, 0xcd, 0xdf, 0x66, 0x3f, 0x8c, 0x5b, 0xcb, 0x56, 0xba, 0x30, 0x30, 0xa1, 0x56, + 0xf9, 0x3b, 0xa3, 0xa0, 0x0d, 0x72, 0x67, 0x6c, 0x79, 0x48, 0x4e, 0x5e, 0x94, 0x3d, 0x55, 0xf2, + 0xa2, 0x9b, 0x50, 0xd2, 0xc9, 0xc1, 0x64, 0x97, 0xbf, 0xd8, 0xe3, 0x49, 0x66, 0x81, 0x24, 0x53, + 0xc5, 0xaa, 0x9f, 0x18, 0x56, 0x27, 0x4b, 0x30, 0x22, 0xd2, 0x4e, 0xa8, 0xdc, 0x8c, 0x97, 0x93, + 0x28, 0x89, 0x2c, 0x15, 0x46, 0xa6, 0x18, 0x51, 0x05, 0x55, 0xdd, 0xa4, 0xb4, 0x54, 0x85, 0x21, + 0xa4, 0xa5, 0xfa, 0x66, 0x72, 0x66, 0xb1, 0xad, 0xf4, 0xd6, 0xda, 0x0f, 0x56, 0x4e, 0xb1, 0xa4, + 0xd4, 0x5a, 0xa3, 0x67, 0xfd, 0xa2, 0x61, 0x29, 0x65, 0x3a, 0x2c, 0x38, 0x71, 0x3a, 0xac, 0xb1, + 0xd3, 0xa7, 0xc3, 0x4a, 0x9f, 0x46, 0xa9, 0x0a, 0xb0, 0x65, 0xb7, 0x94, 0xab, 0xf9, 0x4b, 0x50, + 0xe0, 0x4f, 0x11, 0xc6, 0xb3, 0xe5, 0x08, 0x1f, 0x68, 0x01, 0x23, 0x57, 0x21, 0xef, 0x07, 0x6e, + 0x3b, 0x6e, 0x2d, 0xa9, 0x06, 0x6e, 0x1b, 0x39, 0xa4, 0xfc, 0xa5, 0x22, 0x8c, 0xa8, 0x13, 0x9e, + 0x6f, 0xdc, 0x2e, 0xa4, 0x7e, 0xbc, 0x5f, 0x12, 0x3d, 0xf6, 0x92, 0x21, 0x7a, 0x2c, 0xcb, 0x9e, + 0xf9, 0xb1, 0x6c, 0x1f, 0x8a, 0x6d, 0x7e, 0xe0, 0x90, 0x02, 0xea, 0x7a, 0x7a, 0xde, 0x9c, 0x9c, + 0xd0, 0x2b, 0xc4, 0xff, 0x28, 0x59, 0x90, 0x77, 0x61, 0xc2, 0xa3, 0x81, 0x77, 0x18, 0x39, 0x03, + 0x0e, 0x24, 0x48, 0x96, 0x9b, 0x59, 0xd1, 0xa4, 0x8d, 0x51, 0x56, 0xa4, 0x0d, 0x25, 0x4f, 0x85, + 0x67, 0xa6, 0xcf, 0x32, 0xab, 0x23, 0x3d, 0x85, 0xc8, 0xd6, 0x3f, 0x31, 0x64, 0x22, 0xac, 0x30, + 0xab, 0xd4, 0xf2, 0x83, 0x0d, 0xf5, 0x62, 0xee, 0xa8, 0x69, 0x85, 0xd1, 0x20, 0x34, 0xf1, 0xc8, + 0x3d, 0x80, 0x7a, 0xf3, 0x9e, 0xec, 0x4c, 0x79, 0x72, 0x18, 0xc0, 0xbd, 0x1a, 0xb7, 0x42, 0x2d, + 0x6a, 0xc2, 0x68, 0x30, 0x29, 0xff, 0xb7, 0x0c, 0x9c, 0x8b, 0xcf, 0x1c, 0xb2, 0x0f, 0x39, 0xdf, + 0x53, 0x39, 0xf2, 0x37, 0x07, 0x37, 0x25, 0xe5, 0x2d, 0x3c, 0x8f, 0x05, 0xab, 0x7a, 0x35, 0x64, + 0x5c, 0xd8, 0x4a, 0xd5, 0x0f, 0xd5, 0x19, 0x2b, 0x75, 0x91, 0xfa, 0x01, 0x72, 0x08, 0x59, 0x35, + 0xed, 0x21, 0xc2, 0x56, 0x36, 0x9b, 0x64, 0x0f, 0x79, 0x3e, 0xce, 0x2f, 0xc9, 0x1a, 0x52, 0xfe, + 0x5a, 0x0e, 0x2e, 0x25, 0x37, 0x8c, 0xbc, 0x09, 0x93, 0xfa, 0x96, 0xf3, 0xd0, 0xc8, 0x69, 0xa5, + 0x7d, 0x73, 0x16, 0x23, 0x50, 0x8c, 0x61, 0x93, 0xd7, 0xb9, 0x05, 0x81, 0x6d, 0x83, 0xca, 0x33, + 0xaa, 0x14, 0x39, 0xfc, 0x4b, 0x08, 0x1a, 0x58, 0xa4, 0x02, 0x53, 0xf2, 0x57, 0xe4, 0x01, 0xed, + 0x52, 0xe8, 0xab, 0xb4, 0x10, 0x05, 0x63, 0x1c, 0x9f, 0xbc, 0x0a, 0x23, 0x4c, 0x81, 0x51, 0x7e, + 0x84, 0x86, 0x79, 0x70, 0x51, 0x14, 0xa3, 0x82, 0x93, 0x6b, 0x30, 0xce, 0xfe, 0x8d, 0xa4, 0x24, + 0x35, 0x2e, 0x23, 0x17, 0x0d, 0x18, 0x46, 0x30, 0xc3, 0x37, 0x41, 0x8b, 0x61, 0x4e, 0x6d, 0xd3, + 0x81, 0x81, 0x7d, 0x7c, 0xc7, 0xa7, 0x68, 0xdd, 0x5f, 0x54, 0xaf, 0x34, 0x1b, 0xd6, 0x97, 0x6d, + 0x0d, 0x41, 0x03, 0xab, 0xfc, 0xc3, 0x0c, 0x4c, 0x44, 0x64, 0x07, 0xd9, 0x85, 0xdc, 0xfe, 0x35, + 0x75, 0x1d, 0x77, 0x6b, 0x80, 0x0f, 0x88, 0x8a, 0x59, 0x77, 0xeb, 0x9a, 0x8f, 0x8c, 0x01, 0x79, + 0x47, 0xdf, 0xfc, 0x65, 0x53, 0x7b, 0x26, 0x18, 0xb6, 0x1b, 0x69, 0xcf, 0x8b, 0x7a, 0x25, 0xfc, + 0x8b, 0x49, 0x98, 0x8a, 0x6d, 0x0a, 0x27, 0xf0, 0x84, 0x79, 0x3d, 0x62, 0x8e, 0xea, 0x9e, 0x4c, + 0x09, 0x96, 0x24, 0xd2, 0x10, 0xbd, 0x97, 0x4b, 0xfb, 0xa0, 0x5e, 0xb7, 0x11, 0x34, 0xd6, 0x7d, + 0x5f, 0xca, 0xc0, 0x38, 0xa3, 0x74, 0xd7, 0xf5, 0xf6, 0x77, 0x9b, 0xee, 0x7d, 0x29, 0xce, 0xd7, + 0xd2, 0x58, 0x46, 0x43, 0x6a, 0xda, 0x21, 0x80, 0xbf, 0x5c, 0x60, 0x00, 0x30, 0xc2, 0x94, 0xd4, + 0x20, 0xbf, 0x17, 0x04, 0x6d, 0x29, 0xd3, 0x53, 0x18, 0x87, 0x6f, 0x6c, 0x6d, 0x6d, 0x2a, 0xa6, + 0x3c, 0x7b, 0x3d, 0x2b, 0x40, 0x4e, 0x9c, 0xdc, 0x87, 0x92, 0x75, 0xdf, 0x5f, 0xb5, 0x5a, 0x3b, + 0x75, 0x4b, 0x7a, 0xa1, 0xa7, 0x31, 0x00, 0xdf, 0xad, 0x0a, 0x52, 0x8a, 0x9d, 0x30, 0xf9, 0xa8, + 0x52, 0x0c, 0x79, 0x11, 0x0f, 0x8a, 0xb5, 0x8e, 0x1f, 0xb8, 0x2d, 0xb9, 0x13, 0xa4, 0xd8, 0x9f, + 0x17, 0x38, 0x1d, 0xc5, 0x52, 0x84, 0xca, 0x98, 0x45, 0x28, 0x39, 0x91, 0x06, 0x14, 0xf6, 0xad, + 0xdd, 0x7d, 0x95, 0x26, 0x77, 0x79, 0x30, 0x6f, 0x6f, 0x09, 0x69, 0xc1, 0x4b, 0x50, 0xd0, 0x67, + 0x43, 0xe7, 0x58, 0x81, 0x2f, 0x9d, 0x70, 0x97, 0xd2, 0xbd, 0x3a, 0x10, 0x19, 0x3a, 0x56, 0x80, + 0x9c, 0x38, 0xfb, 0x1a, 0x7e, 0xe1, 0x22, 0x23, 0x89, 0x96, 0xd3, 0x5e, 0x56, 0x98, 0x5f, 0xc3, + 0x4b, 0x50, 0xd0, 0x67, 0x73, 0xc4, 0x55, 0x69, 0x3e, 0xa5, 0xaa, 0x9c, 0x62, 0x8e, 0xc4, 0x33, + 0x86, 0x8a, 0x39, 0xa2, 0x4b, 0x31, 0xe4, 0x45, 0xbe, 0x00, 0xb9, 0xa6, 0xdb, 0x48, 0xff, 0x3a, + 0x5c, 0xf8, 0x6a, 0x98, 0x58, 0xe8, 0xab, 0x6e, 0x03, 0x19, 0x65, 0xf2, 0xcb, 0x19, 0x98, 0xb4, + 0xde, 0xed, 0x78, 0xc2, 0x22, 0x73, 0xa3, 0xb3, 0xe3, 0x4b, 0x67, 0xc9, 0x8d, 0x14, 0x6b, 0x20, + 0x42, 0x4f, 0xf1, 0xe5, 0x21, 0x3e, 0x51, 0x10, 0xc6, 0x58, 0x73, 0x95, 0x95, 0xe7, 0x24, 0x91, + 0x89, 0x98, 0xae, 0x0f, 0x28, 0xb7, 0x89, 0x54, 0x59, 0x79, 0x11, 0x4a, 0x16, 0xe4, 0xbb, 0x19, + 0xbe, 0x35, 0x2b, 0x39, 0x4b, 0x7d, 0x1a, 0xc8, 0xc7, 0xe0, 0x6e, 0x0f, 0xe0, 0x56, 0x40, 0x10, + 0x5c, 0xf0, 0xec, 0x80, 0x7a, 0xb6, 0x15, 0xd9, 0xed, 0x4d, 0x04, 0x8c, 0x37, 0x81, 0x7c, 0x2b, + 0x03, 0x53, 0xbc, 0x5b, 0xa4, 0x29, 0x62, 0xbe, 0x23, 0xb2, 0x0c, 0xa7, 0xd2, 0xd4, 0x2a, 0x51, + 0x82, 0xaa, 0x5b, 0x44, 0x16, 0x9c, 0x28, 0x0c, 0xe3, 0xdc, 0xd9, 0x32, 0xa3, 0x2d, 0xcb, 0x6e, + 0xf2, 0x24, 0xc6, 0xa9, 0x96, 0xd9, 0x12, 0x23, 0x13, 0x59, 0x66, 0xbc, 0x04, 0x05, 0xfd, 0x72, + 0x0d, 0xc6, 0xb6, 0x71, 0x55, 0xc7, 0xb4, 0x1e, 0x9f, 0xe0, 0xf4, 0x75, 0x80, 0x03, 0x6e, 0x57, + 0x5a, 0xa0, 0x9e, 0x7a, 0x0a, 0x59, 0xef, 0xa1, 0x77, 0x34, 0x04, 0x0d, 0xac, 0xf2, 0x9f, 0x65, + 0x60, 0x2a, 0xe6, 0x37, 0x2a, 0xfc, 0x85, 0x95, 0xd7, 0x3a, 0xdd, 0x3d, 0x85, 0x35, 0xb0, 0x6a, + 0x54, 0xc7, 0x08, 0x31, 0xd2, 0xe0, 0xd3, 0x6c, 0xd7, 0x6e, 0xac, 0x59, 0x6d, 0x49, 0x5f, 0xe8, + 0x24, 0xaf, 0xf4, 0xb0, 0x18, 0x69, 0xd4, 0x98, 0x9d, 0x2e, 0x4a, 0x04, 0xe3, 0x54, 0xcb, 0xdf, + 0xcb, 0x40, 0x3c, 0xe2, 0x8c, 0xcc, 0x41, 0xa9, 0x6e, 0x7b, 0x9c, 0xca, 0x61, 0x3c, 0x40, 0x6e, + 0x51, 0x01, 0x30, 0xc4, 0xd1, 0x9d, 0x9e, 0x3d, 0xaa, 0xd3, 0xd9, 0x5f, 0xa4, 0x0d, 0xfa, 0xa0, + 0x2d, 0x95, 0x59, 0xe3, 0x2c, 0xaa, 0x20, 0x68, 0x60, 0x95, 0xff, 0x75, 0x01, 0x26, 0xa3, 0x76, + 0xf2, 0x3e, 0x23, 0x96, 0x5f, 0x86, 0x62, 0x8b, 0x06, 0x7b, 0x6e, 0x3d, 0x6e, 0xee, 0x5f, 0xe3, + 0xa5, 0x28, 0xa1, 0xbc, 0xf9, 0xae, 0x17, 0xc8, 0x66, 0x85, 0xcd, 0x77, 0xbd, 0x00, 0x39, 0x44, + 0x39, 0x5a, 0xe7, 0x7b, 0x38, 0x5a, 0x37, 0xe0, 0x1c, 0xf7, 0x96, 0xf2, 0x0c, 0xdb, 0x6d, 0xff, + 0xa9, 0x50, 0xab, 0x31, 0x12, 0xd8, 0x45, 0x94, 0xd4, 0x61, 0x4a, 0x94, 0x85, 0xb6, 0xdb, 0x62, + 0xdf, 0xb6, 0xdb, 0x6a, 0x94, 0x02, 0xc6, 0x49, 0x0e, 0x38, 0xbc, 0x27, 0x3a, 0x84, 0x7d, 0xf8, + 0xf1, 0x6c, 0x03, 0x58, 0x9d, 0x60, 0x4f, 0x7e, 0xe7, 0x68, 0xdf, 0x3e, 0x16, 0x15, 0x5d, 0x19, + 0x0d, 0x42, 0xe4, 0x0d, 0x98, 0x0c, 0xd3, 0x9d, 0xf3, 0x3c, 0xc0, 0xe2, 0x75, 0x67, 0xbe, 0xd7, + 0xac, 0x45, 0x20, 0x18, 0xc3, 0x4c, 0x77, 0x99, 0xf0, 0xed, 0x2c, 0x10, 0xd9, 0x19, 0xe6, 0xb5, + 0xd2, 0x57, 0x33, 0x30, 0x79, 0x3f, 0xd2, 0x47, 0x03, 0xbf, 0x5e, 0xd2, 0x67, 0xd5, 0x68, 0x39, + 0xc6, 0xf8, 0x1a, 0x77, 0xb2, 0xd9, 0x33, 0xf1, 0x9c, 0x9a, 0x7f, 0xeb, 0xfb, 0x3f, 0xb8, 0xf2, + 0xcc, 0x1f, 0xfd, 0xe0, 0xca, 0x33, 0x7f, 0xfe, 0x83, 0x2b, 0xcf, 0xbc, 0xf7, 0xe8, 0x4a, 0xe6, + 0xfb, 0x8f, 0xae, 0x64, 0xfe, 0xe8, 0xd1, 0x95, 0xcc, 0x9f, 0x3f, 0xba, 0x92, 0xf9, 0x0f, 0x8f, + 0xae, 0x64, 0xbe, 0xfd, 0xc3, 0x2b, 0xcf, 0x7c, 0xf6, 0x5a, 0xd8, 0x8a, 0x39, 0xd5, 0x0a, 0xfe, + 0xcf, 0x87, 0x05, 0x57, 0xee, 0x07, 0xc0, 0x5a, 0x31, 0x27, 0x7f, 0xab, 0x56, 0xfc, 0xdf, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x9b, 0xb1, 0xdb, 0x22, 0x5a, 0x1c, 0x01, 0x00, } func (m *AMQPConsumeConfig) Marshal() (dAtA []byte, err error) { @@ -8971,6 +8976,19 @@ func (m *EventSourceStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i = encodeVarintGenerated(dAtA, i, uint64(m.ObservedGeneration)) + i-- + dAtA[i] = 0x18 + { + size, err := m.LastUpdated.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 { size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -14027,6 +14045,19 @@ func (m *SensorStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i = encodeVarintGenerated(dAtA, i, uint64(m.ObservedGeneration)) + i-- + dAtA[i] = 0x18 + { + size, err := m.LastUpdated.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 { size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -17187,6 +17218,9 @@ func (m *EventSourceStatus) Size() (n int) { _ = l l = m.Status.Size() n += 1 + l + sovGenerated(uint64(l)) + l = m.LastUpdated.Size() + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.ObservedGeneration)) return n } @@ -19026,6 +19060,9 @@ func (m *SensorStatus) Size() (n int) { _ = l l = m.Status.Size() n += 1 + l + sovGenerated(uint64(l)) + l = m.LastUpdated.Size() + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.ObservedGeneration)) return n } @@ -20800,6 +20837,8 @@ func (this *EventSourceStatus) String() string { } s := strings.Join([]string{`&EventSourceStatus{`, `Status:` + strings.Replace(strings.Replace(this.Status.String(), "Status", "Status", 1), `&`, ``, 1) + `,`, + `LastUpdated:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.LastUpdated), "Time", "v11.Time", 1), `&`, ``, 1) + `,`, + `ObservedGeneration:` + fmt.Sprintf("%v", this.ObservedGeneration) + `,`, `}`, }, "") return s @@ -22107,6 +22146,8 @@ func (this *SensorStatus) String() string { } s := strings.Join([]string{`&SensorStatus{`, `Status:` + strings.Replace(strings.Replace(this.Status.String(), "Status", "Status", 1), `&`, ``, 1) + `,`, + `LastUpdated:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.LastUpdated), "Time", "v11.Time", 1), `&`, ``, 1) + `,`, + `ObservedGeneration:` + fmt.Sprintf("%v", this.ObservedGeneration) + `,`, `}`, }, "") return s @@ -37237,6 +37278,58 @@ func (m *EventSourceStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastUpdated", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LastUpdated.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ObservedGeneration", wireType) + } + m.ObservedGeneration = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ObservedGeneration |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -54894,6 +54987,58 @@ func (m *SensorStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastUpdated", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LastUpdated.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ObservedGeneration", wireType) + } + m.ObservedGeneration = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ObservedGeneration |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/events/v1alpha1/generated.proto b/pkg/apis/events/v1alpha1/generated.proto index abf1e566c4..cf131c90bd 100644 --- a/pkg/apis/events/v1alpha1/generated.proto +++ b/pkg/apis/events/v1alpha1/generated.proto @@ -1145,6 +1145,13 @@ message EventSourceSpec { // EventSourceStatus holds the status of the event-source resource message EventSourceStatus { optional Status status = 1; + + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastUpdated = 2; + + // The generation observed by the controller. + // +optional + optional int64 observedGeneration = 3; } message ExprFilter { @@ -2782,6 +2789,13 @@ message SensorSpec { // SensorStatus contains information about the status of a sensor. message SensorStatus { optional Status status = 1; + + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastUpdated = 2; + + // The generation observed by the controller. + // +optional + optional int64 observedGeneration = 3; } // Service holds the service information eventsource exposes diff --git a/pkg/apis/events/v1alpha1/openapi_generated.go b/pkg/apis/events/v1alpha1/openapi_generated.go index 3765c62cc6..c7fad8a5c5 100644 --- a/pkg/apis/events/v1alpha1/openapi_generated.go +++ b/pkg/apis/events/v1alpha1/openapi_generated.go @@ -3236,11 +3236,23 @@ func schema_pkg_apis_events_v1alpha1_EventSourceStatus(ref common.ReferenceCallb }, }, }, + "lastUpdated": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "observedGeneration": { + SchemaProps: spec.SchemaProps{ + Description: "The generation observed by the controller.", + Type: []string{"integer"}, + Format: "int64", + }, + }, }, }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/events/v1alpha1.Condition"}, + "github.com/argoproj/argo-events/pkg/apis/events/v1alpha1.Condition", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, } } @@ -7285,11 +7297,23 @@ func schema_pkg_apis_events_v1alpha1_SensorStatus(ref common.ReferenceCallback) }, }, }, + "lastUpdated": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "observedGeneration": { + SchemaProps: spec.SchemaProps{ + Description: "The generation observed by the controller.", + Type: []string{"integer"}, + Format: "int64", + }, + }, }, }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/events/v1alpha1.Condition"}, + "github.com/argoproj/argo-events/pkg/apis/events/v1alpha1.Condition", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, } } diff --git a/pkg/apis/events/v1alpha1/sensor_types.go b/pkg/apis/events/v1alpha1/sensor_types.go index c34ee6169c..5bb091244c 100644 --- a/pkg/apis/events/v1alpha1/sensor_types.go +++ b/pkg/apis/events/v1alpha1/sensor_types.go @@ -869,15 +869,18 @@ func (in *StatusPolicy) GetAllow() []int { // SensorStatus contains information about the status of a sensor. type SensorStatus struct { Status `json:",inline" protobuf:"bytes,1,opt,name=status"` + // +optional + LastUpdated metav1.Time `json:"lastUpdated,omitempty" protobuf:"bytes,2,opt,name=lastUpdated"` + // The generation observed by the controller. + // +optional + ObservedGeneration int64 `json:"observedGeneration,omitempty" protobuf:"varint,3,opt,name=observedGeneration"` } const ( - // SensorConditionDepencencyProvided has the status True when the - // Sensor has valid dependencies provided. - SensorConditionDepencencyProvided ConditionType = "DependenciesProvided" - // SensorConditionTriggersProvided has the status True when the - // Sensor has valid triggers provided. - SensorConditionTriggersProvided ConditionType = "TriggersProvided" + // SensorConditionConfigured has the status True when the Sensor + // has valid configuration. + SensorConditionConfigured ConditionType = "Configured" + // SensorConditionDeployed has the status True when the Sensor // has its Deployment created. SensorConditionDeployed ConditionType = "Deployed" @@ -885,27 +888,17 @@ const ( // InitConditions sets conditions to Unknown state. func (s *SensorStatus) InitConditions() { - s.InitializeConditions(SensorConditionDepencencyProvided, SensorConditionTriggersProvided, SensorConditionDeployed) + s.InitializeConditions(SensorConditionConfigured, SensorConditionDeployed) } // MarkDependenciesProvided set the sensor has valid dependencies provided. -func (s *SensorStatus) MarkDependenciesProvided() { - s.MarkTrue(SensorConditionDepencencyProvided) +func (s *SensorStatus) MarkSensorConfigured() { + s.MarkTrue(SensorConditionConfigured) } // MarkDependenciesNotProvided set the sensor has invalid dependencies provided. -func (s *SensorStatus) MarkDependenciesNotProvided(reason, message string) { - s.MarkFalse(SensorConditionDepencencyProvided, reason, message) -} - -// MarkTriggersProvided set the sensor has valid triggers provided. -func (s *SensorStatus) MarkTriggersProvided() { - s.MarkTrue(SensorConditionTriggersProvided) -} - -// MarkTriggersNotProvided set the sensor has invalid triggers provided. -func (s *SensorStatus) MarkTriggersNotProvided(reason, message string) { - s.MarkFalse(SensorConditionTriggersProvided, reason, message) +func (s *SensorStatus) MarkSensorNotConfigured(reason, message string) { + s.MarkFalse(SensorConditionConfigured, reason, message) } // MarkDeployed set the sensor has been deployed. @@ -918,6 +911,10 @@ func (s *SensorStatus) MarkDeployFailed(reason, message string) { s.MarkFalse(SensorConditionDeployed, reason, message) } +func (s *SensorStatus) SetObservedGeneration(value int64) { + s.ObservedGeneration = value +} + // ArtifactLocation describes the source location for an external artifact type ArtifactLocation struct { // S3 compliant artifact diff --git a/pkg/apis/events/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/events/v1alpha1/zz_generated.deepcopy.go index bae9669ccb..0d797ec18e 100644 --- a/pkg/apis/events/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/events/v1alpha1/zz_generated.deepcopy.go @@ -1670,6 +1670,7 @@ func (in *EventSourceSpec) DeepCopy() *EventSourceSpec { func (in *EventSourceStatus) DeepCopyInto(out *EventSourceStatus) { *out = *in in.Status.DeepCopyInto(&out.Status) + in.LastUpdated.DeepCopyInto(&out.LastUpdated) return } @@ -3779,6 +3780,7 @@ func (in *SensorSpec) DeepCopy() *SensorSpec { func (in *SensorStatus) DeepCopyInto(out *SensorStatus) { *out = *in in.Status.DeepCopyInto(&out.Status) + in.LastUpdated.DeepCopyInto(&out.LastUpdated) return } diff --git a/pkg/reconciler/cmd/start.go b/pkg/reconciler/cmd/start.go index 552d85a62a..fc4254c57f 100644 --- a/pkg/reconciler/cmd/start.go +++ b/pkg/reconciler/cmd/start.go @@ -133,7 +133,7 @@ func Start(eventsOpts ArgoEventsControllerOpts) { } // EventSource controller - eventSourceController, err := controller.New(eventsource.ControllerName, mgr, controller.Options{ + eventSourceController, err := controller.New(aev1.ControllerEventSource, mgr, controller.Options{ Reconciler: eventsource.NewReconciler(mgr.GetClient(), mgr.GetScheme(), imageName, logger), }) if err != nil { diff --git a/pkg/reconciler/eventsource/controller.go b/pkg/reconciler/eventsource/controller.go index 88467611f8..fc11f6c78d 100644 --- a/pkg/reconciler/eventsource/controller.go +++ b/pkg/reconciler/eventsource/controller.go @@ -2,26 +2,36 @@ package eventsource import ( "context" + "encoding/base64" + "encoding/json" + "fmt" + "sort" + "strings" "go.uber.org/zap" + appv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/equality" apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/reconcile" + "sigs.k8s.io/yaml" "github.com/argoproj/argo-events/pkg/apis/events/v1alpha1" - aev1 "github.com/argoproj/argo-events/pkg/apis/events/v1alpha1" "github.com/argoproj/argo-events/pkg/shared/logging" + sharedutil "github.com/argoproj/argo-events/pkg/shared/util" + "github.com/imdario/mergo" ) const ( - // ControllerName is name of the controller - ControllerName = "eventsource-controller" - - finalizerName = ControllerName + finalizerName = v1alpha1.ControllerEventSource ) type reconciler struct { @@ -38,13 +48,13 @@ func NewReconciler(client client.Client, scheme *runtime.Scheme, eventSourceImag } func (r *reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - eventSource := &aev1.EventSource{} + eventSource := &v1alpha1.EventSource{} if err := r.client.Get(ctx, req.NamespacedName, eventSource); err != nil { if apierrors.IsNotFound(err) { r.logger.Warnw("WARNING: eventsource not found", "request", req) return reconcile.Result{}, nil } - r.logger.Errorw("unable to get eventsource ctl", "request", req, "error", err) + r.logger.Errorw("unable to get eventsource", "request", req, zap.Error(err)) return ctrl.Result{}, err } log := r.logger.With("namespace", eventSource.Namespace).With("eventSource", eventSource.Name) @@ -52,12 +62,14 @@ func (r *reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu esCopy := eventSource.DeepCopy() reconcileErr := r.reconcile(ctx, esCopy) if reconcileErr != nil { - log.Errorw("reconcile error", zap.Error(reconcileErr)) + log.Errorw("Reconcile error", zap.Error(reconcileErr)) } - if r.needsUpdate(eventSource, esCopy) { - // Use a DeepCopy to update, because it will be mutated afterwards, with empty Status. - if err := r.client.Update(ctx, esCopy.DeepCopy()); err != nil { - return reconcile.Result{}, err + esCopy.Status.LastUpdated = metav1.Now() + if !equality.Semantic.DeepEqual(eventSource.Finalizers, esCopy.Finalizers) { + patchYaml := "metadata:\n finalizers: [" + strings.Join(esCopy.Finalizers, ",") + "]" + patchJson, _ := yaml.YAMLToJSON([]byte(patchYaml)) + if err := r.client.Patch(ctx, eventSource, client.RawPatch(types.MergePatchType, patchJson)); err != nil { + return ctrl.Result{}, err } } if err := r.client.Status().Update(ctx, esCopy); err != nil { @@ -67,41 +79,521 @@ func (r *reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu } // reconcile does the real logic -func (r *reconciler) reconcile(ctx context.Context, eventSource *aev1.EventSource) error { +func (r *reconciler) reconcile(ctx context.Context, eventSource *v1alpha1.EventSource) error { log := logging.FromContext(ctx) if !eventSource.DeletionTimestamp.IsZero() { - log.Info("deleting eventsource") + log.Info("Deleting eventsource") if controllerutil.ContainsFinalizer(eventSource, finalizerName) { - // Finalizer logic should be added here. + // We don't add finalizer anymore, keep the removing logic for backward compatibility controllerutil.RemoveFinalizer(eventSource, finalizerName) } return nil } - controllerutil.AddFinalizer(eventSource, finalizerName) eventSource.Status.InitConditions() + eventSource.Status.SetObservedGeneration(eventSource.Generation) if err := ValidateEventSource(eventSource); err != nil { - log.Errorw("validation error", zap.Error(err)) + log.Errorw("Validation error", zap.Error(err)) + eventSource.Status.MarkSourcesNotProvided("InvalidEventSource", err.Error()) + return err + } + eventSource.Status.MarkSourcesProvided() + if err := r.orchestrateResources(ctx, eventSource); err != nil { + log.Errorw("Error orchestrating resources", zap.Error(err)) + eventSource.Status.MarkDeployFailed("OrchestrateResourcesFailed", err.Error()) return err } - args := &AdaptorArgs{ - Image: r.eventSourceImage, - EventSource: eventSource, - Labels: map[string]string{ - "controller": "eventsource-controller", - v1alpha1.LabelEventSourceName: eventSource.Name, - v1alpha1.LabelOwnerName: eventSource.Name, + eventSource.Status.MarkDeployed() + return nil +} + +func (r *reconciler) orchestrateResources(ctx context.Context, eventSource *v1alpha1.EventSource) error { + log := logging.FromContext(ctx) + eventBus := &v1alpha1.EventBus{} + eventBusName := v1alpha1.DefaultEventBusName + if len(eventSource.Spec.EventBusName) > 0 { + eventBusName = eventSource.Spec.EventBusName + } + err := r.client.Get(ctx, types.NamespacedName{Namespace: eventSource.Namespace, Name: eventBusName}, eventBus) + if err != nil { + if apierrors.IsNotFound(err) { + log.Errorw("EventBus not found", "eventBusName", eventBusName, zap.Error(err)) + return fmt.Errorf("eventbus %s not found", eventBusName) + } + return fmt.Errorf("failed to get eventbus %q, %w", eventBusName, err) + } + if !eventBus.Status.IsReady() { + return fmt.Errorf("eventbus %q not ready", eventBusName) + } + + if err := r.createOrUpdateDeployment(ctx, eventBus, eventSource); err != nil { + return fmt.Errorf("failed to create/update a deployment, %w", err) + } + + // Create service if any + if eventSource.Spec.Service != nil { + if err := r.createOrUpdateService(ctx, eventSource); err != nil { + return fmt.Errorf("failed to create/update a service, %w", err) + } + } + return nil +} + +func (r *reconciler) createOrUpdateDeployment(ctx context.Context, eventBus *v1alpha1.EventBus, eventSource *v1alpha1.EventSource) error { + log := logging.FromContext(ctx) + + // Clean up legacy deployment + // TODO: remove this in a future rlease + legacyDeploy, err := r.findLegacyDeployment(ctx, eventSource) + if err != nil { + if !apierrors.IsNotFound(err) { + log.Errorw("error finding legacy deployment", zap.Error(err)) + return err + } + } else { + _ = r.client.Delete(ctx, legacyDeploy) + } + + expectedDeploy, err := r.buildDeployment(eventBus, eventSource) + if err != nil { + return fmt.Errorf("failed to build deployment spec, %w", err) + } + + deployHash := expectedDeploy.GetAnnotations()[v1alpha1.KeyHash] + + existingDeploy := &appv1.Deployment{} + needToCreate := false + if err := r.client.Get(ctx, types.NamespacedName{Namespace: eventSource.Namespace, Name: expectedDeploy.Name}, existingDeploy); err != nil { + if !apierrors.IsNotFound(err) { + log.Errorw("Failed to find existing deployment", zap.String("deployment", expectedDeploy.Name), zap.Error(err)) + return fmt.Errorf("failed to find existing deployment, %w", err) + } else { + needToCreate = true + } + } else { + if existingDeploy.GetAnnotations()[v1alpha1.KeyHash] != deployHash { + // Delete and recreate, to avoid updating immutable fields problem. + if err := r.client.Delete(ctx, expectedDeploy); err != nil { + log.Errorw("Failed to delete the outdated daemon deployment", zap.String("deployment", existingDeploy.Name), zap.Error(err)) + return fmt.Errorf("failed to delete an outdated deployment, %w", err) + } + needToCreate = true + } + } + if needToCreate { + if err := r.client.Create(ctx, expectedDeploy); err != nil && !apierrors.IsAlreadyExists(err) { + log.Errorw("Failed to create a deployment", zap.String("deployment", expectedDeploy.Name), zap.Error(err)) + return fmt.Errorf("failed to create a deployment, %w", err) + } + log.Infow("Succeeded to create/recreate a deployment", zap.String("deployment", expectedDeploy.Name)) + } + return nil +} + +func (r *reconciler) buildDeployment(eventBus *v1alpha1.EventBus, eventSource *v1alpha1.EventSource) (*appv1.Deployment, error) { + labels := map[string]string{ + v1alpha1.KeyManagedBy: v1alpha1.ControllerEventSource, + v1alpha1.KeyComponent: v1alpha1.ComponentEventSource, + v1alpha1.KeyPartOf: v1alpha1.Project, + v1alpha1.KeyAppName: eventSource.GetDeploymentName(), + v1alpha1.KeyEventSourceName: eventSource.Name, + } + deploymentSpec, err := r.buildDeploymentSpec(eventSource, labels) + if err != nil { + return nil, err + } + eventSourceCopy := &v1alpha1.EventSource{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: eventSource.Namespace, + Name: eventSource.GetDeploymentName(), + }, + Spec: eventSource.Spec, + } + eventSourceBytes, err := json.Marshal(eventSourceCopy) + if err != nil { + return nil, fmt.Errorf("failed marshal eventsource spec") + } + busConfigBytes, err := json.Marshal(eventBus.Status.Config) + if err != nil { + return nil, fmt.Errorf("failed marshal event bus config: %v", err) + } + + env := []corev1.EnvVar{ + { + Name: v1alpha1.EnvVarEventSourceObject, + Value: base64.StdEncoding.EncodeToString(eventSourceBytes), + }, + { + Name: v1alpha1.EnvVarEventBusSubject, + Value: fmt.Sprintf("eventbus-%s", eventSource.Namespace), + }, + { + Name: v1alpha1.EnvVarPodName, + ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{FieldPath: "metadata.name"}}, + }, + { + Name: v1alpha1.EnvVarLeaderElection, + Value: eventSource.Annotations[v1alpha1.AnnotationLeaderElection], + }, + { + Name: v1alpha1.EnvVarEventBusConfig, + Value: base64.StdEncoding.EncodeToString(busConfigBytes), + }, + } + + volumes := []corev1.Volume{ + { + Name: "tmp", + VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}, + }, + } + + volumeMounts := []corev1.VolumeMount{ + { + Name: "tmp", + MountPath: "/tmp", }, } - return Reconcile(r.client, args, log) + + var secretObjs []interface{} + var accessSecret *corev1.SecretKeySelector + var caCertSecret *corev1.SecretKeySelector + var clientCertSecret *corev1.SecretKeySelector + var clientKeySecret *corev1.SecretKeySelector + switch { + case eventBus.Status.Config.NATS != nil: + caCertSecret = nil + clientCertSecret = nil + clientKeySecret = nil + accessSecret = eventBus.Status.Config.NATS.AccessSecret + secretObjs = []interface{}{eventSourceCopy} + case eventBus.Status.Config.JetStream != nil: + tlsOptions := eventBus.Status.Config.JetStream.TLS + if tlsOptions != nil { + caCertSecret = tlsOptions.CACertSecret + clientCertSecret = tlsOptions.ClientCertSecret + clientKeySecret = tlsOptions.ClientKeySecret + } + accessSecret = eventBus.Status.Config.JetStream.AccessSecret + secretObjs = []interface{}{eventSourceCopy} + case eventBus.Status.Config.Kafka != nil: + caCertSecret = nil + clientCertSecret = nil + clientKeySecret = nil + accessSecret = nil + secretObjs = []interface{}{eventSourceCopy, eventBus} // kafka requires secrets for sasl and tls + default: + return nil, fmt.Errorf("unsupported event bus") + } + + if accessSecret != nil { + // Mount the secret as volume instead of using envFrom to gain the ability + // for the sensor deployment to auto reload when the secret changes + volumes = append(volumes, corev1.Volume{ + Name: "auth-volume", + VolumeSource: corev1.VolumeSource{ + Secret: &corev1.SecretVolumeSource{ + SecretName: accessSecret.Name, + Items: []corev1.KeyToPath{ + { + Key: accessSecret.Key, + Path: "auth.yaml", + }, + }, + }, + }, + }) + volumeMounts = append(volumeMounts, corev1.VolumeMount{ + Name: "auth-volume", + MountPath: v1alpha1.EventBusAuthFileMountPath, + }) + } + + uniqueCertVolumeMap := make(map[string][]corev1.KeyToPath) + for _, secret := range []*corev1.SecretKeySelector{caCertSecret, clientCertSecret, clientKeySecret} { + if secret != nil { + uniqueCertVolumeMap[secret.Name] = append(uniqueCertVolumeMap[secret.Name], corev1.KeyToPath{ + Key: secret.Key, + Path: secret.Key, + }) + } + } + + // We deduplicate the certificate secret mounts to ensure every secret under the TLS config is only mounted once + // because the secrets MUST be mounted at /argo-events/secrets/ + // in order for util.GetTLSConfig to work without modification + for secretName, items := range uniqueCertVolumeMap { + // The names of volumes MUST be valid DNS_LABELs; as the secret names are user-supplied, + // we perform some input cleansing to ensure they conform + volumeName := sharedutil.ConvertToDNSLabel(secretName) + + optional := false + + volumes = append(volumes, corev1.Volume{ + Name: volumeName, + VolumeSource: corev1.VolumeSource{ + Secret: &corev1.SecretVolumeSource{ + SecretName: secretName, + Items: items, + Optional: &optional, + }, + }, + }) + + volumeMounts = append(volumeMounts, corev1.VolumeMount{ + Name: volumeName, + MountPath: fmt.Sprintf("/argo-events/secrets/%s", secretName), + }) + } + + // secrets + volSecrets, volSecretMounts := sharedutil.VolumesFromSecretsOrConfigMaps(v1alpha1.SecretKeySelectorType, secretObjs...) + volumes = append(volumes, volSecrets...) + volumeMounts = append(volumeMounts, volSecretMounts...) + + // config maps + volConfigMaps, volCofigMapMounts := sharedutil.VolumesFromSecretsOrConfigMaps(v1alpha1.ConfigMapKeySelectorType, eventSourceCopy) + volumeMounts = append(volumeMounts, volCofigMapMounts...) + volumes = append(volumes, volConfigMaps...) + + // Order volumes and volumemounts based on name to make the order deterministic + sort.Slice(volumes, func(i, j int) bool { + return volumes[i].Name < volumes[j].Name + }) + sort.Slice(volumeMounts, func(i, j int) bool { + return volumeMounts[i].Name < volumeMounts[j].Name + }) + + deploymentSpec.Template.Spec.Containers[0].Env = append(deploymentSpec.Template.Spec.Containers[0].Env, env...) + deploymentSpec.Template.Spec.Containers[0].VolumeMounts = append(deploymentSpec.Template.Spec.Containers[0].VolumeMounts, volumeMounts...) + deploymentSpec.Template.Spec.Volumes = append(deploymentSpec.Template.Spec.Volumes, volumes...) + + hash := sharedutil.MustHash(deploymentSpec) + + deployment := &appv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: eventSource.Namespace, + Name: eventSource.GetDeploymentName(), + Labels: labels, + Annotations: map[string]string{ + v1alpha1.KeyHash: hash, + }, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(eventSource.GetObjectMeta(), v1alpha1.EventBusGroupVersionKind), + }, + }, + Spec: *deploymentSpec, + } + return deployment, nil +} + +func (r *reconciler) buildDeploymentSpec(eventSource *v1alpha1.EventSource, labels map[string]string) (*appv1.DeploymentSpec, error) { + eventSourceContainer := corev1.Container{ + Name: "main", + Image: r.eventSourceImage, + ImagePullPolicy: sharedutil.GetImagePullPolicy(), + Args: []string{"eventsource-service"}, + Ports: []corev1.ContainerPort{ + {Name: "metrics", ContainerPort: v1alpha1.EventSourceMetricsPort}, + }, + } + if t := eventSource.Spec.Template; t != nil && t.Container != nil { + if err := mergo.Merge(&eventSourceContainer, t.Container, mergo.WithOverride); err != nil { + return nil, err + } + } + lbs := make(map[string]string) + for k, v := range labels { + lbs[k] = v + } + if t := eventSource.Spec.Template; t != nil && t.Metadata != nil && + len(t.Metadata.Labels) > 0 { + for k, v := range t.Metadata.Labels { + lbs[k] = v + } + } + + replicas := eventSource.Spec.GetReplicas() + spec := &appv1.DeploymentSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: lbs, + }, + Replicas: &replicas, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: lbs, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + eventSourceContainer, + }, + }, + }, + } + if t := eventSource.Spec.Template; t != nil { + if t.Metadata != nil { + spec.Template.SetAnnotations(t.Metadata.Annotations) + } + spec.Template.Spec.ServiceAccountName = t.ServiceAccountName + spec.Template.Spec.Volumes = t.Volumes + spec.Template.Spec.SecurityContext = t.SecurityContext + spec.Template.Spec.NodeSelector = t.NodeSelector + spec.Template.Spec.Tolerations = t.Tolerations + spec.Template.Spec.Affinity = t.Affinity + spec.Template.Spec.ImagePullSecrets = t.ImagePullSecrets + spec.Template.Spec.PriorityClassName = t.PriorityClassName + spec.Template.Spec.Priority = t.Priority + } + return spec, nil +} + +func (r *reconciler) findLegacyDeployment(ctx context.Context, eventSource *v1alpha1.EventSource) (*appv1.Deployment, error) { + selector := labels.SelectorFromSet(map[string]string{ + "controller": "eventsource-controller", + "eventsource-name": eventSource.Name, + "owner-name": eventSource.Name, + }) + dl := &appv1.DeploymentList{} + err := r.client.List(ctx, dl, &client.ListOptions{ + Namespace: eventSource.Namespace, + LabelSelector: selector, + }) + if err != nil { + return nil, err + } + for _, deploy := range dl.Items { + if metav1.IsControlledBy(&deploy, eventSource) { + return &deploy, nil + } + } + return nil, apierrors.NewNotFound(schema.GroupResource{}, "") } -func (r *reconciler) needsUpdate(old, new *aev1.EventSource) bool { - if old == nil { - return true +func (r *reconciler) createOrUpdateService(ctx context.Context, eventSource *v1alpha1.EventSource) error { + log := logging.FromContext(ctx) + + // Clean up legacy services + // TODO: remove this in a future release + legacySvc, err := r.findLegacyService(ctx, eventSource) + if err != nil { + if !apierrors.IsNotFound(err) { + log.Errorw("error finding legacy deployment", zap.Error(err)) + return err + } + } else { + _ = r.client.Delete(ctx, legacySvc) } - if !equality.Semantic.DeepEqual(old.Finalizers, new.Finalizers) { - return true + + expectedSvc := r.buildService(eventSource) + if expectedSvc == nil { + return nil + } + svcHash := expectedSvc.GetAnnotations()[v1alpha1.KeyHash] + + existingSvc := &corev1.Service{} + needToCreat := false + if err := r.client.Get(ctx, types.NamespacedName{Namespace: eventSource.Namespace, Name: expectedSvc.Name}, existingSvc); err != nil { + if apierrors.IsNotFound(err) { + needToCreat = true + } else { + return fmt.Errorf("failed to find existing service, %w", err) + } + } else if existingSvc.GetAnnotations()[v1alpha1.KeyHash] != svcHash { + if err := r.client.Delete(ctx, existingSvc); err != nil && !apierrors.IsNotFound(err) { + log.Errorw("Failed to delete existing service", zap.String("service", existingSvc.Name), zap.Error(err)) + return fmt.Errorf("failed to delete existing service, %w", err) + } + needToCreat = true + } + if needToCreat { + if err := r.client.Create(ctx, expectedSvc); err != nil { + log.Errorw("Failed to create daemon service", zap.String("service", expectedSvc.Name), zap.Error(err)) + return fmt.Errorf("failed to create a service, %w", err) + } + log.Infow("Succeeded to create/recreate a service", zap.String("service", expectedSvc.Name)) + } + return nil +} + +func (r *reconciler) buildService(eventSource *v1alpha1.EventSource) *corev1.Service { + if eventSource.Spec.Service == nil { + return nil + } + if len(eventSource.Spec.Service.Ports) == 0 { + return nil + } + // Use a ports copy otherwise it will update the oririnal Ports spec in EventSource + ports := []corev1.ServicePort{} + ports = append(ports, eventSource.Spec.Service.Ports...) + + labels := map[string]string{ + v1alpha1.KeyManagedBy: v1alpha1.ControllerEventSource, + v1alpha1.KeyComponent: v1alpha1.ComponentEventSource, + v1alpha1.KeyPartOf: v1alpha1.Project, + v1alpha1.KeyAppName: eventSource.GetDeploymentName(), + v1alpha1.KeyEventSourceName: eventSource.Name, + } + svc := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: eventSource.GetServiceName(), + Namespace: eventSource.Namespace, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(eventSource.GetObjectMeta(), v1alpha1.EventBusGroupVersionKind), + }, + }, + Spec: corev1.ServiceSpec{ + Ports: ports, + Type: corev1.ServiceTypeClusterIP, + ClusterIP: eventSource.Spec.Service.ClusterIP, + Selector: labels, + }, + } + + lbs := make(map[string]string) + for k, v := range labels { + lbs[k] = v + } + hash := sharedutil.MustHash(svc.Spec) + annotations := map[string]string{ + v1alpha1.KeyHash: hash, + } + + if s := eventSource.Spec.Service.Metadata; s != nil { + if s.Labels != nil { + for k, v := range s.Labels { + lbs[k] = v + } + } + if s.Annotations != nil { + for k, v := range s.Annotations { + annotations[k] = v + } + } + } + + svc.ObjectMeta.SetLabels(lbs) + svc.ObjectMeta.SetAnnotations(annotations) + return svc +} + +func (r *reconciler) findLegacyService(ctx context.Context, eventSource *v1alpha1.EventSource) (*corev1.Service, error) { + selector := labels.SelectorFromSet(map[string]string{ + "controller": "eventsource-controller", + "eventsource-name": eventSource.Name, + "owner-name": eventSource.Name, + }) + sl := &corev1.ServiceList{} + err := r.client.List(ctx, sl, &client.ListOptions{ + Namespace: eventSource.Namespace, + LabelSelector: selector, + }) + if err != nil { + return nil, err + } + for _, svc := range sl.Items { + if metav1.IsControlledBy(&svc, eventSource) { + return &svc, nil + } } - return false + return nil, apierrors.NewNotFound(schema.GroupResource{}, "") } diff --git a/pkg/reconciler/eventsource/controller_test.go b/pkg/reconciler/eventsource/controller_test.go index 43f7e3ddc6..acc9b8635b 100644 --- a/pkg/reconciler/eventsource/controller_test.go +++ b/pkg/reconciler/eventsource/controller_test.go @@ -2,6 +2,8 @@ package eventsource import ( "context" + "fmt" + "strings" "testing" appv1 "k8s.io/api/apps/v1" @@ -116,6 +118,47 @@ var ( }, }, } + + fakeEventBusJetstreamWithTLS = &v1alpha1.EventBus{ + TypeMeta: metav1.TypeMeta{ + APIVersion: v1alpha1.SchemeGroupVersion.String(), + Kind: "EventBus", + }, + ObjectMeta: metav1.ObjectMeta{ + Namespace: testNamespace, + Name: v1alpha1.DefaultEventBusName, + }, + Spec: v1alpha1.EventBusSpec{ + JetStream: &v1alpha1.JetStreamBus{}, + }, + Status: v1alpha1.EventBusStatus{ + Config: v1alpha1.BusConfig{ + JetStream: &v1alpha1.JetStreamConfig{ + URL: "nats://xxxx", + TLS: &v1alpha1.TLSConfig{ + CACertSecret: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "secret-0", + }, + Key: "ca.crt", + }, + ClientKeySecret: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "secret-1", + }, + Key: "tls.key", + }, + ClientCertSecret: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "secret-1", + }, + Key: "tls.crt", + }, + }, + }, + }, + }, + } ) func fakeEmptyEventSource() *v1alpha1.EventSource { @@ -209,7 +252,7 @@ func TestReconcile(t *testing.T) { testEventSource.Spec.Calendar = fakeCalendarEventSourceMap("test") ctx := context.TODO() cl := fake.NewClientBuilder().Build() - testBus := fakeEventBus.DeepCopy() + testBus := fakeEventBusJetstream.DeepCopy() testBus.Status.MarkDeployed("test", "test") testBus.Status.MarkConfigured() err := cl.Create(ctx, testBus) @@ -225,3 +268,217 @@ func TestReconcile(t *testing.T) { assert.True(t, testEventSource.Status.IsReady()) }) } + +func Test_BuildDeployment(t *testing.T) { + cl := fake.NewClientBuilder().Build() + r := &reconciler{ + client: cl, + scheme: scheme.Scheme, + eventSourceImage: "test-image", + logger: logging.NewArgoEventsLogger(), + } + testEventSource := fakeEmptyEventSource() + testEventSource.Spec.HDFS = fakeHDFSEventSourceMap("test") + testEventSource.Spec.Template = &v1alpha1.Template{ + ImagePullSecrets: []corev1.LocalObjectReference{ + { + Name: "test", + }, + }, + PriorityClassName: "test-class", + } + + t.Run("test build HDFS", func(t *testing.T) { + deployment, err := r.buildDeployment(fakeEventBus.DeepCopy(), testEventSource) + assert.Nil(t, err) + assert.NotNil(t, deployment) + volumes := deployment.Spec.Template.Spec.Volumes + assert.True(t, len(volumes) > 0) + hasAuthVolume := false + hasTmpVolume := false + cmRefs, secretRefs := 0, 0 + for _, vol := range volumes { + if vol.Name == "auth-volume" { + hasAuthVolume = true + } + if vol.Name == "tmp" { + hasTmpVolume = true + } + if strings.Contains(vol.Name, testEventSource.Spec.HDFS["test"].KrbCCacheSecret.Name) { + secretRefs++ + } + if strings.Contains(vol.Name, testEventSource.Spec.HDFS["test"].KrbConfigConfigMap.Name) { + cmRefs++ + } + } + assert.True(t, hasAuthVolume) + assert.True(t, hasTmpVolume) + assert.True(t, len(deployment.Spec.Template.Spec.ImagePullSecrets) > 0) + assert.True(t, cmRefs > 0) + assert.True(t, secretRefs > 0) + assert.Equal(t, deployment.Spec.Template.Spec.PriorityClassName, "test-class") + }) + + t.Run("test kafka eventbus secrets attached", func(t *testing.T) { + // add secrets to kafka eventbus + testBus := fakeEventBusKafka.DeepCopy() + testBus.Spec.Kafka.TLS = &v1alpha1.TLSConfig{ + CACertSecret: &corev1.SecretKeySelector{Key: "cert", LocalObjectReference: corev1.LocalObjectReference{Name: "tls-secret"}}, + } + testBus.Spec.Kafka.SASL = &v1alpha1.SASLConfig{ + Mechanism: "SCRAM-SHA-512", + UserSecret: &corev1.SecretKeySelector{Key: "username", LocalObjectReference: corev1.LocalObjectReference{Name: "sasl-secret"}}, + PasswordSecret: &corev1.SecretKeySelector{Key: "password", LocalObjectReference: corev1.LocalObjectReference{Name: "sasl-secret"}}, + } + + deployment, err := r.buildDeployment(testBus, testEventSource) + assert.Nil(t, err) + assert.NotNil(t, deployment) + + hasSASLSecretVolume := false + hasSASLSecretVolumeMount := false + hasTLSSecretVolume := false + hasTLSSecretVolumeMount := false + for _, volume := range deployment.Spec.Template.Spec.Volumes { + if volume.Name == "secret-sasl-secret" { + hasSASLSecretVolume = true + } + if volume.Name == "secret-tls-secret" { + hasTLSSecretVolume = true + } + } + for _, volumeMount := range deployment.Spec.Template.Spec.Containers[0].VolumeMounts { + if volumeMount.Name == "secret-sasl-secret" { + hasSASLSecretVolumeMount = true + } + if volumeMount.Name == "secret-tls-secret" { + hasTLSSecretVolumeMount = true + } + } + + assert.True(t, hasSASLSecretVolume) + assert.True(t, hasSASLSecretVolumeMount) + assert.True(t, hasTLSSecretVolume) + assert.True(t, hasTLSSecretVolumeMount) + }) + + t.Run("test jetstream eventbus secrets attached", func(t *testing.T) { + deployment, err := r.buildDeployment(fakeEventBusJetstreamWithTLS.DeepCopy(), testEventSource) + assert.Nil(t, err) + assert.NotNil(t, deployment) + + hasCAVolume := false + hasCertVolume := false + hasCAVolumeMount := false + hasCertVolumeMount := false + for _, volume := range deployment.Spec.Template.Spec.Volumes { + if volume.Name == "secret-0" { + if hasCAVolume { + assert.Fail(t, "Secrets should be de-duplicated") + } + hasCAVolume = true + } + if volume.Name == "secret-1" { + if hasCertVolume { + assert.Fail(t, "Secrets should be de-duplicated") + } + hasCertVolume = true + } + } + for _, volumeMount := range deployment.Spec.Template.Spec.Containers[0].VolumeMounts { + if volumeMount.Name == "secret-0" { + hasCAVolumeMount = true + assert.Equal(t, volumeMount.MountPath, fmt.Sprintf("/argo-events/secrets/%s", volumeMount.Name)) + } + if volumeMount.Name == "secret-1" { + hasCertVolumeMount = true + assert.Equal(t, volumeMount.MountPath, fmt.Sprintf("/argo-events/secrets/%s", volumeMount.Name)) + } + } + + assert.True(t, hasCAVolume) + assert.True(t, hasCertVolume) + assert.True(t, hasCAVolumeMount) + assert.True(t, hasCertVolumeMount) + }) + + t.Run("test secret volume and volumemount order deterministic", func(t *testing.T) { + webhooksWithSecrets := map[string]v1alpha1.WebhookEventSource{ + "webhook4": { + WebhookContext: v1alpha1.WebhookContext{ + URL: "http://a.b", + Endpoint: "/webhook4", + Port: "1234", + AuthSecret: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{Name: "webhook4"}, + Key: "secret", + }, + }, + }, + "webhook3": { + WebhookContext: v1alpha1.WebhookContext{ + URL: "http://a.b", + Endpoint: "/webhook3", + Port: "1234", + AuthSecret: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{Name: "webhook3"}, + Key: "secret", + }, + }, + }, + "webhook1": { + WebhookContext: v1alpha1.WebhookContext{ + URL: "http://a.b", + Endpoint: "/webhook1", + Port: "1234", + AuthSecret: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{Name: "webhook1"}, + Key: "secret", + }, + }, + }, + "webhook2": { + WebhookContext: v1alpha1.WebhookContext{ + URL: "http://a.b", + Endpoint: "/webhook2", + Port: "1234", + AuthSecret: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{Name: "webhook2"}, + Key: "secret", + }, + }, + }, + } + es := testEventSource.DeepCopy() + es.Spec.Webhook = webhooksWithSecrets + + wantVolumeNames := []string{"auth-volume", "cm-test-cm", "secret-test-secret", "secret-webhook1", "secret-webhook2", "secret-webhook3", "secret-webhook4", "tmp"} + wantVolumeMountNames := []string{"auth-volume", "cm-test-cm", "secret-test-secret", "secret-webhook1", "secret-webhook2", "secret-webhook3", "secret-webhook4", "tmp"} + + deployment, err := r.buildDeployment(fakeEventBus, es) + assert.Nil(t, err) + assert.NotNil(t, deployment) + gotVolumes := deployment.Spec.Template.Spec.Volumes + gotVolumeMounts := deployment.Spec.Template.Spec.Containers[0].VolumeMounts + + var gotVolumeNames []string + var gotVolumeMountNames []string + + for _, v := range gotVolumes { + gotVolumeNames = append(gotVolumeNames, v.Name) + } + for _, v := range gotVolumeMounts { + gotVolumeMountNames = append(gotVolumeMountNames, v.Name) + } + + assert.Equal(t, len(gotVolumes), len(wantVolumeNames)) + assert.Equal(t, len(gotVolumeMounts), len(wantVolumeMountNames)) + + for i := range gotVolumeNames { + assert.Equal(t, gotVolumeNames[i], wantVolumeNames[i]) + } + for i := range gotVolumeMountNames { + assert.Equal(t, gotVolumeMountNames[i], wantVolumeMountNames[i]) + } + }) +} diff --git a/pkg/reconciler/eventsource/resource.go b/pkg/reconciler/eventsource/resource.go deleted file mode 100644 index decc44ebcc..0000000000 --- a/pkg/reconciler/eventsource/resource.go +++ /dev/null @@ -1,486 +0,0 @@ -package eventsource - -import ( - "context" - "encoding/base64" - "encoding/json" - "fmt" - "sort" - - "github.com/argoproj/argo-events/pkg/apis/events/v1alpha1" - aev1 "github.com/argoproj/argo-events/pkg/apis/events/v1alpha1" - controllerscommon "github.com/argoproj/argo-events/pkg/reconciler/common" - sharedutil "github.com/argoproj/argo-events/pkg/shared/util" - "github.com/imdario/mergo" - "go.uber.org/zap" - appv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// AdaptorArgs are the args needed to create a sensor deployment -type AdaptorArgs struct { - Image string - EventSource *aev1.EventSource - Labels map[string]string -} - -// Reconcile does the real logic -func Reconcile(client client.Client, args *AdaptorArgs, logger *zap.SugaredLogger) error { - ctx := context.Background() - eventSource := args.EventSource - eventBus := &aev1.EventBus{} - eventBusName := v1alpha1.DefaultEventBusName - if len(eventSource.Spec.EventBusName) > 0 { - eventBusName = eventSource.Spec.EventBusName - } - err := client.Get(ctx, types.NamespacedName{Namespace: eventSource.Namespace, Name: eventBusName}, eventBus) - if err != nil { - if apierrors.IsNotFound(err) { - eventSource.Status.MarkDeployFailed("EventBusNotFound", "EventBus not found.") - logger.Errorw("EventBus not found", "eventBusName", eventBusName, "error", err) - return fmt.Errorf("eventbus %s not found", eventBusName) - } - eventSource.Status.MarkDeployFailed("GetEventBusFailed", "Failed to get EventBus.") - logger.Errorw("failed to get EventBus", "eventBusName", eventBusName, "error", err) - return err - } - if !eventBus.Status.IsReady() { - eventSource.Status.MarkDeployFailed("EventBusNotReady", "EventBus not ready.") - logger.Errorw("event bus is not in ready status", "eventBusName", eventBusName, "error", err) - return fmt.Errorf("eventbus not ready") - } - - expectedDeploy, err := buildDeployment(args, eventBus) - if err != nil { - eventSource.Status.MarkDeployFailed("BuildDeploymentSpecFailed", "Failed to build Deployment spec.") - logger.Errorw("failed to build deployment spec", "error", err) - return err - } - - deploy, err := getDeployment(ctx, client, args) - if err != nil && !apierrors.IsNotFound(err) { - eventSource.Status.MarkDeployFailed("GetDeploymentFailed", "Get existing deployment failed") - logger.Errorw("error getting existing deployment", "error", err) - return err - } - if deploy != nil { - if deploy.Annotations != nil && deploy.Annotations[v1alpha1.AnnotationResourceSpecHash] != expectedDeploy.Annotations[v1alpha1.AnnotationResourceSpecHash] { - deploy.Spec = expectedDeploy.Spec - deploy.SetLabels(expectedDeploy.Labels) - deploy.Annotations[v1alpha1.AnnotationResourceSpecHash] = expectedDeploy.Annotations[v1alpha1.AnnotationResourceSpecHash] - err = client.Update(ctx, deploy) - if err != nil { - eventSource.Status.MarkDeployFailed("UpdateDeploymentFailed", "Failed to update existing deployment") - logger.Errorw("error updating existing deployment", "error", err) - return err - } - logger.Infow("deployment is updated", "deploymentName", deploy.Name) - } - } else { - err = client.Create(ctx, expectedDeploy) - if err != nil { - eventSource.Status.MarkDeployFailed("CreateDeploymentFailed", "Failed to create a deployment") - logger.Errorw("error creating a deployment", "error", err) - return err - } - logger.Infow("deployment is created", "deploymentName", expectedDeploy.Name) - } - // Service if any - existingSvc, err := getService(ctx, client, args) - if err != nil && !apierrors.IsNotFound(err) { - eventSource.Status.MarkDeployFailed("GetServiceFailed", "Failed to get existing service") - logger.Errorw("error getting existing service", "error", err) - return err - } - expectedSvc, err := buildService(args) - if err != nil { - eventSource.Status.MarkDeployFailed("BuildServiceFailed", "Failed to build service spec") - logger.Errorw("error building service spec", "error", err) - return err - } - if expectedSvc == nil { - if existingSvc != nil { - err = client.Delete(ctx, existingSvc) - if err != nil { - eventSource.Status.MarkDeployFailed("DeleteServiceFailed", "Failed to delete existing service") - logger.Errorw("error deleting existing service", "error", err) - return err - } - logger.Infow("deleted existing service", "serviceName", existingSvc.Name) - } - } else { - if existingSvc == nil { - err = client.Create(ctx, expectedSvc) - if err != nil { - eventSource.Status.MarkDeployFailed("CreateServiceFailed", "Failed to create a service") - logger.Errorw("error creating a service", "error", err) - return err - } - logger.Infow("service is created", "serviceName", expectedSvc.Name) - } else if existingSvc.Annotations != nil && existingSvc.Annotations[v1alpha1.AnnotationResourceSpecHash] != expectedSvc.Annotations[v1alpha1.AnnotationResourceSpecHash] { - // To avoid service updating issues such as port name change, re-create it. - err = client.Delete(ctx, existingSvc) - if err != nil { - eventSource.Status.MarkDeployFailed("DeleteServiceFailed", "Failed to delete existing service") - logger.Errorw("error deleting existing service", "error", err) - return err - } - err = client.Create(ctx, expectedSvc) - if err != nil { - eventSource.Status.MarkDeployFailed("RecreateServiceFailed", "Failed to re-create existing service") - logger.Errorw("error re-creating existing service", "error", err) - return err - } - logger.Infow("service is re-created", "serviceName", existingSvc.Name) - } - } - eventSource.Status.MarkDeployed() - return nil -} - -func getDeployment(ctx context.Context, cl client.Client, args *AdaptorArgs) (*appv1.Deployment, error) { - dl := &appv1.DeploymentList{} - err := cl.List(ctx, dl, &client.ListOptions{ - Namespace: args.EventSource.Namespace, - LabelSelector: labelSelector(args.Labels), - }) - if err != nil { - return nil, err - } - for _, deploy := range dl.Items { - if metav1.IsControlledBy(&deploy, args.EventSource) { - return &deploy, nil - } - } - return nil, apierrors.NewNotFound(schema.GroupResource{}, "") -} - -func buildDeployment(args *AdaptorArgs, eventBus *aev1.EventBus) (*appv1.Deployment, error) { - deploymentSpec, err := buildDeploymentSpec(args) - if err != nil { - return nil, err - } - eventSourceCopy := &aev1.EventSource{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: args.EventSource.Namespace, - Name: args.EventSource.Name, - }, - Spec: args.EventSource.Spec, - } - eventSourceBytes, err := json.Marshal(eventSourceCopy) - if err != nil { - return nil, fmt.Errorf("failed marshal eventsource spec") - } - busConfigBytes, err := json.Marshal(eventBus.Status.Config) - if err != nil { - return nil, fmt.Errorf("failed marshal event bus config: %v", err) - } - - env := []corev1.EnvVar{ - { - Name: v1alpha1.EnvVarEventSourceObject, - Value: base64.StdEncoding.EncodeToString(eventSourceBytes), - }, - { - Name: v1alpha1.EnvVarEventBusSubject, - Value: fmt.Sprintf("eventbus-%s", args.EventSource.Namespace), - }, - { - Name: v1alpha1.EnvVarPodName, - ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{FieldPath: "metadata.name"}}, - }, - { - Name: v1alpha1.EnvVarLeaderElection, - Value: args.EventSource.Annotations[v1alpha1.AnnotationLeaderElection], - }, - { - Name: v1alpha1.EnvVarEventBusConfig, - Value: base64.StdEncoding.EncodeToString(busConfigBytes), - }, - } - - volumes := []corev1.Volume{ - { - Name: "tmp", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}, - }, - } - - volumeMounts := []corev1.VolumeMount{ - { - Name: "tmp", - MountPath: "/tmp", - }, - } - - var secretObjs []interface{} - var accessSecret *corev1.SecretKeySelector - var caCertSecret *corev1.SecretKeySelector - var clientCertSecret *corev1.SecretKeySelector - var clientKeySecret *corev1.SecretKeySelector - switch { - case eventBus.Status.Config.NATS != nil: - caCertSecret = nil - clientCertSecret = nil - clientKeySecret = nil - accessSecret = eventBus.Status.Config.NATS.AccessSecret - secretObjs = []interface{}{eventSourceCopy} - case eventBus.Status.Config.JetStream != nil: - tlsOptions := eventBus.Status.Config.JetStream.TLS - if tlsOptions != nil { - caCertSecret = tlsOptions.CACertSecret - clientCertSecret = tlsOptions.ClientCertSecret - clientKeySecret = tlsOptions.ClientKeySecret - } - accessSecret = eventBus.Status.Config.JetStream.AccessSecret - secretObjs = []interface{}{eventSourceCopy} - case eventBus.Status.Config.Kafka != nil: - caCertSecret = nil - clientCertSecret = nil - clientKeySecret = nil - accessSecret = nil - secretObjs = []interface{}{eventSourceCopy, eventBus} // kafka requires secrets for sasl and tls - default: - return nil, fmt.Errorf("unsupported event bus") - } - - if accessSecret != nil { - // Mount the secret as volume instead of using envFrom to gain the ability - // for the sensor deployment to auto reload when the secret changes - volumes = append(volumes, corev1.Volume{ - Name: "auth-volume", - VolumeSource: corev1.VolumeSource{ - Secret: &corev1.SecretVolumeSource{ - SecretName: accessSecret.Name, - Items: []corev1.KeyToPath{ - { - Key: accessSecret.Key, - Path: "auth.yaml", - }, - }, - }, - }, - }) - volumeMounts = append(volumeMounts, corev1.VolumeMount{ - Name: "auth-volume", - MountPath: v1alpha1.EventBusAuthFileMountPath, - }) - } - - uniqueCertVolumeMap := make(map[string][]corev1.KeyToPath) - for _, secret := range []*corev1.SecretKeySelector{caCertSecret, clientCertSecret, clientKeySecret} { - if secret != nil { - uniqueCertVolumeMap[secret.Name] = append(uniqueCertVolumeMap[secret.Name], corev1.KeyToPath{ - Key: secret.Key, - Path: secret.Key, - }) - } - } - - // We deduplicate the certificate secret mounts to ensure every secret under the TLS config is only mounted once - // because the secrets MUST be mounted at /argo-events/secrets/ - // in order for util.GetTLSConfig to work without modification - for secretName, items := range uniqueCertVolumeMap { - // The names of volumes MUST be valid DNS_LABELs; as the secret names are user-supplied, - // we perform some input cleansing to ensure they conform - volumeName := sharedutil.ConvertToDNSLabel(secretName) - - optional := false - - volumes = append(volumes, corev1.Volume{ - Name: volumeName, - VolumeSource: corev1.VolumeSource{ - Secret: &corev1.SecretVolumeSource{ - SecretName: secretName, - Items: items, - Optional: &optional, - }, - }, - }) - - volumeMounts = append(volumeMounts, corev1.VolumeMount{ - Name: volumeName, - MountPath: fmt.Sprintf("/argo-events/secrets/%s", secretName), - }) - } - - // secrets - volSecrets, volSecretMounts := sharedutil.VolumesFromSecretsOrConfigMaps(v1alpha1.SecretKeySelectorType, secretObjs...) - volumes = append(volumes, volSecrets...) - volumeMounts = append(volumeMounts, volSecretMounts...) - - // config maps - volConfigMaps, volCofigMapMounts := sharedutil.VolumesFromSecretsOrConfigMaps(v1alpha1.ConfigMapKeySelectorType, eventSourceCopy) - volumeMounts = append(volumeMounts, volCofigMapMounts...) - volumes = append(volumes, volConfigMaps...) - - // Order volumes and volumemounts based on name to make the order deterministic - sort.Slice(volumes, func(i, j int) bool { - return volumes[i].Name < volumes[j].Name - }) - sort.Slice(volumeMounts, func(i, j int) bool { - return volumeMounts[i].Name < volumeMounts[j].Name - }) - - deploymentSpec.Template.Spec.Containers[0].Env = append(deploymentSpec.Template.Spec.Containers[0].Env, env...) - deploymentSpec.Template.Spec.Containers[0].VolumeMounts = append(deploymentSpec.Template.Spec.Containers[0].VolumeMounts, volumeMounts...) - deploymentSpec.Template.Spec.Volumes = append(deploymentSpec.Template.Spec.Volumes, volumes...) - - deployment := &appv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: args.EventSource.Namespace, - GenerateName: fmt.Sprintf("%s-eventsource-", args.EventSource.Name), - Labels: mergeLabels(args.EventSource.Labels, args.Labels), - }, - Spec: *deploymentSpec, - } - if err := controllerscommon.SetObjectMeta(args.EventSource, deployment, aev1.EventSourceGroupVersionKind); err != nil { - return nil, err - } - - return deployment, nil -} - -func buildDeploymentSpec(args *AdaptorArgs) (*appv1.DeploymentSpec, error) { - eventSourceContainer := corev1.Container{ - Image: args.Image, - ImagePullPolicy: sharedutil.GetImagePullPolicy(), - Args: []string{"eventsource-service"}, - Ports: []corev1.ContainerPort{ - {Name: "metrics", ContainerPort: v1alpha1.EventSourceMetricsPort}, - }, - } - if args.EventSource.Spec.Template != nil && args.EventSource.Spec.Template.Container != nil { - if err := mergo.Merge(&eventSourceContainer, args.EventSource.Spec.Template.Container, mergo.WithOverride); err != nil { - return nil, err - } - } - eventSourceContainer.Name = "main" - podTemplateLabels := make(map[string]string) - if args.EventSource.Spec.Template != nil && args.EventSource.Spec.Template.Metadata != nil && - len(args.EventSource.Spec.Template.Metadata.Labels) > 0 { - for k, v := range args.EventSource.Spec.Template.Metadata.Labels { - podTemplateLabels[k] = v - } - } - for k, v := range args.Labels { - podTemplateLabels[k] = v - } - - replicas := args.EventSource.Spec.GetReplicas() - spec := &appv1.DeploymentSpec{ - Selector: &metav1.LabelSelector{ - MatchLabels: args.Labels, - }, - Replicas: &replicas, - Template: corev1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: podTemplateLabels, - }, - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - eventSourceContainer, - }, - }, - }, - } - if args.EventSource.Spec.Template != nil { - if args.EventSource.Spec.Template.Metadata != nil { - spec.Template.SetAnnotations(args.EventSource.Spec.Template.Metadata.Annotations) - } - spec.Template.Spec.ServiceAccountName = args.EventSource.Spec.Template.ServiceAccountName - spec.Template.Spec.Volumes = args.EventSource.Spec.Template.Volumes - spec.Template.Spec.SecurityContext = args.EventSource.Spec.Template.SecurityContext - spec.Template.Spec.NodeSelector = args.EventSource.Spec.Template.NodeSelector - spec.Template.Spec.Tolerations = args.EventSource.Spec.Template.Tolerations - spec.Template.Spec.Affinity = args.EventSource.Spec.Template.Affinity - spec.Template.Spec.ImagePullSecrets = args.EventSource.Spec.Template.ImagePullSecrets - spec.Template.Spec.PriorityClassName = args.EventSource.Spec.Template.PriorityClassName - spec.Template.Spec.Priority = args.EventSource.Spec.Template.Priority - } - return spec, nil -} - -func getService(ctx context.Context, cl client.Client, args *AdaptorArgs) (*corev1.Service, error) { - sl := &corev1.ServiceList{} - err := cl.List(ctx, sl, &client.ListOptions{ - Namespace: args.EventSource.Namespace, - LabelSelector: labelSelector(args.Labels), - }) - if err != nil { - return nil, err - } - for _, svc := range sl.Items { - if metav1.IsControlledBy(&svc, args.EventSource) { - return &svc, nil - } - } - return nil, apierrors.NewNotFound(schema.GroupResource{}, "") -} - -func buildService(args *AdaptorArgs) (*corev1.Service, error) { - eventSource := args.EventSource - if eventSource.Spec.Service == nil { - return nil, nil - } - if len(eventSource.Spec.Service.Ports) == 0 { - return nil, nil - } - // Use a ports copy otherwise it will update the oririnal Ports spec in EventSource - ports := []corev1.ServicePort{} - ports = append(ports, eventSource.Spec.Service.Ports...) - - svc := &corev1.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("%s-eventsource-svc", eventSource.Name), - Namespace: eventSource.Namespace, - }, - Spec: corev1.ServiceSpec{ - Ports: ports, - Type: corev1.ServiceTypeClusterIP, - ClusterIP: eventSource.Spec.Service.ClusterIP, - Selector: args.Labels, - }, - } - - labels := mergeLabels(args.EventSource.Labels, args.Labels) - annotations := make(map[string]string) - - if args.EventSource.Spec.Service.Metadata != nil { - if args.EventSource.Spec.Service.Metadata.Labels != nil { - labels = mergeLabels(args.EventSource.Spec.Service.Metadata.Labels, labels) - } - if args.EventSource.Spec.Service.Metadata.Annotations != nil { - annotations = mergeLabels(args.EventSource.Spec.Service.Metadata.Annotations, annotations) - } - } - - svc.ObjectMeta.SetLabels(labels) - svc.ObjectMeta.SetAnnotations(annotations) - - if err := controllerscommon.SetObjectMeta(eventSource, svc, v1alpha1.EventSourceGroupVersionKind); err != nil { - return nil, err - } - return svc, nil -} - -func mergeLabels(eventBusLabels, given map[string]string) map[string]string { - result := map[string]string{} - for k, v := range eventBusLabels { - result[k] = v - } - for k, v := range given { - result[k] = v - } - return result -} - -func labelSelector(labelMap map[string]string) labels.Selector { - return labels.SelectorFromSet(labelMap) -} diff --git a/pkg/reconciler/eventsource/resource_test.go b/pkg/reconciler/eventsource/resource_test.go deleted file mode 100644 index bea3e5b210..0000000000 --- a/pkg/reconciler/eventsource/resource_test.go +++ /dev/null @@ -1,346 +0,0 @@ -package eventsource - -import ( - "context" - "fmt" - "strings" - "testing" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - "github.com/stretchr/testify/assert" - appv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/fake" - - "github.com/argoproj/argo-events/pkg/apis/events/v1alpha1" - "github.com/argoproj/argo-events/pkg/shared/logging" -) - -const ( - testImage = "test-image" -) - -var ( - testLabels = map[string]string{"controller": "test-controller"} - fakeEventBusJetstreamWithTLS = &v1alpha1.EventBus{ - TypeMeta: metav1.TypeMeta{ - APIVersion: v1alpha1.SchemeGroupVersion.String(), - Kind: "EventBus", - }, - ObjectMeta: metav1.ObjectMeta{ - Namespace: testNamespace, - Name: v1alpha1.DefaultEventBusName, - }, - Spec: v1alpha1.EventBusSpec{ - JetStream: &v1alpha1.JetStreamBus{}, - }, - Status: v1alpha1.EventBusStatus{ - Config: v1alpha1.BusConfig{ - JetStream: &v1alpha1.JetStreamConfig{ - URL: "nats://xxxx", - TLS: &v1alpha1.TLSConfig{ - CACertSecret: &corev1.SecretKeySelector{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: "secret-0", - }, - Key: "ca.crt", - }, - ClientKeySecret: &corev1.SecretKeySelector{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: "secret-1", - }, - Key: "tls.key", - }, - ClientCertSecret: &corev1.SecretKeySelector{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: "secret-1", - }, - Key: "tls.crt", - }, - }, - }, - }, - }, - } -) - -func Test_BuildDeployment(t *testing.T) { - testEventSource := fakeEmptyEventSource() - testEventSource.Spec.HDFS = fakeHDFSEventSourceMap("test") - testEventSource.Spec.Template = &v1alpha1.Template{ - ImagePullSecrets: []corev1.LocalObjectReference{ - { - Name: "test", - }, - }, - PriorityClassName: "test-class", - } - t.Run("test build HDFS", func(t *testing.T) { - args := &AdaptorArgs{ - Image: testImage, - EventSource: testEventSource, - Labels: testLabels, - } - deployment, err := buildDeployment(args, fakeEventBus) - assert.Nil(t, err) - assert.NotNil(t, deployment) - volumes := deployment.Spec.Template.Spec.Volumes - assert.True(t, len(volumes) > 0) - hasAuthVolume := false - hasTmpVolume := false - cmRefs, secretRefs := 0, 0 - for _, vol := range volumes { - if vol.Name == "auth-volume" { - hasAuthVolume = true - } - if vol.Name == "tmp" { - hasTmpVolume = true - } - if strings.Contains(vol.Name, testEventSource.Spec.HDFS["test"].KrbCCacheSecret.Name) { - secretRefs++ - } - if strings.Contains(vol.Name, testEventSource.Spec.HDFS["test"].KrbConfigConfigMap.Name) { - cmRefs++ - } - } - assert.True(t, hasAuthVolume) - assert.True(t, hasTmpVolume) - assert.True(t, len(deployment.Spec.Template.Spec.ImagePullSecrets) > 0) - assert.True(t, cmRefs > 0) - assert.True(t, secretRefs > 0) - assert.Equal(t, deployment.Spec.Template.Spec.PriorityClassName, "test-class") - }) - - t.Run("test kafka eventbus secrets attached", func(t *testing.T) { - args := &AdaptorArgs{ - Image: testImage, - EventSource: testEventSource, - Labels: testLabels, - } - - // add secrets to kafka eventbus - testBus := fakeEventBusKafka.DeepCopy() - testBus.Spec.Kafka.TLS = &v1alpha1.TLSConfig{ - CACertSecret: &corev1.SecretKeySelector{Key: "cert", LocalObjectReference: corev1.LocalObjectReference{Name: "tls-secret"}}, - } - testBus.Spec.Kafka.SASL = &v1alpha1.SASLConfig{ - Mechanism: "SCRAM-SHA-512", - UserSecret: &corev1.SecretKeySelector{Key: "username", LocalObjectReference: corev1.LocalObjectReference{Name: "sasl-secret"}}, - PasswordSecret: &corev1.SecretKeySelector{Key: "password", LocalObjectReference: corev1.LocalObjectReference{Name: "sasl-secret"}}, - } - - deployment, err := buildDeployment(args, testBus) - assert.Nil(t, err) - assert.NotNil(t, deployment) - - hasSASLSecretVolume := false - hasSASLSecretVolumeMount := false - hasTLSSecretVolume := false - hasTLSSecretVolumeMount := false - for _, volume := range deployment.Spec.Template.Spec.Volumes { - if volume.Name == "secret-sasl-secret" { - hasSASLSecretVolume = true - } - if volume.Name == "secret-tls-secret" { - hasTLSSecretVolume = true - } - } - for _, volumeMount := range deployment.Spec.Template.Spec.Containers[0].VolumeMounts { - if volumeMount.Name == "secret-sasl-secret" { - hasSASLSecretVolumeMount = true - } - if volumeMount.Name == "secret-tls-secret" { - hasTLSSecretVolumeMount = true - } - } - - assert.True(t, hasSASLSecretVolume) - assert.True(t, hasSASLSecretVolumeMount) - assert.True(t, hasTLSSecretVolume) - assert.True(t, hasTLSSecretVolumeMount) - }) - - t.Run("test jetstream eventbus secrets attached", func(t *testing.T) { - args := &AdaptorArgs{ - Image: testImage, - EventSource: testEventSource, - Labels: testLabels, - } - - deployment, err := buildDeployment(args, fakeEventBusJetstreamWithTLS.DeepCopy()) - assert.Nil(t, err) - assert.NotNil(t, deployment) - - hasCAVolume := false - hasCertVolume := false - hasCAVolumeMount := false - hasCertVolumeMount := false - for _, volume := range deployment.Spec.Template.Spec.Volumes { - if volume.Name == "secret-0" { - if hasCAVolume { - assert.Fail(t, "Secrets should be de-duplicated") - } - hasCAVolume = true - } - if volume.Name == "secret-1" { - if hasCertVolume { - assert.Fail(t, "Secrets should be de-duplicated") - } - hasCertVolume = true - } - } - for _, volumeMount := range deployment.Spec.Template.Spec.Containers[0].VolumeMounts { - if volumeMount.Name == "secret-0" { - hasCAVolumeMount = true - assert.Equal(t, volumeMount.MountPath, fmt.Sprintf("/argo-events/secrets/%s", volumeMount.Name)) - } - if volumeMount.Name == "secret-1" { - hasCertVolumeMount = true - assert.Equal(t, volumeMount.MountPath, fmt.Sprintf("/argo-events/secrets/%s", volumeMount.Name)) - } - } - - assert.True(t, hasCAVolume) - assert.True(t, hasCertVolume) - assert.True(t, hasCAVolumeMount) - assert.True(t, hasCertVolumeMount) - }) - - t.Run("test secret volume and volumemount order deterministic", func(t *testing.T) { - args := &AdaptorArgs{ - Image: testImage, - EventSource: testEventSource, - Labels: testLabels, - } - - webhooksWithSecrets := map[string]v1alpha1.WebhookEventSource{ - "webhook4": { - WebhookContext: v1alpha1.WebhookContext{ - URL: "http://a.b", - Endpoint: "/webhook4", - Port: "1234", - AuthSecret: &corev1.SecretKeySelector{ - LocalObjectReference: corev1.LocalObjectReference{Name: "webhook4"}, - Key: "secret", - }, - }, - }, - "webhook3": { - WebhookContext: v1alpha1.WebhookContext{ - URL: "http://a.b", - Endpoint: "/webhook3", - Port: "1234", - AuthSecret: &corev1.SecretKeySelector{ - LocalObjectReference: corev1.LocalObjectReference{Name: "webhook3"}, - Key: "secret", - }, - }, - }, - "webhook1": { - WebhookContext: v1alpha1.WebhookContext{ - URL: "http://a.b", - Endpoint: "/webhook1", - Port: "1234", - AuthSecret: &corev1.SecretKeySelector{ - LocalObjectReference: corev1.LocalObjectReference{Name: "webhook1"}, - Key: "secret", - }, - }, - }, - "webhook2": { - WebhookContext: v1alpha1.WebhookContext{ - URL: "http://a.b", - Endpoint: "/webhook2", - Port: "1234", - AuthSecret: &corev1.SecretKeySelector{ - LocalObjectReference: corev1.LocalObjectReference{Name: "webhook2"}, - Key: "secret", - }, - }, - }, - } - args.EventSource.Spec.Webhook = webhooksWithSecrets - - wantVolumeNames := []string{"auth-volume", "cm-test-cm", "secret-test-secret", "secret-webhook1", "secret-webhook2", "secret-webhook3", "secret-webhook4", "tmp"} - wantVolumeMountNames := []string{"auth-volume", "cm-test-cm", "secret-test-secret", "secret-webhook1", "secret-webhook2", "secret-webhook3", "secret-webhook4", "tmp"} - - deployment, err := buildDeployment(args, fakeEventBus) - assert.Nil(t, err) - assert.NotNil(t, deployment) - gotVolumes := deployment.Spec.Template.Spec.Volumes - gotVolumeMounts := deployment.Spec.Template.Spec.Containers[0].VolumeMounts - - var gotVolumeNames []string - var gotVolumeMountNames []string - - for _, v := range gotVolumes { - gotVolumeNames = append(gotVolumeNames, v.Name) - } - for _, v := range gotVolumeMounts { - gotVolumeMountNames = append(gotVolumeMountNames, v.Name) - } - - assert.Equal(t, len(gotVolumes), len(wantVolumeNames)) - assert.Equal(t, len(gotVolumeMounts), len(wantVolumeMountNames)) - - for i := range gotVolumeNames { - assert.Equal(t, gotVolumeNames[i], wantVolumeNames[i]) - } - for i := range gotVolumeMountNames { - assert.Equal(t, gotVolumeMountNames[i], wantVolumeMountNames[i]) - } - }) -} - -func TestResourceReconcile(t *testing.T) { - testEventSource := fakeEmptyEventSource() - testEventSource.Spec.HDFS = fakeHDFSEventSourceMap("test") - t.Run("test resource reconcile without eventbus", func(t *testing.T) { - cl := fake.NewClientBuilder().Build() - args := &AdaptorArgs{ - Image: testImage, - EventSource: testEventSource, - Labels: testLabels, - } - err := Reconcile(cl, args, logging.NewArgoEventsLogger()) - assert.Error(t, err) - assert.False(t, testEventSource.Status.IsReady()) - }) - - for _, eb := range []*v1alpha1.EventBus{fakeEventBus, fakeEventBusJetstream, fakeEventBusKafka} { - testBus := eb.DeepCopy() - - t.Run("test resource reconcile with eventbus", func(t *testing.T) { - ctx := context.TODO() - cl := fake.NewClientBuilder().Build() - testBus.Status.MarkDeployed("test", "test") - testBus.Status.MarkConfigured() - err := cl.Create(ctx, testBus) - assert.Nil(t, err) - args := &AdaptorArgs{ - Image: testImage, - EventSource: testEventSource, - Labels: testLabels, - } - err = Reconcile(cl, args, logging.NewArgoEventsLogger()) - assert.Nil(t, err) - assert.True(t, testEventSource.Status.IsReady()) - - deployList := &appv1.DeploymentList{} - err = cl.List(ctx, deployList, &client.ListOptions{ - Namespace: testNamespace, - }) - assert.NoError(t, err) - assert.Equal(t, 1, len(deployList.Items)) - - svcList := &corev1.ServiceList{} - err = cl.List(ctx, svcList, &client.ListOptions{ - Namespace: testNamespace, - }) - assert.NoError(t, err) - assert.Equal(t, 0, len(svcList.Items)) - }) - } -} diff --git a/pkg/reconciler/eventsource/validate.go b/pkg/reconciler/eventsource/validate.go index 59bf11e898..d753dd3eb8 100644 --- a/pkg/reconciler/eventsource/validate.go +++ b/pkg/reconciler/eventsource/validate.go @@ -33,13 +33,11 @@ func ValidateEventSource(eventSource *aev1.EventSource) error { eventNames[eName] = true } else { // Duplicated event name not allowed in one EventSource, even they are in different EventSourceType. - eventSource.Status.MarkSourcesNotProvided("InvalidEventSource", fmt.Sprintf("more than one \"%s\" found", eName)) return fmt.Errorf("more than one %q found in the spec", eName) } err := server.ValidateEventSource(ctx) if err != nil { - eventSource.Status.MarkSourcesNotProvided("InvalidEventSource", fmt.Sprintf("Invalid spec: %s - %s", server.GetEventSourceName(), server.GetEventName())) return err } } @@ -47,10 +45,8 @@ func ValidateEventSource(eventSource *aev1.EventSource) error { if rollingUpdates > 0 && recreates > 0 { // We don't allow this as if we use recreate strategy for the deployment it will have downtime - eventSource.Status.MarkSourcesNotProvided("InvalidEventSource", "Some types of event sources can not be put in one spec") return fmt.Errorf("event sources with rolling update and recreate update strategy can not be put together") } - eventSource.Status.MarkSourcesProvided() return nil } diff --git a/pkg/reconciler/sensor/controller.go b/pkg/reconciler/sensor/controller.go index a1cb3ff513..d9e16cd982 100644 --- a/pkg/reconciler/sensor/controller.go +++ b/pkg/reconciler/sensor/controller.go @@ -19,16 +19,19 @@ package sensor import ( "context" "fmt" + "strings" "go.uber.org/zap" "k8s.io/apimachinery/pkg/api/equality" apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/reconcile" + "sigs.k8s.io/yaml" "github.com/argoproj/argo-events/pkg/apis/events/v1alpha1" "github.com/argoproj/argo-events/pkg/shared/logging" @@ -61,7 +64,7 @@ func (r *reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu r.logger.Warnw("WARNING: sensor not found", "request", req) return reconcile.Result{}, nil } - r.logger.Errorw("unable to get sensor ctl", zap.Any("request", req), zap.Error(err)) + r.logger.Errorw("Unable to get sensor", zap.Any("request", req), zap.Error(err)) return ctrl.Result{}, err } log := r.logger.With("namespace", sensor.Namespace).With("sensor", sensor.Name) @@ -69,14 +72,17 @@ func (r *reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu sensorCopy := sensor.DeepCopy() reconcileErr := r.reconcile(ctx, sensorCopy) if reconcileErr != nil { - log.Errorw("reconcile error", zap.Error(reconcileErr)) + log.Errorw("Reconcile error", zap.Error(reconcileErr)) } - if r.needsUpdate(sensor, sensorCopy) { - // Use a DeepCopy to update, because it will be mutated afterwards, with empty Status. - if err := r.client.Update(ctx, sensorCopy.DeepCopy()); err != nil { - return reconcile.Result{}, err + sensorCopy.Status.LastUpdated = metav1.Now() + if !equality.Semantic.DeepEqual(sensor.Finalizers, sensorCopy.Finalizers) { + patchYaml := "metadata:\n finalizers: [" + strings.Join(sensorCopy.Finalizers, ",") + "]" + patchJson, _ := yaml.YAMLToJSON([]byte(patchYaml)) + if err := r.client.Patch(ctx, sensor, client.RawPatch(types.MergePatchType, patchJson)); err != nil { + return ctrl.Result{}, err } } + if err := r.client.Status().Update(ctx, sensorCopy); err != nil { return reconcile.Result{}, err } @@ -87,16 +93,16 @@ func (r *reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu func (r *reconciler) reconcile(ctx context.Context, sensor *v1alpha1.Sensor) error { log := logging.FromContext(ctx) if !sensor.DeletionTimestamp.IsZero() { - log.Info("deleting sensor") + log.Info("Deleting sensor") if controllerutil.ContainsFinalizer(sensor, finalizerName) { - // Finalizer logic should be added here. + // We don't add finalizer anymore, keep the removing logic for backward compatibility controllerutil.RemoveFinalizer(sensor, finalizerName) } return nil } - controllerutil.AddFinalizer(sensor, finalizerName) sensor.Status.InitConditions() + sensor.Status.SetObservedGeneration(sensor.Generation) eventBus := &v1alpha1.EventBus{} eventBusName := v1alpha1.DefaultEventBusName @@ -107,11 +113,11 @@ func (r *reconciler) reconcile(ctx context.Context, sensor *v1alpha1.Sensor) err if err != nil { if apierrors.IsNotFound(err) { sensor.Status.MarkDeployFailed("EventBusNotFound", "EventBus not found.") - log.Errorw("EventBus not found", "eventBusName", eventBusName, "error", err) + log.Errorw("EventBus not found", "eventBusName", eventBusName, zap.Error(err)) return fmt.Errorf("eventbus %s not found", eventBusName) } sensor.Status.MarkDeployFailed("GetEventBusFailed", "Failed to get EventBus.") - log.Errorw("failed to get EventBus", "eventBusName", eventBusName, "error", err) + log.Errorw("failed to get EventBus", "eventBusName", eventBusName, zap.Error(err)) return err } @@ -130,13 +136,3 @@ func (r *reconciler) reconcile(ctx context.Context, sensor *v1alpha1.Sensor) err } return Reconcile(r.client, eventBus, args, log) } - -func (r *reconciler) needsUpdate(old, new *v1alpha1.Sensor) bool { - if old == nil { - return true - } - if !equality.Semantic.DeepEqual(old.Finalizers, new.Finalizers) { - return true - } - return false -} diff --git a/pkg/reconciler/sensor/validate.go b/pkg/reconciler/sensor/validate.go index 18d93c9a41..c89662d25a 100644 --- a/pkg/reconciler/sensor/validate.go +++ b/pkg/reconciler/sensor/validate.go @@ -35,21 +35,13 @@ func ValidateSensor(s *v1alpha1.Sensor, b *v1alpha1.EventBus) error { if s == nil { return fmt.Errorf("nil sensor") } - if b == nil { - s.Status.MarkDependenciesNotProvided("InvalidEventBus", "nil eventbus") - return fmt.Errorf("nil eventbus") - } if err := validateDependencies(s.Spec.Dependencies, b); err != nil { - s.Status.MarkDependenciesNotProvided("InvalidDependencies", err.Error()) - return err + return fmt.Errorf("invalid dependencies, %w", err) } - s.Status.MarkDependenciesProvided() err := validateTriggers(s.Spec.Triggers) if err != nil { - s.Status.MarkTriggersNotProvided("InvalidTriggers", err.Error()) - return err + return fmt.Errorf("invalid triggers, %w", err) } - s.Status.MarkTriggersProvided() return nil }