From 01b118dff1ae4b0de63afb1079d0dac0181856e1 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Tue, 10 Dec 2024 23:53:06 +0100 Subject: [PATCH 01/38] feat(api): add `PromotionTask` kind Signed-off-by: Hidde Beydals --- api/v1alpha1/promotion_task_types.go | 63 ++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 api/v1alpha1/promotion_task_types.go diff --git a/api/v1alpha1/promotion_task_types.go b/api/v1alpha1/promotion_task_types.go new file mode 100644 index 000000000..8e2b79029 --- /dev/null +++ b/api/v1alpha1/promotion_task_types.go @@ -0,0 +1,63 @@ +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +kubebuilder:resource:shortName={promotask,promotasks} +// +kubebuilder:object:root=true +// +kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp` + +type PromotionTask struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Spec describes the composition of a PromotionTask, including the inputs + // available to the task and the steps. + // + // +kubebuilder:validation:Required + Spec PromotionTaskSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"` +} + +type PromotionTaskSpec struct { + // Inputs specifies the inputs available to the PromotionTask. These inputs + // can be specified in the PromotionTemplate as configuration for the task, + // and can be used in the Steps to parameterize the execution of the task. + Inputs []PromotionTaskInput `json:"inputs,omitempty" protobuf:"bytes,1,rep,name=inputs"` + // Steps specifies the directives to be executed as part of this + // PromotionTask. The steps as defined here are deflated into a + // Promotion when it is built from a PromotionTemplate. + // + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinItems=1 + Steps []PromotionStep `json:"steps,omitempty" protobuf:"bytes,2,rep,name=steps"` +} + +// PromotionTaskInput defines an input parameter for a PromotionTask. This input +// can be specified in the PromotionTemplate as configuration for the task, and +// can be used in the Steps to parameterize the execution of the task. +type PromotionTaskInput struct { + // Name of the configuration parameter, which should be unique within the + // PromotionTask. This name can be used to reference the parameter in the + // PromotionTaskSpec.Steps. + // + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + Name string `json:"name" protobuf:"bytes,1,opt,name=name"` + // Default specifies a default value for the parameter. This value will be + // used if the parameter is not specified in the PromotionTemplate. + // If left unspecified, the input value is required to be specified in the + // configuration of the step referencing this task. + // + // +kubebuilder:validation:Optional + Default string `json:"default,omitempty" protobuf:"bytes,2,opt,name=default"` +} + +// +kubebuilder:object:root=true + +// PromotionTaskList contains a list of PromotionTasks. +type PromotionTaskList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + Items []PromotionTaskList `json:"items" protobuf:"bytes,2,rep,name=items"` +} From c4ec253232c9affb621e54a560073e9abf31af08 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Wed, 11 Dec 2024 00:01:12 +0100 Subject: [PATCH 02/38] chore: run codegen Signed-off-by: Hidde Beydals --- api/v1alpha1/generated.pb.go | 1412 ++++++++++++++--- api/v1alpha1/generated.proto | 53 + api/v1alpha1/zz_generated.deepcopy.go | 100 ++ .../crds/kargo.akuity.io_promotiontasks.yaml | 160 ++ ...omotiontasks.kargo.akuity.io_v1alpha1.json | 95 ++ ui/src/gen/v1alpha1/generated_pb.ts | 158 +- 6 files changed, 1697 insertions(+), 281 deletions(-) create mode 100644 charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml create mode 100644 ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json diff --git a/api/v1alpha1/generated.pb.go b/api/v1alpha1/generated.pb.go index ab5ab173a..2c2b55695 100644 --- a/api/v1alpha1/generated.pb.go +++ b/api/v1alpha1/generated.pb.go @@ -1234,10 +1234,122 @@ func (m *PromotionStepRetry) XXX_DiscardUnknown() { var xxx_messageInfo_PromotionStepRetry proto.InternalMessageInfo +func (m *PromotionTask) Reset() { *m = PromotionTask{} } +func (*PromotionTask) ProtoMessage() {} +func (*PromotionTask) Descriptor() ([]byte, []int) { + return fileDescriptor_e26b7f7bbc391025, []int{43} +} +func (m *PromotionTask) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PromotionTask) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PromotionTask) XXX_Merge(src proto.Message) { + xxx_messageInfo_PromotionTask.Merge(m, src) +} +func (m *PromotionTask) XXX_Size() int { + return m.Size() +} +func (m *PromotionTask) XXX_DiscardUnknown() { + xxx_messageInfo_PromotionTask.DiscardUnknown(m) +} + +var xxx_messageInfo_PromotionTask proto.InternalMessageInfo + +func (m *PromotionTaskInput) Reset() { *m = PromotionTaskInput{} } +func (*PromotionTaskInput) ProtoMessage() {} +func (*PromotionTaskInput) Descriptor() ([]byte, []int) { + return fileDescriptor_e26b7f7bbc391025, []int{44} +} +func (m *PromotionTaskInput) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PromotionTaskInput) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PromotionTaskInput) XXX_Merge(src proto.Message) { + xxx_messageInfo_PromotionTaskInput.Merge(m, src) +} +func (m *PromotionTaskInput) XXX_Size() int { + return m.Size() +} +func (m *PromotionTaskInput) XXX_DiscardUnknown() { + xxx_messageInfo_PromotionTaskInput.DiscardUnknown(m) +} + +var xxx_messageInfo_PromotionTaskInput proto.InternalMessageInfo + +func (m *PromotionTaskList) Reset() { *m = PromotionTaskList{} } +func (*PromotionTaskList) ProtoMessage() {} +func (*PromotionTaskList) Descriptor() ([]byte, []int) { + return fileDescriptor_e26b7f7bbc391025, []int{45} +} +func (m *PromotionTaskList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PromotionTaskList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PromotionTaskList) XXX_Merge(src proto.Message) { + xxx_messageInfo_PromotionTaskList.Merge(m, src) +} +func (m *PromotionTaskList) XXX_Size() int { + return m.Size() +} +func (m *PromotionTaskList) XXX_DiscardUnknown() { + xxx_messageInfo_PromotionTaskList.DiscardUnknown(m) +} + +var xxx_messageInfo_PromotionTaskList proto.InternalMessageInfo + +func (m *PromotionTaskSpec) Reset() { *m = PromotionTaskSpec{} } +func (*PromotionTaskSpec) ProtoMessage() {} +func (*PromotionTaskSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_e26b7f7bbc391025, []int{46} +} +func (m *PromotionTaskSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PromotionTaskSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PromotionTaskSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_PromotionTaskSpec.Merge(m, src) +} +func (m *PromotionTaskSpec) XXX_Size() int { + return m.Size() +} +func (m *PromotionTaskSpec) XXX_DiscardUnknown() { + xxx_messageInfo_PromotionTaskSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_PromotionTaskSpec proto.InternalMessageInfo + func (m *PromotionTemplate) Reset() { *m = PromotionTemplate{} } func (*PromotionTemplate) ProtoMessage() {} func (*PromotionTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{43} + return fileDescriptor_e26b7f7bbc391025, []int{47} } func (m *PromotionTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1265,7 +1377,7 @@ var xxx_messageInfo_PromotionTemplate proto.InternalMessageInfo func (m *PromotionTemplateSpec) Reset() { *m = PromotionTemplateSpec{} } func (*PromotionTemplateSpec) ProtoMessage() {} func (*PromotionTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{44} + return fileDescriptor_e26b7f7bbc391025, []int{48} } func (m *PromotionTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1293,7 +1405,7 @@ var xxx_messageInfo_PromotionTemplateSpec proto.InternalMessageInfo func (m *PromotionVariable) Reset() { *m = PromotionVariable{} } func (*PromotionVariable) ProtoMessage() {} func (*PromotionVariable) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{45} + return fileDescriptor_e26b7f7bbc391025, []int{49} } func (m *PromotionVariable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1321,7 +1433,7 @@ var xxx_messageInfo_PromotionVariable proto.InternalMessageInfo func (m *RepoSubscription) Reset() { *m = RepoSubscription{} } func (*RepoSubscription) ProtoMessage() {} func (*RepoSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{46} + return fileDescriptor_e26b7f7bbc391025, []int{50} } func (m *RepoSubscription) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1349,7 +1461,7 @@ var xxx_messageInfo_RepoSubscription proto.InternalMessageInfo func (m *Stage) Reset() { *m = Stage{} } func (*Stage) ProtoMessage() {} func (*Stage) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{47} + return fileDescriptor_e26b7f7bbc391025, []int{51} } func (m *Stage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1377,7 +1489,7 @@ var xxx_messageInfo_Stage proto.InternalMessageInfo func (m *StageList) Reset() { *m = StageList{} } func (*StageList) ProtoMessage() {} func (*StageList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{48} + return fileDescriptor_e26b7f7bbc391025, []int{52} } func (m *StageList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1405,7 +1517,7 @@ var xxx_messageInfo_StageList proto.InternalMessageInfo func (m *StageSpec) Reset() { *m = StageSpec{} } func (*StageSpec) ProtoMessage() {} func (*StageSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{49} + return fileDescriptor_e26b7f7bbc391025, []int{53} } func (m *StageSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1433,7 +1545,7 @@ var xxx_messageInfo_StageSpec proto.InternalMessageInfo func (m *StageStatus) Reset() { *m = StageStatus{} } func (*StageStatus) ProtoMessage() {} func (*StageStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{50} + return fileDescriptor_e26b7f7bbc391025, []int{54} } func (m *StageStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1461,7 +1573,7 @@ var xxx_messageInfo_StageStatus proto.InternalMessageInfo func (m *StepExecutionMetadata) Reset() { *m = StepExecutionMetadata{} } func (*StepExecutionMetadata) ProtoMessage() {} func (*StepExecutionMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{51} + return fileDescriptor_e26b7f7bbc391025, []int{55} } func (m *StepExecutionMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1489,7 +1601,7 @@ var xxx_messageInfo_StepExecutionMetadata proto.InternalMessageInfo func (m *Verification) Reset() { *m = Verification{} } func (*Verification) ProtoMessage() {} func (*Verification) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{52} + return fileDescriptor_e26b7f7bbc391025, []int{56} } func (m *Verification) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1517,7 +1629,7 @@ var xxx_messageInfo_Verification proto.InternalMessageInfo func (m *VerificationInfo) Reset() { *m = VerificationInfo{} } func (*VerificationInfo) ProtoMessage() {} func (*VerificationInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{53} + return fileDescriptor_e26b7f7bbc391025, []int{57} } func (m *VerificationInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1545,7 +1657,7 @@ var xxx_messageInfo_VerificationInfo proto.InternalMessageInfo func (m *VerifiedStage) Reset() { *m = VerifiedStage{} } func (*VerifiedStage) ProtoMessage() {} func (*VerifiedStage) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{54} + return fileDescriptor_e26b7f7bbc391025, []int{58} } func (m *VerifiedStage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1573,7 +1685,7 @@ var xxx_messageInfo_VerifiedStage proto.InternalMessageInfo func (m *Warehouse) Reset() { *m = Warehouse{} } func (*Warehouse) ProtoMessage() {} func (*Warehouse) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{55} + return fileDescriptor_e26b7f7bbc391025, []int{59} } func (m *Warehouse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1601,7 +1713,7 @@ var xxx_messageInfo_Warehouse proto.InternalMessageInfo func (m *WarehouseList) Reset() { *m = WarehouseList{} } func (*WarehouseList) ProtoMessage() {} func (*WarehouseList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{56} + return fileDescriptor_e26b7f7bbc391025, []int{60} } func (m *WarehouseList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1629,7 +1741,7 @@ var xxx_messageInfo_WarehouseList proto.InternalMessageInfo func (m *WarehouseSpec) Reset() { *m = WarehouseSpec{} } func (*WarehouseSpec) ProtoMessage() {} func (*WarehouseSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{57} + return fileDescriptor_e26b7f7bbc391025, []int{61} } func (m *WarehouseSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1657,7 +1769,7 @@ var xxx_messageInfo_WarehouseSpec proto.InternalMessageInfo func (m *WarehouseStatus) Reset() { *m = WarehouseStatus{} } func (*WarehouseStatus) ProtoMessage() {} func (*WarehouseStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{58} + return fileDescriptor_e26b7f7bbc391025, []int{62} } func (m *WarehouseStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1732,6 +1844,10 @@ func init() { proto.RegisterType((*PromotionStatus)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStatus") proto.RegisterType((*PromotionStep)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStep") proto.RegisterType((*PromotionStepRetry)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStepRetry") + proto.RegisterType((*PromotionTask)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTask") + proto.RegisterType((*PromotionTaskInput)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTaskInput") + proto.RegisterType((*PromotionTaskList)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTaskList") + proto.RegisterType((*PromotionTaskSpec)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTaskSpec") proto.RegisterType((*PromotionTemplate)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTemplate") proto.RegisterType((*PromotionTemplateSpec)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTemplateSpec") proto.RegisterType((*PromotionVariable)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionVariable") @@ -1755,253 +1871,259 @@ func init() { } var fileDescriptor_e26b7f7bbc391025 = []byte{ - // 3936 bytes of a gzipped FileDescriptorProto + // 4032 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0xcd, 0x6f, 0x23, 0x47, - 0x76, 0x9f, 0x26, 0x45, 0x4a, 0x7c, 0x94, 0x46, 0x52, 0x8d, 0xc6, 0xd6, 0x6a, 0x63, 0x69, 0xd2, - 0x6b, 0x18, 0x76, 0x6c, 0x53, 0x99, 0xb1, 0xc7, 0x33, 0x1e, 0x27, 0x13, 0x90, 0xd4, 0x7c, 0x68, - 0x56, 0xeb, 0x51, 0x8a, 0xe3, 0xf1, 0xee, 0xd8, 0x86, 0xd3, 0x22, 0x4b, 0x64, 0xaf, 0xc8, 0x6e, - 0xba, 0xaa, 0xa8, 0xb5, 0x92, 0x20, 0xd9, 0x7c, 0x01, 0x8b, 0x7c, 0x61, 0x0f, 0x06, 0xbc, 0x01, - 0x12, 0x20, 0x48, 0x8e, 0x8b, 0xe4, 0x1f, 0xc8, 0xc1, 0x87, 0x5c, 0x8c, 0x60, 0x11, 0x18, 0x49, - 0x80, 0xf8, 0xb0, 0x50, 0x62, 0x19, 0xc8, 0x31, 0xb7, 0x5c, 0x06, 0x08, 0x10, 0xd4, 0x47, 0x77, - 0x57, 0x37, 0x9b, 0x23, 0x36, 0x47, 0x1a, 0x0c, 0x72, 0xa3, 0xea, 0xd5, 0xfb, 0xbd, 0xaa, 0x57, - 0xf5, 0x5e, 0xbd, 0xf7, 0xaa, 0x5a, 0xf0, 0x7a, 0xdb, 0xe5, 0x9d, 0xc1, 0x4e, 0xa5, 0xe9, 0xf7, - 0xd6, 0x9d, 0xbd, 0x81, 0xcb, 0x0f, 0xd6, 0xf7, 0x1c, 0xda, 0xf6, 0xd7, 0x9d, 0xbe, 0xbb, 0xbe, - 0x7f, 0xd1, 0xe9, 0xf6, 0x3b, 0xce, 0xc5, 0xf5, 0x36, 0xf1, 0x08, 0x75, 0x38, 0x69, 0x55, 0xfa, - 0xd4, 0xe7, 0x3e, 0x7a, 0x3e, 0xe2, 0xaa, 0x28, 0xae, 0x8a, 0xe4, 0xaa, 0x38, 0x7d, 0xb7, 0x12, - 0x70, 0xad, 0xbc, 0x6a, 0x60, 0xb7, 0xfd, 0xb6, 0xbf, 0x2e, 0x99, 0x77, 0x06, 0xbb, 0xf2, 0x2f, - 0xf9, 0x87, 0xfc, 0xa5, 0x40, 0x57, 0x6e, 0xef, 0x5d, 0x65, 0x15, 0x57, 0x4a, 0x26, 0x1f, 0x73, - 0xe2, 0x31, 0xd7, 0xf7, 0xd8, 0xab, 0x4e, 0xdf, 0x65, 0x84, 0xee, 0x13, 0xba, 0xde, 0xdf, 0x6b, - 0x0b, 0x1a, 0x8b, 0x77, 0x58, 0xdf, 0x1f, 0x1a, 0xde, 0xca, 0xeb, 0x11, 0x52, 0xcf, 0x69, 0x76, - 0x5c, 0x8f, 0xd0, 0x83, 0x88, 0xbd, 0x47, 0xb8, 0x93, 0xc6, 0xb5, 0x3e, 0x8a, 0x8b, 0x0e, 0x3c, - 0xee, 0xf6, 0xc8, 0x10, 0xc3, 0x1b, 0xc7, 0x31, 0xb0, 0x66, 0x87, 0xf4, 0x9c, 0x24, 0x9f, 0xfd, - 0x3e, 0x9c, 0xab, 0x7a, 0x4e, 0xf7, 0x80, 0xb9, 0x0c, 0x0f, 0xbc, 0x2a, 0x6d, 0x0f, 0x7a, 0xc4, - 0xe3, 0xe8, 0x02, 0x4c, 0x79, 0x4e, 0x8f, 0x2c, 0x5b, 0x17, 0xac, 0x17, 0x4b, 0xb5, 0xd9, 0xcf, - 0x0f, 0xd7, 0xce, 0x1c, 0x1d, 0xae, 0x4d, 0xbd, 0xed, 0xf4, 0x08, 0x96, 0x14, 0xf4, 0x2d, 0x28, - 0xec, 0x3b, 0xdd, 0x01, 0x59, 0xce, 0xc9, 0x2e, 0x73, 0xba, 0x4b, 0xe1, 0xbe, 0x68, 0xc4, 0x8a, - 0x66, 0xff, 0x41, 0x3e, 0x06, 0xff, 0x1d, 0xc2, 0x9d, 0x96, 0xc3, 0x1d, 0xd4, 0x83, 0x62, 0xd7, - 0xd9, 0x21, 0x5d, 0xb6, 0x6c, 0x5d, 0xc8, 0xbf, 0x58, 0xbe, 0x74, 0xa3, 0x32, 0xce, 0x22, 0x56, - 0x52, 0xa0, 0x2a, 0x5b, 0x12, 0xe7, 0x86, 0xc7, 0xe9, 0x41, 0xed, 0xac, 0x1e, 0x44, 0x51, 0x35, - 0x62, 0x2d, 0x04, 0xfd, 0x9e, 0x05, 0x65, 0xc7, 0xf3, 0x7c, 0xee, 0x70, 0xb1, 0x4c, 0xcb, 0x39, - 0x29, 0xf4, 0xce, 0xe4, 0x42, 0xab, 0x11, 0x98, 0x92, 0x7c, 0x4e, 0x4b, 0x2e, 0x1b, 0x14, 0x6c, - 0xca, 0x5c, 0x79, 0x13, 0xca, 0xc6, 0x50, 0xd1, 0x02, 0xe4, 0xf7, 0xc8, 0x81, 0xd2, 0x2f, 0x16, - 0x3f, 0xd1, 0x52, 0x4c, 0xa1, 0x5a, 0x83, 0xd7, 0x72, 0x57, 0xad, 0x95, 0xeb, 0xb0, 0x90, 0x14, - 0x98, 0x85, 0xdf, 0xfe, 0x73, 0x0b, 0x96, 0x8c, 0x59, 0x60, 0xb2, 0x4b, 0x28, 0xf1, 0x9a, 0x04, - 0xad, 0x43, 0x49, 0xac, 0x25, 0xeb, 0x3b, 0xcd, 0x60, 0xa9, 0x17, 0xf5, 0x44, 0x4a, 0x6f, 0x07, - 0x04, 0x1c, 0xf5, 0x09, 0xb7, 0x45, 0xee, 0x51, 0xdb, 0xa2, 0xdf, 0x71, 0x18, 0x59, 0xce, 0xc7, - 0xb7, 0xc5, 0xb6, 0x68, 0xc4, 0x8a, 0x66, 0xff, 0x2a, 0x7c, 0x23, 0x18, 0xcf, 0x3d, 0xd2, 0xeb, - 0x77, 0x1d, 0x4e, 0xa2, 0x41, 0x1d, 0xbb, 0xf5, 0xec, 0x3d, 0x98, 0xab, 0xf6, 0xfb, 0xd4, 0xdf, - 0x27, 0xad, 0x06, 0x77, 0xda, 0x04, 0x3d, 0x00, 0x70, 0x74, 0x43, 0x95, 0x4b, 0xc6, 0xf2, 0xa5, - 0x5f, 0xaa, 0x28, 0x8b, 0xa8, 0x98, 0x16, 0x51, 0xe9, 0xef, 0xb5, 0x45, 0x03, 0xab, 0x08, 0xc3, - 0xab, 0xec, 0x5f, 0xac, 0xdc, 0x73, 0x7b, 0xa4, 0x76, 0xf6, 0xe8, 0x70, 0x0d, 0xaa, 0x21, 0x02, - 0x36, 0xd0, 0xec, 0xdf, 0xb7, 0xe0, 0x7c, 0x95, 0xb6, 0xfd, 0xfa, 0x46, 0xb5, 0xdf, 0xbf, 0x4d, - 0x9c, 0x2e, 0xef, 0x34, 0xb8, 0xc3, 0x07, 0x0c, 0x5d, 0x87, 0x22, 0x93, 0xbf, 0xf4, 0x50, 0x5f, - 0x08, 0x76, 0x9f, 0xa2, 0x3f, 0x3c, 0x5c, 0x5b, 0x4a, 0x61, 0x24, 0x58, 0x73, 0xa1, 0x97, 0x60, - 0xba, 0x47, 0x18, 0x73, 0xda, 0x81, 0x3e, 0xe7, 0x35, 0xc0, 0xf4, 0x77, 0x54, 0x33, 0x0e, 0xe8, - 0xf6, 0x3f, 0xe5, 0x60, 0x3e, 0xc4, 0xd2, 0xe2, 0x4f, 0x61, 0xf1, 0x06, 0x30, 0xdb, 0x31, 0x66, - 0x28, 0xd7, 0xb0, 0x7c, 0xe9, 0xad, 0x31, 0xed, 0x24, 0x4d, 0x49, 0xb5, 0x25, 0x2d, 0x66, 0xd6, - 0x6c, 0xc5, 0x31, 0x31, 0xa8, 0x07, 0xc0, 0x0e, 0xbc, 0xa6, 0x16, 0x3a, 0x25, 0x85, 0xbe, 0x99, - 0x51, 0x68, 0x23, 0x04, 0xa8, 0x21, 0x2d, 0x12, 0xa2, 0x36, 0x6c, 0x08, 0xb0, 0xff, 0xde, 0x82, - 0x73, 0x29, 0x7c, 0xe8, 0x57, 0x12, 0xeb, 0xf9, 0xfc, 0xd0, 0x7a, 0xa2, 0x21, 0xb6, 0x68, 0x35, - 0x5f, 0x81, 0x19, 0x4a, 0xf6, 0x5d, 0x71, 0x0e, 0x68, 0x0d, 0x2f, 0x68, 0xfe, 0x19, 0xac, 0xdb, - 0x71, 0xd8, 0x03, 0xbd, 0x0c, 0xa5, 0xe0, 0xb7, 0x50, 0x73, 0x5e, 0x98, 0x8a, 0x58, 0xb8, 0xa0, - 0x2b, 0xc3, 0x11, 0xdd, 0xfe, 0x5d, 0x28, 0xd4, 0x3b, 0x0e, 0xe5, 0x62, 0xc7, 0x50, 0xd2, 0xf7, - 0xdf, 0xc1, 0x5b, 0x7a, 0x88, 0xe1, 0x8e, 0xc1, 0xaa, 0x19, 0x07, 0xf4, 0x31, 0x16, 0xfb, 0x25, - 0x98, 0xde, 0x27, 0x54, 0x8e, 0x37, 0x1f, 0x07, 0xbb, 0xaf, 0x9a, 0x71, 0x40, 0xb7, 0xff, 0xd5, - 0x82, 0x25, 0x39, 0x82, 0x0d, 0x97, 0x35, 0xfd, 0x7d, 0x42, 0x0f, 0x30, 0x61, 0x83, 0xee, 0x09, - 0x0f, 0x68, 0x03, 0x16, 0x18, 0xe9, 0xed, 0x13, 0x5a, 0xf7, 0x3d, 0xc6, 0xa9, 0xe3, 0x7a, 0x5c, - 0x8f, 0x6c, 0x59, 0xf7, 0x5e, 0x68, 0x24, 0xe8, 0x78, 0x88, 0x03, 0xbd, 0x08, 0x33, 0x7a, 0xd8, - 0x62, 0x2b, 0x09, 0xc5, 0xce, 0x8a, 0x35, 0xd0, 0x73, 0x62, 0x38, 0xa4, 0xda, 0xff, 0x65, 0xc1, - 0xa2, 0x9c, 0x55, 0x63, 0xb0, 0xc3, 0x9a, 0xd4, 0xed, 0x0b, 0xf7, 0xfa, 0x34, 0x4e, 0xe9, 0x3a, - 0x9c, 0x6d, 0x05, 0x8a, 0xdf, 0x72, 0x7b, 0x2e, 0x97, 0x36, 0x52, 0xa8, 0x3d, 0xa3, 0x31, 0xce, - 0x6e, 0xc4, 0xa8, 0x38, 0xd1, 0xdb, 0x7e, 0x0f, 0x66, 0xeb, 0x03, 0x4a, 0x89, 0xc7, 0x95, 0xbb, - 0xfc, 0x36, 0x14, 0x98, 0xeb, 0x69, 0xaf, 0x91, 0xcd, 0x53, 0x96, 0x84, 0x2f, 0x6f, 0x08, 0x66, - 0xac, 0x30, 0xec, 0xbf, 0xcc, 0xc3, 0xb9, 0x40, 0x3e, 0x69, 0x55, 0x29, 0x77, 0x77, 0x9d, 0x26, - 0x67, 0xa8, 0x05, 0xb3, 0xad, 0xa8, 0x99, 0x6b, 0xb3, 0xce, 0x22, 0x2b, 0x74, 0x1d, 0x06, 0x3c, - 0xc7, 0x31, 0x54, 0xf4, 0x2e, 0xe4, 0xdb, 0x2e, 0xd7, 0x51, 0xc4, 0xd5, 0xf1, 0x7c, 0xc6, 0x2d, - 0x37, 0xb9, 0x8f, 0x6b, 0x65, 0x2d, 0x2a, 0x7f, 0xcb, 0xe5, 0x58, 0x20, 0xa2, 0x1d, 0x28, 0xba, - 0x3d, 0xa7, 0x4d, 0x82, 0x60, 0xe1, 0xda, 0x78, 0xd8, 0x9b, 0x82, 0x27, 0x89, 0x1e, 0x86, 0x25, - 0x92, 0xca, 0xb0, 0x46, 0x16, 0x32, 0x9a, 0x62, 0xff, 0x29, 0x0f, 0x30, 0xb6, 0x8c, 0x34, 0x4b, - 0x8c, 0x64, 0x48, 0x2a, 0xc3, 0x1a, 0xd9, 0xfe, 0x32, 0x07, 0x0b, 0x91, 0xfe, 0xea, 0x7e, 0xaf, - 0xe7, 0x72, 0xb4, 0x02, 0x39, 0xb7, 0xa5, 0xb7, 0x37, 0x68, 0xc6, 0xdc, 0xe6, 0x06, 0xce, 0xb9, - 0x2d, 0xf4, 0x02, 0x14, 0x77, 0xa8, 0xe3, 0x35, 0x3b, 0x7a, 0x5b, 0x87, 0xc0, 0x35, 0xd9, 0x8a, - 0x35, 0x15, 0x3d, 0x07, 0x79, 0xee, 0xb4, 0xf5, 0x6e, 0x0e, 0xf5, 0x77, 0xcf, 0x69, 0x63, 0xd1, - 0x2e, 0xcc, 0x88, 0x0d, 0x76, 0xbe, 0x4f, 0x9a, 0x6a, 0xe5, 0x0d, 0x33, 0x6a, 0xa8, 0x66, 0x1c, - 0xd0, 0x85, 0x44, 0x67, 0xc0, 0x3b, 0x3e, 0x5d, 0x2e, 0xc4, 0x25, 0x56, 0x65, 0x2b, 0xd6, 0x54, - 0x71, 0xe0, 0x35, 0xe5, 0xf8, 0x39, 0xa1, 0xcb, 0xc5, 0xf8, 0x81, 0x57, 0x0f, 0x08, 0x38, 0xea, - 0x83, 0x3e, 0x80, 0x72, 0x93, 0x12, 0x87, 0xfb, 0x74, 0xc3, 0xe1, 0x64, 0x79, 0x3a, 0xf3, 0x0e, - 0x9c, 0x17, 0x11, 0x5d, 0x3d, 0x82, 0xc0, 0x26, 0x9e, 0xfd, 0xdf, 0x16, 0x2c, 0x47, 0xaa, 0x95, - 0x6b, 0x1b, 0x45, 0x31, 0x5a, 0x3d, 0xd6, 0x08, 0xf5, 0xbc, 0x00, 0xc5, 0x96, 0xdb, 0x26, 0x8c, - 0x27, 0xb5, 0xbc, 0x21, 0x5b, 0xb1, 0xa6, 0xa2, 0x4b, 0x00, 0x6d, 0x97, 0x6b, 0xcf, 0xa3, 0x95, - 0x1d, 0x9e, 0x6f, 0xb7, 0x42, 0x0a, 0x36, 0x7a, 0xa1, 0x77, 0xa1, 0x24, 0x87, 0x39, 0xa1, 0xd9, - 0xc9, 0x73, 0xa8, 0x1e, 0x00, 0xe0, 0x08, 0xcb, 0xfe, 0x62, 0x0a, 0xa6, 0x6f, 0x52, 0xe2, 0xb6, - 0x3b, 0x1c, 0xfd, 0x06, 0xcc, 0xf4, 0x74, 0x34, 0xac, 0xdd, 0xc8, 0x2f, 0x8f, 0x27, 0xe3, 0xae, - 0x5c, 0x74, 0x11, 0x49, 0x47, 0x13, 0x89, 0xda, 0x70, 0x88, 0x2a, 0x22, 0x49, 0xa7, 0xeb, 0x3a, - 0x4c, 0xae, 0x9b, 0x11, 0x49, 0x56, 0x45, 0x23, 0x56, 0x34, 0xf4, 0x1e, 0x14, 0x7d, 0xea, 0xb6, - 0x5d, 0x6f, 0xb9, 0x24, 0x07, 0xf1, 0xda, 0x78, 0x26, 0xa4, 0x67, 0x71, 0x57, 0xb2, 0x46, 0xca, - 0x57, 0x7f, 0x63, 0x0d, 0x89, 0x1e, 0xc0, 0xb4, 0xda, 0x4c, 0x81, 0x81, 0xae, 0x8f, 0xed, 0x60, - 0xd4, 0x7e, 0x8c, 0x36, 0xbd, 0xfa, 0x9b, 0xe1, 0x00, 0x10, 0x35, 0x42, 0xff, 0x32, 0x25, 0xa1, - 0x5f, 0xce, 0xe0, 0x5f, 0x46, 0x3a, 0x94, 0x46, 0xe8, 0x50, 0x0a, 0x59, 0x40, 0xa5, 0xcb, 0x18, - 0xe5, 0x41, 0x84, 0x8a, 0x75, 0x58, 0x54, 0x9c, 0x40, 0xc5, 0x3a, 0x26, 0x3b, 0x1b, 0x8f, 0xa5, - 0x82, 0xa8, 0xc9, 0xfe, 0x24, 0x0f, 0x8b, 0xba, 0x67, 0xdd, 0xef, 0x76, 0x49, 0x53, 0x9e, 0xc1, - 0xca, 0x3f, 0xe5, 0x53, 0xfd, 0x93, 0x0b, 0x05, 0x97, 0x93, 0x5e, 0x90, 0x39, 0xd6, 0x32, 0x8d, - 0x26, 0x92, 0x51, 0xd9, 0x14, 0x20, 0x2a, 0x79, 0x0b, 0x57, 0x49, 0xf7, 0xc2, 0x4a, 0x02, 0xfa, - 0x23, 0x0b, 0xce, 0xed, 0x13, 0xea, 0xee, 0xba, 0x4d, 0x99, 0x7a, 0xdd, 0x76, 0x19, 0xf7, 0xe9, - 0x81, 0x3e, 0x11, 0xde, 0x18, 0x4f, 0xf2, 0x7d, 0x03, 0x60, 0xd3, 0xdb, 0xf5, 0x6b, 0xdf, 0xd4, - 0xd2, 0xce, 0xdd, 0x1f, 0x86, 0xc6, 0x69, 0xf2, 0x56, 0xfa, 0x00, 0xd1, 0x68, 0x53, 0x32, 0xbf, - 0x2d, 0x33, 0xf3, 0x1b, 0x7b, 0x60, 0xc1, 0x64, 0x03, 0x97, 0x65, 0x66, 0x8c, 0x9f, 0x59, 0x50, - 0xd6, 0xf4, 0x2d, 0x97, 0x71, 0xf4, 0xfe, 0x90, 0xb5, 0x57, 0xc6, 0xb3, 0x76, 0xc1, 0x2d, 0x6d, - 0x3d, 0x0c, 0x86, 0x83, 0x16, 0xc3, 0xd2, 0x71, 0xb0, 0xa4, 0x4a, 0xb1, 0xaf, 0x66, 0x1a, 0x7f, - 0xe4, 0x18, 0xa4, 0x8e, 0xf4, 0xda, 0xd9, 0x14, 0xe6, 0x62, 0x46, 0x8e, 0x2e, 0xc3, 0xd4, 0x9e, - 0xeb, 0x05, 0xa7, 0xde, 0x2f, 0x06, 0xc1, 0xda, 0xb7, 0x5d, 0xaf, 0xf5, 0xf0, 0x70, 0x6d, 0x31, - 0xd6, 0x59, 0x34, 0x62, 0xd9, 0xfd, 0xf8, 0x18, 0xef, 0xda, 0xcc, 0x4f, 0xfe, 0x7a, 0xed, 0xcc, - 0x0f, 0x7f, 0x7e, 0xe1, 0x8c, 0xfd, 0x69, 0x1e, 0x16, 0x92, 0x5a, 0x1d, 0xa3, 0x92, 0x12, 0xf9, - 0xb0, 0x99, 0x53, 0xf5, 0x61, 0xb9, 0xd3, 0xf3, 0x61, 0xf9, 0xd3, 0xf0, 0x61, 0x53, 0x27, 0xe6, - 0xc3, 0xec, 0x7f, 0xb6, 0xe0, 0x6c, 0xb8, 0x32, 0x1f, 0x0d, 0xc4, 0xc9, 0x1a, 0x69, 0xdd, 0x3a, - 0x79, 0xad, 0x7f, 0x08, 0xd3, 0xcc, 0x1f, 0xd0, 0xa6, 0x0c, 0x1f, 0x05, 0xfa, 0xeb, 0xd9, 0x9c, - 0xa6, 0xe2, 0x35, 0x62, 0x26, 0xd5, 0x80, 0x03, 0x54, 0x73, 0x42, 0x9a, 0xa6, 0x42, 0x0a, 0x2a, - 0x02, 0x2e, 0x31, 0xa1, 0x19, 0x33, 0xa4, 0x10, 0xad, 0x58, 0x53, 0x91, 0x2d, 0xfd, 0x79, 0x10, - 0xd9, 0x96, 0x6a, 0xa0, 0xdd, 0xb2, 0x5c, 0x04, 0x45, 0x41, 0x7d, 0x58, 0xa0, 0xe4, 0xa3, 0x81, - 0x4b, 0x49, 0xab, 0xe1, 0x3b, 0x7b, 0x22, 0x2e, 0xd0, 0xc5, 0x80, 0x31, 0xed, 0x7e, 0x63, 0x40, - 0xa5, 0x0b, 0xab, 0x2d, 0x89, 0x1c, 0x07, 0x27, 0xb0, 0xf0, 0x10, 0xba, 0xfd, 0x1f, 0x85, 0xd0, - 0x60, 0x75, 0x3a, 0xfe, 0x5b, 0x50, 0x6e, 0xaa, 0xac, 0xa5, 0x7b, 0xb0, 0xe9, 0xe9, 0x2d, 0xb6, - 0x31, 0xc1, 0xe1, 0x53, 0xa9, 0x47, 0x30, 0x89, 0x6a, 0x9d, 0x41, 0xc1, 0xa6, 0x34, 0xf4, 0x03, - 0x00, 0xe5, 0x89, 0x49, 0x6b, 0xd3, 0xd3, 0x47, 0x4d, 0x7d, 0x12, 0xd9, 0xf7, 0x43, 0x14, 0x25, - 0x3a, 0x8c, 0x79, 0x22, 0x02, 0x36, 0x44, 0x89, 0x59, 0x07, 0xc5, 0xa7, 0x9b, 0x3e, 0xd5, 0x36, - 0x3b, 0xd1, 0xac, 0xab, 0x11, 0x4c, 0xb2, 0x46, 0x19, 0x51, 0xb0, 0x29, 0x6d, 0x85, 0xc2, 0x42, - 0x52, 0x57, 0x29, 0xc7, 0xcd, 0xed, 0xf8, 0x71, 0x73, 0x69, 0x4c, 0x03, 0x35, 0x32, 0x50, 0xb3, - 0xb8, 0x49, 0x61, 0x3e, 0xa1, 0xa3, 0x14, 0x91, 0x9b, 0x71, 0x91, 0xaf, 0x65, 0x39, 0x7a, 0x75, - 0x91, 0xd0, 0x94, 0xc9, 0x60, 0x21, 0xa9, 0x9d, 0x13, 0x13, 0x1a, 0xab, 0x4c, 0x9a, 0x67, 0xea, - 0x5f, 0xe5, 0xa0, 0x14, 0x7a, 0xd5, 0x2c, 0x65, 0x06, 0x15, 0x0d, 0xe5, 0x8e, 0xc9, 0xd6, 0xf2, - 0xe3, 0x64, 0x6b, 0x53, 0xa3, 0xb3, 0xb5, 0xa0, 0x14, 0x59, 0x7c, 0x74, 0x29, 0xd2, 0xc8, 0xd6, - 0xa6, 0xc7, 0xcf, 0xd6, 0x66, 0x8e, 0xcf, 0xd6, 0xec, 0xbf, 0xb1, 0x00, 0x0d, 0xa7, 0xe6, 0x59, - 0x14, 0xe5, 0x24, 0xcf, 0xba, 0x31, 0x23, 0xa1, 0x64, 0x7e, 0x3c, 0xfa, 0xc8, 0xb3, 0x3f, 0x2b, - 0xc0, 0xfc, 0x2d, 0x77, 0xe2, 0x8a, 0x11, 0x87, 0x67, 0x15, 0x52, 0x83, 0xe8, 0x38, 0xb4, 0xc1, - 0xa9, 0xc3, 0x49, 0xfb, 0x40, 0xaf, 0xef, 0x35, 0xcd, 0xfa, 0x6c, 0x3d, 0xbd, 0xdb, 0xc3, 0xd1, - 0x24, 0x3c, 0x0a, 0x7a, 0xec, 0x4d, 0xf2, 0x16, 0xcc, 0x31, 0x4e, 0xdd, 0x26, 0x57, 0x35, 0x29, - 0xb6, 0x5c, 0x96, 0x07, 0xc9, 0x79, 0xdd, 0x7d, 0xae, 0x61, 0x12, 0x71, 0xbc, 0x6f, 0x6a, 0xa9, - 0x6b, 0x2a, 0x73, 0xa9, 0x6b, 0x1d, 0x4a, 0x4e, 0xb7, 0xeb, 0xff, 0xe0, 0x9e, 0xd3, 0x66, 0xba, - 0x1c, 0x10, 0xee, 0x9a, 0x6a, 0x40, 0xc0, 0x51, 0x1f, 0x54, 0x01, 0x70, 0xdb, 0x9e, 0x4f, 0x89, - 0xe4, 0x28, 0xca, 0x13, 0x4d, 0x96, 0xf3, 0x37, 0xc3, 0x56, 0x6c, 0xf4, 0x40, 0x0d, 0x38, 0xef, - 0x7a, 0x8c, 0x34, 0x07, 0x94, 0x34, 0xf6, 0xdc, 0xfe, 0xbd, 0xad, 0x86, 0xf4, 0x12, 0x07, 0x72, - 0x37, 0xcf, 0xd4, 0x9e, 0xd3, 0xc2, 0xce, 0x6f, 0xa6, 0x75, 0xc2, 0xe9, 0xbc, 0xe8, 0x75, 0x98, - 0x75, 0xbd, 0x66, 0x77, 0xd0, 0x22, 0xdb, 0x0e, 0xef, 0xb0, 0xe5, 0x19, 0x39, 0x8c, 0x85, 0xa3, - 0xc3, 0xb5, 0xd9, 0x4d, 0xa3, 0x1d, 0xc7, 0x7a, 0x09, 0x2e, 0xf2, 0xb1, 0xc1, 0x55, 0x8a, 0xb8, - 0x6e, 0x7c, 0x6c, 0x72, 0x99, 0xbd, 0x52, 0x8a, 0x81, 0x90, 0xa9, 0x18, 0xf8, 0xd3, 0x1c, 0x14, - 0x55, 0x2d, 0x1e, 0x5d, 0x4e, 0x14, 0xbc, 0x9f, 0x1b, 0x2a, 0x78, 0x97, 0xd3, 0xee, 0x2d, 0x6c, - 0x28, 0xba, 0x8c, 0x0d, 0xe2, 0x01, 0xc4, 0xa6, 0x6c, 0xc1, 0x9a, 0x22, 0x4b, 0x5b, 0xbe, 0xb7, - 0xeb, 0xb6, 0x75, 0x01, 0xe2, 0xba, 0x11, 0x36, 0x44, 0xf7, 0xa5, 0x1f, 0x86, 0x17, 0xaa, 0x51, - 0x04, 0x11, 0xeb, 0x20, 0x42, 0x89, 0x3b, 0x8d, 0xbb, 0x6f, 0x2b, 0x19, 0x75, 0x89, 0x88, 0x35, - 0xb2, 0x90, 0xe1, 0x0f, 0x78, 0x7f, 0xc0, 0xe5, 0x46, 0x39, 0x21, 0x19, 0x77, 0x25, 0x22, 0xd6, - 0xc8, 0xf6, 0xa7, 0x16, 0xcc, 0x2b, 0x1d, 0xd4, 0x3b, 0xa4, 0xb9, 0xd7, 0xe0, 0xa4, 0x2f, 0x22, - 0xfa, 0x01, 0x23, 0x2c, 0x19, 0xd1, 0xbf, 0xc3, 0x08, 0xc3, 0x92, 0x62, 0xcc, 0x3e, 0x77, 0x5a, - 0xb3, 0xb7, 0xff, 0xce, 0x82, 0x82, 0x0c, 0x9d, 0xb3, 0xf8, 0x9f, 0x78, 0x39, 0x29, 0x37, 0x56, - 0x39, 0xe9, 0x98, 0x42, 0x5f, 0x54, 0xc9, 0x9a, 0x7a, 0x54, 0x25, 0xcb, 0xfe, 0xda, 0x82, 0xa5, - 0xb4, 0xea, 0x68, 0x96, 0xe1, 0xbf, 0x02, 0x33, 0xfd, 0xae, 0xc3, 0x77, 0x7d, 0xda, 0x4b, 0xde, - 0xb1, 0x6c, 0xeb, 0x76, 0x1c, 0xf6, 0x40, 0x14, 0x80, 0x06, 0x69, 0x58, 0x90, 0xa2, 0x5c, 0xcf, - 0x7a, 0x22, 0xc4, 0xcb, 0x7a, 0x91, 0xb2, 0xc2, 0x26, 0x86, 0x0d, 0x29, 0xf6, 0x9f, 0x14, 0x60, - 0x51, 0xb2, 0x4c, 0x7a, 0x42, 0x4c, 0xb2, 0x42, 0x7d, 0x78, 0x46, 0x26, 0x4f, 0xc3, 0x87, 0x8a, - 0x5a, 0xb4, 0xab, 0x9a, 0xff, 0x99, 0xcd, 0xd4, 0x5e, 0x0f, 0x47, 0x52, 0xf0, 0x08, 0xdc, 0xe1, - 0x93, 0x02, 0xfe, 0xff, 0x9d, 0x14, 0xe6, 0x66, 0x9b, 0x3e, 0x76, 0xb3, 0x8d, 0x3c, 0x57, 0x66, - 0x1e, 0xe3, 0x5c, 0x19, 0xf6, 0xf5, 0xa5, 0x4c, 0xbe, 0xfe, 0x2f, 0x72, 0x30, 0xbd, 0x4d, 0x7d, - 0x59, 0x65, 0x3f, 0xfd, 0x82, 0xed, 0x5d, 0x98, 0x62, 0x7d, 0xd2, 0xd4, 0x3e, 0xef, 0xe2, 0x78, - 0x96, 0xa6, 0x87, 0xd7, 0xe8, 0x93, 0x66, 0x6d, 0x46, 0xb8, 0x51, 0xf1, 0x0b, 0x4b, 0x20, 0xa3, - 0xf2, 0x98, 0xcf, 0x12, 0x81, 0x07, 0x90, 0x8f, 0xae, 0x3c, 0x7e, 0x66, 0x41, 0x59, 0xf7, 0x7c, - 0x6a, 0x4b, 0x5c, 0x7a, 0x7c, 0x23, 0x4a, 0x5c, 0x7f, 0x16, 0xcd, 0x40, 0x28, 0x0d, 0xfd, 0x0e, - 0x2c, 0xf6, 0xa9, 0xdf, 0xf3, 0x85, 0xa5, 0x6e, 0xfb, 0x5d, 0xb7, 0xe9, 0x92, 0xa0, 0x4a, 0x7a, - 0x79, 0x6c, 0x79, 0x06, 0xfb, 0x41, 0xed, 0x1b, 0x5a, 0xee, 0xe2, 0x76, 0x12, 0x17, 0x0f, 0x8b, - 0xb2, 0xff, 0xcd, 0x82, 0xb9, 0x98, 0xee, 0x51, 0x13, 0xa0, 0xe9, 0x7b, 0x2d, 0x97, 0x87, 0xd7, - 0xdc, 0xe5, 0x4b, 0xeb, 0xe3, 0x69, 0xb5, 0x1e, 0xf0, 0x45, 0x9b, 0x2e, 0x6c, 0x62, 0xd8, 0x80, - 0x45, 0xaf, 0x05, 0x2f, 0x4e, 0xe2, 0x41, 0x8c, 0x7a, 0x71, 0xf2, 0xf0, 0x70, 0x6d, 0x56, 0x8f, - 0xc9, 0x7c, 0x81, 0x92, 0xe5, 0xed, 0xc5, 0xdf, 0xe6, 0xa0, 0x14, 0xce, 0xff, 0x09, 0x98, 0xd1, - 0x3b, 0x31, 0x33, 0x7a, 0x2d, 0xe3, 0xca, 0x49, 0x43, 0x0a, 0x63, 0x12, 0xc3, 0x98, 0x3e, 0x48, - 0x18, 0x53, 0xd6, 0x2d, 0x71, 0x8c, 0x39, 0xfd, 0xa3, 0x5a, 0x7c, 0xd5, 0xf7, 0x09, 0x18, 0xd4, - 0xbd, 0xb8, 0x41, 0xad, 0x67, 0x9c, 0xcd, 0x08, 0x93, 0xfa, 0x91, 0x05, 0xf3, 0x09, 0x23, 0x40, - 0xdf, 0x82, 0x82, 0xac, 0x8a, 0xe9, 0xfd, 0x15, 0x32, 0xea, 0x04, 0x5f, 0xd2, 0xd0, 0x36, 0x2c, - 0x39, 0x03, 0xee, 0x87, 0xbc, 0x37, 0x3c, 0x67, 0xa7, 0x4b, 0x54, 0xd6, 0x3e, 0x53, 0xfb, 0x05, - 0xcd, 0xb3, 0x54, 0x4d, 0xe9, 0x83, 0x53, 0x39, 0xed, 0x9f, 0xe5, 0x00, 0x85, 0x8d, 0x59, 0xca, - 0xc9, 0x1f, 0xc0, 0xf4, 0xae, 0x2a, 0x04, 0x3d, 0xde, 0x7d, 0x40, 0xad, 0x6c, 0x5e, 0x89, 0x04, - 0x98, 0xe8, 0x7b, 0x27, 0xb3, 0x8f, 0x60, 0x78, 0x0f, 0xa1, 0x07, 0x00, 0xbb, 0xae, 0xe7, 0xb2, - 0xce, 0x84, 0x37, 0x97, 0xf2, 0x34, 0xbf, 0x19, 0x22, 0x60, 0x03, 0xcd, 0xfe, 0x24, 0x67, 0xec, - 0x4f, 0xe9, 0x2e, 0xc7, 0x5a, 0xd7, 0x97, 0xe2, 0xca, 0x2c, 0x0d, 0xdf, 0x15, 0x19, 0x8a, 0x99, - 0xda, 0x77, 0x68, 0x50, 0xb6, 0xbe, 0x92, 0x51, 0x2d, 0xf7, 0x1d, 0xea, 0x8a, 0x85, 0x8f, 0x96, - 0xf4, 0xbe, 0x43, 0x19, 0x96, 0x90, 0xe8, 0xbb, 0x62, 0xa8, 0xa4, 0x1f, 0xb8, 0xd0, 0xcc, 0x3e, - 0x81, 0x93, 0xbe, 0x39, 0x3f, 0xd2, 0x67, 0x58, 0x01, 0xda, 0x9f, 0x4c, 0x1b, 0x1b, 0x5e, 0x7b, - 0xed, 0x3b, 0x80, 0xba, 0x0e, 0xe3, 0xb7, 0x1d, 0xaf, 0x25, 0xb6, 0x27, 0xd9, 0xa5, 0x84, 0x75, - 0x74, 0x84, 0xb6, 0xa2, 0x51, 0xd0, 0xd6, 0x50, 0x0f, 0x9c, 0xc2, 0x85, 0x2e, 0xc7, 0x9d, 0xf3, - 0x5a, 0xd2, 0x39, 0x9f, 0x8d, 0xac, 0x6d, 0x32, 0xf7, 0x6c, 0x6e, 0xf7, 0xc2, 0x29, 0x6c, 0xf7, - 0xdf, 0x86, 0xc5, 0xdd, 0xe4, 0xdd, 0xa1, 0x7e, 0x49, 0x70, 0x65, 0xc2, 0xab, 0xc7, 0xda, 0xf9, - 0xa3, 0xe8, 0xc2, 0x29, 0x6a, 0xc6, 0xc3, 0x82, 0x90, 0x1f, 0x3c, 0xc8, 0x93, 0xd9, 0xa7, 0x2a, - 0x2c, 0x8c, 0x6d, 0x72, 0x89, 0xbc, 0x35, 0xf9, 0x14, 0x4f, 0x41, 0xe2, 0x98, 0x80, 0x84, 0x09, - 0x16, 0x4f, 0xd2, 0x04, 0xd1, 0xe5, 0xb0, 0xa0, 0x2f, 0x86, 0x23, 0x43, 0xd9, 0xfc, 0x50, 0x29, - 0x5e, 0x90, 0xb0, 0xd9, 0x0f, 0xfd, 0xd8, 0x82, 0xf3, 0x62, 0xb3, 0xde, 0xf8, 0x98, 0x34, 0x07, - 0x42, 0x2b, 0xc1, 0x2b, 0xdc, 0xe5, 0xb2, 0xd4, 0xc6, 0x98, 0xcf, 0x13, 0x1b, 0x69, 0x10, 0x51, - 0x5c, 0x9e, 0x4a, 0xc6, 0xe9, 0x82, 0xd1, 0x87, 0xd2, 0x75, 0x70, 0x22, 0xd3, 0x9e, 0xc7, 0x4f, - 0xef, 0x4b, 0xda, 0xed, 0x70, 0xe5, 0x76, 0x38, 0xb1, 0xff, 0x34, 0xe6, 0xad, 0xc6, 0x2b, 0x3a, - 0xac, 0x40, 0xce, 0x61, 0xc9, 0x32, 0x71, 0x95, 0xe1, 0x9c, 0xc3, 0xd0, 0xf7, 0xa0, 0x40, 0x09, - 0xa7, 0x07, 0xda, 0xa9, 0x5e, 0x9d, 0xc0, 0x81, 0x60, 0xc1, 0xaf, 0x86, 0x2a, 0x7f, 0x62, 0x85, - 0x68, 0xd4, 0x3a, 0xf2, 0xa7, 0x56, 0xeb, 0xf8, 0xa9, 0x65, 0x9c, 0x85, 0xe1, 0x60, 0xd0, 0x3b, - 0x30, 0xcd, 0xdd, 0x1e, 0xf1, 0x07, 0x3c, 0x5b, 0x80, 0x11, 0x5e, 0x4e, 0x49, 0x93, 0xbf, 0xa7, - 0x20, 0x70, 0x80, 0x25, 0xb2, 0x2e, 0x42, 0xa9, 0x4f, 0xef, 0x75, 0x84, 0x0b, 0xf3, 0xbb, 0xea, - 0x14, 0x9f, 0x8b, 0xb2, 0xae, 0x1b, 0x31, 0x2a, 0x4e, 0xf4, 0xb6, 0x29, 0x44, 0xf1, 0x72, 0xf0, - 0xbc, 0x19, 0x7d, 0xa0, 0xa3, 0x3a, 0x2b, 0xcb, 0x93, 0xda, 0x21, 0x98, 0x51, 0xd1, 0x9d, 0xfd, - 0x33, 0x0b, 0xce, 0xa7, 0xf6, 0x0e, 0x8f, 0xa5, 0xdc, 0x29, 0x1e, 0x4b, 0xd6, 0x49, 0x1f, 0x4b, - 0x0f, 0x0c, 0x15, 0x06, 0x43, 0x38, 0xa9, 0x6f, 0x12, 0x7e, 0x92, 0x83, 0x05, 0x4c, 0xfa, 0x7e, - 0xac, 0x42, 0xb3, 0x1d, 0xbc, 0x23, 0xcc, 0x10, 0xd2, 0x24, 0xee, 0x01, 0x6a, 0xd3, 0xb1, 0x07, - 0x84, 0xdf, 0x85, 0x82, 0x2c, 0x9e, 0xe8, 0x20, 0xec, 0x4a, 0x86, 0xbb, 0xf1, 0x18, 0xaa, 0xb4, - 0x38, 0x55, 0x85, 0x52, 0x80, 0x02, 0x59, 0x5e, 0x6b, 0x6b, 0x83, 0xbb, 0x92, 0xe1, 0x82, 0x7c, - 0x18, 0x59, 0x36, 0x63, 0x05, 0x68, 0x7f, 0x9a, 0x03, 0x15, 0xfe, 0x3c, 0x81, 0x34, 0xe7, 0xd7, - 0x63, 0x69, 0xce, 0xfa, 0xb8, 0x4e, 0x5c, 0xa8, 0x67, 0x54, 0x8a, 0x93, 0x0c, 0x4d, 0x2f, 0x66, - 0x01, 0x7d, 0x74, 0x7a, 0xf3, 0x0f, 0x16, 0x94, 0x64, 0xbf, 0x27, 0x90, 0xda, 0x6c, 0xc7, 0x53, - 0x9b, 0x97, 0x33, 0xcc, 0x62, 0x44, 0x5a, 0xf3, 0x49, 0x5e, 0x8f, 0x3e, 0x0c, 0x7c, 0x3b, 0x0e, - 0x6d, 0xe9, 0x90, 0x2e, 0xb2, 0x40, 0xd1, 0x88, 0x15, 0x0d, 0xfd, 0xa6, 0x7a, 0x01, 0x40, 0x18, - 0x27, 0xad, 0x9b, 0x61, 0x7c, 0x95, 0xcf, 0xfc, 0x94, 0x41, 0x3f, 0xb7, 0x88, 0x4a, 0x7b, 0x38, - 0x81, 0x8a, 0x87, 0xe4, 0x88, 0x98, 0xab, 0x9f, 0xf4, 0x65, 0x3a, 0x16, 0xb9, 0x32, 0xa1, 0xe3, - 0x54, 0x31, 0xd7, 0x50, 0x33, 0x1e, 0x16, 0x84, 0x3a, 0x30, 0x6b, 0x3e, 0xc2, 0xd2, 0x7b, 0xe9, - 0x52, 0xf6, 0xd7, 0x5e, 0xea, 0x2a, 0xc7, 0x6c, 0xc1, 0x31, 0x64, 0xfb, 0xb0, 0x08, 0x65, 0x63, - 0xf3, 0x25, 0xca, 0x25, 0x73, 0xa7, 0x53, 0x2e, 0x49, 0x8f, 0xee, 0xcb, 0x13, 0x45, 0xf7, 0x17, - 0xe3, 0xd1, 0xfd, 0x37, 0x93, 0xd1, 0x3d, 0xc8, 0xd9, 0xc5, 0x22, 0x7b, 0x06, 0x67, 0x75, 0x98, - 0x1b, 0xbc, 0xa6, 0xcb, 0x94, 0x2f, 0x0d, 0x07, 0xd3, 0x48, 0x9c, 0xc8, 0x37, 0x63, 0x90, 0x38, - 0x21, 0x42, 0x9c, 0xe8, 0xba, 0xa5, 0x31, 0xe8, 0xf5, 0x1c, 0x7a, 0xb0, 0x3c, 0x2b, 0x07, 0x1c, - 0x9e, 0xe8, 0x37, 0x63, 0x54, 0x9c, 0xe8, 0x8d, 0xb6, 0xa1, 0xa8, 0xa2, 0x64, 0xfd, 0x42, 0xeb, - 0x95, 0x2c, 0x01, 0xb8, 0x8a, 0x68, 0xd4, 0x6f, 0xac, 0x71, 0xcc, 0x04, 0xa7, 0x74, 0x4c, 0x82, - 0x73, 0x07, 0x90, 0xbf, 0x23, 0x63, 0xa7, 0xd6, 0x2d, 0xf5, 0xf1, 0x9e, 0xd8, 0x95, 0x45, 0x19, - 0x3d, 0x87, 0x0b, 0x76, 0x77, 0xa8, 0x07, 0x4e, 0xe1, 0x12, 0x56, 0xad, 0x43, 0xeb, 0xd0, 0x14, - 0x74, 0x32, 0x93, 0x35, 0x24, 0x8c, 0xf2, 0x26, 0xf9, 0xc2, 0xa7, 0x9e, 0x40, 0xc5, 0x43, 0x72, - 0xd0, 0x47, 0x30, 0x27, 0xb6, 0x50, 0x24, 0x18, 0x1e, 0x53, 0xf0, 0xe2, 0xd1, 0xe1, 0xda, 0xdc, - 0x96, 0x09, 0x89, 0xe3, 0x12, 0xec, 0x3f, 0xce, 0x43, 0x7a, 0x60, 0x1f, 0x3d, 0x2e, 0xb6, 0x1e, - 0xf1, 0xb8, 0xf8, 0x5d, 0x28, 0x31, 0xee, 0x50, 0xf5, 0x90, 0x3a, 0x37, 0xd9, 0x43, 0xea, 0x46, - 0x00, 0x80, 0x23, 0xac, 0x44, 0x96, 0x95, 0x3f, 0xd1, 0x2c, 0xeb, 0x12, 0x80, 0x8c, 0x47, 0xeb, - 0xfe, 0x40, 0xdf, 0xab, 0xcc, 0x45, 0x3e, 0xe1, 0x46, 0x48, 0xc1, 0x46, 0x2f, 0x74, 0x35, 0x3c, - 0x38, 0xd5, 0x45, 0xca, 0x85, 0xa1, 0x8b, 0xe0, 0x64, 0x9e, 0x9e, 0xf2, 0x0d, 0xdb, 0x31, 0x0f, - 0x47, 0xec, 0xff, 0xcd, 0x41, 0xcc, 0x19, 0xa2, 0x1f, 0x59, 0xb0, 0xe8, 0x24, 0x3e, 0x03, 0x0c, - 0x62, 0xc9, 0x5f, 0xcb, 0xf6, 0x6d, 0xe6, 0xd0, 0x57, 0x84, 0x51, 0xe9, 0x3a, 0xd9, 0x85, 0xe1, - 0x61, 0xa1, 0xe8, 0x0f, 0x2d, 0x38, 0xe7, 0x0c, 0x7f, 0xe7, 0xa9, 0x17, 0xfd, 0xcd, 0x89, 0x3f, - 0x14, 0xad, 0x3d, 0x7b, 0x74, 0xb8, 0x96, 0xf6, 0x05, 0x2c, 0x4e, 0x13, 0x87, 0xde, 0x83, 0x29, - 0x87, 0xb6, 0x83, 0x32, 0x4f, 0x76, 0xb1, 0xc1, 0xe7, 0xbb, 0x51, 0x74, 0x54, 0xa5, 0x6d, 0x86, - 0x25, 0xa8, 0xfd, 0xf3, 0x3c, 0x2c, 0x24, 0x1f, 0x23, 0xeb, 0xb7, 0x45, 0x53, 0xa9, 0x6f, 0x8b, - 0x84, 0x8d, 0x34, 0x79, 0xf8, 0xd0, 0x27, 0xb2, 0x11, 0xd1, 0x88, 0x15, 0x2d, 0xb4, 0x11, 0xf9, - 0x44, 0xb0, 0xf0, 0x18, 0x36, 0x22, 0xdf, 0x05, 0x46, 0x58, 0xe8, 0x6a, 0xfc, 0x6c, 0xb1, 0x93, - 0x67, 0xcb, 0xa2, 0x39, 0x97, 0x49, 0x8b, 0x47, 0x3d, 0x28, 0x1b, 0xeb, 0xa0, 0x2d, 0xf1, 0x5a, - 0x66, 0xbd, 0x47, 0xdb, 0x6e, 0x5e, 0x7d, 0x03, 0x1c, 0x51, 0x4c, 0xfc, 0xc8, 0xee, 0xa5, 0xb6, - 0x1e, 0xab, 0xba, 0x22, 0xd5, 0x65, 0xa0, 0xd9, 0xff, 0x6e, 0xc1, 0x5c, 0xec, 0xc1, 0x9b, 0x90, - 0x16, 0x3c, 0x2c, 0x9c, 0xfc, 0xab, 0xd8, 0xfb, 0x21, 0x02, 0x36, 0xd0, 0xd0, 0xf7, 0xa1, 0xdc, - 0xf5, 0xbd, 0x36, 0x61, 0xbc, 0xe1, 0x3b, 0x7b, 0xda, 0x4e, 0xb2, 0xa6, 0xdf, 0xcb, 0x47, 0x87, - 0x6b, 0x4b, 0x5b, 0x0a, 0xa6, 0xee, 0xf7, 0xfa, 0x5d, 0xc2, 0xd5, 0x8b, 0x50, 0x6c, 0x82, 0xcb, - 0x0b, 0x98, 0x77, 0x1d, 0x4a, 0x3a, 0xfe, 0x80, 0x91, 0xa7, 0xf5, 0x02, 0x26, 0x1c, 0xe0, 0x49, - 0x5f, 0xc0, 0x44, 0xc0, 0xc7, 0x5f, 0xc0, 0x84, 0x7d, 0x9f, 0xda, 0x0b, 0x98, 0x70, 0x84, 0x23, - 0x32, 0x95, 0xff, 0xc9, 0x19, 0xb3, 0x88, 0x67, 0x2b, 0xb9, 0x47, 0x64, 0x2b, 0xef, 0xc3, 0x8c, - 0xeb, 0x71, 0x42, 0xf7, 0x9d, 0xae, 0x2e, 0x71, 0x65, 0xdd, 0x8b, 0xe1, 0x54, 0x37, 0x35, 0x0e, - 0x0e, 0x11, 0x51, 0x17, 0xce, 0x07, 0xa5, 0x59, 0x4a, 0x9c, 0xe8, 0x6a, 0x48, 0x3f, 0xaf, 0x78, - 0x23, 0xa8, 0x21, 0xde, 0x4c, 0xeb, 0xf4, 0x70, 0x14, 0x01, 0xa7, 0x83, 0x22, 0x06, 0x73, 0xcc, - 0x48, 0xd3, 0x83, 0x13, 0x71, 0xcc, 0xb2, 0x76, 0xb2, 0xb2, 0x61, 0xbc, 0xc9, 0x30, 0x41, 0x71, - 0x5c, 0x86, 0xfd, 0x2f, 0x79, 0x98, 0x4f, 0xec, 0xb4, 0x44, 0x3a, 0x52, 0x7a, 0x92, 0xe9, 0x48, - 0x71, 0xa2, 0x74, 0x24, 0x3d, 0x52, 0x9e, 0x9a, 0x28, 0x52, 0x7e, 0x4b, 0x45, 0xab, 0x7a, 0xe5, - 0x36, 0x37, 0xf4, 0x13, 0xd6, 0x50, 0x9b, 0x5b, 0x26, 0x11, 0xc7, 0xfb, 0xca, 0x70, 0xa2, 0x35, - 0xfc, 0x4d, 0xac, 0x0e, 0xb5, 0xdf, 0xcc, 0xfa, 0x06, 0x29, 0x04, 0x50, 0xe1, 0x44, 0x0a, 0x01, - 0xa7, 0x89, 0xab, 0xdd, 0xf9, 0xfc, 0xab, 0xd5, 0x33, 0x5f, 0x7c, 0xb5, 0x7a, 0xe6, 0xcb, 0xaf, - 0x56, 0xcf, 0xfc, 0xf0, 0x68, 0xd5, 0xfa, 0xfc, 0x68, 0xd5, 0xfa, 0xe2, 0x68, 0xd5, 0xfa, 0xf2, - 0x68, 0xd5, 0xfa, 0xcf, 0xa3, 0x55, 0xeb, 0xc7, 0x5f, 0xaf, 0x9e, 0x79, 0xf0, 0xfc, 0x38, 0xff, - 0x75, 0xe5, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xd4, 0xe7, 0x00, 0x2a, 0x9c, 0x45, 0x00, 0x00, + 0x76, 0x9f, 0x26, 0x25, 0x4a, 0x7c, 0x94, 0x46, 0x52, 0x8d, 0xc6, 0xd6, 0x6a, 0x63, 0xc9, 0xe9, + 0x35, 0x0c, 0x3b, 0xb6, 0xa9, 0xcc, 0xd8, 0x63, 0x8f, 0xc7, 0xc9, 0x04, 0x22, 0x35, 0x1f, 0x9a, + 0xd5, 0x7a, 0x94, 0xa2, 0x3c, 0x5e, 0x8f, 0x6d, 0x78, 0x4b, 0x64, 0x89, 0xec, 0x15, 0xd9, 0x4d, + 0x77, 0x15, 0xb5, 0x56, 0x12, 0x24, 0x9b, 0x2f, 0x60, 0x91, 0x2f, 0xec, 0xc1, 0x80, 0x37, 0x40, + 0x02, 0x04, 0xc9, 0x71, 0x91, 0xfc, 0x03, 0x39, 0xf8, 0x90, 0x8b, 0x11, 0x18, 0x89, 0x91, 0x04, + 0x88, 0x0f, 0x0b, 0x25, 0xd6, 0x02, 0x39, 0xe6, 0x96, 0xcb, 0x00, 0x01, 0x82, 0xfa, 0xe8, 0xee, + 0xea, 0x0f, 0x8e, 0xd8, 0x1c, 0x69, 0x60, 0xe4, 0x46, 0xd5, 0xab, 0xfa, 0xbd, 0xaa, 0x57, 0xef, + 0xbd, 0x7a, 0xef, 0x55, 0xb5, 0xe0, 0x95, 0xb6, 0xc3, 0x3b, 0x83, 0xdd, 0x6a, 0xd3, 0xeb, 0xad, + 0x91, 0xfd, 0x81, 0xc3, 0x0f, 0xd7, 0xf6, 0x89, 0xdf, 0xf6, 0xd6, 0x48, 0xdf, 0x59, 0x3b, 0xb8, + 0x44, 0xba, 0xfd, 0x0e, 0xb9, 0xb4, 0xd6, 0xa6, 0x2e, 0xf5, 0x09, 0xa7, 0xad, 0x6a, 0xdf, 0xf7, + 0xb8, 0x87, 0x9e, 0x89, 0x46, 0x55, 0xd5, 0xa8, 0xaa, 0x1c, 0x55, 0x25, 0x7d, 0xa7, 0x1a, 0x8c, + 0x5a, 0x7e, 0xc9, 0xc0, 0x6e, 0x7b, 0x6d, 0x6f, 0x4d, 0x0e, 0xde, 0x1d, 0xec, 0xc9, 0xbf, 0xe4, + 0x1f, 0xf2, 0x97, 0x02, 0x5d, 0xbe, 0xbd, 0x7f, 0x95, 0x55, 0x1d, 0xc9, 0x99, 0x7e, 0xc4, 0xa9, + 0xcb, 0x1c, 0xcf, 0x65, 0x2f, 0x91, 0xbe, 0xc3, 0xa8, 0x7f, 0x40, 0xfd, 0xb5, 0xfe, 0x7e, 0x5b, + 0xd0, 0x58, 0xbc, 0xc3, 0xda, 0x41, 0x6a, 0x7a, 0xcb, 0xaf, 0x44, 0x48, 0x3d, 0xd2, 0xec, 0x38, + 0x2e, 0xf5, 0x0f, 0xa3, 0xe1, 0x3d, 0xca, 0x49, 0xd6, 0xa8, 0xb5, 0x61, 0xa3, 0xfc, 0x81, 0xcb, + 0x9d, 0x1e, 0x4d, 0x0d, 0x78, 0xf5, 0xa4, 0x01, 0xac, 0xd9, 0xa1, 0x3d, 0x92, 0x1c, 0x67, 0xbf, + 0x07, 0x17, 0xd6, 0x5d, 0xd2, 0x3d, 0x64, 0x0e, 0xc3, 0x03, 0x77, 0xdd, 0x6f, 0x0f, 0x7a, 0xd4, + 0xe5, 0xe8, 0x69, 0x98, 0x70, 0x49, 0x8f, 0x2e, 0x59, 0x4f, 0x5b, 0xcf, 0x95, 0x6b, 0x33, 0x9f, + 0x1d, 0xad, 0x9e, 0x3b, 0x3e, 0x5a, 0x9d, 0x78, 0x93, 0xf4, 0x28, 0x96, 0x14, 0xf4, 0x2d, 0x98, + 0x3c, 0x20, 0xdd, 0x01, 0x5d, 0x2a, 0xc8, 0x2e, 0xb3, 0xba, 0xcb, 0xe4, 0x3d, 0xd1, 0x88, 0x15, + 0xcd, 0xfe, 0xfd, 0x62, 0x0c, 0xfe, 0x3b, 0x94, 0x93, 0x16, 0xe1, 0x04, 0xf5, 0xa0, 0xd4, 0x25, + 0xbb, 0xb4, 0xcb, 0x96, 0xac, 0xa7, 0x8b, 0xcf, 0x55, 0x2e, 0xdf, 0xa8, 0x8e, 0xb2, 0x89, 0xd5, + 0x0c, 0xa8, 0xea, 0x96, 0xc4, 0xb9, 0xe1, 0x72, 0xff, 0xb0, 0x76, 0x5e, 0x4f, 0xa2, 0xa4, 0x1a, + 0xb1, 0x66, 0x82, 0x7e, 0xd7, 0x82, 0x0a, 0x71, 0x5d, 0x8f, 0x13, 0x2e, 0xb6, 0x69, 0xa9, 0x20, + 0x99, 0xde, 0x19, 0x9f, 0xe9, 0x7a, 0x04, 0xa6, 0x38, 0x5f, 0xd0, 0x9c, 0x2b, 0x06, 0x05, 0x9b, + 0x3c, 0x97, 0x5f, 0x87, 0x8a, 0x31, 0x55, 0x34, 0x0f, 0xc5, 0x7d, 0x7a, 0xa8, 0xe4, 0x8b, 0xc5, + 0x4f, 0xb4, 0x18, 0x13, 0xa8, 0x96, 0xe0, 0xb5, 0xc2, 0x55, 0x6b, 0xf9, 0x3a, 0xcc, 0x27, 0x19, + 0xe6, 0x19, 0x6f, 0xff, 0x99, 0x05, 0x8b, 0xc6, 0x2a, 0x30, 0xdd, 0xa3, 0x3e, 0x75, 0x9b, 0x14, + 0xad, 0x41, 0x59, 0xec, 0x25, 0xeb, 0x93, 0x66, 0xb0, 0xd5, 0x0b, 0x7a, 0x21, 0xe5, 0x37, 0x03, + 0x02, 0x8e, 0xfa, 0x84, 0x6a, 0x51, 0x78, 0x98, 0x5a, 0xf4, 0x3b, 0x84, 0xd1, 0xa5, 0x62, 0x5c, + 0x2d, 0xb6, 0x45, 0x23, 0x56, 0x34, 0xfb, 0x57, 0xe1, 0x1b, 0xc1, 0x7c, 0x76, 0x68, 0xaf, 0xdf, + 0x25, 0x9c, 0x46, 0x93, 0x3a, 0x51, 0xf5, 0xec, 0x7d, 0x98, 0x5d, 0xef, 0xf7, 0x7d, 0xef, 0x80, + 0xb6, 0x1a, 0x9c, 0xb4, 0x29, 0xba, 0x0f, 0x40, 0x74, 0xc3, 0x3a, 0x97, 0x03, 0x2b, 0x97, 0x7f, + 0xa9, 0xaa, 0x2c, 0xa2, 0x6a, 0x5a, 0x44, 0xb5, 0xbf, 0xdf, 0x16, 0x0d, 0xac, 0x2a, 0x0c, 0xaf, + 0x7a, 0x70, 0xa9, 0xba, 0xe3, 0xf4, 0x68, 0xed, 0xfc, 0xf1, 0xd1, 0x2a, 0xac, 0x87, 0x08, 0xd8, + 0x40, 0xb3, 0x7f, 0xcf, 0x82, 0x8b, 0xeb, 0x7e, 0xdb, 0xab, 0x6f, 0xac, 0xf7, 0xfb, 0xb7, 0x29, + 0xe9, 0xf2, 0x4e, 0x83, 0x13, 0x3e, 0x60, 0xe8, 0x3a, 0x94, 0x98, 0xfc, 0xa5, 0xa7, 0xfa, 0x6c, + 0xa0, 0x7d, 0x8a, 0xfe, 0xe0, 0x68, 0x75, 0x31, 0x63, 0x20, 0xc5, 0x7a, 0x14, 0x7a, 0x1e, 0xa6, + 0x7a, 0x94, 0x31, 0xd2, 0x0e, 0xe4, 0x39, 0xa7, 0x01, 0xa6, 0xbe, 0xa3, 0x9a, 0x71, 0x40, 0xb7, + 0xff, 0xb1, 0x00, 0x73, 0x21, 0x96, 0x66, 0x7f, 0x06, 0x9b, 0x37, 0x80, 0x99, 0x8e, 0xb1, 0x42, + 0xb9, 0x87, 0x95, 0xcb, 0x6f, 0x8c, 0x68, 0x27, 0x59, 0x42, 0xaa, 0x2d, 0x6a, 0x36, 0x33, 0x66, + 0x2b, 0x8e, 0xb1, 0x41, 0x3d, 0x00, 0x76, 0xe8, 0x36, 0x35, 0xd3, 0x09, 0xc9, 0xf4, 0xf5, 0x9c, + 0x4c, 0x1b, 0x21, 0x40, 0x0d, 0x69, 0x96, 0x10, 0xb5, 0x61, 0x83, 0x81, 0xfd, 0x77, 0x16, 0x5c, + 0xc8, 0x18, 0x87, 0x7e, 0x25, 0xb1, 0x9f, 0xcf, 0xa4, 0xf6, 0x13, 0xa5, 0x86, 0x45, 0xbb, 0xf9, + 0x22, 0x4c, 0xfb, 0xf4, 0xc0, 0x11, 0xe7, 0x80, 0x96, 0xf0, 0xbc, 0x1e, 0x3f, 0x8d, 0x75, 0x3b, + 0x0e, 0x7b, 0xa0, 0x17, 0xa0, 0x1c, 0xfc, 0x16, 0x62, 0x2e, 0x0a, 0x53, 0x11, 0x1b, 0x17, 0x74, + 0x65, 0x38, 0xa2, 0xdb, 0xbf, 0x03, 0x93, 0xf5, 0x0e, 0xf1, 0xb9, 0xd0, 0x18, 0x9f, 0xf6, 0xbd, + 0xb7, 0xf0, 0x96, 0x9e, 0x62, 0xa8, 0x31, 0x58, 0x35, 0xe3, 0x80, 0x3e, 0xc2, 0x66, 0x3f, 0x0f, + 0x53, 0x07, 0xd4, 0x97, 0xf3, 0x2d, 0xc6, 0xc1, 0xee, 0xa9, 0x66, 0x1c, 0xd0, 0xed, 0x7f, 0xb5, + 0x60, 0x51, 0xce, 0x60, 0xc3, 0x61, 0x4d, 0xef, 0x80, 0xfa, 0x87, 0x98, 0xb2, 0x41, 0xf7, 0x94, + 0x27, 0xb4, 0x01, 0xf3, 0x8c, 0xf6, 0x0e, 0xa8, 0x5f, 0xf7, 0x5c, 0xc6, 0x7d, 0xe2, 0xb8, 0x5c, + 0xcf, 0x6c, 0x49, 0xf7, 0x9e, 0x6f, 0x24, 0xe8, 0x38, 0x35, 0x02, 0x3d, 0x07, 0xd3, 0x7a, 0xda, + 0x42, 0x95, 0x84, 0x60, 0x67, 0xc4, 0x1e, 0xe8, 0x35, 0x31, 0x1c, 0x52, 0xed, 0xff, 0xb2, 0x60, + 0x41, 0xae, 0xaa, 0x31, 0xd8, 0x65, 0x4d, 0xdf, 0xe9, 0x0b, 0xf7, 0xfa, 0x75, 0x5c, 0xd2, 0x75, + 0x38, 0xdf, 0x0a, 0x04, 0xbf, 0xe5, 0xf4, 0x1c, 0x2e, 0x6d, 0x64, 0xb2, 0xf6, 0x84, 0xc6, 0x38, + 0xbf, 0x11, 0xa3, 0xe2, 0x44, 0x6f, 0xfb, 0x5d, 0x98, 0xa9, 0x0f, 0x7c, 0x9f, 0xba, 0x5c, 0xb9, + 0xcb, 0x6f, 0xc3, 0x24, 0x73, 0x5c, 0xed, 0x35, 0xf2, 0x79, 0xca, 0xb2, 0xf0, 0xe5, 0x0d, 0x31, + 0x18, 0x2b, 0x0c, 0xfb, 0x2f, 0x8a, 0x70, 0x21, 0xe0, 0x4f, 0x5b, 0xeb, 0x3e, 0x77, 0xf6, 0x48, + 0x93, 0x33, 0xd4, 0x82, 0x99, 0x56, 0xd4, 0xcc, 0xb5, 0x59, 0xe7, 0xe1, 0x15, 0xba, 0x0e, 0x03, + 0x9e, 0xe3, 0x18, 0x2a, 0x7a, 0x1b, 0x8a, 0x6d, 0x87, 0xeb, 0x28, 0xe2, 0xea, 0x68, 0x3e, 0xe3, + 0x96, 0x93, 0xd4, 0xe3, 0x5a, 0x45, 0xb3, 0x2a, 0xde, 0x72, 0x38, 0x16, 0x88, 0x68, 0x17, 0x4a, + 0x4e, 0x8f, 0xb4, 0x69, 0x10, 0x2c, 0x5c, 0x1b, 0x0d, 0x7b, 0x53, 0x8c, 0x49, 0xa2, 0x87, 0x61, + 0x89, 0xa4, 0x32, 0xac, 0x91, 0x05, 0x8f, 0xa6, 0xd0, 0x3f, 0xe5, 0x01, 0x46, 0xe6, 0x91, 0x65, + 0x89, 0x11, 0x0f, 0x49, 0x65, 0x58, 0x23, 0xdb, 0x5f, 0x16, 0x60, 0x3e, 0x92, 0x5f, 0xdd, 0xeb, + 0xf5, 0x1c, 0x8e, 0x96, 0xa1, 0xe0, 0xb4, 0xb4, 0x7a, 0x83, 0x1e, 0x58, 0xd8, 0xdc, 0xc0, 0x05, + 0xa7, 0x85, 0x9e, 0x85, 0xd2, 0xae, 0x4f, 0xdc, 0x66, 0x47, 0xab, 0x75, 0x08, 0x5c, 0x93, 0xad, + 0x58, 0x53, 0xd1, 0x53, 0x50, 0xe4, 0xa4, 0xad, 0xb5, 0x39, 0x94, 0xdf, 0x0e, 0x69, 0x63, 0xd1, + 0x2e, 0xcc, 0x88, 0x0d, 0x76, 0xbf, 0x4f, 0x9b, 0x6a, 0xe7, 0x0d, 0x33, 0x6a, 0xa8, 0x66, 0x1c, + 0xd0, 0x05, 0x47, 0x32, 0xe0, 0x1d, 0xcf, 0x5f, 0x9a, 0x8c, 0x73, 0x5c, 0x97, 0xad, 0x58, 0x53, + 0xc5, 0x81, 0xd7, 0x94, 0xf3, 0xe7, 0xd4, 0x5f, 0x2a, 0xc5, 0x0f, 0xbc, 0x7a, 0x40, 0xc0, 0x51, + 0x1f, 0xf4, 0x3e, 0x54, 0x9a, 0x3e, 0x25, 0xdc, 0xf3, 0x37, 0x08, 0xa7, 0x4b, 0x53, 0xb9, 0x35, + 0x70, 0x4e, 0x44, 0x74, 0xf5, 0x08, 0x02, 0x9b, 0x78, 0xf6, 0x7f, 0x5b, 0xb0, 0x14, 0x89, 0x56, + 0xee, 0x6d, 0x14, 0xc5, 0x68, 0xf1, 0x58, 0x43, 0xc4, 0xf3, 0x2c, 0x94, 0x5a, 0x4e, 0x9b, 0x32, + 0x9e, 0x94, 0xf2, 0x86, 0x6c, 0xc5, 0x9a, 0x8a, 0x2e, 0x03, 0xb4, 0x1d, 0xae, 0x3d, 0x8f, 0x16, + 0x76, 0x78, 0xbe, 0xdd, 0x0a, 0x29, 0xd8, 0xe8, 0x85, 0xde, 0x86, 0xb2, 0x9c, 0xe6, 0x98, 0x66, + 0x27, 0xcf, 0xa1, 0x7a, 0x00, 0x80, 0x23, 0x2c, 0xfb, 0x8b, 0x09, 0x98, 0xba, 0xe9, 0x53, 0xa7, + 0xdd, 0xe1, 0xe8, 0x7b, 0x30, 0xdd, 0xd3, 0xd1, 0xb0, 0x76, 0x23, 0xbf, 0x3c, 0x1a, 0x8f, 0xbb, + 0x72, 0xd3, 0x45, 0x24, 0x1d, 0x2d, 0x24, 0x6a, 0xc3, 0x21, 0xaa, 0x88, 0x24, 0x49, 0xd7, 0x21, + 0x4c, 0xee, 0x9b, 0x11, 0x49, 0xae, 0x8b, 0x46, 0xac, 0x68, 0xe8, 0x5d, 0x28, 0x79, 0xbe, 0xd3, + 0x76, 0xdc, 0xa5, 0xb2, 0x9c, 0xc4, 0xcb, 0xa3, 0x99, 0x90, 0x5e, 0xc5, 0x5d, 0x39, 0x34, 0x12, + 0xbe, 0xfa, 0x1b, 0x6b, 0x48, 0x74, 0x1f, 0xa6, 0x94, 0x32, 0x05, 0x06, 0xba, 0x36, 0xb2, 0x83, + 0x51, 0xfa, 0x18, 0x29, 0xbd, 0xfa, 0x9b, 0xe1, 0x00, 0x10, 0x35, 0x42, 0xff, 0x32, 0x21, 0xa1, + 0x5f, 0xc8, 0xe1, 0x5f, 0x86, 0x3a, 0x94, 0x46, 0xe8, 0x50, 0x26, 0xf3, 0x80, 0x4a, 0x97, 0x31, + 0xcc, 0x83, 0x08, 0x11, 0xeb, 0xb0, 0xa8, 0x34, 0x86, 0x88, 0x75, 0x4c, 0x76, 0x3e, 0x1e, 0x4b, + 0x05, 0x51, 0x93, 0xfd, 0x71, 0x11, 0x16, 0x74, 0xcf, 0xba, 0xd7, 0xed, 0xd2, 0xa6, 0x3c, 0x83, + 0x95, 0x7f, 0x2a, 0x66, 0xfa, 0x27, 0x07, 0x26, 0x1d, 0x4e, 0x7b, 0x41, 0xe6, 0x58, 0xcb, 0x35, + 0x9b, 0x88, 0x47, 0x75, 0x53, 0x80, 0xa8, 0xe4, 0x2d, 0xdc, 0x25, 0xdd, 0x0b, 0x2b, 0x0e, 0xe8, + 0x0f, 0x2d, 0xb8, 0x70, 0x40, 0x7d, 0x67, 0xcf, 0x69, 0xca, 0xd4, 0xeb, 0xb6, 0xc3, 0xb8, 0xe7, + 0x1f, 0xea, 0x13, 0xe1, 0xd5, 0xd1, 0x38, 0xdf, 0x33, 0x00, 0x36, 0xdd, 0x3d, 0xaf, 0xf6, 0x4d, + 0xcd, 0xed, 0xc2, 0xbd, 0x34, 0x34, 0xce, 0xe2, 0xb7, 0xdc, 0x07, 0x88, 0x66, 0x9b, 0x91, 0xf9, + 0x6d, 0x99, 0x99, 0xdf, 0xc8, 0x13, 0x0b, 0x16, 0x1b, 0xb8, 0x2c, 0x33, 0x63, 0xfc, 0xd4, 0x82, + 0x8a, 0xa6, 0x6f, 0x39, 0x8c, 0xa3, 0xf7, 0x52, 0xd6, 0x5e, 0x1d, 0xcd, 0xda, 0xc5, 0x68, 0x69, + 0xeb, 0x61, 0x30, 0x1c, 0xb4, 0x18, 0x96, 0x8e, 0x83, 0x2d, 0x55, 0x82, 0x7d, 0x29, 0xd7, 0xfc, + 0x23, 0xc7, 0x20, 0x65, 0xa4, 0xf7, 0xce, 0xf6, 0x61, 0x36, 0x66, 0xe4, 0xe8, 0x0a, 0x4c, 0xec, + 0x3b, 0x6e, 0x70, 0xea, 0xfd, 0x62, 0x10, 0xac, 0x7d, 0xdb, 0x71, 0x5b, 0x0f, 0x8e, 0x56, 0x17, + 0x62, 0x9d, 0x45, 0x23, 0x96, 0xdd, 0x4f, 0x8e, 0xf1, 0xae, 0x4d, 0xff, 0xe4, 0xaf, 0x56, 0xcf, + 0xfd, 0xf0, 0x67, 0x4f, 0x9f, 0xb3, 0x3f, 0x29, 0xc2, 0x7c, 0x52, 0xaa, 0x23, 0x54, 0x52, 0x22, + 0x1f, 0x36, 0x7d, 0xa6, 0x3e, 0xac, 0x70, 0x76, 0x3e, 0xac, 0x78, 0x16, 0x3e, 0x6c, 0xe2, 0xd4, + 0x7c, 0x98, 0xfd, 0x4f, 0x16, 0x9c, 0x0f, 0x77, 0xe6, 0xc3, 0x81, 0x38, 0x59, 0x23, 0xa9, 0x5b, + 0xa7, 0x2f, 0xf5, 0x0f, 0x60, 0x8a, 0x79, 0x03, 0xbf, 0x29, 0xc3, 0x47, 0x81, 0xfe, 0x4a, 0x3e, + 0xa7, 0xa9, 0xc6, 0x1a, 0x31, 0x93, 0x6a, 0xc0, 0x01, 0xaa, 0xb9, 0x20, 0x4d, 0x53, 0x21, 0x85, + 0x2f, 0x02, 0x2e, 0xb1, 0xa0, 0x69, 0x33, 0xa4, 0x10, 0xad, 0x58, 0x53, 0x91, 0x2d, 0xfd, 0x79, + 0x10, 0xd9, 0x96, 0x6b, 0xa0, 0xdd, 0xb2, 0xdc, 0x04, 0x45, 0x41, 0x7d, 0x98, 0xf7, 0xe9, 0x87, + 0x03, 0xc7, 0xa7, 0xad, 0x86, 0x47, 0xf6, 0x45, 0x5c, 0xa0, 0x8b, 0x01, 0x23, 0xda, 0xfd, 0xc6, + 0xc0, 0x97, 0x2e, 0xac, 0xb6, 0x28, 0x72, 0x1c, 0x9c, 0xc0, 0xc2, 0x29, 0x74, 0xfb, 0x3f, 0x26, + 0x43, 0x83, 0xd5, 0xe9, 0xf8, 0x6f, 0x42, 0xa5, 0xa9, 0xb2, 0x96, 0xee, 0xe1, 0xa6, 0xab, 0x55, + 0x6c, 0x63, 0x8c, 0xc3, 0xa7, 0x5a, 0x8f, 0x60, 0x12, 0xd5, 0x3a, 0x83, 0x82, 0x4d, 0x6e, 0xe8, + 0x07, 0x00, 0xca, 0x13, 0xd3, 0xd6, 0xa6, 0xab, 0x8f, 0x9a, 0xfa, 0x38, 0xbc, 0xef, 0x85, 0x28, + 0x8a, 0x75, 0x18, 0xf3, 0x44, 0x04, 0x6c, 0xb0, 0x12, 0xab, 0x0e, 0x8a, 0x4f, 0x37, 0x3d, 0x5f, + 0xdb, 0xec, 0x58, 0xab, 0x5e, 0x8f, 0x60, 0x92, 0x35, 0xca, 0x88, 0x82, 0x4d, 0x6e, 0xcb, 0x3e, + 0xcc, 0x27, 0x65, 0x95, 0x71, 0xdc, 0xdc, 0x8e, 0x1f, 0x37, 0x97, 0x47, 0x34, 0x50, 0x23, 0x03, + 0x35, 0x8b, 0x9b, 0x3e, 0xcc, 0x25, 0x64, 0x94, 0xc1, 0x72, 0x33, 0xce, 0xf2, 0xe5, 0x3c, 0x47, + 0xaf, 0x2e, 0x12, 0x9a, 0x3c, 0x19, 0xcc, 0x27, 0xa5, 0x73, 0x6a, 0x4c, 0x63, 0x95, 0x49, 0xf3, + 0x4c, 0xfd, 0xcb, 0x02, 0x94, 0x43, 0xaf, 0x9a, 0xa7, 0xcc, 0xa0, 0xa2, 0xa1, 0xc2, 0x09, 0xd9, + 0x5a, 0x71, 0x94, 0x6c, 0x6d, 0x62, 0x78, 0xb6, 0x16, 0x94, 0x22, 0x4b, 0x0f, 0x2f, 0x45, 0x1a, + 0xd9, 0xda, 0xd4, 0xe8, 0xd9, 0xda, 0xf4, 0xc9, 0xd9, 0x9a, 0xfd, 0xd7, 0x16, 0xa0, 0x74, 0x6a, + 0x9e, 0x47, 0x50, 0x24, 0x79, 0xd6, 0x8d, 0x18, 0x09, 0x25, 0xf3, 0xe3, 0xe1, 0x47, 0x9e, 0xfd, + 0xe9, 0x24, 0xcc, 0xdd, 0x72, 0xc6, 0xae, 0x18, 0x71, 0x78, 0x52, 0x21, 0x35, 0xa8, 0x8e, 0x43, + 0x1b, 0xdc, 0x27, 0x9c, 0xb6, 0x0f, 0xf5, 0xfe, 0x5e, 0xd3, 0x43, 0x9f, 0xac, 0x67, 0x77, 0x7b, + 0x30, 0x9c, 0x84, 0x87, 0x41, 0x8f, 0xac, 0x24, 0x6f, 0xc0, 0x2c, 0xe3, 0xbe, 0xd3, 0xe4, 0xaa, + 0x26, 0xc5, 0x96, 0x2a, 0xf2, 0x20, 0xb9, 0xa8, 0xbb, 0xcf, 0x36, 0x4c, 0x22, 0x8e, 0xf7, 0xcd, + 0x2c, 0x75, 0x4d, 0xe4, 0x2e, 0x75, 0xad, 0x41, 0x99, 0x74, 0xbb, 0xde, 0x0f, 0x76, 0x48, 0x9b, + 0xe9, 0x72, 0x40, 0xa8, 0x35, 0xeb, 0x01, 0x01, 0x47, 0x7d, 0x50, 0x15, 0xc0, 0x69, 0xbb, 0x9e, + 0x4f, 0xe5, 0x88, 0x92, 0x3c, 0xd1, 0x64, 0x39, 0x7f, 0x33, 0x6c, 0xc5, 0x46, 0x0f, 0xd4, 0x80, + 0x8b, 0x8e, 0xcb, 0x68, 0x73, 0xe0, 0xd3, 0xc6, 0xbe, 0xd3, 0xdf, 0xd9, 0x6a, 0x48, 0x2f, 0x71, + 0x28, 0xb5, 0x79, 0xba, 0xf6, 0x94, 0x66, 0x76, 0x71, 0x33, 0xab, 0x13, 0xce, 0x1e, 0x8b, 0x5e, + 0x81, 0x19, 0xc7, 0x6d, 0x76, 0x07, 0x2d, 0xba, 0x4d, 0x78, 0x87, 0x2d, 0x4d, 0xcb, 0x69, 0xcc, + 0x1f, 0x1f, 0xad, 0xce, 0x6c, 0x1a, 0xed, 0x38, 0xd6, 0x4b, 0x8c, 0xa2, 0x1f, 0x19, 0xa3, 0xca, + 0xd1, 0xa8, 0x1b, 0x1f, 0x99, 0xa3, 0xcc, 0x5e, 0x19, 0xc5, 0x40, 0xc8, 0x55, 0x0c, 0xfc, 0x69, + 0x01, 0x4a, 0xaa, 0x16, 0x8f, 0xae, 0x24, 0x0a, 0xde, 0x4f, 0xa5, 0x0a, 0xde, 0x95, 0xac, 0x7b, + 0x0b, 0x1b, 0x4a, 0x0e, 0x63, 0x83, 0x78, 0x00, 0xb1, 0x29, 0x5b, 0xb0, 0xa6, 0xc8, 0xd2, 0x96, + 0xe7, 0xee, 0x39, 0x6d, 0x5d, 0x80, 0xb8, 0x6e, 0x84, 0x0d, 0xd1, 0x7d, 0xe9, 0x07, 0xe1, 0x85, + 0x6a, 0x14, 0x41, 0xc4, 0x3a, 0x88, 0x50, 0xe2, 0x4e, 0xe3, 0xee, 0x9b, 0x8a, 0x47, 0x5d, 0x22, + 0x62, 0x8d, 0x2c, 0x78, 0x78, 0x03, 0xde, 0x1f, 0x70, 0xa9, 0x28, 0xa7, 0xc4, 0xe3, 0xae, 0x44, + 0xc4, 0x1a, 0xd9, 0xfe, 0xc4, 0x82, 0x39, 0x25, 0x83, 0x7a, 0x87, 0x36, 0xf7, 0x1b, 0x9c, 0xf6, + 0x45, 0x44, 0x3f, 0x60, 0x94, 0x25, 0x23, 0xfa, 0xb7, 0x18, 0x65, 0x58, 0x52, 0x8c, 0xd5, 0x17, + 0xce, 0x6a, 0xf5, 0xf6, 0xdf, 0x5a, 0x30, 0x29, 0x43, 0xe7, 0x3c, 0xfe, 0x27, 0x5e, 0x4e, 0x2a, + 0x8c, 0x54, 0x4e, 0x3a, 0xa1, 0xd0, 0x17, 0x55, 0xb2, 0x26, 0x1e, 0x56, 0xc9, 0xb2, 0x7f, 0x6e, + 0xc1, 0x62, 0x56, 0x75, 0x34, 0xcf, 0xf4, 0x5f, 0x84, 0xe9, 0x7e, 0x97, 0xf0, 0x3d, 0xcf, 0xef, + 0x25, 0xef, 0x58, 0xb6, 0x75, 0x3b, 0x0e, 0x7b, 0x20, 0x1f, 0xc0, 0x0f, 0xd2, 0xb0, 0x20, 0x45, + 0xb9, 0x9e, 0xf7, 0x44, 0x88, 0x97, 0xf5, 0x22, 0x61, 0x85, 0x4d, 0x0c, 0x1b, 0x5c, 0xec, 0x3f, + 0x9e, 0x84, 0x05, 0x39, 0x64, 0xdc, 0x13, 0x62, 0x9c, 0x1d, 0xea, 0xc3, 0x13, 0x32, 0x79, 0x4a, + 0x1f, 0x2a, 0x6a, 0xd3, 0xae, 0xea, 0xf1, 0x4f, 0x6c, 0x66, 0xf6, 0x7a, 0x30, 0x94, 0x82, 0x87, + 0xe0, 0xa6, 0x4f, 0x0a, 0xf8, 0xff, 0x77, 0x52, 0x98, 0xca, 0x36, 0x75, 0xa2, 0xb2, 0x0d, 0x3d, + 0x57, 0xa6, 0x1f, 0xe1, 0x5c, 0x49, 0xfb, 0xfa, 0x72, 0x2e, 0x5f, 0xff, 0xe7, 0x05, 0x98, 0xda, + 0xf6, 0x3d, 0x59, 0x65, 0x3f, 0xfb, 0x82, 0xed, 0x5d, 0x98, 0x60, 0x7d, 0xda, 0xd4, 0x3e, 0xef, + 0xd2, 0x68, 0x96, 0xa6, 0xa7, 0xd7, 0xe8, 0xd3, 0x66, 0x6d, 0x5a, 0xb8, 0x51, 0xf1, 0x0b, 0x4b, + 0x20, 0xa3, 0xf2, 0x58, 0xcc, 0x13, 0x81, 0x07, 0x90, 0x0f, 0xaf, 0x3c, 0x7e, 0x6a, 0x41, 0x45, + 0xf7, 0xfc, 0xda, 0x96, 0xb8, 0xf4, 0xfc, 0x86, 0x94, 0xb8, 0xfe, 0x34, 0x5a, 0x81, 0x10, 0x1a, + 0xfa, 0x6d, 0x58, 0xe8, 0xfb, 0x5e, 0xcf, 0x13, 0x96, 0xba, 0xed, 0x75, 0x9d, 0xa6, 0x43, 0x83, + 0x2a, 0xe9, 0x95, 0x91, 0xf9, 0x19, 0xc3, 0x0f, 0x6b, 0xdf, 0xd0, 0x7c, 0x17, 0xb6, 0x93, 0xb8, + 0x38, 0xcd, 0xca, 0xfe, 0x37, 0x0b, 0x66, 0x63, 0xb2, 0x47, 0x4d, 0x80, 0xa6, 0xe7, 0xb6, 0x1c, + 0x1e, 0x5e, 0x73, 0x57, 0x2e, 0xaf, 0x8d, 0x26, 0xd5, 0x7a, 0x30, 0x2e, 0x52, 0xba, 0xb0, 0x89, + 0x61, 0x03, 0x16, 0xbd, 0x1c, 0xbc, 0x38, 0x89, 0x07, 0x31, 0xea, 0xc5, 0xc9, 0x83, 0xa3, 0xd5, + 0x19, 0x3d, 0x27, 0xf3, 0x05, 0x4a, 0x9e, 0xb7, 0x17, 0x7f, 0x53, 0x80, 0x72, 0xb8, 0xfe, 0xc7, + 0x60, 0x46, 0x6f, 0xc5, 0xcc, 0xe8, 0xe5, 0x9c, 0x3b, 0x27, 0x0d, 0x29, 0x8c, 0x49, 0x0c, 0x63, + 0x7a, 0x3f, 0x61, 0x4c, 0x79, 0x55, 0xe2, 0x04, 0x73, 0xfa, 0x07, 0xb5, 0xf9, 0xaa, 0xef, 0x63, + 0x30, 0xa8, 0x9d, 0xb8, 0x41, 0xad, 0xe5, 0x5c, 0xcd, 0x10, 0x93, 0xfa, 0x91, 0x05, 0x73, 0x09, + 0x23, 0x40, 0xdf, 0x82, 0x49, 0x59, 0x15, 0xd3, 0xfa, 0x15, 0x0e, 0xd4, 0x09, 0xbe, 0xa4, 0xa1, + 0x6d, 0x58, 0x24, 0x03, 0xee, 0x85, 0x63, 0x6f, 0xb8, 0x64, 0xb7, 0x4b, 0x55, 0xd6, 0x3e, 0x5d, + 0xfb, 0x05, 0x3d, 0x66, 0x71, 0x3d, 0xa3, 0x0f, 0xce, 0x1c, 0x69, 0x7f, 0x5e, 0x00, 0x14, 0x36, + 0xe6, 0x29, 0x27, 0xbf, 0x0f, 0x53, 0x7b, 0xaa, 0x10, 0xf4, 0x68, 0xf7, 0x01, 0xb5, 0x8a, 0x79, + 0x25, 0x12, 0x60, 0xa2, 0x77, 0x4e, 0x47, 0x8f, 0x20, 0xad, 0x43, 0xe8, 0x3e, 0xc0, 0x9e, 0xe3, + 0x3a, 0xac, 0x33, 0xe6, 0xcd, 0xa5, 0x3c, 0xcd, 0x6f, 0x86, 0x08, 0xd8, 0x40, 0xb3, 0x3f, 0x2e, + 0x18, 0xfa, 0x29, 0xdd, 0xe5, 0x48, 0xfb, 0xfa, 0x7c, 0x5c, 0x98, 0xe5, 0xf4, 0x5d, 0x91, 0x21, + 0x98, 0x89, 0x03, 0xe2, 0x07, 0x65, 0xeb, 0xd7, 0x72, 0x8a, 0xe5, 0x1e, 0xf1, 0x1d, 0xb1, 0xf1, + 0xd1, 0x96, 0xde, 0x23, 0x3e, 0xc3, 0x12, 0x12, 0x7d, 0x57, 0x4c, 0x95, 0xf6, 0x03, 0x17, 0x9a, + 0xdb, 0x27, 0x70, 0xda, 0x37, 0xd7, 0x47, 0xfb, 0x0c, 0x2b, 0x40, 0xfb, 0xe3, 0x29, 0x43, 0xe1, + 0xb5, 0xd7, 0xbe, 0x03, 0xa8, 0x4b, 0x18, 0xbf, 0x4d, 0xdc, 0x96, 0x50, 0x4f, 0xba, 0xe7, 0x53, + 0xd6, 0xd1, 0x11, 0xda, 0xb2, 0x46, 0x41, 0x5b, 0xa9, 0x1e, 0x38, 0x63, 0x14, 0xba, 0x12, 0x77, + 0xce, 0xab, 0x49, 0xe7, 0x7c, 0x3e, 0xb2, 0xb6, 0xf1, 0xdc, 0xb3, 0xa9, 0xee, 0x93, 0x67, 0xa0, + 0xee, 0xbf, 0x05, 0x0b, 0x7b, 0xc9, 0xbb, 0x43, 0xfd, 0x92, 0xe0, 0xb5, 0x31, 0xaf, 0x1e, 0x6b, + 0x17, 0x8f, 0xa3, 0x0b, 0xa7, 0xa8, 0x19, 0xa7, 0x19, 0x21, 0x2f, 0x78, 0x90, 0x27, 0xb3, 0x4f, + 0x55, 0x58, 0x18, 0xd9, 0xe4, 0x12, 0x79, 0x6b, 0xf2, 0x29, 0x9e, 0x82, 0xc4, 0x31, 0x06, 0x09, + 0x13, 0x2c, 0x9d, 0xa6, 0x09, 0xa2, 0x2b, 0x61, 0x41, 0x5f, 0x4c, 0x47, 0x86, 0xb2, 0xc5, 0x54, + 0x29, 0x5e, 0x90, 0xb0, 0xd9, 0x0f, 0xfd, 0xd8, 0x82, 0x8b, 0x42, 0x59, 0x6f, 0x7c, 0x44, 0x9b, + 0x03, 0x21, 0x95, 0xe0, 0x15, 0xee, 0x52, 0x45, 0x4a, 0x63, 0xc4, 0xe7, 0x89, 0x8d, 0x2c, 0x88, + 0x28, 0x2e, 0xcf, 0x24, 0xe3, 0x6c, 0xc6, 0xe8, 0x03, 0xe9, 0x3a, 0x38, 0x95, 0x69, 0xcf, 0xa3, + 0xa7, 0xf7, 0x65, 0xed, 0x76, 0xb8, 0x72, 0x3b, 0x9c, 0xda, 0x7f, 0x12, 0xf3, 0x56, 0xa3, 0x15, + 0x1d, 0x96, 0xa1, 0x40, 0x58, 0xb2, 0x4c, 0xbc, 0xce, 0x70, 0x81, 0x30, 0xf4, 0x0e, 0x4c, 0xfa, + 0x94, 0xfb, 0x87, 0xda, 0xa9, 0x5e, 0x1d, 0xc3, 0x81, 0x60, 0x31, 0x5e, 0x4d, 0x55, 0xfe, 0xc4, + 0x0a, 0xd1, 0xa8, 0x75, 0x14, 0xcf, 0xac, 0xd6, 0xf1, 0x53, 0xcb, 0x38, 0x0b, 0xc3, 0xc9, 0xa0, + 0xb7, 0x60, 0x8a, 0x3b, 0x3d, 0xea, 0x0d, 0x78, 0xbe, 0x00, 0x23, 0xbc, 0x9c, 0x92, 0x26, 0xbf, + 0xa3, 0x20, 0x70, 0x80, 0x25, 0xb2, 0x2e, 0xea, 0xfb, 0x9e, 0xbf, 0xd3, 0x11, 0x2e, 0xcc, 0xeb, + 0xaa, 0x53, 0x7c, 0x36, 0xca, 0xba, 0x6e, 0xc4, 0xa8, 0x38, 0xd1, 0xdb, 0xfe, 0xdc, 0x0c, 0x85, + 0x76, 0x08, 0xdb, 0x7f, 0x0c, 0x41, 0xe3, 0x3b, 0xb1, 0xa0, 0x31, 0xef, 0xe1, 0x23, 0x26, 0x39, + 0x2c, 0x70, 0xb4, 0x89, 0x21, 0x7b, 0xd1, 0x71, 0xd3, 0xed, 0x0f, 0x46, 0xf9, 0x40, 0xe0, 0x79, + 0x98, 0x6a, 0xd1, 0x3d, 0x32, 0xe8, 0xa6, 0x8e, 0xce, 0x0d, 0xd5, 0x8c, 0x03, 0xba, 0xfd, 0xcf, + 0x16, 0x2c, 0xc4, 0x78, 0x3c, 0x86, 0x00, 0xf2, 0xbd, 0x78, 0x00, 0x39, 0x8e, 0xc8, 0x04, 0xea, + 0x90, 0x40, 0x32, 0xb5, 0x22, 0x19, 0x72, 0x7c, 0x0f, 0x4a, 0x8e, 0x90, 0x1e, 0xcb, 0xf7, 0x60, + 0x31, 0x2d, 0x7e, 0xe3, 0xf6, 0x5c, 0xe2, 0x61, 0x8d, 0x1b, 0x45, 0x0a, 0x85, 0xd3, 0x8e, 0x14, + 0x7c, 0x73, 0x41, 0xfa, 0xd1, 0x3e, 0x7a, 0x5f, 0xab, 0x9d, 0x95, 0xe7, 0xa1, 0x78, 0x0a, 0x66, + 0xa8, 0xea, 0x7d, 0x6e, 0xc1, 0xc5, 0xcc, 0xde, 0x61, 0xb0, 0x55, 0x38, 0xc3, 0x60, 0xcb, 0x3a, + 0x6d, 0x11, 0xde, 0x37, 0x44, 0x18, 0x4c, 0xe1, 0xb4, 0xbe, 0xb4, 0xf9, 0x49, 0x01, 0xe6, 0x31, + 0xed, 0x7b, 0xb1, 0xba, 0xe3, 0x76, 0xf0, 0x3a, 0x36, 0x47, 0xa0, 0x9e, 0xb8, 0xdd, 0xaa, 0x4d, + 0xc5, 0x9e, 0xc5, 0x7e, 0x17, 0x26, 0x65, 0x49, 0x30, 0x9f, 0xa3, 0x49, 0x55, 0x44, 0xd5, 0x39, + 0xa2, 0x6a, 0xab, 0x0a, 0x50, 0x20, 0xcb, 0xc7, 0x1a, 0xfa, 0x18, 0x79, 0x2d, 0xc7, 0xb3, 0x8f, + 0x34, 0xb2, 0x6c, 0xc6, 0x0a, 0xd0, 0xfe, 0xa4, 0x00, 0x2a, 0xa8, 0x7f, 0x0c, 0x7e, 0xf8, 0xd7, + 0x63, 0x7e, 0x78, 0x6d, 0xd4, 0xd0, 0x44, 0x88, 0x67, 0x58, 0xe2, 0x9e, 0x4c, 0xb8, 0x2e, 0xe5, + 0x01, 0x7d, 0x78, 0xd2, 0xfe, 0xf7, 0x16, 0x94, 0x65, 0xbf, 0xc7, 0xe0, 0x6f, 0xb7, 0xe3, 0xfe, + 0xf6, 0x85, 0x1c, 0xab, 0x18, 0xe2, 0x63, 0x3f, 0x2e, 0xea, 0xd9, 0x87, 0xe9, 0x5c, 0x87, 0xf8, + 0x2d, 0x9d, 0xa8, 0x44, 0x16, 0x28, 0x1a, 0xb1, 0xa2, 0xa1, 0xdf, 0x50, 0xef, 0x5a, 0x28, 0xe3, + 0xb4, 0x75, 0x33, 0xcc, 0x1a, 0x8a, 0xb9, 0x1f, 0xe8, 0xe8, 0x47, 0x44, 0x51, 0xc1, 0x1a, 0x27, + 0x50, 0x71, 0x8a, 0x8f, 0xc8, 0x24, 0xfa, 0x49, 0x5f, 0xa6, 0x23, 0xec, 0xd7, 0xc6, 0x74, 0x9c, + 0x2a, 0x93, 0x48, 0x35, 0xe3, 0x34, 0x23, 0xd4, 0x81, 0x19, 0xf3, 0x69, 0xa1, 0xd6, 0xa5, 0xcb, + 0xf9, 0xdf, 0x30, 0xaa, 0x0b, 0x4a, 0xb3, 0x05, 0xc7, 0x90, 0xed, 0xa3, 0x12, 0x54, 0x0c, 0xe5, + 0x4b, 0x14, 0x01, 0x67, 0xcf, 0xa6, 0x08, 0x98, 0x9d, 0xb3, 0x56, 0xc6, 0xca, 0x59, 0x2f, 0xc5, + 0x73, 0xd6, 0x6f, 0x26, 0x73, 0x56, 0x90, 0xab, 0x8b, 0xe5, 0xab, 0x0c, 0xce, 0xeb, 0xe4, 0x2d, + 0x78, 0x23, 0x9a, 0xab, 0x0a, 0x90, 0x4e, 0x11, 0x91, 0x88, 0x33, 0x6f, 0xc6, 0x20, 0x71, 0x82, + 0x85, 0x88, 0x53, 0x75, 0x4b, 0x63, 0xd0, 0xeb, 0x11, 0xff, 0x70, 0x69, 0x46, 0x4e, 0x38, 0x8c, + 0x53, 0x6f, 0xc6, 0xa8, 0x38, 0xd1, 0x1b, 0x6d, 0x43, 0x49, 0xe5, 0x7e, 0xfa, 0xdd, 0xe1, 0x8b, + 0x79, 0xd2, 0x4a, 0x15, 0xa7, 0xab, 0xdf, 0x58, 0xe3, 0x98, 0x69, 0x7b, 0xf9, 0x84, 0xb4, 0xfd, + 0x0e, 0x20, 0x6f, 0x57, 0x66, 0x04, 0xad, 0x5b, 0xea, 0x93, 0x54, 0xa1, 0x95, 0x25, 0x99, 0x13, + 0x86, 0x1b, 0x76, 0x37, 0xd5, 0x03, 0x67, 0x8c, 0x12, 0x56, 0xad, 0x13, 0xc6, 0xd0, 0x14, 0x74, + 0x8a, 0x9e, 0x37, 0xc0, 0x8a, 0xaa, 0x01, 0xf2, 0xdd, 0x5a, 0x3d, 0x81, 0x8a, 0x53, 0x7c, 0xd0, + 0x87, 0x30, 0x2b, 0x54, 0x28, 0x62, 0x0c, 0x8f, 0xc8, 0x78, 0xe1, 0xf8, 0x68, 0x75, 0x76, 0xcb, + 0x84, 0xc4, 0x71, 0x0e, 0xf6, 0x1f, 0x15, 0x21, 0x3b, 0x5d, 0x8d, 0x9e, 0xcc, 0x5b, 0x0f, 0x79, + 0x32, 0xff, 0x36, 0x94, 0x19, 0x27, 0xbe, 0xfa, 0x3c, 0xa0, 0x30, 0xde, 0xe7, 0x01, 0x8d, 0x00, + 0x00, 0x47, 0x58, 0x89, 0xda, 0x41, 0xf1, 0x54, 0x6b, 0x07, 0x97, 0x01, 0x64, 0x96, 0x55, 0xf7, + 0x06, 0xfa, 0xb6, 0x70, 0x36, 0xf2, 0x09, 0x37, 0x42, 0x0a, 0x36, 0x7a, 0xa1, 0xab, 0xe1, 0xc1, + 0xa9, 0xae, 0x07, 0x9f, 0x4e, 0x3d, 0x6f, 0x48, 0x56, 0x9f, 0x32, 0xbe, 0xcc, 0x3c, 0xe1, 0x39, + 0x94, 0xfd, 0xbf, 0x05, 0x88, 0x39, 0x43, 0xf4, 0x23, 0x0b, 0x16, 0x48, 0xe2, 0xe3, 0xd6, 0x20, + 0x96, 0xfc, 0xb5, 0x7c, 0x5f, 0x1c, 0xa7, 0xbe, 0x8d, 0x8d, 0x2e, 0x64, 0x92, 0x5d, 0x18, 0x4e, + 0x33, 0x45, 0x7f, 0x60, 0xc1, 0x05, 0x92, 0xfe, 0x7a, 0x59, 0x6f, 0xfa, 0xeb, 0x63, 0x7f, 0xfe, + 0x5c, 0x7b, 0xf2, 0xf8, 0x68, 0x35, 0xeb, 0xbb, 0x6e, 0x9c, 0xc5, 0x0e, 0xbd, 0x0b, 0x13, 0xc4, + 0x6f, 0x07, 0xc5, 0xcb, 0xfc, 0x6c, 0x83, 0x8f, 0xd2, 0xa3, 0xe8, 0x68, 0xdd, 0x6f, 0x33, 0x2c, + 0x41, 0xed, 0x9f, 0x15, 0x61, 0x3e, 0xf9, 0xc4, 0x5e, 0xbf, 0x98, 0x9b, 0xc8, 0x7c, 0x31, 0x27, + 0x6c, 0xa4, 0xc9, 0xc3, 0xe7, 0x6b, 0x91, 0x8d, 0x88, 0x46, 0xac, 0x68, 0xa1, 0x8d, 0xc8, 0x87, + 0xaf, 0x93, 0x8f, 0x60, 0x23, 0xf2, 0xb5, 0x6b, 0x84, 0x85, 0xae, 0xc6, 0xcf, 0x16, 0x3b, 0x79, + 0xb6, 0x2c, 0x98, 0x6b, 0x19, 0xb7, 0x24, 0xda, 0x83, 0x8a, 0xb1, 0x0f, 0xda, 0x12, 0xaf, 0xe5, + 0x96, 0x7b, 0xa4, 0x76, 0x73, 0xea, 0xcb, 0xf6, 0x88, 0x62, 0xe2, 0x47, 0x76, 0x2f, 0xa5, 0xf5, + 0x48, 0x35, 0x43, 0x29, 0x2e, 0x03, 0xcd, 0xfe, 0x77, 0x0b, 0x66, 0x63, 0xcf, 0x38, 0x05, 0xb7, + 0xe0, 0xb9, 0xec, 0xf8, 0xdf, 0x7a, 0xdf, 0x0b, 0x11, 0xb0, 0x81, 0x86, 0xbe, 0x0f, 0x95, 0xae, + 0xe7, 0xb6, 0x29, 0xe3, 0x0d, 0x8f, 0xec, 0x6b, 0x3b, 0xc9, 0x5b, 0x54, 0x5a, 0x3a, 0x3e, 0x5a, + 0x5d, 0xdc, 0x52, 0x30, 0x75, 0xaf, 0xd7, 0xef, 0x52, 0xae, 0xde, 0x39, 0x63, 0x13, 0x5c, 0x5e, + 0x2b, 0xbe, 0x4d, 0x7c, 0xda, 0xf1, 0x06, 0x8c, 0x7e, 0x5d, 0xaf, 0x15, 0xc3, 0x09, 0x9e, 0xf6, + 0xb5, 0x62, 0x04, 0x7c, 0xf2, 0xb5, 0x62, 0xd8, 0xf7, 0x6b, 0x7b, 0xad, 0x18, 0xce, 0x70, 0x48, + 0xa6, 0xf2, 0x3f, 0x05, 0x63, 0x15, 0xf1, 0x6c, 0xa5, 0xf0, 0x90, 0x6c, 0xe5, 0x3d, 0x98, 0x76, + 0x5c, 0x4e, 0xfd, 0x03, 0xd2, 0xd5, 0x85, 0xdb, 0xbc, 0xba, 0x18, 0x2e, 0x75, 0x53, 0xe3, 0xe0, + 0x10, 0x11, 0x75, 0xe1, 0x62, 0x70, 0xe1, 0xe0, 0x53, 0x12, 0x5d, 0x78, 0xea, 0x47, 0x43, 0xaf, + 0x06, 0x95, 0xf1, 0x9b, 0x59, 0x9d, 0x1e, 0x0c, 0x23, 0xe0, 0x6c, 0x50, 0xc4, 0x60, 0x96, 0x19, + 0x69, 0x7a, 0x70, 0x22, 0x8e, 0x78, 0x59, 0x93, 0xac, 0x6c, 0x18, 0x2f, 0x8d, 0x4c, 0x50, 0x1c, + 0xe7, 0x61, 0xff, 0x4b, 0x11, 0xe6, 0x12, 0x9a, 0x96, 0x48, 0x47, 0xca, 0x8f, 0x33, 0x1d, 0x29, + 0x8d, 0x95, 0x8e, 0x64, 0x47, 0xca, 0x13, 0x63, 0x45, 0xca, 0x6f, 0xa8, 0x68, 0x55, 0xef, 0xdc, + 0xe6, 0x86, 0x7e, 0x98, 0x1d, 0x4a, 0x73, 0xcb, 0x24, 0xe2, 0x78, 0x5f, 0x19, 0x4e, 0xb4, 0xd2, + 0x5f, 0x7a, 0xeb, 0x50, 0xfb, 0xf5, 0xbc, 0x2f, 0xeb, 0x42, 0x00, 0x15, 0x4e, 0x64, 0x10, 0x70, + 0x16, 0xbb, 0xda, 0x9d, 0xcf, 0xbe, 0x5a, 0x39, 0xf7, 0xc5, 0x57, 0x2b, 0xe7, 0xbe, 0xfc, 0x6a, + 0xe5, 0xdc, 0x0f, 0x8f, 0x57, 0xac, 0xcf, 0x8e, 0x57, 0xac, 0x2f, 0x8e, 0x57, 0xac, 0x2f, 0x8f, + 0x57, 0xac, 0xff, 0x3c, 0x5e, 0xb1, 0x7e, 0xfc, 0xf3, 0x95, 0x73, 0xf7, 0x9f, 0x19, 0xe5, 0x7f, + 0x09, 0xfd, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe3, 0x05, 0xa2, 0xb7, 0x72, 0x48, 0x00, 0x00, } func (m *AnalysisRunArgument) Marshal() (dAtA []byte, err error) { @@ -4349,6 +4471,180 @@ func (m *PromotionStepRetry) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *PromotionTask) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PromotionTask) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PromotionTask) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *PromotionTaskInput) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PromotionTaskInput) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PromotionTaskInput) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Default) + copy(dAtA[i:], m.Default) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Default))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *PromotionTaskList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PromotionTaskList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PromotionTaskList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *PromotionTaskSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PromotionTaskSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PromotionTaskSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Steps) > 0 { + for iNdEx := len(m.Steps) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Steps[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Inputs) > 0 { + for iNdEx := len(m.Inputs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Inputs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *PromotionTemplate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6165,18 +6461,82 @@ func (m *PromotionStepRetry) Size() (n int) { return n } -func (m *PromotionTemplate) Size() (n int) { +func (m *PromotionTask) Size() (n int) { if m == nil { return 0 } var l int _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) l = m.Spec.Size() n += 1 + l + sovGenerated(uint64(l)) return n } -func (m *PromotionTemplateSpec) Size() (n int) { +func (m *PromotionTaskInput) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Default) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *PromotionTaskList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *PromotionTaskSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Inputs) > 0 { + for _, e := range m.Inputs { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Steps) > 0 { + for _, e := range m.Steps { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *PromotionTemplate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *PromotionTemplateSpec) Size() (n int) { if m == nil { return 0 } @@ -7204,6 +7564,65 @@ func (this *PromotionStepRetry) String() string { }, "") return s } +func (this *PromotionTask) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PromotionTask{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "PromotionTaskSpec", "PromotionTaskSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *PromotionTaskInput) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PromotionTaskInput{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Default:` + fmt.Sprintf("%v", this.Default) + `,`, + `}`, + }, "") + return s +} +func (this *PromotionTaskList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]PromotionTaskList{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "PromotionTaskList", "PromotionTaskList", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&PromotionTaskList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *PromotionTaskSpec) String() string { + if this == nil { + return "nil" + } + repeatedStringForInputs := "[]PromotionTaskInput{" + for _, f := range this.Inputs { + repeatedStringForInputs += strings.Replace(strings.Replace(f.String(), "PromotionTaskInput", "PromotionTaskInput", 1), `&`, ``, 1) + "," + } + repeatedStringForInputs += "}" + repeatedStringForSteps := "[]PromotionStep{" + for _, f := range this.Steps { + repeatedStringForSteps += strings.Replace(strings.Replace(f.String(), "PromotionStep", "PromotionStep", 1), `&`, ``, 1) + "," + } + repeatedStringForSteps += "}" + s := strings.Join([]string{`&PromotionTaskSpec{`, + `Inputs:` + repeatedStringForInputs + `,`, + `Steps:` + repeatedStringForSteps + `,`, + `}`, + }, "") + return s +} func (this *PromotionTemplate) String() string { if this == nil { return "nil" @@ -15156,6 +15575,471 @@ func (m *PromotionStepRetry) Unmarshal(dAtA []byte) error { } return nil } +func (m *PromotionTask) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PromotionTask: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PromotionTask: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", 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.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", 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.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PromotionTaskInput) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PromotionTaskInput: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PromotionTaskInput: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Default", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Default = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PromotionTaskList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PromotionTaskList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PromotionTaskList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", 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.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", 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 + } + m.Items = append(m.Items, PromotionTaskList{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PromotionTaskSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PromotionTaskSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PromotionTaskSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Inputs", 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 + } + m.Inputs = append(m.Inputs, PromotionTaskInput{}) + if err := m.Inputs[len(m.Inputs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Steps", 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 + } + m.Steps = append(m.Steps, PromotionStep{}) + if err := m.Steps[len(m.Steps)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *PromotionTemplate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/api/v1alpha1/generated.proto b/api/v1alpha1/generated.proto index 6f21de986..266b7d8c6 100644 --- a/api/v1alpha1/generated.proto +++ b/api/v1alpha1/generated.proto @@ -992,6 +992,59 @@ message PromotionStepRetry { optional uint32 errorThreshold = 2; } +message PromotionTask { + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Spec describes the composition of a PromotionTask, including the inputs + // available to the task and the steps. + // + // +kubebuilder:validation:Required + optional PromotionTaskSpec spec = 2; +} + +// PromotionTaskInput defines an input parameter for a PromotionTask. This input +// can be specified in the PromotionTemplate as configuration for the task, and +// can be used in the Steps to parameterize the execution of the task. +message PromotionTaskInput { + // Name of the configuration parameter, which should be unique within the + // PromotionTask. This name can be used to reference the parameter in the + // PromotionTaskSpec.Steps. + // + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + optional string name = 1; + + // Default specifies a default value for the parameter. This value will be + // used if the parameter is not specified in the PromotionTemplate. + // If left unspecified, the input value is required to be specified in the + // configuration of the step referencing this task. + // + // +kubebuilder:validation:Optional + optional string default = 2; +} + +// PromotionTaskList contains a list of PromotionTasks. +message PromotionTaskList { + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + repeated PromotionTaskList items = 2; +} + +message PromotionTaskSpec { + // Inputs specifies the inputs available to the PromotionTask. These inputs + // can be specified in the PromotionTemplate as configuration for the task, + // and can be used in the Steps to parameterize the execution of the task. + repeated PromotionTaskInput inputs = 1; + + // Steps specifies the directives to be executed as part of this + // PromotionTask. The steps as defined here are deflated into a + // Promotion when it is built from a PromotionTemplate. + // + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinItems=1 + repeated PromotionStep steps = 2; +} + // PromotionTemplate defines a template for a Promotion that can be used to // incorporate Freight into a Stage. message PromotionTemplate { diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index ef0de2f62..6e0f912eb 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -1053,6 +1053,106 @@ func (in *PromotionStepRetry) DeepCopy() *PromotionStepRetry { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PromotionTask) DeepCopyInto(out *PromotionTask) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PromotionTask. +func (in *PromotionTask) DeepCopy() *PromotionTask { + if in == nil { + return nil + } + out := new(PromotionTask) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *PromotionTask) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PromotionTaskInput) DeepCopyInto(out *PromotionTaskInput) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PromotionTaskInput. +func (in *PromotionTaskInput) DeepCopy() *PromotionTaskInput { + if in == nil { + return nil + } + out := new(PromotionTaskInput) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PromotionTaskList) DeepCopyInto(out *PromotionTaskList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]PromotionTaskList, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PromotionTaskList. +func (in *PromotionTaskList) DeepCopy() *PromotionTaskList { + if in == nil { + return nil + } + out := new(PromotionTaskList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *PromotionTaskList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PromotionTaskSpec) DeepCopyInto(out *PromotionTaskSpec) { + *out = *in + if in.Inputs != nil { + in, out := &in.Inputs, &out.Inputs + *out = make([]PromotionTaskInput, len(*in)) + copy(*out, *in) + } + if in.Steps != nil { + in, out := &in.Steps, &out.Steps + *out = make([]PromotionStep, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PromotionTaskSpec. +func (in *PromotionTaskSpec) DeepCopy() *PromotionTaskSpec { + if in == nil { + return nil + } + out := new(PromotionTaskSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PromotionTemplate) DeepCopyInto(out *PromotionTemplate) { *out = *in diff --git a/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml b/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml new file mode 100644 index 000000000..37082f630 --- /dev/null +++ b/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml @@ -0,0 +1,160 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.17.0 + name: promotiontasks.kargo.akuity.io +spec: + group: kargo.akuity.io + names: + kind: PromotionTask + listKind: PromotionTaskList + plural: promotiontasks + shortNames: + - promotask + - promotasks + singular: promotiontask + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: |- + Spec describes the composition of a PromotionTask, including the inputs + available to the task and the steps. + properties: + inputs: + description: |- + Inputs specifies the inputs available to the PromotionTask. These inputs + can be specified in the PromotionTemplate as configuration for the task, + and can be used in the Steps to parameterize the execution of the task. + items: + description: |- + PromotionTaskInput defines an input parameter for a PromotionTask. This input + can be specified in the PromotionTemplate as configuration for the task, and + can be used in the Steps to parameterize the execution of the task. + properties: + default: + description: |- + Default specifies a default value for the parameter. This value will be + used if the parameter is not specified in the PromotionTemplate. + If left unspecified, the input value is required to be specified in the + configuration of the step referencing this task. + type: string + name: + description: |- + Name of the configuration parameter, which should be unique within the + PromotionTask. This name can be used to reference the parameter in the + PromotionTaskSpec.Steps. + minLength: 1 + type: string + required: + - name + type: object + type: array + steps: + description: |- + Steps specifies the directives to be executed as part of this + PromotionTask. The steps as defined here are deflated into a + Promotion when it is built from a PromotionTemplate. + items: + description: PromotionStep describes a directive to be executed + as part of a Promotion. + properties: + as: + description: As is the alias this step can be referred to as. + type: string + config: + description: |- + Config is opaque configuration for the PromotionStep that is understood + only by each PromotionStep's implementation. It is legal to utilize + expressions in defining values at any level of this block. + See https://docs.kargo.io/references/expression-language for details. + x-kubernetes-preserve-unknown-fields: true + retry: + description: Retry is the retry policy for this step. + properties: + errorThreshold: + description: |- + ErrorThreshold is the number of consecutive times the step must fail (for + any reason) before retries are abandoned and the entire Promotion is marked + as failed. + + If this field is set to 0, the effective default will be a step-specific + one. If no step-specific default exists (i.e. is also 0), the effective + default will be the system-wide default of 1. + + A value of 1 will cause the Promotion to be marked as failed after just + a single failure; i.e. no retries will be attempted. + + There is no option to specify an infinite number of retries using a value + such as -1. + + In a future release, Kargo is likely to become capable of distinguishing + between recoverable and non-recoverable step failures. At that time, it is + planned that unrecoverable failures will not be subject to this threshold + and will immediately cause the Promotion to be marked as failed without + further condition. + format: int32 + type: integer + timeout: + description: |- + Timeout is the soft maximum interval in which a step that returns a Running + status (which typically indicates it's waiting for something to happen) + may be retried. + + The maximum is a soft one because the check for whether the interval has + elapsed occurs AFTER the step has run. This effectively means a step may + run ONCE beyond the close of the interval. + + If this field is set to nil, the effective default will be a step-specific + one. If no step-specific default exists (i.e. is also nil), the effective + default will be the system-wide default of 0. + + A value of 0 will cause the step to be retried indefinitely unless the + ErrorThreshold is reached. + type: string + type: object + uses: + description: Uses identifies a runner that can execute this + step. + minLength: 1 + type: string + required: + - uses + type: object + minItems: 1 + type: array + required: + - steps + type: object + required: + - spec + type: object + served: true + storage: true + subresources: {} diff --git a/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json new file mode 100644 index 000000000..1be3e7d38 --- /dev/null +++ b/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json @@ -0,0 +1,95 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object.\nServers should convert recognized schemas to the latest internal value, and\nmay reject unrecognized values.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents.\nServers may infer this from the endpoint the client submits requests to.\nCannot be updated.\nIn CamelCase.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "type": "object" + }, + "spec": { + "description": "Spec describes the composition of a PromotionTask, including the inputs\navailable to the task and the steps.", + "properties": { + "inputs": { + "description": "Inputs specifies the inputs available to the PromotionTask. These inputs\ncan be specified in the PromotionTemplate as configuration for the task,\nand can be used in the Steps to parameterize the execution of the task.", + "items": { + "description": "PromotionTaskInput defines an input parameter for a PromotionTask. This input\ncan be specified in the PromotionTemplate as configuration for the task, and\ncan be used in the Steps to parameterize the execution of the task.", + "properties": { + "default": { + "description": "Default specifies a default value for the parameter. This value will be\nused if the parameter is not specified in the PromotionTemplate.\nIf left unspecified, the input value is required to be specified in the\nconfiguration of the step referencing this task.", + "type": "string" + }, + "name": { + "description": "Name of the configuration parameter, which should be unique within the\nPromotionTask. This name can be used to reference the parameter in the\nPromotionTaskSpec.Steps.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" + }, + "steps": { + "description": "Steps specifies the directives to be executed as part of this\nPromotionTask. The steps as defined here are deflated into a\nPromotion when it is built from a PromotionTemplate.", + "items": { + "description": "PromotionStep describes a directive to be executed as part of a Promotion.", + "properties": { + "as": { + "description": "As is the alias this step can be referred to as.", + "type": "string" + }, + "config": { + "description": "Config is opaque configuration for the PromotionStep that is understood\nonly by each PromotionStep's implementation. It is legal to utilize\nexpressions in defining values at any level of this block.\nSee https://docs.kargo.io/references/expression-language for details.", + "x-kubernetes-preserve-unknown-fields": true + }, + "retry": { + "description": "Retry is the retry policy for this step.", + "properties": { + "errorThreshold": { + "description": "ErrorThreshold is the number of consecutive times the step must fail (for\nany reason) before retries are abandoned and the entire Promotion is marked\nas failed.\n\nIf this field is set to 0, the effective default will be a step-specific\none. If no step-specific default exists (i.e. is also 0), the effective\ndefault will be the system-wide default of 1.\n\nA value of 1 will cause the Promotion to be marked as failed after just\na single failure; i.e. no retries will be attempted.\n\nThere is no option to specify an infinite number of retries using a value\nsuch as -1.\n\nIn a future release, Kargo is likely to become capable of distinguishing\nbetween recoverable and non-recoverable step failures. At that time, it is\nplanned that unrecoverable failures will not be subject to this threshold\nand will immediately cause the Promotion to be marked as failed without\nfurther condition.", + "format": "int32", + "maximum": 2147483647, + "minimum": -2147483648, + "type": "integer" + }, + "timeout": { + "description": "Timeout is the soft maximum interval in which a step that returns a Running\nstatus (which typically indicates it's waiting for something to happen)\nmay be retried.\n\nThe maximum is a soft one because the check for whether the interval has\nelapsed occurs AFTER the step has run. This effectively means a step may\nrun ONCE beyond the close of the interval.\n\nIf this field is set to nil, the effective default will be a step-specific\none. If no step-specific default exists (i.e. is also nil), the effective\ndefault will be the system-wide default of 0.\n\nA value of 0 will cause the step to be retried indefinitely unless the\nErrorThreshold is reached.", + "type": "string" + } + }, + "type": "object" + }, + "uses": { + "description": "Uses identifies a runner that can execute this step.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "uses" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "steps" + ], + "type": "object" + } + }, + "required": [ + "spec" + ], + "type": "object" +} \ No newline at end of file diff --git a/ui/src/gen/v1alpha1/generated_pb.ts b/ui/src/gen/v1alpha1/generated_pb.ts index 559377fc9..9e88f3715 100644 --- a/ui/src/gen/v1alpha1/generated_pb.ts +++ b/ui/src/gen/v1alpha1/generated_pb.ts @@ -18,7 +18,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file v1alpha1/generated.proto. */ export const file_v1alpha1_generated: GenFile = /*@__PURE__*/ - fileDesc("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUiSQoMQ3VycmVudFN0YWdlEjkKBXNpbmNlGAEgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUitgIKE0Rpc2NvdmVyZWRBcnRpZmFjdHMSQAoMZGlzY292ZXJlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSRQoDZ2l0GAEgAygLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkdpdERpc2NvdmVyeVJlc3VsdBJKCgZpbWFnZXMYAiADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2VEaXNjb3ZlcnlSZXN1bHQSSgoGY2hhcnRzGAMgAygLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0RGlzY292ZXJ5UmVzdWx0IrABChBEaXNjb3ZlcmVkQ29tbWl0EgoKAmlkGAEgASgJEg4KBmJyYW5jaBgCIAEoCRILCgN0YWcYAyABKAkSDwoHc3ViamVjdBgEIAEoCRIOCgZhdXRob3IYBSABKAkSEQoJY29tbWl0dGVyGAYgASgJEj8KC2NyZWF0b3JEYXRlGAcgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiigEKGERpc2NvdmVyZWRJbWFnZVJlZmVyZW5jZRILCgN0YWcYASABKAkSDgoGZGlnZXN0GAIgASgJEhIKCmdpdFJlcG9VUkwYAyABKAkSPQoJY3JlYXRlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiogMKB0ZyZWlnaHQSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRINCgVhbGlhcxgHIAEoCRJDCgZvcmlnaW4YCSABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodE9yaWdpbhJACgdjb21taXRzGAMgAygLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkdpdENvbW1pdBI7CgZpbWFnZXMYBCADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2USOwoGY2hhcnRzGAUgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0EkMKBnN0YXR1cxgGIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U3RhdHVzIq0CChFGcmVpZ2h0Q29sbGVjdGlvbhIKCgJpZBgDIAEoCRJRCgVpdGVtcxgBIAMoCzJCLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0Q29sbGVjdGlvbi5JdGVtc0VudHJ5ElMKE3ZlcmlmaWNhdGlvbkhpc3RvcnkYAiADKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpY2F0aW9uSW5mbxpkCgpJdGVtc0VudHJ5EgsKA2tleRgBIAEoCRJFCgV2YWx1ZRgCIAEoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVmZXJlbmNlOgI4ASKNAQoLRnJlaWdodExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodCIrCg1GcmVpZ2h0T3JpZ2luEgwKBGtpbmQYASABKAkSDAoEbmFtZRgCIAEoCSKhAgoQRnJlaWdodFJlZmVyZW5jZRIMCgRuYW1lGAEgASgJEkMKBm9yaWdpbhgIIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgDIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBCADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQinAEKDkZyZWlnaHRSZXF1ZXN0EkMKBm9yaWdpbhgBIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkUKB3NvdXJjZXMYAiABKAsyNC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFNvdXJjZXMiegoORnJlaWdodFNvdXJjZXMSDgoGZGlyZWN0GAEgASgIEg4KBnN0YWdlcxgCIAMoCRJIChByZXF1aXJlZFNvYWtUaW1lGAMgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uItcECg1GcmVpZ2h0U3RhdHVzElkKC2N1cnJlbnRseUluGAMgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQ3VycmVudGx5SW5FbnRyeRJXCgp2ZXJpZmllZEluGAEgAygLMkMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuVmVyaWZpZWRJbkVudHJ5ElkKC2FwcHJvdmVkRm9yGAIgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQXBwcm92ZWRGb3JFbnRyeRpmChBDdXJyZW50bHlJbkVudHJ5EgsKA2tleRgBIAEoCRJBCgV2YWx1ZRgCIAEoCzIyLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DdXJyZW50U3RhZ2U6AjgBGmYKD1ZlcmlmaWVkSW5FbnRyeRILCgNrZXkYASABKAkSQgoFdmFsdWUYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpZWRTdGFnZToCOAEaZwoQQXBwcm92ZWRGb3JFbnRyeRILCgNrZXkYASABKAkSQgoFdmFsdWUYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXBwcm92ZWRTdGFnZToCOAEieQoJR2l0Q29tbWl0Eg8KB3JlcG9VUkwYASABKAkSCgoCaWQYAiABKAkSDgoGYnJhbmNoGAMgASgJEgsKA3RhZxgEIAEoCRIPCgdtZXNzYWdlGAYgASgJEg4KBmF1dGhvchgHIAEoCRIRCgljb21taXR0ZXIYCCABKAkibgoSR2l0RGlzY292ZXJ5UmVzdWx0Eg8KB3JlcG9VUkwYASABKAkSRwoHY29tbWl0cxgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQ29tbWl0Io4CCg9HaXRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIfChdjb21taXRTZWxlY3Rpb25TdHJhdGVneRgCIAEoCRIOCgZicmFuY2gYAyABKAkSFQoNc3RyaWN0U2VtdmVycxgLIAEoCBIYChBzZW12ZXJDb25zdHJhaW50GAQgASgJEhEKCWFsbG93VGFncxgFIAEoCRISCgppZ25vcmVUYWdzGAYgAygJEh0KFWluc2VjdXJlU2tpcFRMU1ZlcmlmeRgHIAEoCBIUCgxpbmNsdWRlUGF0aHMYCCADKAkSFAoMZXhjbHVkZVBhdGhzGAkgAygJEhYKDmRpc2NvdmVyeUxpbWl0GAogASgFIsgBCgZIZWFsdGgSDgoGc3RhdHVzGAEgASgJEg4KBmlzc3VlcxgCIAMoCRJOCgZjb25maWcYBCABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OEk4KBm91dHB1dBgFIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ibwoPSGVhbHRoQ2hlY2tTdGVwEgwKBHVzZXMYASABKAkSTgoGY29uZmlnGAIgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJJCgVJbWFnZRIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSCwoDdGFnGAMgASgJEg4KBmRpZ2VzdBgEIAEoCSKNAQoUSW1hZ2VEaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIQCghwbGF0Zm9ybRgCIAEoCRJSCgpyZWZlcmVuY2VzGAMgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRJbWFnZVJlZmVyZW5jZSL5AQoRSW1hZ2VTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRISCgpnaXRSZXBvVVJMGAIgASgJEh4KFmltYWdlU2VsZWN0aW9uU3RyYXRlZ3kYAyABKAkSFQoNc3RyaWN0U2VtdmVycxgKIAEoCBIYChBzZW12ZXJDb25zdHJhaW50GAQgASgJEhEKCWFsbG93VGFncxgFIAEoCRISCgppZ25vcmVUYWdzGAYgAygJEhAKCHBsYXRmb3JtGAcgASgJEh0KFWluc2VjdXJlU2tpcFRMU1ZlcmlmeRgIIAEoCBIWCg5kaXNjb3ZlcnlMaW1pdBgJIAEoBSLTAQoHUHJvamVjdBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEj8KBHNwZWMYAiABKAsyMS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFNwZWMSQwoGc3RhdHVzGAMgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3RTdGF0dXMijQEKC1Byb2plY3RMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjwKBWl0ZW1zGAIgAygLMi0uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3QiXwoLUHJvamVjdFNwZWMSUAoRcHJvbW90aW9uUG9saWNpZXMYASADKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUG9saWN5InQKDVByb2plY3RTdGF0dXMSQwoKY29uZGl0aW9ucxgDIAMoCzIvLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5Db25kaXRpb24SDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCSLZAQoJUHJvbW90aW9uEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESQQoEc3BlYxgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TcGVjEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGF0dXMikQEKDVByb21vdGlvbkxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPgoFaXRlbXMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uIj4KD1Byb21vdGlvblBvbGljeRINCgVzdGFnZRgBIAEoCRIcChRhdXRvUHJvbW90aW9uRW5hYmxlZBgCIAEoCCLyAQoSUHJvbW90aW9uUmVmZXJlbmNlEgwKBG5hbWUYASABKAkSRwoHZnJlaWdodBgCIAEoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVmZXJlbmNlEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGF0dXMSPgoKZmluaXNoZWRBdBgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIroBCg1Qcm9tb3Rpb25TcGVjEg0KBXN0YWdlGAEgASgJEg8KB2ZyZWlnaHQYAiABKAkSRQoEdmFycxgEIAMoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25WYXJpYWJsZRJCCgVzdGVwcxgDIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwIrcECg9Qcm9tb3Rpb25TdGF0dXMSGgoSbGFzdEhhbmRsZWRSZWZyZXNoGAQgASgJEg0KBXBoYXNlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSRwoHZnJlaWdodBgFIAEoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVmZXJlbmNlElIKEWZyZWlnaHRDb2xsZWN0aW9uGAcgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uEksKDGhlYWx0aENoZWNrcxgIIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5IZWFsdGhDaGVja1N0ZXASPgoKZmluaXNoZWRBdBgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhMKC2N1cnJlbnRTdGVwGAkgASgDEloKFXN0ZXBFeGVjdXRpb25NZXRhZGF0YRgLIAMoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGVwRXhlY3V0aW9uTWV0YWRhdGESTQoFc3RhdGUYCiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIsIBCg1Qcm9tb3Rpb25TdGVwEgwKBHVzZXMYASABKAkSCgoCYXMYAiABKAkSRwoFcmV0cnkYBCABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcFJldHJ5Ek4KBmNvbmZpZxgDIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ibQoSUHJvbW90aW9uU3RlcFJldHJ5Ej8KB3RpbWVvdXQYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SFgoOZXJyb3JUaHJlc2hvbGQYAiABKA0iXgoRUHJvbW90aW9uVGVtcGxhdGUSSQoEc3BlYxgBIAEoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZVNwZWMiogEKFVByb21vdGlvblRlbXBsYXRlU3BlYxJFCgR2YXJzGAIgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAEgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAiMAoRUHJvbW90aW9uVmFyaWFibGUSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSLmAQoQUmVwb1N1YnNjcmlwdGlvbhJCCgNnaXQYASABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0U3Vic2NyaXB0aW9uEkYKBWltYWdlGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlU3Vic2NyaXB0aW9uEkYKBWNoYXJ0GAMgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0U3Vic2NyaXB0aW9uIs0BCgVTdGFnZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEj0KBHNwZWMYAiABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2VTcGVjEkEKBnN0YXR1cxgDIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVN0YXR1cyKJAQoJU3RhZ2VMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjoKBWl0ZW1zGAIgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlIogCCglTdGFnZVNwZWMSDQoFc2hhcmQYBCABKAkSTgoQcmVxdWVzdGVkRnJlaWdodBgFIAMoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVxdWVzdBJSChFwcm9tb3Rpb25UZW1wbGF0ZRgGIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZRJICgx2ZXJpZmljYXRpb24YAyABKAsyMi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpY2F0aW9uIvYDCgtTdGFnZVN0YXR1cxJDCgpjb25kaXRpb25zGA0gAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYCyABKAkSDQoFcGhhc2UYASABKAkSTwoOZnJlaWdodEhpc3RvcnkYBCADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SFgoOZnJlaWdodFN1bW1hcnkYDCABKAkSPAoGaGVhbHRoGAggASgLMiwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aBIPCgdtZXNzYWdlGAkgASgJEhoKEm9ic2VydmVkR2VuZXJhdGlvbhgGIAEoAxJSChBjdXJyZW50UHJvbW90aW9uGAcgASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZRJPCg1sYXN0UHJvbW90aW9uGAogASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZSLaAQoVU3RlcEV4ZWN1dGlvbk1ldGFkYXRhEg0KBWFsaWFzGAEgASgJEj0KCXN0YXJ0ZWRBdBgCIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEj4KCmZpbmlzaGVkQXQYAyABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRISCgplcnJvckNvdW50GAQgASgNEg4KBnN0YXR1cxgFIAEoCRIPCgdtZXNzYWdlGAYgASgJIosCCgxWZXJpZmljYXRpb24SWgoRYW5hbHlzaXNUZW1wbGF0ZXMYASADKAsyPy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNUZW1wbGF0ZVJlZmVyZW5jZRJWChNhbmFseXNpc1J1bk1ldGFkYXRhGAIgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGESRwoEYXJncxgDIAMoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1bkFyZ3VtZW50Ip0CChBWZXJpZmljYXRpb25JbmZvEgoKAmlkGAQgASgJEg0KBWFjdG9yGAcgASgJEj0KCXN0YXJ0VGltZRgFIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEg0KBXBoYXNlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSTwoLYW5hbHlzaXNSdW4YAyABKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5SZWZlcmVuY2USPgoKZmluaXNoVGltZRgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIpQBCg1WZXJpZmllZFN0YWdlEj4KCnZlcmlmaWVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJDCgtsb25nZXN0U29haxgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbiLZAQoJV2FyZWhvdXNlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESQQoEc3BlYxgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTcGVjEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTdGF0dXMikQEKDVdhcmVob3VzZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPgoFaXRlbXMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlIs4BCg1XYXJlaG91c2VTcGVjEg0KBXNoYXJkGAIgASgJEkAKCGludGVydmFsGAQgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uEh0KFWZyZWlnaHRDcmVhdGlvblBvbGljeRgDIAEoCRJNCg1zdWJzY3JpcHRpb25zGAEgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlJlcG9TdWJzY3JpcHRpb24i/QEKD1dhcmVob3VzZVN0YXR1cxJDCgpjb25kaXRpb25zGAkgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBiABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAQgASgDEhUKDWxhc3RGcmVpZ2h0SUQYCCABKAkSVgoTZGlzY292ZXJlZEFydGlmYWN0cxgHIAEoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQXJ0aWZhY3RzQpcCCihjb20uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExQg5HZW5lcmF0ZWRQcm90b1ABWiRnaXRodWIuY29tL2FrdWl0eS9rYXJnby9hcGkvdjFhbHBoYTGiAgVHQ0FLQaoCJEdpdGh1Yi5Db20uQWt1aXR5LkthcmdvLkFwaS5WMWFscGhhMcoCJEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMeICMEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMVxHUEJNZXRhZGF0YeoCKUdpdGh1Yjo6Q29tOjpBa3VpdHk6OkthcmdvOjpBcGk6OlYxYWxwaGEx", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]); + fileDesc("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUiSQoMQ3VycmVudFN0YWdlEjkKBXNpbmNlGAEgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUitgIKE0Rpc2NvdmVyZWRBcnRpZmFjdHMSQAoMZGlzY292ZXJlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSRQoDZ2l0GAEgAygLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkdpdERpc2NvdmVyeVJlc3VsdBJKCgZpbWFnZXMYAiADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2VEaXNjb3ZlcnlSZXN1bHQSSgoGY2hhcnRzGAMgAygLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0RGlzY292ZXJ5UmVzdWx0IrABChBEaXNjb3ZlcmVkQ29tbWl0EgoKAmlkGAEgASgJEg4KBmJyYW5jaBgCIAEoCRILCgN0YWcYAyABKAkSDwoHc3ViamVjdBgEIAEoCRIOCgZhdXRob3IYBSABKAkSEQoJY29tbWl0dGVyGAYgASgJEj8KC2NyZWF0b3JEYXRlGAcgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiigEKGERpc2NvdmVyZWRJbWFnZVJlZmVyZW5jZRILCgN0YWcYASABKAkSDgoGZGlnZXN0GAIgASgJEhIKCmdpdFJlcG9VUkwYAyABKAkSPQoJY3JlYXRlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiogMKB0ZyZWlnaHQSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRINCgVhbGlhcxgHIAEoCRJDCgZvcmlnaW4YCSABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodE9yaWdpbhJACgdjb21taXRzGAMgAygLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkdpdENvbW1pdBI7CgZpbWFnZXMYBCADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2USOwoGY2hhcnRzGAUgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0EkMKBnN0YXR1cxgGIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U3RhdHVzIq0CChFGcmVpZ2h0Q29sbGVjdGlvbhIKCgJpZBgDIAEoCRJRCgVpdGVtcxgBIAMoCzJCLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0Q29sbGVjdGlvbi5JdGVtc0VudHJ5ElMKE3ZlcmlmaWNhdGlvbkhpc3RvcnkYAiADKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpY2F0aW9uSW5mbxpkCgpJdGVtc0VudHJ5EgsKA2tleRgBIAEoCRJFCgV2YWx1ZRgCIAEoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVmZXJlbmNlOgI4ASKNAQoLRnJlaWdodExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodCIrCg1GcmVpZ2h0T3JpZ2luEgwKBGtpbmQYASABKAkSDAoEbmFtZRgCIAEoCSKhAgoQRnJlaWdodFJlZmVyZW5jZRIMCgRuYW1lGAEgASgJEkMKBm9yaWdpbhgIIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgDIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBCADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQinAEKDkZyZWlnaHRSZXF1ZXN0EkMKBm9yaWdpbhgBIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkUKB3NvdXJjZXMYAiABKAsyNC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFNvdXJjZXMiegoORnJlaWdodFNvdXJjZXMSDgoGZGlyZWN0GAEgASgIEg4KBnN0YWdlcxgCIAMoCRJIChByZXF1aXJlZFNvYWtUaW1lGAMgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uItcECg1GcmVpZ2h0U3RhdHVzElkKC2N1cnJlbnRseUluGAMgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQ3VycmVudGx5SW5FbnRyeRJXCgp2ZXJpZmllZEluGAEgAygLMkMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuVmVyaWZpZWRJbkVudHJ5ElkKC2FwcHJvdmVkRm9yGAIgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQXBwcm92ZWRGb3JFbnRyeRpmChBDdXJyZW50bHlJbkVudHJ5EgsKA2tleRgBIAEoCRJBCgV2YWx1ZRgCIAEoCzIyLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DdXJyZW50U3RhZ2U6AjgBGmYKD1ZlcmlmaWVkSW5FbnRyeRILCgNrZXkYASABKAkSQgoFdmFsdWUYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpZWRTdGFnZToCOAEaZwoQQXBwcm92ZWRGb3JFbnRyeRILCgNrZXkYASABKAkSQgoFdmFsdWUYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXBwcm92ZWRTdGFnZToCOAEieQoJR2l0Q29tbWl0Eg8KB3JlcG9VUkwYASABKAkSCgoCaWQYAiABKAkSDgoGYnJhbmNoGAMgASgJEgsKA3RhZxgEIAEoCRIPCgdtZXNzYWdlGAYgASgJEg4KBmF1dGhvchgHIAEoCRIRCgljb21taXR0ZXIYCCABKAkibgoSR2l0RGlzY292ZXJ5UmVzdWx0Eg8KB3JlcG9VUkwYASABKAkSRwoHY29tbWl0cxgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQ29tbWl0Io4CCg9HaXRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIfChdjb21taXRTZWxlY3Rpb25TdHJhdGVneRgCIAEoCRIOCgZicmFuY2gYAyABKAkSFQoNc3RyaWN0U2VtdmVycxgLIAEoCBIYChBzZW12ZXJDb25zdHJhaW50GAQgASgJEhEKCWFsbG93VGFncxgFIAEoCRISCgppZ25vcmVUYWdzGAYgAygJEh0KFWluc2VjdXJlU2tpcFRMU1ZlcmlmeRgHIAEoCBIUCgxpbmNsdWRlUGF0aHMYCCADKAkSFAoMZXhjbHVkZVBhdGhzGAkgAygJEhYKDmRpc2NvdmVyeUxpbWl0GAogASgFIsgBCgZIZWFsdGgSDgoGc3RhdHVzGAEgASgJEg4KBmlzc3VlcxgCIAMoCRJOCgZjb25maWcYBCABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OEk4KBm91dHB1dBgFIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ibwoPSGVhbHRoQ2hlY2tTdGVwEgwKBHVzZXMYASABKAkSTgoGY29uZmlnGAIgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJJCgVJbWFnZRIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSCwoDdGFnGAMgASgJEg4KBmRpZ2VzdBgEIAEoCSKNAQoUSW1hZ2VEaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIQCghwbGF0Zm9ybRgCIAEoCRJSCgpyZWZlcmVuY2VzGAMgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRJbWFnZVJlZmVyZW5jZSL5AQoRSW1hZ2VTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRISCgpnaXRSZXBvVVJMGAIgASgJEh4KFmltYWdlU2VsZWN0aW9uU3RyYXRlZ3kYAyABKAkSFQoNc3RyaWN0U2VtdmVycxgKIAEoCBIYChBzZW12ZXJDb25zdHJhaW50GAQgASgJEhEKCWFsbG93VGFncxgFIAEoCRISCgppZ25vcmVUYWdzGAYgAygJEhAKCHBsYXRmb3JtGAcgASgJEh0KFWluc2VjdXJlU2tpcFRMU1ZlcmlmeRgIIAEoCBIWCg5kaXNjb3ZlcnlMaW1pdBgJIAEoBSLTAQoHUHJvamVjdBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEj8KBHNwZWMYAiABKAsyMS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFNwZWMSQwoGc3RhdHVzGAMgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3RTdGF0dXMijQEKC1Byb2plY3RMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjwKBWl0ZW1zGAIgAygLMi0uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3QiXwoLUHJvamVjdFNwZWMSUAoRcHJvbW90aW9uUG9saWNpZXMYASADKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUG9saWN5InQKDVByb2plY3RTdGF0dXMSQwoKY29uZGl0aW9ucxgDIAMoCzIvLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5Db25kaXRpb24SDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCSLZAQoJUHJvbW90aW9uEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESQQoEc3BlYxgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TcGVjEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGF0dXMikQEKDVByb21vdGlvbkxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPgoFaXRlbXMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uIj4KD1Byb21vdGlvblBvbGljeRINCgVzdGFnZRgBIAEoCRIcChRhdXRvUHJvbW90aW9uRW5hYmxlZBgCIAEoCCLyAQoSUHJvbW90aW9uUmVmZXJlbmNlEgwKBG5hbWUYASABKAkSRwoHZnJlaWdodBgCIAEoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVmZXJlbmNlEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGF0dXMSPgoKZmluaXNoZWRBdBgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIroBCg1Qcm9tb3Rpb25TcGVjEg0KBXN0YWdlGAEgASgJEg8KB2ZyZWlnaHQYAiABKAkSRQoEdmFycxgEIAMoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25WYXJpYWJsZRJCCgVzdGVwcxgDIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwIrcECg9Qcm9tb3Rpb25TdGF0dXMSGgoSbGFzdEhhbmRsZWRSZWZyZXNoGAQgASgJEg0KBXBoYXNlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSRwoHZnJlaWdodBgFIAEoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVmZXJlbmNlElIKEWZyZWlnaHRDb2xsZWN0aW9uGAcgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uEksKDGhlYWx0aENoZWNrcxgIIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5IZWFsdGhDaGVja1N0ZXASPgoKZmluaXNoZWRBdBgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhMKC2N1cnJlbnRTdGVwGAkgASgDEloKFXN0ZXBFeGVjdXRpb25NZXRhZGF0YRgLIAMoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGVwRXhlY3V0aW9uTWV0YWRhdGESTQoFc3RhdGUYCiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIsIBCg1Qcm9tb3Rpb25TdGVwEgwKBHVzZXMYASABKAkSCgoCYXMYAiABKAkSRwoFcmV0cnkYBCABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcFJldHJ5Ek4KBmNvbmZpZxgDIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ibQoSUHJvbW90aW9uU3RlcFJldHJ5Ej8KB3RpbWVvdXQYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SFgoOZXJyb3JUaHJlc2hvbGQYAiABKA0imgEKDVByb21vdGlvblRhc2sSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJFCgRzcGVjGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tTcGVjIjMKElByb21vdGlvblRhc2tJbnB1dBIMCgRuYW1lGAEgASgJEg8KB2RlZmF1bHQYAiABKAkinQEKEVByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEkYKBWl0ZW1zGAIgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tMaXN0IqEBChFQcm9tb3Rpb25UYXNrU3BlYxJICgZpbnB1dHMYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza0lucHV0EkIKBXN0ZXBzGAIgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAiXgoRUHJvbW90aW9uVGVtcGxhdGUSSQoEc3BlYxgBIAEoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZVNwZWMiogEKFVByb21vdGlvblRlbXBsYXRlU3BlYxJFCgR2YXJzGAIgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAEgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAiMAoRUHJvbW90aW9uVmFyaWFibGUSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSLmAQoQUmVwb1N1YnNjcmlwdGlvbhJCCgNnaXQYASABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0U3Vic2NyaXB0aW9uEkYKBWltYWdlGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlU3Vic2NyaXB0aW9uEkYKBWNoYXJ0GAMgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0U3Vic2NyaXB0aW9uIs0BCgVTdGFnZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEj0KBHNwZWMYAiABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2VTcGVjEkEKBnN0YXR1cxgDIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVN0YXR1cyKJAQoJU3RhZ2VMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjoKBWl0ZW1zGAIgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlIogCCglTdGFnZVNwZWMSDQoFc2hhcmQYBCABKAkSTgoQcmVxdWVzdGVkRnJlaWdodBgFIAMoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVxdWVzdBJSChFwcm9tb3Rpb25UZW1wbGF0ZRgGIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZRJICgx2ZXJpZmljYXRpb24YAyABKAsyMi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpY2F0aW9uIvYDCgtTdGFnZVN0YXR1cxJDCgpjb25kaXRpb25zGA0gAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYCyABKAkSDQoFcGhhc2UYASABKAkSTwoOZnJlaWdodEhpc3RvcnkYBCADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SFgoOZnJlaWdodFN1bW1hcnkYDCABKAkSPAoGaGVhbHRoGAggASgLMiwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aBIPCgdtZXNzYWdlGAkgASgJEhoKEm9ic2VydmVkR2VuZXJhdGlvbhgGIAEoAxJSChBjdXJyZW50UHJvbW90aW9uGAcgASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZRJPCg1sYXN0UHJvbW90aW9uGAogASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZSLaAQoVU3RlcEV4ZWN1dGlvbk1ldGFkYXRhEg0KBWFsaWFzGAEgASgJEj0KCXN0YXJ0ZWRBdBgCIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEj4KCmZpbmlzaGVkQXQYAyABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRISCgplcnJvckNvdW50GAQgASgNEg4KBnN0YXR1cxgFIAEoCRIPCgdtZXNzYWdlGAYgASgJIosCCgxWZXJpZmljYXRpb24SWgoRYW5hbHlzaXNUZW1wbGF0ZXMYASADKAsyPy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNUZW1wbGF0ZVJlZmVyZW5jZRJWChNhbmFseXNpc1J1bk1ldGFkYXRhGAIgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGESRwoEYXJncxgDIAMoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1bkFyZ3VtZW50Ip0CChBWZXJpZmljYXRpb25JbmZvEgoKAmlkGAQgASgJEg0KBWFjdG9yGAcgASgJEj0KCXN0YXJ0VGltZRgFIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEg0KBXBoYXNlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSTwoLYW5hbHlzaXNSdW4YAyABKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5SZWZlcmVuY2USPgoKZmluaXNoVGltZRgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIpQBCg1WZXJpZmllZFN0YWdlEj4KCnZlcmlmaWVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJDCgtsb25nZXN0U29haxgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbiLZAQoJV2FyZWhvdXNlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESQQoEc3BlYxgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTcGVjEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTdGF0dXMikQEKDVdhcmVob3VzZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPgoFaXRlbXMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlIs4BCg1XYXJlaG91c2VTcGVjEg0KBXNoYXJkGAIgASgJEkAKCGludGVydmFsGAQgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uEh0KFWZyZWlnaHRDcmVhdGlvblBvbGljeRgDIAEoCRJNCg1zdWJzY3JpcHRpb25zGAEgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlJlcG9TdWJzY3JpcHRpb24i/QEKD1dhcmVob3VzZVN0YXR1cxJDCgpjb25kaXRpb25zGAkgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBiABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAQgASgDEhUKDWxhc3RGcmVpZ2h0SUQYCCABKAkSVgoTZGlzY292ZXJlZEFydGlmYWN0cxgHIAEoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQXJ0aWZhY3RzQpcCCihjb20uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExQg5HZW5lcmF0ZWRQcm90b1ABWiRnaXRodWIuY29tL2FrdWl0eS9rYXJnby9hcGkvdjFhbHBoYTGiAgVHQ0FLQaoCJEdpdGh1Yi5Db20uQWt1aXR5LkthcmdvLkFwaS5WMWFscGhhMcoCJEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMeICMEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMVxHUEJNZXRhZGF0YeoCKUdpdGh1Yjo6Q29tOjpBa3VpdHk6OkthcmdvOjpBcGk6OlYxYWxwaGEx", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]); /** * AnalysisRunArgument represents an argument to be added to an AnalysisRun. @@ -2077,6 +2077,130 @@ export type PromotionStepRetry = Message<"github.com.akuity.kargo.api.v1alpha1.P export const PromotionStepRetrySchema: GenMessage = /*@__PURE__*/ messageDesc(file_v1alpha1_generated, 42); +/** + * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionTask + */ +export type PromotionTask = Message<"github.com.akuity.kargo.api.v1alpha1.PromotionTask"> & { + /** + * @generated from field: optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + */ + metadata?: ObjectMeta; + + /** + * Spec describes the composition of a PromotionTask, including the inputs + * available to the task and the steps. + * + * +kubebuilder:validation:Required + * + * @generated from field: optional github.com.akuity.kargo.api.v1alpha1.PromotionTaskSpec spec = 2; + */ + spec?: PromotionTaskSpec; +}; + +/** + * Describes the message github.com.akuity.kargo.api.v1alpha1.PromotionTask. + * Use `create(PromotionTaskSchema)` to create a new message. + */ +export const PromotionTaskSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_v1alpha1_generated, 43); + +/** + * PromotionTaskInput defines an input parameter for a PromotionTask. This input + * can be specified in the PromotionTemplate as configuration for the task, and + * can be used in the Steps to parameterize the execution of the task. + * + * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionTaskInput + */ +export type PromotionTaskInput = Message<"github.com.akuity.kargo.api.v1alpha1.PromotionTaskInput"> & { + /** + * Name of the configuration parameter, which should be unique within the + * PromotionTask. This name can be used to reference the parameter in the + * PromotionTaskSpec.Steps. + * + * +kubebuilder:validation:Required + * +kubebuilder:validation:MinLength=1 + * + * @generated from field: optional string name = 1; + */ + name: string; + + /** + * Default specifies a default value for the parameter. This value will be + * used if the parameter is not specified in the PromotionTemplate. + * If left unspecified, the input value is required to be specified in the + * configuration of the step referencing this task. + * + * +kubebuilder:validation:Optional + * + * @generated from field: optional string default = 2; + */ + default: string; +}; + +/** + * Describes the message github.com.akuity.kargo.api.v1alpha1.PromotionTaskInput. + * Use `create(PromotionTaskInputSchema)` to create a new message. + */ +export const PromotionTaskInputSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_v1alpha1_generated, 44); + +/** + * PromotionTaskList contains a list of PromotionTasks. + * + * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionTaskList + */ +export type PromotionTaskList = Message<"github.com.akuity.kargo.api.v1alpha1.PromotionTaskList"> & { + /** + * @generated from field: optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + */ + metadata?: ListMeta; + + /** + * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionTaskList items = 2; + */ + items: PromotionTaskList[]; +}; + +/** + * Describes the message github.com.akuity.kargo.api.v1alpha1.PromotionTaskList. + * Use `create(PromotionTaskListSchema)` to create a new message. + */ +export const PromotionTaskListSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_v1alpha1_generated, 45); + +/** + * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionTaskSpec + */ +export type PromotionTaskSpec = Message<"github.com.akuity.kargo.api.v1alpha1.PromotionTaskSpec"> & { + /** + * Inputs specifies the inputs available to the PromotionTask. These inputs + * can be specified in the PromotionTemplate as configuration for the task, + * and can be used in the Steps to parameterize the execution of the task. + * + * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionTaskInput inputs = 1; + */ + inputs: PromotionTaskInput[]; + + /** + * Steps specifies the directives to be executed as part of this + * PromotionTask. The steps as defined here are deflated into a + * Promotion when it is built from a PromotionTemplate. + * + * +kubebuilder:validation:Required + * +kubebuilder:validation:MinItems=1 + * + * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionStep steps = 2; + */ + steps: PromotionStep[]; +}; + +/** + * Describes the message github.com.akuity.kargo.api.v1alpha1.PromotionTaskSpec. + * Use `create(PromotionTaskSpecSchema)` to create a new message. + */ +export const PromotionTaskSpecSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_v1alpha1_generated, 46); + /** * PromotionTemplate defines a template for a Promotion that can be used to * incorporate Freight into a Stage. @@ -2095,7 +2219,7 @@ export type PromotionTemplate = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionTemplateSchema)` to create a new message. */ export const PromotionTemplateSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 43); + messageDesc(file_v1alpha1_generated, 47); /** * PromotionTemplateSpec describes the (partial) specification of a Promotion @@ -2130,7 +2254,7 @@ export type PromotionTemplateSpec = Message<"github.com.akuity.kargo.api.v1alpha * Use `create(PromotionTemplateSpecSchema)` to create a new message. */ export const PromotionTemplateSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 44); + messageDesc(file_v1alpha1_generated, 48); /** * PromotionVariable describes a single variable that may be referenced by @@ -2164,7 +2288,7 @@ export type PromotionVariable = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionVariableSchema)` to create a new message. */ export const PromotionVariableSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 45); + messageDesc(file_v1alpha1_generated, 49); /** * RepoSubscription describes a subscription to ONE OF a Git repository, a @@ -2200,7 +2324,7 @@ export type RepoSubscription = Message<"github.com.akuity.kargo.api.v1alpha1.Rep * Use `create(RepoSubscriptionSchema)` to create a new message. */ export const RepoSubscriptionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 46); + messageDesc(file_v1alpha1_generated, 50); /** * Stage is the Kargo API's main type. @@ -2236,7 +2360,7 @@ export type Stage = Message<"github.com.akuity.kargo.api.v1alpha1.Stage"> & { * Use `create(StageSchema)` to create a new message. */ export const StageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 47); + messageDesc(file_v1alpha1_generated, 51); /** * StageList is a list of Stage resources. @@ -2260,7 +2384,7 @@ export type StageList = Message<"github.com.akuity.kargo.api.v1alpha1.StageList" * Use `create(StageListSchema)` to create a new message. */ export const StageListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 48); + messageDesc(file_v1alpha1_generated, 52); /** * StageSpec describes the sources of Freight used by a Stage and how to @@ -2318,7 +2442,7 @@ export type StageSpec = Message<"github.com.akuity.kargo.api.v1alpha1.StageSpec" * Use `create(StageSpecSchema)` to create a new message. */ export const StageSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 49); + messageDesc(file_v1alpha1_generated, 53); /** * StageStatus describes a Stages's current and recent Freight, health, and @@ -2425,7 +2549,7 @@ export type StageStatus = Message<"github.com.akuity.kargo.api.v1alpha1.StageSta * Use `create(StageStatusSchema)` to create a new message. */ export const StageStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 50); + messageDesc(file_v1alpha1_generated, 54); /** * StepExecutionMetadata tracks metadata pertaining to the execution of @@ -2484,7 +2608,7 @@ export type StepExecutionMetadata = Message<"github.com.akuity.kargo.api.v1alpha * Use `create(StepExecutionMetadataSchema)` to create a new message. */ export const StepExecutionMetadataSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 51); + messageDesc(file_v1alpha1_generated, 55); /** * Verification describes how to verify that a Promotion has been successful @@ -2523,7 +2647,7 @@ export type Verification = Message<"github.com.akuity.kargo.api.v1alpha1.Verific * Use `create(VerificationSchema)` to create a new message. */ export const VerificationSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 52); + messageDesc(file_v1alpha1_generated, 56); /** * VerificationInfo contains the details of an instance of a Verification @@ -2593,7 +2717,7 @@ export type VerificationInfo = Message<"github.com.akuity.kargo.api.v1alpha1.Ver * Use `create(VerificationInfoSchema)` to create a new message. */ export const VerificationInfoSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 53); + messageDesc(file_v1alpha1_generated, 57); /** * VerifiedStage describes a Stage in which Freight has been verified. @@ -2625,7 +2749,7 @@ export type VerifiedStage = Message<"github.com.akuity.kargo.api.v1alpha1.Verifi * Use `create(VerifiedStageSchema)` to create a new message. */ export const VerifiedStageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 54); + messageDesc(file_v1alpha1_generated, 58); /** * Warehouse is a source of Freight. @@ -2660,7 +2784,7 @@ export type Warehouse = Message<"github.com.akuity.kargo.api.v1alpha1.Warehouse" * Use `create(WarehouseSchema)` to create a new message. */ export const WarehouseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 55); + messageDesc(file_v1alpha1_generated, 59); /** * WarehouseList is a list of Warehouse resources. @@ -2684,7 +2808,7 @@ export type WarehouseList = Message<"github.com.akuity.kargo.api.v1alpha1.Wareho * Use `create(WarehouseListSchema)` to create a new message. */ export const WarehouseListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 56); + messageDesc(file_v1alpha1_generated, 60); /** * WarehouseSpec describes sources of versioned artifacts to be included in @@ -2750,7 +2874,7 @@ export type WarehouseSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Wareho * Use `create(WarehouseSpecSchema)` to create a new message. */ export const WarehouseSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 57); + messageDesc(file_v1alpha1_generated, 61); /** * WarehouseStatus describes a Warehouse's most recently observed state. @@ -2809,5 +2933,5 @@ export type WarehouseStatus = Message<"github.com.akuity.kargo.api.v1alpha1.Ware * Use `create(WarehouseStatusSchema)` to create a new message. */ export const WarehouseStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 58); + messageDesc(file_v1alpha1_generated, 62); From a2b05ca40347f75847d10666c80287b5264d7707 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Wed, 11 Dec 2024 00:07:35 +0100 Subject: [PATCH 03/38] feat(api): add `ClusterPromotionTask` Signed-off-by: Hidde Beydals --- api/v1alpha1/cluster_promotion_task_types.go | 27 ++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 api/v1alpha1/cluster_promotion_task_types.go diff --git a/api/v1alpha1/cluster_promotion_task_types.go b/api/v1alpha1/cluster_promotion_task_types.go new file mode 100644 index 000000000..888701671 --- /dev/null +++ b/api/v1alpha1/cluster_promotion_task_types.go @@ -0,0 +1,27 @@ +package v1alpha1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +kubebuilder:resource:scope=Cluster,shortName={clusterpromotask,clusterpromotasks} +// +kubebuilder:object:root=true +// +kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp` + +type ClusterPromotionTask struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Spec describes the desired transition of a specific Stage into a specific + // Freight. + // + // +kubebuilder:validation:Required + Spec PromotionTaskSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"` +} + +// +kubebuilder:object:root=true + +// ClusterPromotionTaskList contains a list of PromotionTasks. +type ClusterPromotionTaskList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + Items []ClusterPromotionTaskList `json:"items" protobuf:"bytes,2,rep,name=items"` +} From 8bf98a8627eeaf5758e52424730b0c058425646b Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Wed, 11 Dec 2024 00:09:25 +0100 Subject: [PATCH 04/38] chore: run codegen Signed-off-by: Hidde Beydals --- api/v1alpha1/generated.pb.go | 1051 ++++++++++++----- api/v1alpha1/generated.proto | 17 + api/v1alpha1/zz_generated.deepcopy.go | 58 + ...kargo.akuity.io_clusterpromotiontasks.yaml | 160 +++ ...omotiontasks.kargo.akuity.io_v1alpha1.json | 95 ++ ui/src/gen/v1alpha1/generated_pb.ts | 157 ++- 6 files changed, 1180 insertions(+), 358 deletions(-) create mode 100644 charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml create mode 100644 ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json diff --git a/api/v1alpha1/generated.pb.go b/api/v1alpha1/generated.pb.go index 2c2b55695..ecc58a584 100644 --- a/api/v1alpha1/generated.pb.go +++ b/api/v1alpha1/generated.pb.go @@ -338,10 +338,66 @@ func (m *ChartSubscription) XXX_DiscardUnknown() { var xxx_messageInfo_ChartSubscription proto.InternalMessageInfo +func (m *ClusterPromotionTask) Reset() { *m = ClusterPromotionTask{} } +func (*ClusterPromotionTask) ProtoMessage() {} +func (*ClusterPromotionTask) Descriptor() ([]byte, []int) { + return fileDescriptor_e26b7f7bbc391025, []int{11} +} +func (m *ClusterPromotionTask) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ClusterPromotionTask) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ClusterPromotionTask) XXX_Merge(src proto.Message) { + xxx_messageInfo_ClusterPromotionTask.Merge(m, src) +} +func (m *ClusterPromotionTask) XXX_Size() int { + return m.Size() +} +func (m *ClusterPromotionTask) XXX_DiscardUnknown() { + xxx_messageInfo_ClusterPromotionTask.DiscardUnknown(m) +} + +var xxx_messageInfo_ClusterPromotionTask proto.InternalMessageInfo + +func (m *ClusterPromotionTaskList) Reset() { *m = ClusterPromotionTaskList{} } +func (*ClusterPromotionTaskList) ProtoMessage() {} +func (*ClusterPromotionTaskList) Descriptor() ([]byte, []int) { + return fileDescriptor_e26b7f7bbc391025, []int{12} +} +func (m *ClusterPromotionTaskList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ClusterPromotionTaskList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ClusterPromotionTaskList) XXX_Merge(src proto.Message) { + xxx_messageInfo_ClusterPromotionTaskList.Merge(m, src) +} +func (m *ClusterPromotionTaskList) XXX_Size() int { + return m.Size() +} +func (m *ClusterPromotionTaskList) XXX_DiscardUnknown() { + xxx_messageInfo_ClusterPromotionTaskList.DiscardUnknown(m) +} + +var xxx_messageInfo_ClusterPromotionTaskList proto.InternalMessageInfo + func (m *CurrentStage) Reset() { *m = CurrentStage{} } func (*CurrentStage) ProtoMessage() {} func (*CurrentStage) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{11} + return fileDescriptor_e26b7f7bbc391025, []int{13} } func (m *CurrentStage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -369,7 +425,7 @@ var xxx_messageInfo_CurrentStage proto.InternalMessageInfo func (m *DiscoveredArtifacts) Reset() { *m = DiscoveredArtifacts{} } func (*DiscoveredArtifacts) ProtoMessage() {} func (*DiscoveredArtifacts) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{12} + return fileDescriptor_e26b7f7bbc391025, []int{14} } func (m *DiscoveredArtifacts) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -397,7 +453,7 @@ var xxx_messageInfo_DiscoveredArtifacts proto.InternalMessageInfo func (m *DiscoveredCommit) Reset() { *m = DiscoveredCommit{} } func (*DiscoveredCommit) ProtoMessage() {} func (*DiscoveredCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{13} + return fileDescriptor_e26b7f7bbc391025, []int{15} } func (m *DiscoveredCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -425,7 +481,7 @@ var xxx_messageInfo_DiscoveredCommit proto.InternalMessageInfo func (m *DiscoveredImageReference) Reset() { *m = DiscoveredImageReference{} } func (*DiscoveredImageReference) ProtoMessage() {} func (*DiscoveredImageReference) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{14} + return fileDescriptor_e26b7f7bbc391025, []int{16} } func (m *DiscoveredImageReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -453,7 +509,7 @@ var xxx_messageInfo_DiscoveredImageReference proto.InternalMessageInfo func (m *Freight) Reset() { *m = Freight{} } func (*Freight) ProtoMessage() {} func (*Freight) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{15} + return fileDescriptor_e26b7f7bbc391025, []int{17} } func (m *Freight) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -481,7 +537,7 @@ var xxx_messageInfo_Freight proto.InternalMessageInfo func (m *FreightCollection) Reset() { *m = FreightCollection{} } func (*FreightCollection) ProtoMessage() {} func (*FreightCollection) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{16} + return fileDescriptor_e26b7f7bbc391025, []int{18} } func (m *FreightCollection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -509,7 +565,7 @@ var xxx_messageInfo_FreightCollection proto.InternalMessageInfo func (m *FreightList) Reset() { *m = FreightList{} } func (*FreightList) ProtoMessage() {} func (*FreightList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{17} + return fileDescriptor_e26b7f7bbc391025, []int{19} } func (m *FreightList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -537,7 +593,7 @@ var xxx_messageInfo_FreightList proto.InternalMessageInfo func (m *FreightOrigin) Reset() { *m = FreightOrigin{} } func (*FreightOrigin) ProtoMessage() {} func (*FreightOrigin) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{18} + return fileDescriptor_e26b7f7bbc391025, []int{20} } func (m *FreightOrigin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -565,7 +621,7 @@ var xxx_messageInfo_FreightOrigin proto.InternalMessageInfo func (m *FreightReference) Reset() { *m = FreightReference{} } func (*FreightReference) ProtoMessage() {} func (*FreightReference) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{19} + return fileDescriptor_e26b7f7bbc391025, []int{21} } func (m *FreightReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -593,7 +649,7 @@ var xxx_messageInfo_FreightReference proto.InternalMessageInfo func (m *FreightRequest) Reset() { *m = FreightRequest{} } func (*FreightRequest) ProtoMessage() {} func (*FreightRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{20} + return fileDescriptor_e26b7f7bbc391025, []int{22} } func (m *FreightRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -621,7 +677,7 @@ var xxx_messageInfo_FreightRequest proto.InternalMessageInfo func (m *FreightSources) Reset() { *m = FreightSources{} } func (*FreightSources) ProtoMessage() {} func (*FreightSources) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{21} + return fileDescriptor_e26b7f7bbc391025, []int{23} } func (m *FreightSources) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -649,7 +705,7 @@ var xxx_messageInfo_FreightSources proto.InternalMessageInfo func (m *FreightStatus) Reset() { *m = FreightStatus{} } func (*FreightStatus) ProtoMessage() {} func (*FreightStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{22} + return fileDescriptor_e26b7f7bbc391025, []int{24} } func (m *FreightStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -677,7 +733,7 @@ var xxx_messageInfo_FreightStatus proto.InternalMessageInfo func (m *GitCommit) Reset() { *m = GitCommit{} } func (*GitCommit) ProtoMessage() {} func (*GitCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{23} + return fileDescriptor_e26b7f7bbc391025, []int{25} } func (m *GitCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -705,7 +761,7 @@ var xxx_messageInfo_GitCommit proto.InternalMessageInfo func (m *GitDiscoveryResult) Reset() { *m = GitDiscoveryResult{} } func (*GitDiscoveryResult) ProtoMessage() {} func (*GitDiscoveryResult) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{24} + return fileDescriptor_e26b7f7bbc391025, []int{26} } func (m *GitDiscoveryResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -733,7 +789,7 @@ var xxx_messageInfo_GitDiscoveryResult proto.InternalMessageInfo func (m *GitSubscription) Reset() { *m = GitSubscription{} } func (*GitSubscription) ProtoMessage() {} func (*GitSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{25} + return fileDescriptor_e26b7f7bbc391025, []int{27} } func (m *GitSubscription) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -761,7 +817,7 @@ var xxx_messageInfo_GitSubscription proto.InternalMessageInfo func (m *Health) Reset() { *m = Health{} } func (*Health) ProtoMessage() {} func (*Health) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{26} + return fileDescriptor_e26b7f7bbc391025, []int{28} } func (m *Health) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -789,7 +845,7 @@ var xxx_messageInfo_Health proto.InternalMessageInfo func (m *HealthCheckStep) Reset() { *m = HealthCheckStep{} } func (*HealthCheckStep) ProtoMessage() {} func (*HealthCheckStep) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{27} + return fileDescriptor_e26b7f7bbc391025, []int{29} } func (m *HealthCheckStep) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -817,7 +873,7 @@ var xxx_messageInfo_HealthCheckStep proto.InternalMessageInfo func (m *Image) Reset() { *m = Image{} } func (*Image) ProtoMessage() {} func (*Image) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{28} + return fileDescriptor_e26b7f7bbc391025, []int{30} } func (m *Image) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -845,7 +901,7 @@ var xxx_messageInfo_Image proto.InternalMessageInfo func (m *ImageDiscoveryResult) Reset() { *m = ImageDiscoveryResult{} } func (*ImageDiscoveryResult) ProtoMessage() {} func (*ImageDiscoveryResult) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{29} + return fileDescriptor_e26b7f7bbc391025, []int{31} } func (m *ImageDiscoveryResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -873,7 +929,7 @@ var xxx_messageInfo_ImageDiscoveryResult proto.InternalMessageInfo func (m *ImageSubscription) Reset() { *m = ImageSubscription{} } func (*ImageSubscription) ProtoMessage() {} func (*ImageSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{30} + return fileDescriptor_e26b7f7bbc391025, []int{32} } func (m *ImageSubscription) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -901,7 +957,7 @@ var xxx_messageInfo_ImageSubscription proto.InternalMessageInfo func (m *Project) Reset() { *m = Project{} } func (*Project) ProtoMessage() {} func (*Project) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{31} + return fileDescriptor_e26b7f7bbc391025, []int{33} } func (m *Project) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -929,7 +985,7 @@ var xxx_messageInfo_Project proto.InternalMessageInfo func (m *ProjectList) Reset() { *m = ProjectList{} } func (*ProjectList) ProtoMessage() {} func (*ProjectList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{32} + return fileDescriptor_e26b7f7bbc391025, []int{34} } func (m *ProjectList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -957,7 +1013,7 @@ var xxx_messageInfo_ProjectList proto.InternalMessageInfo func (m *ProjectSpec) Reset() { *m = ProjectSpec{} } func (*ProjectSpec) ProtoMessage() {} func (*ProjectSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{33} + return fileDescriptor_e26b7f7bbc391025, []int{35} } func (m *ProjectSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -985,7 +1041,7 @@ var xxx_messageInfo_ProjectSpec proto.InternalMessageInfo func (m *ProjectStatus) Reset() { *m = ProjectStatus{} } func (*ProjectStatus) ProtoMessage() {} func (*ProjectStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{34} + return fileDescriptor_e26b7f7bbc391025, []int{36} } func (m *ProjectStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1013,7 +1069,7 @@ var xxx_messageInfo_ProjectStatus proto.InternalMessageInfo func (m *Promotion) Reset() { *m = Promotion{} } func (*Promotion) ProtoMessage() {} func (*Promotion) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{35} + return fileDescriptor_e26b7f7bbc391025, []int{37} } func (m *Promotion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1041,7 +1097,7 @@ var xxx_messageInfo_Promotion proto.InternalMessageInfo func (m *PromotionList) Reset() { *m = PromotionList{} } func (*PromotionList) ProtoMessage() {} func (*PromotionList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{36} + return fileDescriptor_e26b7f7bbc391025, []int{38} } func (m *PromotionList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1069,7 +1125,7 @@ var xxx_messageInfo_PromotionList proto.InternalMessageInfo func (m *PromotionPolicy) Reset() { *m = PromotionPolicy{} } func (*PromotionPolicy) ProtoMessage() {} func (*PromotionPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{37} + return fileDescriptor_e26b7f7bbc391025, []int{39} } func (m *PromotionPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1097,7 +1153,7 @@ var xxx_messageInfo_PromotionPolicy proto.InternalMessageInfo func (m *PromotionReference) Reset() { *m = PromotionReference{} } func (*PromotionReference) ProtoMessage() {} func (*PromotionReference) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{38} + return fileDescriptor_e26b7f7bbc391025, []int{40} } func (m *PromotionReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1125,7 +1181,7 @@ var xxx_messageInfo_PromotionReference proto.InternalMessageInfo func (m *PromotionSpec) Reset() { *m = PromotionSpec{} } func (*PromotionSpec) ProtoMessage() {} func (*PromotionSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{39} + return fileDescriptor_e26b7f7bbc391025, []int{41} } func (m *PromotionSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1153,7 +1209,7 @@ var xxx_messageInfo_PromotionSpec proto.InternalMessageInfo func (m *PromotionStatus) Reset() { *m = PromotionStatus{} } func (*PromotionStatus) ProtoMessage() {} func (*PromotionStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{40} + return fileDescriptor_e26b7f7bbc391025, []int{42} } func (m *PromotionStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1181,7 +1237,7 @@ var xxx_messageInfo_PromotionStatus proto.InternalMessageInfo func (m *PromotionStep) Reset() { *m = PromotionStep{} } func (*PromotionStep) ProtoMessage() {} func (*PromotionStep) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{41} + return fileDescriptor_e26b7f7bbc391025, []int{43} } func (m *PromotionStep) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1209,7 +1265,7 @@ var xxx_messageInfo_PromotionStep proto.InternalMessageInfo func (m *PromotionStepRetry) Reset() { *m = PromotionStepRetry{} } func (*PromotionStepRetry) ProtoMessage() {} func (*PromotionStepRetry) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{42} + return fileDescriptor_e26b7f7bbc391025, []int{44} } func (m *PromotionStepRetry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1237,7 +1293,7 @@ var xxx_messageInfo_PromotionStepRetry proto.InternalMessageInfo func (m *PromotionTask) Reset() { *m = PromotionTask{} } func (*PromotionTask) ProtoMessage() {} func (*PromotionTask) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{43} + return fileDescriptor_e26b7f7bbc391025, []int{45} } func (m *PromotionTask) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1265,7 +1321,7 @@ var xxx_messageInfo_PromotionTask proto.InternalMessageInfo func (m *PromotionTaskInput) Reset() { *m = PromotionTaskInput{} } func (*PromotionTaskInput) ProtoMessage() {} func (*PromotionTaskInput) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{44} + return fileDescriptor_e26b7f7bbc391025, []int{46} } func (m *PromotionTaskInput) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1293,7 +1349,7 @@ var xxx_messageInfo_PromotionTaskInput proto.InternalMessageInfo func (m *PromotionTaskList) Reset() { *m = PromotionTaskList{} } func (*PromotionTaskList) ProtoMessage() {} func (*PromotionTaskList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{45} + return fileDescriptor_e26b7f7bbc391025, []int{47} } func (m *PromotionTaskList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1321,7 +1377,7 @@ var xxx_messageInfo_PromotionTaskList proto.InternalMessageInfo func (m *PromotionTaskSpec) Reset() { *m = PromotionTaskSpec{} } func (*PromotionTaskSpec) ProtoMessage() {} func (*PromotionTaskSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{46} + return fileDescriptor_e26b7f7bbc391025, []int{48} } func (m *PromotionTaskSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1349,7 +1405,7 @@ var xxx_messageInfo_PromotionTaskSpec proto.InternalMessageInfo func (m *PromotionTemplate) Reset() { *m = PromotionTemplate{} } func (*PromotionTemplate) ProtoMessage() {} func (*PromotionTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{47} + return fileDescriptor_e26b7f7bbc391025, []int{49} } func (m *PromotionTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1377,7 +1433,7 @@ var xxx_messageInfo_PromotionTemplate proto.InternalMessageInfo func (m *PromotionTemplateSpec) Reset() { *m = PromotionTemplateSpec{} } func (*PromotionTemplateSpec) ProtoMessage() {} func (*PromotionTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{48} + return fileDescriptor_e26b7f7bbc391025, []int{50} } func (m *PromotionTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1405,7 +1461,7 @@ var xxx_messageInfo_PromotionTemplateSpec proto.InternalMessageInfo func (m *PromotionVariable) Reset() { *m = PromotionVariable{} } func (*PromotionVariable) ProtoMessage() {} func (*PromotionVariable) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{49} + return fileDescriptor_e26b7f7bbc391025, []int{51} } func (m *PromotionVariable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1433,7 +1489,7 @@ var xxx_messageInfo_PromotionVariable proto.InternalMessageInfo func (m *RepoSubscription) Reset() { *m = RepoSubscription{} } func (*RepoSubscription) ProtoMessage() {} func (*RepoSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{50} + return fileDescriptor_e26b7f7bbc391025, []int{52} } func (m *RepoSubscription) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1461,7 +1517,7 @@ var xxx_messageInfo_RepoSubscription proto.InternalMessageInfo func (m *Stage) Reset() { *m = Stage{} } func (*Stage) ProtoMessage() {} func (*Stage) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{51} + return fileDescriptor_e26b7f7bbc391025, []int{53} } func (m *Stage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1489,7 +1545,7 @@ var xxx_messageInfo_Stage proto.InternalMessageInfo func (m *StageList) Reset() { *m = StageList{} } func (*StageList) ProtoMessage() {} func (*StageList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{52} + return fileDescriptor_e26b7f7bbc391025, []int{54} } func (m *StageList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1517,7 +1573,7 @@ var xxx_messageInfo_StageList proto.InternalMessageInfo func (m *StageSpec) Reset() { *m = StageSpec{} } func (*StageSpec) ProtoMessage() {} func (*StageSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{53} + return fileDescriptor_e26b7f7bbc391025, []int{55} } func (m *StageSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1545,7 +1601,7 @@ var xxx_messageInfo_StageSpec proto.InternalMessageInfo func (m *StageStatus) Reset() { *m = StageStatus{} } func (*StageStatus) ProtoMessage() {} func (*StageStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{54} + return fileDescriptor_e26b7f7bbc391025, []int{56} } func (m *StageStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1573,7 +1629,7 @@ var xxx_messageInfo_StageStatus proto.InternalMessageInfo func (m *StepExecutionMetadata) Reset() { *m = StepExecutionMetadata{} } func (*StepExecutionMetadata) ProtoMessage() {} func (*StepExecutionMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{55} + return fileDescriptor_e26b7f7bbc391025, []int{57} } func (m *StepExecutionMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1601,7 +1657,7 @@ var xxx_messageInfo_StepExecutionMetadata proto.InternalMessageInfo func (m *Verification) Reset() { *m = Verification{} } func (*Verification) ProtoMessage() {} func (*Verification) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{56} + return fileDescriptor_e26b7f7bbc391025, []int{58} } func (m *Verification) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1629,7 +1685,7 @@ var xxx_messageInfo_Verification proto.InternalMessageInfo func (m *VerificationInfo) Reset() { *m = VerificationInfo{} } func (*VerificationInfo) ProtoMessage() {} func (*VerificationInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{57} + return fileDescriptor_e26b7f7bbc391025, []int{59} } func (m *VerificationInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1657,7 +1713,7 @@ var xxx_messageInfo_VerificationInfo proto.InternalMessageInfo func (m *VerifiedStage) Reset() { *m = VerifiedStage{} } func (*VerifiedStage) ProtoMessage() {} func (*VerifiedStage) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{58} + return fileDescriptor_e26b7f7bbc391025, []int{60} } func (m *VerifiedStage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1685,7 +1741,7 @@ var xxx_messageInfo_VerifiedStage proto.InternalMessageInfo func (m *Warehouse) Reset() { *m = Warehouse{} } func (*Warehouse) ProtoMessage() {} func (*Warehouse) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{59} + return fileDescriptor_e26b7f7bbc391025, []int{61} } func (m *Warehouse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1713,7 +1769,7 @@ var xxx_messageInfo_Warehouse proto.InternalMessageInfo func (m *WarehouseList) Reset() { *m = WarehouseList{} } func (*WarehouseList) ProtoMessage() {} func (*WarehouseList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{60} + return fileDescriptor_e26b7f7bbc391025, []int{62} } func (m *WarehouseList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1741,7 +1797,7 @@ var xxx_messageInfo_WarehouseList proto.InternalMessageInfo func (m *WarehouseSpec) Reset() { *m = WarehouseSpec{} } func (*WarehouseSpec) ProtoMessage() {} func (*WarehouseSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{61} + return fileDescriptor_e26b7f7bbc391025, []int{63} } func (m *WarehouseSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1769,7 +1825,7 @@ var xxx_messageInfo_WarehouseSpec proto.InternalMessageInfo func (m *WarehouseStatus) Reset() { *m = WarehouseStatus{} } func (*WarehouseStatus) ProtoMessage() {} func (*WarehouseStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{62} + return fileDescriptor_e26b7f7bbc391025, []int{64} } func (m *WarehouseStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1808,6 +1864,8 @@ func init() { proto.RegisterType((*Chart)(nil), "github.com.akuity.kargo.api.v1alpha1.Chart") proto.RegisterType((*ChartDiscoveryResult)(nil), "github.com.akuity.kargo.api.v1alpha1.ChartDiscoveryResult") proto.RegisterType((*ChartSubscription)(nil), "github.com.akuity.kargo.api.v1alpha1.ChartSubscription") + proto.RegisterType((*ClusterPromotionTask)(nil), "github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTask") + proto.RegisterType((*ClusterPromotionTaskList)(nil), "github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTaskList") proto.RegisterType((*CurrentStage)(nil), "github.com.akuity.kargo.api.v1alpha1.CurrentStage") proto.RegisterType((*DiscoveredArtifacts)(nil), "github.com.akuity.kargo.api.v1alpha1.DiscoveredArtifacts") proto.RegisterType((*DiscoveredCommit)(nil), "github.com.akuity.kargo.api.v1alpha1.DiscoveredCommit") @@ -1871,259 +1929,262 @@ func init() { } var fileDescriptor_e26b7f7bbc391025 = []byte{ - // 4032 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0xcd, 0x6f, 0x23, 0x47, - 0x76, 0x9f, 0x26, 0x25, 0x4a, 0x7c, 0x94, 0x46, 0x52, 0x8d, 0xc6, 0xd6, 0x6a, 0x63, 0xc9, 0xe9, - 0x35, 0x0c, 0x3b, 0xb6, 0xa9, 0xcc, 0xd8, 0x63, 0x8f, 0xc7, 0xc9, 0x04, 0x22, 0x35, 0x1f, 0x9a, - 0xd5, 0x7a, 0x94, 0xa2, 0x3c, 0x5e, 0x8f, 0x6d, 0x78, 0x4b, 0x64, 0x89, 0xec, 0x15, 0xd9, 0x4d, - 0x77, 0x15, 0xb5, 0x56, 0x12, 0x24, 0x9b, 0x2f, 0x60, 0x91, 0x2f, 0xec, 0xc1, 0x80, 0x37, 0x40, - 0x02, 0x04, 0xc9, 0x71, 0x91, 0xfc, 0x03, 0x39, 0xf8, 0x90, 0x8b, 0x11, 0x18, 0x89, 0x91, 0x04, - 0x88, 0x0f, 0x0b, 0x25, 0xd6, 0x02, 0x39, 0xe6, 0x96, 0xcb, 0x00, 0x01, 0x82, 0xfa, 0xe8, 0xee, - 0xea, 0x0f, 0x8e, 0xd8, 0x1c, 0x69, 0x60, 0xe4, 0x46, 0xd5, 0xab, 0xfa, 0xbd, 0xaa, 0x57, 0xef, - 0xbd, 0x7a, 0xef, 0x55, 0xb5, 0xe0, 0x95, 0xb6, 0xc3, 0x3b, 0x83, 0xdd, 0x6a, 0xd3, 0xeb, 0xad, - 0x91, 0xfd, 0x81, 0xc3, 0x0f, 0xd7, 0xf6, 0x89, 0xdf, 0xf6, 0xd6, 0x48, 0xdf, 0x59, 0x3b, 0xb8, - 0x44, 0xba, 0xfd, 0x0e, 0xb9, 0xb4, 0xd6, 0xa6, 0x2e, 0xf5, 0x09, 0xa7, 0xad, 0x6a, 0xdf, 0xf7, - 0xb8, 0x87, 0x9e, 0x89, 0x46, 0x55, 0xd5, 0xa8, 0xaa, 0x1c, 0x55, 0x25, 0x7d, 0xa7, 0x1a, 0x8c, - 0x5a, 0x7e, 0xc9, 0xc0, 0x6e, 0x7b, 0x6d, 0x6f, 0x4d, 0x0e, 0xde, 0x1d, 0xec, 0xc9, 0xbf, 0xe4, - 0x1f, 0xf2, 0x97, 0x02, 0x5d, 0xbe, 0xbd, 0x7f, 0x95, 0x55, 0x1d, 0xc9, 0x99, 0x7e, 0xc4, 0xa9, - 0xcb, 0x1c, 0xcf, 0x65, 0x2f, 0x91, 0xbe, 0xc3, 0xa8, 0x7f, 0x40, 0xfd, 0xb5, 0xfe, 0x7e, 0x5b, - 0xd0, 0x58, 0xbc, 0xc3, 0xda, 0x41, 0x6a, 0x7a, 0xcb, 0xaf, 0x44, 0x48, 0x3d, 0xd2, 0xec, 0x38, - 0x2e, 0xf5, 0x0f, 0xa3, 0xe1, 0x3d, 0xca, 0x49, 0xd6, 0xa8, 0xb5, 0x61, 0xa3, 0xfc, 0x81, 0xcb, - 0x9d, 0x1e, 0x4d, 0x0d, 0x78, 0xf5, 0xa4, 0x01, 0xac, 0xd9, 0xa1, 0x3d, 0x92, 0x1c, 0x67, 0xbf, - 0x07, 0x17, 0xd6, 0x5d, 0xd2, 0x3d, 0x64, 0x0e, 0xc3, 0x03, 0x77, 0xdd, 0x6f, 0x0f, 0x7a, 0xd4, - 0xe5, 0xe8, 0x69, 0x98, 0x70, 0x49, 0x8f, 0x2e, 0x59, 0x4f, 0x5b, 0xcf, 0x95, 0x6b, 0x33, 0x9f, - 0x1d, 0xad, 0x9e, 0x3b, 0x3e, 0x5a, 0x9d, 0x78, 0x93, 0xf4, 0x28, 0x96, 0x14, 0xf4, 0x2d, 0x98, - 0x3c, 0x20, 0xdd, 0x01, 0x5d, 0x2a, 0xc8, 0x2e, 0xb3, 0xba, 0xcb, 0xe4, 0x3d, 0xd1, 0x88, 0x15, - 0xcd, 0xfe, 0xfd, 0x62, 0x0c, 0xfe, 0x3b, 0x94, 0x93, 0x16, 0xe1, 0x04, 0xf5, 0xa0, 0xd4, 0x25, - 0xbb, 0xb4, 0xcb, 0x96, 0xac, 0xa7, 0x8b, 0xcf, 0x55, 0x2e, 0xdf, 0xa8, 0x8e, 0xb2, 0x89, 0xd5, - 0x0c, 0xa8, 0xea, 0x96, 0xc4, 0xb9, 0xe1, 0x72, 0xff, 0xb0, 0x76, 0x5e, 0x4f, 0xa2, 0xa4, 0x1a, - 0xb1, 0x66, 0x82, 0x7e, 0xd7, 0x82, 0x0a, 0x71, 0x5d, 0x8f, 0x13, 0x2e, 0xb6, 0x69, 0xa9, 0x20, - 0x99, 0xde, 0x19, 0x9f, 0xe9, 0x7a, 0x04, 0xa6, 0x38, 0x5f, 0xd0, 0x9c, 0x2b, 0x06, 0x05, 0x9b, - 0x3c, 0x97, 0x5f, 0x87, 0x8a, 0x31, 0x55, 0x34, 0x0f, 0xc5, 0x7d, 0x7a, 0xa8, 0xe4, 0x8b, 0xc5, - 0x4f, 0xb4, 0x18, 0x13, 0xa8, 0x96, 0xe0, 0xb5, 0xc2, 0x55, 0x6b, 0xf9, 0x3a, 0xcc, 0x27, 0x19, - 0xe6, 0x19, 0x6f, 0xff, 0x99, 0x05, 0x8b, 0xc6, 0x2a, 0x30, 0xdd, 0xa3, 0x3e, 0x75, 0x9b, 0x14, - 0xad, 0x41, 0x59, 0xec, 0x25, 0xeb, 0x93, 0x66, 0xb0, 0xd5, 0x0b, 0x7a, 0x21, 0xe5, 0x37, 0x03, - 0x02, 0x8e, 0xfa, 0x84, 0x6a, 0x51, 0x78, 0x98, 0x5a, 0xf4, 0x3b, 0x84, 0xd1, 0xa5, 0x62, 0x5c, - 0x2d, 0xb6, 0x45, 0x23, 0x56, 0x34, 0xfb, 0x57, 0xe1, 0x1b, 0xc1, 0x7c, 0x76, 0x68, 0xaf, 0xdf, - 0x25, 0x9c, 0x46, 0x93, 0x3a, 0x51, 0xf5, 0xec, 0x7d, 0x98, 0x5d, 0xef, 0xf7, 0x7d, 0xef, 0x80, - 0xb6, 0x1a, 0x9c, 0xb4, 0x29, 0xba, 0x0f, 0x40, 0x74, 0xc3, 0x3a, 0x97, 0x03, 0x2b, 0x97, 0x7f, - 0xa9, 0xaa, 0x2c, 0xa2, 0x6a, 0x5a, 0x44, 0xb5, 0xbf, 0xdf, 0x16, 0x0d, 0xac, 0x2a, 0x0c, 0xaf, - 0x7a, 0x70, 0xa9, 0xba, 0xe3, 0xf4, 0x68, 0xed, 0xfc, 0xf1, 0xd1, 0x2a, 0xac, 0x87, 0x08, 0xd8, - 0x40, 0xb3, 0x7f, 0xcf, 0x82, 0x8b, 0xeb, 0x7e, 0xdb, 0xab, 0x6f, 0xac, 0xf7, 0xfb, 0xb7, 0x29, - 0xe9, 0xf2, 0x4e, 0x83, 0x13, 0x3e, 0x60, 0xe8, 0x3a, 0x94, 0x98, 0xfc, 0xa5, 0xa7, 0xfa, 0x6c, - 0xa0, 0x7d, 0x8a, 0xfe, 0xe0, 0x68, 0x75, 0x31, 0x63, 0x20, 0xc5, 0x7a, 0x14, 0x7a, 0x1e, 0xa6, - 0x7a, 0x94, 0x31, 0xd2, 0x0e, 0xe4, 0x39, 0xa7, 0x01, 0xa6, 0xbe, 0xa3, 0x9a, 0x71, 0x40, 0xb7, - 0xff, 0xb1, 0x00, 0x73, 0x21, 0x96, 0x66, 0x7f, 0x06, 0x9b, 0x37, 0x80, 0x99, 0x8e, 0xb1, 0x42, - 0xb9, 0x87, 0x95, 0xcb, 0x6f, 0x8c, 0x68, 0x27, 0x59, 0x42, 0xaa, 0x2d, 0x6a, 0x36, 0x33, 0x66, - 0x2b, 0x8e, 0xb1, 0x41, 0x3d, 0x00, 0x76, 0xe8, 0x36, 0x35, 0xd3, 0x09, 0xc9, 0xf4, 0xf5, 0x9c, - 0x4c, 0x1b, 0x21, 0x40, 0x0d, 0x69, 0x96, 0x10, 0xb5, 0x61, 0x83, 0x81, 0xfd, 0x77, 0x16, 0x5c, - 0xc8, 0x18, 0x87, 0x7e, 0x25, 0xb1, 0x9f, 0xcf, 0xa4, 0xf6, 0x13, 0xa5, 0x86, 0x45, 0xbb, 0xf9, - 0x22, 0x4c, 0xfb, 0xf4, 0xc0, 0x11, 0xe7, 0x80, 0x96, 0xf0, 0xbc, 0x1e, 0x3f, 0x8d, 0x75, 0x3b, - 0x0e, 0x7b, 0xa0, 0x17, 0xa0, 0x1c, 0xfc, 0x16, 0x62, 0x2e, 0x0a, 0x53, 0x11, 0x1b, 0x17, 0x74, - 0x65, 0x38, 0xa2, 0xdb, 0xbf, 0x03, 0x93, 0xf5, 0x0e, 0xf1, 0xb9, 0xd0, 0x18, 0x9f, 0xf6, 0xbd, - 0xb7, 0xf0, 0x96, 0x9e, 0x62, 0xa8, 0x31, 0x58, 0x35, 0xe3, 0x80, 0x3e, 0xc2, 0x66, 0x3f, 0x0f, - 0x53, 0x07, 0xd4, 0x97, 0xf3, 0x2d, 0xc6, 0xc1, 0xee, 0xa9, 0x66, 0x1c, 0xd0, 0xed, 0x7f, 0xb5, - 0x60, 0x51, 0xce, 0x60, 0xc3, 0x61, 0x4d, 0xef, 0x80, 0xfa, 0x87, 0x98, 0xb2, 0x41, 0xf7, 0x94, - 0x27, 0xb4, 0x01, 0xf3, 0x8c, 0xf6, 0x0e, 0xa8, 0x5f, 0xf7, 0x5c, 0xc6, 0x7d, 0xe2, 0xb8, 0x5c, - 0xcf, 0x6c, 0x49, 0xf7, 0x9e, 0x6f, 0x24, 0xe8, 0x38, 0x35, 0x02, 0x3d, 0x07, 0xd3, 0x7a, 0xda, - 0x42, 0x95, 0x84, 0x60, 0x67, 0xc4, 0x1e, 0xe8, 0x35, 0x31, 0x1c, 0x52, 0xed, 0xff, 0xb2, 0x60, - 0x41, 0xae, 0xaa, 0x31, 0xd8, 0x65, 0x4d, 0xdf, 0xe9, 0x0b, 0xf7, 0xfa, 0x75, 0x5c, 0xd2, 0x75, - 0x38, 0xdf, 0x0a, 0x04, 0xbf, 0xe5, 0xf4, 0x1c, 0x2e, 0x6d, 0x64, 0xb2, 0xf6, 0x84, 0xc6, 0x38, - 0xbf, 0x11, 0xa3, 0xe2, 0x44, 0x6f, 0xfb, 0x5d, 0x98, 0xa9, 0x0f, 0x7c, 0x9f, 0xba, 0x5c, 0xb9, - 0xcb, 0x6f, 0xc3, 0x24, 0x73, 0x5c, 0xed, 0x35, 0xf2, 0x79, 0xca, 0xb2, 0xf0, 0xe5, 0x0d, 0x31, - 0x18, 0x2b, 0x0c, 0xfb, 0x2f, 0x8a, 0x70, 0x21, 0xe0, 0x4f, 0x5b, 0xeb, 0x3e, 0x77, 0xf6, 0x48, - 0x93, 0x33, 0xd4, 0x82, 0x99, 0x56, 0xd4, 0xcc, 0xb5, 0x59, 0xe7, 0xe1, 0x15, 0xba, 0x0e, 0x03, - 0x9e, 0xe3, 0x18, 0x2a, 0x7a, 0x1b, 0x8a, 0x6d, 0x87, 0xeb, 0x28, 0xe2, 0xea, 0x68, 0x3e, 0xe3, - 0x96, 0x93, 0xd4, 0xe3, 0x5a, 0x45, 0xb3, 0x2a, 0xde, 0x72, 0x38, 0x16, 0x88, 0x68, 0x17, 0x4a, - 0x4e, 0x8f, 0xb4, 0x69, 0x10, 0x2c, 0x5c, 0x1b, 0x0d, 0x7b, 0x53, 0x8c, 0x49, 0xa2, 0x87, 0x61, - 0x89, 0xa4, 0x32, 0xac, 0x91, 0x05, 0x8f, 0xa6, 0xd0, 0x3f, 0xe5, 0x01, 0x46, 0xe6, 0x91, 0x65, - 0x89, 0x11, 0x0f, 0x49, 0x65, 0x58, 0x23, 0xdb, 0x5f, 0x16, 0x60, 0x3e, 0x92, 0x5f, 0xdd, 0xeb, - 0xf5, 0x1c, 0x8e, 0x96, 0xa1, 0xe0, 0xb4, 0xb4, 0x7a, 0x83, 0x1e, 0x58, 0xd8, 0xdc, 0xc0, 0x05, - 0xa7, 0x85, 0x9e, 0x85, 0xd2, 0xae, 0x4f, 0xdc, 0x66, 0x47, 0xab, 0x75, 0x08, 0x5c, 0x93, 0xad, - 0x58, 0x53, 0xd1, 0x53, 0x50, 0xe4, 0xa4, 0xad, 0xb5, 0x39, 0x94, 0xdf, 0x0e, 0x69, 0x63, 0xd1, - 0x2e, 0xcc, 0x88, 0x0d, 0x76, 0xbf, 0x4f, 0x9b, 0x6a, 0xe7, 0x0d, 0x33, 0x6a, 0xa8, 0x66, 0x1c, - 0xd0, 0x05, 0x47, 0x32, 0xe0, 0x1d, 0xcf, 0x5f, 0x9a, 0x8c, 0x73, 0x5c, 0x97, 0xad, 0x58, 0x53, - 0xc5, 0x81, 0xd7, 0x94, 0xf3, 0xe7, 0xd4, 0x5f, 0x2a, 0xc5, 0x0f, 0xbc, 0x7a, 0x40, 0xc0, 0x51, - 0x1f, 0xf4, 0x3e, 0x54, 0x9a, 0x3e, 0x25, 0xdc, 0xf3, 0x37, 0x08, 0xa7, 0x4b, 0x53, 0xb9, 0x35, - 0x70, 0x4e, 0x44, 0x74, 0xf5, 0x08, 0x02, 0x9b, 0x78, 0xf6, 0x7f, 0x5b, 0xb0, 0x14, 0x89, 0x56, - 0xee, 0x6d, 0x14, 0xc5, 0x68, 0xf1, 0x58, 0x43, 0xc4, 0xf3, 0x2c, 0x94, 0x5a, 0x4e, 0x9b, 0x32, - 0x9e, 0x94, 0xf2, 0x86, 0x6c, 0xc5, 0x9a, 0x8a, 0x2e, 0x03, 0xb4, 0x1d, 0xae, 0x3d, 0x8f, 0x16, - 0x76, 0x78, 0xbe, 0xdd, 0x0a, 0x29, 0xd8, 0xe8, 0x85, 0xde, 0x86, 0xb2, 0x9c, 0xe6, 0x98, 0x66, - 0x27, 0xcf, 0xa1, 0x7a, 0x00, 0x80, 0x23, 0x2c, 0xfb, 0x8b, 0x09, 0x98, 0xba, 0xe9, 0x53, 0xa7, - 0xdd, 0xe1, 0xe8, 0x7b, 0x30, 0xdd, 0xd3, 0xd1, 0xb0, 0x76, 0x23, 0xbf, 0x3c, 0x1a, 0x8f, 0xbb, - 0x72, 0xd3, 0x45, 0x24, 0x1d, 0x2d, 0x24, 0x6a, 0xc3, 0x21, 0xaa, 0x88, 0x24, 0x49, 0xd7, 0x21, - 0x4c, 0xee, 0x9b, 0x11, 0x49, 0xae, 0x8b, 0x46, 0xac, 0x68, 0xe8, 0x5d, 0x28, 0x79, 0xbe, 0xd3, - 0x76, 0xdc, 0xa5, 0xb2, 0x9c, 0xc4, 0xcb, 0xa3, 0x99, 0x90, 0x5e, 0xc5, 0x5d, 0x39, 0x34, 0x12, - 0xbe, 0xfa, 0x1b, 0x6b, 0x48, 0x74, 0x1f, 0xa6, 0x94, 0x32, 0x05, 0x06, 0xba, 0x36, 0xb2, 0x83, - 0x51, 0xfa, 0x18, 0x29, 0xbd, 0xfa, 0x9b, 0xe1, 0x00, 0x10, 0x35, 0x42, 0xff, 0x32, 0x21, 0xa1, - 0x5f, 0xc8, 0xe1, 0x5f, 0x86, 0x3a, 0x94, 0x46, 0xe8, 0x50, 0x26, 0xf3, 0x80, 0x4a, 0x97, 0x31, - 0xcc, 0x83, 0x08, 0x11, 0xeb, 0xb0, 0xa8, 0x34, 0x86, 0x88, 0x75, 0x4c, 0x76, 0x3e, 0x1e, 0x4b, - 0x05, 0x51, 0x93, 0xfd, 0x71, 0x11, 0x16, 0x74, 0xcf, 0xba, 0xd7, 0xed, 0xd2, 0xa6, 0x3c, 0x83, - 0x95, 0x7f, 0x2a, 0x66, 0xfa, 0x27, 0x07, 0x26, 0x1d, 0x4e, 0x7b, 0x41, 0xe6, 0x58, 0xcb, 0x35, - 0x9b, 0x88, 0x47, 0x75, 0x53, 0x80, 0xa8, 0xe4, 0x2d, 0xdc, 0x25, 0xdd, 0x0b, 0x2b, 0x0e, 0xe8, - 0x0f, 0x2d, 0xb8, 0x70, 0x40, 0x7d, 0x67, 0xcf, 0x69, 0xca, 0xd4, 0xeb, 0xb6, 0xc3, 0xb8, 0xe7, - 0x1f, 0xea, 0x13, 0xe1, 0xd5, 0xd1, 0x38, 0xdf, 0x33, 0x00, 0x36, 0xdd, 0x3d, 0xaf, 0xf6, 0x4d, - 0xcd, 0xed, 0xc2, 0xbd, 0x34, 0x34, 0xce, 0xe2, 0xb7, 0xdc, 0x07, 0x88, 0x66, 0x9b, 0x91, 0xf9, - 0x6d, 0x99, 0x99, 0xdf, 0xc8, 0x13, 0x0b, 0x16, 0x1b, 0xb8, 0x2c, 0x33, 0x63, 0xfc, 0xd4, 0x82, - 0x8a, 0xa6, 0x6f, 0x39, 0x8c, 0xa3, 0xf7, 0x52, 0xd6, 0x5e, 0x1d, 0xcd, 0xda, 0xc5, 0x68, 0x69, - 0xeb, 0x61, 0x30, 0x1c, 0xb4, 0x18, 0x96, 0x8e, 0x83, 0x2d, 0x55, 0x82, 0x7d, 0x29, 0xd7, 0xfc, - 0x23, 0xc7, 0x20, 0x65, 0xa4, 0xf7, 0xce, 0xf6, 0x61, 0x36, 0x66, 0xe4, 0xe8, 0x0a, 0x4c, 0xec, - 0x3b, 0x6e, 0x70, 0xea, 0xfd, 0x62, 0x10, 0xac, 0x7d, 0xdb, 0x71, 0x5b, 0x0f, 0x8e, 0x56, 0x17, - 0x62, 0x9d, 0x45, 0x23, 0x96, 0xdd, 0x4f, 0x8e, 0xf1, 0xae, 0x4d, 0xff, 0xe4, 0xaf, 0x56, 0xcf, - 0xfd, 0xf0, 0x67, 0x4f, 0x9f, 0xb3, 0x3f, 0x29, 0xc2, 0x7c, 0x52, 0xaa, 0x23, 0x54, 0x52, 0x22, - 0x1f, 0x36, 0x7d, 0xa6, 0x3e, 0xac, 0x70, 0x76, 0x3e, 0xac, 0x78, 0x16, 0x3e, 0x6c, 0xe2, 0xd4, - 0x7c, 0x98, 0xfd, 0x4f, 0x16, 0x9c, 0x0f, 0x77, 0xe6, 0xc3, 0x81, 0x38, 0x59, 0x23, 0xa9, 0x5b, - 0xa7, 0x2f, 0xf5, 0x0f, 0x60, 0x8a, 0x79, 0x03, 0xbf, 0x29, 0xc3, 0x47, 0x81, 0xfe, 0x4a, 0x3e, - 0xa7, 0xa9, 0xc6, 0x1a, 0x31, 0x93, 0x6a, 0xc0, 0x01, 0xaa, 0xb9, 0x20, 0x4d, 0x53, 0x21, 0x85, - 0x2f, 0x02, 0x2e, 0xb1, 0xa0, 0x69, 0x33, 0xa4, 0x10, 0xad, 0x58, 0x53, 0x91, 0x2d, 0xfd, 0x79, - 0x10, 0xd9, 0x96, 0x6b, 0xa0, 0xdd, 0xb2, 0xdc, 0x04, 0x45, 0x41, 0x7d, 0x98, 0xf7, 0xe9, 0x87, - 0x03, 0xc7, 0xa7, 0xad, 0x86, 0x47, 0xf6, 0x45, 0x5c, 0xa0, 0x8b, 0x01, 0x23, 0xda, 0xfd, 0xc6, - 0xc0, 0x97, 0x2e, 0xac, 0xb6, 0x28, 0x72, 0x1c, 0x9c, 0xc0, 0xc2, 0x29, 0x74, 0xfb, 0x3f, 0x26, - 0x43, 0x83, 0xd5, 0xe9, 0xf8, 0x6f, 0x42, 0xa5, 0xa9, 0xb2, 0x96, 0xee, 0xe1, 0xa6, 0xab, 0x55, - 0x6c, 0x63, 0x8c, 0xc3, 0xa7, 0x5a, 0x8f, 0x60, 0x12, 0xd5, 0x3a, 0x83, 0x82, 0x4d, 0x6e, 0xe8, - 0x07, 0x00, 0xca, 0x13, 0xd3, 0xd6, 0xa6, 0xab, 0x8f, 0x9a, 0xfa, 0x38, 0xbc, 0xef, 0x85, 0x28, - 0x8a, 0x75, 0x18, 0xf3, 0x44, 0x04, 0x6c, 0xb0, 0x12, 0xab, 0x0e, 0x8a, 0x4f, 0x37, 0x3d, 0x5f, - 0xdb, 0xec, 0x58, 0xab, 0x5e, 0x8f, 0x60, 0x92, 0x35, 0xca, 0x88, 0x82, 0x4d, 0x6e, 0xcb, 0x3e, - 0xcc, 0x27, 0x65, 0x95, 0x71, 0xdc, 0xdc, 0x8e, 0x1f, 0x37, 0x97, 0x47, 0x34, 0x50, 0x23, 0x03, - 0x35, 0x8b, 0x9b, 0x3e, 0xcc, 0x25, 0x64, 0x94, 0xc1, 0x72, 0x33, 0xce, 0xf2, 0xe5, 0x3c, 0x47, - 0xaf, 0x2e, 0x12, 0x9a, 0x3c, 0x19, 0xcc, 0x27, 0xa5, 0x73, 0x6a, 0x4c, 0x63, 0x95, 0x49, 0xf3, - 0x4c, 0xfd, 0xcb, 0x02, 0x94, 0x43, 0xaf, 0x9a, 0xa7, 0xcc, 0xa0, 0xa2, 0xa1, 0xc2, 0x09, 0xd9, - 0x5a, 0x71, 0x94, 0x6c, 0x6d, 0x62, 0x78, 0xb6, 0x16, 0x94, 0x22, 0x4b, 0x0f, 0x2f, 0x45, 0x1a, - 0xd9, 0xda, 0xd4, 0xe8, 0xd9, 0xda, 0xf4, 0xc9, 0xd9, 0x9a, 0xfd, 0xd7, 0x16, 0xa0, 0x74, 0x6a, - 0x9e, 0x47, 0x50, 0x24, 0x79, 0xd6, 0x8d, 0x18, 0x09, 0x25, 0xf3, 0xe3, 0xe1, 0x47, 0x9e, 0xfd, - 0xe9, 0x24, 0xcc, 0xdd, 0x72, 0xc6, 0xae, 0x18, 0x71, 0x78, 0x52, 0x21, 0x35, 0xa8, 0x8e, 0x43, - 0x1b, 0xdc, 0x27, 0x9c, 0xb6, 0x0f, 0xf5, 0xfe, 0x5e, 0xd3, 0x43, 0x9f, 0xac, 0x67, 0x77, 0x7b, - 0x30, 0x9c, 0x84, 0x87, 0x41, 0x8f, 0xac, 0x24, 0x6f, 0xc0, 0x2c, 0xe3, 0xbe, 0xd3, 0xe4, 0xaa, - 0x26, 0xc5, 0x96, 0x2a, 0xf2, 0x20, 0xb9, 0xa8, 0xbb, 0xcf, 0x36, 0x4c, 0x22, 0x8e, 0xf7, 0xcd, - 0x2c, 0x75, 0x4d, 0xe4, 0x2e, 0x75, 0xad, 0x41, 0x99, 0x74, 0xbb, 0xde, 0x0f, 0x76, 0x48, 0x9b, - 0xe9, 0x72, 0x40, 0xa8, 0x35, 0xeb, 0x01, 0x01, 0x47, 0x7d, 0x50, 0x15, 0xc0, 0x69, 0xbb, 0x9e, - 0x4f, 0xe5, 0x88, 0x92, 0x3c, 0xd1, 0x64, 0x39, 0x7f, 0x33, 0x6c, 0xc5, 0x46, 0x0f, 0xd4, 0x80, - 0x8b, 0x8e, 0xcb, 0x68, 0x73, 0xe0, 0xd3, 0xc6, 0xbe, 0xd3, 0xdf, 0xd9, 0x6a, 0x48, 0x2f, 0x71, - 0x28, 0xb5, 0x79, 0xba, 0xf6, 0x94, 0x66, 0x76, 0x71, 0x33, 0xab, 0x13, 0xce, 0x1e, 0x8b, 0x5e, - 0x81, 0x19, 0xc7, 0x6d, 0x76, 0x07, 0x2d, 0xba, 0x4d, 0x78, 0x87, 0x2d, 0x4d, 0xcb, 0x69, 0xcc, - 0x1f, 0x1f, 0xad, 0xce, 0x6c, 0x1a, 0xed, 0x38, 0xd6, 0x4b, 0x8c, 0xa2, 0x1f, 0x19, 0xa3, 0xca, - 0xd1, 0xa8, 0x1b, 0x1f, 0x99, 0xa3, 0xcc, 0x5e, 0x19, 0xc5, 0x40, 0xc8, 0x55, 0x0c, 0xfc, 0x69, - 0x01, 0x4a, 0xaa, 0x16, 0x8f, 0xae, 0x24, 0x0a, 0xde, 0x4f, 0xa5, 0x0a, 0xde, 0x95, 0xac, 0x7b, - 0x0b, 0x1b, 0x4a, 0x0e, 0x63, 0x83, 0x78, 0x00, 0xb1, 0x29, 0x5b, 0xb0, 0xa6, 0xc8, 0xd2, 0x96, - 0xe7, 0xee, 0x39, 0x6d, 0x5d, 0x80, 0xb8, 0x6e, 0x84, 0x0d, 0xd1, 0x7d, 0xe9, 0x07, 0xe1, 0x85, - 0x6a, 0x14, 0x41, 0xc4, 0x3a, 0x88, 0x50, 0xe2, 0x4e, 0xe3, 0xee, 0x9b, 0x8a, 0x47, 0x5d, 0x22, - 0x62, 0x8d, 0x2c, 0x78, 0x78, 0x03, 0xde, 0x1f, 0x70, 0xa9, 0x28, 0xa7, 0xc4, 0xe3, 0xae, 0x44, - 0xc4, 0x1a, 0xd9, 0xfe, 0xc4, 0x82, 0x39, 0x25, 0x83, 0x7a, 0x87, 0x36, 0xf7, 0x1b, 0x9c, 0xf6, - 0x45, 0x44, 0x3f, 0x60, 0x94, 0x25, 0x23, 0xfa, 0xb7, 0x18, 0x65, 0x58, 0x52, 0x8c, 0xd5, 0x17, - 0xce, 0x6a, 0xf5, 0xf6, 0xdf, 0x5a, 0x30, 0x29, 0x43, 0xe7, 0x3c, 0xfe, 0x27, 0x5e, 0x4e, 0x2a, - 0x8c, 0x54, 0x4e, 0x3a, 0xa1, 0xd0, 0x17, 0x55, 0xb2, 0x26, 0x1e, 0x56, 0xc9, 0xb2, 0x7f, 0x6e, - 0xc1, 0x62, 0x56, 0x75, 0x34, 0xcf, 0xf4, 0x5f, 0x84, 0xe9, 0x7e, 0x97, 0xf0, 0x3d, 0xcf, 0xef, - 0x25, 0xef, 0x58, 0xb6, 0x75, 0x3b, 0x0e, 0x7b, 0x20, 0x1f, 0xc0, 0x0f, 0xd2, 0xb0, 0x20, 0x45, - 0xb9, 0x9e, 0xf7, 0x44, 0x88, 0x97, 0xf5, 0x22, 0x61, 0x85, 0x4d, 0x0c, 0x1b, 0x5c, 0xec, 0x3f, - 0x9e, 0x84, 0x05, 0x39, 0x64, 0xdc, 0x13, 0x62, 0x9c, 0x1d, 0xea, 0xc3, 0x13, 0x32, 0x79, 0x4a, - 0x1f, 0x2a, 0x6a, 0xd3, 0xae, 0xea, 0xf1, 0x4f, 0x6c, 0x66, 0xf6, 0x7a, 0x30, 0x94, 0x82, 0x87, - 0xe0, 0xa6, 0x4f, 0x0a, 0xf8, 0xff, 0x77, 0x52, 0x98, 0xca, 0x36, 0x75, 0xa2, 0xb2, 0x0d, 0x3d, - 0x57, 0xa6, 0x1f, 0xe1, 0x5c, 0x49, 0xfb, 0xfa, 0x72, 0x2e, 0x5f, 0xff, 0xe7, 0x05, 0x98, 0xda, - 0xf6, 0x3d, 0x59, 0x65, 0x3f, 0xfb, 0x82, 0xed, 0x5d, 0x98, 0x60, 0x7d, 0xda, 0xd4, 0x3e, 0xef, - 0xd2, 0x68, 0x96, 0xa6, 0xa7, 0xd7, 0xe8, 0xd3, 0x66, 0x6d, 0x5a, 0xb8, 0x51, 0xf1, 0x0b, 0x4b, - 0x20, 0xa3, 0xf2, 0x58, 0xcc, 0x13, 0x81, 0x07, 0x90, 0x0f, 0xaf, 0x3c, 0x7e, 0x6a, 0x41, 0x45, - 0xf7, 0xfc, 0xda, 0x96, 0xb8, 0xf4, 0xfc, 0x86, 0x94, 0xb8, 0xfe, 0x34, 0x5a, 0x81, 0x10, 0x1a, - 0xfa, 0x6d, 0x58, 0xe8, 0xfb, 0x5e, 0xcf, 0x13, 0x96, 0xba, 0xed, 0x75, 0x9d, 0xa6, 0x43, 0x83, - 0x2a, 0xe9, 0x95, 0x91, 0xf9, 0x19, 0xc3, 0x0f, 0x6b, 0xdf, 0xd0, 0x7c, 0x17, 0xb6, 0x93, 0xb8, - 0x38, 0xcd, 0xca, 0xfe, 0x37, 0x0b, 0x66, 0x63, 0xb2, 0x47, 0x4d, 0x80, 0xa6, 0xe7, 0xb6, 0x1c, - 0x1e, 0x5e, 0x73, 0x57, 0x2e, 0xaf, 0x8d, 0x26, 0xd5, 0x7a, 0x30, 0x2e, 0x52, 0xba, 0xb0, 0x89, - 0x61, 0x03, 0x16, 0xbd, 0x1c, 0xbc, 0x38, 0x89, 0x07, 0x31, 0xea, 0xc5, 0xc9, 0x83, 0xa3, 0xd5, - 0x19, 0x3d, 0x27, 0xf3, 0x05, 0x4a, 0x9e, 0xb7, 0x17, 0x7f, 0x53, 0x80, 0x72, 0xb8, 0xfe, 0xc7, - 0x60, 0x46, 0x6f, 0xc5, 0xcc, 0xe8, 0xe5, 0x9c, 0x3b, 0x27, 0x0d, 0x29, 0x8c, 0x49, 0x0c, 0x63, - 0x7a, 0x3f, 0x61, 0x4c, 0x79, 0x55, 0xe2, 0x04, 0x73, 0xfa, 0x07, 0xb5, 0xf9, 0xaa, 0xef, 0x63, - 0x30, 0xa8, 0x9d, 0xb8, 0x41, 0xad, 0xe5, 0x5c, 0xcd, 0x10, 0x93, 0xfa, 0x91, 0x05, 0x73, 0x09, - 0x23, 0x40, 0xdf, 0x82, 0x49, 0x59, 0x15, 0xd3, 0xfa, 0x15, 0x0e, 0xd4, 0x09, 0xbe, 0xa4, 0xa1, - 0x6d, 0x58, 0x24, 0x03, 0xee, 0x85, 0x63, 0x6f, 0xb8, 0x64, 0xb7, 0x4b, 0x55, 0xd6, 0x3e, 0x5d, - 0xfb, 0x05, 0x3d, 0x66, 0x71, 0x3d, 0xa3, 0x0f, 0xce, 0x1c, 0x69, 0x7f, 0x5e, 0x00, 0x14, 0x36, - 0xe6, 0x29, 0x27, 0xbf, 0x0f, 0x53, 0x7b, 0xaa, 0x10, 0xf4, 0x68, 0xf7, 0x01, 0xb5, 0x8a, 0x79, - 0x25, 0x12, 0x60, 0xa2, 0x77, 0x4e, 0x47, 0x8f, 0x20, 0xad, 0x43, 0xe8, 0x3e, 0xc0, 0x9e, 0xe3, - 0x3a, 0xac, 0x33, 0xe6, 0xcd, 0xa5, 0x3c, 0xcd, 0x6f, 0x86, 0x08, 0xd8, 0x40, 0xb3, 0x3f, 0x2e, - 0x18, 0xfa, 0x29, 0xdd, 0xe5, 0x48, 0xfb, 0xfa, 0x7c, 0x5c, 0x98, 0xe5, 0xf4, 0x5d, 0x91, 0x21, - 0x98, 0x89, 0x03, 0xe2, 0x07, 0x65, 0xeb, 0xd7, 0x72, 0x8a, 0xe5, 0x1e, 0xf1, 0x1d, 0xb1, 0xf1, - 0xd1, 0x96, 0xde, 0x23, 0x3e, 0xc3, 0x12, 0x12, 0x7d, 0x57, 0x4c, 0x95, 0xf6, 0x03, 0x17, 0x9a, - 0xdb, 0x27, 0x70, 0xda, 0x37, 0xd7, 0x47, 0xfb, 0x0c, 0x2b, 0x40, 0xfb, 0xe3, 0x29, 0x43, 0xe1, - 0xb5, 0xd7, 0xbe, 0x03, 0xa8, 0x4b, 0x18, 0xbf, 0x4d, 0xdc, 0x96, 0x50, 0x4f, 0xba, 0xe7, 0x53, - 0xd6, 0xd1, 0x11, 0xda, 0xb2, 0x46, 0x41, 0x5b, 0xa9, 0x1e, 0x38, 0x63, 0x14, 0xba, 0x12, 0x77, - 0xce, 0xab, 0x49, 0xe7, 0x7c, 0x3e, 0xb2, 0xb6, 0xf1, 0xdc, 0xb3, 0xa9, 0xee, 0x93, 0x67, 0xa0, - 0xee, 0xbf, 0x05, 0x0b, 0x7b, 0xc9, 0xbb, 0x43, 0xfd, 0x92, 0xe0, 0xb5, 0x31, 0xaf, 0x1e, 0x6b, - 0x17, 0x8f, 0xa3, 0x0b, 0xa7, 0xa8, 0x19, 0xa7, 0x19, 0x21, 0x2f, 0x78, 0x90, 0x27, 0xb3, 0x4f, - 0x55, 0x58, 0x18, 0xd9, 0xe4, 0x12, 0x79, 0x6b, 0xf2, 0x29, 0x9e, 0x82, 0xc4, 0x31, 0x06, 0x09, - 0x13, 0x2c, 0x9d, 0xa6, 0x09, 0xa2, 0x2b, 0x61, 0x41, 0x5f, 0x4c, 0x47, 0x86, 0xb2, 0xc5, 0x54, - 0x29, 0x5e, 0x90, 0xb0, 0xd9, 0x0f, 0xfd, 0xd8, 0x82, 0x8b, 0x42, 0x59, 0x6f, 0x7c, 0x44, 0x9b, - 0x03, 0x21, 0x95, 0xe0, 0x15, 0xee, 0x52, 0x45, 0x4a, 0x63, 0xc4, 0xe7, 0x89, 0x8d, 0x2c, 0x88, - 0x28, 0x2e, 0xcf, 0x24, 0xe3, 0x6c, 0xc6, 0xe8, 0x03, 0xe9, 0x3a, 0x38, 0x95, 0x69, 0xcf, 0xa3, - 0xa7, 0xf7, 0x65, 0xed, 0x76, 0xb8, 0x72, 0x3b, 0x9c, 0xda, 0x7f, 0x12, 0xf3, 0x56, 0xa3, 0x15, - 0x1d, 0x96, 0xa1, 0x40, 0x58, 0xb2, 0x4c, 0xbc, 0xce, 0x70, 0x81, 0x30, 0xf4, 0x0e, 0x4c, 0xfa, - 0x94, 0xfb, 0x87, 0xda, 0xa9, 0x5e, 0x1d, 0xc3, 0x81, 0x60, 0x31, 0x5e, 0x4d, 0x55, 0xfe, 0xc4, - 0x0a, 0xd1, 0xa8, 0x75, 0x14, 0xcf, 0xac, 0xd6, 0xf1, 0x53, 0xcb, 0x38, 0x0b, 0xc3, 0xc9, 0xa0, - 0xb7, 0x60, 0x8a, 0x3b, 0x3d, 0xea, 0x0d, 0x78, 0xbe, 0x00, 0x23, 0xbc, 0x9c, 0x92, 0x26, 0xbf, - 0xa3, 0x20, 0x70, 0x80, 0x25, 0xb2, 0x2e, 0xea, 0xfb, 0x9e, 0xbf, 0xd3, 0x11, 0x2e, 0xcc, 0xeb, - 0xaa, 0x53, 0x7c, 0x36, 0xca, 0xba, 0x6e, 0xc4, 0xa8, 0x38, 0xd1, 0xdb, 0xfe, 0xdc, 0x0c, 0x85, - 0x76, 0x08, 0xdb, 0x7f, 0x0c, 0x41, 0xe3, 0x3b, 0xb1, 0xa0, 0x31, 0xef, 0xe1, 0x23, 0x26, 0x39, - 0x2c, 0x70, 0xb4, 0x89, 0x21, 0x7b, 0xd1, 0x71, 0xd3, 0xed, 0x0f, 0x46, 0xf9, 0x40, 0xe0, 0x79, - 0x98, 0x6a, 0xd1, 0x3d, 0x32, 0xe8, 0xa6, 0x8e, 0xce, 0x0d, 0xd5, 0x8c, 0x03, 0xba, 0xfd, 0xcf, - 0x16, 0x2c, 0xc4, 0x78, 0x3c, 0x86, 0x00, 0xf2, 0xbd, 0x78, 0x00, 0x39, 0x8e, 0xc8, 0x04, 0xea, - 0x90, 0x40, 0x32, 0xb5, 0x22, 0x19, 0x72, 0x7c, 0x0f, 0x4a, 0x8e, 0x90, 0x1e, 0xcb, 0xf7, 0x60, - 0x31, 0x2d, 0x7e, 0xe3, 0xf6, 0x5c, 0xe2, 0x61, 0x8d, 0x1b, 0x45, 0x0a, 0x85, 0xd3, 0x8e, 0x14, - 0x7c, 0x73, 0x41, 0xfa, 0xd1, 0x3e, 0x7a, 0x5f, 0xab, 0x9d, 0x95, 0xe7, 0xa1, 0x78, 0x0a, 0x66, - 0xa8, 0xea, 0x7d, 0x6e, 0xc1, 0xc5, 0xcc, 0xde, 0x61, 0xb0, 0x55, 0x38, 0xc3, 0x60, 0xcb, 0x3a, - 0x6d, 0x11, 0xde, 0x37, 0x44, 0x18, 0x4c, 0xe1, 0xb4, 0xbe, 0xb4, 0xf9, 0x49, 0x01, 0xe6, 0x31, - 0xed, 0x7b, 0xb1, 0xba, 0xe3, 0x76, 0xf0, 0x3a, 0x36, 0x47, 0xa0, 0x9e, 0xb8, 0xdd, 0xaa, 0x4d, - 0xc5, 0x9e, 0xc5, 0x7e, 0x17, 0x26, 0x65, 0x49, 0x30, 0x9f, 0xa3, 0x49, 0x55, 0x44, 0xd5, 0x39, - 0xa2, 0x6a, 0xab, 0x0a, 0x50, 0x20, 0xcb, 0xc7, 0x1a, 0xfa, 0x18, 0x79, 0x2d, 0xc7, 0xb3, 0x8f, - 0x34, 0xb2, 0x6c, 0xc6, 0x0a, 0xd0, 0xfe, 0xa4, 0x00, 0x2a, 0xa8, 0x7f, 0x0c, 0x7e, 0xf8, 0xd7, - 0x63, 0x7e, 0x78, 0x6d, 0xd4, 0xd0, 0x44, 0x88, 0x67, 0x58, 0xe2, 0x9e, 0x4c, 0xb8, 0x2e, 0xe5, - 0x01, 0x7d, 0x78, 0xd2, 0xfe, 0xf7, 0x16, 0x94, 0x65, 0xbf, 0xc7, 0xe0, 0x6f, 0xb7, 0xe3, 0xfe, - 0xf6, 0x85, 0x1c, 0xab, 0x18, 0xe2, 0x63, 0x3f, 0x2e, 0xea, 0xd9, 0x87, 0xe9, 0x5c, 0x87, 0xf8, - 0x2d, 0x9d, 0xa8, 0x44, 0x16, 0x28, 0x1a, 0xb1, 0xa2, 0xa1, 0xdf, 0x50, 0xef, 0x5a, 0x28, 0xe3, - 0xb4, 0x75, 0x33, 0xcc, 0x1a, 0x8a, 0xb9, 0x1f, 0xe8, 0xe8, 0x47, 0x44, 0x51, 0xc1, 0x1a, 0x27, - 0x50, 0x71, 0x8a, 0x8f, 0xc8, 0x24, 0xfa, 0x49, 0x5f, 0xa6, 0x23, 0xec, 0xd7, 0xc6, 0x74, 0x9c, - 0x2a, 0x93, 0x48, 0x35, 0xe3, 0x34, 0x23, 0xd4, 0x81, 0x19, 0xf3, 0x69, 0xa1, 0xd6, 0xa5, 0xcb, - 0xf9, 0xdf, 0x30, 0xaa, 0x0b, 0x4a, 0xb3, 0x05, 0xc7, 0x90, 0xed, 0xa3, 0x12, 0x54, 0x0c, 0xe5, - 0x4b, 0x14, 0x01, 0x67, 0xcf, 0xa6, 0x08, 0x98, 0x9d, 0xb3, 0x56, 0xc6, 0xca, 0x59, 0x2f, 0xc5, - 0x73, 0xd6, 0x6f, 0x26, 0x73, 0x56, 0x90, 0xab, 0x8b, 0xe5, 0xab, 0x0c, 0xce, 0xeb, 0xe4, 0x2d, - 0x78, 0x23, 0x9a, 0xab, 0x0a, 0x90, 0x4e, 0x11, 0x91, 0x88, 0x33, 0x6f, 0xc6, 0x20, 0x71, 0x82, - 0x85, 0x88, 0x53, 0x75, 0x4b, 0x63, 0xd0, 0xeb, 0x11, 0xff, 0x70, 0x69, 0x46, 0x4e, 0x38, 0x8c, - 0x53, 0x6f, 0xc6, 0xa8, 0x38, 0xd1, 0x1b, 0x6d, 0x43, 0x49, 0xe5, 0x7e, 0xfa, 0xdd, 0xe1, 0x8b, - 0x79, 0xd2, 0x4a, 0x15, 0xa7, 0xab, 0xdf, 0x58, 0xe3, 0x98, 0x69, 0x7b, 0xf9, 0x84, 0xb4, 0xfd, - 0x0e, 0x20, 0x6f, 0x57, 0x66, 0x04, 0xad, 0x5b, 0xea, 0x93, 0x54, 0xa1, 0x95, 0x25, 0x99, 0x13, - 0x86, 0x1b, 0x76, 0x37, 0xd5, 0x03, 0x67, 0x8c, 0x12, 0x56, 0xad, 0x13, 0xc6, 0xd0, 0x14, 0x74, - 0x8a, 0x9e, 0x37, 0xc0, 0x8a, 0xaa, 0x01, 0xf2, 0xdd, 0x5a, 0x3d, 0x81, 0x8a, 0x53, 0x7c, 0xd0, - 0x87, 0x30, 0x2b, 0x54, 0x28, 0x62, 0x0c, 0x8f, 0xc8, 0x78, 0xe1, 0xf8, 0x68, 0x75, 0x76, 0xcb, - 0x84, 0xc4, 0x71, 0x0e, 0xf6, 0x1f, 0x15, 0x21, 0x3b, 0x5d, 0x8d, 0x9e, 0xcc, 0x5b, 0x0f, 0x79, - 0x32, 0xff, 0x36, 0x94, 0x19, 0x27, 0xbe, 0xfa, 0x3c, 0xa0, 0x30, 0xde, 0xe7, 0x01, 0x8d, 0x00, - 0x00, 0x47, 0x58, 0x89, 0xda, 0x41, 0xf1, 0x54, 0x6b, 0x07, 0x97, 0x01, 0x64, 0x96, 0x55, 0xf7, - 0x06, 0xfa, 0xb6, 0x70, 0x36, 0xf2, 0x09, 0x37, 0x42, 0x0a, 0x36, 0x7a, 0xa1, 0xab, 0xe1, 0xc1, - 0xa9, 0xae, 0x07, 0x9f, 0x4e, 0x3d, 0x6f, 0x48, 0x56, 0x9f, 0x32, 0xbe, 0xcc, 0x3c, 0xe1, 0x39, - 0x94, 0xfd, 0xbf, 0x05, 0x88, 0x39, 0x43, 0xf4, 0x23, 0x0b, 0x16, 0x48, 0xe2, 0xe3, 0xd6, 0x20, - 0x96, 0xfc, 0xb5, 0x7c, 0x5f, 0x1c, 0xa7, 0xbe, 0x8d, 0x8d, 0x2e, 0x64, 0x92, 0x5d, 0x18, 0x4e, - 0x33, 0x45, 0x7f, 0x60, 0xc1, 0x05, 0x92, 0xfe, 0x7a, 0x59, 0x6f, 0xfa, 0xeb, 0x63, 0x7f, 0xfe, - 0x5c, 0x7b, 0xf2, 0xf8, 0x68, 0x35, 0xeb, 0xbb, 0x6e, 0x9c, 0xc5, 0x0e, 0xbd, 0x0b, 0x13, 0xc4, - 0x6f, 0x07, 0xc5, 0xcb, 0xfc, 0x6c, 0x83, 0x8f, 0xd2, 0xa3, 0xe8, 0x68, 0xdd, 0x6f, 0x33, 0x2c, - 0x41, 0xed, 0x9f, 0x15, 0x61, 0x3e, 0xf9, 0xc4, 0x5e, 0xbf, 0x98, 0x9b, 0xc8, 0x7c, 0x31, 0x27, - 0x6c, 0xa4, 0xc9, 0xc3, 0xe7, 0x6b, 0x91, 0x8d, 0x88, 0x46, 0xac, 0x68, 0xa1, 0x8d, 0xc8, 0x87, - 0xaf, 0x93, 0x8f, 0x60, 0x23, 0xf2, 0xb5, 0x6b, 0x84, 0x85, 0xae, 0xc6, 0xcf, 0x16, 0x3b, 0x79, - 0xb6, 0x2c, 0x98, 0x6b, 0x19, 0xb7, 0x24, 0xda, 0x83, 0x8a, 0xb1, 0x0f, 0xda, 0x12, 0xaf, 0xe5, - 0x96, 0x7b, 0xa4, 0x76, 0x73, 0xea, 0xcb, 0xf6, 0x88, 0x62, 0xe2, 0x47, 0x76, 0x2f, 0xa5, 0xf5, - 0x48, 0x35, 0x43, 0x29, 0x2e, 0x03, 0xcd, 0xfe, 0x77, 0x0b, 0x66, 0x63, 0xcf, 0x38, 0x05, 0xb7, - 0xe0, 0xb9, 0xec, 0xf8, 0xdf, 0x7a, 0xdf, 0x0b, 0x11, 0xb0, 0x81, 0x86, 0xbe, 0x0f, 0x95, 0xae, - 0xe7, 0xb6, 0x29, 0xe3, 0x0d, 0x8f, 0xec, 0x6b, 0x3b, 0xc9, 0x5b, 0x54, 0x5a, 0x3a, 0x3e, 0x5a, - 0x5d, 0xdc, 0x52, 0x30, 0x75, 0xaf, 0xd7, 0xef, 0x52, 0xae, 0xde, 0x39, 0x63, 0x13, 0x5c, 0x5e, - 0x2b, 0xbe, 0x4d, 0x7c, 0xda, 0xf1, 0x06, 0x8c, 0x7e, 0x5d, 0xaf, 0x15, 0xc3, 0x09, 0x9e, 0xf6, - 0xb5, 0x62, 0x04, 0x7c, 0xf2, 0xb5, 0x62, 0xd8, 0xf7, 0x6b, 0x7b, 0xad, 0x18, 0xce, 0x70, 0x48, - 0xa6, 0xf2, 0x3f, 0x05, 0x63, 0x15, 0xf1, 0x6c, 0xa5, 0xf0, 0x90, 0x6c, 0xe5, 0x3d, 0x98, 0x76, - 0x5c, 0x4e, 0xfd, 0x03, 0xd2, 0xd5, 0x85, 0xdb, 0xbc, 0xba, 0x18, 0x2e, 0x75, 0x53, 0xe3, 0xe0, - 0x10, 0x11, 0x75, 0xe1, 0x62, 0x70, 0xe1, 0xe0, 0x53, 0x12, 0x5d, 0x78, 0xea, 0x47, 0x43, 0xaf, - 0x06, 0x95, 0xf1, 0x9b, 0x59, 0x9d, 0x1e, 0x0c, 0x23, 0xe0, 0x6c, 0x50, 0xc4, 0x60, 0x96, 0x19, - 0x69, 0x7a, 0x70, 0x22, 0x8e, 0x78, 0x59, 0x93, 0xac, 0x6c, 0x18, 0x2f, 0x8d, 0x4c, 0x50, 0x1c, - 0xe7, 0x61, 0xff, 0x4b, 0x11, 0xe6, 0x12, 0x9a, 0x96, 0x48, 0x47, 0xca, 0x8f, 0x33, 0x1d, 0x29, - 0x8d, 0x95, 0x8e, 0x64, 0x47, 0xca, 0x13, 0x63, 0x45, 0xca, 0x6f, 0xa8, 0x68, 0x55, 0xef, 0xdc, - 0xe6, 0x86, 0x7e, 0x98, 0x1d, 0x4a, 0x73, 0xcb, 0x24, 0xe2, 0x78, 0x5f, 0x19, 0x4e, 0xb4, 0xd2, - 0x5f, 0x7a, 0xeb, 0x50, 0xfb, 0xf5, 0xbc, 0x2f, 0xeb, 0x42, 0x00, 0x15, 0x4e, 0x64, 0x10, 0x70, - 0x16, 0xbb, 0xda, 0x9d, 0xcf, 0xbe, 0x5a, 0x39, 0xf7, 0xc5, 0x57, 0x2b, 0xe7, 0xbe, 0xfc, 0x6a, - 0xe5, 0xdc, 0x0f, 0x8f, 0x57, 0xac, 0xcf, 0x8e, 0x57, 0xac, 0x2f, 0x8e, 0x57, 0xac, 0x2f, 0x8f, - 0x57, 0xac, 0xff, 0x3c, 0x5e, 0xb1, 0x7e, 0xfc, 0xf3, 0x95, 0x73, 0xf7, 0x9f, 0x19, 0xe5, 0x7f, - 0x09, 0xfd, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe3, 0x05, 0xa2, 0xb7, 0x72, 0x48, 0x00, 0x00, + // 4071 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0xdd, 0x6f, 0x5b, 0x47, + 0x76, 0xf7, 0x25, 0x45, 0x4a, 0x3c, 0x94, 0x6c, 0x69, 0x2c, 0x27, 0x5a, 0x6d, 0x63, 0xb9, 0x37, + 0x41, 0x90, 0x34, 0x09, 0x55, 0x3b, 0x71, 0xe2, 0x38, 0xad, 0x0b, 0x91, 0xf2, 0x87, 0xbc, 0xda, + 0x58, 0x1d, 0x3a, 0xce, 0xc6, 0x49, 0x90, 0x1d, 0x91, 0x23, 0xf2, 0xae, 0xc8, 0x7b, 0x99, 0x3b, + 0x43, 0x6d, 0xd4, 0x16, 0xed, 0xf6, 0x0b, 0x58, 0xf4, 0x0b, 0xfb, 0x10, 0x20, 0x5b, 0xa0, 0x05, + 0x8a, 0xf6, 0x71, 0xd1, 0xfe, 0x03, 0x7d, 0xc8, 0x43, 0x5f, 0x82, 0x22, 0x68, 0x83, 0xb6, 0x40, + 0xf3, 0xb0, 0x55, 0x1b, 0x2d, 0xd0, 0xc7, 0xbe, 0xf5, 0xc5, 0x40, 0x81, 0x62, 0x3e, 0xee, 0xbd, + 0x73, 0x3f, 0x68, 0xf1, 0xd2, 0x92, 0x91, 0xf6, 0x8d, 0x9a, 0x33, 0xe7, 0x77, 0x66, 0xce, 0xcc, + 0x9c, 0x39, 0xe7, 0xcc, 0xb9, 0x82, 0x57, 0x3a, 0x0e, 0xef, 0x0e, 0xb7, 0x6b, 0x2d, 0xaf, 0xbf, + 0x4a, 0x76, 0x87, 0x0e, 0xdf, 0x5f, 0xdd, 0x25, 0x7e, 0xc7, 0x5b, 0x25, 0x03, 0x67, 0x75, 0xef, + 0x22, 0xe9, 0x0d, 0xba, 0xe4, 0xe2, 0x6a, 0x87, 0xba, 0xd4, 0x27, 0x9c, 0xb6, 0x6b, 0x03, 0xdf, + 0xe3, 0x1e, 0x7a, 0x26, 0xe2, 0xaa, 0x29, 0xae, 0x9a, 0xe4, 0xaa, 0x91, 0x81, 0x53, 0x0b, 0xb8, + 0x96, 0x5f, 0x32, 0xb0, 0x3b, 0x5e, 0xc7, 0x5b, 0x95, 0xcc, 0xdb, 0xc3, 0x1d, 0xf9, 0x97, 0xfc, + 0x43, 0xfe, 0x52, 0xa0, 0xcb, 0xb7, 0x76, 0xaf, 0xb0, 0x9a, 0x23, 0x25, 0xd3, 0x8f, 0x38, 0x75, + 0x99, 0xe3, 0xb9, 0xec, 0x25, 0x32, 0x70, 0x18, 0xf5, 0xf7, 0xa8, 0xbf, 0x3a, 0xd8, 0xed, 0x08, + 0x1a, 0x8b, 0x77, 0x58, 0xdd, 0x4b, 0x0d, 0x6f, 0xf9, 0x95, 0x08, 0xa9, 0x4f, 0x5a, 0x5d, 0xc7, + 0xa5, 0xfe, 0x7e, 0xc4, 0xde, 0xa7, 0x9c, 0x64, 0x71, 0xad, 0x8e, 0xe2, 0xf2, 0x87, 0x2e, 0x77, + 0xfa, 0x34, 0xc5, 0xf0, 0xea, 0x51, 0x0c, 0xac, 0xd5, 0xa5, 0x7d, 0x92, 0xe4, 0xb3, 0xdf, 0x83, + 0xb3, 0x6b, 0x2e, 0xe9, 0xed, 0x33, 0x87, 0xe1, 0xa1, 0xbb, 0xe6, 0x77, 0x86, 0x7d, 0xea, 0x72, + 0x74, 0x01, 0xa6, 0x5c, 0xd2, 0xa7, 0x4b, 0xd6, 0x05, 0xeb, 0xb9, 0x4a, 0x7d, 0xf6, 0xb3, 0x83, + 0x95, 0x53, 0x87, 0x07, 0x2b, 0x53, 0x6f, 0x92, 0x3e, 0xc5, 0x92, 0x82, 0x9e, 0x86, 0xd2, 0x1e, + 0xe9, 0x0d, 0xe9, 0x52, 0x41, 0x76, 0x99, 0xd3, 0x5d, 0x4a, 0xf7, 0x44, 0x23, 0x56, 0x34, 0xfb, + 0x77, 0x8b, 0x31, 0xf8, 0x6f, 0x53, 0x4e, 0xda, 0x84, 0x13, 0xd4, 0x87, 0x72, 0x8f, 0x6c, 0xd3, + 0x1e, 0x5b, 0xb2, 0x2e, 0x14, 0x9f, 0xab, 0x5e, 0xba, 0x5e, 0x1b, 0x67, 0x11, 0x6b, 0x19, 0x50, + 0xb5, 0x4d, 0x89, 0x73, 0xdd, 0xe5, 0xfe, 0x7e, 0xfd, 0xb4, 0x1e, 0x44, 0x59, 0x35, 0x62, 0x2d, + 0x04, 0xfd, 0xb6, 0x05, 0x55, 0xe2, 0xba, 0x1e, 0x27, 0x5c, 0x2c, 0xd3, 0x52, 0x41, 0x0a, 0xbd, + 0x3d, 0xb9, 0xd0, 0xb5, 0x08, 0x4c, 0x49, 0x3e, 0xab, 0x25, 0x57, 0x0d, 0x0a, 0x36, 0x65, 0x2e, + 0xbf, 0x0e, 0x55, 0x63, 0xa8, 0x68, 0x1e, 0x8a, 0xbb, 0x74, 0x5f, 0xe9, 0x17, 0x8b, 0x9f, 0x68, + 0x31, 0xa6, 0x50, 0xad, 0xc1, 0xab, 0x85, 0x2b, 0xd6, 0xf2, 0x35, 0x98, 0x4f, 0x0a, 0xcc, 0xc3, + 0x6f, 0xff, 0x89, 0x05, 0x8b, 0xc6, 0x2c, 0x30, 0xdd, 0xa1, 0x3e, 0x75, 0x5b, 0x14, 0xad, 0x42, + 0x45, 0xac, 0x25, 0x1b, 0x90, 0x56, 0xb0, 0xd4, 0x0b, 0x7a, 0x22, 0x95, 0x37, 0x03, 0x02, 0x8e, + 0xfa, 0x84, 0xdb, 0xa2, 0xf0, 0xb0, 0x6d, 0x31, 0xe8, 0x12, 0x46, 0x97, 0x8a, 0xf1, 0x6d, 0xb1, + 0x25, 0x1a, 0xb1, 0xa2, 0xd9, 0xbf, 0x0c, 0xdf, 0x08, 0xc6, 0x73, 0x97, 0xf6, 0x07, 0x3d, 0xc2, + 0x69, 0x34, 0xa8, 0x23, 0xb7, 0x9e, 0xbd, 0x0b, 0x73, 0x6b, 0x83, 0x81, 0xef, 0xed, 0xd1, 0x76, + 0x93, 0x93, 0x0e, 0x45, 0xf7, 0x01, 0x88, 0x6e, 0x58, 0xe3, 0x92, 0xb1, 0x7a, 0xe9, 0x17, 0x6a, + 0xea, 0x44, 0xd4, 0xcc, 0x13, 0x51, 0x1b, 0xec, 0x76, 0x44, 0x03, 0xab, 0x89, 0x83, 0x57, 0xdb, + 0xbb, 0x58, 0xbb, 0xeb, 0xf4, 0x69, 0xfd, 0xf4, 0xe1, 0xc1, 0x0a, 0xac, 0x85, 0x08, 0xd8, 0x40, + 0xb3, 0x7f, 0xc7, 0x82, 0x73, 0x6b, 0x7e, 0xc7, 0x6b, 0xac, 0xaf, 0x0d, 0x06, 0xb7, 0x28, 0xe9, + 0xf1, 0x6e, 0x93, 0x13, 0x3e, 0x64, 0xe8, 0x1a, 0x94, 0x99, 0xfc, 0xa5, 0x87, 0xfa, 0x6c, 0xb0, + 0xfb, 0x14, 0xfd, 0xc1, 0xc1, 0xca, 0x62, 0x06, 0x23, 0xc5, 0x9a, 0x0b, 0x3d, 0x0f, 0xd3, 0x7d, + 0xca, 0x18, 0xe9, 0x04, 0xfa, 0x3c, 0xa3, 0x01, 0xa6, 0xbf, 0xad, 0x9a, 0x71, 0x40, 0xb7, 0xff, + 0xbe, 0x00, 0x67, 0x42, 0x2c, 0x2d, 0xfe, 0x04, 0x16, 0x6f, 0x08, 0xb3, 0x5d, 0x63, 0x86, 0x72, + 0x0d, 0xab, 0x97, 0xde, 0x18, 0xf3, 0x9c, 0x64, 0x29, 0xa9, 0xbe, 0xa8, 0xc5, 0xcc, 0x9a, 0xad, + 0x38, 0x26, 0x06, 0xf5, 0x01, 0xd8, 0xbe, 0xdb, 0xd2, 0x42, 0xa7, 0xa4, 0xd0, 0xd7, 0x73, 0x0a, + 0x6d, 0x86, 0x00, 0x75, 0xa4, 0x45, 0x42, 0xd4, 0x86, 0x0d, 0x01, 0xf6, 0xdf, 0x58, 0x70, 0x36, + 0x83, 0x0f, 0xfd, 0x52, 0x62, 0x3d, 0x9f, 0x49, 0xad, 0x27, 0x4a, 0xb1, 0x45, 0xab, 0xf9, 0x22, + 0xcc, 0xf8, 0x74, 0xcf, 0x11, 0xf7, 0x80, 0xd6, 0xf0, 0xbc, 0xe6, 0x9f, 0xc1, 0xba, 0x1d, 0x87, + 0x3d, 0xd0, 0x0b, 0x50, 0x09, 0x7e, 0x0b, 0x35, 0x17, 0xc5, 0x51, 0x11, 0x0b, 0x17, 0x74, 0x65, + 0x38, 0xa2, 0xdb, 0xbf, 0x05, 0xa5, 0x46, 0x97, 0xf8, 0x5c, 0xec, 0x18, 0x9f, 0x0e, 0xbc, 0xb7, + 0xf0, 0xa6, 0x1e, 0x62, 0xb8, 0x63, 0xb0, 0x6a, 0xc6, 0x01, 0x7d, 0x8c, 0xc5, 0x7e, 0x1e, 0xa6, + 0xf7, 0xa8, 0x2f, 0xc7, 0x5b, 0x8c, 0x83, 0xdd, 0x53, 0xcd, 0x38, 0xa0, 0xdb, 0xff, 0x6c, 0xc1, + 0xa2, 0x1c, 0xc1, 0xba, 0xc3, 0x5a, 0xde, 0x1e, 0xf5, 0xf7, 0x31, 0x65, 0xc3, 0xde, 0x31, 0x0f, + 0x68, 0x1d, 0xe6, 0x19, 0xed, 0xef, 0x51, 0xbf, 0xe1, 0xb9, 0x8c, 0xfb, 0xc4, 0x71, 0xb9, 0x1e, + 0xd9, 0x92, 0xee, 0x3d, 0xdf, 0x4c, 0xd0, 0x71, 0x8a, 0x03, 0x3d, 0x07, 0x33, 0x7a, 0xd8, 0x62, + 0x2b, 0x09, 0xc5, 0xce, 0x8a, 0x35, 0xd0, 0x73, 0x62, 0x38, 0xa4, 0xda, 0xff, 0x69, 0xc1, 0x82, + 0x9c, 0x55, 0x73, 0xb8, 0xcd, 0x5a, 0xbe, 0x33, 0x10, 0xe6, 0xf5, 0xeb, 0x38, 0xa5, 0x6b, 0x70, + 0xba, 0x1d, 0x28, 0x7e, 0xd3, 0xe9, 0x3b, 0x5c, 0x9e, 0x91, 0x52, 0xfd, 0x09, 0x8d, 0x71, 0x7a, + 0x3d, 0x46, 0xc5, 0x89, 0xde, 0x6a, 0xf9, 0x7a, 0x43, 0xc6, 0xa9, 0xbf, 0xe5, 0x7b, 0x7d, 0x4f, + 0xcc, 0xf3, 0x2e, 0x61, 0xbb, 0xe8, 0xbb, 0x30, 0xd3, 0xd7, 0x57, 0x9a, 0xb6, 0x9a, 0xbf, 0x38, + 0x9e, 0xd5, 0xbc, 0xb3, 0xfd, 0x3d, 0xda, 0xe2, 0xe2, 0x3a, 0x8c, 0x4e, 0x5b, 0xd4, 0x86, 0x43, + 0x54, 0xf4, 0x0e, 0x4c, 0xb1, 0x01, 0x6d, 0x49, 0x15, 0x55, 0x2f, 0xbd, 0x36, 0xde, 0xa1, 0x8e, + 0x0d, 0xb2, 0x39, 0xa0, 0xad, 0x48, 0xb7, 0xe2, 0x2f, 0x2c, 0x21, 0xed, 0x7f, 0xb3, 0x60, 0x29, + 0x6b, 0x56, 0x9b, 0x0e, 0xe3, 0xe8, 0xbd, 0xd4, 0xcc, 0x6a, 0xe3, 0xcd, 0x4c, 0x70, 0xcb, 0x79, + 0x85, 0xa7, 0x37, 0x68, 0x31, 0x66, 0xd5, 0x82, 0x92, 0xc3, 0x69, 0x3f, 0x70, 0x24, 0xae, 0x8d, + 0x37, 0xad, 0x51, 0x83, 0x8d, 0x2e, 0xc9, 0x0d, 0x01, 0x8a, 0x15, 0xb6, 0xfd, 0x2e, 0xcc, 0x36, + 0x86, 0xbe, 0x4f, 0x5d, 0xae, 0x2e, 0xb9, 0x6f, 0x41, 0x89, 0x39, 0xae, 0xb6, 0xf5, 0xf9, 0xee, + 0xb7, 0x8a, 0x00, 0x6f, 0x0a, 0x66, 0xac, 0x30, 0xec, 0x3f, 0x2b, 0xc2, 0xd9, 0x60, 0xd7, 0xd0, + 0xf6, 0x9a, 0xcf, 0x9d, 0x1d, 0xd2, 0xe2, 0x0c, 0xb5, 0x61, 0xb6, 0x1d, 0x35, 0x73, 0x6d, 0x8c, + 0xf3, 0xc8, 0x0a, 0x0d, 0xbe, 0x01, 0xcf, 0x71, 0x0c, 0x15, 0xbd, 0x0d, 0xc5, 0x8e, 0xc3, 0xb5, + 0xef, 0x77, 0x65, 0x3c, 0xed, 0xdd, 0x74, 0x92, 0xd6, 0xa7, 0x5e, 0xd5, 0xa2, 0x8a, 0x37, 0x1d, + 0x8e, 0x05, 0x22, 0xda, 0x86, 0xb2, 0xd3, 0x27, 0x1d, 0x1a, 0xac, 0xcc, 0xd5, 0xf1, 0xb0, 0x37, + 0x04, 0x4f, 0x12, 0x3d, 0x74, 0x26, 0x25, 0x95, 0x61, 0x8d, 0x2c, 0x64, 0xb4, 0x84, 0xd5, 0x50, + 0x76, 0x7b, 0x6c, 0x19, 0x59, 0xf6, 0x33, 0x92, 0x21, 0xa9, 0x0c, 0x6b, 0x64, 0xfb, 0xcb, 0x02, + 0xcc, 0x47, 0xfa, 0x6b, 0x78, 0xfd, 0xbe, 0xc3, 0xd1, 0x32, 0x14, 0x9c, 0xb6, 0x36, 0x4a, 0xa0, + 0x19, 0x0b, 0x1b, 0xeb, 0xb8, 0xe0, 0xb4, 0xd1, 0xb3, 0x50, 0xde, 0xf6, 0x89, 0xdb, 0xea, 0x6a, + 0x63, 0x14, 0x02, 0xd7, 0x65, 0x2b, 0xd6, 0x54, 0xf4, 0x14, 0x14, 0x39, 0xe9, 0x68, 0x1b, 0x14, + 0xea, 0xef, 0x2e, 0xe9, 0x60, 0xd1, 0x2e, 0x8c, 0x1f, 0x1b, 0xca, 0x73, 0x2c, 0x57, 0xde, 0x30, + 0x7e, 0x4d, 0xd5, 0x8c, 0x03, 0xba, 0x90, 0x48, 0x86, 0xbc, 0xeb, 0xf9, 0x4b, 0xa5, 0xb8, 0xc4, + 0x35, 0xd9, 0x8a, 0x35, 0x55, 0xb8, 0x29, 0x2d, 0x39, 0x7e, 0x4e, 0xfd, 0xa5, 0x72, 0xdc, 0x4d, + 0x69, 0x04, 0x04, 0x1c, 0xf5, 0x41, 0xef, 0x43, 0xb5, 0xe5, 0x53, 0xc2, 0x3d, 0x7f, 0x9d, 0x70, + 0xba, 0x34, 0x9d, 0x7b, 0x07, 0x9e, 0x11, 0x7e, 0x78, 0x23, 0x82, 0xc0, 0x26, 0x9e, 0xfd, 0x5f, + 0x16, 0x2c, 0x45, 0xaa, 0x95, 0x6b, 0x1b, 0xf9, 0x9e, 0x5a, 0x3d, 0xd6, 0x08, 0xf5, 0x3c, 0x0b, + 0xe5, 0xb6, 0xd3, 0xa1, 0x8c, 0x27, 0xb5, 0xbc, 0x2e, 0x5b, 0xb1, 0xa6, 0xa2, 0x4b, 0x00, 0x1d, + 0x87, 0xeb, 0xfb, 0x42, 0x2b, 0x3b, 0xb4, 0x93, 0x37, 0x43, 0x0a, 0x36, 0x7a, 0xa1, 0xb7, 0xa1, + 0x22, 0x87, 0x39, 0xe1, 0xb1, 0x93, 0xde, 0x43, 0x23, 0x00, 0xc0, 0x11, 0x96, 0xfd, 0xc5, 0x14, + 0x4c, 0xdf, 0xf0, 0xa9, 0xd3, 0xe9, 0xf2, 0xc7, 0x60, 0xf0, 0x9f, 0x86, 0x12, 0xe9, 0x39, 0x84, + 0xc9, 0x75, 0x33, 0xfc, 0xff, 0x35, 0xd1, 0x88, 0x15, 0x0d, 0xbd, 0x0b, 0x65, 0xcf, 0x77, 0x3a, + 0x8e, 0xbb, 0x54, 0x91, 0x83, 0x78, 0x79, 0xbc, 0x23, 0xa4, 0x67, 0x71, 0x47, 0xb2, 0x46, 0xca, + 0x57, 0x7f, 0x63, 0x0d, 0x89, 0xee, 0xc3, 0xb4, 0xda, 0x4c, 0xc1, 0x01, 0x5d, 0x1d, 0xdb, 0xc0, + 0xa8, 0xfd, 0x18, 0x6d, 0x7a, 0xf5, 0x37, 0xc3, 0x01, 0x20, 0x6a, 0x86, 0xf6, 0x65, 0x4a, 0x42, + 0xbf, 0x90, 0xc3, 0xbe, 0x8c, 0x34, 0x28, 0xcd, 0xd0, 0xa0, 0x94, 0xf2, 0x80, 0x4a, 0x93, 0x31, + 0xca, 0x82, 0x08, 0x15, 0x6b, 0x67, 0xb6, 0x3c, 0x81, 0x8a, 0xb5, 0x27, 0x7d, 0x3a, 0xee, 0x01, + 0x07, 0xbe, 0xae, 0xfd, 0x71, 0x11, 0x16, 0x74, 0xcf, 0x86, 0xd7, 0xeb, 0xd1, 0x96, 0xf4, 0x9c, + 0x94, 0x7d, 0x2a, 0x66, 0xda, 0x27, 0x27, 0xb8, 0x31, 0x95, 0xcd, 0xaf, 0xe7, 0x1a, 0x4d, 0x24, + 0xa3, 0x26, 0x6f, 0x48, 0x15, 0x72, 0x87, 0xab, 0xa4, 0x7b, 0xe9, 0x7b, 0x13, 0xfd, 0xbe, 0x05, + 0x67, 0xf7, 0xa8, 0xef, 0xec, 0x38, 0x2d, 0x19, 0x30, 0xdf, 0x72, 0x18, 0xf7, 0xfc, 0x7d, 0x7d, + 0x23, 0xbc, 0x3a, 0x9e, 0xe4, 0x7b, 0x06, 0xc0, 0x86, 0xbb, 0xe3, 0xd5, 0xbf, 0xa9, 0xa5, 0x9d, + 0xbd, 0x97, 0x86, 0xc6, 0x59, 0xf2, 0x96, 0x07, 0x00, 0xd1, 0x68, 0x33, 0xe2, 0xf5, 0x4d, 0x33, + 0x5e, 0x1f, 0x7b, 0x60, 0xc1, 0x64, 0x03, 0x93, 0x65, 0xc6, 0xf9, 0x9f, 0x5a, 0x50, 0xd5, 0xf4, + 0xc7, 0xe0, 0x04, 0xe1, 0xb8, 0x13, 0xf4, 0x52, 0xae, 0xf1, 0x8f, 0xf0, 0x79, 0x7c, 0x98, 0x8b, + 0x1d, 0x72, 0x74, 0x19, 0xa6, 0x76, 0x1d, 0x37, 0xb8, 0xf5, 0x7e, 0x3e, 0x70, 0x03, 0xbf, 0xe5, + 0xb8, 0xed, 0x07, 0x07, 0x2b, 0x0b, 0xb1, 0xce, 0xa2, 0x11, 0xcb, 0xee, 0x47, 0x7b, 0xe6, 0x57, + 0x67, 0x7e, 0xfc, 0x17, 0x2b, 0xa7, 0x7e, 0xf0, 0xd3, 0x0b, 0xa7, 0xec, 0x4f, 0x8a, 0x30, 0x9f, + 0xd4, 0xea, 0x18, 0xf9, 0xaf, 0xc8, 0x86, 0xcd, 0x9c, 0xa8, 0x0d, 0x2b, 0x9c, 0x9c, 0x0d, 0x2b, + 0x9e, 0x84, 0x0d, 0x9b, 0x3a, 0x36, 0x1b, 0x66, 0xff, 0x83, 0x05, 0xa7, 0xc3, 0x95, 0xf9, 0x70, + 0x28, 0x6e, 0xd6, 0x48, 0xeb, 0xd6, 0xf1, 0x6b, 0xfd, 0x03, 0x98, 0x66, 0xde, 0xd0, 0x6f, 0x49, + 0xf7, 0x51, 0xa0, 0xbf, 0x92, 0xcf, 0x68, 0x2a, 0x5e, 0xc3, 0x67, 0x52, 0x0d, 0x38, 0x40, 0x35, + 0x27, 0xa4, 0x69, 0xca, 0xa5, 0xf0, 0x85, 0xc3, 0x25, 0x26, 0x34, 0x63, 0xba, 0x14, 0xa2, 0x15, + 0x6b, 0x2a, 0xb2, 0xa5, 0x3d, 0x0f, 0x3c, 0xdb, 0x4a, 0x1d, 0xb4, 0x59, 0x96, 0x8b, 0xa0, 0x28, + 0x68, 0x00, 0xf3, 0x3e, 0xfd, 0x70, 0xe8, 0xf8, 0xb4, 0xdd, 0xf4, 0xc8, 0xae, 0xf0, 0x0b, 0x74, + 0x0a, 0x67, 0xcc, 0x73, 0xbf, 0x3e, 0xf4, 0xa5, 0x09, 0xab, 0x2f, 0x8a, 0xc8, 0x14, 0x27, 0xb0, + 0x70, 0x0a, 0xdd, 0xfe, 0xf7, 0x52, 0x78, 0x60, 0x75, 0x12, 0xe5, 0xd7, 0xa1, 0xda, 0x52, 0x51, + 0x4b, 0x6f, 0x7f, 0xc3, 0xd5, 0x5b, 0x6c, 0x7d, 0x82, 0xcb, 0xa7, 0xd6, 0x88, 0x60, 0x12, 0x39, + 0x56, 0x83, 0x82, 0x4d, 0x69, 0xe8, 0xfb, 0x00, 0xca, 0x12, 0xd3, 0xf6, 0x86, 0xab, 0xaf, 0x9a, + 0xc6, 0x24, 0xb2, 0xef, 0x85, 0x28, 0x4a, 0x74, 0xe8, 0xf3, 0x44, 0x04, 0x6c, 0x88, 0x12, 0xb3, + 0x0e, 0x52, 0x86, 0x37, 0x3c, 0x5f, 0x9f, 0xd9, 0x89, 0x66, 0xbd, 0x16, 0xc1, 0x24, 0x33, 0xcb, + 0x11, 0x05, 0x9b, 0xd2, 0x96, 0x7d, 0x98, 0x4f, 0xea, 0x2a, 0xe3, 0xba, 0xb9, 0x15, 0xbf, 0x6e, + 0x2e, 0x8d, 0x79, 0x40, 0x8d, 0x08, 0xd4, 0x4c, 0x49, 0xfb, 0x70, 0x26, 0xa1, 0xa3, 0x0c, 0x91, + 0x1b, 0x71, 0x91, 0x2f, 0xe7, 0xb9, 0x7a, 0x75, 0x6a, 0xd7, 0x94, 0xc9, 0x60, 0x3e, 0xa9, 0x9d, + 0x63, 0x13, 0x1a, 0xcb, 0x27, 0x9b, 0x77, 0xea, 0x9f, 0x17, 0xa0, 0x12, 0x5a, 0xd5, 0x3c, 0xc9, + 0x21, 0xe5, 0x0d, 0x15, 0x8e, 0x88, 0xd6, 0x8a, 0xe3, 0x44, 0x6b, 0x53, 0xa3, 0xa3, 0xb5, 0x20, + 0x81, 0x5c, 0x7e, 0x78, 0x02, 0xd9, 0x88, 0xd6, 0xa6, 0xc7, 0x8f, 0xd6, 0x66, 0x8e, 0x8e, 0xd6, + 0xec, 0xbf, 0xb4, 0x00, 0xa5, 0x43, 0xf3, 0x3c, 0x8a, 0x22, 0xc9, 0xbb, 0x6e, 0x4c, 0x4f, 0x28, + 0x19, 0x1f, 0x8f, 0xbe, 0xf2, 0xec, 0x4f, 0x4b, 0x70, 0xe6, 0xa6, 0x33, 0x71, 0x9e, 0x8f, 0xc3, + 0x93, 0x0a, 0xa9, 0x49, 0xb5, 0x1f, 0xda, 0xe4, 0x3e, 0xe1, 0xb4, 0xb3, 0xaf, 0xd7, 0xf7, 0xaa, + 0x66, 0x7d, 0xb2, 0x91, 0xdd, 0xed, 0xc1, 0x68, 0x12, 0x1e, 0x05, 0x3d, 0xf6, 0x26, 0x79, 0x03, + 0xe6, 0x18, 0xf7, 0x9d, 0x16, 0x57, 0x99, 0x44, 0xb6, 0x54, 0x95, 0x17, 0xc9, 0x39, 0xdd, 0x7d, + 0xae, 0x69, 0x12, 0x71, 0xbc, 0x6f, 0x66, 0x82, 0x72, 0x2a, 0x77, 0x82, 0x72, 0x15, 0x2a, 0xa4, + 0xd7, 0xf3, 0xbe, 0x7f, 0x97, 0x74, 0x98, 0x4e, 0x07, 0x84, 0xbb, 0x66, 0x2d, 0x20, 0xe0, 0xa8, + 0x0f, 0xaa, 0x01, 0x38, 0x1d, 0xd7, 0xf3, 0xa9, 0xe4, 0x28, 0xcb, 0x1b, 0x4d, 0x3e, 0xc2, 0x6c, + 0x84, 0xad, 0xd8, 0xe8, 0x81, 0x9a, 0x70, 0xce, 0x71, 0x19, 0x6d, 0x0d, 0x7d, 0xda, 0xdc, 0x75, + 0x06, 0x77, 0x37, 0x9b, 0xd2, 0x4a, 0xec, 0xcb, 0xdd, 0x3c, 0x53, 0x7f, 0x4a, 0x0b, 0x3b, 0xb7, + 0x91, 0xd5, 0x09, 0x67, 0xf3, 0xa2, 0x57, 0x60, 0xd6, 0x71, 0x5b, 0xbd, 0x61, 0x9b, 0x6e, 0x11, + 0xde, 0x65, 0x4b, 0x33, 0x72, 0x18, 0xf3, 0x87, 0x07, 0x2b, 0xb3, 0x1b, 0x46, 0x3b, 0x8e, 0xf5, + 0x12, 0x5c, 0xf4, 0x23, 0x83, 0xab, 0x12, 0x71, 0x5d, 0xff, 0xc8, 0xe4, 0x32, 0x7b, 0x65, 0xa4, + 0x70, 0x21, 0x57, 0x0a, 0xf7, 0x27, 0x05, 0x28, 0xab, 0x17, 0x14, 0x74, 0x39, 0xf1, 0x4c, 0xf1, + 0x54, 0xea, 0x99, 0xa2, 0x9a, 0xf5, 0xda, 0x64, 0x43, 0xd9, 0x61, 0x6c, 0x18, 0x77, 0x20, 0x36, + 0x64, 0x0b, 0xd6, 0x14, 0x99, 0xda, 0xf2, 0xdc, 0x1d, 0xa7, 0xa3, 0x13, 0x10, 0xd7, 0x0c, 0xb7, + 0x21, 0x7a, 0xe5, 0xfe, 0x20, 0x7c, 0x06, 0x8f, 0x3c, 0x88, 0x58, 0x07, 0xe1, 0x4a, 0xdc, 0x6e, + 0xde, 0x79, 0x53, 0xc9, 0x68, 0x48, 0x44, 0xac, 0x91, 0x85, 0x0c, 0x6f, 0xc8, 0x07, 0x43, 0x2e, + 0x37, 0xca, 0x31, 0xc9, 0xb8, 0x23, 0x11, 0xb1, 0x46, 0xb6, 0x3f, 0xb1, 0xe0, 0x8c, 0xd2, 0x41, + 0xa3, 0x4b, 0x5b, 0xbb, 0x4d, 0x4e, 0x07, 0xc2, 0xa3, 0x1f, 0x32, 0xca, 0x92, 0x1e, 0xfd, 0x5b, + 0x8c, 0x32, 0x2c, 0x29, 0xc6, 0xec, 0x0b, 0x27, 0x35, 0x7b, 0xfb, 0xaf, 0x2d, 0x28, 0x49, 0xd7, + 0x39, 0x8f, 0xfd, 0x89, 0xa7, 0x93, 0x0a, 0x63, 0xa5, 0x93, 0x8e, 0x48, 0xf4, 0x45, 0x99, 0xac, + 0xa9, 0x87, 0x65, 0xb2, 0xec, 0x9f, 0x59, 0xb0, 0x98, 0x95, 0x1d, 0xcd, 0x33, 0xfc, 0x17, 0x61, + 0x66, 0xd0, 0x23, 0x7c, 0xc7, 0xf3, 0xfb, 0xc9, 0x97, 0xb1, 0x2d, 0xdd, 0x8e, 0xc3, 0x1e, 0xc8, + 0x07, 0xf0, 0x83, 0x30, 0x2c, 0x08, 0x51, 0xae, 0xe5, 0xbd, 0x11, 0xe2, 0x69, 0xbd, 0x48, 0x59, + 0x61, 0x13, 0xc3, 0x86, 0x14, 0xfb, 0x0f, 0x4b, 0xb0, 0x20, 0x59, 0x26, 0xbd, 0x21, 0x26, 0x59, + 0xa1, 0x01, 0x3c, 0x21, 0x83, 0xa7, 0xf4, 0xa5, 0xa2, 0x16, 0xed, 0x8a, 0xe6, 0x7f, 0x62, 0x23, + 0xb3, 0xd7, 0x83, 0x91, 0x14, 0x3c, 0x02, 0x37, 0x7d, 0x53, 0xc0, 0xff, 0xbf, 0x9b, 0xc2, 0xdc, + 0x6c, 0xd3, 0x47, 0x6e, 0xb6, 0x91, 0xf7, 0xca, 0xcc, 0x23, 0xdc, 0x2b, 0x69, 0x5b, 0x5f, 0xc9, + 0x65, 0xeb, 0xff, 0xb4, 0x00, 0xd3, 0x5b, 0xbe, 0x27, 0xb3, 0xec, 0x27, 0x9f, 0xb0, 0xbd, 0x13, + 0x7b, 0xa1, 0xbb, 0x38, 0xf6, 0x0b, 0x9d, 0x80, 0x92, 0x6f, 0x73, 0x33, 0xf1, 0x77, 0x39, 0x23, + 0xf3, 0x58, 0xcc, 0xe3, 0x81, 0x07, 0x90, 0x0f, 0xcf, 0x3c, 0x7e, 0x6a, 0x41, 0x55, 0xf7, 0xfc, + 0xda, 0xa6, 0xb8, 0xf4, 0xf8, 0x46, 0xa4, 0xb8, 0xfe, 0x38, 0x9a, 0x81, 0x50, 0x1a, 0xfa, 0x4d, + 0x58, 0x18, 0x04, 0x2f, 0x82, 0x5b, 0x5e, 0xcf, 0x69, 0x39, 0x34, 0xc8, 0x92, 0x5e, 0xce, 0xf9, + 0x5c, 0x2a, 0xd9, 0xf7, 0xeb, 0xdf, 0xd0, 0x72, 0x17, 0xb6, 0x92, 0xb8, 0x38, 0x2d, 0xca, 0xfe, + 0x17, 0x0b, 0xe6, 0x62, 0xba, 0x47, 0x2d, 0x80, 0x96, 0xe7, 0xb6, 0x1d, 0x1e, 0x16, 0x27, 0x54, + 0x2f, 0xad, 0x8e, 0xa7, 0xd5, 0x46, 0xc0, 0x17, 0x6d, 0xba, 0xb0, 0x89, 0x61, 0x03, 0x16, 0xbd, + 0x1c, 0xd4, 0x09, 0xc5, 0x9d, 0x18, 0x55, 0x27, 0xf4, 0xe0, 0x60, 0x65, 0x56, 0x8f, 0xc9, 0xac, + 0x1b, 0xca, 0x53, 0x31, 0xf3, 0x57, 0x05, 0xa8, 0x84, 0xf3, 0x7f, 0x0c, 0xc7, 0xe8, 0xad, 0xd8, + 0x31, 0x7a, 0x39, 0xe7, 0xca, 0x8d, 0x7a, 0xe4, 0x46, 0xef, 0x27, 0x0e, 0x53, 0xde, 0x2d, 0x71, + 0xc4, 0x71, 0xfa, 0x3b, 0xb5, 0xf8, 0xaa, 0xef, 0x63, 0x38, 0x50, 0x77, 0xe3, 0x07, 0x6a, 0x35, + 0xe7, 0x6c, 0x46, 0x1c, 0xa9, 0x1f, 0x5a, 0x70, 0x26, 0x71, 0x08, 0xd0, 0xd3, 0x50, 0x92, 0x59, + 0x31, 0xbd, 0xbf, 0x42, 0x46, 0x1d, 0xe0, 0x4b, 0x1a, 0xda, 0x82, 0x45, 0x32, 0xe4, 0x5e, 0xc8, + 0x7b, 0xdd, 0x25, 0xdb, 0x3d, 0xaa, 0xa2, 0xf6, 0x99, 0xfa, 0xcf, 0x69, 0x9e, 0xc5, 0xb5, 0x8c, + 0x3e, 0x38, 0x93, 0xd3, 0xfe, 0xbc, 0x00, 0x28, 0x6c, 0xcc, 0x93, 0x4e, 0x7e, 0x1f, 0xa6, 0x77, + 0x54, 0x22, 0xe8, 0xd1, 0xde, 0x03, 0xea, 0x55, 0xf3, 0x49, 0x24, 0xc0, 0x44, 0xef, 0x1c, 0xcf, + 0x3e, 0x82, 0xf4, 0x1e, 0x42, 0xf7, 0x01, 0x76, 0x1c, 0xd7, 0x61, 0xdd, 0x09, 0x5f, 0x2e, 0xe5, + 0x6d, 0x7e, 0x23, 0x44, 0xc0, 0x06, 0x9a, 0xfd, 0x71, 0xc1, 0xd8, 0x9f, 0xd2, 0x5c, 0x8e, 0xb5, + 0xae, 0xcf, 0xc7, 0x95, 0x59, 0x49, 0xbf, 0x15, 0x19, 0x8a, 0x99, 0xda, 0x23, 0x7e, 0x90, 0xb6, + 0xce, 0x5b, 0xa0, 0x72, 0x8f, 0xf8, 0x8e, 0x58, 0xf8, 0x68, 0x49, 0xef, 0x11, 0x9f, 0x61, 0x09, + 0x89, 0xbe, 0x23, 0x86, 0x4a, 0x07, 0x81, 0x09, 0xcd, 0x6d, 0x13, 0x38, 0x1d, 0x98, 0xf3, 0xa3, + 0x03, 0x86, 0x15, 0xa0, 0xfd, 0xf1, 0xb4, 0xb1, 0xe1, 0xb5, 0xd5, 0xbe, 0x0d, 0xa8, 0x47, 0x18, + 0xbf, 0x45, 0xdc, 0xb6, 0xd8, 0x9e, 0x74, 0xc7, 0xa7, 0xac, 0xab, 0x3d, 0xb4, 0x65, 0x8d, 0x82, + 0x36, 0x53, 0x3d, 0x70, 0x06, 0x17, 0xba, 0x1c, 0x37, 0xce, 0x2b, 0x49, 0xe3, 0x7c, 0x3a, 0x3a, + 0x6d, 0x93, 0x99, 0x67, 0x73, 0xbb, 0x97, 0x4e, 0x60, 0xbb, 0xff, 0x06, 0x2c, 0xec, 0x24, 0xdf, + 0x0e, 0x75, 0x25, 0xc1, 0x6b, 0x13, 0x3e, 0x3d, 0xd6, 0xcf, 0x1d, 0x46, 0x0f, 0x4e, 0x51, 0x33, + 0x4e, 0x0b, 0x42, 0x5e, 0x50, 0x46, 0x29, 0xa3, 0x4f, 0x95, 0x58, 0x18, 0xfb, 0xc8, 0x25, 0xe2, + 0xd6, 0x64, 0x01, 0xa5, 0x82, 0xc4, 0x31, 0x01, 0x89, 0x23, 0x58, 0x3e, 0xce, 0x23, 0x88, 0x2e, + 0x87, 0x09, 0x7d, 0x31, 0x1c, 0xe9, 0xca, 0x16, 0x53, 0xa9, 0x78, 0x41, 0xc2, 0x66, 0x3f, 0xf4, + 0x23, 0x0b, 0xce, 0x89, 0xcd, 0x7a, 0xfd, 0x23, 0xda, 0x1a, 0x0a, 0xad, 0x04, 0xb5, 0xd3, 0x4b, + 0x55, 0xa9, 0x8d, 0x31, 0x8b, 0x4a, 0x9b, 0x59, 0x10, 0x91, 0x5f, 0x9e, 0x49, 0xc6, 0xd9, 0x82, + 0xd1, 0x07, 0xd2, 0x74, 0x70, 0x2a, 0xc3, 0x9e, 0x47, 0x0f, 0xef, 0x2b, 0xda, 0xec, 0x70, 0x65, + 0x76, 0x38, 0xb5, 0xff, 0x28, 0x66, 0xad, 0xc6, 0x4b, 0x3a, 0x2c, 0x43, 0x81, 0xb0, 0x64, 0x9a, + 0x78, 0x8d, 0xe1, 0x02, 0x61, 0xe8, 0x1d, 0x28, 0xf9, 0x94, 0xfb, 0xfb, 0xda, 0xa8, 0x5e, 0x99, + 0xc0, 0x80, 0x60, 0xc1, 0xaf, 0x86, 0x2a, 0x7f, 0x62, 0x85, 0x68, 0xe4, 0x3a, 0x8a, 0x27, 0x96, + 0xeb, 0xf8, 0x89, 0x65, 0xdc, 0x85, 0xe1, 0x60, 0xd0, 0x5b, 0x30, 0xcd, 0x9d, 0x3e, 0xf5, 0x86, + 0x3c, 0x9f, 0x83, 0x11, 0x3e, 0x4e, 0xc9, 0x23, 0x7f, 0x57, 0x41, 0xe0, 0x00, 0x4b, 0x44, 0x5d, + 0xd4, 0xf7, 0x3d, 0xff, 0x6e, 0x57, 0x98, 0x30, 0xaf, 0xa7, 0x6e, 0xf1, 0xb9, 0x28, 0xea, 0xba, + 0x1e, 0xa3, 0xe2, 0x44, 0x6f, 0xfb, 0x73, 0xd3, 0x15, 0xfa, 0xbf, 0x5f, 0x1d, 0x49, 0x0c, 0xdd, + 0x8b, 0x8e, 0x1b, 0xee, 0x60, 0x38, 0xce, 0x67, 0x1d, 0xcf, 0xc3, 0x74, 0x9b, 0xee, 0x90, 0x61, + 0x2f, 0x75, 0x75, 0xae, 0xab, 0x66, 0x1c, 0xd0, 0xed, 0x7f, 0xb4, 0x60, 0xe1, 0x71, 0x57, 0x5e, + 0xbe, 0x17, 0x77, 0x20, 0x27, 0x51, 0xd9, 0x43, 0x4a, 0x2e, 0x53, 0x33, 0x92, 0x2e, 0xc7, 0x77, + 0xa1, 0xec, 0x08, 0xed, 0xb1, 0x7c, 0x05, 0x8b, 0x69, 0xf5, 0x1b, 0xaf, 0xe7, 0x12, 0x0f, 0x6b, + 0xdc, 0xc8, 0x53, 0x28, 0x1c, 0xb7, 0xa7, 0xe0, 0x9b, 0x13, 0xd2, 0x9f, 0x5a, 0xa0, 0xf7, 0xf5, + 0xb6, 0xb3, 0xf2, 0x94, 0xf7, 0xa7, 0x60, 0x46, 0x6e, 0xbd, 0xcf, 0x2d, 0x38, 0x97, 0xd9, 0x3b, + 0x74, 0xb6, 0x0a, 0x27, 0xe8, 0x6c, 0x59, 0xc7, 0xad, 0xc2, 0xfb, 0x86, 0x0a, 0x83, 0x21, 0x1c, + 0xd7, 0xf7, 0x51, 0x3f, 0x2e, 0xc0, 0x3c, 0xa6, 0x03, 0x2f, 0x96, 0x77, 0xdc, 0x0a, 0xaa, 0x63, + 0x73, 0x38, 0xea, 0x89, 0xd7, 0xad, 0xfa, 0x74, 0xac, 0x2c, 0xf6, 0x3b, 0x50, 0x92, 0x29, 0xc1, + 0x7c, 0x86, 0x26, 0x95, 0x11, 0x55, 0xf7, 0x88, 0xca, 0xad, 0x2a, 0x40, 0x81, 0x2c, 0x8b, 0x35, + 0xf4, 0x35, 0xf2, 0x5a, 0x8e, 0xb2, 0x8f, 0x34, 0xb2, 0x6c, 0xc6, 0x0a, 0xd0, 0xfe, 0xa4, 0x00, + 0xca, 0xa9, 0x7f, 0x0c, 0x76, 0xf8, 0x57, 0x63, 0x76, 0x78, 0x75, 0x5c, 0xd7, 0x44, 0xa8, 0x67, + 0x54, 0xe0, 0x9e, 0x0c, 0xb8, 0x2e, 0xe6, 0x01, 0x7d, 0x78, 0xd0, 0xfe, 0xb7, 0x16, 0x54, 0x64, + 0xbf, 0xc7, 0x60, 0x6f, 0xb7, 0xe2, 0xf6, 0xf6, 0x85, 0x1c, 0xb3, 0x18, 0x61, 0x63, 0x3f, 0x2e, + 0xea, 0xd1, 0x87, 0xe1, 0x5c, 0x97, 0xf8, 0x6d, 0x1d, 0xa8, 0x44, 0x27, 0x50, 0x34, 0x62, 0x45, + 0x43, 0xbf, 0xa6, 0xea, 0x5a, 0x28, 0xe3, 0xb4, 0x7d, 0x23, 0x8c, 0x1a, 0x8a, 0xb9, 0x0b, 0x74, + 0x74, 0x11, 0x51, 0x94, 0xb0, 0xc6, 0x09, 0x54, 0x9c, 0x92, 0x23, 0x22, 0x89, 0x41, 0xd2, 0x96, + 0x69, 0x0f, 0xfb, 0xb5, 0x09, 0x0d, 0xa7, 0x8a, 0x24, 0x52, 0xcd, 0x38, 0x2d, 0x08, 0x75, 0x61, + 0xd6, 0x2c, 0x2d, 0xd4, 0x7b, 0xe9, 0x52, 0xfe, 0x1a, 0x46, 0xf5, 0x40, 0x69, 0xb6, 0xe0, 0x18, + 0xb2, 0x7d, 0x50, 0x86, 0xaa, 0xb1, 0xf9, 0x12, 0x49, 0xc0, 0xb9, 0x93, 0x49, 0x02, 0x66, 0xc7, + 0xac, 0xd5, 0x89, 0x62, 0xd6, 0x8b, 0xf1, 0x98, 0xf5, 0x9b, 0xc9, 0x98, 0x15, 0xe4, 0xec, 0x62, + 0xf1, 0x2a, 0x83, 0xd3, 0x3a, 0x78, 0x0b, 0x6a, 0x44, 0x73, 0x65, 0x01, 0xd2, 0x21, 0x22, 0x12, + 0x7e, 0xe6, 0x8d, 0x18, 0x24, 0x4e, 0x88, 0x10, 0x7e, 0xaa, 0x6e, 0x69, 0x0e, 0xfb, 0x7d, 0xe2, + 0xef, 0x2f, 0xcd, 0xca, 0x01, 0x87, 0x7e, 0xea, 0x8d, 0x18, 0x15, 0x27, 0x7a, 0xa3, 0x2d, 0x28, + 0xab, 0xd8, 0x4f, 0xd7, 0x1d, 0xbe, 0x98, 0x27, 0xac, 0x54, 0x7e, 0xba, 0xfa, 0x8d, 0x35, 0x8e, + 0x19, 0xb6, 0x57, 0x8e, 0x08, 0xdb, 0x6f, 0x03, 0xf2, 0xb6, 0x65, 0x44, 0xd0, 0xbe, 0xa9, 0x3e, + 0x24, 0x16, 0xbb, 0xb2, 0x2c, 0x63, 0xc2, 0x70, 0xc1, 0xee, 0xa4, 0x7a, 0xe0, 0x0c, 0x2e, 0x71, + 0xaa, 0x75, 0xc0, 0x18, 0x1e, 0x05, 0x1d, 0xa2, 0xe7, 0x75, 0xb0, 0xa2, 0x6c, 0x80, 0xac, 0x5b, + 0x6b, 0x24, 0x50, 0x71, 0x4a, 0x0e, 0xfa, 0x10, 0xe6, 0xc4, 0x16, 0x8a, 0x04, 0xc3, 0x23, 0x0a, + 0x5e, 0x38, 0x3c, 0x58, 0x99, 0xdb, 0x34, 0x21, 0x71, 0x5c, 0x82, 0xfd, 0x07, 0x45, 0xc8, 0x0e, + 0x57, 0xa3, 0x92, 0x79, 0xeb, 0x21, 0x25, 0xf3, 0x6f, 0x43, 0x85, 0x71, 0xe2, 0xab, 0xcf, 0x03, + 0x0a, 0x93, 0x7d, 0x1e, 0xd0, 0x0c, 0x00, 0x70, 0x84, 0x95, 0xc8, 0x1d, 0x14, 0x8f, 0x35, 0x77, + 0x70, 0x09, 0x40, 0x46, 0x59, 0x0d, 0x6f, 0xa8, 0x5f, 0x0b, 0xe7, 0x22, 0x9b, 0x70, 0x3d, 0xa4, + 0x60, 0xa3, 0x17, 0xba, 0x12, 0x5e, 0x9c, 0xea, 0x79, 0xf0, 0x42, 0xaa, 0xbc, 0x21, 0x99, 0x7d, + 0xca, 0xf8, 0x9e, 0xf6, 0x88, 0x72, 0x28, 0xfb, 0x7f, 0x0a, 0x10, 0x33, 0x86, 0xe8, 0x87, 0x16, + 0x2c, 0x90, 0xc4, 0x27, 0xc9, 0x81, 0x2f, 0xf9, 0x2b, 0xf9, 0xbe, 0x13, 0x4f, 0x7d, 0xd1, 0x1c, + 0x3d, 0xc8, 0x24, 0xbb, 0x30, 0x9c, 0x16, 0x8a, 0x7e, 0xcf, 0x82, 0xb3, 0x24, 0xfd, 0xcd, 0xb9, + 0x5e, 0xf4, 0xd7, 0x27, 0xfe, 0x68, 0xbd, 0xfe, 0xe4, 0xe1, 0xc1, 0x4a, 0xd6, 0xd7, 0xf8, 0x38, + 0x4b, 0x1c, 0x7a, 0x17, 0xa6, 0x88, 0xdf, 0x09, 0x92, 0x97, 0xf9, 0xc5, 0x06, 0xff, 0x4a, 0x20, + 0xf2, 0x8e, 0xd6, 0xfc, 0x0e, 0xc3, 0x12, 0xd4, 0xfe, 0x69, 0x11, 0xe6, 0x93, 0x25, 0xf6, 0xba, + 0x62, 0x6e, 0x2a, 0xb3, 0x62, 0x4e, 0x9c, 0x91, 0x16, 0x0f, 0xcb, 0xd7, 0xa2, 0x33, 0x22, 0x1a, + 0xb1, 0xa2, 0x85, 0x67, 0x44, 0x16, 0xbe, 0x96, 0x1e, 0xe1, 0x8c, 0xc8, 0x6a, 0xd7, 0x08, 0x0b, + 0x5d, 0x89, 0xdf, 0x2d, 0x76, 0xf2, 0x6e, 0x59, 0x30, 0xe7, 0x32, 0x69, 0x4a, 0xb4, 0x0f, 0x55, + 0x63, 0x1d, 0xf4, 0x49, 0xbc, 0x9a, 0x5b, 0xef, 0xd1, 0xb6, 0x3b, 0xa3, 0xfe, 0x1f, 0x41, 0x44, + 0x31, 0xf1, 0xa3, 0x73, 0x2f, 0xb5, 0xf5, 0x48, 0x39, 0x43, 0xa9, 0x2e, 0x03, 0xcd, 0xfe, 0x57, + 0x0b, 0xe6, 0x62, 0x65, 0x9c, 0x42, 0x5a, 0x50, 0x2e, 0x3b, 0xf9, 0x17, 0xfa, 0xf7, 0x42, 0x04, + 0x6c, 0xa0, 0xa1, 0xef, 0x41, 0xb5, 0xe7, 0xb9, 0x1d, 0xca, 0x78, 0xd3, 0x23, 0xbb, 0xfa, 0x9c, + 0xe4, 0x4d, 0x2a, 0x2d, 0x1d, 0x1e, 0xac, 0x2c, 0x6e, 0x2a, 0x98, 0x86, 0xd7, 0x1f, 0xf4, 0x28, + 0x57, 0x75, 0xce, 0xd8, 0x04, 0x97, 0xcf, 0x8a, 0x6f, 0x13, 0x9f, 0x76, 0xbd, 0x21, 0xa3, 0x5f, + 0xd7, 0x67, 0xc5, 0x70, 0x80, 0xc7, 0xfd, 0xac, 0x18, 0x01, 0x1f, 0xfd, 0xac, 0x18, 0xf6, 0xfd, + 0xda, 0x3e, 0x2b, 0x86, 0x23, 0x1c, 0x11, 0xa9, 0xfc, 0x77, 0xc1, 0x98, 0x45, 0x3c, 0x5a, 0x29, + 0x3c, 0x24, 0x5a, 0x79, 0x0f, 0x66, 0x1c, 0x97, 0x53, 0x7f, 0x8f, 0xf4, 0x74, 0xe2, 0x36, 0xef, + 0x5e, 0x0c, 0xa7, 0xba, 0xa1, 0x71, 0x70, 0x88, 0x88, 0x7a, 0x70, 0x2e, 0x78, 0x70, 0xf0, 0x29, + 0x89, 0x1e, 0x3c, 0x75, 0xd1, 0xd0, 0xab, 0x41, 0x66, 0xfc, 0x46, 0x56, 0xa7, 0x07, 0xa3, 0x08, + 0x38, 0x1b, 0x14, 0x31, 0x98, 0x63, 0x46, 0x98, 0x1e, 0xdc, 0x88, 0x63, 0x3e, 0xd6, 0x24, 0x33, + 0x1b, 0x46, 0xa5, 0x91, 0x09, 0x8a, 0xe3, 0x32, 0xec, 0x7f, 0x2a, 0xc2, 0x99, 0xc4, 0x4e, 0x4b, + 0x84, 0x23, 0x95, 0xc7, 0x19, 0x8e, 0x94, 0x27, 0x0a, 0x47, 0xb2, 0x3d, 0xe5, 0xa9, 0x89, 0x3c, + 0xe5, 0x37, 0x94, 0xb7, 0xaa, 0x57, 0x6e, 0x63, 0x5d, 0x17, 0x66, 0x87, 0xda, 0xdc, 0x34, 0x89, + 0x38, 0xde, 0x57, 0xba, 0x13, 0xed, 0xf4, 0x97, 0xde, 0xda, 0xd5, 0x7e, 0x3d, 0x6f, 0x65, 0x5d, + 0x08, 0xa0, 0xdc, 0x89, 0x0c, 0x02, 0xce, 0x12, 0x57, 0xbf, 0xfd, 0xd9, 0x57, 0xe7, 0x4f, 0x7d, + 0xf1, 0xd5, 0xf9, 0x53, 0x5f, 0x7e, 0x75, 0xfe, 0xd4, 0x0f, 0x0e, 0xcf, 0x5b, 0x9f, 0x1d, 0x9e, + 0xb7, 0xbe, 0x38, 0x3c, 0x6f, 0x7d, 0x79, 0x78, 0xde, 0xfa, 0x8f, 0xc3, 0xf3, 0xd6, 0x8f, 0x7e, + 0x76, 0xfe, 0xd4, 0xfd, 0x67, 0xc6, 0xf9, 0x0f, 0x50, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x5b, + 0x4b, 0xe6, 0xf5, 0x28, 0x4a, 0x00, 0x00, } func (m *AnalysisRunArgument) Marshal() (dAtA []byte, err error) { @@ -2585,6 +2646,96 @@ func (m *ChartSubscription) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ClusterPromotionTask) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterPromotionTask) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ClusterPromotionTask) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ClusterPromotionTaskList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterPromotionTaskList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ClusterPromotionTaskList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *CurrentStage) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5759,6 +5910,36 @@ func (m *ChartSubscription) Size() (n int) { return n } +func (m *ClusterPromotionTask) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ClusterPromotionTaskList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *CurrentStage) Size() (n int) { if m == nil { return 0 @@ -7016,6 +7197,33 @@ func (this *ChartSubscription) String() string { }, "") return s } +func (this *ClusterPromotionTask) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ClusterPromotionTask{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "PromotionTaskSpec", "PromotionTaskSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ClusterPromotionTaskList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ClusterPromotionTaskList{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ClusterPromotionTaskList", "ClusterPromotionTaskList", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ClusterPromotionTaskList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} func (this *CurrentStage) String() string { if this == nil { return "nil" @@ -9550,6 +9758,239 @@ func (m *ChartSubscription) Unmarshal(dAtA []byte) error { } return nil } +func (m *ClusterPromotionTask) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterPromotionTask: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterPromotionTask: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", 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.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", 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.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterPromotionTaskList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterPromotionTaskList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterPromotionTaskList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", 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.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", 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 + } + m.Items = append(m.Items, ClusterPromotionTaskList{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *CurrentStage) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/api/v1alpha1/generated.proto b/api/v1alpha1/generated.proto index 266b7d8c6..46d18cbb3 100644 --- a/api/v1alpha1/generated.proto +++ b/api/v1alpha1/generated.proto @@ -181,6 +181,23 @@ message ChartSubscription { optional int32 discoveryLimit = 4; } +message ClusterPromotionTask { + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Spec describes the desired transition of a specific Stage into a specific + // Freight. + // + // +kubebuilder:validation:Required + optional PromotionTaskSpec spec = 2; +} + +// ClusterPromotionTaskList contains a list of PromotionTasks. +message ClusterPromotionTaskList { + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + repeated ClusterPromotionTaskList items = 2; +} + // CurrentStage reflects a Stage's current use of Freight. message CurrentStage { // Since is the time at which the Stage most recently started using the diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index 6e0f912eb..b11857b4b 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -205,6 +205,64 @@ func (in *ChartSubscription) DeepCopy() *ChartSubscription { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterPromotionTask) DeepCopyInto(out *ClusterPromotionTask) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterPromotionTask. +func (in *ClusterPromotionTask) DeepCopy() *ClusterPromotionTask { + if in == nil { + return nil + } + out := new(ClusterPromotionTask) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterPromotionTask) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterPromotionTaskList) DeepCopyInto(out *ClusterPromotionTaskList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ClusterPromotionTaskList, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterPromotionTaskList. +func (in *ClusterPromotionTaskList) DeepCopy() *ClusterPromotionTaskList { + if in == nil { + return nil + } + out := new(ClusterPromotionTaskList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterPromotionTaskList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CurrentStage) DeepCopyInto(out *CurrentStage) { *out = *in diff --git a/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml b/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml new file mode 100644 index 000000000..460665210 --- /dev/null +++ b/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml @@ -0,0 +1,160 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.17.0 + name: clusterpromotiontasks.kargo.akuity.io +spec: + group: kargo.akuity.io + names: + kind: ClusterPromotionTask + listKind: ClusterPromotionTaskList + plural: clusterpromotiontasks + shortNames: + - clusterpromotask + - clusterpromotasks + singular: clusterpromotiontask + scope: Cluster + versions: + - additionalPrinterColumns: + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: |- + Spec describes the desired transition of a specific Stage into a specific + Freight. + properties: + inputs: + description: |- + Inputs specifies the inputs available to the PromotionTask. These inputs + can be specified in the PromotionTemplate as configuration for the task, + and can be used in the Steps to parameterize the execution of the task. + items: + description: |- + PromotionTaskInput defines an input parameter for a PromotionTask. This input + can be specified in the PromotionTemplate as configuration for the task, and + can be used in the Steps to parameterize the execution of the task. + properties: + default: + description: |- + Default specifies a default value for the parameter. This value will be + used if the parameter is not specified in the PromotionTemplate. + If left unspecified, the input value is required to be specified in the + configuration of the step referencing this task. + type: string + name: + description: |- + Name of the configuration parameter, which should be unique within the + PromotionTask. This name can be used to reference the parameter in the + PromotionTaskSpec.Steps. + minLength: 1 + type: string + required: + - name + type: object + type: array + steps: + description: |- + Steps specifies the directives to be executed as part of this + PromotionTask. The steps as defined here are deflated into a + Promotion when it is built from a PromotionTemplate. + items: + description: PromotionStep describes a directive to be executed + as part of a Promotion. + properties: + as: + description: As is the alias this step can be referred to as. + type: string + config: + description: |- + Config is opaque configuration for the PromotionStep that is understood + only by each PromotionStep's implementation. It is legal to utilize + expressions in defining values at any level of this block. + See https://docs.kargo.io/references/expression-language for details. + x-kubernetes-preserve-unknown-fields: true + retry: + description: Retry is the retry policy for this step. + properties: + errorThreshold: + description: |- + ErrorThreshold is the number of consecutive times the step must fail (for + any reason) before retries are abandoned and the entire Promotion is marked + as failed. + + If this field is set to 0, the effective default will be a step-specific + one. If no step-specific default exists (i.e. is also 0), the effective + default will be the system-wide default of 1. + + A value of 1 will cause the Promotion to be marked as failed after just + a single failure; i.e. no retries will be attempted. + + There is no option to specify an infinite number of retries using a value + such as -1. + + In a future release, Kargo is likely to become capable of distinguishing + between recoverable and non-recoverable step failures. At that time, it is + planned that unrecoverable failures will not be subject to this threshold + and will immediately cause the Promotion to be marked as failed without + further condition. + format: int32 + type: integer + timeout: + description: |- + Timeout is the soft maximum interval in which a step that returns a Running + status (which typically indicates it's waiting for something to happen) + may be retried. + + The maximum is a soft one because the check for whether the interval has + elapsed occurs AFTER the step has run. This effectively means a step may + run ONCE beyond the close of the interval. + + If this field is set to nil, the effective default will be a step-specific + one. If no step-specific default exists (i.e. is also nil), the effective + default will be the system-wide default of 0. + + A value of 0 will cause the step to be retried indefinitely unless the + ErrorThreshold is reached. + type: string + type: object + uses: + description: Uses identifies a runner that can execute this + step. + minLength: 1 + type: string + required: + - uses + type: object + minItems: 1 + type: array + required: + - steps + type: object + required: + - spec + type: object + served: true + storage: true + subresources: {} diff --git a/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json new file mode 100644 index 000000000..6e8611d12 --- /dev/null +++ b/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json @@ -0,0 +1,95 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object.\nServers should convert recognized schemas to the latest internal value, and\nmay reject unrecognized values.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents.\nServers may infer this from the endpoint the client submits requests to.\nCannot be updated.\nIn CamelCase.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "type": "object" + }, + "spec": { + "description": "Spec describes the desired transition of a specific Stage into a specific\nFreight.", + "properties": { + "inputs": { + "description": "Inputs specifies the inputs available to the PromotionTask. These inputs\ncan be specified in the PromotionTemplate as configuration for the task,\nand can be used in the Steps to parameterize the execution of the task.", + "items": { + "description": "PromotionTaskInput defines an input parameter for a PromotionTask. This input\ncan be specified in the PromotionTemplate as configuration for the task, and\ncan be used in the Steps to parameterize the execution of the task.", + "properties": { + "default": { + "description": "Default specifies a default value for the parameter. This value will be\nused if the parameter is not specified in the PromotionTemplate.\nIf left unspecified, the input value is required to be specified in the\nconfiguration of the step referencing this task.", + "type": "string" + }, + "name": { + "description": "Name of the configuration parameter, which should be unique within the\nPromotionTask. This name can be used to reference the parameter in the\nPromotionTaskSpec.Steps.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" + }, + "steps": { + "description": "Steps specifies the directives to be executed as part of this\nPromotionTask. The steps as defined here are deflated into a\nPromotion when it is built from a PromotionTemplate.", + "items": { + "description": "PromotionStep describes a directive to be executed as part of a Promotion.", + "properties": { + "as": { + "description": "As is the alias this step can be referred to as.", + "type": "string" + }, + "config": { + "description": "Config is opaque configuration for the PromotionStep that is understood\nonly by each PromotionStep's implementation. It is legal to utilize\nexpressions in defining values at any level of this block.\nSee https://docs.kargo.io/references/expression-language for details.", + "x-kubernetes-preserve-unknown-fields": true + }, + "retry": { + "description": "Retry is the retry policy for this step.", + "properties": { + "errorThreshold": { + "description": "ErrorThreshold is the number of consecutive times the step must fail (for\nany reason) before retries are abandoned and the entire Promotion is marked\nas failed.\n\nIf this field is set to 0, the effective default will be a step-specific\none. If no step-specific default exists (i.e. is also 0), the effective\ndefault will be the system-wide default of 1.\n\nA value of 1 will cause the Promotion to be marked as failed after just\na single failure; i.e. no retries will be attempted.\n\nThere is no option to specify an infinite number of retries using a value\nsuch as -1.\n\nIn a future release, Kargo is likely to become capable of distinguishing\nbetween recoverable and non-recoverable step failures. At that time, it is\nplanned that unrecoverable failures will not be subject to this threshold\nand will immediately cause the Promotion to be marked as failed without\nfurther condition.", + "format": "int32", + "maximum": 2147483647, + "minimum": -2147483648, + "type": "integer" + }, + "timeout": { + "description": "Timeout is the soft maximum interval in which a step that returns a Running\nstatus (which typically indicates it's waiting for something to happen)\nmay be retried.\n\nThe maximum is a soft one because the check for whether the interval has\nelapsed occurs AFTER the step has run. This effectively means a step may\nrun ONCE beyond the close of the interval.\n\nIf this field is set to nil, the effective default will be a step-specific\none. If no step-specific default exists (i.e. is also nil), the effective\ndefault will be the system-wide default of 0.\n\nA value of 0 will cause the step to be retried indefinitely unless the\nErrorThreshold is reached.", + "type": "string" + } + }, + "type": "object" + }, + "uses": { + "description": "Uses identifies a runner that can execute this step.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "uses" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "steps" + ], + "type": "object" + } + }, + "required": [ + "spec" + ], + "type": "object" +} \ No newline at end of file diff --git a/ui/src/gen/v1alpha1/generated_pb.ts b/ui/src/gen/v1alpha1/generated_pb.ts index 9e88f3715..f56196b7e 100644 --- a/ui/src/gen/v1alpha1/generated_pb.ts +++ b/ui/src/gen/v1alpha1/generated_pb.ts @@ -18,7 +18,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file v1alpha1/generated.proto. */ export const file_v1alpha1_generated: GenFile = /*@__PURE__*/ - fileDesc("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUiSQoMQ3VycmVudFN0YWdlEjkKBXNpbmNlGAEgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUitgIKE0Rpc2NvdmVyZWRBcnRpZmFjdHMSQAoMZGlzY292ZXJlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSRQoDZ2l0GAEgAygLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkdpdERpc2NvdmVyeVJlc3VsdBJKCgZpbWFnZXMYAiADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2VEaXNjb3ZlcnlSZXN1bHQSSgoGY2hhcnRzGAMgAygLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0RGlzY292ZXJ5UmVzdWx0IrABChBEaXNjb3ZlcmVkQ29tbWl0EgoKAmlkGAEgASgJEg4KBmJyYW5jaBgCIAEoCRILCgN0YWcYAyABKAkSDwoHc3ViamVjdBgEIAEoCRIOCgZhdXRob3IYBSABKAkSEQoJY29tbWl0dGVyGAYgASgJEj8KC2NyZWF0b3JEYXRlGAcgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiigEKGERpc2NvdmVyZWRJbWFnZVJlZmVyZW5jZRILCgN0YWcYASABKAkSDgoGZGlnZXN0GAIgASgJEhIKCmdpdFJlcG9VUkwYAyABKAkSPQoJY3JlYXRlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiogMKB0ZyZWlnaHQSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRINCgVhbGlhcxgHIAEoCRJDCgZvcmlnaW4YCSABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodE9yaWdpbhJACgdjb21taXRzGAMgAygLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkdpdENvbW1pdBI7CgZpbWFnZXMYBCADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2USOwoGY2hhcnRzGAUgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0EkMKBnN0YXR1cxgGIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U3RhdHVzIq0CChFGcmVpZ2h0Q29sbGVjdGlvbhIKCgJpZBgDIAEoCRJRCgVpdGVtcxgBIAMoCzJCLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0Q29sbGVjdGlvbi5JdGVtc0VudHJ5ElMKE3ZlcmlmaWNhdGlvbkhpc3RvcnkYAiADKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpY2F0aW9uSW5mbxpkCgpJdGVtc0VudHJ5EgsKA2tleRgBIAEoCRJFCgV2YWx1ZRgCIAEoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVmZXJlbmNlOgI4ASKNAQoLRnJlaWdodExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodCIrCg1GcmVpZ2h0T3JpZ2luEgwKBGtpbmQYASABKAkSDAoEbmFtZRgCIAEoCSKhAgoQRnJlaWdodFJlZmVyZW5jZRIMCgRuYW1lGAEgASgJEkMKBm9yaWdpbhgIIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgDIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBCADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQinAEKDkZyZWlnaHRSZXF1ZXN0EkMKBm9yaWdpbhgBIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkUKB3NvdXJjZXMYAiABKAsyNC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFNvdXJjZXMiegoORnJlaWdodFNvdXJjZXMSDgoGZGlyZWN0GAEgASgIEg4KBnN0YWdlcxgCIAMoCRJIChByZXF1aXJlZFNvYWtUaW1lGAMgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uItcECg1GcmVpZ2h0U3RhdHVzElkKC2N1cnJlbnRseUluGAMgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQ3VycmVudGx5SW5FbnRyeRJXCgp2ZXJpZmllZEluGAEgAygLMkMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuVmVyaWZpZWRJbkVudHJ5ElkKC2FwcHJvdmVkRm9yGAIgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQXBwcm92ZWRGb3JFbnRyeRpmChBDdXJyZW50bHlJbkVudHJ5EgsKA2tleRgBIAEoCRJBCgV2YWx1ZRgCIAEoCzIyLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DdXJyZW50U3RhZ2U6AjgBGmYKD1ZlcmlmaWVkSW5FbnRyeRILCgNrZXkYASABKAkSQgoFdmFsdWUYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpZWRTdGFnZToCOAEaZwoQQXBwcm92ZWRGb3JFbnRyeRILCgNrZXkYASABKAkSQgoFdmFsdWUYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXBwcm92ZWRTdGFnZToCOAEieQoJR2l0Q29tbWl0Eg8KB3JlcG9VUkwYASABKAkSCgoCaWQYAiABKAkSDgoGYnJhbmNoGAMgASgJEgsKA3RhZxgEIAEoCRIPCgdtZXNzYWdlGAYgASgJEg4KBmF1dGhvchgHIAEoCRIRCgljb21taXR0ZXIYCCABKAkibgoSR2l0RGlzY292ZXJ5UmVzdWx0Eg8KB3JlcG9VUkwYASABKAkSRwoHY29tbWl0cxgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQ29tbWl0Io4CCg9HaXRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIfChdjb21taXRTZWxlY3Rpb25TdHJhdGVneRgCIAEoCRIOCgZicmFuY2gYAyABKAkSFQoNc3RyaWN0U2VtdmVycxgLIAEoCBIYChBzZW12ZXJDb25zdHJhaW50GAQgASgJEhEKCWFsbG93VGFncxgFIAEoCRISCgppZ25vcmVUYWdzGAYgAygJEh0KFWluc2VjdXJlU2tpcFRMU1ZlcmlmeRgHIAEoCBIUCgxpbmNsdWRlUGF0aHMYCCADKAkSFAoMZXhjbHVkZVBhdGhzGAkgAygJEhYKDmRpc2NvdmVyeUxpbWl0GAogASgFIsgBCgZIZWFsdGgSDgoGc3RhdHVzGAEgASgJEg4KBmlzc3VlcxgCIAMoCRJOCgZjb25maWcYBCABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OEk4KBm91dHB1dBgFIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ibwoPSGVhbHRoQ2hlY2tTdGVwEgwKBHVzZXMYASABKAkSTgoGY29uZmlnGAIgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJJCgVJbWFnZRIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSCwoDdGFnGAMgASgJEg4KBmRpZ2VzdBgEIAEoCSKNAQoUSW1hZ2VEaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIQCghwbGF0Zm9ybRgCIAEoCRJSCgpyZWZlcmVuY2VzGAMgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRJbWFnZVJlZmVyZW5jZSL5AQoRSW1hZ2VTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRISCgpnaXRSZXBvVVJMGAIgASgJEh4KFmltYWdlU2VsZWN0aW9uU3RyYXRlZ3kYAyABKAkSFQoNc3RyaWN0U2VtdmVycxgKIAEoCBIYChBzZW12ZXJDb25zdHJhaW50GAQgASgJEhEKCWFsbG93VGFncxgFIAEoCRISCgppZ25vcmVUYWdzGAYgAygJEhAKCHBsYXRmb3JtGAcgASgJEh0KFWluc2VjdXJlU2tpcFRMU1ZlcmlmeRgIIAEoCBIWCg5kaXNjb3ZlcnlMaW1pdBgJIAEoBSLTAQoHUHJvamVjdBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEj8KBHNwZWMYAiABKAsyMS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFNwZWMSQwoGc3RhdHVzGAMgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3RTdGF0dXMijQEKC1Byb2plY3RMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjwKBWl0ZW1zGAIgAygLMi0uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3QiXwoLUHJvamVjdFNwZWMSUAoRcHJvbW90aW9uUG9saWNpZXMYASADKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUG9saWN5InQKDVByb2plY3RTdGF0dXMSQwoKY29uZGl0aW9ucxgDIAMoCzIvLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5Db25kaXRpb24SDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCSLZAQoJUHJvbW90aW9uEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESQQoEc3BlYxgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TcGVjEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGF0dXMikQEKDVByb21vdGlvbkxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPgoFaXRlbXMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uIj4KD1Byb21vdGlvblBvbGljeRINCgVzdGFnZRgBIAEoCRIcChRhdXRvUHJvbW90aW9uRW5hYmxlZBgCIAEoCCLyAQoSUHJvbW90aW9uUmVmZXJlbmNlEgwKBG5hbWUYASABKAkSRwoHZnJlaWdodBgCIAEoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVmZXJlbmNlEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGF0dXMSPgoKZmluaXNoZWRBdBgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIroBCg1Qcm9tb3Rpb25TcGVjEg0KBXN0YWdlGAEgASgJEg8KB2ZyZWlnaHQYAiABKAkSRQoEdmFycxgEIAMoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25WYXJpYWJsZRJCCgVzdGVwcxgDIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwIrcECg9Qcm9tb3Rpb25TdGF0dXMSGgoSbGFzdEhhbmRsZWRSZWZyZXNoGAQgASgJEg0KBXBoYXNlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSRwoHZnJlaWdodBgFIAEoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVmZXJlbmNlElIKEWZyZWlnaHRDb2xsZWN0aW9uGAcgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uEksKDGhlYWx0aENoZWNrcxgIIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5IZWFsdGhDaGVja1N0ZXASPgoKZmluaXNoZWRBdBgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhMKC2N1cnJlbnRTdGVwGAkgASgDEloKFXN0ZXBFeGVjdXRpb25NZXRhZGF0YRgLIAMoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGVwRXhlY3V0aW9uTWV0YWRhdGESTQoFc3RhdGUYCiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIsIBCg1Qcm9tb3Rpb25TdGVwEgwKBHVzZXMYASABKAkSCgoCYXMYAiABKAkSRwoFcmV0cnkYBCABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcFJldHJ5Ek4KBmNvbmZpZxgDIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ibQoSUHJvbW90aW9uU3RlcFJldHJ5Ej8KB3RpbWVvdXQYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SFgoOZXJyb3JUaHJlc2hvbGQYAiABKA0imgEKDVByb21vdGlvblRhc2sSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJFCgRzcGVjGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tTcGVjIjMKElByb21vdGlvblRhc2tJbnB1dBIMCgRuYW1lGAEgASgJEg8KB2RlZmF1bHQYAiABKAkinQEKEVByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEkYKBWl0ZW1zGAIgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tMaXN0IqEBChFQcm9tb3Rpb25UYXNrU3BlYxJICgZpbnB1dHMYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza0lucHV0EkIKBXN0ZXBzGAIgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAiXgoRUHJvbW90aW9uVGVtcGxhdGUSSQoEc3BlYxgBIAEoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZVNwZWMiogEKFVByb21vdGlvblRlbXBsYXRlU3BlYxJFCgR2YXJzGAIgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAEgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAiMAoRUHJvbW90aW9uVmFyaWFibGUSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSLmAQoQUmVwb1N1YnNjcmlwdGlvbhJCCgNnaXQYASABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0U3Vic2NyaXB0aW9uEkYKBWltYWdlGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlU3Vic2NyaXB0aW9uEkYKBWNoYXJ0GAMgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0U3Vic2NyaXB0aW9uIs0BCgVTdGFnZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEj0KBHNwZWMYAiABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2VTcGVjEkEKBnN0YXR1cxgDIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVN0YXR1cyKJAQoJU3RhZ2VMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjoKBWl0ZW1zGAIgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlIogCCglTdGFnZVNwZWMSDQoFc2hhcmQYBCABKAkSTgoQcmVxdWVzdGVkRnJlaWdodBgFIAMoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVxdWVzdBJSChFwcm9tb3Rpb25UZW1wbGF0ZRgGIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZRJICgx2ZXJpZmljYXRpb24YAyABKAsyMi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpY2F0aW9uIvYDCgtTdGFnZVN0YXR1cxJDCgpjb25kaXRpb25zGA0gAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYCyABKAkSDQoFcGhhc2UYASABKAkSTwoOZnJlaWdodEhpc3RvcnkYBCADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SFgoOZnJlaWdodFN1bW1hcnkYDCABKAkSPAoGaGVhbHRoGAggASgLMiwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aBIPCgdtZXNzYWdlGAkgASgJEhoKEm9ic2VydmVkR2VuZXJhdGlvbhgGIAEoAxJSChBjdXJyZW50UHJvbW90aW9uGAcgASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZRJPCg1sYXN0UHJvbW90aW9uGAogASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZSLaAQoVU3RlcEV4ZWN1dGlvbk1ldGFkYXRhEg0KBWFsaWFzGAEgASgJEj0KCXN0YXJ0ZWRBdBgCIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEj4KCmZpbmlzaGVkQXQYAyABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRISCgplcnJvckNvdW50GAQgASgNEg4KBnN0YXR1cxgFIAEoCRIPCgdtZXNzYWdlGAYgASgJIosCCgxWZXJpZmljYXRpb24SWgoRYW5hbHlzaXNUZW1wbGF0ZXMYASADKAsyPy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNUZW1wbGF0ZVJlZmVyZW5jZRJWChNhbmFseXNpc1J1bk1ldGFkYXRhGAIgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGESRwoEYXJncxgDIAMoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1bkFyZ3VtZW50Ip0CChBWZXJpZmljYXRpb25JbmZvEgoKAmlkGAQgASgJEg0KBWFjdG9yGAcgASgJEj0KCXN0YXJ0VGltZRgFIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEg0KBXBoYXNlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSTwoLYW5hbHlzaXNSdW4YAyABKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5SZWZlcmVuY2USPgoKZmluaXNoVGltZRgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIpQBCg1WZXJpZmllZFN0YWdlEj4KCnZlcmlmaWVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJDCgtsb25nZXN0U29haxgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbiLZAQoJV2FyZWhvdXNlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESQQoEc3BlYxgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTcGVjEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTdGF0dXMikQEKDVdhcmVob3VzZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPgoFaXRlbXMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlIs4BCg1XYXJlaG91c2VTcGVjEg0KBXNoYXJkGAIgASgJEkAKCGludGVydmFsGAQgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uEh0KFWZyZWlnaHRDcmVhdGlvblBvbGljeRgDIAEoCRJNCg1zdWJzY3JpcHRpb25zGAEgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlJlcG9TdWJzY3JpcHRpb24i/QEKD1dhcmVob3VzZVN0YXR1cxJDCgpjb25kaXRpb25zGAkgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBiABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAQgASgDEhUKDWxhc3RGcmVpZ2h0SUQYCCABKAkSVgoTZGlzY292ZXJlZEFydGlmYWN0cxgHIAEoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQXJ0aWZhY3RzQpcCCihjb20uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExQg5HZW5lcmF0ZWRQcm90b1ABWiRnaXRodWIuY29tL2FrdWl0eS9rYXJnby9hcGkvdjFhbHBoYTGiAgVHQ0FLQaoCJEdpdGh1Yi5Db20uQWt1aXR5LkthcmdvLkFwaS5WMWFscGhhMcoCJEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMeICMEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMVxHUEJNZXRhZGF0YeoCKUdpdGh1Yjo6Q29tOjpBa3VpdHk6OkthcmdvOjpBcGk6OlYxYWxwaGEx", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]); + fileDesc("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKrAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEk0KBWl0ZW1zGAIgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrTGlzdCJJCgxDdXJyZW50U3RhZ2USOQoFc2luY2UYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSK2AgoTRGlzY292ZXJlZEFydGlmYWN0cxJACgxkaXNjb3ZlcmVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJFCgNnaXQYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0RGlzY292ZXJ5UmVzdWx0EkoKBmltYWdlcxgCIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZURpc2NvdmVyeVJlc3VsdBJKCgZjaGFydHMYAyADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnREaXNjb3ZlcnlSZXN1bHQisAEKEERpc2NvdmVyZWRDb21taXQSCgoCaWQYASABKAkSDgoGYnJhbmNoGAIgASgJEgsKA3RhZxgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEg4KBmF1dGhvchgFIAEoCRIRCgljb21taXR0ZXIYBiABKAkSPwoLY3JlYXRvckRhdGUYByABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKKAQoYRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlEgsKA3RhZxgBIAEoCRIOCgZkaWdlc3QYAiABKAkSEgoKZ2l0UmVwb1VSTBgDIAEoCRI9CgljcmVhdGVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKiAwoHRnJlaWdodBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEg0KBWFsaWFzGAcgASgJEkMKBm9yaWdpbhgJIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAyADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBSADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQSQwoGc3RhdHVzGAYgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMirQIKEUZyZWlnaHRDb2xsZWN0aW9uEgoKAmlkGAMgASgJElEKBWl0ZW1zGAEgAygLMkIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uLkl0ZW1zRW50cnkSUwoTdmVyaWZpY2F0aW9uSGlzdG9yeRgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb25JbmZvGmQKCkl0ZW1zRW50cnkSCwoDa2V5GAEgASgJEkUKBXZhbHVlGAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2U6AjgBIo0BCgtGcmVpZ2h0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0IisKDUZyZWlnaHRPcmlnaW4SDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJIqECChBGcmVpZ2h0UmVmZXJlbmNlEgwKBG5hbWUYASABKAkSQwoGb3JpZ2luGAggASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAMgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydCKcAQoORnJlaWdodFJlcXVlc3QSQwoGb3JpZ2luGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SRQoHc291cmNlcxgCIAEoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U291cmNlcyJ6Cg5GcmVpZ2h0U291cmNlcxIOCgZkaXJlY3QYASABKAgSDgoGc3RhZ2VzGAIgAygJEkgKEHJlcXVpcmVkU29ha1RpbWUYAyABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24i1wQKDUZyZWlnaHRTdGF0dXMSWQoLY3VycmVudGx5SW4YAyADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5DdXJyZW50bHlJbkVudHJ5ElcKCnZlcmlmaWVkSW4YASADKAsyQy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5WZXJpZmllZEluRW50cnkSWQoLYXBwcm92ZWRGb3IYAiADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5BcHByb3ZlZEZvckVudHJ5GmYKEEN1cnJlbnRseUluRW50cnkSCwoDa2V5GAEgASgJEkEKBXZhbHVlGAIgASgLMjIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkN1cnJlbnRTdGFnZToCOAEaZgoPVmVyaWZpZWRJbkVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmllZFN0YWdlOgI4ARpnChBBcHByb3ZlZEZvckVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BcHByb3ZlZFN0YWdlOgI4ASJ5CglHaXRDb21taXQSDwoHcmVwb1VSTBgBIAEoCRIKCgJpZBgCIAEoCRIOCgZicmFuY2gYAyABKAkSCwoDdGFnGAQgASgJEg8KB21lc3NhZ2UYBiABKAkSDgoGYXV0aG9yGAcgASgJEhEKCWNvbW1pdHRlchgIIAEoCSJuChJHaXREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRJHCgdjb21taXRzGAIgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRDb21taXQijgIKD0dpdFN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEh8KF2NvbW1pdFNlbGVjdGlvblN0cmF0ZWd5GAIgASgJEg4KBmJyYW5jaBgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAsgASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAcgASgIEhQKDGluY2x1ZGVQYXRocxgIIAMoCRIUCgxleGNsdWRlUGF0aHMYCSADKAkSFgoOZGlzY292ZXJ5TGltaXQYCiABKAUiyAEKBkhlYWx0aBIOCgZzdGF0dXMYASABKAkSDgoGaXNzdWVzGAIgAygJEk4KBmNvbmZpZxgEIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04STgoGb3V0cHV0GAUgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJvCg9IZWFsdGhDaGVja1N0ZXASDAoEdXNlcxgBIAEoCRJOCgZjb25maWcYAiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIkkKBUltYWdlEg8KB3JlcG9VUkwYASABKAkSEgoKZ2l0UmVwb1VSTBgCIAEoCRILCgN0YWcYAyABKAkSDgoGZGlnZXN0GAQgASgJIo0BChRJbWFnZURpc2NvdmVyeVJlc3VsdBIPCgdyZXBvVVJMGAEgASgJEhAKCHBsYXRmb3JtGAIgASgJElIKCnJlZmVyZW5jZXMYAyADKAsyPi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlIvkBChFJbWFnZVN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSHgoWaW1hZ2VTZWxlY3Rpb25TdHJhdGVneRgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAogASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSEAoIcGxhdGZvcm0YByABKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAggASgIEhYKDmRpc2NvdmVyeUxpbWl0GAkgASgFItMBCgdQcm9qZWN0EkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPwoEc3BlYxgCIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0U3BlYxJDCgZzdGF0dXMYAyABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFN0YXR1cyKNAQoLUHJvamVjdExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdCJfCgtQcm9qZWN0U3BlYxJQChFwcm9tb3Rpb25Qb2xpY2llcxgBIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25Qb2xpY3kidAoNUHJvamVjdFN0YXR1cxJDCgpjb25kaXRpb25zGAMgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJItkBCglQcm9tb3Rpb24SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cyKRAQoNUHJvbW90aW9uTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb24iPgoPUHJvbW90aW9uUG9saWN5Eg0KBXN0YWdlGAEgASgJEhwKFGF1dG9Qcm9tb3Rpb25FbmFibGVkGAIgASgIIvIBChJQcm9tb3Rpb25SZWZlcmVuY2USDAoEbmFtZRgBIAEoCRJHCgdmcmVpZ2h0GAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cxI+CgpmaW5pc2hlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiugEKDVByb21vdGlvblNwZWMSDQoFc3RhZ2UYASABKAkSDwoHZnJlaWdodBgCIAEoCRJFCgR2YXJzGAQgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAMgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAitwQKD1Byb21vdGlvblN0YXR1cxIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBCABKAkSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJHCgdmcmVpZ2h0GAUgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USUgoRZnJlaWdodENvbGxlY3Rpb24YByABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SSwoMaGVhbHRoQ2hlY2tzGAggAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aENoZWNrU3RlcBI+CgpmaW5pc2hlZEF0GAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSEwoLY3VycmVudFN0ZXAYCSABKAMSWgoVc3RlcEV4ZWN1dGlvbk1ldGFkYXRhGAsgAygLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0ZXBFeGVjdXRpb25NZXRhZGF0YRJNCgVzdGF0ZRgKIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04iwgEKDVByb21vdGlvblN0ZXASDAoEdXNlcxgBIAEoCRIKCgJhcxgCIAEoCRJHCgVyZXRyeRgEIAEoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwUmV0cnkSTgoGY29uZmlnGAMgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJtChJQcm9tb3Rpb25TdGVwUmV0cnkSPwoHdGltZW91dBgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbhIWCg5lcnJvclRocmVzaG9sZBgCIAEoDSKaAQoNUHJvbW90aW9uVGFzaxJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkUKBHNwZWMYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza1NwZWMiMwoSUHJvbW90aW9uVGFza0lucHV0EgwKBG5hbWUYASABKAkSDwoHZGVmYXVsdBgCIAEoCSKdAQoRUHJvbW90aW9uVGFza0xpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESRgoFaXRlbXMYAiADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza0xpc3QioQEKEVByb21vdGlvblRhc2tTcGVjEkgKBmlucHV0cxgBIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrSW5wdXQSQgoFc3RlcHMYAiADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCJeChFQcm9tb3Rpb25UZW1wbGF0ZRJJCgRzcGVjGAEgASgLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRlbXBsYXRlU3BlYyKiAQoVUHJvbW90aW9uVGVtcGxhdGVTcGVjEkUKBHZhcnMYAiADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVmFyaWFibGUSQgoFc3RlcHMYASADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCIwChFQcm9tb3Rpb25WYXJpYWJsZRIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJIuYBChBSZXBvU3Vic2NyaXB0aW9uEkIKA2dpdBgBIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRTdWJzY3JpcHRpb24SRgoFaW1hZ2UYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2VTdWJzY3JpcHRpb24SRgoFY2hhcnQYAyABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnRTdWJzY3JpcHRpb24izQEKBVN0YWdlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPQoEc3BlYxgCIAEoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVNwZWMSQQoGc3RhdHVzGAMgASgLMjEuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlU3RhdHVzIokBCglTdGFnZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESOgoFaXRlbXMYAiADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2UiiAIKCVN0YWdlU3BlYxINCgVzaGFyZBgEIAEoCRJOChByZXF1ZXN0ZWRGcmVpZ2h0GAUgAygLMjQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZXF1ZXN0ElIKEXByb21vdGlvblRlbXBsYXRlGAYgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRlbXBsYXRlEkgKDHZlcmlmaWNhdGlvbhgDIAEoCzIyLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb24i9gMKC1N0YWdlU3RhdHVzEkMKCmNvbmRpdGlvbnMYDSADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgLIAEoCRINCgVwaGFzZRgBIAEoCRJPCg5mcmVpZ2h0SGlzdG9yeRgEIAMoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0Q29sbGVjdGlvbhIWCg5mcmVpZ2h0U3VtbWFyeRgMIAEoCRI8CgZoZWFsdGgYCCABKAsyLC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSGVhbHRoEg8KB21lc3NhZ2UYCSABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAYgASgDElIKEGN1cnJlbnRQcm9tb3Rpb24YByABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUmVmZXJlbmNlEk8KDWxhc3RQcm9tb3Rpb24YCiABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUmVmZXJlbmNlItoBChVTdGVwRXhlY3V0aW9uTWV0YWRhdGESDQoFYWxpYXMYASABKAkSPQoJc3RhcnRlZEF0GAIgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSPgoKZmluaXNoZWRBdBgDIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhIKCmVycm9yQ291bnQYBCABKA0SDgoGc3RhdHVzGAUgASgJEg8KB21lc3NhZ2UYBiABKAkiiwIKDFZlcmlmaWNhdGlvbhJaChFhbmFseXNpc1RlbXBsYXRlcxgBIAMoCzI/LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1RlbXBsYXRlUmVmZXJlbmNlElYKE2FuYWx5c2lzUnVuTWV0YWRhdGEYAiABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YRJHCgRhcmdzGAMgAygLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuQXJndW1lbnQinQIKEFZlcmlmaWNhdGlvbkluZm8SCgoCaWQYBCABKAkSDQoFYWN0b3IYByABKAkSPQoJc3RhcnRUaW1lGAUgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJPCgthbmFseXNpc1J1bhgDIAEoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1blJlZmVyZW5jZRI+CgpmaW5pc2hUaW1lGAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUilAEKDVZlcmlmaWVkU3RhZ2USPgoKdmVyaWZpZWRBdBgBIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEkMKC2xvbmdlc3RTb2FrGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uItkBCglXYXJlaG91c2USQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVN0YXR1cyKRAQoNV2FyZWhvdXNlTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2UizgEKDVdhcmVob3VzZVNwZWMSDQoFc2hhcmQYAiABKAkSQAoIaW50ZXJ2YWwYBCABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SHQoVZnJlaWdodENyZWF0aW9uUG9saWN5GAMgASgJEk0KDXN1YnNjcmlwdGlvbnMYASADKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUmVwb1N1YnNjcmlwdGlvbiL9AQoPV2FyZWhvdXNlU3RhdHVzEkMKCmNvbmRpdGlvbnMYCSADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgGIAEoCRIaChJvYnNlcnZlZEdlbmVyYXRpb24YBCABKAMSFQoNbGFzdEZyZWlnaHRJRBgIIAEoCRJWChNkaXNjb3ZlcmVkQXJ0aWZhY3RzGAcgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRBcnRpZmFjdHNClwIKKGNvbS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTFCDkdlbmVyYXRlZFByb3RvUAFaJGdpdGh1Yi5jb20vYWt1aXR5L2thcmdvL2FwaS92MWFscGhhMaICBUdDQUtBqgIkR2l0aHViLkNvbS5Ba3VpdHkuS2FyZ28uQXBpLlYxYWxwaGExygIkR2l0aHViXENvbVxBa3VpdHlcS2FyZ29cQXBpXFYxYWxwaGEx4gIwR2l0aHViXENvbVxBa3VpdHlcS2FyZ29cQXBpXFYxYWxwaGExXEdQQk1ldGFkYXRh6gIpR2l0aHViOjpDb206OkFrdWl0eTo6S2FyZ286OkFwaTo6VjFhbHBoYTE", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]); /** * AnalysisRunArgument represents an argument to be added to an AnalysisRun. @@ -420,6 +420,57 @@ export type ChartSubscription = Message<"github.com.akuity.kargo.api.v1alpha1.Ch export const ChartSubscriptionSchema: GenMessage = /*@__PURE__*/ messageDesc(file_v1alpha1_generated, 10); +/** + * @generated from message github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTask + */ +export type ClusterPromotionTask = Message<"github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTask"> & { + /** + * @generated from field: optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + */ + metadata?: ObjectMeta; + + /** + * Spec describes the desired transition of a specific Stage into a specific + * Freight. + * + * +kubebuilder:validation:Required + * + * @generated from field: optional github.com.akuity.kargo.api.v1alpha1.PromotionTaskSpec spec = 2; + */ + spec?: PromotionTaskSpec; +}; + +/** + * Describes the message github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTask. + * Use `create(ClusterPromotionTaskSchema)` to create a new message. + */ +export const ClusterPromotionTaskSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_v1alpha1_generated, 11); + +/** + * ClusterPromotionTaskList contains a list of PromotionTasks. + * + * @generated from message github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTaskList + */ +export type ClusterPromotionTaskList = Message<"github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTaskList"> & { + /** + * @generated from field: optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + */ + metadata?: ListMeta; + + /** + * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTaskList items = 2; + */ + items: ClusterPromotionTaskList[]; +}; + +/** + * Describes the message github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTaskList. + * Use `create(ClusterPromotionTaskListSchema)` to create a new message. + */ +export const ClusterPromotionTaskListSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_v1alpha1_generated, 12); + /** * CurrentStage reflects a Stage's current use of Freight. * @@ -441,7 +492,7 @@ export type CurrentStage = Message<"github.com.akuity.kargo.api.v1alpha1.Current * Use `create(CurrentStageSchema)` to create a new message. */ export const CurrentStageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 11); + messageDesc(file_v1alpha1_generated, 13); /** * DiscoveredArtifacts holds the artifacts discovered by the Warehouse for its @@ -495,7 +546,7 @@ export type DiscoveredArtifacts = Message<"github.com.akuity.kargo.api.v1alpha1. * Use `create(DiscoveredArtifactsSchema)` to create a new message. */ export const DiscoveredArtifactsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 12); + messageDesc(file_v1alpha1_generated, 14); /** * DiscoveredCommit represents a commit discovered by a Warehouse for a @@ -566,7 +617,7 @@ export type DiscoveredCommit = Message<"github.com.akuity.kargo.api.v1alpha1.Dis * Use `create(DiscoveredCommitSchema)` to create a new message. */ export const DiscoveredCommitSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 13); + messageDesc(file_v1alpha1_generated, 15); /** * DiscoveredImageReference represents an image reference discovered by a @@ -619,7 +670,7 @@ export type DiscoveredImageReference = Message<"github.com.akuity.kargo.api.v1al * Use `create(DiscoveredImageReferenceSchema)` to create a new message. */ export const DiscoveredImageReferenceSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 14); + messageDesc(file_v1alpha1_generated, 16); /** * Freight represents a collection of versioned artifacts. @@ -690,7 +741,7 @@ export type Freight = Message<"github.com.akuity.kargo.api.v1alpha1.Freight"> & * Use `create(FreightSchema)` to create a new message. */ export const FreightSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 15); + messageDesc(file_v1alpha1_generated, 17); /** * FreightCollection is a collection of FreightReferences, each of which @@ -730,7 +781,7 @@ export type FreightCollection = Message<"github.com.akuity.kargo.api.v1alpha1.Fr * Use `create(FreightCollectionSchema)` to create a new message. */ export const FreightCollectionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 16); + messageDesc(file_v1alpha1_generated, 18); /** * FreightList is a list of Freight resources. @@ -754,7 +805,7 @@ export type FreightList = Message<"github.com.akuity.kargo.api.v1alpha1.FreightL * Use `create(FreightListSchema)` to create a new message. */ export const FreightListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 17); + messageDesc(file_v1alpha1_generated, 19); /** * FreightOrigin describes a kind of Freight in terms of where it may have @@ -791,7 +842,7 @@ export type FreightOrigin = Message<"github.com.akuity.kargo.api.v1alpha1.Freigh * Use `create(FreightOriginSchema)` to create a new message. */ export const FreightOriginSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 18); + messageDesc(file_v1alpha1_generated, 20); /** * FreightReference is a simplified representation of a piece of Freight -- not @@ -843,7 +894,7 @@ export type FreightReference = Message<"github.com.akuity.kargo.api.v1alpha1.Fre * Use `create(FreightReferenceSchema)` to create a new message. */ export const FreightReferenceSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 19); + messageDesc(file_v1alpha1_generated, 21); /** * FreightRequest expresses a Stage's need for Freight having originated from a @@ -876,7 +927,7 @@ export type FreightRequest = Message<"github.com.akuity.kargo.api.v1alpha1.Freig * Use `create(FreightRequestSchema)` to create a new message. */ export const FreightRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 20); + messageDesc(file_v1alpha1_generated, 22); /** * @generated from message github.com.akuity.kargo.api.v1alpha1.FreightSources @@ -925,7 +976,7 @@ export type FreightSources = Message<"github.com.akuity.kargo.api.v1alpha1.Freig * Use `create(FreightSourcesSchema)` to create a new message. */ export const FreightSourcesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 21); + messageDesc(file_v1alpha1_generated, 23); /** * FreightStatus describes a piece of Freight's most recently observed state. @@ -964,7 +1015,7 @@ export type FreightStatus = Message<"github.com.akuity.kargo.api.v1alpha1.Freigh * Use `create(FreightStatusSchema)` to create a new message. */ export const FreightStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 22); + messageDesc(file_v1alpha1_generated, 24); /** * GitCommit describes a specific commit from a specific Git repository. @@ -1030,7 +1081,7 @@ export type GitCommit = Message<"github.com.akuity.kargo.api.v1alpha1.GitCommit" * Use `create(GitCommitSchema)` to create a new message. */ export const GitCommitSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 23); + messageDesc(file_v1alpha1_generated, 25); /** * GitDiscoveryResult represents the result of a Git discovery operation for a @@ -1066,7 +1117,7 @@ export type GitDiscoveryResult = Message<"github.com.akuity.kargo.api.v1alpha1.G * Use `create(GitDiscoveryResultSchema)` to create a new message. */ export const GitDiscoveryResultSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 24); + messageDesc(file_v1alpha1_generated, 26); /** * GitSubscription defines a subscription to a Git repository. @@ -1236,7 +1287,7 @@ export type GitSubscription = Message<"github.com.akuity.kargo.api.v1alpha1.GitS * Use `create(GitSubscriptionSchema)` to create a new message. */ export const GitSubscriptionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 25); + messageDesc(file_v1alpha1_generated, 27); /** * Health describes the health of a Stage. @@ -1280,7 +1331,7 @@ export type Health = Message<"github.com.akuity.kargo.api.v1alpha1.Health"> & { * Use `create(HealthSchema)` to create a new message. */ export const HealthSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 26); + messageDesc(file_v1alpha1_generated, 28); /** * HealthCheckStep describes a health check directive which can be executed by @@ -1311,7 +1362,7 @@ export type HealthCheckStep = Message<"github.com.akuity.kargo.api.v1alpha1.Heal * Use `create(HealthCheckStepSchema)` to create a new message. */ export const HealthCheckStepSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 27); + messageDesc(file_v1alpha1_generated, 29); /** * Image describes a specific version of a container image. @@ -1357,7 +1408,7 @@ export type Image = Message<"github.com.akuity.kargo.api.v1alpha1.Image"> & { * Use `create(ImageSchema)` to create a new message. */ export const ImageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 28); + messageDesc(file_v1alpha1_generated, 30); /** * ImageDiscoveryResult represents the result of an image discovery operation @@ -1403,7 +1454,7 @@ export type ImageDiscoveryResult = Message<"github.com.akuity.kargo.api.v1alpha1 * Use `create(ImageDiscoveryResultSchema)` to create a new message. */ export const ImageDiscoveryResultSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 29); + messageDesc(file_v1alpha1_generated, 31); /** * ImageSubscription defines a subscription to an image repository. @@ -1550,7 +1601,7 @@ export type ImageSubscription = Message<"github.com.akuity.kargo.api.v1alpha1.Im * Use `create(ImageSubscriptionSchema)` to create a new message. */ export const ImageSubscriptionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 30); + messageDesc(file_v1alpha1_generated, 32); /** * Project is a resource type that reconciles to a specially labeled namespace @@ -1584,7 +1635,7 @@ export type Project = Message<"github.com.akuity.kargo.api.v1alpha1.Project"> & * Use `create(ProjectSchema)` to create a new message. */ export const ProjectSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 31); + messageDesc(file_v1alpha1_generated, 33); /** * ProjectList is a list of Project resources. @@ -1608,7 +1659,7 @@ export type ProjectList = Message<"github.com.akuity.kargo.api.v1alpha1.ProjectL * Use `create(ProjectListSchema)` to create a new message. */ export const ProjectListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 32); + messageDesc(file_v1alpha1_generated, 34); /** * ProjectSpec describes a Project. @@ -1630,7 +1681,7 @@ export type ProjectSpec = Message<"github.com.akuity.kargo.api.v1alpha1.ProjectS * Use `create(ProjectSpecSchema)` to create a new message. */ export const ProjectSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 33); + messageDesc(file_v1alpha1_generated, 35); /** * ProjectStatus describes a Project's current status. @@ -1676,7 +1727,7 @@ export type ProjectStatus = Message<"github.com.akuity.kargo.api.v1alpha1.Projec * Use `create(ProjectStatusSchema)` to create a new message. */ export const ProjectStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 34); + messageDesc(file_v1alpha1_generated, 36); /** * Promotion represents a request to transition a particular Stage into a @@ -1714,7 +1765,7 @@ export type Promotion = Message<"github.com.akuity.kargo.api.v1alpha1.Promotion" * Use `create(PromotionSchema)` to create a new message. */ export const PromotionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 35); + messageDesc(file_v1alpha1_generated, 37); /** * PromotionList contains a list of Promotion @@ -1738,7 +1789,7 @@ export type PromotionList = Message<"github.com.akuity.kargo.api.v1alpha1.Promot * Use `create(PromotionListSchema)` to create a new message. */ export const PromotionListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 36); + messageDesc(file_v1alpha1_generated, 38); /** * PromotionPolicy defines policies governing the promotion of Freight to a @@ -1774,7 +1825,7 @@ export type PromotionPolicy = Message<"github.com.akuity.kargo.api.v1alpha1.Prom * Use `create(PromotionPolicySchema)` to create a new message. */ export const PromotionPolicySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 37); + messageDesc(file_v1alpha1_generated, 39); /** * PromotionReference contains the relevant information about a Promotion @@ -1817,7 +1868,7 @@ export type PromotionReference = Message<"github.com.akuity.kargo.api.v1alpha1.P * Use `create(PromotionReferenceSchema)` to create a new message. */ export const PromotionReferenceSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 38); + messageDesc(file_v1alpha1_generated, 40); /** * PromotionSpec describes the desired transition of a specific Stage into a @@ -1871,7 +1922,7 @@ export type PromotionSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Promot * Use `create(PromotionSpecSchema)` to create a new message. */ export const PromotionSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 39); + messageDesc(file_v1alpha1_generated, 41); /** * PromotionStatus describes the current state of the transition represented by @@ -1969,7 +2020,7 @@ export type PromotionStatus = Message<"github.com.akuity.kargo.api.v1alpha1.Prom * Use `create(PromotionStatusSchema)` to create a new message. */ export const PromotionStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 40); + messageDesc(file_v1alpha1_generated, 42); /** * PromotionStep describes a directive to be executed as part of a Promotion. @@ -2016,7 +2067,7 @@ export type PromotionStep = Message<"github.com.akuity.kargo.api.v1alpha1.Promot * Use `create(PromotionStepSchema)` to create a new message. */ export const PromotionStepSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 41); + messageDesc(file_v1alpha1_generated, 43); /** * PromotionStepRetry describes the retry policy for a PromotionStep. @@ -2075,7 +2126,7 @@ export type PromotionStepRetry = Message<"github.com.akuity.kargo.api.v1alpha1.P * Use `create(PromotionStepRetrySchema)` to create a new message. */ export const PromotionStepRetrySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 42); + messageDesc(file_v1alpha1_generated, 44); /** * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionTask @@ -2102,7 +2153,7 @@ export type PromotionTask = Message<"github.com.akuity.kargo.api.v1alpha1.Promot * Use `create(PromotionTaskSchema)` to create a new message. */ export const PromotionTaskSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 43); + messageDesc(file_v1alpha1_generated, 45); /** * PromotionTaskInput defines an input parameter for a PromotionTask. This input @@ -2142,7 +2193,7 @@ export type PromotionTaskInput = Message<"github.com.akuity.kargo.api.v1alpha1.P * Use `create(PromotionTaskInputSchema)` to create a new message. */ export const PromotionTaskInputSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 44); + messageDesc(file_v1alpha1_generated, 46); /** * PromotionTaskList contains a list of PromotionTasks. @@ -2166,7 +2217,7 @@ export type PromotionTaskList = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionTaskListSchema)` to create a new message. */ export const PromotionTaskListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 45); + messageDesc(file_v1alpha1_generated, 47); /** * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionTaskSpec @@ -2199,7 +2250,7 @@ export type PromotionTaskSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionTaskSpecSchema)` to create a new message. */ export const PromotionTaskSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 46); + messageDesc(file_v1alpha1_generated, 48); /** * PromotionTemplate defines a template for a Promotion that can be used to @@ -2219,7 +2270,7 @@ export type PromotionTemplate = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionTemplateSchema)` to create a new message. */ export const PromotionTemplateSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 47); + messageDesc(file_v1alpha1_generated, 49); /** * PromotionTemplateSpec describes the (partial) specification of a Promotion @@ -2254,7 +2305,7 @@ export type PromotionTemplateSpec = Message<"github.com.akuity.kargo.api.v1alpha * Use `create(PromotionTemplateSpecSchema)` to create a new message. */ export const PromotionTemplateSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 48); + messageDesc(file_v1alpha1_generated, 50); /** * PromotionVariable describes a single variable that may be referenced by @@ -2288,7 +2339,7 @@ export type PromotionVariable = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionVariableSchema)` to create a new message. */ export const PromotionVariableSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 49); + messageDesc(file_v1alpha1_generated, 51); /** * RepoSubscription describes a subscription to ONE OF a Git repository, a @@ -2324,7 +2375,7 @@ export type RepoSubscription = Message<"github.com.akuity.kargo.api.v1alpha1.Rep * Use `create(RepoSubscriptionSchema)` to create a new message. */ export const RepoSubscriptionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 50); + messageDesc(file_v1alpha1_generated, 52); /** * Stage is the Kargo API's main type. @@ -2360,7 +2411,7 @@ export type Stage = Message<"github.com.akuity.kargo.api.v1alpha1.Stage"> & { * Use `create(StageSchema)` to create a new message. */ export const StageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 51); + messageDesc(file_v1alpha1_generated, 53); /** * StageList is a list of Stage resources. @@ -2384,7 +2435,7 @@ export type StageList = Message<"github.com.akuity.kargo.api.v1alpha1.StageList" * Use `create(StageListSchema)` to create a new message. */ export const StageListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 52); + messageDesc(file_v1alpha1_generated, 54); /** * StageSpec describes the sources of Freight used by a Stage and how to @@ -2442,7 +2493,7 @@ export type StageSpec = Message<"github.com.akuity.kargo.api.v1alpha1.StageSpec" * Use `create(StageSpecSchema)` to create a new message. */ export const StageSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 53); + messageDesc(file_v1alpha1_generated, 55); /** * StageStatus describes a Stages's current and recent Freight, health, and @@ -2549,7 +2600,7 @@ export type StageStatus = Message<"github.com.akuity.kargo.api.v1alpha1.StageSta * Use `create(StageStatusSchema)` to create a new message. */ export const StageStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 54); + messageDesc(file_v1alpha1_generated, 56); /** * StepExecutionMetadata tracks metadata pertaining to the execution of @@ -2608,7 +2659,7 @@ export type StepExecutionMetadata = Message<"github.com.akuity.kargo.api.v1alpha * Use `create(StepExecutionMetadataSchema)` to create a new message. */ export const StepExecutionMetadataSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 55); + messageDesc(file_v1alpha1_generated, 57); /** * Verification describes how to verify that a Promotion has been successful @@ -2647,7 +2698,7 @@ export type Verification = Message<"github.com.akuity.kargo.api.v1alpha1.Verific * Use `create(VerificationSchema)` to create a new message. */ export const VerificationSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 56); + messageDesc(file_v1alpha1_generated, 58); /** * VerificationInfo contains the details of an instance of a Verification @@ -2717,7 +2768,7 @@ export type VerificationInfo = Message<"github.com.akuity.kargo.api.v1alpha1.Ver * Use `create(VerificationInfoSchema)` to create a new message. */ export const VerificationInfoSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 57); + messageDesc(file_v1alpha1_generated, 59); /** * VerifiedStage describes a Stage in which Freight has been verified. @@ -2749,7 +2800,7 @@ export type VerifiedStage = Message<"github.com.akuity.kargo.api.v1alpha1.Verifi * Use `create(VerifiedStageSchema)` to create a new message. */ export const VerifiedStageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 58); + messageDesc(file_v1alpha1_generated, 60); /** * Warehouse is a source of Freight. @@ -2784,7 +2835,7 @@ export type Warehouse = Message<"github.com.akuity.kargo.api.v1alpha1.Warehouse" * Use `create(WarehouseSchema)` to create a new message. */ export const WarehouseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 59); + messageDesc(file_v1alpha1_generated, 61); /** * WarehouseList is a list of Warehouse resources. @@ -2808,7 +2859,7 @@ export type WarehouseList = Message<"github.com.akuity.kargo.api.v1alpha1.Wareho * Use `create(WarehouseListSchema)` to create a new message. */ export const WarehouseListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 60); + messageDesc(file_v1alpha1_generated, 62); /** * WarehouseSpec describes sources of versioned artifacts to be included in @@ -2874,7 +2925,7 @@ export type WarehouseSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Wareho * Use `create(WarehouseSpecSchema)` to create a new message. */ export const WarehouseSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 61); + messageDesc(file_v1alpha1_generated, 63); /** * WarehouseStatus describes a Warehouse's most recently observed state. @@ -2933,5 +2984,5 @@ export type WarehouseStatus = Message<"github.com.akuity.kargo.api.v1alpha1.Ware * Use `create(WarehouseStatusSchema)` to create a new message. */ export const WarehouseStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 62); + messageDesc(file_v1alpha1_generated, 64); From bd6ffabee7b3a00d3cb0e52ea4834a45324cde66 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Wed, 11 Dec 2024 00:27:46 +0100 Subject: [PATCH 05/38] feat(api): add `Task` field to `PromotionStep` Signed-off-by: Hidde Beydals --- api/v1alpha1/promotion_types.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/api/v1alpha1/promotion_types.go b/api/v1alpha1/promotion_types.go index da18f2dbe..c45c98b19 100644 --- a/api/v1alpha1/promotion_types.go +++ b/api/v1alpha1/promotion_types.go @@ -111,6 +111,24 @@ type PromotionVariable struct { Value string `json:"value" protobuf:"bytes,2,opt,name=value"` } +// PromotionTaskReference describes a reference to a PromotionTask. +type PromotionTaskReference struct { + // Name is the name of the (Cluster)PromotionTask. + // + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=253 + // +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + Name string `json:"name" protobuf:"bytes,1,opt,name=name"` + + // Kind is the type of the PromotionTask. Can be either PromotionTask or + // ClusterPromotionTask, default is PromotionTask. + // + // +kubebuilder:validation:Optional + // +kubebuilder:validation:Enum=PromotionTask;ClusterPromotionTask + Kind string `json:"kind,omitempty" protobuf:"bytes,2,opt,name=kind"` +} + // PromotionStepRetry describes the retry policy for a PromotionStep. type PromotionStepRetry struct { // Timeout is the soft maximum interval in which a step that returns a Running @@ -171,8 +189,14 @@ func (r *PromotionStepRetry) GetErrorThreshold(fallback uint32) uint32 { type PromotionStep struct { // Uses identifies a runner that can execute this step. // + // +kubebuilder:validation:Optional // +kubebuilder:validation:MinLength=1 Uses string `json:"uses" protobuf:"bytes,1,opt,name=uses"` + // Task is a reference to a PromotionTask that should be deflated into a + // Promotion when it is built from a PromotionTemplate. + // + // +kubebuilder:validation:Optional + Task *PromotionTaskReference `json:"task,omitempty" protobuf:"bytes,5,opt,name=task"` // As is the alias this step can be referred to as. As string `json:"as,omitempty" protobuf:"bytes,2,opt,name=as"` // Retry is the retry policy for this step. From 18cf89f5702c41d4c918a9778df1de76dea9fbc2 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Wed, 11 Dec 2024 00:32:50 +0100 Subject: [PATCH 06/38] chore: run codegen Signed-off-by: Hidde Beydals --- api/v1alpha1/generated.pb.go | 798 ++++++++++++------ api/v1alpha1/generated.proto | 25 + api/v1alpha1/zz_generated.deepcopy.go | 20 + ...kargo.akuity.io_clusterpromotiontasks.yaml | 24 +- .../crds/kargo.akuity.io_promotions.yaml | 24 +- .../crds/kargo.akuity.io_promotiontasks.yaml | 24 +- .../crds/kargo.akuity.io_stages.yaml | 24 +- ...omotiontasks.kargo.akuity.io_v1alpha1.json | 27 +- .../promotions.kargo.akuity.io_v1alpha1.json | 27 +- ...omotiontasks.kargo.akuity.io_v1alpha1.json | 27 +- .../stages.kargo.akuity.io_v1alpha1.json | 27 +- ui/src/gen/v1alpha1/generated_pb.ts | 84 +- 12 files changed, 822 insertions(+), 309 deletions(-) diff --git a/api/v1alpha1/generated.pb.go b/api/v1alpha1/generated.pb.go index ecc58a584..1a0bf57a0 100644 --- a/api/v1alpha1/generated.pb.go +++ b/api/v1alpha1/generated.pb.go @@ -1374,10 +1374,38 @@ func (m *PromotionTaskList) XXX_DiscardUnknown() { var xxx_messageInfo_PromotionTaskList proto.InternalMessageInfo +func (m *PromotionTaskReference) Reset() { *m = PromotionTaskReference{} } +func (*PromotionTaskReference) ProtoMessage() {} +func (*PromotionTaskReference) Descriptor() ([]byte, []int) { + return fileDescriptor_e26b7f7bbc391025, []int{48} +} +func (m *PromotionTaskReference) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PromotionTaskReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PromotionTaskReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_PromotionTaskReference.Merge(m, src) +} +func (m *PromotionTaskReference) XXX_Size() int { + return m.Size() +} +func (m *PromotionTaskReference) XXX_DiscardUnknown() { + xxx_messageInfo_PromotionTaskReference.DiscardUnknown(m) +} + +var xxx_messageInfo_PromotionTaskReference proto.InternalMessageInfo + func (m *PromotionTaskSpec) Reset() { *m = PromotionTaskSpec{} } func (*PromotionTaskSpec) ProtoMessage() {} func (*PromotionTaskSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{48} + return fileDescriptor_e26b7f7bbc391025, []int{49} } func (m *PromotionTaskSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1405,7 +1433,7 @@ var xxx_messageInfo_PromotionTaskSpec proto.InternalMessageInfo func (m *PromotionTemplate) Reset() { *m = PromotionTemplate{} } func (*PromotionTemplate) ProtoMessage() {} func (*PromotionTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{49} + return fileDescriptor_e26b7f7bbc391025, []int{50} } func (m *PromotionTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1433,7 +1461,7 @@ var xxx_messageInfo_PromotionTemplate proto.InternalMessageInfo func (m *PromotionTemplateSpec) Reset() { *m = PromotionTemplateSpec{} } func (*PromotionTemplateSpec) ProtoMessage() {} func (*PromotionTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{50} + return fileDescriptor_e26b7f7bbc391025, []int{51} } func (m *PromotionTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1461,7 +1489,7 @@ var xxx_messageInfo_PromotionTemplateSpec proto.InternalMessageInfo func (m *PromotionVariable) Reset() { *m = PromotionVariable{} } func (*PromotionVariable) ProtoMessage() {} func (*PromotionVariable) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{51} + return fileDescriptor_e26b7f7bbc391025, []int{52} } func (m *PromotionVariable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1489,7 +1517,7 @@ var xxx_messageInfo_PromotionVariable proto.InternalMessageInfo func (m *RepoSubscription) Reset() { *m = RepoSubscription{} } func (*RepoSubscription) ProtoMessage() {} func (*RepoSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{52} + return fileDescriptor_e26b7f7bbc391025, []int{53} } func (m *RepoSubscription) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1517,7 +1545,7 @@ var xxx_messageInfo_RepoSubscription proto.InternalMessageInfo func (m *Stage) Reset() { *m = Stage{} } func (*Stage) ProtoMessage() {} func (*Stage) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{53} + return fileDescriptor_e26b7f7bbc391025, []int{54} } func (m *Stage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1545,7 +1573,7 @@ var xxx_messageInfo_Stage proto.InternalMessageInfo func (m *StageList) Reset() { *m = StageList{} } func (*StageList) ProtoMessage() {} func (*StageList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{54} + return fileDescriptor_e26b7f7bbc391025, []int{55} } func (m *StageList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1573,7 +1601,7 @@ var xxx_messageInfo_StageList proto.InternalMessageInfo func (m *StageSpec) Reset() { *m = StageSpec{} } func (*StageSpec) ProtoMessage() {} func (*StageSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{55} + return fileDescriptor_e26b7f7bbc391025, []int{56} } func (m *StageSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1601,7 +1629,7 @@ var xxx_messageInfo_StageSpec proto.InternalMessageInfo func (m *StageStatus) Reset() { *m = StageStatus{} } func (*StageStatus) ProtoMessage() {} func (*StageStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{56} + return fileDescriptor_e26b7f7bbc391025, []int{57} } func (m *StageStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1629,7 +1657,7 @@ var xxx_messageInfo_StageStatus proto.InternalMessageInfo func (m *StepExecutionMetadata) Reset() { *m = StepExecutionMetadata{} } func (*StepExecutionMetadata) ProtoMessage() {} func (*StepExecutionMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{57} + return fileDescriptor_e26b7f7bbc391025, []int{58} } func (m *StepExecutionMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1657,7 +1685,7 @@ var xxx_messageInfo_StepExecutionMetadata proto.InternalMessageInfo func (m *Verification) Reset() { *m = Verification{} } func (*Verification) ProtoMessage() {} func (*Verification) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{58} + return fileDescriptor_e26b7f7bbc391025, []int{59} } func (m *Verification) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1685,7 +1713,7 @@ var xxx_messageInfo_Verification proto.InternalMessageInfo func (m *VerificationInfo) Reset() { *m = VerificationInfo{} } func (*VerificationInfo) ProtoMessage() {} func (*VerificationInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{59} + return fileDescriptor_e26b7f7bbc391025, []int{60} } func (m *VerificationInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1713,7 +1741,7 @@ var xxx_messageInfo_VerificationInfo proto.InternalMessageInfo func (m *VerifiedStage) Reset() { *m = VerifiedStage{} } func (*VerifiedStage) ProtoMessage() {} func (*VerifiedStage) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{60} + return fileDescriptor_e26b7f7bbc391025, []int{61} } func (m *VerifiedStage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1741,7 +1769,7 @@ var xxx_messageInfo_VerifiedStage proto.InternalMessageInfo func (m *Warehouse) Reset() { *m = Warehouse{} } func (*Warehouse) ProtoMessage() {} func (*Warehouse) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{61} + return fileDescriptor_e26b7f7bbc391025, []int{62} } func (m *Warehouse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1769,7 +1797,7 @@ var xxx_messageInfo_Warehouse proto.InternalMessageInfo func (m *WarehouseList) Reset() { *m = WarehouseList{} } func (*WarehouseList) ProtoMessage() {} func (*WarehouseList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{62} + return fileDescriptor_e26b7f7bbc391025, []int{63} } func (m *WarehouseList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1797,7 +1825,7 @@ var xxx_messageInfo_WarehouseList proto.InternalMessageInfo func (m *WarehouseSpec) Reset() { *m = WarehouseSpec{} } func (*WarehouseSpec) ProtoMessage() {} func (*WarehouseSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{63} + return fileDescriptor_e26b7f7bbc391025, []int{64} } func (m *WarehouseSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1825,7 +1853,7 @@ var xxx_messageInfo_WarehouseSpec proto.InternalMessageInfo func (m *WarehouseStatus) Reset() { *m = WarehouseStatus{} } func (*WarehouseStatus) ProtoMessage() {} func (*WarehouseStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{64} + return fileDescriptor_e26b7f7bbc391025, []int{65} } func (m *WarehouseStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1905,6 +1933,7 @@ func init() { proto.RegisterType((*PromotionTask)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTask") proto.RegisterType((*PromotionTaskInput)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTaskInput") proto.RegisterType((*PromotionTaskList)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTaskList") + proto.RegisterType((*PromotionTaskReference)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTaskReference") proto.RegisterType((*PromotionTaskSpec)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTaskSpec") proto.RegisterType((*PromotionTemplate)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTemplate") proto.RegisterType((*PromotionTemplateSpec)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTemplateSpec") @@ -1929,262 +1958,265 @@ func init() { } var fileDescriptor_e26b7f7bbc391025 = []byte{ - // 4071 bytes of a gzipped FileDescriptorProto + // 4113 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0xdd, 0x6f, 0x5b, 0x47, 0x76, 0xf7, 0x25, 0x45, 0x4a, 0x3c, 0x94, 0x6c, 0x69, 0x2c, 0x27, 0x5a, 0x6d, 0x63, 0xb9, 0x37, - 0x41, 0x90, 0x34, 0x09, 0x55, 0x3b, 0x71, 0xe2, 0x38, 0xad, 0x0b, 0x91, 0xf2, 0x87, 0xbc, 0xda, - 0x58, 0x1d, 0x3a, 0xce, 0xc6, 0x49, 0x90, 0x1d, 0x91, 0x23, 0xf2, 0xae, 0xc8, 0x7b, 0x99, 0x3b, - 0x43, 0x6d, 0xd4, 0x16, 0xed, 0xf6, 0x0b, 0x58, 0xf4, 0x0b, 0xfb, 0x10, 0x20, 0x5b, 0xa0, 0x05, - 0x8a, 0xf6, 0x71, 0xd1, 0xfe, 0x03, 0x7d, 0xc8, 0x43, 0x5f, 0x82, 0x22, 0x68, 0x83, 0xb6, 0x40, - 0xf3, 0xb0, 0x55, 0x1b, 0x2d, 0xd0, 0xc7, 0xbe, 0xf5, 0xc5, 0x40, 0x81, 0x62, 0x3e, 0xee, 0xbd, - 0x73, 0x3f, 0x68, 0xf1, 0xd2, 0x92, 0x91, 0xf6, 0x8d, 0x9a, 0x33, 0xe7, 0x77, 0x66, 0xce, 0xcc, - 0x9c, 0x39, 0xe7, 0xcc, 0xb9, 0x82, 0x57, 0x3a, 0x0e, 0xef, 0x0e, 0xb7, 0x6b, 0x2d, 0xaf, 0xbf, - 0x4a, 0x76, 0x87, 0x0e, 0xdf, 0x5f, 0xdd, 0x25, 0x7e, 0xc7, 0x5b, 0x25, 0x03, 0x67, 0x75, 0xef, - 0x22, 0xe9, 0x0d, 0xba, 0xe4, 0xe2, 0x6a, 0x87, 0xba, 0xd4, 0x27, 0x9c, 0xb6, 0x6b, 0x03, 0xdf, - 0xe3, 0x1e, 0x7a, 0x26, 0xe2, 0xaa, 0x29, 0xae, 0x9a, 0xe4, 0xaa, 0x91, 0x81, 0x53, 0x0b, 0xb8, - 0x96, 0x5f, 0x32, 0xb0, 0x3b, 0x5e, 0xc7, 0x5b, 0x95, 0xcc, 0xdb, 0xc3, 0x1d, 0xf9, 0x97, 0xfc, - 0x43, 0xfe, 0x52, 0xa0, 0xcb, 0xb7, 0x76, 0xaf, 0xb0, 0x9a, 0x23, 0x25, 0xd3, 0x8f, 0x38, 0x75, - 0x99, 0xe3, 0xb9, 0xec, 0x25, 0x32, 0x70, 0x18, 0xf5, 0xf7, 0xa8, 0xbf, 0x3a, 0xd8, 0xed, 0x08, - 0x1a, 0x8b, 0x77, 0x58, 0xdd, 0x4b, 0x0d, 0x6f, 0xf9, 0x95, 0x08, 0xa9, 0x4f, 0x5a, 0x5d, 0xc7, - 0xa5, 0xfe, 0x7e, 0xc4, 0xde, 0xa7, 0x9c, 0x64, 0x71, 0xad, 0x8e, 0xe2, 0xf2, 0x87, 0x2e, 0x77, - 0xfa, 0x34, 0xc5, 0xf0, 0xea, 0x51, 0x0c, 0xac, 0xd5, 0xa5, 0x7d, 0x92, 0xe4, 0xb3, 0xdf, 0x83, - 0xb3, 0x6b, 0x2e, 0xe9, 0xed, 0x33, 0x87, 0xe1, 0xa1, 0xbb, 0xe6, 0x77, 0x86, 0x7d, 0xea, 0x72, - 0x74, 0x01, 0xa6, 0x5c, 0xd2, 0xa7, 0x4b, 0xd6, 0x05, 0xeb, 0xb9, 0x4a, 0x7d, 0xf6, 0xb3, 0x83, - 0x95, 0x53, 0x87, 0x07, 0x2b, 0x53, 0x6f, 0x92, 0x3e, 0xc5, 0x92, 0x82, 0x9e, 0x86, 0xd2, 0x1e, - 0xe9, 0x0d, 0xe9, 0x52, 0x41, 0x76, 0x99, 0xd3, 0x5d, 0x4a, 0xf7, 0x44, 0x23, 0x56, 0x34, 0xfb, - 0x77, 0x8b, 0x31, 0xf8, 0x6f, 0x53, 0x4e, 0xda, 0x84, 0x13, 0xd4, 0x87, 0x72, 0x8f, 0x6c, 0xd3, - 0x1e, 0x5b, 0xb2, 0x2e, 0x14, 0x9f, 0xab, 0x5e, 0xba, 0x5e, 0x1b, 0x67, 0x11, 0x6b, 0x19, 0x50, - 0xb5, 0x4d, 0x89, 0x73, 0xdd, 0xe5, 0xfe, 0x7e, 0xfd, 0xb4, 0x1e, 0x44, 0x59, 0x35, 0x62, 0x2d, - 0x04, 0xfd, 0xb6, 0x05, 0x55, 0xe2, 0xba, 0x1e, 0x27, 0x5c, 0x2c, 0xd3, 0x52, 0x41, 0x0a, 0xbd, - 0x3d, 0xb9, 0xd0, 0xb5, 0x08, 0x4c, 0x49, 0x3e, 0xab, 0x25, 0x57, 0x0d, 0x0a, 0x36, 0x65, 0x2e, - 0xbf, 0x0e, 0x55, 0x63, 0xa8, 0x68, 0x1e, 0x8a, 0xbb, 0x74, 0x5f, 0xe9, 0x17, 0x8b, 0x9f, 0x68, - 0x31, 0xa6, 0x50, 0xad, 0xc1, 0xab, 0x85, 0x2b, 0xd6, 0xf2, 0x35, 0x98, 0x4f, 0x0a, 0xcc, 0xc3, - 0x6f, 0xff, 0x89, 0x05, 0x8b, 0xc6, 0x2c, 0x30, 0xdd, 0xa1, 0x3e, 0x75, 0x5b, 0x14, 0xad, 0x42, - 0x45, 0xac, 0x25, 0x1b, 0x90, 0x56, 0xb0, 0xd4, 0x0b, 0x7a, 0x22, 0x95, 0x37, 0x03, 0x02, 0x8e, - 0xfa, 0x84, 0xdb, 0xa2, 0xf0, 0xb0, 0x6d, 0x31, 0xe8, 0x12, 0x46, 0x97, 0x8a, 0xf1, 0x6d, 0xb1, - 0x25, 0x1a, 0xb1, 0xa2, 0xd9, 0xbf, 0x0c, 0xdf, 0x08, 0xc6, 0x73, 0x97, 0xf6, 0x07, 0x3d, 0xc2, - 0x69, 0x34, 0xa8, 0x23, 0xb7, 0x9e, 0xbd, 0x0b, 0x73, 0x6b, 0x83, 0x81, 0xef, 0xed, 0xd1, 0x76, - 0x93, 0x93, 0x0e, 0x45, 0xf7, 0x01, 0x88, 0x6e, 0x58, 0xe3, 0x92, 0xb1, 0x7a, 0xe9, 0x17, 0x6a, - 0xea, 0x44, 0xd4, 0xcc, 0x13, 0x51, 0x1b, 0xec, 0x76, 0x44, 0x03, 0xab, 0x89, 0x83, 0x57, 0xdb, - 0xbb, 0x58, 0xbb, 0xeb, 0xf4, 0x69, 0xfd, 0xf4, 0xe1, 0xc1, 0x0a, 0xac, 0x85, 0x08, 0xd8, 0x40, - 0xb3, 0x7f, 0xc7, 0x82, 0x73, 0x6b, 0x7e, 0xc7, 0x6b, 0xac, 0xaf, 0x0d, 0x06, 0xb7, 0x28, 0xe9, - 0xf1, 0x6e, 0x93, 0x13, 0x3e, 0x64, 0xe8, 0x1a, 0x94, 0x99, 0xfc, 0xa5, 0x87, 0xfa, 0x6c, 0xb0, - 0xfb, 0x14, 0xfd, 0xc1, 0xc1, 0xca, 0x62, 0x06, 0x23, 0xc5, 0x9a, 0x0b, 0x3d, 0x0f, 0xd3, 0x7d, - 0xca, 0x18, 0xe9, 0x04, 0xfa, 0x3c, 0xa3, 0x01, 0xa6, 0xbf, 0xad, 0x9a, 0x71, 0x40, 0xb7, 0xff, - 0xbe, 0x00, 0x67, 0x42, 0x2c, 0x2d, 0xfe, 0x04, 0x16, 0x6f, 0x08, 0xb3, 0x5d, 0x63, 0x86, 0x72, - 0x0d, 0xab, 0x97, 0xde, 0x18, 0xf3, 0x9c, 0x64, 0x29, 0xa9, 0xbe, 0xa8, 0xc5, 0xcc, 0x9a, 0xad, - 0x38, 0x26, 0x06, 0xf5, 0x01, 0xd8, 0xbe, 0xdb, 0xd2, 0x42, 0xa7, 0xa4, 0xd0, 0xd7, 0x73, 0x0a, - 0x6d, 0x86, 0x00, 0x75, 0xa4, 0x45, 0x42, 0xd4, 0x86, 0x0d, 0x01, 0xf6, 0xdf, 0x58, 0x70, 0x36, - 0x83, 0x0f, 0xfd, 0x52, 0x62, 0x3d, 0x9f, 0x49, 0xad, 0x27, 0x4a, 0xb1, 0x45, 0xab, 0xf9, 0x22, - 0xcc, 0xf8, 0x74, 0xcf, 0x11, 0xf7, 0x80, 0xd6, 0xf0, 0xbc, 0xe6, 0x9f, 0xc1, 0xba, 0x1d, 0x87, - 0x3d, 0xd0, 0x0b, 0x50, 0x09, 0x7e, 0x0b, 0x35, 0x17, 0xc5, 0x51, 0x11, 0x0b, 0x17, 0x74, 0x65, - 0x38, 0xa2, 0xdb, 0xbf, 0x05, 0xa5, 0x46, 0x97, 0xf8, 0x5c, 0xec, 0x18, 0x9f, 0x0e, 0xbc, 0xb7, - 0xf0, 0xa6, 0x1e, 0x62, 0xb8, 0x63, 0xb0, 0x6a, 0xc6, 0x01, 0x7d, 0x8c, 0xc5, 0x7e, 0x1e, 0xa6, - 0xf7, 0xa8, 0x2f, 0xc7, 0x5b, 0x8c, 0x83, 0xdd, 0x53, 0xcd, 0x38, 0xa0, 0xdb, 0xff, 0x6c, 0xc1, - 0xa2, 0x1c, 0xc1, 0xba, 0xc3, 0x5a, 0xde, 0x1e, 0xf5, 0xf7, 0x31, 0x65, 0xc3, 0xde, 0x31, 0x0f, - 0x68, 0x1d, 0xe6, 0x19, 0xed, 0xef, 0x51, 0xbf, 0xe1, 0xb9, 0x8c, 0xfb, 0xc4, 0x71, 0xb9, 0x1e, - 0xd9, 0x92, 0xee, 0x3d, 0xdf, 0x4c, 0xd0, 0x71, 0x8a, 0x03, 0x3d, 0x07, 0x33, 0x7a, 0xd8, 0x62, - 0x2b, 0x09, 0xc5, 0xce, 0x8a, 0x35, 0xd0, 0x73, 0x62, 0x38, 0xa4, 0xda, 0xff, 0x69, 0xc1, 0x82, - 0x9c, 0x55, 0x73, 0xb8, 0xcd, 0x5a, 0xbe, 0x33, 0x10, 0xe6, 0xf5, 0xeb, 0x38, 0xa5, 0x6b, 0x70, - 0xba, 0x1d, 0x28, 0x7e, 0xd3, 0xe9, 0x3b, 0x5c, 0x9e, 0x91, 0x52, 0xfd, 0x09, 0x8d, 0x71, 0x7a, - 0x3d, 0x46, 0xc5, 0x89, 0xde, 0x6a, 0xf9, 0x7a, 0x43, 0xc6, 0xa9, 0xbf, 0xe5, 0x7b, 0x7d, 0x4f, - 0xcc, 0xf3, 0x2e, 0x61, 0xbb, 0xe8, 0xbb, 0x30, 0xd3, 0xd7, 0x57, 0x9a, 0xb6, 0x9a, 0xbf, 0x38, - 0x9e, 0xd5, 0xbc, 0xb3, 0xfd, 0x3d, 0xda, 0xe2, 0xe2, 0x3a, 0x8c, 0x4e, 0x5b, 0xd4, 0x86, 0x43, - 0x54, 0xf4, 0x0e, 0x4c, 0xb1, 0x01, 0x6d, 0x49, 0x15, 0x55, 0x2f, 0xbd, 0x36, 0xde, 0xa1, 0x8e, - 0x0d, 0xb2, 0x39, 0xa0, 0xad, 0x48, 0xb7, 0xe2, 0x2f, 0x2c, 0x21, 0xed, 0x7f, 0xb3, 0x60, 0x29, - 0x6b, 0x56, 0x9b, 0x0e, 0xe3, 0xe8, 0xbd, 0xd4, 0xcc, 0x6a, 0xe3, 0xcd, 0x4c, 0x70, 0xcb, 0x79, - 0x85, 0xa7, 0x37, 0x68, 0x31, 0x66, 0xd5, 0x82, 0x92, 0xc3, 0x69, 0x3f, 0x70, 0x24, 0xae, 0x8d, - 0x37, 0xad, 0x51, 0x83, 0x8d, 0x2e, 0xc9, 0x0d, 0x01, 0x8a, 0x15, 0xb6, 0xfd, 0x2e, 0xcc, 0x36, - 0x86, 0xbe, 0x4f, 0x5d, 0xae, 0x2e, 0xb9, 0x6f, 0x41, 0x89, 0x39, 0xae, 0xb6, 0xf5, 0xf9, 0xee, - 0xb7, 0x8a, 0x00, 0x6f, 0x0a, 0x66, 0xac, 0x30, 0xec, 0x3f, 0x2b, 0xc2, 0xd9, 0x60, 0xd7, 0xd0, - 0xf6, 0x9a, 0xcf, 0x9d, 0x1d, 0xd2, 0xe2, 0x0c, 0xb5, 0x61, 0xb6, 0x1d, 0x35, 0x73, 0x6d, 0x8c, - 0xf3, 0xc8, 0x0a, 0x0d, 0xbe, 0x01, 0xcf, 0x71, 0x0c, 0x15, 0xbd, 0x0d, 0xc5, 0x8e, 0xc3, 0xb5, - 0xef, 0x77, 0x65, 0x3c, 0xed, 0xdd, 0x74, 0x92, 0xd6, 0xa7, 0x5e, 0xd5, 0xa2, 0x8a, 0x37, 0x1d, - 0x8e, 0x05, 0x22, 0xda, 0x86, 0xb2, 0xd3, 0x27, 0x1d, 0x1a, 0xac, 0xcc, 0xd5, 0xf1, 0xb0, 0x37, - 0x04, 0x4f, 0x12, 0x3d, 0x74, 0x26, 0x25, 0x95, 0x61, 0x8d, 0x2c, 0x64, 0xb4, 0x84, 0xd5, 0x50, - 0x76, 0x7b, 0x6c, 0x19, 0x59, 0xf6, 0x33, 0x92, 0x21, 0xa9, 0x0c, 0x6b, 0x64, 0xfb, 0xcb, 0x02, - 0xcc, 0x47, 0xfa, 0x6b, 0x78, 0xfd, 0xbe, 0xc3, 0xd1, 0x32, 0x14, 0x9c, 0xb6, 0x36, 0x4a, 0xa0, - 0x19, 0x0b, 0x1b, 0xeb, 0xb8, 0xe0, 0xb4, 0xd1, 0xb3, 0x50, 0xde, 0xf6, 0x89, 0xdb, 0xea, 0x6a, - 0x63, 0x14, 0x02, 0xd7, 0x65, 0x2b, 0xd6, 0x54, 0xf4, 0x14, 0x14, 0x39, 0xe9, 0x68, 0x1b, 0x14, - 0xea, 0xef, 0x2e, 0xe9, 0x60, 0xd1, 0x2e, 0x8c, 0x1f, 0x1b, 0xca, 0x73, 0x2c, 0x57, 0xde, 0x30, - 0x7e, 0x4d, 0xd5, 0x8c, 0x03, 0xba, 0x90, 0x48, 0x86, 0xbc, 0xeb, 0xf9, 0x4b, 0xa5, 0xb8, 0xc4, - 0x35, 0xd9, 0x8a, 0x35, 0x55, 0xb8, 0x29, 0x2d, 0x39, 0x7e, 0x4e, 0xfd, 0xa5, 0x72, 0xdc, 0x4d, - 0x69, 0x04, 0x04, 0x1c, 0xf5, 0x41, 0xef, 0x43, 0xb5, 0xe5, 0x53, 0xc2, 0x3d, 0x7f, 0x9d, 0x70, - 0xba, 0x34, 0x9d, 0x7b, 0x07, 0x9e, 0x11, 0x7e, 0x78, 0x23, 0x82, 0xc0, 0x26, 0x9e, 0xfd, 0x5f, - 0x16, 0x2c, 0x45, 0xaa, 0x95, 0x6b, 0x1b, 0xf9, 0x9e, 0x5a, 0x3d, 0xd6, 0x08, 0xf5, 0x3c, 0x0b, - 0xe5, 0xb6, 0xd3, 0xa1, 0x8c, 0x27, 0xb5, 0xbc, 0x2e, 0x5b, 0xb1, 0xa6, 0xa2, 0x4b, 0x00, 0x1d, - 0x87, 0xeb, 0xfb, 0x42, 0x2b, 0x3b, 0xb4, 0x93, 0x37, 0x43, 0x0a, 0x36, 0x7a, 0xa1, 0xb7, 0xa1, - 0x22, 0x87, 0x39, 0xe1, 0xb1, 0x93, 0xde, 0x43, 0x23, 0x00, 0xc0, 0x11, 0x96, 0xfd, 0xc5, 0x14, - 0x4c, 0xdf, 0xf0, 0xa9, 0xd3, 0xe9, 0xf2, 0xc7, 0x60, 0xf0, 0x9f, 0x86, 0x12, 0xe9, 0x39, 0x84, - 0xc9, 0x75, 0x33, 0xfc, 0xff, 0x35, 0xd1, 0x88, 0x15, 0x0d, 0xbd, 0x0b, 0x65, 0xcf, 0x77, 0x3a, - 0x8e, 0xbb, 0x54, 0x91, 0x83, 0x78, 0x79, 0xbc, 0x23, 0xa4, 0x67, 0x71, 0x47, 0xb2, 0x46, 0xca, - 0x57, 0x7f, 0x63, 0x0d, 0x89, 0xee, 0xc3, 0xb4, 0xda, 0x4c, 0xc1, 0x01, 0x5d, 0x1d, 0xdb, 0xc0, - 0xa8, 0xfd, 0x18, 0x6d, 0x7a, 0xf5, 0x37, 0xc3, 0x01, 0x20, 0x6a, 0x86, 0xf6, 0x65, 0x4a, 0x42, - 0xbf, 0x90, 0xc3, 0xbe, 0x8c, 0x34, 0x28, 0xcd, 0xd0, 0xa0, 0x94, 0xf2, 0x80, 0x4a, 0x93, 0x31, - 0xca, 0x82, 0x08, 0x15, 0x6b, 0x67, 0xb6, 0x3c, 0x81, 0x8a, 0xb5, 0x27, 0x7d, 0x3a, 0xee, 0x01, - 0x07, 0xbe, 0xae, 0xfd, 0x71, 0x11, 0x16, 0x74, 0xcf, 0x86, 0xd7, 0xeb, 0xd1, 0x96, 0xf4, 0x9c, - 0x94, 0x7d, 0x2a, 0x66, 0xda, 0x27, 0x27, 0xb8, 0x31, 0x95, 0xcd, 0xaf, 0xe7, 0x1a, 0x4d, 0x24, - 0xa3, 0x26, 0x6f, 0x48, 0x15, 0x72, 0x87, 0xab, 0xa4, 0x7b, 0xe9, 0x7b, 0x13, 0xfd, 0xbe, 0x05, - 0x67, 0xf7, 0xa8, 0xef, 0xec, 0x38, 0x2d, 0x19, 0x30, 0xdf, 0x72, 0x18, 0xf7, 0xfc, 0x7d, 0x7d, - 0x23, 0xbc, 0x3a, 0x9e, 0xe4, 0x7b, 0x06, 0xc0, 0x86, 0xbb, 0xe3, 0xd5, 0xbf, 0xa9, 0xa5, 0x9d, - 0xbd, 0x97, 0x86, 0xc6, 0x59, 0xf2, 0x96, 0x07, 0x00, 0xd1, 0x68, 0x33, 0xe2, 0xf5, 0x4d, 0x33, - 0x5e, 0x1f, 0x7b, 0x60, 0xc1, 0x64, 0x03, 0x93, 0x65, 0xc6, 0xf9, 0x9f, 0x5a, 0x50, 0xd5, 0xf4, - 0xc7, 0xe0, 0x04, 0xe1, 0xb8, 0x13, 0xf4, 0x52, 0xae, 0xf1, 0x8f, 0xf0, 0x79, 0x7c, 0x98, 0x8b, - 0x1d, 0x72, 0x74, 0x19, 0xa6, 0x76, 0x1d, 0x37, 0xb8, 0xf5, 0x7e, 0x3e, 0x70, 0x03, 0xbf, 0xe5, - 0xb8, 0xed, 0x07, 0x07, 0x2b, 0x0b, 0xb1, 0xce, 0xa2, 0x11, 0xcb, 0xee, 0x47, 0x7b, 0xe6, 0x57, - 0x67, 0x7e, 0xfc, 0x17, 0x2b, 0xa7, 0x7e, 0xf0, 0xd3, 0x0b, 0xa7, 0xec, 0x4f, 0x8a, 0x30, 0x9f, - 0xd4, 0xea, 0x18, 0xf9, 0xaf, 0xc8, 0x86, 0xcd, 0x9c, 0xa8, 0x0d, 0x2b, 0x9c, 0x9c, 0x0d, 0x2b, - 0x9e, 0x84, 0x0d, 0x9b, 0x3a, 0x36, 0x1b, 0x66, 0xff, 0x83, 0x05, 0xa7, 0xc3, 0x95, 0xf9, 0x70, - 0x28, 0x6e, 0xd6, 0x48, 0xeb, 0xd6, 0xf1, 0x6b, 0xfd, 0x03, 0x98, 0x66, 0xde, 0xd0, 0x6f, 0x49, - 0xf7, 0x51, 0xa0, 0xbf, 0x92, 0xcf, 0x68, 0x2a, 0x5e, 0xc3, 0x67, 0x52, 0x0d, 0x38, 0x40, 0x35, - 0x27, 0xa4, 0x69, 0xca, 0xa5, 0xf0, 0x85, 0xc3, 0x25, 0x26, 0x34, 0x63, 0xba, 0x14, 0xa2, 0x15, - 0x6b, 0x2a, 0xb2, 0xa5, 0x3d, 0x0f, 0x3c, 0xdb, 0x4a, 0x1d, 0xb4, 0x59, 0x96, 0x8b, 0xa0, 0x28, - 0x68, 0x00, 0xf3, 0x3e, 0xfd, 0x70, 0xe8, 0xf8, 0xb4, 0xdd, 0xf4, 0xc8, 0xae, 0xf0, 0x0b, 0x74, - 0x0a, 0x67, 0xcc, 0x73, 0xbf, 0x3e, 0xf4, 0xa5, 0x09, 0xab, 0x2f, 0x8a, 0xc8, 0x14, 0x27, 0xb0, - 0x70, 0x0a, 0xdd, 0xfe, 0xf7, 0x52, 0x78, 0x60, 0x75, 0x12, 0xe5, 0xd7, 0xa1, 0xda, 0x52, 0x51, - 0x4b, 0x6f, 0x7f, 0xc3, 0xd5, 0x5b, 0x6c, 0x7d, 0x82, 0xcb, 0xa7, 0xd6, 0x88, 0x60, 0x12, 0x39, - 0x56, 0x83, 0x82, 0x4d, 0x69, 0xe8, 0xfb, 0x00, 0xca, 0x12, 0xd3, 0xf6, 0x86, 0xab, 0xaf, 0x9a, - 0xc6, 0x24, 0xb2, 0xef, 0x85, 0x28, 0x4a, 0x74, 0xe8, 0xf3, 0x44, 0x04, 0x6c, 0x88, 0x12, 0xb3, - 0x0e, 0x52, 0x86, 0x37, 0x3c, 0x5f, 0x9f, 0xd9, 0x89, 0x66, 0xbd, 0x16, 0xc1, 0x24, 0x33, 0xcb, - 0x11, 0x05, 0x9b, 0xd2, 0x96, 0x7d, 0x98, 0x4f, 0xea, 0x2a, 0xe3, 0xba, 0xb9, 0x15, 0xbf, 0x6e, - 0x2e, 0x8d, 0x79, 0x40, 0x8d, 0x08, 0xd4, 0x4c, 0x49, 0xfb, 0x70, 0x26, 0xa1, 0xa3, 0x0c, 0x91, - 0x1b, 0x71, 0x91, 0x2f, 0xe7, 0xb9, 0x7a, 0x75, 0x6a, 0xd7, 0x94, 0xc9, 0x60, 0x3e, 0xa9, 0x9d, - 0x63, 0x13, 0x1a, 0xcb, 0x27, 0x9b, 0x77, 0xea, 0x9f, 0x17, 0xa0, 0x12, 0x5a, 0xd5, 0x3c, 0xc9, - 0x21, 0xe5, 0x0d, 0x15, 0x8e, 0x88, 0xd6, 0x8a, 0xe3, 0x44, 0x6b, 0x53, 0xa3, 0xa3, 0xb5, 0x20, - 0x81, 0x5c, 0x7e, 0x78, 0x02, 0xd9, 0x88, 0xd6, 0xa6, 0xc7, 0x8f, 0xd6, 0x66, 0x8e, 0x8e, 0xd6, - 0xec, 0xbf, 0xb4, 0x00, 0xa5, 0x43, 0xf3, 0x3c, 0x8a, 0x22, 0xc9, 0xbb, 0x6e, 0x4c, 0x4f, 0x28, - 0x19, 0x1f, 0x8f, 0xbe, 0xf2, 0xec, 0x4f, 0x4b, 0x70, 0xe6, 0xa6, 0x33, 0x71, 0x9e, 0x8f, 0xc3, - 0x93, 0x0a, 0xa9, 0x49, 0xb5, 0x1f, 0xda, 0xe4, 0x3e, 0xe1, 0xb4, 0xb3, 0xaf, 0xd7, 0xf7, 0xaa, - 0x66, 0x7d, 0xb2, 0x91, 0xdd, 0xed, 0xc1, 0x68, 0x12, 0x1e, 0x05, 0x3d, 0xf6, 0x26, 0x79, 0x03, - 0xe6, 0x18, 0xf7, 0x9d, 0x16, 0x57, 0x99, 0x44, 0xb6, 0x54, 0x95, 0x17, 0xc9, 0x39, 0xdd, 0x7d, - 0xae, 0x69, 0x12, 0x71, 0xbc, 0x6f, 0x66, 0x82, 0x72, 0x2a, 0x77, 0x82, 0x72, 0x15, 0x2a, 0xa4, - 0xd7, 0xf3, 0xbe, 0x7f, 0x97, 0x74, 0x98, 0x4e, 0x07, 0x84, 0xbb, 0x66, 0x2d, 0x20, 0xe0, 0xa8, - 0x0f, 0xaa, 0x01, 0x38, 0x1d, 0xd7, 0xf3, 0xa9, 0xe4, 0x28, 0xcb, 0x1b, 0x4d, 0x3e, 0xc2, 0x6c, - 0x84, 0xad, 0xd8, 0xe8, 0x81, 0x9a, 0x70, 0xce, 0x71, 0x19, 0x6d, 0x0d, 0x7d, 0xda, 0xdc, 0x75, - 0x06, 0x77, 0x37, 0x9b, 0xd2, 0x4a, 0xec, 0xcb, 0xdd, 0x3c, 0x53, 0x7f, 0x4a, 0x0b, 0x3b, 0xb7, - 0x91, 0xd5, 0x09, 0x67, 0xf3, 0xa2, 0x57, 0x60, 0xd6, 0x71, 0x5b, 0xbd, 0x61, 0x9b, 0x6e, 0x11, - 0xde, 0x65, 0x4b, 0x33, 0x72, 0x18, 0xf3, 0x87, 0x07, 0x2b, 0xb3, 0x1b, 0x46, 0x3b, 0x8e, 0xf5, - 0x12, 0x5c, 0xf4, 0x23, 0x83, 0xab, 0x12, 0x71, 0x5d, 0xff, 0xc8, 0xe4, 0x32, 0x7b, 0x65, 0xa4, - 0x70, 0x21, 0x57, 0x0a, 0xf7, 0x27, 0x05, 0x28, 0xab, 0x17, 0x14, 0x74, 0x39, 0xf1, 0x4c, 0xf1, - 0x54, 0xea, 0x99, 0xa2, 0x9a, 0xf5, 0xda, 0x64, 0x43, 0xd9, 0x61, 0x6c, 0x18, 0x77, 0x20, 0x36, - 0x64, 0x0b, 0xd6, 0x14, 0x99, 0xda, 0xf2, 0xdc, 0x1d, 0xa7, 0xa3, 0x13, 0x10, 0xd7, 0x0c, 0xb7, - 0x21, 0x7a, 0xe5, 0xfe, 0x20, 0x7c, 0x06, 0x8f, 0x3c, 0x88, 0x58, 0x07, 0xe1, 0x4a, 0xdc, 0x6e, - 0xde, 0x79, 0x53, 0xc9, 0x68, 0x48, 0x44, 0xac, 0x91, 0x85, 0x0c, 0x6f, 0xc8, 0x07, 0x43, 0x2e, - 0x37, 0xca, 0x31, 0xc9, 0xb8, 0x23, 0x11, 0xb1, 0x46, 0xb6, 0x3f, 0xb1, 0xe0, 0x8c, 0xd2, 0x41, - 0xa3, 0x4b, 0x5b, 0xbb, 0x4d, 0x4e, 0x07, 0xc2, 0xa3, 0x1f, 0x32, 0xca, 0x92, 0x1e, 0xfd, 0x5b, - 0x8c, 0x32, 0x2c, 0x29, 0xc6, 0xec, 0x0b, 0x27, 0x35, 0x7b, 0xfb, 0xaf, 0x2d, 0x28, 0x49, 0xd7, - 0x39, 0x8f, 0xfd, 0x89, 0xa7, 0x93, 0x0a, 0x63, 0xa5, 0x93, 0x8e, 0x48, 0xf4, 0x45, 0x99, 0xac, - 0xa9, 0x87, 0x65, 0xb2, 0xec, 0x9f, 0x59, 0xb0, 0x98, 0x95, 0x1d, 0xcd, 0x33, 0xfc, 0x17, 0x61, - 0x66, 0xd0, 0x23, 0x7c, 0xc7, 0xf3, 0xfb, 0xc9, 0x97, 0xb1, 0x2d, 0xdd, 0x8e, 0xc3, 0x1e, 0xc8, - 0x07, 0xf0, 0x83, 0x30, 0x2c, 0x08, 0x51, 0xae, 0xe5, 0xbd, 0x11, 0xe2, 0x69, 0xbd, 0x48, 0x59, - 0x61, 0x13, 0xc3, 0x86, 0x14, 0xfb, 0x0f, 0x4b, 0xb0, 0x20, 0x59, 0x26, 0xbd, 0x21, 0x26, 0x59, - 0xa1, 0x01, 0x3c, 0x21, 0x83, 0xa7, 0xf4, 0xa5, 0xa2, 0x16, 0xed, 0x8a, 0xe6, 0x7f, 0x62, 0x23, - 0xb3, 0xd7, 0x83, 0x91, 0x14, 0x3c, 0x02, 0x37, 0x7d, 0x53, 0xc0, 0xff, 0xbf, 0x9b, 0xc2, 0xdc, - 0x6c, 0xd3, 0x47, 0x6e, 0xb6, 0x91, 0xf7, 0xca, 0xcc, 0x23, 0xdc, 0x2b, 0x69, 0x5b, 0x5f, 0xc9, - 0x65, 0xeb, 0xff, 0xb4, 0x00, 0xd3, 0x5b, 0xbe, 0x27, 0xb3, 0xec, 0x27, 0x9f, 0xb0, 0xbd, 0x13, - 0x7b, 0xa1, 0xbb, 0x38, 0xf6, 0x0b, 0x9d, 0x80, 0x92, 0x6f, 0x73, 0x33, 0xf1, 0x77, 0x39, 0x23, - 0xf3, 0x58, 0xcc, 0xe3, 0x81, 0x07, 0x90, 0x0f, 0xcf, 0x3c, 0x7e, 0x6a, 0x41, 0x55, 0xf7, 0xfc, - 0xda, 0xa6, 0xb8, 0xf4, 0xf8, 0x46, 0xa4, 0xb8, 0xfe, 0x38, 0x9a, 0x81, 0x50, 0x1a, 0xfa, 0x4d, - 0x58, 0x18, 0x04, 0x2f, 0x82, 0x5b, 0x5e, 0xcf, 0x69, 0x39, 0x34, 0xc8, 0x92, 0x5e, 0xce, 0xf9, - 0x5c, 0x2a, 0xd9, 0xf7, 0xeb, 0xdf, 0xd0, 0x72, 0x17, 0xb6, 0x92, 0xb8, 0x38, 0x2d, 0xca, 0xfe, - 0x17, 0x0b, 0xe6, 0x62, 0xba, 0x47, 0x2d, 0x80, 0x96, 0xe7, 0xb6, 0x1d, 0x1e, 0x16, 0x27, 0x54, - 0x2f, 0xad, 0x8e, 0xa7, 0xd5, 0x46, 0xc0, 0x17, 0x6d, 0xba, 0xb0, 0x89, 0x61, 0x03, 0x16, 0xbd, - 0x1c, 0xd4, 0x09, 0xc5, 0x9d, 0x18, 0x55, 0x27, 0xf4, 0xe0, 0x60, 0x65, 0x56, 0x8f, 0xc9, 0xac, - 0x1b, 0xca, 0x53, 0x31, 0xf3, 0x57, 0x05, 0xa8, 0x84, 0xf3, 0x7f, 0x0c, 0xc7, 0xe8, 0xad, 0xd8, - 0x31, 0x7a, 0x39, 0xe7, 0xca, 0x8d, 0x7a, 0xe4, 0x46, 0xef, 0x27, 0x0e, 0x53, 0xde, 0x2d, 0x71, - 0xc4, 0x71, 0xfa, 0x3b, 0xb5, 0xf8, 0xaa, 0xef, 0x63, 0x38, 0x50, 0x77, 0xe3, 0x07, 0x6a, 0x35, - 0xe7, 0x6c, 0x46, 0x1c, 0xa9, 0x1f, 0x5a, 0x70, 0x26, 0x71, 0x08, 0xd0, 0xd3, 0x50, 0x92, 0x59, - 0x31, 0xbd, 0xbf, 0x42, 0x46, 0x1d, 0xe0, 0x4b, 0x1a, 0xda, 0x82, 0x45, 0x32, 0xe4, 0x5e, 0xc8, - 0x7b, 0xdd, 0x25, 0xdb, 0x3d, 0xaa, 0xa2, 0xf6, 0x99, 0xfa, 0xcf, 0x69, 0x9e, 0xc5, 0xb5, 0x8c, - 0x3e, 0x38, 0x93, 0xd3, 0xfe, 0xbc, 0x00, 0x28, 0x6c, 0xcc, 0x93, 0x4e, 0x7e, 0x1f, 0xa6, 0x77, - 0x54, 0x22, 0xe8, 0xd1, 0xde, 0x03, 0xea, 0x55, 0xf3, 0x49, 0x24, 0xc0, 0x44, 0xef, 0x1c, 0xcf, - 0x3e, 0x82, 0xf4, 0x1e, 0x42, 0xf7, 0x01, 0x76, 0x1c, 0xd7, 0x61, 0xdd, 0x09, 0x5f, 0x2e, 0xe5, - 0x6d, 0x7e, 0x23, 0x44, 0xc0, 0x06, 0x9a, 0xfd, 0x71, 0xc1, 0xd8, 0x9f, 0xd2, 0x5c, 0x8e, 0xb5, - 0xae, 0xcf, 0xc7, 0x95, 0x59, 0x49, 0xbf, 0x15, 0x19, 0x8a, 0x99, 0xda, 0x23, 0x7e, 0x90, 0xb6, - 0xce, 0x5b, 0xa0, 0x72, 0x8f, 0xf8, 0x8e, 0x58, 0xf8, 0x68, 0x49, 0xef, 0x11, 0x9f, 0x61, 0x09, - 0x89, 0xbe, 0x23, 0x86, 0x4a, 0x07, 0x81, 0x09, 0xcd, 0x6d, 0x13, 0x38, 0x1d, 0x98, 0xf3, 0xa3, - 0x03, 0x86, 0x15, 0xa0, 0xfd, 0xf1, 0xb4, 0xb1, 0xe1, 0xb5, 0xd5, 0xbe, 0x0d, 0xa8, 0x47, 0x18, - 0xbf, 0x45, 0xdc, 0xb6, 0xd8, 0x9e, 0x74, 0xc7, 0xa7, 0xac, 0xab, 0x3d, 0xb4, 0x65, 0x8d, 0x82, - 0x36, 0x53, 0x3d, 0x70, 0x06, 0x17, 0xba, 0x1c, 0x37, 0xce, 0x2b, 0x49, 0xe3, 0x7c, 0x3a, 0x3a, - 0x6d, 0x93, 0x99, 0x67, 0x73, 0xbb, 0x97, 0x4e, 0x60, 0xbb, 0xff, 0x06, 0x2c, 0xec, 0x24, 0xdf, - 0x0e, 0x75, 0x25, 0xc1, 0x6b, 0x13, 0x3e, 0x3d, 0xd6, 0xcf, 0x1d, 0x46, 0x0f, 0x4e, 0x51, 0x33, - 0x4e, 0x0b, 0x42, 0x5e, 0x50, 0x46, 0x29, 0xa3, 0x4f, 0x95, 0x58, 0x18, 0xfb, 0xc8, 0x25, 0xe2, - 0xd6, 0x64, 0x01, 0xa5, 0x82, 0xc4, 0x31, 0x01, 0x89, 0x23, 0x58, 0x3e, 0xce, 0x23, 0x88, 0x2e, - 0x87, 0x09, 0x7d, 0x31, 0x1c, 0xe9, 0xca, 0x16, 0x53, 0xa9, 0x78, 0x41, 0xc2, 0x66, 0x3f, 0xf4, - 0x23, 0x0b, 0xce, 0x89, 0xcd, 0x7a, 0xfd, 0x23, 0xda, 0x1a, 0x0a, 0xad, 0x04, 0xb5, 0xd3, 0x4b, - 0x55, 0xa9, 0x8d, 0x31, 0x8b, 0x4a, 0x9b, 0x59, 0x10, 0x91, 0x5f, 0x9e, 0x49, 0xc6, 0xd9, 0x82, - 0xd1, 0x07, 0xd2, 0x74, 0x70, 0x2a, 0xc3, 0x9e, 0x47, 0x0f, 0xef, 0x2b, 0xda, 0xec, 0x70, 0x65, - 0x76, 0x38, 0xb5, 0xff, 0x28, 0x66, 0xad, 0xc6, 0x4b, 0x3a, 0x2c, 0x43, 0x81, 0xb0, 0x64, 0x9a, - 0x78, 0x8d, 0xe1, 0x02, 0x61, 0xe8, 0x1d, 0x28, 0xf9, 0x94, 0xfb, 0xfb, 0xda, 0xa8, 0x5e, 0x99, - 0xc0, 0x80, 0x60, 0xc1, 0xaf, 0x86, 0x2a, 0x7f, 0x62, 0x85, 0x68, 0xe4, 0x3a, 0x8a, 0x27, 0x96, - 0xeb, 0xf8, 0x89, 0x65, 0xdc, 0x85, 0xe1, 0x60, 0xd0, 0x5b, 0x30, 0xcd, 0x9d, 0x3e, 0xf5, 0x86, - 0x3c, 0x9f, 0x83, 0x11, 0x3e, 0x4e, 0xc9, 0x23, 0x7f, 0x57, 0x41, 0xe0, 0x00, 0x4b, 0x44, 0x5d, - 0xd4, 0xf7, 0x3d, 0xff, 0x6e, 0x57, 0x98, 0x30, 0xaf, 0xa7, 0x6e, 0xf1, 0xb9, 0x28, 0xea, 0xba, - 0x1e, 0xa3, 0xe2, 0x44, 0x6f, 0xfb, 0x73, 0xd3, 0x15, 0xfa, 0xbf, 0x5f, 0x1d, 0x49, 0x0c, 0xdd, - 0x8b, 0x8e, 0x1b, 0xee, 0x60, 0x38, 0xce, 0x67, 0x1d, 0xcf, 0xc3, 0x74, 0x9b, 0xee, 0x90, 0x61, - 0x2f, 0x75, 0x75, 0xae, 0xab, 0x66, 0x1c, 0xd0, 0xed, 0x7f, 0xb4, 0x60, 0xe1, 0x71, 0x57, 0x5e, - 0xbe, 0x17, 0x77, 0x20, 0x27, 0x51, 0xd9, 0x43, 0x4a, 0x2e, 0x53, 0x33, 0x92, 0x2e, 0xc7, 0x77, - 0xa1, 0xec, 0x08, 0xed, 0xb1, 0x7c, 0x05, 0x8b, 0x69, 0xf5, 0x1b, 0xaf, 0xe7, 0x12, 0x0f, 0x6b, - 0xdc, 0xc8, 0x53, 0x28, 0x1c, 0xb7, 0xa7, 0xe0, 0x9b, 0x13, 0xd2, 0x9f, 0x5a, 0xa0, 0xf7, 0xf5, - 0xb6, 0xb3, 0xf2, 0x94, 0xf7, 0xa7, 0x60, 0x46, 0x6e, 0xbd, 0xcf, 0x2d, 0x38, 0x97, 0xd9, 0x3b, - 0x74, 0xb6, 0x0a, 0x27, 0xe8, 0x6c, 0x59, 0xc7, 0xad, 0xc2, 0xfb, 0x86, 0x0a, 0x83, 0x21, 0x1c, - 0xd7, 0xf7, 0x51, 0x3f, 0x2e, 0xc0, 0x3c, 0xa6, 0x03, 0x2f, 0x96, 0x77, 0xdc, 0x0a, 0xaa, 0x63, - 0x73, 0x38, 0xea, 0x89, 0xd7, 0xad, 0xfa, 0x74, 0xac, 0x2c, 0xf6, 0x3b, 0x50, 0x92, 0x29, 0xc1, - 0x7c, 0x86, 0x26, 0x95, 0x11, 0x55, 0xf7, 0x88, 0xca, 0xad, 0x2a, 0x40, 0x81, 0x2c, 0x8b, 0x35, - 0xf4, 0x35, 0xf2, 0x5a, 0x8e, 0xb2, 0x8f, 0x34, 0xb2, 0x6c, 0xc6, 0x0a, 0xd0, 0xfe, 0xa4, 0x00, - 0xca, 0xa9, 0x7f, 0x0c, 0x76, 0xf8, 0x57, 0x63, 0x76, 0x78, 0x75, 0x5c, 0xd7, 0x44, 0xa8, 0x67, - 0x54, 0xe0, 0x9e, 0x0c, 0xb8, 0x2e, 0xe6, 0x01, 0x7d, 0x78, 0xd0, 0xfe, 0xb7, 0x16, 0x54, 0x64, - 0xbf, 0xc7, 0x60, 0x6f, 0xb7, 0xe2, 0xf6, 0xf6, 0x85, 0x1c, 0xb3, 0x18, 0x61, 0x63, 0x3f, 0x2e, - 0xea, 0xd1, 0x87, 0xe1, 0x5c, 0x97, 0xf8, 0x6d, 0x1d, 0xa8, 0x44, 0x27, 0x50, 0x34, 0x62, 0x45, - 0x43, 0xbf, 0xa6, 0xea, 0x5a, 0x28, 0xe3, 0xb4, 0x7d, 0x23, 0x8c, 0x1a, 0x8a, 0xb9, 0x0b, 0x74, - 0x74, 0x11, 0x51, 0x94, 0xb0, 0xc6, 0x09, 0x54, 0x9c, 0x92, 0x23, 0x22, 0x89, 0x41, 0xd2, 0x96, - 0x69, 0x0f, 0xfb, 0xb5, 0x09, 0x0d, 0xa7, 0x8a, 0x24, 0x52, 0xcd, 0x38, 0x2d, 0x08, 0x75, 0x61, - 0xd6, 0x2c, 0x2d, 0xd4, 0x7b, 0xe9, 0x52, 0xfe, 0x1a, 0x46, 0xf5, 0x40, 0x69, 0xb6, 0xe0, 0x18, - 0xb2, 0x7d, 0x50, 0x86, 0xaa, 0xb1, 0xf9, 0x12, 0x49, 0xc0, 0xb9, 0x93, 0x49, 0x02, 0x66, 0xc7, - 0xac, 0xd5, 0x89, 0x62, 0xd6, 0x8b, 0xf1, 0x98, 0xf5, 0x9b, 0xc9, 0x98, 0x15, 0xe4, 0xec, 0x62, - 0xf1, 0x2a, 0x83, 0xd3, 0x3a, 0x78, 0x0b, 0x6a, 0x44, 0x73, 0x65, 0x01, 0xd2, 0x21, 0x22, 0x12, - 0x7e, 0xe6, 0x8d, 0x18, 0x24, 0x4e, 0x88, 0x10, 0x7e, 0xaa, 0x6e, 0x69, 0x0e, 0xfb, 0x7d, 0xe2, - 0xef, 0x2f, 0xcd, 0xca, 0x01, 0x87, 0x7e, 0xea, 0x8d, 0x18, 0x15, 0x27, 0x7a, 0xa3, 0x2d, 0x28, - 0xab, 0xd8, 0x4f, 0xd7, 0x1d, 0xbe, 0x98, 0x27, 0xac, 0x54, 0x7e, 0xba, 0xfa, 0x8d, 0x35, 0x8e, - 0x19, 0xb6, 0x57, 0x8e, 0x08, 0xdb, 0x6f, 0x03, 0xf2, 0xb6, 0x65, 0x44, 0xd0, 0xbe, 0xa9, 0x3e, - 0x24, 0x16, 0xbb, 0xb2, 0x2c, 0x63, 0xc2, 0x70, 0xc1, 0xee, 0xa4, 0x7a, 0xe0, 0x0c, 0x2e, 0x71, - 0xaa, 0x75, 0xc0, 0x18, 0x1e, 0x05, 0x1d, 0xa2, 0xe7, 0x75, 0xb0, 0xa2, 0x6c, 0x80, 0xac, 0x5b, - 0x6b, 0x24, 0x50, 0x71, 0x4a, 0x0e, 0xfa, 0x10, 0xe6, 0xc4, 0x16, 0x8a, 0x04, 0xc3, 0x23, 0x0a, - 0x5e, 0x38, 0x3c, 0x58, 0x99, 0xdb, 0x34, 0x21, 0x71, 0x5c, 0x82, 0xfd, 0x07, 0x45, 0xc8, 0x0e, - 0x57, 0xa3, 0x92, 0x79, 0xeb, 0x21, 0x25, 0xf3, 0x6f, 0x43, 0x85, 0x71, 0xe2, 0xab, 0xcf, 0x03, - 0x0a, 0x93, 0x7d, 0x1e, 0xd0, 0x0c, 0x00, 0x70, 0x84, 0x95, 0xc8, 0x1d, 0x14, 0x8f, 0x35, 0x77, - 0x70, 0x09, 0x40, 0x46, 0x59, 0x0d, 0x6f, 0xa8, 0x5f, 0x0b, 0xe7, 0x22, 0x9b, 0x70, 0x3d, 0xa4, - 0x60, 0xa3, 0x17, 0xba, 0x12, 0x5e, 0x9c, 0xea, 0x79, 0xf0, 0x42, 0xaa, 0xbc, 0x21, 0x99, 0x7d, - 0xca, 0xf8, 0x9e, 0xf6, 0x88, 0x72, 0x28, 0xfb, 0x7f, 0x0a, 0x10, 0x33, 0x86, 0xe8, 0x87, 0x16, - 0x2c, 0x90, 0xc4, 0x27, 0xc9, 0x81, 0x2f, 0xf9, 0x2b, 0xf9, 0xbe, 0x13, 0x4f, 0x7d, 0xd1, 0x1c, - 0x3d, 0xc8, 0x24, 0xbb, 0x30, 0x9c, 0x16, 0x8a, 0x7e, 0xcf, 0x82, 0xb3, 0x24, 0xfd, 0xcd, 0xb9, - 0x5e, 0xf4, 0xd7, 0x27, 0xfe, 0x68, 0xbd, 0xfe, 0xe4, 0xe1, 0xc1, 0x4a, 0xd6, 0xd7, 0xf8, 0x38, - 0x4b, 0x1c, 0x7a, 0x17, 0xa6, 0x88, 0xdf, 0x09, 0x92, 0x97, 0xf9, 0xc5, 0x06, 0xff, 0x4a, 0x20, - 0xf2, 0x8e, 0xd6, 0xfc, 0x0e, 0xc3, 0x12, 0xd4, 0xfe, 0x69, 0x11, 0xe6, 0x93, 0x25, 0xf6, 0xba, - 0x62, 0x6e, 0x2a, 0xb3, 0x62, 0x4e, 0x9c, 0x91, 0x16, 0x0f, 0xcb, 0xd7, 0xa2, 0x33, 0x22, 0x1a, - 0xb1, 0xa2, 0x85, 0x67, 0x44, 0x16, 0xbe, 0x96, 0x1e, 0xe1, 0x8c, 0xc8, 0x6a, 0xd7, 0x08, 0x0b, - 0x5d, 0x89, 0xdf, 0x2d, 0x76, 0xf2, 0x6e, 0x59, 0x30, 0xe7, 0x32, 0x69, 0x4a, 0xb4, 0x0f, 0x55, - 0x63, 0x1d, 0xf4, 0x49, 0xbc, 0x9a, 0x5b, 0xef, 0xd1, 0xb6, 0x3b, 0xa3, 0xfe, 0x1f, 0x41, 0x44, - 0x31, 0xf1, 0xa3, 0x73, 0x2f, 0xb5, 0xf5, 0x48, 0x39, 0x43, 0xa9, 0x2e, 0x03, 0xcd, 0xfe, 0x57, - 0x0b, 0xe6, 0x62, 0x65, 0x9c, 0x42, 0x5a, 0x50, 0x2e, 0x3b, 0xf9, 0x17, 0xfa, 0xf7, 0x42, 0x04, - 0x6c, 0xa0, 0xa1, 0xef, 0x41, 0xb5, 0xe7, 0xb9, 0x1d, 0xca, 0x78, 0xd3, 0x23, 0xbb, 0xfa, 0x9c, - 0xe4, 0x4d, 0x2a, 0x2d, 0x1d, 0x1e, 0xac, 0x2c, 0x6e, 0x2a, 0x98, 0x86, 0xd7, 0x1f, 0xf4, 0x28, - 0x57, 0x75, 0xce, 0xd8, 0x04, 0x97, 0xcf, 0x8a, 0x6f, 0x13, 0x9f, 0x76, 0xbd, 0x21, 0xa3, 0x5f, - 0xd7, 0x67, 0xc5, 0x70, 0x80, 0xc7, 0xfd, 0xac, 0x18, 0x01, 0x1f, 0xfd, 0xac, 0x18, 0xf6, 0xfd, - 0xda, 0x3e, 0x2b, 0x86, 0x23, 0x1c, 0x11, 0xa9, 0xfc, 0x77, 0xc1, 0x98, 0x45, 0x3c, 0x5a, 0x29, - 0x3c, 0x24, 0x5a, 0x79, 0x0f, 0x66, 0x1c, 0x97, 0x53, 0x7f, 0x8f, 0xf4, 0x74, 0xe2, 0x36, 0xef, - 0x5e, 0x0c, 0xa7, 0xba, 0xa1, 0x71, 0x70, 0x88, 0x88, 0x7a, 0x70, 0x2e, 0x78, 0x70, 0xf0, 0x29, - 0x89, 0x1e, 0x3c, 0x75, 0xd1, 0xd0, 0xab, 0x41, 0x66, 0xfc, 0x46, 0x56, 0xa7, 0x07, 0xa3, 0x08, - 0x38, 0x1b, 0x14, 0x31, 0x98, 0x63, 0x46, 0x98, 0x1e, 0xdc, 0x88, 0x63, 0x3e, 0xd6, 0x24, 0x33, - 0x1b, 0x46, 0xa5, 0x91, 0x09, 0x8a, 0xe3, 0x32, 0xec, 0x7f, 0x2a, 0xc2, 0x99, 0xc4, 0x4e, 0x4b, - 0x84, 0x23, 0x95, 0xc7, 0x19, 0x8e, 0x94, 0x27, 0x0a, 0x47, 0xb2, 0x3d, 0xe5, 0xa9, 0x89, 0x3c, - 0xe5, 0x37, 0x94, 0xb7, 0xaa, 0x57, 0x6e, 0x63, 0x5d, 0x17, 0x66, 0x87, 0xda, 0xdc, 0x34, 0x89, - 0x38, 0xde, 0x57, 0xba, 0x13, 0xed, 0xf4, 0x97, 0xde, 0xda, 0xd5, 0x7e, 0x3d, 0x6f, 0x65, 0x5d, - 0x08, 0xa0, 0xdc, 0x89, 0x0c, 0x02, 0xce, 0x12, 0x57, 0xbf, 0xfd, 0xd9, 0x57, 0xe7, 0x4f, 0x7d, - 0xf1, 0xd5, 0xf9, 0x53, 0x5f, 0x7e, 0x75, 0xfe, 0xd4, 0x0f, 0x0e, 0xcf, 0x5b, 0x9f, 0x1d, 0x9e, - 0xb7, 0xbe, 0x38, 0x3c, 0x6f, 0x7d, 0x79, 0x78, 0xde, 0xfa, 0x8f, 0xc3, 0xf3, 0xd6, 0x8f, 0x7e, - 0x76, 0xfe, 0xd4, 0xfd, 0x67, 0xc6, 0xf9, 0x0f, 0x50, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x5b, - 0x4b, 0xe6, 0xf5, 0x28, 0x4a, 0x00, 0x00, + 0x41, 0x90, 0x34, 0x09, 0x55, 0x3b, 0x71, 0xe2, 0x38, 0x5b, 0x17, 0x22, 0xe5, 0x0f, 0x79, 0xb5, + 0xb1, 0x3a, 0x74, 0x9c, 0x8d, 0xe3, 0x20, 0x3b, 0x26, 0x47, 0xe4, 0x5d, 0x91, 0xf7, 0x32, 0x77, + 0x86, 0xda, 0xa8, 0x2d, 0xda, 0xed, 0x17, 0xb0, 0x68, 0xd1, 0x62, 0x1f, 0x02, 0x64, 0x0b, 0xb4, + 0x40, 0xd1, 0x3e, 0x2e, 0xda, 0x7f, 0xa0, 0x0f, 0x79, 0xe8, 0x4b, 0x50, 0x04, 0x6d, 0xd0, 0x16, + 0x68, 0x1e, 0xb6, 0x6a, 0xa3, 0x00, 0x45, 0x9f, 0xfa, 0xd6, 0x17, 0x03, 0x05, 0x8a, 0xf9, 0xb8, + 0xf7, 0xce, 0xfd, 0xa0, 0xc5, 0x4b, 0x4b, 0x46, 0xba, 0x6f, 0xd4, 0x9c, 0x99, 0xdf, 0x99, 0x39, + 0x33, 0xe7, 0xcc, 0x39, 0x67, 0xce, 0x15, 0xbc, 0xd2, 0x71, 0x78, 0x77, 0x78, 0xbf, 0xd6, 0xf2, + 0xfa, 0xab, 0x64, 0x67, 0xe8, 0xf0, 0xbd, 0xd5, 0x1d, 0xe2, 0x77, 0xbc, 0x55, 0x32, 0x70, 0x56, + 0x77, 0xcf, 0x93, 0xde, 0xa0, 0x4b, 0xce, 0xaf, 0x76, 0xa8, 0x4b, 0x7d, 0xc2, 0x69, 0xbb, 0x36, + 0xf0, 0x3d, 0xee, 0xa1, 0x67, 0xa2, 0x51, 0x35, 0x35, 0xaa, 0x26, 0x47, 0xd5, 0xc8, 0xc0, 0xa9, + 0x05, 0xa3, 0x96, 0x5f, 0x32, 0xb0, 0x3b, 0x5e, 0xc7, 0x5b, 0x95, 0x83, 0xef, 0x0f, 0xb7, 0xe5, + 0x5f, 0xf2, 0x0f, 0xf9, 0x4b, 0x81, 0x2e, 0xdf, 0xd8, 0xb9, 0xc4, 0x6a, 0x8e, 0xe4, 0x4c, 0x3f, + 0xe4, 0xd4, 0x65, 0x8e, 0xe7, 0xb2, 0x97, 0xc8, 0xc0, 0x61, 0xd4, 0xdf, 0xa5, 0xfe, 0xea, 0x60, + 0xa7, 0x23, 0x68, 0x2c, 0xde, 0x61, 0x75, 0x37, 0x35, 0xbd, 0xe5, 0x57, 0x22, 0xa4, 0x3e, 0x69, + 0x75, 0x1d, 0x97, 0xfa, 0x7b, 0xd1, 0xf0, 0x3e, 0xe5, 0x24, 0x6b, 0xd4, 0xea, 0xa8, 0x51, 0xfe, + 0xd0, 0xe5, 0x4e, 0x9f, 0xa6, 0x06, 0xbc, 0x7a, 0xd8, 0x00, 0xd6, 0xea, 0xd2, 0x3e, 0x49, 0x8e, + 0xb3, 0xef, 0xc1, 0xe9, 0x35, 0x97, 0xf4, 0xf6, 0x98, 0xc3, 0xf0, 0xd0, 0x5d, 0xf3, 0x3b, 0xc3, + 0x3e, 0x75, 0x39, 0x3a, 0x07, 0x53, 0x2e, 0xe9, 0xd3, 0x25, 0xeb, 0x9c, 0xf5, 0x5c, 0xa5, 0x3e, + 0xfb, 0xe9, 0xfe, 0xca, 0x89, 0x83, 0xfd, 0x95, 0xa9, 0x37, 0x49, 0x9f, 0x62, 0x49, 0x41, 0x4f, + 0x43, 0x69, 0x97, 0xf4, 0x86, 0x74, 0xa9, 0x20, 0xbb, 0xcc, 0xe9, 0x2e, 0xa5, 0x3b, 0xa2, 0x11, + 0x2b, 0x9a, 0xfd, 0x7b, 0xc5, 0x18, 0xfc, 0x77, 0x28, 0x27, 0x6d, 0xc2, 0x09, 0xea, 0x43, 0xb9, + 0x47, 0xee, 0xd3, 0x1e, 0x5b, 0xb2, 0xce, 0x15, 0x9f, 0xab, 0x5e, 0xb8, 0x5a, 0x1b, 0x67, 0x13, + 0x6b, 0x19, 0x50, 0xb5, 0x4d, 0x89, 0x73, 0xd5, 0xe5, 0xfe, 0x5e, 0xfd, 0xa4, 0x9e, 0x44, 0x59, + 0x35, 0x62, 0xcd, 0x04, 0xfd, 0x8e, 0x05, 0x55, 0xe2, 0xba, 0x1e, 0x27, 0x5c, 0x6c, 0xd3, 0x52, + 0x41, 0x32, 0xbd, 0x39, 0x39, 0xd3, 0xb5, 0x08, 0x4c, 0x71, 0x3e, 0xad, 0x39, 0x57, 0x0d, 0x0a, + 0x36, 0x79, 0x2e, 0xbf, 0x0e, 0x55, 0x63, 0xaa, 0x68, 0x1e, 0x8a, 0x3b, 0x74, 0x4f, 0xc9, 0x17, + 0x8b, 0x9f, 0x68, 0x31, 0x26, 0x50, 0x2d, 0xc1, 0xcb, 0x85, 0x4b, 0xd6, 0xf2, 0x15, 0x98, 0x4f, + 0x32, 0xcc, 0x33, 0xde, 0xfe, 0x13, 0x0b, 0x16, 0x8d, 0x55, 0x60, 0xba, 0x4d, 0x7d, 0xea, 0xb6, + 0x28, 0x5a, 0x85, 0x8a, 0xd8, 0x4b, 0x36, 0x20, 0xad, 0x60, 0xab, 0x17, 0xf4, 0x42, 0x2a, 0x6f, + 0x06, 0x04, 0x1c, 0xf5, 0x09, 0x8f, 0x45, 0xe1, 0x61, 0xc7, 0x62, 0xd0, 0x25, 0x8c, 0x2e, 0x15, + 0xe3, 0xc7, 0x62, 0x4b, 0x34, 0x62, 0x45, 0xb3, 0x7f, 0x05, 0xbe, 0x11, 0xcc, 0xe7, 0x36, 0xed, + 0x0f, 0x7a, 0x84, 0xd3, 0x68, 0x52, 0x87, 0x1e, 0x3d, 0x7b, 0x07, 0xe6, 0xd6, 0x06, 0x03, 0xdf, + 0xdb, 0xa5, 0xed, 0x26, 0x27, 0x1d, 0x8a, 0xee, 0x02, 0x10, 0xdd, 0xb0, 0xc6, 0xe5, 0xc0, 0xea, + 0x85, 0x5f, 0xaa, 0x29, 0x8d, 0xa8, 0x99, 0x1a, 0x51, 0x1b, 0xec, 0x74, 0x44, 0x03, 0xab, 0x09, + 0xc5, 0xab, 0xed, 0x9e, 0xaf, 0xdd, 0x76, 0xfa, 0xb4, 0x7e, 0xf2, 0x60, 0x7f, 0x05, 0xd6, 0x42, + 0x04, 0x6c, 0xa0, 0xd9, 0xbf, 0x6b, 0xc1, 0x99, 0x35, 0xbf, 0xe3, 0x35, 0xd6, 0xd7, 0x06, 0x83, + 0x1b, 0x94, 0xf4, 0x78, 0xb7, 0xc9, 0x09, 0x1f, 0x32, 0x74, 0x05, 0xca, 0x4c, 0xfe, 0xd2, 0x53, + 0x7d, 0x36, 0x38, 0x7d, 0x8a, 0xfe, 0x60, 0x7f, 0x65, 0x31, 0x63, 0x20, 0xc5, 0x7a, 0x14, 0x7a, + 0x1e, 0xa6, 0xfb, 0x94, 0x31, 0xd2, 0x09, 0xe4, 0x79, 0x4a, 0x03, 0x4c, 0x7f, 0x47, 0x35, 0xe3, + 0x80, 0x6e, 0xff, 0x7d, 0x01, 0x4e, 0x85, 0x58, 0x9a, 0xfd, 0x31, 0x6c, 0xde, 0x10, 0x66, 0xbb, + 0xc6, 0x0a, 0xe5, 0x1e, 0x56, 0x2f, 0xbc, 0x31, 0xa6, 0x9e, 0x64, 0x09, 0xa9, 0xbe, 0xa8, 0xd9, + 0xcc, 0x9a, 0xad, 0x38, 0xc6, 0x06, 0xf5, 0x01, 0xd8, 0x9e, 0xdb, 0xd2, 0x4c, 0xa7, 0x24, 0xd3, + 0xd7, 0x73, 0x32, 0x6d, 0x86, 0x00, 0x75, 0xa4, 0x59, 0x42, 0xd4, 0x86, 0x0d, 0x06, 0xf6, 0xdf, + 0x58, 0x70, 0x3a, 0x63, 0x1c, 0xfa, 0x56, 0x62, 0x3f, 0x9f, 0x49, 0xed, 0x27, 0x4a, 0x0d, 0x8b, + 0x76, 0xf3, 0x45, 0x98, 0xf1, 0xe9, 0xae, 0x23, 0xee, 0x01, 0x2d, 0xe1, 0x79, 0x3d, 0x7e, 0x06, + 0xeb, 0x76, 0x1c, 0xf6, 0x40, 0x2f, 0x40, 0x25, 0xf8, 0x2d, 0xc4, 0x5c, 0x14, 0xaa, 0x22, 0x36, + 0x2e, 0xe8, 0xca, 0x70, 0x44, 0xb7, 0x7f, 0x1b, 0x4a, 0x8d, 0x2e, 0xf1, 0xb9, 0x38, 0x31, 0x3e, + 0x1d, 0x78, 0x6f, 0xe1, 0x4d, 0x3d, 0xc5, 0xf0, 0xc4, 0x60, 0xd5, 0x8c, 0x03, 0xfa, 0x18, 0x9b, + 0xfd, 0x3c, 0x4c, 0xef, 0x52, 0x5f, 0xce, 0xb7, 0x18, 0x07, 0xbb, 0xa3, 0x9a, 0x71, 0x40, 0xb7, + 0xff, 0xd9, 0x82, 0x45, 0x39, 0x83, 0x75, 0x87, 0xb5, 0xbc, 0x5d, 0xea, 0xef, 0x61, 0xca, 0x86, + 0xbd, 0x23, 0x9e, 0xd0, 0x3a, 0xcc, 0x33, 0xda, 0xdf, 0xa5, 0x7e, 0xc3, 0x73, 0x19, 0xf7, 0x89, + 0xe3, 0x72, 0x3d, 0xb3, 0x25, 0xdd, 0x7b, 0xbe, 0x99, 0xa0, 0xe3, 0xd4, 0x08, 0xf4, 0x1c, 0xcc, + 0xe8, 0x69, 0x8b, 0xa3, 0x24, 0x04, 0x3b, 0x2b, 0xf6, 0x40, 0xaf, 0x89, 0xe1, 0x90, 0x6a, 0xff, + 0xa7, 0x05, 0x0b, 0x72, 0x55, 0xcd, 0xe1, 0x7d, 0xd6, 0xf2, 0x9d, 0x81, 0x30, 0xaf, 0x5f, 0xc7, + 0x25, 0x5d, 0x81, 0x93, 0xed, 0x40, 0xf0, 0x9b, 0x4e, 0xdf, 0xe1, 0x52, 0x47, 0x4a, 0xf5, 0x27, + 0x34, 0xc6, 0xc9, 0xf5, 0x18, 0x15, 0x27, 0x7a, 0xab, 0xed, 0xeb, 0x0d, 0x19, 0xa7, 0xfe, 0x96, + 0xef, 0xf5, 0x3d, 0xb1, 0xce, 0xdb, 0x84, 0xed, 0xa0, 0xef, 0xc1, 0x4c, 0x5f, 0x5f, 0x69, 0xda, + 0x6a, 0xfe, 0xf2, 0x78, 0x56, 0xf3, 0xd6, 0xfd, 0xef, 0xd3, 0x16, 0x17, 0xd7, 0x61, 0xa4, 0x6d, + 0x51, 0x1b, 0x0e, 0x51, 0xd1, 0x3b, 0x30, 0xc5, 0x06, 0xb4, 0x25, 0x45, 0x54, 0xbd, 0xf0, 0xda, + 0x78, 0x4a, 0x1d, 0x9b, 0x64, 0x73, 0x40, 0x5b, 0x91, 0x6c, 0xc5, 0x5f, 0x58, 0x42, 0xda, 0xff, + 0x66, 0xc1, 0x52, 0xd6, 0xaa, 0x36, 0x1d, 0xc6, 0xd1, 0xbd, 0xd4, 0xca, 0x6a, 0xe3, 0xad, 0x4c, + 0x8c, 0x96, 0xeb, 0x0a, 0xb5, 0x37, 0x68, 0x31, 0x56, 0xd5, 0x82, 0x92, 0xc3, 0x69, 0x3f, 0x70, + 0x24, 0xae, 0x8c, 0xb7, 0xac, 0x51, 0x93, 0x8d, 0x2e, 0xc9, 0x0d, 0x01, 0x8a, 0x15, 0xb6, 0xfd, + 0x2e, 0xcc, 0x36, 0x86, 0xbe, 0x4f, 0x5d, 0xae, 0x2e, 0xb9, 0x6f, 0x43, 0x89, 0x39, 0xae, 0xb6, + 0xf5, 0xf9, 0xee, 0xb7, 0x8a, 0x00, 0x6f, 0x8a, 0xc1, 0x58, 0x61, 0xd8, 0x7f, 0x56, 0x84, 0xd3, + 0xc1, 0xa9, 0xa1, 0xed, 0x35, 0x9f, 0x3b, 0xdb, 0xa4, 0xc5, 0x19, 0x6a, 0xc3, 0x6c, 0x3b, 0x6a, + 0xe6, 0xda, 0x18, 0xe7, 0xe1, 0x15, 0x1a, 0x7c, 0x03, 0x9e, 0xe3, 0x18, 0x2a, 0x7a, 0x1b, 0x8a, + 0x1d, 0x87, 0x6b, 0xdf, 0xef, 0xd2, 0x78, 0xd2, 0xbb, 0xee, 0x24, 0xad, 0x4f, 0xbd, 0xaa, 0x59, + 0x15, 0xaf, 0x3b, 0x1c, 0x0b, 0x44, 0x74, 0x1f, 0xca, 0x4e, 0x9f, 0x74, 0x68, 0xb0, 0x33, 0x97, + 0xc7, 0xc3, 0xde, 0x10, 0x63, 0x92, 0xe8, 0xa1, 0x33, 0x29, 0xa9, 0x0c, 0x6b, 0x64, 0xc1, 0xa3, + 0x25, 0xac, 0x86, 0xb2, 0xdb, 0x63, 0xf3, 0xc8, 0xb2, 0x9f, 0x11, 0x0f, 0x49, 0x65, 0x58, 0x23, + 0xdb, 0x5f, 0x14, 0x60, 0x3e, 0x92, 0x5f, 0xc3, 0xeb, 0xf7, 0x1d, 0x8e, 0x96, 0xa1, 0xe0, 0xb4, + 0xb5, 0x51, 0x02, 0x3d, 0xb0, 0xb0, 0xb1, 0x8e, 0x0b, 0x4e, 0x1b, 0x3d, 0x0b, 0xe5, 0xfb, 0x3e, + 0x71, 0x5b, 0x5d, 0x6d, 0x8c, 0x42, 0xe0, 0xba, 0x6c, 0xc5, 0x9a, 0x8a, 0x9e, 0x82, 0x22, 0x27, + 0x1d, 0x6d, 0x83, 0x42, 0xf9, 0xdd, 0x26, 0x1d, 0x2c, 0xda, 0x85, 0xf1, 0x63, 0x43, 0xa9, 0xc7, + 0x72, 0xe7, 0x0d, 0xe3, 0xd7, 0x54, 0xcd, 0x38, 0xa0, 0x0b, 0x8e, 0x64, 0xc8, 0xbb, 0x9e, 0xbf, + 0x54, 0x8a, 0x73, 0x5c, 0x93, 0xad, 0x58, 0x53, 0x85, 0x9b, 0xd2, 0x92, 0xf3, 0xe7, 0xd4, 0x5f, + 0x2a, 0xc7, 0xdd, 0x94, 0x46, 0x40, 0xc0, 0x51, 0x1f, 0xf4, 0x1e, 0x54, 0x5b, 0x3e, 0x25, 0xdc, + 0xf3, 0xd7, 0x09, 0xa7, 0x4b, 0xd3, 0xb9, 0x4f, 0xe0, 0x29, 0xe1, 0x87, 0x37, 0x22, 0x08, 0x6c, + 0xe2, 0xd9, 0xff, 0x6d, 0xc1, 0x52, 0x24, 0x5a, 0xb9, 0xb7, 0x91, 0xef, 0xa9, 0xc5, 0x63, 0x8d, + 0x10, 0xcf, 0xb3, 0x50, 0x6e, 0x3b, 0x1d, 0xca, 0x78, 0x52, 0xca, 0xeb, 0xb2, 0x15, 0x6b, 0x2a, + 0xba, 0x00, 0xd0, 0x71, 0xb8, 0xbe, 0x2f, 0xb4, 0xb0, 0x43, 0x3b, 0x79, 0x3d, 0xa4, 0x60, 0xa3, + 0x17, 0x7a, 0x1b, 0x2a, 0x72, 0x9a, 0x13, 0xaa, 0x9d, 0xf4, 0x1e, 0x1a, 0x01, 0x00, 0x8e, 0xb0, + 0xec, 0xcf, 0xa7, 0x60, 0xfa, 0x9a, 0x4f, 0x9d, 0x4e, 0x97, 0x3f, 0x06, 0x83, 0xff, 0x34, 0x94, + 0x48, 0xcf, 0x21, 0x4c, 0xee, 0x9b, 0xe1, 0xff, 0xaf, 0x89, 0x46, 0xac, 0x68, 0xe8, 0x5d, 0x28, + 0x7b, 0xbe, 0xd3, 0x71, 0xdc, 0xa5, 0x8a, 0x9c, 0xc4, 0xcb, 0xe3, 0xa9, 0x90, 0x5e, 0xc5, 0x2d, + 0x39, 0x34, 0x12, 0xbe, 0xfa, 0x1b, 0x6b, 0x48, 0x74, 0x17, 0xa6, 0xd5, 0x61, 0x0a, 0x14, 0x74, + 0x75, 0x6c, 0x03, 0xa3, 0xce, 0x63, 0x74, 0xe8, 0xd5, 0xdf, 0x0c, 0x07, 0x80, 0xa8, 0x19, 0xda, + 0x97, 0x29, 0x09, 0xfd, 0x42, 0x0e, 0xfb, 0x32, 0xd2, 0xa0, 0x34, 0x43, 0x83, 0x52, 0xca, 0x03, + 0x2a, 0x4d, 0xc6, 0x28, 0x0b, 0x22, 0x44, 0xac, 0x9d, 0xd9, 0xf2, 0x04, 0x22, 0xd6, 0x9e, 0xf4, + 0xc9, 0xb8, 0x07, 0x1c, 0xf8, 0xba, 0xf6, 0x47, 0x45, 0x58, 0xd0, 0x3d, 0x1b, 0x5e, 0xaf, 0x47, + 0x5b, 0xd2, 0x73, 0x52, 0xf6, 0xa9, 0x98, 0x69, 0x9f, 0x9c, 0xe0, 0xc6, 0x54, 0x36, 0xbf, 0x9e, + 0x6b, 0x36, 0x11, 0x8f, 0x9a, 0xbc, 0x21, 0x55, 0xc8, 0x1d, 0xee, 0x92, 0xee, 0xa5, 0xef, 0x4d, + 0xf4, 0x07, 0x16, 0x9c, 0xde, 0xa5, 0xbe, 0xb3, 0xed, 0xb4, 0x64, 0xc0, 0x7c, 0xc3, 0x61, 0xdc, + 0xf3, 0xf7, 0xf4, 0x8d, 0xf0, 0xea, 0x78, 0x9c, 0xef, 0x18, 0x00, 0x1b, 0xee, 0xb6, 0x57, 0xff, + 0xa6, 0xe6, 0x76, 0xfa, 0x4e, 0x1a, 0x1a, 0x67, 0xf1, 0x5b, 0x1e, 0x00, 0x44, 0xb3, 0xcd, 0x88, + 0xd7, 0x37, 0xcd, 0x78, 0x7d, 0xec, 0x89, 0x05, 0x8b, 0x0d, 0x4c, 0x96, 0x19, 0xe7, 0x7f, 0x62, + 0x41, 0x55, 0xd3, 0x1f, 0x83, 0x13, 0x84, 0xe3, 0x4e, 0xd0, 0x4b, 0xb9, 0xe6, 0x3f, 0xc2, 0xe7, + 0xf1, 0x61, 0x2e, 0xa6, 0xe4, 0xe8, 0x22, 0x4c, 0xed, 0x38, 0x6e, 0x70, 0xeb, 0xfd, 0x62, 0xe0, + 0x06, 0x7e, 0xdb, 0x71, 0xdb, 0x0f, 0xf6, 0x57, 0x16, 0x62, 0x9d, 0x45, 0x23, 0x96, 0xdd, 0x0f, + 0xf7, 0xcc, 0x2f, 0xcf, 0xfc, 0xe4, 0x2f, 0x56, 0x4e, 0xfc, 0xf0, 0x67, 0xe7, 0x4e, 0xd8, 0x1f, + 0x17, 0x61, 0x3e, 0x29, 0xd5, 0x31, 0xf2, 0x5f, 0x91, 0x0d, 0x9b, 0x39, 0x56, 0x1b, 0x56, 0x38, + 0x3e, 0x1b, 0x56, 0x3c, 0x0e, 0x1b, 0x36, 0x75, 0x64, 0x36, 0xcc, 0xfe, 0x07, 0x0b, 0x4e, 0x86, + 0x3b, 0xf3, 0xc1, 0x50, 0xdc, 0xac, 0x91, 0xd4, 0xad, 0xa3, 0x97, 0xfa, 0xfb, 0x30, 0xcd, 0xbc, + 0xa1, 0xdf, 0x92, 0xee, 0xa3, 0x40, 0x7f, 0x25, 0x9f, 0xd1, 0x54, 0x63, 0x0d, 0x9f, 0x49, 0x35, + 0xe0, 0x00, 0xd5, 0x5c, 0x90, 0xa6, 0x29, 0x97, 0xc2, 0x17, 0x0e, 0x97, 0x58, 0xd0, 0x8c, 0xe9, + 0x52, 0x88, 0x56, 0xac, 0xa9, 0xc8, 0x96, 0xf6, 0x3c, 0xf0, 0x6c, 0x2b, 0x75, 0xd0, 0x66, 0x59, + 0x6e, 0x82, 0xa2, 0xa0, 0x01, 0xcc, 0xfb, 0xf4, 0x83, 0xa1, 0xe3, 0xd3, 0x76, 0xd3, 0x23, 0x3b, + 0xc2, 0x2f, 0xd0, 0x29, 0x9c, 0x31, 0xf5, 0x7e, 0x7d, 0xe8, 0x4b, 0x13, 0x56, 0x5f, 0x14, 0x91, + 0x29, 0x4e, 0x60, 0xe1, 0x14, 0xba, 0xfd, 0xef, 0xa5, 0x50, 0x61, 0x75, 0x12, 0xe5, 0x37, 0xa0, + 0xda, 0x52, 0x51, 0x4b, 0x6f, 0x6f, 0xc3, 0xd5, 0x47, 0x6c, 0x7d, 0x82, 0xcb, 0xa7, 0xd6, 0x88, + 0x60, 0x12, 0x39, 0x56, 0x83, 0x82, 0x4d, 0x6e, 0xe8, 0x07, 0x00, 0xca, 0x12, 0xd3, 0xf6, 0x86, + 0xab, 0xaf, 0x9a, 0xc6, 0x24, 0xbc, 0xef, 0x84, 0x28, 0x8a, 0x75, 0xe8, 0xf3, 0x44, 0x04, 0x6c, + 0xb0, 0x12, 0xab, 0x0e, 0x52, 0x86, 0xd7, 0x3c, 0x5f, 0xeb, 0xec, 0x44, 0xab, 0x5e, 0x8b, 0x60, + 0x92, 0x99, 0xe5, 0x88, 0x82, 0x4d, 0x6e, 0xcb, 0x3e, 0xcc, 0x27, 0x65, 0x95, 0x71, 0xdd, 0xdc, + 0x88, 0x5f, 0x37, 0x17, 0xc6, 0x54, 0x50, 0x23, 0x02, 0x35, 0x53, 0xd2, 0x3e, 0x9c, 0x4a, 0xc8, + 0x28, 0x83, 0xe5, 0x46, 0x9c, 0xe5, 0xcb, 0x79, 0xae, 0x5e, 0x9d, 0xda, 0x35, 0x79, 0x32, 0x98, + 0x4f, 0x4a, 0xe7, 0xc8, 0x98, 0xc6, 0xf2, 0xc9, 0xe6, 0x9d, 0xfa, 0xe7, 0x05, 0xa8, 0x84, 0x56, + 0x35, 0x4f, 0x72, 0x48, 0x79, 0x43, 0x85, 0x43, 0xa2, 0xb5, 0xe2, 0x38, 0xd1, 0xda, 0xd4, 0xe8, + 0x68, 0x2d, 0x48, 0x20, 0x97, 0x1f, 0x9e, 0x40, 0x36, 0xa2, 0xb5, 0xe9, 0xf1, 0xa3, 0xb5, 0x99, + 0xc3, 0xa3, 0x35, 0xfb, 0x2f, 0x2d, 0x40, 0xe9, 0xd0, 0x3c, 0x8f, 0xa0, 0x48, 0xf2, 0xae, 0x1b, + 0xd3, 0x13, 0x4a, 0xc6, 0xc7, 0xa3, 0xaf, 0x3c, 0xfb, 0x93, 0x12, 0x9c, 0xba, 0xee, 0x4c, 0x9c, + 0xe7, 0xe3, 0xf0, 0xa4, 0x42, 0x6a, 0x52, 0xed, 0x87, 0x36, 0xb9, 0x4f, 0x38, 0xed, 0xec, 0xe9, + 0xfd, 0xbd, 0xac, 0x87, 0x3e, 0xd9, 0xc8, 0xee, 0xf6, 0x60, 0x34, 0x09, 0x8f, 0x82, 0x1e, 0xfb, + 0x90, 0xbc, 0x01, 0x73, 0x8c, 0xfb, 0x4e, 0x8b, 0xab, 0x4c, 0x22, 0x5b, 0xaa, 0xca, 0x8b, 0xe4, + 0x8c, 0xee, 0x3e, 0xd7, 0x34, 0x89, 0x38, 0xde, 0x37, 0x33, 0x41, 0x39, 0x95, 0x3b, 0x41, 0xb9, + 0x0a, 0x15, 0xd2, 0xeb, 0x79, 0x3f, 0xb8, 0x4d, 0x3a, 0x4c, 0xa7, 0x03, 0xc2, 0x53, 0xb3, 0x16, + 0x10, 0x70, 0xd4, 0x07, 0xd5, 0x00, 0x9c, 0x8e, 0xeb, 0xf9, 0x54, 0x8e, 0x28, 0xcb, 0x1b, 0x4d, + 0x3e, 0xc2, 0x6c, 0x84, 0xad, 0xd8, 0xe8, 0x81, 0x9a, 0x70, 0xc6, 0x71, 0x19, 0x6d, 0x0d, 0x7d, + 0xda, 0xdc, 0x71, 0x06, 0xb7, 0x37, 0x9b, 0xd2, 0x4a, 0xec, 0xc9, 0xd3, 0x3c, 0x53, 0x7f, 0x4a, + 0x33, 0x3b, 0xb3, 0x91, 0xd5, 0x09, 0x67, 0x8f, 0x45, 0xaf, 0xc0, 0xac, 0xe3, 0xb6, 0x7a, 0xc3, + 0x36, 0xdd, 0x22, 0xbc, 0xcb, 0x96, 0x66, 0xe4, 0x34, 0xe6, 0x0f, 0xf6, 0x57, 0x66, 0x37, 0x8c, + 0x76, 0x1c, 0xeb, 0x25, 0x46, 0xd1, 0x0f, 0x8d, 0x51, 0x95, 0x68, 0xd4, 0xd5, 0x0f, 0xcd, 0x51, + 0x66, 0xaf, 0x8c, 0x14, 0x2e, 0xe4, 0x4a, 0xe1, 0xfe, 0xb4, 0x00, 0x65, 0xf5, 0x82, 0x82, 0x2e, + 0x26, 0x9e, 0x29, 0x9e, 0x4a, 0x3d, 0x53, 0x54, 0xb3, 0x5e, 0x9b, 0x6c, 0x28, 0x3b, 0x8c, 0x0d, + 0xe3, 0x0e, 0xc4, 0x86, 0x6c, 0xc1, 0x9a, 0x22, 0x53, 0x5b, 0x9e, 0xbb, 0xed, 0x74, 0x74, 0x02, + 0xe2, 0x8a, 0xe1, 0x36, 0x44, 0xaf, 0xdc, 0xef, 0x87, 0xcf, 0xe0, 0x91, 0x07, 0x11, 0xeb, 0x20, + 0x5c, 0x89, 0x9b, 0xcd, 0x5b, 0x6f, 0x2a, 0x1e, 0x0d, 0x89, 0x88, 0x35, 0xb2, 0xe0, 0xe1, 0x0d, + 0xf9, 0x60, 0xc8, 0xe5, 0x41, 0x39, 0x22, 0x1e, 0xb7, 0x24, 0x22, 0xd6, 0xc8, 0xf6, 0xc7, 0x16, + 0x9c, 0x52, 0x32, 0x68, 0x74, 0x69, 0x6b, 0xa7, 0xc9, 0xe9, 0x40, 0x78, 0xf4, 0x43, 0x46, 0x59, + 0xd2, 0xa3, 0x7f, 0x8b, 0x51, 0x86, 0x25, 0xc5, 0x58, 0x7d, 0xe1, 0xb8, 0x56, 0x6f, 0xff, 0xb5, + 0x05, 0x25, 0xe9, 0x3a, 0xe7, 0xb1, 0x3f, 0xf1, 0x74, 0x52, 0x61, 0xac, 0x74, 0xd2, 0x21, 0x89, + 0xbe, 0x28, 0x93, 0x35, 0xf5, 0xb0, 0x4c, 0x96, 0xfd, 0x95, 0x05, 0x8b, 0x59, 0xd9, 0xd1, 0x3c, + 0xd3, 0x7f, 0x11, 0x66, 0x06, 0x3d, 0xc2, 0xb7, 0x3d, 0xbf, 0x9f, 0x7c, 0x19, 0xdb, 0xd2, 0xed, + 0x38, 0xec, 0x81, 0x7c, 0x00, 0x3f, 0x08, 0xc3, 0x82, 0x10, 0xe5, 0x4a, 0xde, 0x1b, 0x21, 0x9e, + 0xd6, 0x8b, 0x84, 0x15, 0x36, 0x31, 0x6c, 0x70, 0xb1, 0xff, 0xa8, 0x04, 0x0b, 0x72, 0xc8, 0xa4, + 0x37, 0xc4, 0x24, 0x3b, 0x34, 0x80, 0x27, 0x64, 0xf0, 0x94, 0xbe, 0x54, 0xd4, 0xa6, 0x5d, 0xd2, + 0xe3, 0x9f, 0xd8, 0xc8, 0xec, 0xf5, 0x60, 0x24, 0x05, 0x8f, 0xc0, 0x4d, 0xdf, 0x14, 0xf0, 0xf3, + 0x77, 0x53, 0x98, 0x87, 0x6d, 0xfa, 0xd0, 0xc3, 0x36, 0xf2, 0x5e, 0x99, 0x79, 0x84, 0x7b, 0x25, + 0x6d, 0xeb, 0x2b, 0xb9, 0x6c, 0xfd, 0x9f, 0x16, 0x60, 0x7a, 0xcb, 0xf7, 0x64, 0x96, 0xfd, 0xf8, + 0x13, 0xb6, 0xb7, 0x62, 0x2f, 0x74, 0xe7, 0xc7, 0x7e, 0xa1, 0x13, 0x50, 0xf2, 0x6d, 0x6e, 0x26, + 0xfe, 0x2e, 0x67, 0x64, 0x1e, 0x8b, 0x79, 0x3c, 0xf0, 0x00, 0xf2, 0xe1, 0x99, 0xc7, 0x4f, 0x2c, + 0xa8, 0xea, 0x9e, 0x5f, 0xdb, 0x14, 0x97, 0x9e, 0xdf, 0x88, 0x14, 0xd7, 0x1f, 0x47, 0x2b, 0x10, + 0x42, 0x43, 0xbf, 0x05, 0x0b, 0x83, 0xe0, 0x45, 0x70, 0xcb, 0xeb, 0x39, 0x2d, 0x87, 0x06, 0x59, + 0xd2, 0x8b, 0x39, 0x9f, 0x4b, 0xe5, 0xf0, 0xbd, 0xfa, 0x37, 0x34, 0xdf, 0x85, 0xad, 0x24, 0x2e, + 0x4e, 0xb3, 0xb2, 0xff, 0xc5, 0x82, 0xb9, 0x98, 0xec, 0x51, 0x0b, 0xa0, 0xe5, 0xb9, 0x6d, 0x87, + 0x87, 0xc5, 0x09, 0xd5, 0x0b, 0xab, 0xe3, 0x49, 0xb5, 0x11, 0x8c, 0x8b, 0x0e, 0x5d, 0xd8, 0xc4, + 0xb0, 0x01, 0x8b, 0x5e, 0x0e, 0xea, 0x84, 0xe2, 0x4e, 0x8c, 0xaa, 0x13, 0x7a, 0xb0, 0xbf, 0x32, + 0xab, 0xe7, 0x64, 0xd6, 0x0d, 0xe5, 0xa9, 0x98, 0xf9, 0xab, 0x02, 0x54, 0xc2, 0xf5, 0x3f, 0x06, + 0x35, 0x7a, 0x2b, 0xa6, 0x46, 0x2f, 0xe7, 0xdc, 0xb9, 0x51, 0x8f, 0xdc, 0xe8, 0xbd, 0x84, 0x32, + 0xe5, 0x3d, 0x12, 0x87, 0xa8, 0xd3, 0xdf, 0xa9, 0xcd, 0x57, 0x7d, 0x1f, 0x83, 0x42, 0xdd, 0x8e, + 0x2b, 0xd4, 0x6a, 0xce, 0xd5, 0x8c, 0x50, 0xa9, 0x1f, 0x59, 0x70, 0x2a, 0xa1, 0x04, 0xe8, 0x69, + 0x28, 0xc9, 0xac, 0x98, 0x3e, 0x5f, 0xe1, 0x40, 0x1d, 0xe0, 0x4b, 0x1a, 0xda, 0x82, 0x45, 0x32, + 0xe4, 0x5e, 0x38, 0xf6, 0xaa, 0x4b, 0xee, 0xf7, 0xa8, 0x8a, 0xda, 0x67, 0xea, 0xbf, 0xa0, 0xc7, + 0x2c, 0xae, 0x65, 0xf4, 0xc1, 0x99, 0x23, 0xed, 0xcf, 0x0a, 0x80, 0xc2, 0xc6, 0x3c, 0xe9, 0xe4, + 0xf7, 0x60, 0x7a, 0x5b, 0x25, 0x82, 0x1e, 0xed, 0x3d, 0xa0, 0x5e, 0x35, 0x9f, 0x44, 0x02, 0x4c, + 0xf4, 0xce, 0xd1, 0x9c, 0x23, 0x48, 0x9f, 0x21, 0x74, 0x17, 0x60, 0xdb, 0x71, 0x1d, 0xd6, 0x9d, + 0xf0, 0xe5, 0x52, 0xde, 0xe6, 0xd7, 0x42, 0x04, 0x6c, 0xa0, 0xd9, 0x1f, 0x15, 0x8c, 0xf3, 0x29, + 0xcd, 0xe5, 0x58, 0xfb, 0xfa, 0x7c, 0x5c, 0x98, 0x95, 0xf4, 0x5b, 0x91, 0x21, 0x98, 0xa9, 0x5d, + 0xe2, 0x07, 0x69, 0xeb, 0xbc, 0x05, 0x2a, 0x77, 0x88, 0xef, 0x88, 0x8d, 0x8f, 0xb6, 0xf4, 0x0e, + 0xf1, 0x19, 0x96, 0x90, 0xe8, 0xbb, 0x62, 0xaa, 0x74, 0x10, 0x98, 0xd0, 0xdc, 0x36, 0x81, 0xd3, + 0x81, 0xb9, 0x3e, 0x3a, 0x60, 0x58, 0x01, 0xda, 0x1f, 0x4d, 0x1b, 0x07, 0x5e, 0x5b, 0xed, 0x9b, + 0x80, 0x7a, 0x84, 0xf1, 0x1b, 0xc4, 0x6d, 0x8b, 0xe3, 0x49, 0xb7, 0x7d, 0xca, 0xba, 0xda, 0x43, + 0x5b, 0xd6, 0x28, 0x68, 0x33, 0xd5, 0x03, 0x67, 0x8c, 0x42, 0x17, 0xe3, 0xc6, 0x79, 0x25, 0x69, + 0x9c, 0x4f, 0x46, 0xda, 0x36, 0x99, 0x79, 0x36, 0x8f, 0x7b, 0xe9, 0x18, 0x8e, 0xfb, 0x6f, 0xc2, + 0xc2, 0x76, 0xf2, 0xed, 0x50, 0x57, 0x12, 0xbc, 0x36, 0xe1, 0xd3, 0x63, 0xfd, 0xcc, 0x41, 0xf4, + 0xe0, 0x14, 0x35, 0xe3, 0x34, 0x23, 0xe4, 0x05, 0x65, 0x94, 0x32, 0xfa, 0x54, 0x89, 0x85, 0xb1, + 0x55, 0x2e, 0x11, 0xb7, 0x26, 0x0b, 0x28, 0x15, 0x24, 0x8e, 0x31, 0x48, 0xa8, 0x60, 0xf9, 0x28, + 0x55, 0x10, 0x5d, 0x0c, 0x13, 0xfa, 0x62, 0x3a, 0xd2, 0x95, 0x2d, 0xa6, 0x52, 0xf1, 0x82, 0x84, + 0xcd, 0x7e, 0xe8, 0xc7, 0x16, 0x9c, 0x11, 0x87, 0xf5, 0xea, 0x87, 0xb4, 0x35, 0x14, 0x52, 0x09, + 0x6a, 0xa7, 0x97, 0xaa, 0x52, 0x1a, 0x63, 0x16, 0x95, 0x36, 0xb3, 0x20, 0x22, 0xbf, 0x3c, 0x93, + 0x8c, 0xb3, 0x19, 0xa3, 0xf7, 0xa5, 0xe9, 0xe0, 0x54, 0x86, 0x3d, 0x8f, 0x1e, 0xde, 0x57, 0xb4, + 0xd9, 0xe1, 0xca, 0xec, 0x70, 0x6a, 0xff, 0x57, 0xcc, 0x5a, 0x8d, 0x97, 0x74, 0xb8, 0x0b, 0x53, + 0x9c, 0xb0, 0x1d, 0xad, 0x05, 0xdf, 0x9a, 0xa0, 0x40, 0x2e, 0xd2, 0x05, 0xe9, 0x89, 0xcb, 0x26, + 0x89, 0x89, 0x96, 0xa1, 0x40, 0x58, 0x32, 0x05, 0xbd, 0xc6, 0x70, 0x81, 0x30, 0xf4, 0x0e, 0x94, + 0x7c, 0xca, 0xfd, 0x3d, 0x6d, 0xb0, 0x2f, 0x4d, 0x60, 0x9c, 0xb0, 0x18, 0xaf, 0xc4, 0x20, 0x7f, + 0x62, 0x85, 0x68, 0xe4, 0x51, 0x8a, 0xc7, 0x96, 0x47, 0xf9, 0xa9, 0x65, 0xdc, 0xb3, 0xe1, 0x64, + 0xd0, 0x5b, 0x30, 0xcd, 0x9d, 0x3e, 0xf5, 0x86, 0x3c, 0x9f, 0xf3, 0x12, 0x3e, 0x7c, 0x49, 0x73, + 0x72, 0x5b, 0x41, 0xe0, 0x00, 0x4b, 0x44, 0x74, 0xd4, 0xf7, 0x3d, 0xff, 0x76, 0x57, 0x98, 0x47, + 0xaf, 0xa7, 0x3c, 0x84, 0xb9, 0x28, 0xa2, 0xbb, 0x1a, 0xa3, 0xe2, 0x44, 0x6f, 0xfb, 0x33, 0xd3, + 0xcd, 0xfa, 0xff, 0x5f, 0x79, 0x49, 0x0c, 0xd9, 0x8b, 0x8e, 0x1b, 0xee, 0x60, 0x38, 0xce, 0x27, + 0x23, 0xcf, 0xc3, 0x74, 0x9b, 0x6e, 0x93, 0x61, 0x2f, 0x75, 0x2d, 0xaf, 0xab, 0x66, 0x1c, 0xd0, + 0xed, 0x7f, 0xb4, 0x60, 0xe1, 0x71, 0x57, 0x75, 0xde, 0x8b, 0x3b, 0xa7, 0x93, 0x88, 0xec, 0x21, + 0xe5, 0x9c, 0xf7, 0xe0, 0x89, 0x6c, 0xb5, 0x1d, 0x43, 0x70, 0xe7, 0x74, 0x15, 0x44, 0xa2, 0x9c, + 0x21, 0x2a, 0x78, 0x48, 0xcb, 0x4b, 0x3a, 0x4b, 0xdf, 0x83, 0xb2, 0x23, 0xf6, 0x86, 0xe5, 0x2b, + 0xb5, 0x4c, 0x6f, 0xae, 0xf1, 0xee, 0x2f, 0xf1, 0xb0, 0xc6, 0x8d, 0x7c, 0x9c, 0xc2, 0x51, 0xfb, + 0x38, 0xbe, 0xb9, 0x20, 0xfd, 0x91, 0x08, 0x7a, 0x4f, 0x1f, 0x6a, 0x2b, 0xcf, 0x87, 0x09, 0x29, + 0x98, 0x91, 0x07, 0xfb, 0x33, 0x0b, 0xce, 0x64, 0xf6, 0x0e, 0xdd, 0xc4, 0xc2, 0x31, 0xba, 0x89, + 0xd6, 0x51, 0x8b, 0xf0, 0xae, 0x21, 0xc2, 0x60, 0x0a, 0x47, 0xf5, 0x65, 0xd7, 0x4f, 0x0a, 0x30, + 0x8f, 0xe9, 0xc0, 0x8b, 0x65, 0x4c, 0xb7, 0x82, 0xba, 0xde, 0x1c, 0x21, 0x46, 0xe2, 0x5d, 0xae, + 0x3e, 0x1d, 0x2b, 0xe8, 0xfd, 0x2e, 0x94, 0x64, 0x32, 0x33, 0x9f, 0x19, 0x4b, 0xe5, 0x72, 0xd5, + 0x2d, 0xa5, 0xb2, 0xc2, 0x0a, 0x50, 0x20, 0xcb, 0x32, 0x13, 0x7d, 0x49, 0xbd, 0x96, 0xa3, 0x60, + 0x25, 0x8d, 0x2c, 0x9b, 0xb1, 0x02, 0xb4, 0x3f, 0x2e, 0x80, 0x0a, 0x47, 0x1e, 0x83, 0x95, 0xff, + 0xb5, 0x98, 0x95, 0x5f, 0x1d, 0xd7, 0xa9, 0x12, 0xe2, 0x19, 0x95, 0x72, 0x48, 0x86, 0x8a, 0xe7, + 0xf3, 0x80, 0x3e, 0x3c, 0xdd, 0xf0, 0xb7, 0x16, 0x54, 0x64, 0xbf, 0xc7, 0x60, 0xcd, 0xb7, 0xe2, + 0xd6, 0xfc, 0x85, 0x1c, 0xab, 0x18, 0x61, 0xc1, 0x3f, 0x2a, 0xea, 0xd9, 0x87, 0x81, 0x68, 0x97, + 0xf8, 0x6d, 0x1d, 0x62, 0x45, 0x1a, 0x28, 0x1a, 0xb1, 0xa2, 0xa1, 0x5f, 0x57, 0x15, 0x39, 0x94, + 0x71, 0xda, 0xbe, 0x16, 0xc6, 0x3b, 0xc5, 0xdc, 0xa5, 0x45, 0xba, 0xfc, 0x29, 0x4a, 0xb5, 0xe3, + 0x04, 0x2a, 0x4e, 0xf1, 0x11, 0x31, 0xd0, 0x20, 0x69, 0xcb, 0x74, 0x6c, 0xf0, 0xda, 0x84, 0x86, + 0x53, 0xc5, 0x40, 0xa9, 0x66, 0x9c, 0x66, 0x84, 0xba, 0x30, 0x6b, 0x16, 0x45, 0xea, 0xb3, 0x74, + 0x21, 0x7f, 0xf5, 0xa5, 0x7a, 0x5a, 0x35, 0x5b, 0x70, 0x0c, 0xd9, 0xde, 0x2f, 0x43, 0xd5, 0x38, + 0x7c, 0x89, 0xf4, 0xe5, 0xdc, 0xf1, 0xa4, 0x2f, 0xb3, 0xa3, 0xed, 0xea, 0x44, 0xd1, 0xf6, 0xf9, + 0x78, 0xb4, 0xfd, 0xcd, 0x64, 0xb4, 0x0d, 0x72, 0x75, 0xb1, 0x48, 0x9b, 0xc1, 0x49, 0x1d, 0x76, + 0x06, 0xd5, 0xad, 0xb9, 0xf2, 0x17, 0xe9, 0xe0, 0x16, 0x09, 0x2f, 0xf6, 0x5a, 0x0c, 0x12, 0x27, + 0x58, 0x08, 0x2f, 0x58, 0xb7, 0x34, 0x87, 0xfd, 0x3e, 0xf1, 0xf7, 0x96, 0x66, 0xe5, 0x84, 0x43, + 0x2f, 0xf8, 0x5a, 0x8c, 0x8a, 0x13, 0xbd, 0xd1, 0x16, 0x94, 0x55, 0xd4, 0xaa, 0x2b, 0x26, 0x5f, + 0xcc, 0x13, 0x10, 0xab, 0x28, 0x40, 0xfd, 0xc6, 0x1a, 0xc7, 0x4c, 0x38, 0x54, 0x0e, 0x49, 0x38, + 0xdc, 0x04, 0xe4, 0xdd, 0x97, 0xf1, 0x46, 0xfb, 0xba, 0xfa, 0x04, 0x5a, 0x9c, 0xca, 0xb2, 0x8c, + 0x66, 0xc3, 0x0d, 0xbb, 0x95, 0xea, 0x81, 0x33, 0x46, 0x09, 0xad, 0xd6, 0xa1, 0x6e, 0xa8, 0x0a, + 0x3a, 0xb9, 0x90, 0xd7, 0xc1, 0x8a, 0x62, 0x37, 0x59, 0x71, 0xd7, 0x48, 0xa0, 0xe2, 0x14, 0x1f, + 0xf4, 0x01, 0xcc, 0x89, 0x23, 0x14, 0x31, 0x86, 0x47, 0x64, 0xbc, 0x70, 0xb0, 0xbf, 0x32, 0xb7, + 0x69, 0x42, 0xe2, 0x38, 0x07, 0xfb, 0x0f, 0x8b, 0x90, 0x1d, 0x68, 0x47, 0xc5, 0xfe, 0xd6, 0x43, + 0x8a, 0xfd, 0xdf, 0x86, 0x0a, 0xe3, 0xc4, 0x57, 0x1f, 0x36, 0x14, 0x26, 0xfb, 0xb0, 0xa1, 0x19, + 0x00, 0xe0, 0x08, 0x2b, 0x91, 0xf5, 0x28, 0x1e, 0x69, 0xd6, 0xe3, 0x02, 0x80, 0x8c, 0xe1, 0x1a, + 0xde, 0x50, 0xbf, 0x73, 0xce, 0x45, 0x36, 0xe1, 0x6a, 0x48, 0xc1, 0x46, 0x2f, 0x74, 0x29, 0xbc, + 0x38, 0xd5, 0xc3, 0xe6, 0xb9, 0x54, 0x61, 0x46, 0x32, 0x6f, 0x96, 0xf1, 0x25, 0xf0, 0x21, 0x85, + 0x5c, 0xf6, 0xff, 0x16, 0x20, 0x66, 0x0c, 0xd1, 0x8f, 0x2c, 0x58, 0x20, 0x89, 0x8f, 0xa9, 0x03, + 0x5f, 0xf2, 0x57, 0xf3, 0x7d, 0xe1, 0x9e, 0xfa, 0x16, 0x3b, 0x7a, 0x4a, 0x4a, 0x76, 0x61, 0x38, + 0xcd, 0x14, 0xfd, 0xbe, 0x05, 0xa7, 0x49, 0xfa, 0x6b, 0x79, 0xbd, 0xe9, 0xaf, 0x4f, 0xfc, 0xb9, + 0x7d, 0xfd, 0xc9, 0x83, 0xfd, 0x95, 0xac, 0xff, 0x23, 0x80, 0xb3, 0xd8, 0xa1, 0x77, 0x61, 0x8a, + 0xf8, 0x9d, 0x20, 0xed, 0x9a, 0x9f, 0x6d, 0xf0, 0x4f, 0x10, 0x22, 0xef, 0x68, 0xcd, 0xef, 0x30, + 0x2c, 0x41, 0xed, 0x9f, 0x15, 0x61, 0x3e, 0xf9, 0x71, 0x80, 0xae, 0xf5, 0x9b, 0xca, 0xac, 0xf5, + 0x13, 0x3a, 0xd2, 0xe2, 0x61, 0xe1, 0x5d, 0xa4, 0x23, 0xa2, 0x11, 0x2b, 0x5a, 0xa8, 0x23, 0xb2, + 0x64, 0xb7, 0xf4, 0x08, 0x3a, 0x22, 0xeb, 0x74, 0x23, 0x2c, 0x74, 0x29, 0x7e, 0xb7, 0xd8, 0xc9, + 0xbb, 0x65, 0xc1, 0x5c, 0xcb, 0xa4, 0xc9, 0xdc, 0x3e, 0x54, 0x8d, 0x7d, 0xd0, 0x9a, 0x78, 0x39, + 0xb7, 0xdc, 0xa3, 0x63, 0x77, 0x4a, 0xfd, 0x27, 0x85, 0x88, 0x62, 0xe2, 0x47, 0x7a, 0x2f, 0xa5, + 0xf5, 0x48, 0xd9, 0x4e, 0x29, 0x2e, 0x03, 0xcd, 0xfe, 0x57, 0x0b, 0xe6, 0x62, 0x05, 0xa8, 0x82, + 0x5b, 0x50, 0xe8, 0x3b, 0xf9, 0xff, 0x16, 0xb8, 0x13, 0x22, 0x60, 0x03, 0x0d, 0x7d, 0x1f, 0xaa, + 0x3d, 0xcf, 0xed, 0x50, 0xc6, 0x9b, 0x1e, 0xd9, 0xd1, 0x7a, 0x92, 0x37, 0x65, 0xb5, 0x74, 0xb0, + 0xbf, 0xb2, 0xb8, 0xa9, 0x60, 0x1a, 0x5e, 0x7f, 0xd0, 0xa3, 0x5c, 0x55, 0x68, 0x63, 0x13, 0x5c, + 0x3e, 0x88, 0xbe, 0x4d, 0x7c, 0xda, 0xf5, 0x86, 0x8c, 0x7e, 0x5d, 0x1f, 0x44, 0xc3, 0x09, 0x1e, + 0xf5, 0x83, 0x68, 0x04, 0x7c, 0xf8, 0x83, 0x68, 0xd8, 0xf7, 0x6b, 0xfb, 0x20, 0x1a, 0xce, 0x70, + 0x44, 0xa4, 0xf2, 0x3f, 0x05, 0x63, 0x15, 0xf1, 0x68, 0xa5, 0xf0, 0x90, 0x68, 0xe5, 0x1e, 0xcc, + 0x38, 0x2e, 0xa7, 0xfe, 0x2e, 0xe9, 0xe9, 0xb4, 0x70, 0xde, 0xb3, 0x18, 0x2e, 0x75, 0x43, 0xe3, + 0xe0, 0x10, 0x11, 0xf5, 0xe0, 0x4c, 0xf0, 0x54, 0xe2, 0x53, 0x12, 0x3d, 0xd5, 0xea, 0x72, 0xa7, + 0x57, 0x83, 0x9c, 0xfe, 0xb5, 0xac, 0x4e, 0x0f, 0x46, 0x11, 0x70, 0x36, 0x28, 0x62, 0x30, 0xc7, + 0x8c, 0x30, 0x3d, 0xb8, 0x11, 0xc7, 0x7c, 0x66, 0x4a, 0x66, 0x36, 0x8c, 0x1a, 0x29, 0x13, 0x14, + 0xc7, 0x79, 0xd8, 0xff, 0x54, 0x84, 0x53, 0x89, 0x93, 0x96, 0x08, 0x47, 0x2a, 0x8f, 0x33, 0x1c, + 0x29, 0x4f, 0x14, 0x8e, 0x64, 0x7b, 0xca, 0x53, 0x13, 0x79, 0xca, 0x6f, 0x28, 0x6f, 0x55, 0xef, + 0xdc, 0xc6, 0xba, 0x2e, 0x29, 0x0f, 0xa5, 0xb9, 0x69, 0x12, 0x71, 0xbc, 0xaf, 0x74, 0x27, 0xda, + 0xe9, 0x6f, 0xd4, 0xb5, 0xab, 0xfd, 0x7a, 0xde, 0x9a, 0xc0, 0x10, 0x40, 0xb9, 0x13, 0x19, 0x04, + 0x9c, 0xc5, 0xae, 0x7e, 0xf3, 0xd3, 0x2f, 0xcf, 0x9e, 0xf8, 0xfc, 0xcb, 0xb3, 0x27, 0xbe, 0xf8, + 0xf2, 0xec, 0x89, 0x1f, 0x1e, 0x9c, 0xb5, 0x3e, 0x3d, 0x38, 0x6b, 0x7d, 0x7e, 0x70, 0xd6, 0xfa, + 0xe2, 0xe0, 0xac, 0xf5, 0x1f, 0x07, 0x67, 0xad, 0x1f, 0x7f, 0x75, 0xf6, 0xc4, 0xdd, 0x67, 0xc6, + 0xf9, 0xdf, 0x55, 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0x63, 0x1c, 0xc8, 0x24, 0xe2, 0x4a, 0x00, + 0x00, } func (m *AnalysisRunArgument) Marshal() (dAtA []byte, err error) { @@ -4547,6 +4579,18 @@ func (m *PromotionStep) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Task != nil { + { + size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } if m.Retry != nil { { size, err := m.Retry.MarshalToSizedBuffer(dAtA[:i]) @@ -4745,6 +4789,39 @@ func (m *PromotionTaskList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *PromotionTaskReference) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PromotionTaskReference) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PromotionTaskReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Kind) + copy(dAtA[i:], m.Kind) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Kind))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *PromotionTaskSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6625,6 +6702,10 @@ func (m *PromotionStep) Size() (n int) { l = m.Retry.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.Task != nil { + l = m.Task.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -6685,6 +6766,19 @@ func (m *PromotionTaskList) Size() (n int) { return n } +func (m *PromotionTaskReference) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Kind) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *PromotionTaskSpec) Size() (n int) { if m == nil { return 0 @@ -7757,6 +7851,7 @@ func (this *PromotionStep) String() string { `As:` + fmt.Sprintf("%v", this.As) + `,`, `Config:` + strings.Replace(fmt.Sprintf("%v", this.Config), "JSON", "v11.JSON", 1) + `,`, `Retry:` + strings.Replace(this.Retry.String(), "PromotionStepRetry", "PromotionStepRetry", 1) + `,`, + `Task:` + strings.Replace(this.Task.String(), "PromotionTaskReference", "PromotionTaskReference", 1) + `,`, `}`, }, "") return s @@ -7810,6 +7905,17 @@ func (this *PromotionTaskList) String() string { }, "") return s } +func (this *PromotionTaskReference) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PromotionTaskReference{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, + `}`, + }, "") + return s +} func (this *PromotionTaskSpec) String() string { if this == nil { return "nil" @@ -15890,6 +15996,42 @@ func (m *PromotionStep) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Task", 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 m.Task == nil { + m.Task = &PromotionTaskReference{} + } + if err := m.Task.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -16363,6 +16505,120 @@ func (m *PromotionTaskList) Unmarshal(dAtA []byte) error { } return nil } +func (m *PromotionTaskReference) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PromotionTaskReference: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PromotionTaskReference: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *PromotionTaskSpec) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/api/v1alpha1/generated.proto b/api/v1alpha1/generated.proto index 46d18cbb3..deddd3992 100644 --- a/api/v1alpha1/generated.proto +++ b/api/v1alpha1/generated.proto @@ -953,9 +953,16 @@ message PromotionStatus { message PromotionStep { // Uses identifies a runner that can execute this step. // + // +kubebuilder:validation:Optional // +kubebuilder:validation:MinLength=1 optional string uses = 1; + // Task is a reference to a PromotionTask that should be deflated into a + // Promotion when it is built from a PromotionTemplate. + // + // +kubebuilder:validation:Optional + optional PromotionTaskReference task = 5; + // As is the alias this step can be referred to as. optional string as = 2; @@ -1047,6 +1054,24 @@ message PromotionTaskList { repeated PromotionTaskList items = 2; } +// PromotionTaskReference describes a reference to a PromotionTask. +message PromotionTaskReference { + // Name is the name of the (Cluster)PromotionTask. + // + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=253 + // +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + optional string name = 1; + + // Kind is the type of the PromotionTask. Can be either PromotionTask or + // ClusterPromotionTask, default is PromotionTask. + // + // +kubebuilder:validation:Optional + // +kubebuilder:validation:Enum=PromotionTask;ClusterPromotionTask + optional string kind = 2; +} + message PromotionTaskSpec { // Inputs specifies the inputs available to the PromotionTask. These inputs // can be specified in the PromotionTemplate as configuration for the task, diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index b11857b4b..516376795 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -1069,6 +1069,11 @@ func (in *PromotionStatus) DeepCopy() *PromotionStatus { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PromotionStep) DeepCopyInto(out *PromotionStep) { *out = *in + if in.Task != nil { + in, out := &in.Task, &out.Task + *out = new(PromotionTaskReference) + **out = **in + } if in.Retry != nil { in, out := &in.Retry, &out.Retry *out = new(PromotionStepRetry) @@ -1184,6 +1189,21 @@ func (in *PromotionTaskList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PromotionTaskReference) DeepCopyInto(out *PromotionTaskReference) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PromotionTaskReference. +func (in *PromotionTaskReference) DeepCopy() *PromotionTaskReference { + if in == nil { + return nil + } + out := new(PromotionTaskReference) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PromotionTaskSpec) DeepCopyInto(out *PromotionTaskSpec) { *out = *in diff --git a/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml b/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml index 460665210..5fb2153d5 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml @@ -139,13 +139,33 @@ spec: ErrorThreshold is reached. type: string type: object + task: + description: |- + Task is a reference to a PromotionTask that should be deflated into a + Promotion when it is built from a PromotionTemplate. + properties: + kind: + description: |- + Kind is the type of the PromotionTask. Can be either PromotionTask or + ClusterPromotionTask, default is PromotionTask. + enum: + - PromotionTask + - ClusterPromotionTask + type: string + name: + description: Name is the name of the (Cluster)PromotionTask. + maxLength: 253 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + required: + - name + type: object uses: description: Uses identifies a runner that can execute this step. minLength: 1 type: string - required: - - uses type: object minItems: 1 type: array diff --git a/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml b/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml index 72c0ccaaf..f7bfbc2a6 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml @@ -139,13 +139,33 @@ spec: ErrorThreshold is reached. type: string type: object + task: + description: |- + Task is a reference to a PromotionTask that should be deflated into a + Promotion when it is built from a PromotionTemplate. + properties: + kind: + description: |- + Kind is the type of the PromotionTask. Can be either PromotionTask or + ClusterPromotionTask, default is PromotionTask. + enum: + - PromotionTask + - ClusterPromotionTask + type: string + name: + description: Name is the name of the (Cluster)PromotionTask. + maxLength: 253 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + required: + - name + type: object uses: description: Uses identifies a runner that can execute this step. minLength: 1 type: string - required: - - uses type: object type: array vars: diff --git a/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml b/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml index 37082f630..0ea220f5f 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml @@ -139,13 +139,33 @@ spec: ErrorThreshold is reached. type: string type: object + task: + description: |- + Task is a reference to a PromotionTask that should be deflated into a + Promotion when it is built from a PromotionTemplate. + properties: + kind: + description: |- + Kind is the type of the PromotionTask. Can be either PromotionTask or + ClusterPromotionTask, default is PromotionTask. + enum: + - PromotionTask + - ClusterPromotionTask + type: string + name: + description: Name is the name of the (Cluster)PromotionTask. + maxLength: 253 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + required: + - name + type: object uses: description: Uses identifies a runner that can execute this step. minLength: 1 type: string - required: - - uses type: object minItems: 1 type: array diff --git a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml index f10b055aa..5775e6252 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml @@ -132,13 +132,33 @@ spec: ErrorThreshold is reached. type: string type: object + task: + description: |- + Task is a reference to a PromotionTask that should be deflated into a + Promotion when it is built from a PromotionTemplate. + properties: + kind: + description: |- + Kind is the type of the PromotionTask. Can be either PromotionTask or + ClusterPromotionTask, default is PromotionTask. + enum: + - PromotionTask + - ClusterPromotionTask + type: string + name: + description: Name is the name of the (Cluster)PromotionTask. + maxLength: 253 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + required: + - name + type: object uses: description: Uses identifies a runner that can execute this step. minLength: 1 type: string - required: - - uses type: object minItems: 1 type: array diff --git a/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json index 6e8611d12..a2b1a771e 100644 --- a/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json @@ -67,15 +67,36 @@ }, "type": "object" }, + "task": { + "description": "Task is a reference to a PromotionTask that should be deflated into a\nPromotion when it is built from a PromotionTemplate.", + "properties": { + "kind": { + "description": "Kind is the type of the PromotionTask. Can be either PromotionTask or\nClusterPromotionTask, default is PromotionTask.", + "enum": [ + "PromotionTask", + "ClusterPromotionTask" + ], + "type": "string" + }, + "name": { + "description": "Name is the name of the (Cluster)PromotionTask.", + "maxLength": 253, + "minLength": 1, + "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, "uses": { "description": "Uses identifies a runner that can execute this step.", "minLength": 1, "type": "string" } }, - "required": [ - "uses" - ], "type": "object" }, "minItems": 1, diff --git a/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json index 6b4d0dd12..c5b19e737 100644 --- a/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json @@ -57,15 +57,36 @@ }, "type": "object" }, + "task": { + "description": "Task is a reference to a PromotionTask that should be deflated into a\nPromotion when it is built from a PromotionTemplate.", + "properties": { + "kind": { + "description": "Kind is the type of the PromotionTask. Can be either PromotionTask or\nClusterPromotionTask, default is PromotionTask.", + "enum": [ + "PromotionTask", + "ClusterPromotionTask" + ], + "type": "string" + }, + "name": { + "description": "Name is the name of the (Cluster)PromotionTask.", + "maxLength": 253, + "minLength": 1, + "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, "uses": { "description": "Uses identifies a runner that can execute this step.", "minLength": 1, "type": "string" } }, - "required": [ - "uses" - ], "type": "object" }, "type": "array" diff --git a/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json index 1be3e7d38..9b788665c 100644 --- a/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json @@ -67,15 +67,36 @@ }, "type": "object" }, + "task": { + "description": "Task is a reference to a PromotionTask that should be deflated into a\nPromotion when it is built from a PromotionTemplate.", + "properties": { + "kind": { + "description": "Kind is the type of the PromotionTask. Can be either PromotionTask or\nClusterPromotionTask, default is PromotionTask.", + "enum": [ + "PromotionTask", + "ClusterPromotionTask" + ], + "type": "string" + }, + "name": { + "description": "Name is the name of the (Cluster)PromotionTask.", + "maxLength": 253, + "minLength": 1, + "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, "uses": { "description": "Uses identifies a runner that can execute this step.", "minLength": 1, "type": "string" } }, - "required": [ - "uses" - ], "type": "object" }, "minItems": 1, diff --git a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json index ebdd3ccb2..22bb3c22b 100644 --- a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json @@ -52,15 +52,36 @@ }, "type": "object" }, + "task": { + "description": "Task is a reference to a PromotionTask that should be deflated into a\nPromotion when it is built from a PromotionTemplate.", + "properties": { + "kind": { + "description": "Kind is the type of the PromotionTask. Can be either PromotionTask or\nClusterPromotionTask, default is PromotionTask.", + "enum": [ + "PromotionTask", + "ClusterPromotionTask" + ], + "type": "string" + }, + "name": { + "description": "Name is the name of the (Cluster)PromotionTask.", + "maxLength": 253, + "minLength": 1, + "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, "uses": { "description": "Uses identifies a runner that can execute this step.", "minLength": 1, "type": "string" } }, - "required": [ - "uses" - ], "type": "object" }, "minItems": 1, diff --git a/ui/src/gen/v1alpha1/generated_pb.ts b/ui/src/gen/v1alpha1/generated_pb.ts index f56196b7e..585b7d1f9 100644 --- a/ui/src/gen/v1alpha1/generated_pb.ts +++ b/ui/src/gen/v1alpha1/generated_pb.ts @@ -18,7 +18,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file v1alpha1/generated.proto. */ export const file_v1alpha1_generated: GenFile = /*@__PURE__*/ - fileDesc("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKrAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEk0KBWl0ZW1zGAIgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrTGlzdCJJCgxDdXJyZW50U3RhZ2USOQoFc2luY2UYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSK2AgoTRGlzY292ZXJlZEFydGlmYWN0cxJACgxkaXNjb3ZlcmVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJFCgNnaXQYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0RGlzY292ZXJ5UmVzdWx0EkoKBmltYWdlcxgCIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZURpc2NvdmVyeVJlc3VsdBJKCgZjaGFydHMYAyADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnREaXNjb3ZlcnlSZXN1bHQisAEKEERpc2NvdmVyZWRDb21taXQSCgoCaWQYASABKAkSDgoGYnJhbmNoGAIgASgJEgsKA3RhZxgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEg4KBmF1dGhvchgFIAEoCRIRCgljb21taXR0ZXIYBiABKAkSPwoLY3JlYXRvckRhdGUYByABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKKAQoYRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlEgsKA3RhZxgBIAEoCRIOCgZkaWdlc3QYAiABKAkSEgoKZ2l0UmVwb1VSTBgDIAEoCRI9CgljcmVhdGVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKiAwoHRnJlaWdodBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEg0KBWFsaWFzGAcgASgJEkMKBm9yaWdpbhgJIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAyADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBSADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQSQwoGc3RhdHVzGAYgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMirQIKEUZyZWlnaHRDb2xsZWN0aW9uEgoKAmlkGAMgASgJElEKBWl0ZW1zGAEgAygLMkIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uLkl0ZW1zRW50cnkSUwoTdmVyaWZpY2F0aW9uSGlzdG9yeRgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb25JbmZvGmQKCkl0ZW1zRW50cnkSCwoDa2V5GAEgASgJEkUKBXZhbHVlGAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2U6AjgBIo0BCgtGcmVpZ2h0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0IisKDUZyZWlnaHRPcmlnaW4SDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJIqECChBGcmVpZ2h0UmVmZXJlbmNlEgwKBG5hbWUYASABKAkSQwoGb3JpZ2luGAggASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAMgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydCKcAQoORnJlaWdodFJlcXVlc3QSQwoGb3JpZ2luGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SRQoHc291cmNlcxgCIAEoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U291cmNlcyJ6Cg5GcmVpZ2h0U291cmNlcxIOCgZkaXJlY3QYASABKAgSDgoGc3RhZ2VzGAIgAygJEkgKEHJlcXVpcmVkU29ha1RpbWUYAyABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24i1wQKDUZyZWlnaHRTdGF0dXMSWQoLY3VycmVudGx5SW4YAyADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5DdXJyZW50bHlJbkVudHJ5ElcKCnZlcmlmaWVkSW4YASADKAsyQy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5WZXJpZmllZEluRW50cnkSWQoLYXBwcm92ZWRGb3IYAiADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5BcHByb3ZlZEZvckVudHJ5GmYKEEN1cnJlbnRseUluRW50cnkSCwoDa2V5GAEgASgJEkEKBXZhbHVlGAIgASgLMjIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkN1cnJlbnRTdGFnZToCOAEaZgoPVmVyaWZpZWRJbkVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmllZFN0YWdlOgI4ARpnChBBcHByb3ZlZEZvckVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BcHByb3ZlZFN0YWdlOgI4ASJ5CglHaXRDb21taXQSDwoHcmVwb1VSTBgBIAEoCRIKCgJpZBgCIAEoCRIOCgZicmFuY2gYAyABKAkSCwoDdGFnGAQgASgJEg8KB21lc3NhZ2UYBiABKAkSDgoGYXV0aG9yGAcgASgJEhEKCWNvbW1pdHRlchgIIAEoCSJuChJHaXREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRJHCgdjb21taXRzGAIgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRDb21taXQijgIKD0dpdFN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEh8KF2NvbW1pdFNlbGVjdGlvblN0cmF0ZWd5GAIgASgJEg4KBmJyYW5jaBgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAsgASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAcgASgIEhQKDGluY2x1ZGVQYXRocxgIIAMoCRIUCgxleGNsdWRlUGF0aHMYCSADKAkSFgoOZGlzY292ZXJ5TGltaXQYCiABKAUiyAEKBkhlYWx0aBIOCgZzdGF0dXMYASABKAkSDgoGaXNzdWVzGAIgAygJEk4KBmNvbmZpZxgEIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04STgoGb3V0cHV0GAUgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJvCg9IZWFsdGhDaGVja1N0ZXASDAoEdXNlcxgBIAEoCRJOCgZjb25maWcYAiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIkkKBUltYWdlEg8KB3JlcG9VUkwYASABKAkSEgoKZ2l0UmVwb1VSTBgCIAEoCRILCgN0YWcYAyABKAkSDgoGZGlnZXN0GAQgASgJIo0BChRJbWFnZURpc2NvdmVyeVJlc3VsdBIPCgdyZXBvVVJMGAEgASgJEhAKCHBsYXRmb3JtGAIgASgJElIKCnJlZmVyZW5jZXMYAyADKAsyPi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlIvkBChFJbWFnZVN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSHgoWaW1hZ2VTZWxlY3Rpb25TdHJhdGVneRgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAogASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSEAoIcGxhdGZvcm0YByABKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAggASgIEhYKDmRpc2NvdmVyeUxpbWl0GAkgASgFItMBCgdQcm9qZWN0EkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPwoEc3BlYxgCIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0U3BlYxJDCgZzdGF0dXMYAyABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFN0YXR1cyKNAQoLUHJvamVjdExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdCJfCgtQcm9qZWN0U3BlYxJQChFwcm9tb3Rpb25Qb2xpY2llcxgBIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25Qb2xpY3kidAoNUHJvamVjdFN0YXR1cxJDCgpjb25kaXRpb25zGAMgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJItkBCglQcm9tb3Rpb24SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cyKRAQoNUHJvbW90aW9uTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb24iPgoPUHJvbW90aW9uUG9saWN5Eg0KBXN0YWdlGAEgASgJEhwKFGF1dG9Qcm9tb3Rpb25FbmFibGVkGAIgASgIIvIBChJQcm9tb3Rpb25SZWZlcmVuY2USDAoEbmFtZRgBIAEoCRJHCgdmcmVpZ2h0GAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cxI+CgpmaW5pc2hlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiugEKDVByb21vdGlvblNwZWMSDQoFc3RhZ2UYASABKAkSDwoHZnJlaWdodBgCIAEoCRJFCgR2YXJzGAQgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAMgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAitwQKD1Byb21vdGlvblN0YXR1cxIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBCABKAkSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJHCgdmcmVpZ2h0GAUgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USUgoRZnJlaWdodENvbGxlY3Rpb24YByABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SSwoMaGVhbHRoQ2hlY2tzGAggAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aENoZWNrU3RlcBI+CgpmaW5pc2hlZEF0GAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSEwoLY3VycmVudFN0ZXAYCSABKAMSWgoVc3RlcEV4ZWN1dGlvbk1ldGFkYXRhGAsgAygLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0ZXBFeGVjdXRpb25NZXRhZGF0YRJNCgVzdGF0ZRgKIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04iwgEKDVByb21vdGlvblN0ZXASDAoEdXNlcxgBIAEoCRIKCgJhcxgCIAEoCRJHCgVyZXRyeRgEIAEoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwUmV0cnkSTgoGY29uZmlnGAMgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJtChJQcm9tb3Rpb25TdGVwUmV0cnkSPwoHdGltZW91dBgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbhIWCg5lcnJvclRocmVzaG9sZBgCIAEoDSKaAQoNUHJvbW90aW9uVGFzaxJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkUKBHNwZWMYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza1NwZWMiMwoSUHJvbW90aW9uVGFza0lucHV0EgwKBG5hbWUYASABKAkSDwoHZGVmYXVsdBgCIAEoCSKdAQoRUHJvbW90aW9uVGFza0xpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESRgoFaXRlbXMYAiADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza0xpc3QioQEKEVByb21vdGlvblRhc2tTcGVjEkgKBmlucHV0cxgBIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrSW5wdXQSQgoFc3RlcHMYAiADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCJeChFQcm9tb3Rpb25UZW1wbGF0ZRJJCgRzcGVjGAEgASgLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRlbXBsYXRlU3BlYyKiAQoVUHJvbW90aW9uVGVtcGxhdGVTcGVjEkUKBHZhcnMYAiADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVmFyaWFibGUSQgoFc3RlcHMYASADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCIwChFQcm9tb3Rpb25WYXJpYWJsZRIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJIuYBChBSZXBvU3Vic2NyaXB0aW9uEkIKA2dpdBgBIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRTdWJzY3JpcHRpb24SRgoFaW1hZ2UYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2VTdWJzY3JpcHRpb24SRgoFY2hhcnQYAyABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnRTdWJzY3JpcHRpb24izQEKBVN0YWdlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPQoEc3BlYxgCIAEoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVNwZWMSQQoGc3RhdHVzGAMgASgLMjEuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlU3RhdHVzIokBCglTdGFnZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESOgoFaXRlbXMYAiADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2UiiAIKCVN0YWdlU3BlYxINCgVzaGFyZBgEIAEoCRJOChByZXF1ZXN0ZWRGcmVpZ2h0GAUgAygLMjQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZXF1ZXN0ElIKEXByb21vdGlvblRlbXBsYXRlGAYgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRlbXBsYXRlEkgKDHZlcmlmaWNhdGlvbhgDIAEoCzIyLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb24i9gMKC1N0YWdlU3RhdHVzEkMKCmNvbmRpdGlvbnMYDSADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgLIAEoCRINCgVwaGFzZRgBIAEoCRJPCg5mcmVpZ2h0SGlzdG9yeRgEIAMoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0Q29sbGVjdGlvbhIWCg5mcmVpZ2h0U3VtbWFyeRgMIAEoCRI8CgZoZWFsdGgYCCABKAsyLC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSGVhbHRoEg8KB21lc3NhZ2UYCSABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAYgASgDElIKEGN1cnJlbnRQcm9tb3Rpb24YByABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUmVmZXJlbmNlEk8KDWxhc3RQcm9tb3Rpb24YCiABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUmVmZXJlbmNlItoBChVTdGVwRXhlY3V0aW9uTWV0YWRhdGESDQoFYWxpYXMYASABKAkSPQoJc3RhcnRlZEF0GAIgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSPgoKZmluaXNoZWRBdBgDIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhIKCmVycm9yQ291bnQYBCABKA0SDgoGc3RhdHVzGAUgASgJEg8KB21lc3NhZ2UYBiABKAkiiwIKDFZlcmlmaWNhdGlvbhJaChFhbmFseXNpc1RlbXBsYXRlcxgBIAMoCzI/LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1RlbXBsYXRlUmVmZXJlbmNlElYKE2FuYWx5c2lzUnVuTWV0YWRhdGEYAiABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YRJHCgRhcmdzGAMgAygLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuQXJndW1lbnQinQIKEFZlcmlmaWNhdGlvbkluZm8SCgoCaWQYBCABKAkSDQoFYWN0b3IYByABKAkSPQoJc3RhcnRUaW1lGAUgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJPCgthbmFseXNpc1J1bhgDIAEoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1blJlZmVyZW5jZRI+CgpmaW5pc2hUaW1lGAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUilAEKDVZlcmlmaWVkU3RhZ2USPgoKdmVyaWZpZWRBdBgBIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEkMKC2xvbmdlc3RTb2FrGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uItkBCglXYXJlaG91c2USQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVN0YXR1cyKRAQoNV2FyZWhvdXNlTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2UizgEKDVdhcmVob3VzZVNwZWMSDQoFc2hhcmQYAiABKAkSQAoIaW50ZXJ2YWwYBCABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SHQoVZnJlaWdodENyZWF0aW9uUG9saWN5GAMgASgJEk0KDXN1YnNjcmlwdGlvbnMYASADKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUmVwb1N1YnNjcmlwdGlvbiL9AQoPV2FyZWhvdXNlU3RhdHVzEkMKCmNvbmRpdGlvbnMYCSADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgGIAEoCRIaChJvYnNlcnZlZEdlbmVyYXRpb24YBCABKAMSFQoNbGFzdEZyZWlnaHRJRBgIIAEoCRJWChNkaXNjb3ZlcmVkQXJ0aWZhY3RzGAcgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRBcnRpZmFjdHNClwIKKGNvbS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTFCDkdlbmVyYXRlZFByb3RvUAFaJGdpdGh1Yi5jb20vYWt1aXR5L2thcmdvL2FwaS92MWFscGhhMaICBUdDQUtBqgIkR2l0aHViLkNvbS5Ba3VpdHkuS2FyZ28uQXBpLlYxYWxwaGExygIkR2l0aHViXENvbVxBa3VpdHlcS2FyZ29cQXBpXFYxYWxwaGEx4gIwR2l0aHViXENvbVxBa3VpdHlcS2FyZ29cQXBpXFYxYWxwaGExXEdQQk1ldGFkYXRh6gIpR2l0aHViOjpDb206OkFrdWl0eTo6S2FyZ286OkFwaTo6VjFhbHBoYTE", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]); + fileDesc("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKrAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEk0KBWl0ZW1zGAIgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrTGlzdCJJCgxDdXJyZW50U3RhZ2USOQoFc2luY2UYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSK2AgoTRGlzY292ZXJlZEFydGlmYWN0cxJACgxkaXNjb3ZlcmVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJFCgNnaXQYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0RGlzY292ZXJ5UmVzdWx0EkoKBmltYWdlcxgCIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZURpc2NvdmVyeVJlc3VsdBJKCgZjaGFydHMYAyADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnREaXNjb3ZlcnlSZXN1bHQisAEKEERpc2NvdmVyZWRDb21taXQSCgoCaWQYASABKAkSDgoGYnJhbmNoGAIgASgJEgsKA3RhZxgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEg4KBmF1dGhvchgFIAEoCRIRCgljb21taXR0ZXIYBiABKAkSPwoLY3JlYXRvckRhdGUYByABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKKAQoYRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlEgsKA3RhZxgBIAEoCRIOCgZkaWdlc3QYAiABKAkSEgoKZ2l0UmVwb1VSTBgDIAEoCRI9CgljcmVhdGVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKiAwoHRnJlaWdodBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEg0KBWFsaWFzGAcgASgJEkMKBm9yaWdpbhgJIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAyADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBSADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQSQwoGc3RhdHVzGAYgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMirQIKEUZyZWlnaHRDb2xsZWN0aW9uEgoKAmlkGAMgASgJElEKBWl0ZW1zGAEgAygLMkIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uLkl0ZW1zRW50cnkSUwoTdmVyaWZpY2F0aW9uSGlzdG9yeRgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb25JbmZvGmQKCkl0ZW1zRW50cnkSCwoDa2V5GAEgASgJEkUKBXZhbHVlGAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2U6AjgBIo0BCgtGcmVpZ2h0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0IisKDUZyZWlnaHRPcmlnaW4SDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJIqECChBGcmVpZ2h0UmVmZXJlbmNlEgwKBG5hbWUYASABKAkSQwoGb3JpZ2luGAggASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAMgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydCKcAQoORnJlaWdodFJlcXVlc3QSQwoGb3JpZ2luGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SRQoHc291cmNlcxgCIAEoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U291cmNlcyJ6Cg5GcmVpZ2h0U291cmNlcxIOCgZkaXJlY3QYASABKAgSDgoGc3RhZ2VzGAIgAygJEkgKEHJlcXVpcmVkU29ha1RpbWUYAyABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24i1wQKDUZyZWlnaHRTdGF0dXMSWQoLY3VycmVudGx5SW4YAyADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5DdXJyZW50bHlJbkVudHJ5ElcKCnZlcmlmaWVkSW4YASADKAsyQy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5WZXJpZmllZEluRW50cnkSWQoLYXBwcm92ZWRGb3IYAiADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5BcHByb3ZlZEZvckVudHJ5GmYKEEN1cnJlbnRseUluRW50cnkSCwoDa2V5GAEgASgJEkEKBXZhbHVlGAIgASgLMjIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkN1cnJlbnRTdGFnZToCOAEaZgoPVmVyaWZpZWRJbkVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmllZFN0YWdlOgI4ARpnChBBcHByb3ZlZEZvckVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BcHByb3ZlZFN0YWdlOgI4ASJ5CglHaXRDb21taXQSDwoHcmVwb1VSTBgBIAEoCRIKCgJpZBgCIAEoCRIOCgZicmFuY2gYAyABKAkSCwoDdGFnGAQgASgJEg8KB21lc3NhZ2UYBiABKAkSDgoGYXV0aG9yGAcgASgJEhEKCWNvbW1pdHRlchgIIAEoCSJuChJHaXREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRJHCgdjb21taXRzGAIgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRDb21taXQijgIKD0dpdFN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEh8KF2NvbW1pdFNlbGVjdGlvblN0cmF0ZWd5GAIgASgJEg4KBmJyYW5jaBgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAsgASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAcgASgIEhQKDGluY2x1ZGVQYXRocxgIIAMoCRIUCgxleGNsdWRlUGF0aHMYCSADKAkSFgoOZGlzY292ZXJ5TGltaXQYCiABKAUiyAEKBkhlYWx0aBIOCgZzdGF0dXMYASABKAkSDgoGaXNzdWVzGAIgAygJEk4KBmNvbmZpZxgEIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04STgoGb3V0cHV0GAUgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJvCg9IZWFsdGhDaGVja1N0ZXASDAoEdXNlcxgBIAEoCRJOCgZjb25maWcYAiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIkkKBUltYWdlEg8KB3JlcG9VUkwYASABKAkSEgoKZ2l0UmVwb1VSTBgCIAEoCRILCgN0YWcYAyABKAkSDgoGZGlnZXN0GAQgASgJIo0BChRJbWFnZURpc2NvdmVyeVJlc3VsdBIPCgdyZXBvVVJMGAEgASgJEhAKCHBsYXRmb3JtGAIgASgJElIKCnJlZmVyZW5jZXMYAyADKAsyPi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlIvkBChFJbWFnZVN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSHgoWaW1hZ2VTZWxlY3Rpb25TdHJhdGVneRgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAogASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSEAoIcGxhdGZvcm0YByABKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAggASgIEhYKDmRpc2NvdmVyeUxpbWl0GAkgASgFItMBCgdQcm9qZWN0EkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPwoEc3BlYxgCIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0U3BlYxJDCgZzdGF0dXMYAyABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFN0YXR1cyKNAQoLUHJvamVjdExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdCJfCgtQcm9qZWN0U3BlYxJQChFwcm9tb3Rpb25Qb2xpY2llcxgBIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25Qb2xpY3kidAoNUHJvamVjdFN0YXR1cxJDCgpjb25kaXRpb25zGAMgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJItkBCglQcm9tb3Rpb24SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cyKRAQoNUHJvbW90aW9uTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb24iPgoPUHJvbW90aW9uUG9saWN5Eg0KBXN0YWdlGAEgASgJEhwKFGF1dG9Qcm9tb3Rpb25FbmFibGVkGAIgASgIIvIBChJQcm9tb3Rpb25SZWZlcmVuY2USDAoEbmFtZRgBIAEoCRJHCgdmcmVpZ2h0GAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cxI+CgpmaW5pc2hlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiugEKDVByb21vdGlvblNwZWMSDQoFc3RhZ2UYASABKAkSDwoHZnJlaWdodBgCIAEoCRJFCgR2YXJzGAQgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAMgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAitwQKD1Byb21vdGlvblN0YXR1cxIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBCABKAkSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJHCgdmcmVpZ2h0GAUgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USUgoRZnJlaWdodENvbGxlY3Rpb24YByABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SSwoMaGVhbHRoQ2hlY2tzGAggAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aENoZWNrU3RlcBI+CgpmaW5pc2hlZEF0GAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSEwoLY3VycmVudFN0ZXAYCSABKAMSWgoVc3RlcEV4ZWN1dGlvbk1ldGFkYXRhGAsgAygLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0ZXBFeGVjdXRpb25NZXRhZGF0YRJNCgVzdGF0ZRgKIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ijgIKDVByb21vdGlvblN0ZXASDAoEdXNlcxgBIAEoCRJKCgR0YXNrGAUgASgLMjwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tSZWZlcmVuY2USCgoCYXMYAiABKAkSRwoFcmV0cnkYBCABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcFJldHJ5Ek4KBmNvbmZpZxgDIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ibQoSUHJvbW90aW9uU3RlcFJldHJ5Ej8KB3RpbWVvdXQYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SFgoOZXJyb3JUaHJlc2hvbGQYAiABKA0imgEKDVByb21vdGlvblRhc2sSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJFCgRzcGVjGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tTcGVjIjMKElByb21vdGlvblRhc2tJbnB1dBIMCgRuYW1lGAEgASgJEg8KB2RlZmF1bHQYAiABKAkinQEKEVByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEkYKBWl0ZW1zGAIgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tMaXN0IjQKFlByb21vdGlvblRhc2tSZWZlcmVuY2USDAoEbmFtZRgBIAEoCRIMCgRraW5kGAIgASgJIqEBChFQcm9tb3Rpb25UYXNrU3BlYxJICgZpbnB1dHMYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza0lucHV0EkIKBXN0ZXBzGAIgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAiXgoRUHJvbW90aW9uVGVtcGxhdGUSSQoEc3BlYxgBIAEoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZVNwZWMiogEKFVByb21vdGlvblRlbXBsYXRlU3BlYxJFCgR2YXJzGAIgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAEgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAiMAoRUHJvbW90aW9uVmFyaWFibGUSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSLmAQoQUmVwb1N1YnNjcmlwdGlvbhJCCgNnaXQYASABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0U3Vic2NyaXB0aW9uEkYKBWltYWdlGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlU3Vic2NyaXB0aW9uEkYKBWNoYXJ0GAMgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0U3Vic2NyaXB0aW9uIs0BCgVTdGFnZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEj0KBHNwZWMYAiABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2VTcGVjEkEKBnN0YXR1cxgDIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVN0YXR1cyKJAQoJU3RhZ2VMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjoKBWl0ZW1zGAIgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlIogCCglTdGFnZVNwZWMSDQoFc2hhcmQYBCABKAkSTgoQcmVxdWVzdGVkRnJlaWdodBgFIAMoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVxdWVzdBJSChFwcm9tb3Rpb25UZW1wbGF0ZRgGIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZRJICgx2ZXJpZmljYXRpb24YAyABKAsyMi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpY2F0aW9uIvYDCgtTdGFnZVN0YXR1cxJDCgpjb25kaXRpb25zGA0gAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYCyABKAkSDQoFcGhhc2UYASABKAkSTwoOZnJlaWdodEhpc3RvcnkYBCADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SFgoOZnJlaWdodFN1bW1hcnkYDCABKAkSPAoGaGVhbHRoGAggASgLMiwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aBIPCgdtZXNzYWdlGAkgASgJEhoKEm9ic2VydmVkR2VuZXJhdGlvbhgGIAEoAxJSChBjdXJyZW50UHJvbW90aW9uGAcgASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZRJPCg1sYXN0UHJvbW90aW9uGAogASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZSLaAQoVU3RlcEV4ZWN1dGlvbk1ldGFkYXRhEg0KBWFsaWFzGAEgASgJEj0KCXN0YXJ0ZWRBdBgCIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEj4KCmZpbmlzaGVkQXQYAyABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRISCgplcnJvckNvdW50GAQgASgNEg4KBnN0YXR1cxgFIAEoCRIPCgdtZXNzYWdlGAYgASgJIosCCgxWZXJpZmljYXRpb24SWgoRYW5hbHlzaXNUZW1wbGF0ZXMYASADKAsyPy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNUZW1wbGF0ZVJlZmVyZW5jZRJWChNhbmFseXNpc1J1bk1ldGFkYXRhGAIgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGESRwoEYXJncxgDIAMoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1bkFyZ3VtZW50Ip0CChBWZXJpZmljYXRpb25JbmZvEgoKAmlkGAQgASgJEg0KBWFjdG9yGAcgASgJEj0KCXN0YXJ0VGltZRgFIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEg0KBXBoYXNlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSTwoLYW5hbHlzaXNSdW4YAyABKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5SZWZlcmVuY2USPgoKZmluaXNoVGltZRgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIpQBCg1WZXJpZmllZFN0YWdlEj4KCnZlcmlmaWVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJDCgtsb25nZXN0U29haxgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbiLZAQoJV2FyZWhvdXNlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESQQoEc3BlYxgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTcGVjEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTdGF0dXMikQEKDVdhcmVob3VzZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPgoFaXRlbXMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlIs4BCg1XYXJlaG91c2VTcGVjEg0KBXNoYXJkGAIgASgJEkAKCGludGVydmFsGAQgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uEh0KFWZyZWlnaHRDcmVhdGlvblBvbGljeRgDIAEoCRJNCg1zdWJzY3JpcHRpb25zGAEgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlJlcG9TdWJzY3JpcHRpb24i/QEKD1dhcmVob3VzZVN0YXR1cxJDCgpjb25kaXRpb25zGAkgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBiABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAQgASgDEhUKDWxhc3RGcmVpZ2h0SUQYCCABKAkSVgoTZGlzY292ZXJlZEFydGlmYWN0cxgHIAEoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQXJ0aWZhY3RzQpcCCihjb20uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExQg5HZW5lcmF0ZWRQcm90b1ABWiRnaXRodWIuY29tL2FrdWl0eS9rYXJnby9hcGkvdjFhbHBoYTGiAgVHQ0FLQaoCJEdpdGh1Yi5Db20uQWt1aXR5LkthcmdvLkFwaS5WMWFscGhhMcoCJEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMeICMEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMVxHUEJNZXRhZGF0YeoCKUdpdGh1Yjo6Q29tOjpBa3VpdHk6OkthcmdvOjpBcGk6OlYxYWxwaGEx", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]); /** * AnalysisRunArgument represents an argument to be added to an AnalysisRun. @@ -2031,12 +2031,23 @@ export type PromotionStep = Message<"github.com.akuity.kargo.api.v1alpha1.Promot /** * Uses identifies a runner that can execute this step. * + * +kubebuilder:validation:Optional * +kubebuilder:validation:MinLength=1 * * @generated from field: optional string uses = 1; */ uses: string; + /** + * Task is a reference to a PromotionTask that should be deflated into a + * Promotion when it is built from a PromotionTemplate. + * + * +kubebuilder:validation:Optional + * + * @generated from field: optional github.com.akuity.kargo.api.v1alpha1.PromotionTaskReference task = 5; + */ + task?: PromotionTaskReference; + /** * As is the alias this step can be referred to as. * @@ -2219,6 +2230,43 @@ export type PromotionTaskList = Message<"github.com.akuity.kargo.api.v1alpha1.Pr export const PromotionTaskListSchema: GenMessage = /*@__PURE__*/ messageDesc(file_v1alpha1_generated, 47); +/** + * PromotionTaskReference describes a reference to a PromotionTask. + * + * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionTaskReference + */ +export type PromotionTaskReference = Message<"github.com.akuity.kargo.api.v1alpha1.PromotionTaskReference"> & { + /** + * Name is the name of the (Cluster)PromotionTask. + * + * +kubebuilder:validation:Required + * +kubebuilder:validation:MinLength=1 + * +kubebuilder:validation:MaxLength=253 + * +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + * + * @generated from field: optional string name = 1; + */ + name: string; + + /** + * Kind is the type of the PromotionTask. Can be either PromotionTask or + * ClusterPromotionTask, default is PromotionTask. + * + * +kubebuilder:validation:Optional + * +kubebuilder:validation:Enum=PromotionTask;ClusterPromotionTask + * + * @generated from field: optional string kind = 2; + */ + kind: string; +}; + +/** + * Describes the message github.com.akuity.kargo.api.v1alpha1.PromotionTaskReference. + * Use `create(PromotionTaskReferenceSchema)` to create a new message. + */ +export const PromotionTaskReferenceSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_v1alpha1_generated, 48); + /** * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionTaskSpec */ @@ -2250,7 +2298,7 @@ export type PromotionTaskSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionTaskSpecSchema)` to create a new message. */ export const PromotionTaskSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 48); + messageDesc(file_v1alpha1_generated, 49); /** * PromotionTemplate defines a template for a Promotion that can be used to @@ -2270,7 +2318,7 @@ export type PromotionTemplate = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionTemplateSchema)` to create a new message. */ export const PromotionTemplateSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 49); + messageDesc(file_v1alpha1_generated, 50); /** * PromotionTemplateSpec describes the (partial) specification of a Promotion @@ -2305,7 +2353,7 @@ export type PromotionTemplateSpec = Message<"github.com.akuity.kargo.api.v1alpha * Use `create(PromotionTemplateSpecSchema)` to create a new message. */ export const PromotionTemplateSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 50); + messageDesc(file_v1alpha1_generated, 51); /** * PromotionVariable describes a single variable that may be referenced by @@ -2339,7 +2387,7 @@ export type PromotionVariable = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionVariableSchema)` to create a new message. */ export const PromotionVariableSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 51); + messageDesc(file_v1alpha1_generated, 52); /** * RepoSubscription describes a subscription to ONE OF a Git repository, a @@ -2375,7 +2423,7 @@ export type RepoSubscription = Message<"github.com.akuity.kargo.api.v1alpha1.Rep * Use `create(RepoSubscriptionSchema)` to create a new message. */ export const RepoSubscriptionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 52); + messageDesc(file_v1alpha1_generated, 53); /** * Stage is the Kargo API's main type. @@ -2411,7 +2459,7 @@ export type Stage = Message<"github.com.akuity.kargo.api.v1alpha1.Stage"> & { * Use `create(StageSchema)` to create a new message. */ export const StageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 53); + messageDesc(file_v1alpha1_generated, 54); /** * StageList is a list of Stage resources. @@ -2435,7 +2483,7 @@ export type StageList = Message<"github.com.akuity.kargo.api.v1alpha1.StageList" * Use `create(StageListSchema)` to create a new message. */ export const StageListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 54); + messageDesc(file_v1alpha1_generated, 55); /** * StageSpec describes the sources of Freight used by a Stage and how to @@ -2493,7 +2541,7 @@ export type StageSpec = Message<"github.com.akuity.kargo.api.v1alpha1.StageSpec" * Use `create(StageSpecSchema)` to create a new message. */ export const StageSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 55); + messageDesc(file_v1alpha1_generated, 56); /** * StageStatus describes a Stages's current and recent Freight, health, and @@ -2600,7 +2648,7 @@ export type StageStatus = Message<"github.com.akuity.kargo.api.v1alpha1.StageSta * Use `create(StageStatusSchema)` to create a new message. */ export const StageStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 56); + messageDesc(file_v1alpha1_generated, 57); /** * StepExecutionMetadata tracks metadata pertaining to the execution of @@ -2659,7 +2707,7 @@ export type StepExecutionMetadata = Message<"github.com.akuity.kargo.api.v1alpha * Use `create(StepExecutionMetadataSchema)` to create a new message. */ export const StepExecutionMetadataSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 57); + messageDesc(file_v1alpha1_generated, 58); /** * Verification describes how to verify that a Promotion has been successful @@ -2698,7 +2746,7 @@ export type Verification = Message<"github.com.akuity.kargo.api.v1alpha1.Verific * Use `create(VerificationSchema)` to create a new message. */ export const VerificationSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 58); + messageDesc(file_v1alpha1_generated, 59); /** * VerificationInfo contains the details of an instance of a Verification @@ -2768,7 +2816,7 @@ export type VerificationInfo = Message<"github.com.akuity.kargo.api.v1alpha1.Ver * Use `create(VerificationInfoSchema)` to create a new message. */ export const VerificationInfoSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 59); + messageDesc(file_v1alpha1_generated, 60); /** * VerifiedStage describes a Stage in which Freight has been verified. @@ -2800,7 +2848,7 @@ export type VerifiedStage = Message<"github.com.akuity.kargo.api.v1alpha1.Verifi * Use `create(VerifiedStageSchema)` to create a new message. */ export const VerifiedStageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 60); + messageDesc(file_v1alpha1_generated, 61); /** * Warehouse is a source of Freight. @@ -2835,7 +2883,7 @@ export type Warehouse = Message<"github.com.akuity.kargo.api.v1alpha1.Warehouse" * Use `create(WarehouseSchema)` to create a new message. */ export const WarehouseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 61); + messageDesc(file_v1alpha1_generated, 62); /** * WarehouseList is a list of Warehouse resources. @@ -2859,7 +2907,7 @@ export type WarehouseList = Message<"github.com.akuity.kargo.api.v1alpha1.Wareho * Use `create(WarehouseListSchema)` to create a new message. */ export const WarehouseListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 62); + messageDesc(file_v1alpha1_generated, 63); /** * WarehouseSpec describes sources of versioned artifacts to be included in @@ -2925,7 +2973,7 @@ export type WarehouseSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Wareho * Use `create(WarehouseSpecSchema)` to create a new message. */ export const WarehouseSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 63); + messageDesc(file_v1alpha1_generated, 64); /** * WarehouseStatus describes a Warehouse's most recently observed state. @@ -2984,5 +3032,5 @@ export type WarehouseStatus = Message<"github.com.akuity.kargo.api.v1alpha1.Ware * Use `create(WarehouseStatusSchema)` to create a new message. */ export const WarehouseStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 64); + messageDesc(file_v1alpha1_generated, 65); From 2845b7f91e9ea7899cd5d69de59e32013dc4090a Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Wed, 11 Dec 2024 16:30:34 +0100 Subject: [PATCH 07/38] feat(api): add validation rules for Promotion steps - `PromotionTemplate` steps can contain either a reference to `uses` OR to a `task`. - `PromotionTask` steps can not contain a reference to another `task`, but must contain a `uses` reference. - `Promotion` steps can not contain a reference to a `task` (as we expect a `Promotion` to contain deflated tasks), but must contain a `uses` reference. - Small other tweaks, to e.g. ensure we limit the max lenght of fields that contain name references to Kubernetes objects. Signed-off-by: Hidde Beydals --- api/v1alpha1/promotion_task_types.go | 3 ++- api/v1alpha1/promotion_types.go | 15 +++++++++++---- api/v1alpha1/stage_types.go | 1 + 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/api/v1alpha1/promotion_task_types.go b/api/v1alpha1/promotion_task_types.go index 8e2b79029..17a3e1d88 100644 --- a/api/v1alpha1/promotion_task_types.go +++ b/api/v1alpha1/promotion_task_types.go @@ -30,7 +30,8 @@ type PromotionTaskSpec struct { // // +kubebuilder:validation:Required // +kubebuilder:validation:MinItems=1 - Steps []PromotionStep `json:"steps,omitempty" protobuf:"bytes,2,rep,name=steps"` + // +kubebuilder:validation:items:XValidation:message="PromotionTask step must have uses set and must not reference another task",rule="has(self.uses) && !has(self.task)" + Steps []PromotionStep `json:"steps" protobuf:"bytes,2,rep,name=steps"` } // PromotionTaskInput defines an input parameter for a PromotionTask. This input diff --git a/api/v1alpha1/promotion_types.go b/api/v1alpha1/promotion_types.go index c45c98b19..6ff69e454 100644 --- a/api/v1alpha1/promotion_types.go +++ b/api/v1alpha1/promotion_types.go @@ -80,13 +80,18 @@ type PromotionSpec struct { // applies. The Stage referenced by this field MUST be in the same // namespace as the Promotion. // + // +kubebuilder:validation:Required // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=253 // +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ Stage string `json:"stage" protobuf:"bytes,1,opt,name=stage"` // Freight specifies the piece of Freight to be promoted into the Stage // referenced by the Stage field. // + // +kubebuilder:validation:Required // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=253 + // +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ Freight string `json:"freight" protobuf:"bytes,2,opt,name=freight"` // Vars is a list of variables that can be referenced by expressions in // promotion steps. @@ -94,7 +99,11 @@ type PromotionSpec struct { // Steps specifies the directives to be executed as part of this Promotion. // The order in which the directives are executed is the order in which they // are listed in this field. - Steps []PromotionStep `json:"steps,omitempty" protobuf:"bytes,3,rep,name=steps"` + // + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:items:XValidation:message="Promotion step must have uses set and must not reference a task",rule="has(self.uses) && !has(self.task)" + Steps []PromotionStep `json:"steps" protobuf:"bytes,3,rep,name=steps"` } // PromotionVariable describes a single variable that may be referenced by @@ -191,11 +200,9 @@ type PromotionStep struct { // // +kubebuilder:validation:Optional // +kubebuilder:validation:MinLength=1 - Uses string `json:"uses" protobuf:"bytes,1,opt,name=uses"` + Uses string `json:"uses,omitempty" protobuf:"bytes,1,opt,name=uses"` // Task is a reference to a PromotionTask that should be deflated into a // Promotion when it is built from a PromotionTemplate. - // - // +kubebuilder:validation:Optional Task *PromotionTaskReference `json:"task,omitempty" protobuf:"bytes,5,opt,name=task"` // As is the alias this step can be referred to as. As string `json:"as,omitempty" protobuf:"bytes,2,opt,name=as"` diff --git a/api/v1alpha1/stage_types.go b/api/v1alpha1/stage_types.go index c8ba86ce7..982904f27 100644 --- a/api/v1alpha1/stage_types.go +++ b/api/v1alpha1/stage_types.go @@ -284,6 +284,7 @@ type PromotionTemplateSpec struct { // are listed in this field. // // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:items:XValidation:message="PromotionTemplate step must have exactly one of uses or task set",rule="(has(self.uses) ? !has(self.task) : has(self.task))" Steps []PromotionStep `json:"steps,omitempty" protobuf:"bytes,1,rep,name=steps"` } From 35b2552ba86841c93c27bcc15ea5f778279fc4ae Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Wed, 11 Dec 2024 16:33:03 +0100 Subject: [PATCH 08/38] chore: run codegen Signed-off-by: Hidde Beydals --- api/v1alpha1/generated.proto | 13 +++++++++++-- .../kargo.akuity.io_clusterpromotiontasks.yaml | 4 ++++ .../crds/kargo.akuity.io_promotions.yaml | 9 +++++++++ .../crds/kargo.akuity.io_promotiontasks.yaml | 4 ++++ .../resources/crds/kargo.akuity.io_stages.yaml | 4 ++++ ...erpromotiontasks.kargo.akuity.io_v1alpha1.json | 8 +++++++- .../promotions.kargo.akuity.io_v1alpha1.json | 15 +++++++++++++-- .../promotiontasks.kargo.akuity.io_v1alpha1.json | 8 +++++++- .../schema/stages.kargo.akuity.io_v1alpha1.json | 8 +++++++- ui/src/gen/v1alpha1/generated_pb.ts | 13 +++++++++++-- 10 files changed, 77 insertions(+), 9 deletions(-) diff --git a/api/v1alpha1/generated.proto b/api/v1alpha1/generated.proto index deddd3992..5d1d1bfb9 100644 --- a/api/v1alpha1/generated.proto +++ b/api/v1alpha1/generated.proto @@ -882,14 +882,19 @@ message PromotionSpec { // applies. The Stage referenced by this field MUST be in the same // namespace as the Promotion. // + // +kubebuilder:validation:Required // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=253 // +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ optional string stage = 1; // Freight specifies the piece of Freight to be promoted into the Stage // referenced by the Stage field. // + // +kubebuilder:validation:Required // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=253 + // +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ optional string freight = 2; // Vars is a list of variables that can be referenced by expressions in @@ -899,6 +904,10 @@ message PromotionSpec { // Steps specifies the directives to be executed as part of this Promotion. // The order in which the directives are executed is the order in which they // are listed in this field. + // + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:items:XValidation:message="Promotion step must have uses set and must not reference a task",rule="has(self.uses) && !has(self.task)" repeated PromotionStep steps = 3; } @@ -959,8 +968,6 @@ message PromotionStep { // Task is a reference to a PromotionTask that should be deflated into a // Promotion when it is built from a PromotionTemplate. - // - // +kubebuilder:validation:Optional optional PromotionTaskReference task = 5; // As is the alias this step can be referred to as. @@ -1084,6 +1091,7 @@ message PromotionTaskSpec { // // +kubebuilder:validation:Required // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:items:XValidation:message="PromotionTask step must have uses set and must not reference another task",rule="has(self.uses) && !has(self.task)" repeated PromotionStep steps = 2; } @@ -1106,6 +1114,7 @@ message PromotionTemplateSpec { // are listed in this field. // // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:items:XValidation:message="PromotionTemplate step must have exactly one of uses or task set",rule="(has(self.uses) ? !has(self.task) : has(self.task))" repeated PromotionStep steps = 1; } diff --git a/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml b/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml index 5fb2153d5..5594b6a56 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml @@ -167,6 +167,10 @@ spec: minLength: 1 type: string type: object + x-kubernetes-validations: + - message: PromotionTask step must have uses set and must not reference + another task + rule: has(self.uses) && !has(self.task) minItems: 1 type: array required: diff --git a/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml b/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml index f7bfbc2a6..381552c1a 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml @@ -66,13 +66,16 @@ spec: description: |- Freight specifies the piece of Freight to be promoted into the Stage referenced by the Stage field. + maxLength: 253 minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ type: string stage: description: |- Stage specifies the name of the Stage to which this Promotion applies. The Stage referenced by this field MUST be in the same namespace as the Promotion. + maxLength: 253 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ type: string @@ -167,6 +170,11 @@ spec: minLength: 1 type: string type: object + x-kubernetes-validations: + - message: Promotion step must have uses set and must not reference + a task + rule: has(self.uses) && !has(self.task) + minItems: 1 type: array vars: description: |- @@ -196,6 +204,7 @@ spec: required: - freight - stage + - steps type: object status: description: |- diff --git a/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml b/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml index 0ea220f5f..a00e23855 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml @@ -167,6 +167,10 @@ spec: minLength: 1 type: string type: object + x-kubernetes-validations: + - message: PromotionTask step must have uses set and must not reference + another task + rule: has(self.uses) && !has(self.task) minItems: 1 type: array required: diff --git a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml index 5775e6252..d7c11693d 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml @@ -160,6 +160,10 @@ spec: minLength: 1 type: string type: object + x-kubernetes-validations: + - message: PromotionTemplate step must have exactly one + of uses or task set + rule: '(has(self.uses) ? !has(self.task) : has(self.task))' minItems: 1 type: array vars: diff --git a/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json index a2b1a771e..752027ae4 100644 --- a/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json @@ -97,7 +97,13 @@ "type": "string" } }, - "type": "object" + "type": "object", + "x-kubernetes-validations": [ + { + "message": "PromotionTask step must have uses set and must not reference another task", + "rule": "has(self.uses) && !has(self.task)" + } + ] }, "minItems": 1, "type": "array" diff --git a/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json index c5b19e737..4e45a81ff 100644 --- a/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json @@ -18,11 +18,14 @@ "properties": { "freight": { "description": "Freight specifies the piece of Freight to be promoted into the Stage\nreferenced by the Stage field.", + "maxLength": 253, "minLength": 1, + "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$", "type": "string" }, "stage": { "description": "Stage specifies the name of the Stage to which this Promotion\napplies. The Stage referenced by this field MUST be in the same\nnamespace as the Promotion.", + "maxLength": 253, "minLength": 1, "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$", "type": "string" @@ -87,8 +90,15 @@ "type": "string" } }, - "type": "object" + "type": "object", + "x-kubernetes-validations": [ + { + "message": "Promotion step must have uses set and must not reference a task", + "rule": "has(self.uses) && !has(self.task)" + } + ] }, + "minItems": 1, "type": "array" }, "vars": { @@ -118,7 +128,8 @@ }, "required": [ "freight", - "stage" + "stage", + "steps" ], "type": "object" }, diff --git a/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json index 9b788665c..5d5c4cfa6 100644 --- a/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json @@ -97,7 +97,13 @@ "type": "string" } }, - "type": "object" + "type": "object", + "x-kubernetes-validations": [ + { + "message": "PromotionTask step must have uses set and must not reference another task", + "rule": "has(self.uses) && !has(self.task)" + } + ] }, "minItems": 1, "type": "array" diff --git a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json index 22bb3c22b..9fc3c2cd5 100644 --- a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json @@ -82,7 +82,13 @@ "type": "string" } }, - "type": "object" + "type": "object", + "x-kubernetes-validations": [ + { + "message": "PromotionTemplate step must have exactly one of uses or task set", + "rule": "(has(self.uses) ? !has(self.task) : has(self.task))" + } + ] }, "minItems": 1, "type": "array" diff --git a/ui/src/gen/v1alpha1/generated_pb.ts b/ui/src/gen/v1alpha1/generated_pb.ts index 585b7d1f9..ebc454be8 100644 --- a/ui/src/gen/v1alpha1/generated_pb.ts +++ b/ui/src/gen/v1alpha1/generated_pb.ts @@ -1882,7 +1882,9 @@ export type PromotionSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Promot * applies. The Stage referenced by this field MUST be in the same * namespace as the Promotion. * + * +kubebuilder:validation:Required * +kubebuilder:validation:MinLength=1 + * +kubebuilder:validation:MaxLength=253 * +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ * * @generated from field: optional string stage = 1; @@ -1893,7 +1895,10 @@ export type PromotionSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Promot * Freight specifies the piece of Freight to be promoted into the Stage * referenced by the Stage field. * + * +kubebuilder:validation:Required * +kubebuilder:validation:MinLength=1 + * +kubebuilder:validation:MaxLength=253 + * +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ * * @generated from field: optional string freight = 2; */ @@ -1912,6 +1917,10 @@ export type PromotionSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Promot * The order in which the directives are executed is the order in which they * are listed in this field. * + * +kubebuilder:validation:Required + * +kubebuilder:validation:MinItems=1 + * +kubebuilder:validation:items:XValidation:message="Promotion step must have uses set and must not reference a task",rule="has(self.uses) && !has(self.task)" + * * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionStep steps = 3; */ steps: PromotionStep[]; @@ -2042,8 +2051,6 @@ export type PromotionStep = Message<"github.com.akuity.kargo.api.v1alpha1.Promot * Task is a reference to a PromotionTask that should be deflated into a * Promotion when it is built from a PromotionTemplate. * - * +kubebuilder:validation:Optional - * * @generated from field: optional github.com.akuity.kargo.api.v1alpha1.PromotionTaskReference task = 5; */ task?: PromotionTaskReference; @@ -2287,6 +2294,7 @@ export type PromotionTaskSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * * +kubebuilder:validation:Required * +kubebuilder:validation:MinItems=1 + * +kubebuilder:validation:items:XValidation:message="PromotionTask step must have uses set and must not reference another task",rule="has(self.uses) && !has(self.task)" * * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionStep steps = 2; */ @@ -2342,6 +2350,7 @@ export type PromotionTemplateSpec = Message<"github.com.akuity.kargo.api.v1alpha * are listed in this field. * * +kubebuilder:validation:MinItems=1 + * +kubebuilder:validation:items:XValidation:message="PromotionTemplate step must have exactly one of uses or task set",rule="(has(self.uses) ? !has(self.task) : has(self.task))" * * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionStep steps = 1; */ From 2563b9f1db58fdb76e19a385aee36701508f38e8 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Wed, 11 Dec 2024 16:56:36 +0100 Subject: [PATCH 09/38] feat(api): allow `Inputs` config on `PromotionStep` This includes validation rules to ensure a `PromotionTask` step can not have `inputs` defined, but `Promotion` and `PromotionTemplate` steps can (unless they reference a `task` themselves). Signed-off-by: Hidde Beydals --- api/v1alpha1/promotion_task_types.go | 1 + api/v1alpha1/promotion_types.go | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/api/v1alpha1/promotion_task_types.go b/api/v1alpha1/promotion_task_types.go index 17a3e1d88..fa22b7f1b 100644 --- a/api/v1alpha1/promotion_task_types.go +++ b/api/v1alpha1/promotion_task_types.go @@ -31,6 +31,7 @@ type PromotionTaskSpec struct { // +kubebuilder:validation:Required // +kubebuilder:validation:MinItems=1 // +kubebuilder:validation:items:XValidation:message="PromotionTask step must have uses set and must not reference another task",rule="has(self.uses) && !has(self.task)" + // +kubebuilder:validation:items:XValidation:message="PromotionTask step must not have inputs set",rule="self.inputs.size() == 0" Steps []PromotionStep `json:"steps" protobuf:"bytes,2,rep,name=steps"` } diff --git a/api/v1alpha1/promotion_types.go b/api/v1alpha1/promotion_types.go index 6ff69e454..1f6ba605b 100644 --- a/api/v1alpha1/promotion_types.go +++ b/api/v1alpha1/promotion_types.go @@ -195,6 +195,8 @@ func (r *PromotionStepRetry) GetErrorThreshold(fallback uint32) uint32 { } // PromotionStep describes a directive to be executed as part of a Promotion. +// +// +kubebuilder:validation:XValidation:message="inputs must not be set when task is set",rule="!(has(self.task) && self.inputs.size() > 0)" type PromotionStep struct { // Uses identifies a runner that can execute this step. // @@ -208,6 +210,13 @@ type PromotionStep struct { As string `json:"as,omitempty" protobuf:"bytes,2,opt,name=as"` // Retry is the retry policy for this step. Retry *PromotionStepRetry `json:"retry,omitempty" protobuf:"bytes,4,opt,name=retry"` + // Inputs is a map of inputs that can used to parameterize the execution + // of the PromotionStep and can be referenced by expressions in the Config. + // + // When a PromotionStep is inflated from a PromotionTask, the inputs + // specified in the PromotionTask are set based on the inputs specified + // in the Config of the PromotionStep that references the PromotionTask. + Inputs map[string]string `json:"inputs,omitempty" protobuf:"bytes,6,rep,name=inputs"` // Config is opaque configuration for the PromotionStep that is understood // only by each PromotionStep's implementation. It is legal to utilize // expressions in defining values at any level of this block. From e34147d9408899124d0acb953a035247261d8deb Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Wed, 11 Dec 2024 16:58:04 +0100 Subject: [PATCH 10/38] chore: run codegen Signed-off-by: Hidde Beydals --- api/v1alpha1/generated.pb.go | 690 +++++++++++------- api/v1alpha1/generated.proto | 11 + api/v1alpha1/promotion_types.go | 2 +- api/v1alpha1/zz_generated.deepcopy.go | 7 + ...kargo.akuity.io_clusterpromotiontasks.yaml | 15 + .../crds/kargo.akuity.io_promotions.yaml | 13 + .../crds/kargo.akuity.io_promotiontasks.yaml | 15 + .../crds/kargo.akuity.io_stages.yaml | 13 + ...omotiontasks.kargo.akuity.io_v1alpha1.json | 15 + .../promotions.kargo.akuity.io_v1alpha1.json | 11 + ...omotiontasks.kargo.akuity.io_v1alpha1.json | 15 + .../stages.kargo.akuity.io_v1alpha1.json | 11 + ui/src/gen/v1alpha1/generated_pb.ts | 17 +- 13 files changed, 574 insertions(+), 261 deletions(-) diff --git a/api/v1alpha1/generated.pb.go b/api/v1alpha1/generated.pb.go index 1a0bf57a0..40a6faa09 100644 --- a/api/v1alpha1/generated.pb.go +++ b/api/v1alpha1/generated.pb.go @@ -1929,6 +1929,7 @@ func init() { proto.RegisterType((*PromotionSpec)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionSpec") proto.RegisterType((*PromotionStatus)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStatus") proto.RegisterType((*PromotionStep)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStep") + proto.RegisterMapType((map[string]string)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStep.InputsEntry") proto.RegisterType((*PromotionStepRetry)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStepRetry") proto.RegisterType((*PromotionTask)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTask") proto.RegisterType((*PromotionTaskInput)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTaskInput") @@ -1958,265 +1959,266 @@ func init() { } var fileDescriptor_e26b7f7bbc391025 = []byte{ - // 4113 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0xdd, 0x6f, 0x5b, 0x47, - 0x76, 0xf7, 0x25, 0x45, 0x4a, 0x3c, 0x94, 0x6c, 0x69, 0x2c, 0x27, 0x5a, 0x6d, 0x63, 0xb9, 0x37, - 0x41, 0x90, 0x34, 0x09, 0x55, 0x3b, 0x71, 0xe2, 0x38, 0x5b, 0x17, 0x22, 0xe5, 0x0f, 0x79, 0xb5, - 0xb1, 0x3a, 0x74, 0x9c, 0x8d, 0xe3, 0x20, 0x3b, 0x26, 0x47, 0xe4, 0x5d, 0x91, 0xf7, 0x32, 0x77, - 0x86, 0xda, 0xa8, 0x2d, 0xda, 0xed, 0x17, 0xb0, 0x68, 0xd1, 0x62, 0x1f, 0x02, 0x64, 0x0b, 0xb4, - 0x40, 0xd1, 0x3e, 0x2e, 0xda, 0x7f, 0xa0, 0x0f, 0x79, 0xe8, 0x4b, 0x50, 0x04, 0x6d, 0xd0, 0x16, - 0x68, 0x1e, 0xb6, 0x6a, 0xa3, 0x00, 0x45, 0x9f, 0xfa, 0xd6, 0x17, 0x03, 0x05, 0x8a, 0xf9, 0xb8, - 0xf7, 0xce, 0xfd, 0xa0, 0xc5, 0x4b, 0x4b, 0x46, 0xba, 0x6f, 0xd4, 0x9c, 0x99, 0xdf, 0x99, 0x39, - 0x33, 0xe7, 0xcc, 0x39, 0x67, 0xce, 0x15, 0xbc, 0xd2, 0x71, 0x78, 0x77, 0x78, 0xbf, 0xd6, 0xf2, - 0xfa, 0xab, 0x64, 0x67, 0xe8, 0xf0, 0xbd, 0xd5, 0x1d, 0xe2, 0x77, 0xbc, 0x55, 0x32, 0x70, 0x56, - 0x77, 0xcf, 0x93, 0xde, 0xa0, 0x4b, 0xce, 0xaf, 0x76, 0xa8, 0x4b, 0x7d, 0xc2, 0x69, 0xbb, 0x36, - 0xf0, 0x3d, 0xee, 0xa1, 0x67, 0xa2, 0x51, 0x35, 0x35, 0xaa, 0x26, 0x47, 0xd5, 0xc8, 0xc0, 0xa9, - 0x05, 0xa3, 0x96, 0x5f, 0x32, 0xb0, 0x3b, 0x5e, 0xc7, 0x5b, 0x95, 0x83, 0xef, 0x0f, 0xb7, 0xe5, - 0x5f, 0xf2, 0x0f, 0xf9, 0x4b, 0x81, 0x2e, 0xdf, 0xd8, 0xb9, 0xc4, 0x6a, 0x8e, 0xe4, 0x4c, 0x3f, - 0xe4, 0xd4, 0x65, 0x8e, 0xe7, 0xb2, 0x97, 0xc8, 0xc0, 0x61, 0xd4, 0xdf, 0xa5, 0xfe, 0xea, 0x60, - 0xa7, 0x23, 0x68, 0x2c, 0xde, 0x61, 0x75, 0x37, 0x35, 0xbd, 0xe5, 0x57, 0x22, 0xa4, 0x3e, 0x69, - 0x75, 0x1d, 0x97, 0xfa, 0x7b, 0xd1, 0xf0, 0x3e, 0xe5, 0x24, 0x6b, 0xd4, 0xea, 0xa8, 0x51, 0xfe, - 0xd0, 0xe5, 0x4e, 0x9f, 0xa6, 0x06, 0xbc, 0x7a, 0xd8, 0x00, 0xd6, 0xea, 0xd2, 0x3e, 0x49, 0x8e, - 0xb3, 0xef, 0xc1, 0xe9, 0x35, 0x97, 0xf4, 0xf6, 0x98, 0xc3, 0xf0, 0xd0, 0x5d, 0xf3, 0x3b, 0xc3, - 0x3e, 0x75, 0x39, 0x3a, 0x07, 0x53, 0x2e, 0xe9, 0xd3, 0x25, 0xeb, 0x9c, 0xf5, 0x5c, 0xa5, 0x3e, - 0xfb, 0xe9, 0xfe, 0xca, 0x89, 0x83, 0xfd, 0x95, 0xa9, 0x37, 0x49, 0x9f, 0x62, 0x49, 0x41, 0x4f, - 0x43, 0x69, 0x97, 0xf4, 0x86, 0x74, 0xa9, 0x20, 0xbb, 0xcc, 0xe9, 0x2e, 0xa5, 0x3b, 0xa2, 0x11, - 0x2b, 0x9a, 0xfd, 0x7b, 0xc5, 0x18, 0xfc, 0x77, 0x28, 0x27, 0x6d, 0xc2, 0x09, 0xea, 0x43, 0xb9, - 0x47, 0xee, 0xd3, 0x1e, 0x5b, 0xb2, 0xce, 0x15, 0x9f, 0xab, 0x5e, 0xb8, 0x5a, 0x1b, 0x67, 0x13, - 0x6b, 0x19, 0x50, 0xb5, 0x4d, 0x89, 0x73, 0xd5, 0xe5, 0xfe, 0x5e, 0xfd, 0xa4, 0x9e, 0x44, 0x59, - 0x35, 0x62, 0xcd, 0x04, 0xfd, 0x8e, 0x05, 0x55, 0xe2, 0xba, 0x1e, 0x27, 0x5c, 0x6c, 0xd3, 0x52, - 0x41, 0x32, 0xbd, 0x39, 0x39, 0xd3, 0xb5, 0x08, 0x4c, 0x71, 0x3e, 0xad, 0x39, 0x57, 0x0d, 0x0a, - 0x36, 0x79, 0x2e, 0xbf, 0x0e, 0x55, 0x63, 0xaa, 0x68, 0x1e, 0x8a, 0x3b, 0x74, 0x4f, 0xc9, 0x17, - 0x8b, 0x9f, 0x68, 0x31, 0x26, 0x50, 0x2d, 0xc1, 0xcb, 0x85, 0x4b, 0xd6, 0xf2, 0x15, 0x98, 0x4f, - 0x32, 0xcc, 0x33, 0xde, 0xfe, 0x13, 0x0b, 0x16, 0x8d, 0x55, 0x60, 0xba, 0x4d, 0x7d, 0xea, 0xb6, - 0x28, 0x5a, 0x85, 0x8a, 0xd8, 0x4b, 0x36, 0x20, 0xad, 0x60, 0xab, 0x17, 0xf4, 0x42, 0x2a, 0x6f, - 0x06, 0x04, 0x1c, 0xf5, 0x09, 0x8f, 0x45, 0xe1, 0x61, 0xc7, 0x62, 0xd0, 0x25, 0x8c, 0x2e, 0x15, - 0xe3, 0xc7, 0x62, 0x4b, 0x34, 0x62, 0x45, 0xb3, 0x7f, 0x05, 0xbe, 0x11, 0xcc, 0xe7, 0x36, 0xed, - 0x0f, 0x7a, 0x84, 0xd3, 0x68, 0x52, 0x87, 0x1e, 0x3d, 0x7b, 0x07, 0xe6, 0xd6, 0x06, 0x03, 0xdf, - 0xdb, 0xa5, 0xed, 0x26, 0x27, 0x1d, 0x8a, 0xee, 0x02, 0x10, 0xdd, 0xb0, 0xc6, 0xe5, 0xc0, 0xea, - 0x85, 0x5f, 0xaa, 0x29, 0x8d, 0xa8, 0x99, 0x1a, 0x51, 0x1b, 0xec, 0x74, 0x44, 0x03, 0xab, 0x09, - 0xc5, 0xab, 0xed, 0x9e, 0xaf, 0xdd, 0x76, 0xfa, 0xb4, 0x7e, 0xf2, 0x60, 0x7f, 0x05, 0xd6, 0x42, - 0x04, 0x6c, 0xa0, 0xd9, 0xbf, 0x6b, 0xc1, 0x99, 0x35, 0xbf, 0xe3, 0x35, 0xd6, 0xd7, 0x06, 0x83, - 0x1b, 0x94, 0xf4, 0x78, 0xb7, 0xc9, 0x09, 0x1f, 0x32, 0x74, 0x05, 0xca, 0x4c, 0xfe, 0xd2, 0x53, - 0x7d, 0x36, 0x38, 0x7d, 0x8a, 0xfe, 0x60, 0x7f, 0x65, 0x31, 0x63, 0x20, 0xc5, 0x7a, 0x14, 0x7a, - 0x1e, 0xa6, 0xfb, 0x94, 0x31, 0xd2, 0x09, 0xe4, 0x79, 0x4a, 0x03, 0x4c, 0x7f, 0x47, 0x35, 0xe3, - 0x80, 0x6e, 0xff, 0x7d, 0x01, 0x4e, 0x85, 0x58, 0x9a, 0xfd, 0x31, 0x6c, 0xde, 0x10, 0x66, 0xbb, - 0xc6, 0x0a, 0xe5, 0x1e, 0x56, 0x2f, 0xbc, 0x31, 0xa6, 0x9e, 0x64, 0x09, 0xa9, 0xbe, 0xa8, 0xd9, - 0xcc, 0x9a, 0xad, 0x38, 0xc6, 0x06, 0xf5, 0x01, 0xd8, 0x9e, 0xdb, 0xd2, 0x4c, 0xa7, 0x24, 0xd3, - 0xd7, 0x73, 0x32, 0x6d, 0x86, 0x00, 0x75, 0xa4, 0x59, 0x42, 0xd4, 0x86, 0x0d, 0x06, 0xf6, 0xdf, - 0x58, 0x70, 0x3a, 0x63, 0x1c, 0xfa, 0x56, 0x62, 0x3f, 0x9f, 0x49, 0xed, 0x27, 0x4a, 0x0d, 0x8b, - 0x76, 0xf3, 0x45, 0x98, 0xf1, 0xe9, 0xae, 0x23, 0xee, 0x01, 0x2d, 0xe1, 0x79, 0x3d, 0x7e, 0x06, - 0xeb, 0x76, 0x1c, 0xf6, 0x40, 0x2f, 0x40, 0x25, 0xf8, 0x2d, 0xc4, 0x5c, 0x14, 0xaa, 0x22, 0x36, - 0x2e, 0xe8, 0xca, 0x70, 0x44, 0xb7, 0x7f, 0x1b, 0x4a, 0x8d, 0x2e, 0xf1, 0xb9, 0x38, 0x31, 0x3e, - 0x1d, 0x78, 0x6f, 0xe1, 0x4d, 0x3d, 0xc5, 0xf0, 0xc4, 0x60, 0xd5, 0x8c, 0x03, 0xfa, 0x18, 0x9b, - 0xfd, 0x3c, 0x4c, 0xef, 0x52, 0x5f, 0xce, 0xb7, 0x18, 0x07, 0xbb, 0xa3, 0x9a, 0x71, 0x40, 0xb7, - 0xff, 0xd9, 0x82, 0x45, 0x39, 0x83, 0x75, 0x87, 0xb5, 0xbc, 0x5d, 0xea, 0xef, 0x61, 0xca, 0x86, - 0xbd, 0x23, 0x9e, 0xd0, 0x3a, 0xcc, 0x33, 0xda, 0xdf, 0xa5, 0x7e, 0xc3, 0x73, 0x19, 0xf7, 0x89, - 0xe3, 0x72, 0x3d, 0xb3, 0x25, 0xdd, 0x7b, 0xbe, 0x99, 0xa0, 0xe3, 0xd4, 0x08, 0xf4, 0x1c, 0xcc, - 0xe8, 0x69, 0x8b, 0xa3, 0x24, 0x04, 0x3b, 0x2b, 0xf6, 0x40, 0xaf, 0x89, 0xe1, 0x90, 0x6a, 0xff, - 0xa7, 0x05, 0x0b, 0x72, 0x55, 0xcd, 0xe1, 0x7d, 0xd6, 0xf2, 0x9d, 0x81, 0x30, 0xaf, 0x5f, 0xc7, - 0x25, 0x5d, 0x81, 0x93, 0xed, 0x40, 0xf0, 0x9b, 0x4e, 0xdf, 0xe1, 0x52, 0x47, 0x4a, 0xf5, 0x27, - 0x34, 0xc6, 0xc9, 0xf5, 0x18, 0x15, 0x27, 0x7a, 0xab, 0xed, 0xeb, 0x0d, 0x19, 0xa7, 0xfe, 0x96, - 0xef, 0xf5, 0x3d, 0xb1, 0xce, 0xdb, 0x84, 0xed, 0xa0, 0xef, 0xc1, 0x4c, 0x5f, 0x5f, 0x69, 0xda, - 0x6a, 0xfe, 0xf2, 0x78, 0x56, 0xf3, 0xd6, 0xfd, 0xef, 0xd3, 0x16, 0x17, 0xd7, 0x61, 0xa4, 0x6d, - 0x51, 0x1b, 0x0e, 0x51, 0xd1, 0x3b, 0x30, 0xc5, 0x06, 0xb4, 0x25, 0x45, 0x54, 0xbd, 0xf0, 0xda, - 0x78, 0x4a, 0x1d, 0x9b, 0x64, 0x73, 0x40, 0x5b, 0x91, 0x6c, 0xc5, 0x5f, 0x58, 0x42, 0xda, 0xff, - 0x66, 0xc1, 0x52, 0xd6, 0xaa, 0x36, 0x1d, 0xc6, 0xd1, 0xbd, 0xd4, 0xca, 0x6a, 0xe3, 0xad, 0x4c, - 0x8c, 0x96, 0xeb, 0x0a, 0xb5, 0x37, 0x68, 0x31, 0x56, 0xd5, 0x82, 0x92, 0xc3, 0x69, 0x3f, 0x70, - 0x24, 0xae, 0x8c, 0xb7, 0xac, 0x51, 0x93, 0x8d, 0x2e, 0xc9, 0x0d, 0x01, 0x8a, 0x15, 0xb6, 0xfd, - 0x2e, 0xcc, 0x36, 0x86, 0xbe, 0x4f, 0x5d, 0xae, 0x2e, 0xb9, 0x6f, 0x43, 0x89, 0x39, 0xae, 0xb6, - 0xf5, 0xf9, 0xee, 0xb7, 0x8a, 0x00, 0x6f, 0x8a, 0xc1, 0x58, 0x61, 0xd8, 0x7f, 0x56, 0x84, 0xd3, - 0xc1, 0xa9, 0xa1, 0xed, 0x35, 0x9f, 0x3b, 0xdb, 0xa4, 0xc5, 0x19, 0x6a, 0xc3, 0x6c, 0x3b, 0x6a, - 0xe6, 0xda, 0x18, 0xe7, 0xe1, 0x15, 0x1a, 0x7c, 0x03, 0x9e, 0xe3, 0x18, 0x2a, 0x7a, 0x1b, 0x8a, - 0x1d, 0x87, 0x6b, 0xdf, 0xef, 0xd2, 0x78, 0xd2, 0xbb, 0xee, 0x24, 0xad, 0x4f, 0xbd, 0xaa, 0x59, - 0x15, 0xaf, 0x3b, 0x1c, 0x0b, 0x44, 0x74, 0x1f, 0xca, 0x4e, 0x9f, 0x74, 0x68, 0xb0, 0x33, 0x97, - 0xc7, 0xc3, 0xde, 0x10, 0x63, 0x92, 0xe8, 0xa1, 0x33, 0x29, 0xa9, 0x0c, 0x6b, 0x64, 0xc1, 0xa3, - 0x25, 0xac, 0x86, 0xb2, 0xdb, 0x63, 0xf3, 0xc8, 0xb2, 0x9f, 0x11, 0x0f, 0x49, 0x65, 0x58, 0x23, - 0xdb, 0x5f, 0x14, 0x60, 0x3e, 0x92, 0x5f, 0xc3, 0xeb, 0xf7, 0x1d, 0x8e, 0x96, 0xa1, 0xe0, 0xb4, - 0xb5, 0x51, 0x02, 0x3d, 0xb0, 0xb0, 0xb1, 0x8e, 0x0b, 0x4e, 0x1b, 0x3d, 0x0b, 0xe5, 0xfb, 0x3e, - 0x71, 0x5b, 0x5d, 0x6d, 0x8c, 0x42, 0xe0, 0xba, 0x6c, 0xc5, 0x9a, 0x8a, 0x9e, 0x82, 0x22, 0x27, - 0x1d, 0x6d, 0x83, 0x42, 0xf9, 0xdd, 0x26, 0x1d, 0x2c, 0xda, 0x85, 0xf1, 0x63, 0x43, 0xa9, 0xc7, - 0x72, 0xe7, 0x0d, 0xe3, 0xd7, 0x54, 0xcd, 0x38, 0xa0, 0x0b, 0x8e, 0x64, 0xc8, 0xbb, 0x9e, 0xbf, - 0x54, 0x8a, 0x73, 0x5c, 0x93, 0xad, 0x58, 0x53, 0x85, 0x9b, 0xd2, 0x92, 0xf3, 0xe7, 0xd4, 0x5f, - 0x2a, 0xc7, 0xdd, 0x94, 0x46, 0x40, 0xc0, 0x51, 0x1f, 0xf4, 0x1e, 0x54, 0x5b, 0x3e, 0x25, 0xdc, - 0xf3, 0xd7, 0x09, 0xa7, 0x4b, 0xd3, 0xb9, 0x4f, 0xe0, 0x29, 0xe1, 0x87, 0x37, 0x22, 0x08, 0x6c, - 0xe2, 0xd9, 0xff, 0x6d, 0xc1, 0x52, 0x24, 0x5a, 0xb9, 0xb7, 0x91, 0xef, 0xa9, 0xc5, 0x63, 0x8d, - 0x10, 0xcf, 0xb3, 0x50, 0x6e, 0x3b, 0x1d, 0xca, 0x78, 0x52, 0xca, 0xeb, 0xb2, 0x15, 0x6b, 0x2a, - 0xba, 0x00, 0xd0, 0x71, 0xb8, 0xbe, 0x2f, 0xb4, 0xb0, 0x43, 0x3b, 0x79, 0x3d, 0xa4, 0x60, 0xa3, - 0x17, 0x7a, 0x1b, 0x2a, 0x72, 0x9a, 0x13, 0xaa, 0x9d, 0xf4, 0x1e, 0x1a, 0x01, 0x00, 0x8e, 0xb0, - 0xec, 0xcf, 0xa7, 0x60, 0xfa, 0x9a, 0x4f, 0x9d, 0x4e, 0x97, 0x3f, 0x06, 0x83, 0xff, 0x34, 0x94, - 0x48, 0xcf, 0x21, 0x4c, 0xee, 0x9b, 0xe1, 0xff, 0xaf, 0x89, 0x46, 0xac, 0x68, 0xe8, 0x5d, 0x28, - 0x7b, 0xbe, 0xd3, 0x71, 0xdc, 0xa5, 0x8a, 0x9c, 0xc4, 0xcb, 0xe3, 0xa9, 0x90, 0x5e, 0xc5, 0x2d, - 0x39, 0x34, 0x12, 0xbe, 0xfa, 0x1b, 0x6b, 0x48, 0x74, 0x17, 0xa6, 0xd5, 0x61, 0x0a, 0x14, 0x74, - 0x75, 0x6c, 0x03, 0xa3, 0xce, 0x63, 0x74, 0xe8, 0xd5, 0xdf, 0x0c, 0x07, 0x80, 0xa8, 0x19, 0xda, - 0x97, 0x29, 0x09, 0xfd, 0x42, 0x0e, 0xfb, 0x32, 0xd2, 0xa0, 0x34, 0x43, 0x83, 0x52, 0xca, 0x03, - 0x2a, 0x4d, 0xc6, 0x28, 0x0b, 0x22, 0x44, 0xac, 0x9d, 0xd9, 0xf2, 0x04, 0x22, 0xd6, 0x9e, 0xf4, - 0xc9, 0xb8, 0x07, 0x1c, 0xf8, 0xba, 0xf6, 0x47, 0x45, 0x58, 0xd0, 0x3d, 0x1b, 0x5e, 0xaf, 0x47, - 0x5b, 0xd2, 0x73, 0x52, 0xf6, 0xa9, 0x98, 0x69, 0x9f, 0x9c, 0xe0, 0xc6, 0x54, 0x36, 0xbf, 0x9e, - 0x6b, 0x36, 0x11, 0x8f, 0x9a, 0xbc, 0x21, 0x55, 0xc8, 0x1d, 0xee, 0x92, 0xee, 0xa5, 0xef, 0x4d, - 0xf4, 0x07, 0x16, 0x9c, 0xde, 0xa5, 0xbe, 0xb3, 0xed, 0xb4, 0x64, 0xc0, 0x7c, 0xc3, 0x61, 0xdc, - 0xf3, 0xf7, 0xf4, 0x8d, 0xf0, 0xea, 0x78, 0x9c, 0xef, 0x18, 0x00, 0x1b, 0xee, 0xb6, 0x57, 0xff, - 0xa6, 0xe6, 0x76, 0xfa, 0x4e, 0x1a, 0x1a, 0x67, 0xf1, 0x5b, 0x1e, 0x00, 0x44, 0xb3, 0xcd, 0x88, - 0xd7, 0x37, 0xcd, 0x78, 0x7d, 0xec, 0x89, 0x05, 0x8b, 0x0d, 0x4c, 0x96, 0x19, 0xe7, 0x7f, 0x62, - 0x41, 0x55, 0xd3, 0x1f, 0x83, 0x13, 0x84, 0xe3, 0x4e, 0xd0, 0x4b, 0xb9, 0xe6, 0x3f, 0xc2, 0xe7, - 0xf1, 0x61, 0x2e, 0xa6, 0xe4, 0xe8, 0x22, 0x4c, 0xed, 0x38, 0x6e, 0x70, 0xeb, 0xfd, 0x62, 0xe0, - 0x06, 0x7e, 0xdb, 0x71, 0xdb, 0x0f, 0xf6, 0x57, 0x16, 0x62, 0x9d, 0x45, 0x23, 0x96, 0xdd, 0x0f, - 0xf7, 0xcc, 0x2f, 0xcf, 0xfc, 0xe4, 0x2f, 0x56, 0x4e, 0xfc, 0xf0, 0x67, 0xe7, 0x4e, 0xd8, 0x1f, - 0x17, 0x61, 0x3e, 0x29, 0xd5, 0x31, 0xf2, 0x5f, 0x91, 0x0d, 0x9b, 0x39, 0x56, 0x1b, 0x56, 0x38, - 0x3e, 0x1b, 0x56, 0x3c, 0x0e, 0x1b, 0x36, 0x75, 0x64, 0x36, 0xcc, 0xfe, 0x07, 0x0b, 0x4e, 0x86, - 0x3b, 0xf3, 0xc1, 0x50, 0xdc, 0xac, 0x91, 0xd4, 0xad, 0xa3, 0x97, 0xfa, 0xfb, 0x30, 0xcd, 0xbc, - 0xa1, 0xdf, 0x92, 0xee, 0xa3, 0x40, 0x7f, 0x25, 0x9f, 0xd1, 0x54, 0x63, 0x0d, 0x9f, 0x49, 0x35, - 0xe0, 0x00, 0xd5, 0x5c, 0x90, 0xa6, 0x29, 0x97, 0xc2, 0x17, 0x0e, 0x97, 0x58, 0xd0, 0x8c, 0xe9, - 0x52, 0x88, 0x56, 0xac, 0xa9, 0xc8, 0x96, 0xf6, 0x3c, 0xf0, 0x6c, 0x2b, 0x75, 0xd0, 0x66, 0x59, - 0x6e, 0x82, 0xa2, 0xa0, 0x01, 0xcc, 0xfb, 0xf4, 0x83, 0xa1, 0xe3, 0xd3, 0x76, 0xd3, 0x23, 0x3b, - 0xc2, 0x2f, 0xd0, 0x29, 0x9c, 0x31, 0xf5, 0x7e, 0x7d, 0xe8, 0x4b, 0x13, 0x56, 0x5f, 0x14, 0x91, - 0x29, 0x4e, 0x60, 0xe1, 0x14, 0xba, 0xfd, 0xef, 0xa5, 0x50, 0x61, 0x75, 0x12, 0xe5, 0x37, 0xa0, - 0xda, 0x52, 0x51, 0x4b, 0x6f, 0x6f, 0xc3, 0xd5, 0x47, 0x6c, 0x7d, 0x82, 0xcb, 0xa7, 0xd6, 0x88, - 0x60, 0x12, 0x39, 0x56, 0x83, 0x82, 0x4d, 0x6e, 0xe8, 0x07, 0x00, 0xca, 0x12, 0xd3, 0xf6, 0x86, - 0xab, 0xaf, 0x9a, 0xc6, 0x24, 0xbc, 0xef, 0x84, 0x28, 0x8a, 0x75, 0xe8, 0xf3, 0x44, 0x04, 0x6c, - 0xb0, 0x12, 0xab, 0x0e, 0x52, 0x86, 0xd7, 0x3c, 0x5f, 0xeb, 0xec, 0x44, 0xab, 0x5e, 0x8b, 0x60, - 0x92, 0x99, 0xe5, 0x88, 0x82, 0x4d, 0x6e, 0xcb, 0x3e, 0xcc, 0x27, 0x65, 0x95, 0x71, 0xdd, 0xdc, - 0x88, 0x5f, 0x37, 0x17, 0xc6, 0x54, 0x50, 0x23, 0x02, 0x35, 0x53, 0xd2, 0x3e, 0x9c, 0x4a, 0xc8, - 0x28, 0x83, 0xe5, 0x46, 0x9c, 0xe5, 0xcb, 0x79, 0xae, 0x5e, 0x9d, 0xda, 0x35, 0x79, 0x32, 0x98, - 0x4f, 0x4a, 0xe7, 0xc8, 0x98, 0xc6, 0xf2, 0xc9, 0xe6, 0x9d, 0xfa, 0xe7, 0x05, 0xa8, 0x84, 0x56, - 0x35, 0x4f, 0x72, 0x48, 0x79, 0x43, 0x85, 0x43, 0xa2, 0xb5, 0xe2, 0x38, 0xd1, 0xda, 0xd4, 0xe8, - 0x68, 0x2d, 0x48, 0x20, 0x97, 0x1f, 0x9e, 0x40, 0x36, 0xa2, 0xb5, 0xe9, 0xf1, 0xa3, 0xb5, 0x99, - 0xc3, 0xa3, 0x35, 0xfb, 0x2f, 0x2d, 0x40, 0xe9, 0xd0, 0x3c, 0x8f, 0xa0, 0x48, 0xf2, 0xae, 0x1b, - 0xd3, 0x13, 0x4a, 0xc6, 0xc7, 0xa3, 0xaf, 0x3c, 0xfb, 0x93, 0x12, 0x9c, 0xba, 0xee, 0x4c, 0x9c, - 0xe7, 0xe3, 0xf0, 0xa4, 0x42, 0x6a, 0x52, 0xed, 0x87, 0x36, 0xb9, 0x4f, 0x38, 0xed, 0xec, 0xe9, - 0xfd, 0xbd, 0xac, 0x87, 0x3e, 0xd9, 0xc8, 0xee, 0xf6, 0x60, 0x34, 0x09, 0x8f, 0x82, 0x1e, 0xfb, - 0x90, 0xbc, 0x01, 0x73, 0x8c, 0xfb, 0x4e, 0x8b, 0xab, 0x4c, 0x22, 0x5b, 0xaa, 0xca, 0x8b, 0xe4, - 0x8c, 0xee, 0x3e, 0xd7, 0x34, 0x89, 0x38, 0xde, 0x37, 0x33, 0x41, 0x39, 0x95, 0x3b, 0x41, 0xb9, - 0x0a, 0x15, 0xd2, 0xeb, 0x79, 0x3f, 0xb8, 0x4d, 0x3a, 0x4c, 0xa7, 0x03, 0xc2, 0x53, 0xb3, 0x16, - 0x10, 0x70, 0xd4, 0x07, 0xd5, 0x00, 0x9c, 0x8e, 0xeb, 0xf9, 0x54, 0x8e, 0x28, 0xcb, 0x1b, 0x4d, - 0x3e, 0xc2, 0x6c, 0x84, 0xad, 0xd8, 0xe8, 0x81, 0x9a, 0x70, 0xc6, 0x71, 0x19, 0x6d, 0x0d, 0x7d, - 0xda, 0xdc, 0x71, 0x06, 0xb7, 0x37, 0x9b, 0xd2, 0x4a, 0xec, 0xc9, 0xd3, 0x3c, 0x53, 0x7f, 0x4a, - 0x33, 0x3b, 0xb3, 0x91, 0xd5, 0x09, 0x67, 0x8f, 0x45, 0xaf, 0xc0, 0xac, 0xe3, 0xb6, 0x7a, 0xc3, - 0x36, 0xdd, 0x22, 0xbc, 0xcb, 0x96, 0x66, 0xe4, 0x34, 0xe6, 0x0f, 0xf6, 0x57, 0x66, 0x37, 0x8c, - 0x76, 0x1c, 0xeb, 0x25, 0x46, 0xd1, 0x0f, 0x8d, 0x51, 0x95, 0x68, 0xd4, 0xd5, 0x0f, 0xcd, 0x51, - 0x66, 0xaf, 0x8c, 0x14, 0x2e, 0xe4, 0x4a, 0xe1, 0xfe, 0xb4, 0x00, 0x65, 0xf5, 0x82, 0x82, 0x2e, - 0x26, 0x9e, 0x29, 0x9e, 0x4a, 0x3d, 0x53, 0x54, 0xb3, 0x5e, 0x9b, 0x6c, 0x28, 0x3b, 0x8c, 0x0d, - 0xe3, 0x0e, 0xc4, 0x86, 0x6c, 0xc1, 0x9a, 0x22, 0x53, 0x5b, 0x9e, 0xbb, 0xed, 0x74, 0x74, 0x02, - 0xe2, 0x8a, 0xe1, 0x36, 0x44, 0xaf, 0xdc, 0xef, 0x87, 0xcf, 0xe0, 0x91, 0x07, 0x11, 0xeb, 0x20, - 0x5c, 0x89, 0x9b, 0xcd, 0x5b, 0x6f, 0x2a, 0x1e, 0x0d, 0x89, 0x88, 0x35, 0xb2, 0xe0, 0xe1, 0x0d, - 0xf9, 0x60, 0xc8, 0xe5, 0x41, 0x39, 0x22, 0x1e, 0xb7, 0x24, 0x22, 0xd6, 0xc8, 0xf6, 0xc7, 0x16, - 0x9c, 0x52, 0x32, 0x68, 0x74, 0x69, 0x6b, 0xa7, 0xc9, 0xe9, 0x40, 0x78, 0xf4, 0x43, 0x46, 0x59, - 0xd2, 0xa3, 0x7f, 0x8b, 0x51, 0x86, 0x25, 0xc5, 0x58, 0x7d, 0xe1, 0xb8, 0x56, 0x6f, 0xff, 0xb5, - 0x05, 0x25, 0xe9, 0x3a, 0xe7, 0xb1, 0x3f, 0xf1, 0x74, 0x52, 0x61, 0xac, 0x74, 0xd2, 0x21, 0x89, - 0xbe, 0x28, 0x93, 0x35, 0xf5, 0xb0, 0x4c, 0x96, 0xfd, 0x95, 0x05, 0x8b, 0x59, 0xd9, 0xd1, 0x3c, - 0xd3, 0x7f, 0x11, 0x66, 0x06, 0x3d, 0xc2, 0xb7, 0x3d, 0xbf, 0x9f, 0x7c, 0x19, 0xdb, 0xd2, 0xed, - 0x38, 0xec, 0x81, 0x7c, 0x00, 0x3f, 0x08, 0xc3, 0x82, 0x10, 0xe5, 0x4a, 0xde, 0x1b, 0x21, 0x9e, - 0xd6, 0x8b, 0x84, 0x15, 0x36, 0x31, 0x6c, 0x70, 0xb1, 0xff, 0xa8, 0x04, 0x0b, 0x72, 0xc8, 0xa4, - 0x37, 0xc4, 0x24, 0x3b, 0x34, 0x80, 0x27, 0x64, 0xf0, 0x94, 0xbe, 0x54, 0xd4, 0xa6, 0x5d, 0xd2, - 0xe3, 0x9f, 0xd8, 0xc8, 0xec, 0xf5, 0x60, 0x24, 0x05, 0x8f, 0xc0, 0x4d, 0xdf, 0x14, 0xf0, 0xf3, - 0x77, 0x53, 0x98, 0x87, 0x6d, 0xfa, 0xd0, 0xc3, 0x36, 0xf2, 0x5e, 0x99, 0x79, 0x84, 0x7b, 0x25, - 0x6d, 0xeb, 0x2b, 0xb9, 0x6c, 0xfd, 0x9f, 0x16, 0x60, 0x7a, 0xcb, 0xf7, 0x64, 0x96, 0xfd, 0xf8, - 0x13, 0xb6, 0xb7, 0x62, 0x2f, 0x74, 0xe7, 0xc7, 0x7e, 0xa1, 0x13, 0x50, 0xf2, 0x6d, 0x6e, 0x26, - 0xfe, 0x2e, 0x67, 0x64, 0x1e, 0x8b, 0x79, 0x3c, 0xf0, 0x00, 0xf2, 0xe1, 0x99, 0xc7, 0x4f, 0x2c, - 0xa8, 0xea, 0x9e, 0x5f, 0xdb, 0x14, 0x97, 0x9e, 0xdf, 0x88, 0x14, 0xd7, 0x1f, 0x47, 0x2b, 0x10, - 0x42, 0x43, 0xbf, 0x05, 0x0b, 0x83, 0xe0, 0x45, 0x70, 0xcb, 0xeb, 0x39, 0x2d, 0x87, 0x06, 0x59, - 0xd2, 0x8b, 0x39, 0x9f, 0x4b, 0xe5, 0xf0, 0xbd, 0xfa, 0x37, 0x34, 0xdf, 0x85, 0xad, 0x24, 0x2e, - 0x4e, 0xb3, 0xb2, 0xff, 0xc5, 0x82, 0xb9, 0x98, 0xec, 0x51, 0x0b, 0xa0, 0xe5, 0xb9, 0x6d, 0x87, - 0x87, 0xc5, 0x09, 0xd5, 0x0b, 0xab, 0xe3, 0x49, 0xb5, 0x11, 0x8c, 0x8b, 0x0e, 0x5d, 0xd8, 0xc4, - 0xb0, 0x01, 0x8b, 0x5e, 0x0e, 0xea, 0x84, 0xe2, 0x4e, 0x8c, 0xaa, 0x13, 0x7a, 0xb0, 0xbf, 0x32, - 0xab, 0xe7, 0x64, 0xd6, 0x0d, 0xe5, 0xa9, 0x98, 0xf9, 0xab, 0x02, 0x54, 0xc2, 0xf5, 0x3f, 0x06, - 0x35, 0x7a, 0x2b, 0xa6, 0x46, 0x2f, 0xe7, 0xdc, 0xb9, 0x51, 0x8f, 0xdc, 0xe8, 0xbd, 0x84, 0x32, - 0xe5, 0x3d, 0x12, 0x87, 0xa8, 0xd3, 0xdf, 0xa9, 0xcd, 0x57, 0x7d, 0x1f, 0x83, 0x42, 0xdd, 0x8e, - 0x2b, 0xd4, 0x6a, 0xce, 0xd5, 0x8c, 0x50, 0xa9, 0x1f, 0x59, 0x70, 0x2a, 0xa1, 0x04, 0xe8, 0x69, - 0x28, 0xc9, 0xac, 0x98, 0x3e, 0x5f, 0xe1, 0x40, 0x1d, 0xe0, 0x4b, 0x1a, 0xda, 0x82, 0x45, 0x32, - 0xe4, 0x5e, 0x38, 0xf6, 0xaa, 0x4b, 0xee, 0xf7, 0xa8, 0x8a, 0xda, 0x67, 0xea, 0xbf, 0xa0, 0xc7, - 0x2c, 0xae, 0x65, 0xf4, 0xc1, 0x99, 0x23, 0xed, 0xcf, 0x0a, 0x80, 0xc2, 0xc6, 0x3c, 0xe9, 0xe4, - 0xf7, 0x60, 0x7a, 0x5b, 0x25, 0x82, 0x1e, 0xed, 0x3d, 0xa0, 0x5e, 0x35, 0x9f, 0x44, 0x02, 0x4c, - 0xf4, 0xce, 0xd1, 0x9c, 0x23, 0x48, 0x9f, 0x21, 0x74, 0x17, 0x60, 0xdb, 0x71, 0x1d, 0xd6, 0x9d, - 0xf0, 0xe5, 0x52, 0xde, 0xe6, 0xd7, 0x42, 0x04, 0x6c, 0xa0, 0xd9, 0x1f, 0x15, 0x8c, 0xf3, 0x29, - 0xcd, 0xe5, 0x58, 0xfb, 0xfa, 0x7c, 0x5c, 0x98, 0x95, 0xf4, 0x5b, 0x91, 0x21, 0x98, 0xa9, 0x5d, - 0xe2, 0x07, 0x69, 0xeb, 0xbc, 0x05, 0x2a, 0x77, 0x88, 0xef, 0x88, 0x8d, 0x8f, 0xb6, 0xf4, 0x0e, - 0xf1, 0x19, 0x96, 0x90, 0xe8, 0xbb, 0x62, 0xaa, 0x74, 0x10, 0x98, 0xd0, 0xdc, 0x36, 0x81, 0xd3, - 0x81, 0xb9, 0x3e, 0x3a, 0x60, 0x58, 0x01, 0xda, 0x1f, 0x4d, 0x1b, 0x07, 0x5e, 0x5b, 0xed, 0x9b, - 0x80, 0x7a, 0x84, 0xf1, 0x1b, 0xc4, 0x6d, 0x8b, 0xe3, 0x49, 0xb7, 0x7d, 0xca, 0xba, 0xda, 0x43, - 0x5b, 0xd6, 0x28, 0x68, 0x33, 0xd5, 0x03, 0x67, 0x8c, 0x42, 0x17, 0xe3, 0xc6, 0x79, 0x25, 0x69, - 0x9c, 0x4f, 0x46, 0xda, 0x36, 0x99, 0x79, 0x36, 0x8f, 0x7b, 0xe9, 0x18, 0x8e, 0xfb, 0x6f, 0xc2, - 0xc2, 0x76, 0xf2, 0xed, 0x50, 0x57, 0x12, 0xbc, 0x36, 0xe1, 0xd3, 0x63, 0xfd, 0xcc, 0x41, 0xf4, - 0xe0, 0x14, 0x35, 0xe3, 0x34, 0x23, 0xe4, 0x05, 0x65, 0x94, 0x32, 0xfa, 0x54, 0x89, 0x85, 0xb1, - 0x55, 0x2e, 0x11, 0xb7, 0x26, 0x0b, 0x28, 0x15, 0x24, 0x8e, 0x31, 0x48, 0xa8, 0x60, 0xf9, 0x28, - 0x55, 0x10, 0x5d, 0x0c, 0x13, 0xfa, 0x62, 0x3a, 0xd2, 0x95, 0x2d, 0xa6, 0x52, 0xf1, 0x82, 0x84, - 0xcd, 0x7e, 0xe8, 0xc7, 0x16, 0x9c, 0x11, 0x87, 0xf5, 0xea, 0x87, 0xb4, 0x35, 0x14, 0x52, 0x09, - 0x6a, 0xa7, 0x97, 0xaa, 0x52, 0x1a, 0x63, 0x16, 0x95, 0x36, 0xb3, 0x20, 0x22, 0xbf, 0x3c, 0x93, - 0x8c, 0xb3, 0x19, 0xa3, 0xf7, 0xa5, 0xe9, 0xe0, 0x54, 0x86, 0x3d, 0x8f, 0x1e, 0xde, 0x57, 0xb4, - 0xd9, 0xe1, 0xca, 0xec, 0x70, 0x6a, 0xff, 0x57, 0xcc, 0x5a, 0x8d, 0x97, 0x74, 0xb8, 0x0b, 0x53, - 0x9c, 0xb0, 0x1d, 0xad, 0x05, 0xdf, 0x9a, 0xa0, 0x40, 0x2e, 0xd2, 0x05, 0xe9, 0x89, 0xcb, 0x26, - 0x89, 0x89, 0x96, 0xa1, 0x40, 0x58, 0x32, 0x05, 0xbd, 0xc6, 0x70, 0x81, 0x30, 0xf4, 0x0e, 0x94, - 0x7c, 0xca, 0xfd, 0x3d, 0x6d, 0xb0, 0x2f, 0x4d, 0x60, 0x9c, 0xb0, 0x18, 0xaf, 0xc4, 0x20, 0x7f, - 0x62, 0x85, 0x68, 0xe4, 0x51, 0x8a, 0xc7, 0x96, 0x47, 0xf9, 0xa9, 0x65, 0xdc, 0xb3, 0xe1, 0x64, - 0xd0, 0x5b, 0x30, 0xcd, 0x9d, 0x3e, 0xf5, 0x86, 0x3c, 0x9f, 0xf3, 0x12, 0x3e, 0x7c, 0x49, 0x73, - 0x72, 0x5b, 0x41, 0xe0, 0x00, 0x4b, 0x44, 0x74, 0xd4, 0xf7, 0x3d, 0xff, 0x76, 0x57, 0x98, 0x47, - 0xaf, 0xa7, 0x3c, 0x84, 0xb9, 0x28, 0xa2, 0xbb, 0x1a, 0xa3, 0xe2, 0x44, 0x6f, 0xfb, 0x33, 0xd3, - 0xcd, 0xfa, 0xff, 0x5f, 0x79, 0x49, 0x0c, 0xd9, 0x8b, 0x8e, 0x1b, 0xee, 0x60, 0x38, 0xce, 0x27, - 0x23, 0xcf, 0xc3, 0x74, 0x9b, 0x6e, 0x93, 0x61, 0x2f, 0x75, 0x2d, 0xaf, 0xab, 0x66, 0x1c, 0xd0, - 0xed, 0x7f, 0xb4, 0x60, 0xe1, 0x71, 0x57, 0x75, 0xde, 0x8b, 0x3b, 0xa7, 0x93, 0x88, 0xec, 0x21, - 0xe5, 0x9c, 0xf7, 0xe0, 0x89, 0x6c, 0xb5, 0x1d, 0x43, 0x70, 0xe7, 0x74, 0x15, 0x44, 0xa2, 0x9c, - 0x21, 0x2a, 0x78, 0x48, 0xcb, 0x4b, 0x3a, 0x4b, 0xdf, 0x83, 0xb2, 0x23, 0xf6, 0x86, 0xe5, 0x2b, - 0xb5, 0x4c, 0x6f, 0xae, 0xf1, 0xee, 0x2f, 0xf1, 0xb0, 0xc6, 0x8d, 0x7c, 0x9c, 0xc2, 0x51, 0xfb, - 0x38, 0xbe, 0xb9, 0x20, 0xfd, 0x91, 0x08, 0x7a, 0x4f, 0x1f, 0x6a, 0x2b, 0xcf, 0x87, 0x09, 0x29, - 0x98, 0x91, 0x07, 0xfb, 0x33, 0x0b, 0xce, 0x64, 0xf6, 0x0e, 0xdd, 0xc4, 0xc2, 0x31, 0xba, 0x89, - 0xd6, 0x51, 0x8b, 0xf0, 0xae, 0x21, 0xc2, 0x60, 0x0a, 0x47, 0xf5, 0x65, 0xd7, 0x4f, 0x0a, 0x30, - 0x8f, 0xe9, 0xc0, 0x8b, 0x65, 0x4c, 0xb7, 0x82, 0xba, 0xde, 0x1c, 0x21, 0x46, 0xe2, 0x5d, 0xae, - 0x3e, 0x1d, 0x2b, 0xe8, 0xfd, 0x2e, 0x94, 0x64, 0x32, 0x33, 0x9f, 0x19, 0x4b, 0xe5, 0x72, 0xd5, - 0x2d, 0xa5, 0xb2, 0xc2, 0x0a, 0x50, 0x20, 0xcb, 0x32, 0x13, 0x7d, 0x49, 0xbd, 0x96, 0xa3, 0x60, - 0x25, 0x8d, 0x2c, 0x9b, 0xb1, 0x02, 0xb4, 0x3f, 0x2e, 0x80, 0x0a, 0x47, 0x1e, 0x83, 0x95, 0xff, - 0xb5, 0x98, 0x95, 0x5f, 0x1d, 0xd7, 0xa9, 0x12, 0xe2, 0x19, 0x95, 0x72, 0x48, 0x86, 0x8a, 0xe7, - 0xf3, 0x80, 0x3e, 0x3c, 0xdd, 0xf0, 0xb7, 0x16, 0x54, 0x64, 0xbf, 0xc7, 0x60, 0xcd, 0xb7, 0xe2, - 0xd6, 0xfc, 0x85, 0x1c, 0xab, 0x18, 0x61, 0xc1, 0x3f, 0x2a, 0xea, 0xd9, 0x87, 0x81, 0x68, 0x97, - 0xf8, 0x6d, 0x1d, 0x62, 0x45, 0x1a, 0x28, 0x1a, 0xb1, 0xa2, 0xa1, 0x5f, 0x57, 0x15, 0x39, 0x94, - 0x71, 0xda, 0xbe, 0x16, 0xc6, 0x3b, 0xc5, 0xdc, 0xa5, 0x45, 0xba, 0xfc, 0x29, 0x4a, 0xb5, 0xe3, - 0x04, 0x2a, 0x4e, 0xf1, 0x11, 0x31, 0xd0, 0x20, 0x69, 0xcb, 0x74, 0x6c, 0xf0, 0xda, 0x84, 0x86, - 0x53, 0xc5, 0x40, 0xa9, 0x66, 0x9c, 0x66, 0x84, 0xba, 0x30, 0x6b, 0x16, 0x45, 0xea, 0xb3, 0x74, - 0x21, 0x7f, 0xf5, 0xa5, 0x7a, 0x5a, 0x35, 0x5b, 0x70, 0x0c, 0xd9, 0xde, 0x2f, 0x43, 0xd5, 0x38, - 0x7c, 0x89, 0xf4, 0xe5, 0xdc, 0xf1, 0xa4, 0x2f, 0xb3, 0xa3, 0xed, 0xea, 0x44, 0xd1, 0xf6, 0xf9, - 0x78, 0xb4, 0xfd, 0xcd, 0x64, 0xb4, 0x0d, 0x72, 0x75, 0xb1, 0x48, 0x9b, 0xc1, 0x49, 0x1d, 0x76, - 0x06, 0xd5, 0xad, 0xb9, 0xf2, 0x17, 0xe9, 0xe0, 0x16, 0x09, 0x2f, 0xf6, 0x5a, 0x0c, 0x12, 0x27, - 0x58, 0x08, 0x2f, 0x58, 0xb7, 0x34, 0x87, 0xfd, 0x3e, 0xf1, 0xf7, 0x96, 0x66, 0xe5, 0x84, 0x43, - 0x2f, 0xf8, 0x5a, 0x8c, 0x8a, 0x13, 0xbd, 0xd1, 0x16, 0x94, 0x55, 0xd4, 0xaa, 0x2b, 0x26, 0x5f, - 0xcc, 0x13, 0x10, 0xab, 0x28, 0x40, 0xfd, 0xc6, 0x1a, 0xc7, 0x4c, 0x38, 0x54, 0x0e, 0x49, 0x38, - 0xdc, 0x04, 0xe4, 0xdd, 0x97, 0xf1, 0x46, 0xfb, 0xba, 0xfa, 0x04, 0x5a, 0x9c, 0xca, 0xb2, 0x8c, - 0x66, 0xc3, 0x0d, 0xbb, 0x95, 0xea, 0x81, 0x33, 0x46, 0x09, 0xad, 0xd6, 0xa1, 0x6e, 0xa8, 0x0a, - 0x3a, 0xb9, 0x90, 0xd7, 0xc1, 0x8a, 0x62, 0x37, 0x59, 0x71, 0xd7, 0x48, 0xa0, 0xe2, 0x14, 0x1f, - 0xf4, 0x01, 0xcc, 0x89, 0x23, 0x14, 0x31, 0x86, 0x47, 0x64, 0xbc, 0x70, 0xb0, 0xbf, 0x32, 0xb7, - 0x69, 0x42, 0xe2, 0x38, 0x07, 0xfb, 0x0f, 0x8b, 0x90, 0x1d, 0x68, 0x47, 0xc5, 0xfe, 0xd6, 0x43, - 0x8a, 0xfd, 0xdf, 0x86, 0x0a, 0xe3, 0xc4, 0x57, 0x1f, 0x36, 0x14, 0x26, 0xfb, 0xb0, 0xa1, 0x19, - 0x00, 0xe0, 0x08, 0x2b, 0x91, 0xf5, 0x28, 0x1e, 0x69, 0xd6, 0xe3, 0x02, 0x80, 0x8c, 0xe1, 0x1a, - 0xde, 0x50, 0xbf, 0x73, 0xce, 0x45, 0x36, 0xe1, 0x6a, 0x48, 0xc1, 0x46, 0x2f, 0x74, 0x29, 0xbc, - 0x38, 0xd5, 0xc3, 0xe6, 0xb9, 0x54, 0x61, 0x46, 0x32, 0x6f, 0x96, 0xf1, 0x25, 0xf0, 0x21, 0x85, - 0x5c, 0xf6, 0xff, 0x16, 0x20, 0x66, 0x0c, 0xd1, 0x8f, 0x2c, 0x58, 0x20, 0x89, 0x8f, 0xa9, 0x03, - 0x5f, 0xf2, 0x57, 0xf3, 0x7d, 0xe1, 0x9e, 0xfa, 0x16, 0x3b, 0x7a, 0x4a, 0x4a, 0x76, 0x61, 0x38, - 0xcd, 0x14, 0xfd, 0xbe, 0x05, 0xa7, 0x49, 0xfa, 0x6b, 0x79, 0xbd, 0xe9, 0xaf, 0x4f, 0xfc, 0xb9, - 0x7d, 0xfd, 0xc9, 0x83, 0xfd, 0x95, 0xac, 0xff, 0x23, 0x80, 0xb3, 0xd8, 0xa1, 0x77, 0x61, 0x8a, - 0xf8, 0x9d, 0x20, 0xed, 0x9a, 0x9f, 0x6d, 0xf0, 0x4f, 0x10, 0x22, 0xef, 0x68, 0xcd, 0xef, 0x30, - 0x2c, 0x41, 0xed, 0x9f, 0x15, 0x61, 0x3e, 0xf9, 0x71, 0x80, 0xae, 0xf5, 0x9b, 0xca, 0xac, 0xf5, - 0x13, 0x3a, 0xd2, 0xe2, 0x61, 0xe1, 0x5d, 0xa4, 0x23, 0xa2, 0x11, 0x2b, 0x5a, 0xa8, 0x23, 0xb2, - 0x64, 0xb7, 0xf4, 0x08, 0x3a, 0x22, 0xeb, 0x74, 0x23, 0x2c, 0x74, 0x29, 0x7e, 0xb7, 0xd8, 0xc9, - 0xbb, 0x65, 0xc1, 0x5c, 0xcb, 0xa4, 0xc9, 0xdc, 0x3e, 0x54, 0x8d, 0x7d, 0xd0, 0x9a, 0x78, 0x39, - 0xb7, 0xdc, 0xa3, 0x63, 0x77, 0x4a, 0xfd, 0x27, 0x85, 0x88, 0x62, 0xe2, 0x47, 0x7a, 0x2f, 0xa5, - 0xf5, 0x48, 0xd9, 0x4e, 0x29, 0x2e, 0x03, 0xcd, 0xfe, 0x57, 0x0b, 0xe6, 0x62, 0x05, 0xa8, 0x82, - 0x5b, 0x50, 0xe8, 0x3b, 0xf9, 0xff, 0x16, 0xb8, 0x13, 0x22, 0x60, 0x03, 0x0d, 0x7d, 0x1f, 0xaa, - 0x3d, 0xcf, 0xed, 0x50, 0xc6, 0x9b, 0x1e, 0xd9, 0xd1, 0x7a, 0x92, 0x37, 0x65, 0xb5, 0x74, 0xb0, - 0xbf, 0xb2, 0xb8, 0xa9, 0x60, 0x1a, 0x5e, 0x7f, 0xd0, 0xa3, 0x5c, 0x55, 0x68, 0x63, 0x13, 0x5c, - 0x3e, 0x88, 0xbe, 0x4d, 0x7c, 0xda, 0xf5, 0x86, 0x8c, 0x7e, 0x5d, 0x1f, 0x44, 0xc3, 0x09, 0x1e, - 0xf5, 0x83, 0x68, 0x04, 0x7c, 0xf8, 0x83, 0x68, 0xd8, 0xf7, 0x6b, 0xfb, 0x20, 0x1a, 0xce, 0x70, - 0x44, 0xa4, 0xf2, 0x3f, 0x05, 0x63, 0x15, 0xf1, 0x68, 0xa5, 0xf0, 0x90, 0x68, 0xe5, 0x1e, 0xcc, - 0x38, 0x2e, 0xa7, 0xfe, 0x2e, 0xe9, 0xe9, 0xb4, 0x70, 0xde, 0xb3, 0x18, 0x2e, 0x75, 0x43, 0xe3, - 0xe0, 0x10, 0x11, 0xf5, 0xe0, 0x4c, 0xf0, 0x54, 0xe2, 0x53, 0x12, 0x3d, 0xd5, 0xea, 0x72, 0xa7, - 0x57, 0x83, 0x9c, 0xfe, 0xb5, 0xac, 0x4e, 0x0f, 0x46, 0x11, 0x70, 0x36, 0x28, 0x62, 0x30, 0xc7, - 0x8c, 0x30, 0x3d, 0xb8, 0x11, 0xc7, 0x7c, 0x66, 0x4a, 0x66, 0x36, 0x8c, 0x1a, 0x29, 0x13, 0x14, - 0xc7, 0x79, 0xd8, 0xff, 0x54, 0x84, 0x53, 0x89, 0x93, 0x96, 0x08, 0x47, 0x2a, 0x8f, 0x33, 0x1c, - 0x29, 0x4f, 0x14, 0x8e, 0x64, 0x7b, 0xca, 0x53, 0x13, 0x79, 0xca, 0x6f, 0x28, 0x6f, 0x55, 0xef, - 0xdc, 0xc6, 0xba, 0x2e, 0x29, 0x0f, 0xa5, 0xb9, 0x69, 0x12, 0x71, 0xbc, 0xaf, 0x74, 0x27, 0xda, - 0xe9, 0x6f, 0xd4, 0xb5, 0xab, 0xfd, 0x7a, 0xde, 0x9a, 0xc0, 0x10, 0x40, 0xb9, 0x13, 0x19, 0x04, - 0x9c, 0xc5, 0xae, 0x7e, 0xf3, 0xd3, 0x2f, 0xcf, 0x9e, 0xf8, 0xfc, 0xcb, 0xb3, 0x27, 0xbe, 0xf8, - 0xf2, 0xec, 0x89, 0x1f, 0x1e, 0x9c, 0xb5, 0x3e, 0x3d, 0x38, 0x6b, 0x7d, 0x7e, 0x70, 0xd6, 0xfa, - 0xe2, 0xe0, 0xac, 0xf5, 0x1f, 0x07, 0x67, 0xad, 0x1f, 0x7f, 0x75, 0xf6, 0xc4, 0xdd, 0x67, 0xc6, - 0xf9, 0xdf, 0x55, 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0x63, 0x1c, 0xc8, 0x24, 0xe2, 0x4a, 0x00, - 0x00, + // 4140 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0xcd, 0x6f, 0x23, 0x47, + 0x76, 0x9f, 0x26, 0x45, 0x4a, 0x7c, 0x94, 0x46, 0x52, 0x8d, 0xc6, 0xe6, 0x6a, 0x63, 0x69, 0xd2, + 0x36, 0x0c, 0x3b, 0xb6, 0xa9, 0x8c, 0xec, 0xb1, 0x67, 0xc6, 0x9b, 0x59, 0x88, 0xd4, 0x7c, 0x68, + 0x56, 0xeb, 0x51, 0x8a, 0xf2, 0x78, 0x3d, 0x1e, 0xc3, 0x5b, 0x22, 0x4b, 0x64, 0xaf, 0xc8, 0x6e, + 0xba, 0xbb, 0xa8, 0xb5, 0x92, 0x20, 0xd9, 0x7c, 0x01, 0x8b, 0x7c, 0x61, 0x0f, 0x06, 0xbc, 0x01, + 0x12, 0x20, 0x48, 0x8e, 0x8b, 0xe4, 0x1f, 0xc8, 0xc1, 0x87, 0x5c, 0x8c, 0xc0, 0x48, 0x8c, 0x24, + 0x40, 0x7c, 0xd8, 0x28, 0xb1, 0x0c, 0xe4, 0x98, 0x5b, 0x2e, 0x03, 0x04, 0x08, 0xea, 0xa3, 0xbb, + 0xab, 0x3f, 0x38, 0x62, 0x73, 0xa4, 0xc1, 0x24, 0x37, 0xa9, 0x5e, 0xbd, 0xdf, 0xab, 0x7a, 0x55, + 0xf5, 0xea, 0xbd, 0x57, 0xaf, 0x09, 0xaf, 0xb5, 0x2d, 0xd6, 0x19, 0xec, 0x54, 0x9b, 0x4e, 0x6f, + 0x85, 0xec, 0x0d, 0x2c, 0x76, 0xb0, 0xb2, 0x47, 0xdc, 0xb6, 0xb3, 0x42, 0xfa, 0xd6, 0xca, 0xfe, + 0x45, 0xd2, 0xed, 0x77, 0xc8, 0xc5, 0x95, 0x36, 0xb5, 0xa9, 0x4b, 0x18, 0x6d, 0x55, 0xfb, 0xae, + 0xc3, 0x1c, 0xf4, 0x5c, 0xc8, 0x55, 0x95, 0x5c, 0x55, 0xc1, 0x55, 0x25, 0x7d, 0xab, 0xea, 0x73, + 0x2d, 0xbe, 0xa2, 0x61, 0xb7, 0x9d, 0xb6, 0xb3, 0x22, 0x98, 0x77, 0x06, 0xbb, 0xe2, 0x3f, 0xf1, + 0x8f, 0xf8, 0x4b, 0x82, 0x2e, 0xde, 0xda, 0xbb, 0xec, 0x55, 0x2d, 0x21, 0x99, 0x7e, 0xc4, 0xa8, + 0xed, 0x59, 0x8e, 0xed, 0xbd, 0x42, 0xfa, 0x96, 0x47, 0xdd, 0x7d, 0xea, 0xae, 0xf4, 0xf7, 0xda, + 0x9c, 0xe6, 0x45, 0x3b, 0xac, 0xec, 0x27, 0x86, 0xb7, 0xf8, 0x5a, 0x88, 0xd4, 0x23, 0xcd, 0x8e, + 0x65, 0x53, 0xf7, 0x20, 0x64, 0xef, 0x51, 0x46, 0xd2, 0xb8, 0x56, 0x86, 0x71, 0xb9, 0x03, 0x9b, + 0x59, 0x3d, 0x9a, 0x60, 0x78, 0xfd, 0x38, 0x06, 0xaf, 0xd9, 0xa1, 0x3d, 0x12, 0xe7, 0x33, 0xef, + 0xc3, 0xb9, 0x35, 0x9b, 0x74, 0x0f, 0x3c, 0xcb, 0xc3, 0x03, 0x7b, 0xcd, 0x6d, 0x0f, 0x7a, 0xd4, + 0x66, 0xe8, 0x02, 0x4c, 0xd8, 0xa4, 0x47, 0x2b, 0xc6, 0x05, 0xe3, 0x85, 0x52, 0x6d, 0xfa, 0xb3, + 0xc3, 0xe5, 0x33, 0x47, 0x87, 0xcb, 0x13, 0x6f, 0x91, 0x1e, 0xc5, 0x82, 0x82, 0x9e, 0x85, 0xc2, + 0x3e, 0xe9, 0x0e, 0x68, 0x25, 0x27, 0xba, 0xcc, 0xa8, 0x2e, 0x85, 0xbb, 0xbc, 0x11, 0x4b, 0x9a, + 0xf9, 0xbb, 0xf9, 0x08, 0xfc, 0x77, 0x29, 0x23, 0x2d, 0xc2, 0x08, 0xea, 0x41, 0xb1, 0x4b, 0x76, + 0x68, 0xd7, 0xab, 0x18, 0x17, 0xf2, 0x2f, 0x94, 0x57, 0xaf, 0x57, 0x47, 0x59, 0xc4, 0x6a, 0x0a, + 0x54, 0x75, 0x53, 0xe0, 0x5c, 0xb7, 0x99, 0x7b, 0x50, 0x3b, 0xab, 0x06, 0x51, 0x94, 0x8d, 0x58, + 0x09, 0x41, 0xbf, 0x6d, 0x40, 0x99, 0xd8, 0xb6, 0xc3, 0x08, 0xe3, 0xcb, 0x54, 0xc9, 0x09, 0xa1, + 0xb7, 0xc7, 0x17, 0xba, 0x16, 0x82, 0x49, 0xc9, 0xe7, 0x94, 0xe4, 0xb2, 0x46, 0xc1, 0xba, 0xcc, + 0xc5, 0x2b, 0x50, 0xd6, 0x86, 0x8a, 0xe6, 0x20, 0xbf, 0x47, 0x0f, 0xa4, 0x7e, 0x31, 0xff, 0x13, + 0x2d, 0x44, 0x14, 0xaa, 0x34, 0x78, 0x35, 0x77, 0xd9, 0x58, 0xbc, 0x06, 0x73, 0x71, 0x81, 0x59, + 0xf8, 0xcd, 0x3f, 0x31, 0x60, 0x41, 0x9b, 0x05, 0xa6, 0xbb, 0xd4, 0xa5, 0x76, 0x93, 0xa2, 0x15, + 0x28, 0xf1, 0xb5, 0xf4, 0xfa, 0xa4, 0xe9, 0x2f, 0xf5, 0xbc, 0x9a, 0x48, 0xe9, 0x2d, 0x9f, 0x80, + 0xc3, 0x3e, 0xc1, 0xb6, 0xc8, 0x3d, 0x6c, 0x5b, 0xf4, 0x3b, 0xc4, 0xa3, 0x95, 0x7c, 0x74, 0x5b, + 0x6c, 0xf1, 0x46, 0x2c, 0x69, 0xe6, 0xaf, 0xc0, 0x37, 0xfc, 0xf1, 0x6c, 0xd3, 0x5e, 0xbf, 0x4b, + 0x18, 0x0d, 0x07, 0x75, 0xec, 0xd6, 0x33, 0xf7, 0x60, 0x66, 0xad, 0xdf, 0x77, 0x9d, 0x7d, 0xda, + 0x6a, 0x30, 0xd2, 0xa6, 0xe8, 0x1e, 0x00, 0x51, 0x0d, 0x6b, 0x4c, 0x30, 0x96, 0x57, 0x7f, 0xa9, + 0x2a, 0x4f, 0x44, 0x55, 0x3f, 0x11, 0xd5, 0xfe, 0x5e, 0x9b, 0x37, 0x78, 0x55, 0x7e, 0xf0, 0xaa, + 0xfb, 0x17, 0xab, 0xdb, 0x56, 0x8f, 0xd6, 0xce, 0x1e, 0x1d, 0x2e, 0xc3, 0x5a, 0x80, 0x80, 0x35, + 0x34, 0xf3, 0x77, 0x0c, 0x38, 0xbf, 0xe6, 0xb6, 0x9d, 0xfa, 0xfa, 0x5a, 0xbf, 0x7f, 0x8b, 0x92, + 0x2e, 0xeb, 0x34, 0x18, 0x61, 0x03, 0x0f, 0x5d, 0x83, 0xa2, 0x27, 0xfe, 0x52, 0x43, 0x7d, 0xde, + 0xdf, 0x7d, 0x92, 0xfe, 0xe0, 0x70, 0x79, 0x21, 0x85, 0x91, 0x62, 0xc5, 0x85, 0x5e, 0x84, 0xc9, + 0x1e, 0xf5, 0x3c, 0xd2, 0xf6, 0xf5, 0x39, 0xab, 0x00, 0x26, 0xbf, 0x2b, 0x9b, 0xb1, 0x4f, 0x37, + 0xff, 0x3e, 0x07, 0xb3, 0x01, 0x96, 0x12, 0x7f, 0x0a, 0x8b, 0x37, 0x80, 0xe9, 0x8e, 0x36, 0x43, + 0xb1, 0x86, 0xe5, 0xd5, 0x37, 0x47, 0x3c, 0x27, 0x69, 0x4a, 0xaa, 0x2d, 0x28, 0x31, 0xd3, 0x7a, + 0x2b, 0x8e, 0x88, 0x41, 0x3d, 0x00, 0xef, 0xc0, 0x6e, 0x2a, 0xa1, 0x13, 0x42, 0xe8, 0x95, 0x8c, + 0x42, 0x1b, 0x01, 0x40, 0x0d, 0x29, 0x91, 0x10, 0xb6, 0x61, 0x4d, 0x80, 0xf9, 0x37, 0x06, 0x9c, + 0x4b, 0xe1, 0x43, 0xdf, 0x8a, 0xad, 0xe7, 0x73, 0x89, 0xf5, 0x44, 0x09, 0xb6, 0x70, 0x35, 0x5f, + 0x86, 0x29, 0x97, 0xee, 0x5b, 0xfc, 0x1e, 0x50, 0x1a, 0x9e, 0x53, 0xfc, 0x53, 0x58, 0xb5, 0xe3, + 0xa0, 0x07, 0x7a, 0x09, 0x4a, 0xfe, 0xdf, 0x5c, 0xcd, 0x79, 0x7e, 0x54, 0xf8, 0xc2, 0xf9, 0x5d, + 0x3d, 0x1c, 0xd2, 0xcd, 0xdf, 0x82, 0x42, 0xbd, 0x43, 0x5c, 0xc6, 0x77, 0x8c, 0x4b, 0xfb, 0xce, + 0xdb, 0x78, 0x53, 0x0d, 0x31, 0xd8, 0x31, 0x58, 0x36, 0x63, 0x9f, 0x3e, 0xc2, 0x62, 0xbf, 0x08, + 0x93, 0xfb, 0xd4, 0x15, 0xe3, 0xcd, 0x47, 0xc1, 0xee, 0xca, 0x66, 0xec, 0xd3, 0xcd, 0x7f, 0x36, + 0x60, 0x41, 0x8c, 0x60, 0xdd, 0xf2, 0x9a, 0xce, 0x3e, 0x75, 0x0f, 0x30, 0xf5, 0x06, 0xdd, 0x13, + 0x1e, 0xd0, 0x3a, 0xcc, 0x79, 0xb4, 0xb7, 0x4f, 0xdd, 0xba, 0x63, 0x7b, 0xcc, 0x25, 0x96, 0xcd, + 0xd4, 0xc8, 0x2a, 0xaa, 0xf7, 0x5c, 0x23, 0x46, 0xc7, 0x09, 0x0e, 0xf4, 0x02, 0x4c, 0xa9, 0x61, + 0xf3, 0xad, 0xc4, 0x15, 0x3b, 0xcd, 0xd7, 0x40, 0xcd, 0xc9, 0xc3, 0x01, 0xd5, 0xfc, 0x4f, 0x03, + 0xe6, 0xc5, 0xac, 0x1a, 0x83, 0x1d, 0xaf, 0xe9, 0x5a, 0x7d, 0x6e, 0x5e, 0x9f, 0xc4, 0x29, 0x5d, + 0x83, 0xb3, 0x2d, 0x5f, 0xf1, 0x9b, 0x56, 0xcf, 0x62, 0xe2, 0x8c, 0x14, 0x6a, 0x4f, 0x29, 0x8c, + 0xb3, 0xeb, 0x11, 0x2a, 0x8e, 0xf5, 0x96, 0xcb, 0xd7, 0x1d, 0x78, 0x8c, 0xba, 0x5b, 0xae, 0xd3, + 0x73, 0xf8, 0x3c, 0xb7, 0x89, 0xb7, 0x87, 0xbe, 0x0f, 0x53, 0x3d, 0x75, 0xa5, 0x29, 0xab, 0xf9, + 0xcb, 0xa3, 0x59, 0xcd, 0x3b, 0x3b, 0x3f, 0xa0, 0x4d, 0xc6, 0xaf, 0xc3, 0xf0, 0xb4, 0x85, 0x6d, + 0x38, 0x40, 0x45, 0xef, 0xc2, 0x84, 0xd7, 0xa7, 0x4d, 0xa1, 0xa2, 0xf2, 0xea, 0x1b, 0xa3, 0x1d, + 0xea, 0xc8, 0x20, 0x1b, 0x7d, 0xda, 0x0c, 0x75, 0xcb, 0xff, 0xc3, 0x02, 0xd2, 0xfc, 0x37, 0x03, + 0x2a, 0x69, 0xb3, 0xda, 0xb4, 0x3c, 0x86, 0xee, 0x27, 0x66, 0x56, 0x1d, 0x6d, 0x66, 0x9c, 0x5b, + 0xcc, 0x2b, 0x38, 0xbd, 0x7e, 0x8b, 0x36, 0xab, 0x26, 0x14, 0x2c, 0x46, 0x7b, 0xbe, 0x23, 0x71, + 0x6d, 0xb4, 0x69, 0x0d, 0x1b, 0x6c, 0x78, 0x49, 0x6e, 0x70, 0x50, 0x2c, 0xb1, 0xcd, 0xf7, 0x60, + 0xba, 0x3e, 0x70, 0x5d, 0x6a, 0x33, 0x79, 0xc9, 0x7d, 0x07, 0x0a, 0x9e, 0x65, 0x2b, 0x5b, 0x9f, + 0xed, 0x7e, 0x2b, 0x71, 0xf0, 0x06, 0x67, 0xc6, 0x12, 0xc3, 0xfc, 0xb3, 0x3c, 0x9c, 0xf3, 0x77, + 0x0d, 0x6d, 0xad, 0xb9, 0xcc, 0xda, 0x25, 0x4d, 0xe6, 0xa1, 0x16, 0x4c, 0xb7, 0xc2, 0x66, 0xa6, + 0x8c, 0x71, 0x16, 0x59, 0x81, 0xc1, 0xd7, 0xe0, 0x19, 0x8e, 0xa0, 0xa2, 0x77, 0x20, 0xdf, 0xb6, + 0x98, 0xf2, 0xfd, 0x2e, 0x8f, 0xa6, 0xbd, 0x9b, 0x56, 0xdc, 0xfa, 0xd4, 0xca, 0x4a, 0x54, 0xfe, + 0xa6, 0xc5, 0x30, 0x47, 0x44, 0x3b, 0x50, 0xb4, 0x7a, 0xa4, 0x4d, 0xfd, 0x95, 0xb9, 0x3a, 0x1a, + 0xf6, 0x06, 0xe7, 0x89, 0xa3, 0x07, 0xce, 0xa4, 0xa0, 0x7a, 0x58, 0x21, 0x73, 0x19, 0x4d, 0x6e, + 0x35, 0xa4, 0xdd, 0x1e, 0x59, 0x46, 0x9a, 0xfd, 0x0c, 0x65, 0x08, 0xaa, 0x87, 0x15, 0xb2, 0xf9, + 0x65, 0x0e, 0xe6, 0x42, 0xfd, 0xd5, 0x9d, 0x5e, 0xcf, 0x62, 0x68, 0x11, 0x72, 0x56, 0x4b, 0x19, + 0x25, 0x50, 0x8c, 0xb9, 0x8d, 0x75, 0x9c, 0xb3, 0x5a, 0xe8, 0x79, 0x28, 0xee, 0xb8, 0xc4, 0x6e, + 0x76, 0x94, 0x31, 0x0a, 0x80, 0x6b, 0xa2, 0x15, 0x2b, 0x2a, 0x7a, 0x06, 0xf2, 0x8c, 0xb4, 0x95, + 0x0d, 0x0a, 0xf4, 0xb7, 0x4d, 0xda, 0x98, 0xb7, 0x73, 0xe3, 0xe7, 0x0d, 0xc4, 0x39, 0x16, 0x2b, + 0xaf, 0x19, 0xbf, 0x86, 0x6c, 0xc6, 0x3e, 0x9d, 0x4b, 0x24, 0x03, 0xd6, 0x71, 0xdc, 0x4a, 0x21, + 0x2a, 0x71, 0x4d, 0xb4, 0x62, 0x45, 0xe5, 0x6e, 0x4a, 0x53, 0x8c, 0x9f, 0x51, 0xb7, 0x52, 0x8c, + 0xba, 0x29, 0x75, 0x9f, 0x80, 0xc3, 0x3e, 0xe8, 0x7d, 0x28, 0x37, 0x5d, 0x4a, 0x98, 0xe3, 0xae, + 0x13, 0x46, 0x2b, 0x93, 0x99, 0x77, 0xe0, 0x2c, 0xf7, 0xc3, 0xeb, 0x21, 0x04, 0xd6, 0xf1, 0xcc, + 0xff, 0x32, 0xa0, 0x12, 0xaa, 0x56, 0xac, 0x6d, 0xe8, 0x7b, 0x2a, 0xf5, 0x18, 0x43, 0xd4, 0xf3, + 0x3c, 0x14, 0x5b, 0x56, 0x9b, 0x7a, 0x2c, 0xae, 0xe5, 0x75, 0xd1, 0x8a, 0x15, 0x15, 0xad, 0x02, + 0xb4, 0x2d, 0xa6, 0xee, 0x0b, 0xa5, 0xec, 0xc0, 0x4e, 0xde, 0x0c, 0x28, 0x58, 0xeb, 0x85, 0xde, + 0x81, 0x92, 0x18, 0xe6, 0x98, 0xc7, 0x4e, 0x78, 0x0f, 0x75, 0x1f, 0x00, 0x87, 0x58, 0xe6, 0x17, + 0x13, 0x30, 0x79, 0xc3, 0xa5, 0x56, 0xbb, 0xc3, 0x1e, 0x83, 0xc1, 0x7f, 0x16, 0x0a, 0xa4, 0x6b, + 0x11, 0x4f, 0xac, 0x9b, 0xe6, 0xff, 0xaf, 0xf1, 0x46, 0x2c, 0x69, 0xe8, 0x3d, 0x28, 0x3a, 0xae, + 0xd5, 0xb6, 0xec, 0x4a, 0x49, 0x0c, 0xe2, 0xd5, 0xd1, 0x8e, 0x90, 0x9a, 0xc5, 0x1d, 0xc1, 0x1a, + 0x2a, 0x5f, 0xfe, 0x8f, 0x15, 0x24, 0xba, 0x07, 0x93, 0x72, 0x33, 0xf9, 0x07, 0x74, 0x65, 0x64, + 0x03, 0x23, 0xf7, 0x63, 0xb8, 0xe9, 0xe5, 0xff, 0x1e, 0xf6, 0x01, 0x51, 0x23, 0xb0, 0x2f, 0x13, + 0x02, 0xfa, 0xa5, 0x0c, 0xf6, 0x65, 0xa8, 0x41, 0x69, 0x04, 0x06, 0xa5, 0x90, 0x05, 0x54, 0x98, + 0x8c, 0x61, 0x16, 0x84, 0xab, 0x58, 0x39, 0xb3, 0xc5, 0x31, 0x54, 0xac, 0x3c, 0xe9, 0xb3, 0x51, + 0x0f, 0xd8, 0xf7, 0x75, 0xcd, 0x8f, 0xf3, 0x30, 0xaf, 0x7a, 0xd6, 0x9d, 0x6e, 0x97, 0x36, 0x85, + 0xe7, 0x24, 0xed, 0x53, 0x3e, 0xd5, 0x3e, 0x59, 0xfe, 0x8d, 0x29, 0x6d, 0x7e, 0x2d, 0xd3, 0x68, + 0x42, 0x19, 0x55, 0x71, 0x43, 0xca, 0x90, 0x3b, 0x58, 0x25, 0xd5, 0x4b, 0xdd, 0x9b, 0xe8, 0xf7, + 0x0d, 0x38, 0xb7, 0x4f, 0x5d, 0x6b, 0xd7, 0x6a, 0x8a, 0x80, 0xf9, 0x96, 0xe5, 0x31, 0xc7, 0x3d, + 0x50, 0x37, 0xc2, 0xeb, 0xa3, 0x49, 0xbe, 0xab, 0x01, 0x6c, 0xd8, 0xbb, 0x4e, 0xed, 0x9b, 0x4a, + 0xda, 0xb9, 0xbb, 0x49, 0x68, 0x9c, 0x26, 0x6f, 0xb1, 0x0f, 0x10, 0x8e, 0x36, 0x25, 0x5e, 0xdf, + 0xd4, 0xe3, 0xf5, 0x91, 0x07, 0xe6, 0x4f, 0xd6, 0x37, 0x59, 0x7a, 0x9c, 0xff, 0xa9, 0x01, 0x65, + 0x45, 0x7f, 0x0c, 0x4e, 0x10, 0x8e, 0x3a, 0x41, 0xaf, 0x64, 0x1a, 0xff, 0x10, 0x9f, 0xc7, 0x85, + 0x99, 0xc8, 0x21, 0x47, 0x97, 0x60, 0x62, 0xcf, 0xb2, 0xfd, 0x5b, 0xef, 0x17, 0x7d, 0x37, 0xf0, + 0x3b, 0x96, 0xdd, 0x7a, 0x70, 0xb8, 0x3c, 0x1f, 0xe9, 0xcc, 0x1b, 0xb1, 0xe8, 0x7e, 0xbc, 0x67, + 0x7e, 0x75, 0xea, 0xa7, 0x7f, 0xb1, 0x7c, 0xe6, 0x47, 0x3f, 0xbf, 0x70, 0xc6, 0xfc, 0x24, 0x0f, + 0x73, 0x71, 0xad, 0x8e, 0x90, 0xff, 0x0a, 0x6d, 0xd8, 0xd4, 0xa9, 0xda, 0xb0, 0xdc, 0xe9, 0xd9, + 0xb0, 0xfc, 0x69, 0xd8, 0xb0, 0x89, 0x13, 0xb3, 0x61, 0xe6, 0x3f, 0x18, 0x70, 0x36, 0x58, 0x99, + 0x0f, 0x07, 0xfc, 0x66, 0x0d, 0xb5, 0x6e, 0x9c, 0xbc, 0xd6, 0x3f, 0x80, 0x49, 0xcf, 0x19, 0xb8, + 0x4d, 0xe1, 0x3e, 0x72, 0xf4, 0xd7, 0xb2, 0x19, 0x4d, 0xc9, 0xab, 0xf9, 0x4c, 0xb2, 0x01, 0xfb, + 0xa8, 0xfa, 0x84, 0x14, 0x4d, 0xba, 0x14, 0x2e, 0x77, 0xb8, 0xf8, 0x84, 0xa6, 0x74, 0x97, 0x82, + 0xb7, 0x62, 0x45, 0x45, 0xa6, 0xb0, 0xe7, 0xbe, 0x67, 0x5b, 0xaa, 0x81, 0x32, 0xcb, 0x62, 0x11, + 0x24, 0x05, 0xf5, 0x61, 0xce, 0xa5, 0x1f, 0x0e, 0x2c, 0x97, 0xb6, 0x1a, 0x0e, 0xd9, 0xe3, 0x7e, + 0x81, 0x4a, 0xe1, 0x8c, 0x78, 0xee, 0xd7, 0x07, 0xae, 0x30, 0x61, 0xb5, 0x05, 0x1e, 0x99, 0xe2, + 0x18, 0x16, 0x4e, 0xa0, 0x9b, 0xff, 0x5e, 0x08, 0x0e, 0xac, 0x4a, 0xa2, 0xfc, 0x3a, 0x94, 0x9b, + 0x32, 0x6a, 0xe9, 0x1e, 0x6c, 0xd8, 0x6a, 0x8b, 0xad, 0x8f, 0x71, 0xf9, 0x54, 0xeb, 0x21, 0x4c, + 0x2c, 0xc7, 0xaa, 0x51, 0xb0, 0x2e, 0x0d, 0xfd, 0x10, 0x40, 0x5a, 0x62, 0xda, 0xda, 0xb0, 0xd5, + 0x55, 0x53, 0x1f, 0x47, 0xf6, 0xdd, 0x00, 0x45, 0x8a, 0x0e, 0x7c, 0x9e, 0x90, 0x80, 0x35, 0x51, + 0x7c, 0xd6, 0x7e, 0xca, 0xf0, 0x86, 0xe3, 0xaa, 0x33, 0x3b, 0xd6, 0xac, 0xd7, 0x42, 0x98, 0x78, + 0x66, 0x39, 0xa4, 0x60, 0x5d, 0xda, 0xa2, 0x0b, 0x73, 0x71, 0x5d, 0xa5, 0x5c, 0x37, 0xb7, 0xa2, + 0xd7, 0xcd, 0xea, 0x88, 0x07, 0x54, 0x8b, 0x40, 0xf5, 0x94, 0xb4, 0x0b, 0xb3, 0x31, 0x1d, 0xa5, + 0x88, 0xdc, 0x88, 0x8a, 0x7c, 0x35, 0xcb, 0xd5, 0xab, 0x52, 0xbb, 0xba, 0x4c, 0x0f, 0xe6, 0xe2, + 0xda, 0x39, 0x31, 0xa1, 0x91, 0x7c, 0xb2, 0x7e, 0xa7, 0xfe, 0x79, 0x0e, 0x4a, 0x81, 0x55, 0xcd, + 0x92, 0x1c, 0x92, 0xde, 0x50, 0xee, 0x98, 0x68, 0x2d, 0x3f, 0x4a, 0xb4, 0x36, 0x31, 0x3c, 0x5a, + 0xf3, 0x13, 0xc8, 0xc5, 0x87, 0x27, 0x90, 0xb5, 0x68, 0x6d, 0x72, 0xf4, 0x68, 0x6d, 0xea, 0xf8, + 0x68, 0xcd, 0xfc, 0x4b, 0x03, 0x50, 0x32, 0x34, 0xcf, 0xa2, 0x28, 0x12, 0xbf, 0xeb, 0x46, 0xf4, + 0x84, 0xe2, 0xf1, 0xf1, 0xf0, 0x2b, 0xcf, 0xfc, 0xb4, 0x00, 0xb3, 0x37, 0xad, 0xb1, 0xf3, 0x7c, + 0x0c, 0x9e, 0x96, 0x48, 0x0d, 0xaa, 0xfc, 0xd0, 0x06, 0x73, 0x09, 0xa3, 0xed, 0x03, 0xb5, 0xbe, + 0x57, 0x15, 0xeb, 0xd3, 0xf5, 0xf4, 0x6e, 0x0f, 0x86, 0x93, 0xf0, 0x30, 0xe8, 0x91, 0x37, 0xc9, + 0x9b, 0x30, 0xe3, 0x31, 0xd7, 0x6a, 0x32, 0x99, 0x49, 0xf4, 0x2a, 0x65, 0x71, 0x91, 0x9c, 0x57, + 0xdd, 0x67, 0x1a, 0x3a, 0x11, 0x47, 0xfb, 0xa6, 0x26, 0x28, 0x27, 0x32, 0x27, 0x28, 0x57, 0xa0, + 0x44, 0xba, 0x5d, 0xe7, 0x87, 0xdb, 0xa4, 0xed, 0xa9, 0x74, 0x40, 0xb0, 0x6b, 0xd6, 0x7c, 0x02, + 0x0e, 0xfb, 0xa0, 0x2a, 0x80, 0xd5, 0xb6, 0x1d, 0x97, 0x0a, 0x8e, 0xa2, 0xb8, 0xd1, 0xc4, 0x23, + 0xcc, 0x46, 0xd0, 0x8a, 0xb5, 0x1e, 0xa8, 0x01, 0xe7, 0x2d, 0xdb, 0xa3, 0xcd, 0x81, 0x4b, 0x1b, + 0x7b, 0x56, 0x7f, 0x7b, 0xb3, 0x21, 0xac, 0xc4, 0x81, 0xd8, 0xcd, 0x53, 0xb5, 0x67, 0x94, 0xb0, + 0xf3, 0x1b, 0x69, 0x9d, 0x70, 0x3a, 0x2f, 0x7a, 0x0d, 0xa6, 0x2d, 0xbb, 0xd9, 0x1d, 0xb4, 0xe8, + 0x16, 0x61, 0x1d, 0xaf, 0x32, 0x25, 0x86, 0x31, 0x77, 0x74, 0xb8, 0x3c, 0xbd, 0xa1, 0xb5, 0xe3, + 0x48, 0x2f, 0xce, 0x45, 0x3f, 0xd2, 0xb8, 0x4a, 0x21, 0xd7, 0xf5, 0x8f, 0x74, 0x2e, 0xbd, 0x57, + 0x4a, 0x0a, 0x17, 0x32, 0xa5, 0x70, 0x7f, 0x96, 0x83, 0xa2, 0x7c, 0x41, 0x41, 0x97, 0x62, 0xcf, + 0x14, 0xcf, 0x24, 0x9e, 0x29, 0xca, 0x69, 0xaf, 0x4d, 0x26, 0x14, 0x2d, 0xcf, 0x1b, 0x44, 0x1d, + 0x88, 0x0d, 0xd1, 0x82, 0x15, 0x45, 0xa4, 0xb6, 0x1c, 0x7b, 0xd7, 0x6a, 0xab, 0x04, 0xc4, 0x35, + 0xcd, 0x6d, 0x08, 0x5f, 0xb9, 0x3f, 0x08, 0x9e, 0xc1, 0x43, 0x0f, 0x22, 0xd2, 0x81, 0xbb, 0x12, + 0xb7, 0x1b, 0x77, 0xde, 0x92, 0x32, 0xea, 0x02, 0x11, 0x2b, 0x64, 0x2e, 0xc3, 0x19, 0xb0, 0xfe, + 0x80, 0x89, 0x8d, 0x72, 0x42, 0x32, 0xee, 0x08, 0x44, 0xac, 0x90, 0xcd, 0x4f, 0x0c, 0x98, 0x95, + 0x3a, 0xa8, 0x77, 0x68, 0x73, 0xaf, 0xc1, 0x68, 0x9f, 0x7b, 0xf4, 0x03, 0x8f, 0x7a, 0x71, 0x8f, + 0xfe, 0x6d, 0x8f, 0x7a, 0x58, 0x50, 0xb4, 0xd9, 0xe7, 0x4e, 0x6b, 0xf6, 0xe6, 0x5f, 0x1b, 0x50, + 0x10, 0xae, 0x73, 0x16, 0xfb, 0x13, 0x4d, 0x27, 0xe5, 0x46, 0x4a, 0x27, 0x1d, 0x93, 0xe8, 0x0b, + 0x33, 0x59, 0x13, 0x0f, 0xcb, 0x64, 0x99, 0x5f, 0x1b, 0xb0, 0x90, 0x96, 0x1d, 0xcd, 0x32, 0xfc, + 0x97, 0x61, 0xaa, 0xdf, 0x25, 0x6c, 0xd7, 0x71, 0x7b, 0xf1, 0x97, 0xb1, 0x2d, 0xd5, 0x8e, 0x83, + 0x1e, 0xc8, 0x05, 0x70, 0xfd, 0x30, 0xcc, 0x0f, 0x51, 0xae, 0x65, 0xbd, 0x11, 0xa2, 0x69, 0xbd, + 0x50, 0x59, 0x41, 0x93, 0x87, 0x35, 0x29, 0xe6, 0x1f, 0x16, 0x60, 0x5e, 0xb0, 0x8c, 0x7b, 0x43, + 0x8c, 0xb3, 0x42, 0x7d, 0x78, 0x4a, 0x04, 0x4f, 0xc9, 0x4b, 0x45, 0x2e, 0xda, 0x65, 0xc5, 0xff, + 0xd4, 0x46, 0x6a, 0xaf, 0x07, 0x43, 0x29, 0x78, 0x08, 0x6e, 0xf2, 0xa6, 0x80, 0xff, 0x7f, 0x37, + 0x85, 0xbe, 0xd9, 0x26, 0x8f, 0xdd, 0x6c, 0x43, 0xef, 0x95, 0xa9, 0x47, 0xb8, 0x57, 0x92, 0xb6, + 0xbe, 0x94, 0xc9, 0xd6, 0xff, 0x69, 0x0e, 0x26, 0xb7, 0x5c, 0x47, 0x64, 0xd9, 0x4f, 0x3f, 0x61, + 0x7b, 0x27, 0xf2, 0x42, 0x77, 0x71, 0xe4, 0x17, 0x3a, 0x0e, 0x25, 0xde, 0xe6, 0xa6, 0xa2, 0xef, + 0x72, 0x5a, 0xe6, 0x31, 0x9f, 0xc5, 0x03, 0xf7, 0x21, 0x1f, 0x9e, 0x79, 0xfc, 0xd4, 0x80, 0xb2, + 0xea, 0xf9, 0xc4, 0xa6, 0xb8, 0xd4, 0xf8, 0x86, 0xa4, 0xb8, 0xfe, 0x38, 0x9c, 0x01, 0x57, 0x1a, + 0xfa, 0x4d, 0x98, 0xef, 0xfb, 0x2f, 0x82, 0x5b, 0x4e, 0xd7, 0x6a, 0x5a, 0xd4, 0xcf, 0x92, 0x5e, + 0xca, 0xf8, 0x5c, 0x2a, 0xd8, 0x0f, 0x6a, 0xdf, 0x50, 0x72, 0xe7, 0xb7, 0xe2, 0xb8, 0x38, 0x29, + 0xca, 0xfc, 0x17, 0x03, 0x66, 0x22, 0xba, 0x47, 0x4d, 0x80, 0xa6, 0x63, 0xb7, 0x2c, 0x16, 0x14, + 0x27, 0x94, 0x57, 0x57, 0x46, 0xd3, 0x6a, 0xdd, 0xe7, 0x0b, 0x37, 0x5d, 0xd0, 0xe4, 0x61, 0x0d, + 0x16, 0xbd, 0xea, 0xd7, 0x09, 0x45, 0x9d, 0x18, 0x59, 0x27, 0xf4, 0xe0, 0x70, 0x79, 0x5a, 0x8d, + 0x49, 0xaf, 0x1b, 0xca, 0x52, 0x31, 0xf3, 0x57, 0x39, 0x28, 0x05, 0xf3, 0x7f, 0x0c, 0xc7, 0xe8, + 0xed, 0xc8, 0x31, 0x7a, 0x35, 0xe3, 0xca, 0x0d, 0x7b, 0xe4, 0x46, 0xef, 0xc7, 0x0e, 0x53, 0xd6, + 0x2d, 0x71, 0xcc, 0x71, 0xfa, 0x3b, 0xb9, 0xf8, 0xb2, 0xef, 0x63, 0x38, 0x50, 0xdb, 0xd1, 0x03, + 0xb5, 0x92, 0x71, 0x36, 0x43, 0x8e, 0xd4, 0x8f, 0x0d, 0x98, 0x8d, 0x1d, 0x02, 0xf4, 0x2c, 0x14, + 0x44, 0x56, 0x4c, 0xed, 0xaf, 0x80, 0x51, 0x05, 0xf8, 0x82, 0x86, 0xb6, 0x60, 0x81, 0x0c, 0x98, + 0x13, 0xf0, 0x5e, 0xb7, 0xc9, 0x4e, 0x97, 0xca, 0xa8, 0x7d, 0xaa, 0xf6, 0x0b, 0x8a, 0x67, 0x61, + 0x2d, 0xa5, 0x0f, 0x4e, 0xe5, 0x34, 0x3f, 0xcf, 0x01, 0x0a, 0x1a, 0xb3, 0xa4, 0x93, 0xdf, 0x87, + 0xc9, 0x5d, 0x99, 0x08, 0x7a, 0xb4, 0xf7, 0x80, 0x5a, 0x59, 0x7f, 0x12, 0xf1, 0x31, 0xd1, 0xbb, + 0x27, 0xb3, 0x8f, 0x20, 0xb9, 0x87, 0xd0, 0x3d, 0x80, 0x5d, 0xcb, 0xb6, 0xbc, 0xce, 0x98, 0x2f, + 0x97, 0xe2, 0x36, 0xbf, 0x11, 0x20, 0x60, 0x0d, 0xcd, 0xfc, 0x38, 0xa7, 0xed, 0x4f, 0x61, 0x2e, + 0x47, 0x5a, 0xd7, 0x17, 0xa3, 0xca, 0x2c, 0x25, 0xdf, 0x8a, 0x34, 0xc5, 0x4c, 0xec, 0x13, 0xd7, + 0x4f, 0x5b, 0x67, 0x2d, 0x50, 0xb9, 0x4b, 0x5c, 0x8b, 0x2f, 0x7c, 0xb8, 0xa4, 0x77, 0x89, 0xeb, + 0x61, 0x01, 0x89, 0xbe, 0xc7, 0x87, 0x4a, 0xfb, 0xbe, 0x09, 0xcd, 0x6c, 0x13, 0x18, 0xed, 0xeb, + 0xf3, 0xa3, 0x7d, 0x0f, 0x4b, 0x40, 0xf3, 0xe3, 0x49, 0x6d, 0xc3, 0x2b, 0xab, 0x7d, 0x1b, 0x50, + 0x97, 0x78, 0xec, 0x16, 0xb1, 0x5b, 0x7c, 0x7b, 0xd2, 0x5d, 0x97, 0x7a, 0x1d, 0xe5, 0xa1, 0x2d, + 0x2a, 0x14, 0xb4, 0x99, 0xe8, 0x81, 0x53, 0xb8, 0xd0, 0xa5, 0xa8, 0x71, 0x5e, 0x8e, 0x1b, 0xe7, + 0xb3, 0xe1, 0x69, 0x1b, 0xcf, 0x3c, 0xeb, 0xdb, 0xbd, 0x70, 0x0a, 0xdb, 0xfd, 0x37, 0x60, 0x7e, + 0x37, 0xfe, 0x76, 0xa8, 0x2a, 0x09, 0xde, 0x18, 0xf3, 0xe9, 0xb1, 0x76, 0xfe, 0x28, 0x7c, 0x70, + 0x0a, 0x9b, 0x71, 0x52, 0x10, 0x72, 0xfc, 0x32, 0x4a, 0x11, 0x7d, 0xca, 0xc4, 0xc2, 0xc8, 0x47, + 0x2e, 0x16, 0xb7, 0xc6, 0x0b, 0x28, 0x25, 0x24, 0x8e, 0x08, 0x88, 0x1d, 0xc1, 0xe2, 0x49, 0x1e, + 0x41, 0x74, 0x29, 0x48, 0xe8, 0xf3, 0xe1, 0x08, 0x57, 0x36, 0x9f, 0x48, 0xc5, 0x73, 0x12, 0xd6, + 0xfb, 0xa1, 0x9f, 0x18, 0x70, 0x9e, 0x6f, 0xd6, 0xeb, 0x1f, 0xd1, 0xe6, 0x80, 0x6b, 0xc5, 0xaf, + 0x9d, 0xae, 0x94, 0x85, 0x36, 0x46, 0x2c, 0x2a, 0x6d, 0xa4, 0x41, 0x84, 0x7e, 0x79, 0x2a, 0x19, + 0xa7, 0x0b, 0x46, 0x1f, 0x08, 0xd3, 0xc1, 0xa8, 0x08, 0x7b, 0x1e, 0x3d, 0xbc, 0x2f, 0x29, 0xb3, + 0xc3, 0xa4, 0xd9, 0x61, 0xd4, 0xfc, 0xa3, 0x09, 0xdd, 0x5a, 0x8d, 0x96, 0x74, 0xb8, 0x07, 0x13, + 0x8c, 0x78, 0x7b, 0xea, 0x14, 0x7c, 0x6b, 0x8c, 0x02, 0xb9, 0xf0, 0x2c, 0x08, 0x4f, 0x5c, 0x34, + 0x09, 0x4c, 0xb4, 0x08, 0x39, 0xe2, 0xc5, 0x53, 0xd0, 0x6b, 0x1e, 0xce, 0x11, 0x0f, 0xbd, 0x0b, + 0x05, 0x97, 0x32, 0xf7, 0x40, 0x19, 0xec, 0xcb, 0x63, 0x18, 0x27, 0xcc, 0xf9, 0xa5, 0x1a, 0xc4, + 0x9f, 0x58, 0x22, 0xa2, 0x36, 0x14, 0x2d, 0xbb, 0x3f, 0x60, 0x32, 0x5c, 0x2b, 0xaf, 0x7e, 0x7b, + 0x0c, 0xec, 0xea, 0x86, 0x40, 0x88, 0x95, 0xf5, 0xcb, 0x46, 0xac, 0xe0, 0xb5, 0x84, 0x4d, 0xfe, + 0xb4, 0x12, 0x36, 0x8b, 0x57, 0xa0, 0xac, 0x0d, 0x25, 0x53, 0xd9, 0xfd, 0xcf, 0x0c, 0xcd, 0x17, + 0x08, 0x14, 0x86, 0xde, 0x86, 0x49, 0x66, 0xf5, 0xa8, 0x33, 0x60, 0xd9, 0x1c, 0xac, 0xe0, 0x71, + 0x4e, 0x98, 0xbc, 0x6d, 0x09, 0x81, 0x7d, 0x2c, 0x1e, 0x75, 0x52, 0xd7, 0x75, 0xdc, 0xed, 0x0e, + 0x37, 0xe1, 0x4e, 0x57, 0x7a, 0x31, 0x33, 0x61, 0xd4, 0x79, 0x3d, 0x42, 0xc5, 0xb1, 0xde, 0xe6, + 0xe7, 0xba, 0x2b, 0xf8, 0x7f, 0xbf, 0x3a, 0x94, 0x68, 0xba, 0xe7, 0x1d, 0xc5, 0x22, 0x8e, 0xe0, + 0x87, 0xbd, 0x08, 0x93, 0x2d, 0xba, 0x4b, 0x06, 0xdd, 0x84, 0xeb, 0xb0, 0x2e, 0x9b, 0xb1, 0x4f, + 0x37, 0xff, 0xd1, 0x80, 0xf9, 0xc7, 0x5d, 0x79, 0x7a, 0x3f, 0xea, 0x40, 0x8f, 0xa3, 0xb2, 0x87, + 0x94, 0x9c, 0xde, 0x87, 0xa7, 0xd2, 0x4d, 0xcb, 0x08, 0x8a, 0xbb, 0xa0, 0x2a, 0x35, 0x62, 0x25, + 0x17, 0x61, 0x51, 0x46, 0x52, 0x5f, 0xc2, 0xa1, 0xfb, 0x7e, 0x60, 0x2d, 0x32, 0x95, 0x83, 0x26, + 0x17, 0x77, 0xa8, 0x99, 0x08, 0xfc, 0xb0, 0xdc, 0x49, 0xfb, 0x61, 0xae, 0x3e, 0x21, 0xf5, 0x21, + 0x0b, 0x7a, 0x5f, 0x6d, 0x6a, 0x23, 0xcb, 0xc7, 0x13, 0x09, 0x98, 0xa1, 0x1b, 0xfb, 0x73, 0x03, + 0xce, 0xa7, 0xf6, 0x0e, 0x5c, 0xd9, 0xdc, 0x29, 0xba, 0xb2, 0xc6, 0x49, 0xab, 0xf0, 0x9e, 0xa6, + 0x42, 0x7f, 0x08, 0x27, 0xf5, 0xf5, 0xd9, 0x4f, 0x73, 0x30, 0x87, 0x69, 0xdf, 0x89, 0x64, 0x75, + 0xb7, 0xfc, 0xda, 0xe3, 0x0c, 0x61, 0x50, 0xec, 0xed, 0xb0, 0x36, 0x19, 0x29, 0x3a, 0xfe, 0x1e, + 0x14, 0x44, 0xc2, 0x35, 0x9b, 0x19, 0x4b, 0xe4, 0x9b, 0xe5, 0x4d, 0x2a, 0x33, 0xd7, 0x12, 0x90, + 0x23, 0x8b, 0x52, 0x18, 0x75, 0xbf, 0xbd, 0x91, 0xa1, 0xa8, 0x26, 0x89, 0x2c, 0x9a, 0xb1, 0x04, + 0x34, 0x3f, 0xc9, 0x81, 0x0c, 0x99, 0x1e, 0x83, 0x95, 0xff, 0xd5, 0x88, 0x95, 0x5f, 0x19, 0xd5, + 0xf1, 0xe3, 0xea, 0x19, 0x96, 0x16, 0x89, 0x87, 0xb3, 0x17, 0xb3, 0x80, 0x3e, 0x3c, 0x25, 0xf2, + 0xb7, 0x06, 0x94, 0x44, 0xbf, 0xc7, 0x60, 0xcd, 0xb7, 0xa2, 0xd6, 0xfc, 0xa5, 0x0c, 0xb3, 0x18, + 0x62, 0xc1, 0x3f, 0xce, 0xab, 0xd1, 0x07, 0xc1, 0x72, 0x87, 0xb8, 0x2d, 0x15, 0x06, 0x86, 0x27, + 0x90, 0x37, 0x62, 0x49, 0x43, 0xbf, 0x26, 0xab, 0x86, 0xa8, 0xc7, 0x68, 0xeb, 0x46, 0x10, 0x93, + 0xe5, 0x33, 0x97, 0x3f, 0xa9, 0x12, 0xad, 0xf0, 0x39, 0x00, 0xc7, 0x50, 0x71, 0x42, 0x0e, 0x8f, + 0xd3, 0xfa, 0x71, 0x5b, 0xa6, 0xe2, 0x97, 0x37, 0xc6, 0x34, 0x9c, 0x32, 0x4e, 0x4b, 0x34, 0xe3, + 0xa4, 0x20, 0xd4, 0x81, 0x69, 0xbd, 0x70, 0x53, 0xed, 0xa5, 0xd5, 0xec, 0x15, 0xa2, 0xf2, 0xf9, + 0x57, 0x6f, 0xc1, 0x11, 0x64, 0xf3, 0xb0, 0x08, 0x65, 0x6d, 0xf3, 0xc5, 0x52, 0xac, 0x33, 0xa7, + 0x93, 0x62, 0x4d, 0xcf, 0x08, 0x94, 0xc7, 0xca, 0x08, 0x5c, 0x8c, 0x66, 0x04, 0xbe, 0x19, 0xcf, + 0x08, 0x80, 0x98, 0x5d, 0x24, 0x1b, 0xe0, 0xc1, 0x59, 0x15, 0x1a, 0xfb, 0x15, 0xb8, 0x99, 0x72, + 0x2c, 0xc9, 0x00, 0x1c, 0x71, 0x2f, 0xf6, 0x46, 0x04, 0x12, 0xc7, 0x44, 0x70, 0x2f, 0x58, 0xb5, + 0x34, 0x06, 0xbd, 0x1e, 0x71, 0x0f, 0x2a, 0xd3, 0x62, 0xc0, 0x81, 0x17, 0x7c, 0x23, 0x42, 0xc5, + 0xb1, 0xde, 0x68, 0x0b, 0x8a, 0x32, 0xb2, 0x56, 0x55, 0x9d, 0x2f, 0x67, 0x09, 0xda, 0x65, 0x00, + 0x21, 0xff, 0xc6, 0x0a, 0x47, 0x4f, 0x8a, 0x94, 0x8e, 0x49, 0x8a, 0xdc, 0x06, 0xe4, 0xec, 0x88, + 0x50, 0xa5, 0x75, 0x53, 0x7e, 0xa6, 0xcd, 0x77, 0x65, 0x51, 0x44, 0xdc, 0xc1, 0x82, 0xdd, 0x49, + 0xf4, 0xc0, 0x29, 0x5c, 0xfc, 0x54, 0xab, 0x70, 0x3c, 0x38, 0x0a, 0x2a, 0x01, 0x92, 0xd5, 0xc1, + 0x0a, 0xe3, 0x4b, 0x51, 0x15, 0x58, 0x8f, 0xa1, 0xe2, 0x84, 0x1c, 0xf4, 0x21, 0xcc, 0xf0, 0x2d, + 0x14, 0x0a, 0x86, 0x47, 0x14, 0x3c, 0x7f, 0x74, 0xb8, 0x3c, 0xb3, 0xa9, 0x43, 0xe2, 0xa8, 0x04, + 0xf3, 0x0f, 0xf2, 0x90, 0x9e, 0x0c, 0x08, 0x3f, 0x48, 0x30, 0x1e, 0xf2, 0x41, 0xc2, 0x3b, 0x50, + 0xf2, 0x18, 0x71, 0xe5, 0xc7, 0x17, 0xb9, 0xf1, 0x3e, 0xbe, 0x68, 0xf8, 0x00, 0x38, 0xc4, 0x8a, + 0x65, 0x66, 0xf2, 0x27, 0x9a, 0x99, 0x59, 0x05, 0x10, 0x31, 0x5c, 0xdd, 0x19, 0xa8, 0xb7, 0xd8, + 0x99, 0xd0, 0x26, 0x5c, 0x0f, 0x28, 0x58, 0xeb, 0x85, 0x2e, 0x07, 0x17, 0xa7, 0x7c, 0x7c, 0xbd, + 0x90, 0x28, 0x1e, 0x89, 0xe7, 0xf6, 0x52, 0xbe, 0x56, 0x3e, 0xa6, 0xd8, 0xcc, 0xfc, 0x9f, 0x1c, + 0x44, 0x8c, 0x21, 0xfa, 0xb1, 0x01, 0xf3, 0x24, 0xf6, 0xc1, 0xb7, 0xef, 0x4b, 0x7e, 0x3b, 0xdb, + 0x57, 0xf8, 0x89, 0xef, 0xc5, 0xc3, 0xe7, 0xae, 0x78, 0x17, 0x0f, 0x27, 0x85, 0xa2, 0xdf, 0x33, + 0xe0, 0x1c, 0x49, 0x7e, 0xd1, 0xaf, 0x16, 0xfd, 0xca, 0xd8, 0x3f, 0x09, 0x50, 0x7b, 0xfa, 0xe8, + 0x70, 0x39, 0xed, 0xb7, 0x0e, 0x70, 0x9a, 0x38, 0xf4, 0x1e, 0x4c, 0x10, 0xb7, 0xed, 0xa7, 0x86, + 0xb3, 0x8b, 0xf5, 0x7f, 0xa8, 0x21, 0xf4, 0x8e, 0xd6, 0xdc, 0xb6, 0x87, 0x05, 0xa8, 0xf9, 0xf3, + 0x3c, 0xcc, 0xc5, 0x3f, 0x60, 0x50, 0xf5, 0x88, 0x13, 0xa9, 0xf5, 0x88, 0xfc, 0x8c, 0x34, 0x59, + 0x50, 0x1c, 0x18, 0x9e, 0x11, 0xde, 0x88, 0x25, 0x2d, 0x38, 0x23, 0xa2, 0xac, 0xb8, 0xf0, 0x08, + 0x67, 0x44, 0xd4, 0x12, 0x87, 0x58, 0xe8, 0x72, 0xf4, 0x6e, 0x31, 0xe3, 0x77, 0xcb, 0xbc, 0x3e, + 0x97, 0x71, 0x13, 0xce, 0x3d, 0x28, 0x6b, 0xeb, 0xa0, 0x4e, 0xe2, 0xd5, 0xcc, 0x7a, 0x0f, 0xb7, + 0xdd, 0xac, 0xfc, 0xb5, 0x87, 0x90, 0xa2, 0xe3, 0x87, 0xe7, 0x5e, 0x68, 0xeb, 0x91, 0x32, 0xb2, + 0x42, 0x5d, 0x1a, 0x9a, 0xf9, 0xaf, 0x06, 0xcc, 0x44, 0x8a, 0x64, 0xb9, 0x34, 0xbf, 0x18, 0x79, + 0xfc, 0xdf, 0x3f, 0xb8, 0x1b, 0x20, 0x60, 0x0d, 0x0d, 0xfd, 0x00, 0xca, 0x5d, 0xc7, 0x6e, 0x53, + 0x8f, 0x35, 0x1c, 0xb2, 0xa7, 0xce, 0x49, 0xd6, 0x94, 0x55, 0xe5, 0xe8, 0x70, 0x79, 0x61, 0x53, + 0xc2, 0xd4, 0x9d, 0x5e, 0xbf, 0x4b, 0x99, 0xac, 0x22, 0xc7, 0x3a, 0xb8, 0x78, 0xb4, 0x7d, 0x87, + 0xb8, 0xb4, 0xe3, 0x0c, 0x3c, 0xfa, 0xa4, 0x3e, 0xda, 0x06, 0x03, 0x3c, 0xe9, 0x47, 0xdb, 0x10, + 0xf8, 0xf8, 0x47, 0xdb, 0xa0, 0xef, 0x13, 0xfb, 0x68, 0x1b, 0x8c, 0x70, 0x48, 0xa4, 0xf2, 0xdf, + 0x39, 0x6d, 0x16, 0xd1, 0x68, 0x25, 0xf7, 0x90, 0x68, 0xe5, 0x3e, 0x4c, 0x59, 0x36, 0xa3, 0xee, + 0x3e, 0xe9, 0xaa, 0xd4, 0x75, 0xd6, 0xbd, 0x18, 0x4c, 0x75, 0x43, 0xe1, 0xe0, 0x00, 0x11, 0x75, + 0xe1, 0xbc, 0xff, 0x9c, 0xe3, 0x52, 0x12, 0x3e, 0x27, 0xab, 0x92, 0xac, 0xd7, 0xfd, 0x77, 0x87, + 0x1b, 0x69, 0x9d, 0x1e, 0x0c, 0x23, 0xe0, 0x74, 0x50, 0xe4, 0xc1, 0x8c, 0xa7, 0x85, 0xe9, 0xfe, + 0x8d, 0x38, 0xe2, 0x53, 0x58, 0x3c, 0xb3, 0xa1, 0xd5, 0x71, 0xe9, 0xa0, 0x38, 0x2a, 0xc3, 0xfc, + 0xa7, 0x3c, 0xcc, 0xc6, 0x76, 0x5a, 0x2c, 0x1c, 0x29, 0x3d, 0xce, 0x70, 0xa4, 0x38, 0x56, 0x38, + 0x92, 0xee, 0x29, 0x4f, 0x8c, 0xe5, 0x29, 0xbf, 0x29, 0xbd, 0x55, 0xb5, 0x72, 0x1b, 0xeb, 0xaa, + 0xec, 0x3d, 0xd0, 0xe6, 0xa6, 0x4e, 0xc4, 0xd1, 0xbe, 0xc2, 0x9d, 0x68, 0x25, 0xbf, 0xa3, 0x57, + 0xae, 0xf6, 0x95, 0xac, 0x75, 0x8b, 0x01, 0x80, 0x74, 0x27, 0x52, 0x08, 0x38, 0x4d, 0x5c, 0xed, + 0xf6, 0x67, 0x5f, 0x2d, 0x9d, 0xf9, 0xe2, 0xab, 0xa5, 0x33, 0x5f, 0x7e, 0xb5, 0x74, 0xe6, 0x47, + 0x47, 0x4b, 0xc6, 0x67, 0x47, 0x4b, 0xc6, 0x17, 0x47, 0x4b, 0xc6, 0x97, 0x47, 0x4b, 0xc6, 0x7f, + 0x1c, 0x2d, 0x19, 0x3f, 0xf9, 0x7a, 0xe9, 0xcc, 0xbd, 0xe7, 0x46, 0xf9, 0x7d, 0xad, 0xff, 0x0d, + 0x00, 0x00, 0xff, 0xff, 0x8a, 0x01, 0x34, 0x7d, 0x86, 0x4b, 0x00, 0x00, } func (m *AnalysisRunArgument) Marshal() (dAtA []byte, err error) { @@ -4579,6 +4581,30 @@ func (m *PromotionStep) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Inputs) > 0 { + keysForInputs := make([]string, 0, len(m.Inputs)) + for k := range m.Inputs { + keysForInputs = append(keysForInputs, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForInputs) + for iNdEx := len(keysForInputs) - 1; iNdEx >= 0; iNdEx-- { + v := m.Inputs[string(keysForInputs[iNdEx])] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintGenerated(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(keysForInputs[iNdEx]) + copy(dAtA[i:], keysForInputs[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForInputs[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x32 + } + } if m.Task != nil { { size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) @@ -6706,6 +6732,14 @@ func (m *PromotionStep) Size() (n int) { l = m.Task.Size() n += 1 + l + sovGenerated(uint64(l)) } + if len(m.Inputs) > 0 { + for k, v := range m.Inputs { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } return n } @@ -7846,12 +7880,23 @@ func (this *PromotionStep) String() string { if this == nil { return "nil" } + keysForInputs := make([]string, 0, len(this.Inputs)) + for k := range this.Inputs { + keysForInputs = append(keysForInputs, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForInputs) + mapStringForInputs := "map[string]string{" + for _, k := range keysForInputs { + mapStringForInputs += fmt.Sprintf("%v: %v,", k, this.Inputs[k]) + } + mapStringForInputs += "}" s := strings.Join([]string{`&PromotionStep{`, `Uses:` + fmt.Sprintf("%v", this.Uses) + `,`, `As:` + fmt.Sprintf("%v", this.As) + `,`, `Config:` + strings.Replace(fmt.Sprintf("%v", this.Config), "JSON", "v11.JSON", 1) + `,`, `Retry:` + strings.Replace(this.Retry.String(), "PromotionStepRetry", "PromotionStepRetry", 1) + `,`, `Task:` + strings.Replace(this.Task.String(), "PromotionTaskReference", "PromotionTaskReference", 1) + `,`, + `Inputs:` + mapStringForInputs + `,`, `}`, }, "") return s @@ -16032,6 +16077,133 @@ func (m *PromotionStep) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Inputs", 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 m.Inputs == nil { + m.Inputs = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Inputs[mapkey] = mapvalue + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/api/v1alpha1/generated.proto b/api/v1alpha1/generated.proto index 5d1d1bfb9..8033c89a4 100644 --- a/api/v1alpha1/generated.proto +++ b/api/v1alpha1/generated.proto @@ -959,6 +959,8 @@ message PromotionStatus { } // PromotionStep describes a directive to be executed as part of a Promotion. +// +// +kubebuilder:validation:XValidation:message="inputs must not be set when task is set",rule="!(has(self.task) && self.inputs.size() > 0)" message PromotionStep { // Uses identifies a runner that can execute this step. // @@ -976,6 +978,14 @@ message PromotionStep { // Retry is the retry policy for this step. optional PromotionStepRetry retry = 4; + // Inputs is a map of inputs that can used to parameterize the execution + // of the PromotionStep and can be referenced by expressions in the Config. + // + // When a PromotionStep is inflated from a PromotionTask, the inputs + // specified in the PromotionTask are set based on the inputs specified + // in the Config of the PromotionStep that references the PromotionTask. + map inputs = 6; + // Config is opaque configuration for the PromotionStep that is understood // only by each PromotionStep's implementation. It is legal to utilize // expressions in defining values at any level of this block. @@ -1092,6 +1102,7 @@ message PromotionTaskSpec { // +kubebuilder:validation:Required // +kubebuilder:validation:MinItems=1 // +kubebuilder:validation:items:XValidation:message="PromotionTask step must have uses set and must not reference another task",rule="has(self.uses) && !has(self.task)" + // +kubebuilder:validation:items:XValidation:message="PromotionTask step must not have inputs set",rule="self.inputs.size() == 0" repeated PromotionStep steps = 2; } diff --git a/api/v1alpha1/promotion_types.go b/api/v1alpha1/promotion_types.go index 1f6ba605b..1b36d5091 100644 --- a/api/v1alpha1/promotion_types.go +++ b/api/v1alpha1/promotion_types.go @@ -216,7 +216,7 @@ type PromotionStep struct { // When a PromotionStep is inflated from a PromotionTask, the inputs // specified in the PromotionTask are set based on the inputs specified // in the Config of the PromotionStep that references the PromotionTask. - Inputs map[string]string `json:"inputs,omitempty" protobuf:"bytes,6,rep,name=inputs"` + Inputs map[string]string `json:"inputs,omitempty" protobuf:"bytes,6,rep,name=inputs" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Config is opaque configuration for the PromotionStep that is understood // only by each PromotionStep's implementation. It is legal to utilize // expressions in defining values at any level of this block. diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index 516376795..aea33f347 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -1079,6 +1079,13 @@ func (in *PromotionStep) DeepCopyInto(out *PromotionStep) { *out = new(PromotionStepRetry) (*in).DeepCopyInto(*out) } + if in.Inputs != nil { + in, out := &in.Inputs, &out.Inputs + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } if in.Config != nil { in, out := &in.Config, &out.Config *out = new(apiextensionsv1.JSON) diff --git a/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml b/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml index 5594b6a56..cb1324db2 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml @@ -95,6 +95,17 @@ spec: expressions in defining values at any level of this block. See https://docs.kargo.io/references/expression-language for details. x-kubernetes-preserve-unknown-fields: true + inputs: + additionalProperties: + type: string + description: |- + Inputs is a map of inputs that can used to parameterize the execution + of the PromotionStep and can be referenced by expressions in the Config. + + When a PromotionStep is inflated from a PromotionTask, the inputs + specified in the PromotionTask are set based on the inputs specified + in the Config of the PromotionStep that references the PromotionTask. + type: object retry: description: Retry is the retry policy for this step. properties: @@ -171,6 +182,10 @@ spec: - message: PromotionTask step must have uses set and must not reference another task rule: has(self.uses) && !has(self.task) + - message: PromotionTask step must not have inputs set + rule: self.inputs.size() == 0 + - message: inputs must not be set when task is set + rule: '!(has(self.task) && self.inputs.size() > 0)' minItems: 1 type: array required: diff --git a/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml b/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml index 381552c1a..746ed48e4 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml @@ -98,6 +98,17 @@ spec: expressions in defining values at any level of this block. See https://docs.kargo.io/references/expression-language for details. x-kubernetes-preserve-unknown-fields: true + inputs: + additionalProperties: + type: string + description: |- + Inputs is a map of inputs that can used to parameterize the execution + of the PromotionStep and can be referenced by expressions in the Config. + + When a PromotionStep is inflated from a PromotionTask, the inputs + specified in the PromotionTask are set based on the inputs specified + in the Config of the PromotionStep that references the PromotionTask. + type: object retry: description: Retry is the retry policy for this step. properties: @@ -174,6 +185,8 @@ spec: - message: Promotion step must have uses set and must not reference a task rule: has(self.uses) && !has(self.task) + - message: inputs must not be set when task is set + rule: '!(has(self.task) && self.inputs.size() > 0)' minItems: 1 type: array vars: diff --git a/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml b/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml index a00e23855..ef5c6d030 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml @@ -95,6 +95,17 @@ spec: expressions in defining values at any level of this block. See https://docs.kargo.io/references/expression-language for details. x-kubernetes-preserve-unknown-fields: true + inputs: + additionalProperties: + type: string + description: |- + Inputs is a map of inputs that can used to parameterize the execution + of the PromotionStep and can be referenced by expressions in the Config. + + When a PromotionStep is inflated from a PromotionTask, the inputs + specified in the PromotionTask are set based on the inputs specified + in the Config of the PromotionStep that references the PromotionTask. + type: object retry: description: Retry is the retry policy for this step. properties: @@ -171,6 +182,10 @@ spec: - message: PromotionTask step must have uses set and must not reference another task rule: has(self.uses) && !has(self.task) + - message: PromotionTask step must not have inputs set + rule: self.inputs.size() == 0 + - message: inputs must not be set when task is set + rule: '!(has(self.task) && self.inputs.size() > 0)' minItems: 1 type: array required: diff --git a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml index d7c11693d..a6b5a768f 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml @@ -88,6 +88,17 @@ spec: expressions in defining values at any level of this block. See https://docs.kargo.io/references/expression-language for details. x-kubernetes-preserve-unknown-fields: true + inputs: + additionalProperties: + type: string + description: |- + Inputs is a map of inputs that can used to parameterize the execution + of the PromotionStep and can be referenced by expressions in the Config. + + When a PromotionStep is inflated from a PromotionTask, the inputs + specified in the PromotionTask are set based on the inputs specified + in the Config of the PromotionStep that references the PromotionTask. + type: object retry: description: Retry is the retry policy for this step. properties: @@ -164,6 +175,8 @@ spec: - message: PromotionTemplate step must have exactly one of uses or task set rule: '(has(self.uses) ? !has(self.task) : has(self.task))' + - message: inputs must not be set when task is set + rule: '!(has(self.task) && self.inputs.size() > 0)' minItems: 1 type: array vars: diff --git a/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json index 752027ae4..a45070ad0 100644 --- a/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json @@ -50,6 +50,13 @@ "description": "Config is opaque configuration for the PromotionStep that is understood\nonly by each PromotionStep's implementation. It is legal to utilize\nexpressions in defining values at any level of this block.\nSee https://docs.kargo.io/references/expression-language for details.", "x-kubernetes-preserve-unknown-fields": true }, + "inputs": { + "additionalProperties": { + "type": "string" + }, + "description": "Inputs is a map of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", + "type": "object" + }, "retry": { "description": "Retry is the retry policy for this step.", "properties": { @@ -102,6 +109,14 @@ { "message": "PromotionTask step must have uses set and must not reference another task", "rule": "has(self.uses) && !has(self.task)" + }, + { + "message": "PromotionTask step must not have inputs set", + "rule": "self.inputs.size() == 0" + }, + { + "message": "inputs must not be set when task is set", + "rule": "!(has(self.task) && self.inputs.size() > 0)" } ] }, diff --git a/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json index 4e45a81ff..46fa32ae9 100644 --- a/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json @@ -43,6 +43,13 @@ "description": "Config is opaque configuration for the PromotionStep that is understood\nonly by each PromotionStep's implementation. It is legal to utilize\nexpressions in defining values at any level of this block.\nSee https://docs.kargo.io/references/expression-language for details.", "x-kubernetes-preserve-unknown-fields": true }, + "inputs": { + "additionalProperties": { + "type": "string" + }, + "description": "Inputs is a map of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", + "type": "object" + }, "retry": { "description": "Retry is the retry policy for this step.", "properties": { @@ -95,6 +102,10 @@ { "message": "Promotion step must have uses set and must not reference a task", "rule": "has(self.uses) && !has(self.task)" + }, + { + "message": "inputs must not be set when task is set", + "rule": "!(has(self.task) && self.inputs.size() > 0)" } ] }, diff --git a/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json index 5d5c4cfa6..9823e792d 100644 --- a/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json @@ -50,6 +50,13 @@ "description": "Config is opaque configuration for the PromotionStep that is understood\nonly by each PromotionStep's implementation. It is legal to utilize\nexpressions in defining values at any level of this block.\nSee https://docs.kargo.io/references/expression-language for details.", "x-kubernetes-preserve-unknown-fields": true }, + "inputs": { + "additionalProperties": { + "type": "string" + }, + "description": "Inputs is a map of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", + "type": "object" + }, "retry": { "description": "Retry is the retry policy for this step.", "properties": { @@ -102,6 +109,14 @@ { "message": "PromotionTask step must have uses set and must not reference another task", "rule": "has(self.uses) && !has(self.task)" + }, + { + "message": "PromotionTask step must not have inputs set", + "rule": "self.inputs.size() == 0" + }, + { + "message": "inputs must not be set when task is set", + "rule": "!(has(self.task) && self.inputs.size() > 0)" } ] }, diff --git a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json index 9fc3c2cd5..2e47fece7 100644 --- a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json @@ -35,6 +35,13 @@ "description": "Config is opaque configuration for the PromotionStep that is understood\nonly by each PromotionStep's implementation. It is legal to utilize\nexpressions in defining values at any level of this block.\nSee https://docs.kargo.io/references/expression-language for details.", "x-kubernetes-preserve-unknown-fields": true }, + "inputs": { + "additionalProperties": { + "type": "string" + }, + "description": "Inputs is a map of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", + "type": "object" + }, "retry": { "description": "Retry is the retry policy for this step.", "properties": { @@ -87,6 +94,10 @@ { "message": "PromotionTemplate step must have exactly one of uses or task set", "rule": "(has(self.uses) ? !has(self.task) : has(self.task))" + }, + { + "message": "inputs must not be set when task is set", + "rule": "!(has(self.task) && self.inputs.size() > 0)" } ] }, diff --git a/ui/src/gen/v1alpha1/generated_pb.ts b/ui/src/gen/v1alpha1/generated_pb.ts index ebc454be8..8c97d2db8 100644 --- a/ui/src/gen/v1alpha1/generated_pb.ts +++ b/ui/src/gen/v1alpha1/generated_pb.ts @@ -18,7 +18,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file v1alpha1/generated.proto. */ export const file_v1alpha1_generated: GenFile = /*@__PURE__*/ - fileDesc("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKrAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEk0KBWl0ZW1zGAIgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrTGlzdCJJCgxDdXJyZW50U3RhZ2USOQoFc2luY2UYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSK2AgoTRGlzY292ZXJlZEFydGlmYWN0cxJACgxkaXNjb3ZlcmVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJFCgNnaXQYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0RGlzY292ZXJ5UmVzdWx0EkoKBmltYWdlcxgCIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZURpc2NvdmVyeVJlc3VsdBJKCgZjaGFydHMYAyADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnREaXNjb3ZlcnlSZXN1bHQisAEKEERpc2NvdmVyZWRDb21taXQSCgoCaWQYASABKAkSDgoGYnJhbmNoGAIgASgJEgsKA3RhZxgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEg4KBmF1dGhvchgFIAEoCRIRCgljb21taXR0ZXIYBiABKAkSPwoLY3JlYXRvckRhdGUYByABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKKAQoYRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlEgsKA3RhZxgBIAEoCRIOCgZkaWdlc3QYAiABKAkSEgoKZ2l0UmVwb1VSTBgDIAEoCRI9CgljcmVhdGVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKiAwoHRnJlaWdodBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEg0KBWFsaWFzGAcgASgJEkMKBm9yaWdpbhgJIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAyADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBSADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQSQwoGc3RhdHVzGAYgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMirQIKEUZyZWlnaHRDb2xsZWN0aW9uEgoKAmlkGAMgASgJElEKBWl0ZW1zGAEgAygLMkIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uLkl0ZW1zRW50cnkSUwoTdmVyaWZpY2F0aW9uSGlzdG9yeRgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb25JbmZvGmQKCkl0ZW1zRW50cnkSCwoDa2V5GAEgASgJEkUKBXZhbHVlGAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2U6AjgBIo0BCgtGcmVpZ2h0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0IisKDUZyZWlnaHRPcmlnaW4SDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJIqECChBGcmVpZ2h0UmVmZXJlbmNlEgwKBG5hbWUYASABKAkSQwoGb3JpZ2luGAggASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAMgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydCKcAQoORnJlaWdodFJlcXVlc3QSQwoGb3JpZ2luGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SRQoHc291cmNlcxgCIAEoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U291cmNlcyJ6Cg5GcmVpZ2h0U291cmNlcxIOCgZkaXJlY3QYASABKAgSDgoGc3RhZ2VzGAIgAygJEkgKEHJlcXVpcmVkU29ha1RpbWUYAyABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24i1wQKDUZyZWlnaHRTdGF0dXMSWQoLY3VycmVudGx5SW4YAyADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5DdXJyZW50bHlJbkVudHJ5ElcKCnZlcmlmaWVkSW4YASADKAsyQy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5WZXJpZmllZEluRW50cnkSWQoLYXBwcm92ZWRGb3IYAiADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5BcHByb3ZlZEZvckVudHJ5GmYKEEN1cnJlbnRseUluRW50cnkSCwoDa2V5GAEgASgJEkEKBXZhbHVlGAIgASgLMjIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkN1cnJlbnRTdGFnZToCOAEaZgoPVmVyaWZpZWRJbkVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmllZFN0YWdlOgI4ARpnChBBcHByb3ZlZEZvckVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BcHByb3ZlZFN0YWdlOgI4ASJ5CglHaXRDb21taXQSDwoHcmVwb1VSTBgBIAEoCRIKCgJpZBgCIAEoCRIOCgZicmFuY2gYAyABKAkSCwoDdGFnGAQgASgJEg8KB21lc3NhZ2UYBiABKAkSDgoGYXV0aG9yGAcgASgJEhEKCWNvbW1pdHRlchgIIAEoCSJuChJHaXREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRJHCgdjb21taXRzGAIgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRDb21taXQijgIKD0dpdFN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEh8KF2NvbW1pdFNlbGVjdGlvblN0cmF0ZWd5GAIgASgJEg4KBmJyYW5jaBgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAsgASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAcgASgIEhQKDGluY2x1ZGVQYXRocxgIIAMoCRIUCgxleGNsdWRlUGF0aHMYCSADKAkSFgoOZGlzY292ZXJ5TGltaXQYCiABKAUiyAEKBkhlYWx0aBIOCgZzdGF0dXMYASABKAkSDgoGaXNzdWVzGAIgAygJEk4KBmNvbmZpZxgEIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04STgoGb3V0cHV0GAUgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJvCg9IZWFsdGhDaGVja1N0ZXASDAoEdXNlcxgBIAEoCRJOCgZjb25maWcYAiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIkkKBUltYWdlEg8KB3JlcG9VUkwYASABKAkSEgoKZ2l0UmVwb1VSTBgCIAEoCRILCgN0YWcYAyABKAkSDgoGZGlnZXN0GAQgASgJIo0BChRJbWFnZURpc2NvdmVyeVJlc3VsdBIPCgdyZXBvVVJMGAEgASgJEhAKCHBsYXRmb3JtGAIgASgJElIKCnJlZmVyZW5jZXMYAyADKAsyPi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlIvkBChFJbWFnZVN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSHgoWaW1hZ2VTZWxlY3Rpb25TdHJhdGVneRgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAogASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSEAoIcGxhdGZvcm0YByABKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAggASgIEhYKDmRpc2NvdmVyeUxpbWl0GAkgASgFItMBCgdQcm9qZWN0EkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPwoEc3BlYxgCIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0U3BlYxJDCgZzdGF0dXMYAyABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFN0YXR1cyKNAQoLUHJvamVjdExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdCJfCgtQcm9qZWN0U3BlYxJQChFwcm9tb3Rpb25Qb2xpY2llcxgBIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25Qb2xpY3kidAoNUHJvamVjdFN0YXR1cxJDCgpjb25kaXRpb25zGAMgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJItkBCglQcm9tb3Rpb24SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cyKRAQoNUHJvbW90aW9uTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb24iPgoPUHJvbW90aW9uUG9saWN5Eg0KBXN0YWdlGAEgASgJEhwKFGF1dG9Qcm9tb3Rpb25FbmFibGVkGAIgASgIIvIBChJQcm9tb3Rpb25SZWZlcmVuY2USDAoEbmFtZRgBIAEoCRJHCgdmcmVpZ2h0GAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cxI+CgpmaW5pc2hlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiugEKDVByb21vdGlvblNwZWMSDQoFc3RhZ2UYASABKAkSDwoHZnJlaWdodBgCIAEoCRJFCgR2YXJzGAQgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAMgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAitwQKD1Byb21vdGlvblN0YXR1cxIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBCABKAkSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJHCgdmcmVpZ2h0GAUgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USUgoRZnJlaWdodENvbGxlY3Rpb24YByABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SSwoMaGVhbHRoQ2hlY2tzGAggAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aENoZWNrU3RlcBI+CgpmaW5pc2hlZEF0GAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSEwoLY3VycmVudFN0ZXAYCSABKAMSWgoVc3RlcEV4ZWN1dGlvbk1ldGFkYXRhGAsgAygLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0ZXBFeGVjdXRpb25NZXRhZGF0YRJNCgVzdGF0ZRgKIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ijgIKDVByb21vdGlvblN0ZXASDAoEdXNlcxgBIAEoCRJKCgR0YXNrGAUgASgLMjwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tSZWZlcmVuY2USCgoCYXMYAiABKAkSRwoFcmV0cnkYBCABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcFJldHJ5Ek4KBmNvbmZpZxgDIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ibQoSUHJvbW90aW9uU3RlcFJldHJ5Ej8KB3RpbWVvdXQYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SFgoOZXJyb3JUaHJlc2hvbGQYAiABKA0imgEKDVByb21vdGlvblRhc2sSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJFCgRzcGVjGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tTcGVjIjMKElByb21vdGlvblRhc2tJbnB1dBIMCgRuYW1lGAEgASgJEg8KB2RlZmF1bHQYAiABKAkinQEKEVByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEkYKBWl0ZW1zGAIgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tMaXN0IjQKFlByb21vdGlvblRhc2tSZWZlcmVuY2USDAoEbmFtZRgBIAEoCRIMCgRraW5kGAIgASgJIqEBChFQcm9tb3Rpb25UYXNrU3BlYxJICgZpbnB1dHMYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza0lucHV0EkIKBXN0ZXBzGAIgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAiXgoRUHJvbW90aW9uVGVtcGxhdGUSSQoEc3BlYxgBIAEoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZVNwZWMiogEKFVByb21vdGlvblRlbXBsYXRlU3BlYxJFCgR2YXJzGAIgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAEgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAiMAoRUHJvbW90aW9uVmFyaWFibGUSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSLmAQoQUmVwb1N1YnNjcmlwdGlvbhJCCgNnaXQYASABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0U3Vic2NyaXB0aW9uEkYKBWltYWdlGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlU3Vic2NyaXB0aW9uEkYKBWNoYXJ0GAMgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0U3Vic2NyaXB0aW9uIs0BCgVTdGFnZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEj0KBHNwZWMYAiABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2VTcGVjEkEKBnN0YXR1cxgDIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVN0YXR1cyKJAQoJU3RhZ2VMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjoKBWl0ZW1zGAIgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlIogCCglTdGFnZVNwZWMSDQoFc2hhcmQYBCABKAkSTgoQcmVxdWVzdGVkRnJlaWdodBgFIAMoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVxdWVzdBJSChFwcm9tb3Rpb25UZW1wbGF0ZRgGIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZRJICgx2ZXJpZmljYXRpb24YAyABKAsyMi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpY2F0aW9uIvYDCgtTdGFnZVN0YXR1cxJDCgpjb25kaXRpb25zGA0gAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYCyABKAkSDQoFcGhhc2UYASABKAkSTwoOZnJlaWdodEhpc3RvcnkYBCADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SFgoOZnJlaWdodFN1bW1hcnkYDCABKAkSPAoGaGVhbHRoGAggASgLMiwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aBIPCgdtZXNzYWdlGAkgASgJEhoKEm9ic2VydmVkR2VuZXJhdGlvbhgGIAEoAxJSChBjdXJyZW50UHJvbW90aW9uGAcgASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZRJPCg1sYXN0UHJvbW90aW9uGAogASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZSLaAQoVU3RlcEV4ZWN1dGlvbk1ldGFkYXRhEg0KBWFsaWFzGAEgASgJEj0KCXN0YXJ0ZWRBdBgCIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEj4KCmZpbmlzaGVkQXQYAyABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRISCgplcnJvckNvdW50GAQgASgNEg4KBnN0YXR1cxgFIAEoCRIPCgdtZXNzYWdlGAYgASgJIosCCgxWZXJpZmljYXRpb24SWgoRYW5hbHlzaXNUZW1wbGF0ZXMYASADKAsyPy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNUZW1wbGF0ZVJlZmVyZW5jZRJWChNhbmFseXNpc1J1bk1ldGFkYXRhGAIgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGESRwoEYXJncxgDIAMoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1bkFyZ3VtZW50Ip0CChBWZXJpZmljYXRpb25JbmZvEgoKAmlkGAQgASgJEg0KBWFjdG9yGAcgASgJEj0KCXN0YXJ0VGltZRgFIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEg0KBXBoYXNlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSTwoLYW5hbHlzaXNSdW4YAyABKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5SZWZlcmVuY2USPgoKZmluaXNoVGltZRgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIpQBCg1WZXJpZmllZFN0YWdlEj4KCnZlcmlmaWVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJDCgtsb25nZXN0U29haxgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbiLZAQoJV2FyZWhvdXNlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESQQoEc3BlYxgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTcGVjEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTdGF0dXMikQEKDVdhcmVob3VzZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPgoFaXRlbXMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlIs4BCg1XYXJlaG91c2VTcGVjEg0KBXNoYXJkGAIgASgJEkAKCGludGVydmFsGAQgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uEh0KFWZyZWlnaHRDcmVhdGlvblBvbGljeRgDIAEoCRJNCg1zdWJzY3JpcHRpb25zGAEgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlJlcG9TdWJzY3JpcHRpb24i/QEKD1dhcmVob3VzZVN0YXR1cxJDCgpjb25kaXRpb25zGAkgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBiABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAQgASgDEhUKDWxhc3RGcmVpZ2h0SUQYCCABKAkSVgoTZGlzY292ZXJlZEFydGlmYWN0cxgHIAEoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQXJ0aWZhY3RzQpcCCihjb20uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExQg5HZW5lcmF0ZWRQcm90b1ABWiRnaXRodWIuY29tL2FrdWl0eS9rYXJnby9hcGkvdjFhbHBoYTGiAgVHQ0FLQaoCJEdpdGh1Yi5Db20uQWt1aXR5LkthcmdvLkFwaS5WMWFscGhhMcoCJEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMeICMEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMVxHUEJNZXRhZGF0YeoCKUdpdGh1Yjo6Q29tOjpBa3VpdHk6OkthcmdvOjpBcGk6OlYxYWxwaGEx", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]); + fileDesc("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKrAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEk0KBWl0ZW1zGAIgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrTGlzdCJJCgxDdXJyZW50U3RhZ2USOQoFc2luY2UYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSK2AgoTRGlzY292ZXJlZEFydGlmYWN0cxJACgxkaXNjb3ZlcmVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJFCgNnaXQYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0RGlzY292ZXJ5UmVzdWx0EkoKBmltYWdlcxgCIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZURpc2NvdmVyeVJlc3VsdBJKCgZjaGFydHMYAyADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnREaXNjb3ZlcnlSZXN1bHQisAEKEERpc2NvdmVyZWRDb21taXQSCgoCaWQYASABKAkSDgoGYnJhbmNoGAIgASgJEgsKA3RhZxgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEg4KBmF1dGhvchgFIAEoCRIRCgljb21taXR0ZXIYBiABKAkSPwoLY3JlYXRvckRhdGUYByABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKKAQoYRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlEgsKA3RhZxgBIAEoCRIOCgZkaWdlc3QYAiABKAkSEgoKZ2l0UmVwb1VSTBgDIAEoCRI9CgljcmVhdGVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKiAwoHRnJlaWdodBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEg0KBWFsaWFzGAcgASgJEkMKBm9yaWdpbhgJIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAyADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBSADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQSQwoGc3RhdHVzGAYgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMirQIKEUZyZWlnaHRDb2xsZWN0aW9uEgoKAmlkGAMgASgJElEKBWl0ZW1zGAEgAygLMkIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uLkl0ZW1zRW50cnkSUwoTdmVyaWZpY2F0aW9uSGlzdG9yeRgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb25JbmZvGmQKCkl0ZW1zRW50cnkSCwoDa2V5GAEgASgJEkUKBXZhbHVlGAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2U6AjgBIo0BCgtGcmVpZ2h0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0IisKDUZyZWlnaHRPcmlnaW4SDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJIqECChBGcmVpZ2h0UmVmZXJlbmNlEgwKBG5hbWUYASABKAkSQwoGb3JpZ2luGAggASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAMgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydCKcAQoORnJlaWdodFJlcXVlc3QSQwoGb3JpZ2luGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SRQoHc291cmNlcxgCIAEoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U291cmNlcyJ6Cg5GcmVpZ2h0U291cmNlcxIOCgZkaXJlY3QYASABKAgSDgoGc3RhZ2VzGAIgAygJEkgKEHJlcXVpcmVkU29ha1RpbWUYAyABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24i1wQKDUZyZWlnaHRTdGF0dXMSWQoLY3VycmVudGx5SW4YAyADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5DdXJyZW50bHlJbkVudHJ5ElcKCnZlcmlmaWVkSW4YASADKAsyQy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5WZXJpZmllZEluRW50cnkSWQoLYXBwcm92ZWRGb3IYAiADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5BcHByb3ZlZEZvckVudHJ5GmYKEEN1cnJlbnRseUluRW50cnkSCwoDa2V5GAEgASgJEkEKBXZhbHVlGAIgASgLMjIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkN1cnJlbnRTdGFnZToCOAEaZgoPVmVyaWZpZWRJbkVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmllZFN0YWdlOgI4ARpnChBBcHByb3ZlZEZvckVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BcHByb3ZlZFN0YWdlOgI4ASJ5CglHaXRDb21taXQSDwoHcmVwb1VSTBgBIAEoCRIKCgJpZBgCIAEoCRIOCgZicmFuY2gYAyABKAkSCwoDdGFnGAQgASgJEg8KB21lc3NhZ2UYBiABKAkSDgoGYXV0aG9yGAcgASgJEhEKCWNvbW1pdHRlchgIIAEoCSJuChJHaXREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRJHCgdjb21taXRzGAIgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRDb21taXQijgIKD0dpdFN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEh8KF2NvbW1pdFNlbGVjdGlvblN0cmF0ZWd5GAIgASgJEg4KBmJyYW5jaBgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAsgASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAcgASgIEhQKDGluY2x1ZGVQYXRocxgIIAMoCRIUCgxleGNsdWRlUGF0aHMYCSADKAkSFgoOZGlzY292ZXJ5TGltaXQYCiABKAUiyAEKBkhlYWx0aBIOCgZzdGF0dXMYASABKAkSDgoGaXNzdWVzGAIgAygJEk4KBmNvbmZpZxgEIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04STgoGb3V0cHV0GAUgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJvCg9IZWFsdGhDaGVja1N0ZXASDAoEdXNlcxgBIAEoCRJOCgZjb25maWcYAiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIkkKBUltYWdlEg8KB3JlcG9VUkwYASABKAkSEgoKZ2l0UmVwb1VSTBgCIAEoCRILCgN0YWcYAyABKAkSDgoGZGlnZXN0GAQgASgJIo0BChRJbWFnZURpc2NvdmVyeVJlc3VsdBIPCgdyZXBvVVJMGAEgASgJEhAKCHBsYXRmb3JtGAIgASgJElIKCnJlZmVyZW5jZXMYAyADKAsyPi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlIvkBChFJbWFnZVN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSHgoWaW1hZ2VTZWxlY3Rpb25TdHJhdGVneRgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAogASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSEAoIcGxhdGZvcm0YByABKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAggASgIEhYKDmRpc2NvdmVyeUxpbWl0GAkgASgFItMBCgdQcm9qZWN0EkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPwoEc3BlYxgCIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0U3BlYxJDCgZzdGF0dXMYAyABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFN0YXR1cyKNAQoLUHJvamVjdExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdCJfCgtQcm9qZWN0U3BlYxJQChFwcm9tb3Rpb25Qb2xpY2llcxgBIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25Qb2xpY3kidAoNUHJvamVjdFN0YXR1cxJDCgpjb25kaXRpb25zGAMgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJItkBCglQcm9tb3Rpb24SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cyKRAQoNUHJvbW90aW9uTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb24iPgoPUHJvbW90aW9uUG9saWN5Eg0KBXN0YWdlGAEgASgJEhwKFGF1dG9Qcm9tb3Rpb25FbmFibGVkGAIgASgIIvIBChJQcm9tb3Rpb25SZWZlcmVuY2USDAoEbmFtZRgBIAEoCRJHCgdmcmVpZ2h0GAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cxI+CgpmaW5pc2hlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiugEKDVByb21vdGlvblNwZWMSDQoFc3RhZ2UYASABKAkSDwoHZnJlaWdodBgCIAEoCRJFCgR2YXJzGAQgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAMgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAitwQKD1Byb21vdGlvblN0YXR1cxIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBCABKAkSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJHCgdmcmVpZ2h0GAUgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USUgoRZnJlaWdodENvbGxlY3Rpb24YByABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SSwoMaGVhbHRoQ2hlY2tzGAggAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aENoZWNrU3RlcBI+CgpmaW5pc2hlZEF0GAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSEwoLY3VycmVudFN0ZXAYCSABKAMSWgoVc3RlcEV4ZWN1dGlvbk1ldGFkYXRhGAsgAygLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0ZXBFeGVjdXRpb25NZXRhZGF0YRJNCgVzdGF0ZRgKIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ijgMKDVByb21vdGlvblN0ZXASDAoEdXNlcxgBIAEoCRJKCgR0YXNrGAUgASgLMjwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tSZWZlcmVuY2USCgoCYXMYAiABKAkSRwoFcmV0cnkYBCABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcFJldHJ5Ek8KBmlucHV0cxgGIAMoCzI/LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwLklucHV0c0VudHJ5Ek4KBmNvbmZpZxgDIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04aLQoLSW5wdXRzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJtChJQcm9tb3Rpb25TdGVwUmV0cnkSPwoHdGltZW91dBgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbhIWCg5lcnJvclRocmVzaG9sZBgCIAEoDSKaAQoNUHJvbW90aW9uVGFzaxJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkUKBHNwZWMYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza1NwZWMiMwoSUHJvbW90aW9uVGFza0lucHV0EgwKBG5hbWUYASABKAkSDwoHZGVmYXVsdBgCIAEoCSKdAQoRUHJvbW90aW9uVGFza0xpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESRgoFaXRlbXMYAiADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza0xpc3QiNAoWUHJvbW90aW9uVGFza1JlZmVyZW5jZRIMCgRuYW1lGAEgASgJEgwKBGtpbmQYAiABKAkioQEKEVByb21vdGlvblRhc2tTcGVjEkgKBmlucHV0cxgBIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrSW5wdXQSQgoFc3RlcHMYAiADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCJeChFQcm9tb3Rpb25UZW1wbGF0ZRJJCgRzcGVjGAEgASgLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRlbXBsYXRlU3BlYyKiAQoVUHJvbW90aW9uVGVtcGxhdGVTcGVjEkUKBHZhcnMYAiADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVmFyaWFibGUSQgoFc3RlcHMYASADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCIwChFQcm9tb3Rpb25WYXJpYWJsZRIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJIuYBChBSZXBvU3Vic2NyaXB0aW9uEkIKA2dpdBgBIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRTdWJzY3JpcHRpb24SRgoFaW1hZ2UYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2VTdWJzY3JpcHRpb24SRgoFY2hhcnQYAyABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnRTdWJzY3JpcHRpb24izQEKBVN0YWdlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPQoEc3BlYxgCIAEoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVNwZWMSQQoGc3RhdHVzGAMgASgLMjEuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlU3RhdHVzIokBCglTdGFnZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESOgoFaXRlbXMYAiADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2UiiAIKCVN0YWdlU3BlYxINCgVzaGFyZBgEIAEoCRJOChByZXF1ZXN0ZWRGcmVpZ2h0GAUgAygLMjQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZXF1ZXN0ElIKEXByb21vdGlvblRlbXBsYXRlGAYgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRlbXBsYXRlEkgKDHZlcmlmaWNhdGlvbhgDIAEoCzIyLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb24i9gMKC1N0YWdlU3RhdHVzEkMKCmNvbmRpdGlvbnMYDSADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgLIAEoCRINCgVwaGFzZRgBIAEoCRJPCg5mcmVpZ2h0SGlzdG9yeRgEIAMoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0Q29sbGVjdGlvbhIWCg5mcmVpZ2h0U3VtbWFyeRgMIAEoCRI8CgZoZWFsdGgYCCABKAsyLC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSGVhbHRoEg8KB21lc3NhZ2UYCSABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAYgASgDElIKEGN1cnJlbnRQcm9tb3Rpb24YByABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUmVmZXJlbmNlEk8KDWxhc3RQcm9tb3Rpb24YCiABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUmVmZXJlbmNlItoBChVTdGVwRXhlY3V0aW9uTWV0YWRhdGESDQoFYWxpYXMYASABKAkSPQoJc3RhcnRlZEF0GAIgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSPgoKZmluaXNoZWRBdBgDIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhIKCmVycm9yQ291bnQYBCABKA0SDgoGc3RhdHVzGAUgASgJEg8KB21lc3NhZ2UYBiABKAkiiwIKDFZlcmlmaWNhdGlvbhJaChFhbmFseXNpc1RlbXBsYXRlcxgBIAMoCzI/LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1RlbXBsYXRlUmVmZXJlbmNlElYKE2FuYWx5c2lzUnVuTWV0YWRhdGEYAiABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YRJHCgRhcmdzGAMgAygLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuQXJndW1lbnQinQIKEFZlcmlmaWNhdGlvbkluZm8SCgoCaWQYBCABKAkSDQoFYWN0b3IYByABKAkSPQoJc3RhcnRUaW1lGAUgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJPCgthbmFseXNpc1J1bhgDIAEoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1blJlZmVyZW5jZRI+CgpmaW5pc2hUaW1lGAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUilAEKDVZlcmlmaWVkU3RhZ2USPgoKdmVyaWZpZWRBdBgBIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEkMKC2xvbmdlc3RTb2FrGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uItkBCglXYXJlaG91c2USQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVN0YXR1cyKRAQoNV2FyZWhvdXNlTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2UizgEKDVdhcmVob3VzZVNwZWMSDQoFc2hhcmQYAiABKAkSQAoIaW50ZXJ2YWwYBCABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SHQoVZnJlaWdodENyZWF0aW9uUG9saWN5GAMgASgJEk0KDXN1YnNjcmlwdGlvbnMYASADKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUmVwb1N1YnNjcmlwdGlvbiL9AQoPV2FyZWhvdXNlU3RhdHVzEkMKCmNvbmRpdGlvbnMYCSADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgGIAEoCRIaChJvYnNlcnZlZEdlbmVyYXRpb24YBCABKAMSFQoNbGFzdEZyZWlnaHRJRBgIIAEoCRJWChNkaXNjb3ZlcmVkQXJ0aWZhY3RzGAcgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRBcnRpZmFjdHNClwIKKGNvbS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTFCDkdlbmVyYXRlZFByb3RvUAFaJGdpdGh1Yi5jb20vYWt1aXR5L2thcmdvL2FwaS92MWFscGhhMaICBUdDQUtBqgIkR2l0aHViLkNvbS5Ba3VpdHkuS2FyZ28uQXBpLlYxYWxwaGExygIkR2l0aHViXENvbVxBa3VpdHlcS2FyZ29cQXBpXFYxYWxwaGEx4gIwR2l0aHViXENvbVxBa3VpdHlcS2FyZ29cQXBpXFYxYWxwaGExXEdQQk1ldGFkYXRh6gIpR2l0aHViOjpDb206OkFrdWl0eTo6S2FyZ286OkFwaTo6VjFhbHBoYTE", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]); /** * AnalysisRunArgument represents an argument to be added to an AnalysisRun. @@ -2034,6 +2034,8 @@ export const PromotionStatusSchema: GenMessage = /*@__PURE__*/ /** * PromotionStep describes a directive to be executed as part of a Promotion. * + * +kubebuilder:validation:XValidation:message="inputs must not be set when task is set",rule="!(has(self.task) && self.inputs.size() > 0)" + * * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionStep */ export type PromotionStep = Message<"github.com.akuity.kargo.api.v1alpha1.PromotionStep"> & { @@ -2069,6 +2071,18 @@ export type PromotionStep = Message<"github.com.akuity.kargo.api.v1alpha1.Promot */ retry?: PromotionStepRetry; + /** + * Inputs is a map of inputs that can used to parameterize the execution + * of the PromotionStep and can be referenced by expressions in the Config. + * + * When a PromotionStep is inflated from a PromotionTask, the inputs + * specified in the PromotionTask are set based on the inputs specified + * in the Config of the PromotionStep that references the PromotionTask. + * + * @generated from field: map inputs = 6; + */ + inputs: { [key: string]: string }; + /** * Config is opaque configuration for the PromotionStep that is understood * only by each PromotionStep's implementation. It is legal to utilize @@ -2295,6 +2309,7 @@ export type PromotionTaskSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * +kubebuilder:validation:Required * +kubebuilder:validation:MinItems=1 * +kubebuilder:validation:items:XValidation:message="PromotionTask step must have uses set and must not reference another task",rule="has(self.uses) && !has(self.task)" + * +kubebuilder:validation:items:XValidation:message="PromotionTask step must not have inputs set",rule="self.inputs.size() == 0" * * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionStep steps = 2; */ From bf087e523f15009d79058380c2966318d15adf6c Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Thu, 12 Dec 2024 15:14:08 +0100 Subject: [PATCH 11/38] fix(api): register new kinds Signed-off-by: Hidde Beydals --- api/v1alpha1/groupversion_info.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/v1alpha1/groupversion_info.go b/api/v1alpha1/groupversion_info.go index 55b320045..8de4266ca 100644 --- a/api/v1alpha1/groupversion_info.go +++ b/api/v1alpha1/groupversion_info.go @@ -27,6 +27,8 @@ var ( // addKnownTypes adds the set of types defined in this package to the supplied scheme. func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(GroupVersion, + &ClusterPromotionTask{}, + &ClusterPromotionTaskList{}, &Freight{}, &FreightList{}, &Stage{}, @@ -35,6 +37,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { &ProjectList{}, &Promotion{}, &PromotionList{}, + &PromotionTask{}, + &PromotionTaskList{}, &Warehouse{}, &WarehouseList{}, ) From 722a6a6b515d2cf532fc72812f82d4ea5ecb9e45 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Wed, 11 Dec 2024 18:16:08 +0100 Subject: [PATCH 12/38] feat(kargo): introduce `PromotionBuilder` The builder is capable of inflating steps from a (Cluster)PromotionTask into the Promotion it constructs. To support this, a helper method has been added to the `PromotionStep` in the (public) API to generate an alias for the step if none is configured. Signed-off-by: Hidde Beydals --- api/v1alpha1/promotion_types.go | 16 + internal/api/promote_downstream_v1alpha1.go | 12 +- internal/api/promote_to_stage_v1alpha1.go | 13 +- internal/controller/stages/regular_stages.go | 14 +- internal/kargo/kargo.go | 58 - internal/kargo/kargo_test.go | 27 +- internal/kargo/promotion_builder.go | 253 ++++ internal/kargo/promotion_builder_test.go | 1093 ++++++++++++++++++ 8 files changed, 1413 insertions(+), 73 deletions(-) create mode 100644 internal/kargo/promotion_builder.go create mode 100644 internal/kargo/promotion_builder_test.go diff --git a/api/v1alpha1/promotion_types.go b/api/v1alpha1/promotion_types.go index 1b36d5091..ac72f9fcb 100644 --- a/api/v1alpha1/promotion_types.go +++ b/api/v1alpha1/promotion_types.go @@ -1,6 +1,7 @@ package v1alpha1 import ( + "fmt" "time" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" @@ -224,6 +225,21 @@ type PromotionStep struct { Config *apiextensionsv1.JSON `json:"config,omitempty" protobuf:"bytes,3,opt,name=config"` } +// GetAlias returns the As field, or a default value in the form of "step-" +// or "task-" if the As field is empty. The index i is provided as an +// argument to this method and should be the index of the PromotionStep in the +// list it belongs to. +func (s *PromotionStep) GetAlias(i int) string { + switch { + case s.As != "": + return s.As + case s.Task != nil: + return fmt.Sprintf("task-%d", i) + default: + return fmt.Sprintf("step-%d", i) + } +} + // PromotionStatus describes the current state of the transition represented by // a Promotion. type PromotionStatus struct { diff --git a/internal/api/promote_downstream_v1alpha1.go b/internal/api/promote_downstream_v1alpha1.go index cf2c44891..79176ffe8 100644 --- a/internal/api/promote_downstream_v1alpha1.go +++ b/internal/api/promote_downstream_v1alpha1.go @@ -132,19 +132,23 @@ func (s *server) PromoteDownstream( promoteErrs := make([]error, 0, len(downstreams)) createdPromos := make([]*kargoapi.Promotion, 0, len(downstreams)) for _, downstream := range downstreams { - newPromo := kargo.NewPromotion(ctx, downstream, freight.Name) if downstream.Spec.PromotionTemplate != nil && len(downstream.Spec.PromotionTemplate.Spec.Steps) == 0 { // Avoid creating a Promotion if the downstream Stage has no promotion // steps and is therefore a "control flow" Stage. continue } - if err := s.createPromotionFn(ctx, &newPromo); err != nil { + newPromo, err := kargo.NewPromotionBuilder(s.client).Build(ctx, downstream, freight.Name) + if err != nil { promoteErrs = append(promoteErrs, err) continue } - s.recordPromotionCreatedEvent(ctx, &newPromo, freight) - createdPromos = append(createdPromos, &newPromo) + if err = s.createPromotionFn(ctx, newPromo); err != nil { + promoteErrs = append(promoteErrs, err) + continue + } + s.recordPromotionCreatedEvent(ctx, newPromo, freight) + createdPromos = append(createdPromos, newPromo) } res := connect.NewResponse(&svcv1alpha1.PromoteDownstreamResponse{ diff --git a/internal/api/promote_to_stage_v1alpha1.go b/internal/api/promote_to_stage_v1alpha1.go index 3bb68ab64..6867f66b0 100644 --- a/internal/api/promote_to_stage_v1alpha1.go +++ b/internal/api/promote_to_stage_v1alpha1.go @@ -98,7 +98,7 @@ func (s *server) PromoteToStage( ) } - if err := s.authorizeFn( + if err = s.authorizeFn( ctx, "promote", schema.GroupVersionResource{ @@ -115,13 +115,16 @@ func (s *server) PromoteToStage( return nil, err } - promotion := kargo.NewPromotion(ctx, *stage, freight.Name) - if err := s.createPromotionFn(ctx, &promotion); err != nil { + promotion, err := kargo.NewPromotionBuilder(s.client).Build(ctx, *stage, freight.Name) + if err != nil { + return nil, fmt.Errorf("build promotion: %w", err) + } + if err := s.createPromotionFn(ctx, promotion); err != nil { return nil, fmt.Errorf("create promotion: %w", err) } - s.recordPromotionCreatedEvent(ctx, &promotion, freight) + s.recordPromotionCreatedEvent(ctx, promotion, freight) return connect.NewResponse(&svcv1alpha1.PromoteToStageResponse{ - Promotion: &promotion, + Promotion: promotion, }), nil } diff --git a/internal/controller/stages/regular_stages.go b/internal/controller/stages/regular_stages.go index e894c84e6..eccdf50c8 100644 --- a/internal/controller/stages/regular_stages.go +++ b/internal/controller/stages/regular_stages.go @@ -1651,19 +1651,25 @@ func (r *RegularStageReconciler) autoPromoteFreight( } // Auto promote the latest available Freight and record an event. - promotion := kargo.NewPromotion(ctx, *stage, latestFreight.Name) - if err := r.client.Create(ctx, &promotion); err != nil { + promotion, err := kargo.NewPromotionBuilder(r.client).Build(ctx, *stage, latestFreight.Name) + if err != nil { + return newStatus, fmt.Errorf( + "error building Promotion for Freight %q in namespace %q: %w", + latestFreight.Name, stage.Namespace, err, + ) + } + if err = r.client.Create(ctx, promotion); err != nil { return newStatus, fmt.Errorf( "error creating Promotion for Freight %q in namespace %q: %w", latestFreight.Name, stage.Namespace, err, ) } r.eventRecorder.AnnotatedEventf( - &promotion, + promotion, kargoEvent.NewPromotionAnnotations( ctx, kargoapi.FormatEventControllerActor(r.cfg.Name()), - &promotion, + promotion, &latestFreight, ), corev1.EventTypeNormal, diff --git a/internal/kargo/kargo.go b/internal/kargo/kargo.go index d3c1ad7d2..148bd14c6 100644 --- a/internal/kargo/kargo.go +++ b/internal/kargo/kargo.go @@ -1,71 +1,13 @@ package kargo import ( - "context" - "fmt" - "strings" - - "github.com/oklog/ulid/v2" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/predicate" kargoapi "github.com/akuity/kargo/api/v1alpha1" - "github.com/akuity/kargo/internal/api/user" "github.com/akuity/kargo/internal/logging" ) -const ( - // maximum length of the stage name used in the promotion name prefix before it exceeds - // kubernetes resource name limit of 253 - // 253 - 1 (.) - 26 (ulid) - 1 (.) - 7 (sha) = 218 - maxStageNamePrefixLength = 218 -) - -// NewPromotion returns a new Promotion from a given stage and freight with our -// naming convention. -func NewPromotion( - ctx context.Context, - stage kargoapi.Stage, - freight string, -) kargoapi.Promotion { - shortHash := freight - if len(shortHash) > 7 { - shortHash = freight[0:7] - } - shortStageName := stage.Name - if len(stage.Name) > maxStageNamePrefixLength { - shortStageName = shortStageName[0:maxStageNamePrefixLength] - } - - annotations := make(map[string]string, 1) - // Put actor information to track on the controller side - if u, ok := user.InfoFromContext(ctx); ok { - annotations[kargoapi.AnnotationKeyCreateActor] = kargoapi.FormatEventUserActor(u) - } - - // ulid.Make() is pseudo-random, not crypto-random, but we don't care. - // We just want a unique ID that can be sorted lexicographically - promoName := strings.ToLower(fmt.Sprintf("%s.%s.%s", shortStageName, ulid.Make(), shortHash)) - - promotion := kargoapi.Promotion{ - ObjectMeta: metav1.ObjectMeta{ - Name: promoName, - Namespace: stage.Namespace, - Annotations: annotations, - }, - Spec: kargoapi.PromotionSpec{ - Stage: stage.Name, - Freight: freight, - }, - } - if stage.Spec.PromotionTemplate != nil { - promotion.Spec.Vars = stage.Spec.PromotionTemplate.Spec.Vars - promotion.Spec.Steps = stage.Spec.PromotionTemplate.Spec.Steps - } - return promotion -} - func NewPromoWentTerminalPredicate(logger *logging.Logger) PromoWentTerminal[*kargoapi.Promotion] { return PromoWentTerminal[*kargoapi.Promotion]{ logger: logger, diff --git a/internal/kargo/kargo_test.go b/internal/kargo/kargo_test.go index c71d9f929..da5abc9f7 100644 --- a/internal/kargo/kargo_test.go +++ b/internal/kargo/kargo_test.go @@ -37,6 +37,17 @@ func TestNewPromotion(t *testing.T) { Name: "test", Namespace: "kargo-demo", }, + Spec: kargoapi.StageSpec{ + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + Uses: "fake-step", + }, + }, + }, + }, + }, }, freight: testFreight, assertions: func(t *testing.T, _ kargoapi.Stage, promo kargoapi.Promotion) { @@ -53,6 +64,17 @@ func TestNewPromotion(t *testing.T) { Name: veryLongResourceName, Namespace: "kargo-demo", }, + Spec: kargoapi.StageSpec{ + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + Uses: "fake-step", + }, + }, + }, + }, + }, }, freight: testFreight, assertions: func(t *testing.T, _ kargoapi.Stage, promo kargoapi.Promotion) { @@ -65,12 +87,13 @@ func TestNewPromotion(t *testing.T) { } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - promo := NewPromotion(context.TODO(), tc.stage, tc.freight) + promo, err := NewPromotionBuilder(nil).Build(context.TODO(), tc.stage, tc.freight) + require.NoError(t, err) require.Equal(t, tc.freight, promo.Spec.Freight) require.Equal(t, tc.stage.Name, promo.Spec.Stage) require.Equal(t, tc.freight, promo.Spec.Freight) require.LessOrEqual(t, len(promo.Name), 253) - tc.assertions(t, tc.stage, promo) + tc.assertions(t, tc.stage, *promo) }) } } diff --git a/internal/kargo/promotion_builder.go b/internal/kargo/promotion_builder.go new file mode 100644 index 000000000..74f743067 --- /dev/null +++ b/internal/kargo/promotion_builder.go @@ -0,0 +1,253 @@ +package kargo + +import ( + "context" + "errors" + "fmt" + "strings" + + "github.com/oklog/ulid/v2" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/yaml" + + kargoapi "github.com/akuity/kargo/api/v1alpha1" + "github.com/akuity/kargo/internal/api/user" +) + +const ( + // nameSeparator is the separator used in the Promotion name. + nameSeparator = "." + + // aliasSeparator is the separator used in the Promotion step alias + // to separate the task alias from the step alias. + aliasSeparator = "::" + + // ulidLength is the length of the ULID string. + ulidLength = ulid.EncodedSize + + // shortHashLength is the length of the short hash. + shortHashLength = 7 + + // maxStageNamePrefixLength is the maximum length of the Stage name + // used in the Promotion name prefix before it exceeds the Kubernetes + // resource name limit of 253. + maxStageNamePrefixLength = 253 - len(nameSeparator) - ulidLength - len(nameSeparator) - shortHashLength +) + +type PromotionBuilder struct { + client client.Client +} + +// NewPromotionBuilder creates a new PromotionBuilder with the given client. +func NewPromotionBuilder(c client.Client) *PromotionBuilder { + return &PromotionBuilder{ + client: c, + } +} + +// Build creates a new Promotion for the Freight based on the PromotionTemplate +// of the given Stage. +func (b *PromotionBuilder) Build( + ctx context.Context, + stage kargoapi.Stage, + freight string, +) (*kargoapi.Promotion, error) { + if stage.Name == "" { + return nil, fmt.Errorf("stage is required") + } + + if stage.Spec.PromotionTemplate == nil { + return nil, fmt.Errorf("stage %q has no promotion template", stage.Name) + } + + if freight == "" { + return nil, fmt.Errorf("freight is required") + } + + // Build metadata + annotations := make(map[string]string) + if u, ok := user.InfoFromContext(ctx); ok { + annotations[kargoapi.AnnotationKeyCreateActor] = kargoapi.FormatEventUserActor(u) + } + + // Build steps + steps, err := b.buildSteps(ctx, stage) + if err != nil { + return nil, fmt.Errorf("failed to build promotion steps: %w", err) + } + + promotion := kargoapi.Promotion{ + ObjectMeta: metav1.ObjectMeta{ + Name: generatePromotionName(stage.Name, freight), + Namespace: stage.Namespace, + Annotations: annotations, + }, + Spec: kargoapi.PromotionSpec{ + Stage: stage.Name, + Freight: freight, + Vars: stage.Spec.PromotionTemplate.Spec.Vars, + Steps: steps, + }, + } + return &promotion, nil +} + +// buildSteps processes the Promotion steps from the PromotionTemplate of the +// given Stage. If a PromotionStep references a PromotionTask, the task is +// retrieved and its steps are inflated with the given task inputs. +func (b *PromotionBuilder) buildSteps(ctx context.Context, stage kargoapi.Stage) ([]kargoapi.PromotionStep, error) { + steps := make([]kargoapi.PromotionStep, 0, len(stage.Spec.PromotionTemplate.Spec.Steps)) + for i, step := range stage.Spec.PromotionTemplate.Spec.Steps { + switch { + case step.Task != nil: + alias := step.GetAlias(i) + taskSteps, err := b.inflateTaskSteps(ctx, stage.Namespace, alias, step) + if err != nil { + return nil, fmt.Errorf("inflate tasks steps for task %q (%q): %w", step.Task.Name, alias, err) + } + steps = append(steps, taskSteps...) + default: + steps = append(steps, step) + } + } + return steps, nil +} + +// inflateTaskSteps inflates the PromotionSteps for the given PromotionStep +// that references a (Cluster)PromotionTask. The task is retrieved and its +// steps are inflated with the given task inputs. +func (b *PromotionBuilder) inflateTaskSteps( + ctx context.Context, + project, taskAlias string, + taskStep kargoapi.PromotionStep, +) ([]kargoapi.PromotionStep, error) { + task, err := b.getTaskSpec(ctx, project, taskStep.Task) + if err != nil { + return nil, err + } + + inputs, err := validateAndMapTaskInputs(task.Inputs, taskStep.Config) + if err != nil { + return nil, err + } + + var steps []kargoapi.PromotionStep + for i := range task.Steps { + // Copy the step as-is. + step := &task.Steps[i] + + // Ensures we have a unique alias for each step within the context of + // the Promotion. + step.As = generatePromotionTaskStepAlias(taskAlias, step.GetAlias(i)) + + // With the inputs validated and mapped, they are now available to + // the Config of the step during the Promotion execution. + step.Inputs = inputs + + // Append the inflated step to the list of steps. + steps = append(steps, *step) + } + return steps, nil +} + +// getTaskSpec retrieves the PromotionTaskSpec for the given PromotionTaskReference. +func (b *PromotionBuilder) getTaskSpec( + ctx context.Context, + project string, + ref *kargoapi.PromotionTaskReference, +) (*kargoapi.PromotionTaskSpec, error) { + var spec kargoapi.PromotionTaskSpec + + if ref == nil { + return nil, errors.New("missing task reference") + } + + switch ref.Kind { + case "PromotionTask", "": + task := &kargoapi.PromotionTask{} + if err := b.client.Get(ctx, client.ObjectKey{Namespace: project, Name: ref.Name}, task); err != nil { + return nil, err + } + spec = task.Spec + case "ClusterPromotionTask": + task := &kargoapi.ClusterPromotionTask{} + if err := b.client.Get(ctx, client.ObjectKey{Name: ref.Name}, task); err != nil { + return nil, err + } + spec = task.Spec + default: + return nil, fmt.Errorf("unknown task reference kind %q", ref.Kind) + } + + return &spec, nil +} + +// generatePromotionName generates a name for the Promotion by combining the +// Stage name, a ULID, and a short hash of the Freight. +// +// The name has the format of: +// +// .. +func generatePromotionName(stageName, freight string) string { + if stageName == "" || freight == "" { + return "" + } + + shortHash := freight + if len(shortHash) > shortHashLength { + shortHash = shortHash[0:shortHashLength] + } + + shortStageName := stageName + if len(stageName) > maxStageNamePrefixLength { + shortStageName = shortStageName[0:maxStageNamePrefixLength] + } + + parts := []string{shortStageName, ulid.Make().String(), shortHash} + return strings.ToLower(strings.Join(parts, nameSeparator)) +} + +// generatePromotionTaskStepAlias generates an alias for a PromotionTask step +// by combining the task alias and the step alias. +func generatePromotionTaskStepAlias(taskAlias, stepAlias string) string { + return fmt.Sprintf("%s%s%s", taskAlias, aliasSeparator, stepAlias) +} + +// validateAndMapTaskInputs validates the task step config against the task +// inputs, and maps the config to inputs for the inflated steps. +func validateAndMapTaskInputs( + taskInputs []kargoapi.PromotionTaskInput, + stepConfig *apiextensionsv1.JSON, +) (map[string]string, error) { + if len(taskInputs) == 0 { + return nil, nil + } + + if stepConfig == nil { + return nil, errors.New("missing step config") + } + + config := make(map[string]any, len(taskInputs)) + if err := yaml.Unmarshal(stepConfig.Raw, &config); err != nil { + return nil, fmt.Errorf("unmarshal step config: %w", err) + } + + inputs := make(map[string]string, len(taskInputs)) + for _, input := range taskInputs { + iv := input.Default + if cv, exists := config[input.Name]; exists { + strVal, ok := cv.(string) + if !ok { + return nil, fmt.Errorf("input %q must be a string", input.Name) + } + iv = strVal + } + if iv == "" { + return nil, fmt.Errorf("missing required input %q", input.Name) + } + inputs[input.Name] = iv + } + return inputs, nil +} diff --git a/internal/kargo/promotion_builder_test.go b/internal/kargo/promotion_builder_test.go new file mode 100644 index 000000000..3a6b1732f --- /dev/null +++ b/internal/kargo/promotion_builder_test.go @@ -0,0 +1,1093 @@ +package kargo + +import ( + "context" + "errors" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + "sigs.k8s.io/controller-runtime/pkg/client/interceptor" + "sigs.k8s.io/yaml" + + kargoapi "github.com/akuity/kargo/api/v1alpha1" + "github.com/akuity/kargo/internal/api/user" +) + +func TestPromotionBuilder_Build(t *testing.T) { + s := runtime.NewScheme() + require.NoError(t, kargoapi.AddToScheme(s)) + + tests := []struct { + name string + stage kargoapi.Stage + freight string + userInfo user.Info + objects []client.Object + assertions func(*testing.T, *kargoapi.Promotion, error) + }{ + { + name: "empty stage name returns error", + stage: kargoapi.Stage{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "test-project", + }, + }, + freight: "abc123", + assertions: func(t *testing.T, promotion *kargoapi.Promotion, err error) { + assert.ErrorContains(t, err, "stage is required") + assert.Nil(t, promotion) + }, + }, + { + name: "empty freight returns error", + stage: kargoapi.Stage{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-stage", + Namespace: "test-project", + }, + Spec: kargoapi.StageSpec{ + PromotionTemplate: &kargoapi.PromotionTemplate{}, + }, + }, + freight: "", + assertions: func(t *testing.T, promotion *kargoapi.Promotion, err error) { + assert.ErrorContains(t, err, "freight is required") + assert.Nil(t, promotion) + }, + }, + { + name: "missing promotion template returns error", + stage: kargoapi.Stage{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-stage", + Namespace: "test-project", + }, + }, + freight: "abc123", + assertions: func(t *testing.T, promotion *kargoapi.Promotion, err error) { + assert.ErrorContains(t, err, "has no promotion template") + assert.Nil(t, promotion) + }, + }, + { + name: "successful build with direct steps", + stage: kargoapi.Stage{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-stage", + Namespace: "test-project", + }, + Spec: kargoapi.StageSpec{ + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Vars: []kargoapi.PromotionVariable{ + {Name: "key1", Value: "value1"}, + }, + Steps: []kargoapi.PromotionStep{ + { + As: "step1", + Uses: "fake-step", + }, + }, + }, + }, + }, + }, + freight: "abc123", + assertions: func(t *testing.T, promotion *kargoapi.Promotion, err error) { + require.NoError(t, err) + require.NotNil(t, promotion) + + // Check basic metadata + assert.Equal(t, "test-project", promotion.Namespace) + assert.Equal(t, "test-stage", promotion.Spec.Stage) + assert.Equal(t, "abc123", promotion.Spec.Freight) + + // Check vars + assert.Equal(t, []kargoapi.PromotionVariable{ + { + Name: "key1", + Value: "value1", + }, + }, promotion.Spec.Vars) + + // Check steps + require.Len(t, promotion.Spec.Steps, 1) + assert.Equal(t, "step1", promotion.Spec.Steps[0].As) + assert.Equal(t, "fake-step", promotion.Spec.Steps[0].Uses) + + // Check name format + assert.Contains(t, promotion.Name, "test-stage") + assert.Contains(t, promotion.Name, "abc123"[:6]) + }, + }, + { + name: "successful build with task steps and user info", + stage: kargoapi.Stage{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-stage", + Namespace: "test-project", + }, + Spec: kargoapi.StageSpec{ + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + As: "task-step", + Task: &kargoapi.PromotionTaskReference{ + Name: "test-task", + }, + Config: makeJSONObj(t, map[string]any{ + "input1": "value1", + }), + }, + }, + }, + }, + }, + }, + freight: "abc123", + userInfo: user.Info{ + IsAdmin: true, + }, + objects: []client.Object{ + &kargoapi.PromotionTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-task", + Namespace: "test-project", + }, + Spec: kargoapi.PromotionTaskSpec{ + Inputs: []kargoapi.PromotionTaskInput{ + {Name: "input1"}, + }, + Steps: []kargoapi.PromotionStep{ + { + As: "sub-step", + Uses: "other-fake-step", + }, + }, + }, + }, + }, + assertions: func(t *testing.T, promotion *kargoapi.Promotion, err error) { + require.NoError(t, err) + require.NotNil(t, promotion) + + // Check metadata including user annotation + assert.Equal(t, kargoapi.EventActorAdmin, promotion.Annotations[kargoapi.AnnotationKeyCreateActor]) + + // Check steps + require.Len(t, promotion.Spec.Steps, 1) + assert.Equal(t, "task-step::sub-step", promotion.Spec.Steps[0].As) + assert.Equal(t, "other-fake-step", promotion.Spec.Steps[0].Uses) + assert.Equal(t, map[string]string{"input1": "value1"}, promotion.Spec.Steps[0].Inputs) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx := user.ContextWithInfo(context.Background(), tt.userInfo) + + c := fake.NewClientBuilder(). + WithScheme(s). + WithObjects(tt.objects...). + Build() + + b := NewPromotionBuilder(c) + promotion, err := b.Build(ctx, tt.stage, tt.freight) + tt.assertions(t, promotion, err) + }) + } +} + +func TestPromotionBuilder_buildSteps(t *testing.T) { + s := runtime.NewScheme() + require.NoError(t, kargoapi.AddToScheme(s)) + + tests := []struct { + name string + stage kargoapi.Stage + objects []client.Object + assertions func(*testing.T, []kargoapi.PromotionStep, error) + }{ + { + name: "task not found returns error", + stage: kargoapi.Stage{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-stage", + Namespace: "test-project", + }, + Spec: kargoapi.StageSpec{ + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + Task: &kargoapi.PromotionTaskReference{ + Name: "missing-task", + }, + }, + }, + }, + }, + }, + }, + assertions: func(t *testing.T, steps []kargoapi.PromotionStep, err error) { + assert.ErrorContains(t, err, "not found") + assert.Nil(t, steps) + }, + }, + { + name: "single direct step", + stage: kargoapi.Stage{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-stage", + Namespace: "test-project", + }, + Spec: kargoapi.StageSpec{ + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + As: "direct-step", + Uses: "fake-step", + }, + }, + }, + }, + }, + }, + assertions: func(t *testing.T, steps []kargoapi.PromotionStep, err error) { + require.NoError(t, err) + require.Len(t, steps, 1) + + assert.Equal(t, "direct-step", steps[0].As) + assert.Equal(t, "fake-step", steps[0].Uses) + }, + }, + { + name: "mix of direct and task steps", + stage: kargoapi.Stage{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-stage", + Namespace: "test-project", + }, + Spec: kargoapi.StageSpec{ + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + As: "direct-step", + Uses: "fake-step", + }, + { + As: "task-step", + Task: &kargoapi.PromotionTaskReference{ + Name: "test-task", + }, + Config: makeJSONObj(t, map[string]any{ + "input1": "value1", + }), + }, + }, + }, + }, + }, + }, + objects: []client.Object{ + &kargoapi.PromotionTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-task", + Namespace: "test-project", + }, + Spec: kargoapi.PromotionTaskSpec{ + Inputs: []kargoapi.PromotionTaskInput{ + {Name: "input1"}, + }, + Steps: []kargoapi.PromotionStep{ + { + As: "sub-step", + Uses: "other-fake-step", + }, + }, + }, + }, + }, + assertions: func(t *testing.T, steps []kargoapi.PromotionStep, err error) { + require.NoError(t, err) + require.Len(t, steps, 2) + + // Check direct step + assert.Equal(t, "direct-step", steps[0].As) + assert.Equal(t, "fake-step", steps[0].Uses) + + // Check inflated task step + assert.Equal(t, "task-step::sub-step", steps[1].As) + assert.Equal(t, "other-fake-step", steps[1].Uses) + assert.Equal(t, map[string]string{"input1": "value1"}, steps[1].Inputs) + }, + }, + { + name: "multiple task steps", + stage: kargoapi.Stage{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-stage", + Namespace: "test-project", + }, + Spec: kargoapi.StageSpec{ + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + As: "task1", + Task: &kargoapi.PromotionTaskReference{ + Name: "test-task-1", + }, + Config: makeJSONObj(t, map[string]any{ + "input1": "value1", + }), + }, + { + As: "task2", + Task: &kargoapi.PromotionTaskReference{ + Kind: "ClusterPromotionTask", + Name: "test-task-2", + }, + Config: makeJSONObj(t, map[string]any{ + "input2": "value2", + }), + }, + }, + }, + }, + }, + }, + objects: []client.Object{ + &kargoapi.PromotionTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-task-1", + Namespace: "test-project", + }, + Spec: kargoapi.PromotionTaskSpec{ + Inputs: []kargoapi.PromotionTaskInput{ + {Name: "input1"}, + }, + Steps: []kargoapi.PromotionStep{ + { + As: "step1", + Uses: "fake-step", + }, + }, + }, + }, + &kargoapi.ClusterPromotionTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-task-2", + }, + Spec: kargoapi.PromotionTaskSpec{ + Inputs: []kargoapi.PromotionTaskInput{ + {Name: "input2"}, + }, + Steps: []kargoapi.PromotionStep{ + { + As: "step2", + Uses: "other-fake-step", + }, + }, + }, + }, + }, + assertions: func(t *testing.T, steps []kargoapi.PromotionStep, err error) { + require.NoError(t, err) + require.Len(t, steps, 2) + + assert.Equal(t, "task1::step1", steps[0].As) + assert.Equal(t, "fake-step", steps[0].Uses) + assert.Equal(t, map[string]string{"input1": "value1"}, steps[0].Inputs) + + assert.Equal(t, "task2::step2", steps[1].As) + assert.Equal(t, "other-fake-step", steps[1].Uses) + assert.Equal(t, map[string]string{"input2": "value2"}, steps[1].Inputs) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := fake.NewClientBuilder(). + WithScheme(s). + WithObjects(tt.objects...). + Build() + + b := NewPromotionBuilder(c) + steps, err := b.buildSteps(context.Background(), tt.stage) + tt.assertions(t, steps, err) + }) + } +} + +func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { + s := runtime.NewScheme() + require.NoError(t, kargoapi.AddToScheme(s)) + + tests := []struct { + name string + project string + taskAlias string + taskStep kargoapi.PromotionStep + objects []client.Object + assertions func(*testing.T, []kargoapi.PromotionStep, error) + }{ + { + name: "task not found", + project: "test-project", + taskAlias: "deploy", + taskStep: kargoapi.PromotionStep{ + Task: &kargoapi.PromotionTaskReference{ + Name: "missing-task", + }, + }, + assertions: func(t *testing.T, steps []kargoapi.PromotionStep, err error) { + assert.True(t, apierrors.IsNotFound(err)) + assert.Nil(t, steps) + }, + }, + { + name: "invalid config for task inputs", + project: "test-project", + + taskStep: kargoapi.PromotionStep{ + Task: &kargoapi.PromotionTaskReference{ + Name: "test-task", + }, + Config: &apiextensionsv1.JSON{Raw: []byte(`{invalid json`)}, + }, + objects: []client.Object{ + &kargoapi.PromotionTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-task", + Namespace: "test-project", + }, + Spec: kargoapi.PromotionTaskSpec{ + Inputs: []kargoapi.PromotionTaskInput{ + {Name: "input1"}, + }, + }, + }, + }, + assertions: func(t *testing.T, steps []kargoapi.PromotionStep, err error) { + assert.ErrorContains(t, err, "unmarshal step config") + assert.Nil(t, steps) + }, + }, + { + name: "successful task step inflation", + project: "test-project", + taskAlias: "task-1", + taskStep: kargoapi.PromotionStep{ + Task: &kargoapi.PromotionTaskReference{ + Name: "test-task", + }, + Config: makeJSONObj(t, map[string]any{ + "input1": "value1", + "input2": "value2", + }), + }, + objects: []client.Object{ + &kargoapi.PromotionTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-task", + Namespace: "test-project", + }, + Spec: kargoapi.PromotionTaskSpec{ + Inputs: []kargoapi.PromotionTaskInput{ + {Name: "input1"}, + {Name: "input2", Default: "default2"}, + }, + Steps: []kargoapi.PromotionStep{ + { + As: "step1", + Uses: "fake-step", + }, + { + As: "step2", + Uses: "other-fake-step", + }, + }, + }, + }, + }, + assertions: func(t *testing.T, steps []kargoapi.PromotionStep, err error) { + require.NoError(t, err) + require.Len(t, steps, 2) + + assert.Equal(t, "task-1::step1", steps[0].As) + assert.Equal(t, "fake-step", steps[0].Uses) + assert.Equal(t, map[string]string{ + "input1": "value1", + "input2": "value2", + }, steps[0].Inputs) + + assert.Equal(t, "task-1::step2", steps[1].As) + assert.Equal(t, "other-fake-step", steps[1].Uses) + assert.Equal(t, map[string]string{ + "input1": "value1", + "input2": "value2", + }, steps[1].Inputs) + }, + }, + { + name: "task steps with default alias", + project: "test-project", + taskAlias: "custom-alias", + taskStep: kargoapi.PromotionStep{ + Task: &kargoapi.PromotionTaskReference{ + Name: "test-task", + }, + Config: makeJSONObj(t, map[string]any{ + "input1": "value1", + }), + }, + objects: []client.Object{ + &kargoapi.PromotionTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-task", + Namespace: "test-project", + }, + Spec: kargoapi.PromotionTaskSpec{ + Inputs: []kargoapi.PromotionTaskInput{ + {Name: "input1"}, + }, + Steps: []kargoapi.PromotionStep{ + { + Uses: "fake-step", + }, + { + Uses: "other-fake-step", + }, + }, + }, + }, + }, + assertions: func(t *testing.T, steps []kargoapi.PromotionStep, err error) { + require.NoError(t, err) + require.Len(t, steps, 2) + + assert.Equal(t, "custom-alias::step-0", steps[0].As) + assert.Equal(t, "custom-alias::step-1", steps[1].As) + }, + }, + { + name: "cluster task with steps", + project: "test-project", + taskAlias: "task-0", + taskStep: kargoapi.PromotionStep{ + Task: &kargoapi.PromotionTaskReference{ + Kind: "ClusterPromotionTask", + Name: "test-cluster-task", + }, + Config: makeJSONObj(t, map[string]any{ + "input1": "value1", + }), + }, + objects: []client.Object{ + &kargoapi.ClusterPromotionTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-cluster-task", + }, + Spec: kargoapi.PromotionTaskSpec{ + Inputs: []kargoapi.PromotionTaskInput{ + {Name: "input1"}, + }, + Steps: []kargoapi.PromotionStep{ + { + As: "custom-alias", + Uses: "fake-step", + }, + }, + }, + }, + }, + assertions: func(t *testing.T, steps []kargoapi.PromotionStep, err error) { + require.NoError(t, err) + require.Len(t, steps, 1) + assert.Equal(t, "task-0::custom-alias", steps[0].As) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := fake.NewClientBuilder(). + WithScheme(s). + WithObjects(tt.objects...). + Build() + + b := NewPromotionBuilder(c) + steps, err := b.inflateTaskSteps(context.Background(), tt.project, tt.taskAlias, tt.taskStep) + tt.assertions(t, steps, err) + }) + } +} + +func TestPromotionBuilder_getTaskSpec(t *testing.T) { + s := runtime.NewScheme() + require.NoError(t, kargoapi.AddToScheme(s)) + + tests := []struct { + name string + project string + ref *kargoapi.PromotionTaskReference + objects []client.Object + interceptor interceptor.Funcs + assertions func(*testing.T, *kargoapi.PromotionTaskSpec, error) + }{ + { + name: "nil reference returns error", + project: "test-project", + ref: nil, + assertions: func(t *testing.T, result *kargoapi.PromotionTaskSpec, err error) { + assert.ErrorContains(t, err, "missing task reference") + assert.Nil(t, result) + }, + }, + { + name: "unknown task kind returns error", + project: "test-project", + ref: &kargoapi.PromotionTaskReference{ + Kind: "UnknownKind", + Name: "test-task", + }, + assertions: func(t *testing.T, result *kargoapi.PromotionTaskSpec, err error) { + assert.ErrorContains(t, err, "unknown task reference kind") + assert.Nil(t, result) + }, + }, + { + name: "PromotionTask not found returns error", + project: "test-project", + ref: &kargoapi.PromotionTaskReference{ + Kind: "PromotionTask", + Name: "missing-task", + }, + interceptor: interceptor.Funcs{ + Get: func( + context.Context, + client.WithWatch, + client.ObjectKey, + client.Object, + ...client.GetOption, + ) error { + return errors.New("something went wrong") + }, + }, + assertions: func(t *testing.T, result *kargoapi.PromotionTaskSpec, err error) { + assert.ErrorContains(t, err, "something went wrong") + assert.Nil(t, result) + }, + }, + { + name: "ClusterPromotionTask not found returns error", + project: "test-project", + ref: &kargoapi.PromotionTaskReference{ + Kind: "ClusterPromotionTask", + Name: "missing-cluster-task", + }, + interceptor: interceptor.Funcs{ + Get: func( + context.Context, + client.WithWatch, + client.ObjectKey, + client.Object, + ...client.GetOption, + ) error { + return errors.New("something went wrong") + }, + }, + assertions: func(t *testing.T, result *kargoapi.PromotionTaskSpec, err error) { + assert.ErrorContains(t, err, "something went wrong") + assert.Nil(t, result) + }, + }, + { + name: "successfully retrieves PromotionTask", + project: "test-project", + ref: &kargoapi.PromotionTaskReference{ + Kind: "PromotionTask", + Name: "test-task", + }, + objects: []client.Object{ + &kargoapi.PromotionTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-task", + Namespace: "test-project", + }, + Spec: kargoapi.PromotionTaskSpec{ + Inputs: []kargoapi.PromotionTaskInput{ + {Name: "input1", Default: "value1"}, + }, + }, + }, + }, + assertions: func(t *testing.T, result *kargoapi.PromotionTaskSpec, err error) { + require.NoError(t, err) + require.NotNil(t, result) + + assert.Len(t, result.Inputs, 1) + assert.Equal(t, "input1", result.Inputs[0].Name) + assert.Equal(t, "value1", result.Inputs[0].Default) + }, + }, + { + name: "successfully retrieves ClusterPromotionTask", + project: "test-project", + ref: &kargoapi.PromotionTaskReference{ + Kind: "ClusterPromotionTask", + Name: "test-cluster-task", + }, + objects: []client.Object{ + &kargoapi.ClusterPromotionTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-cluster-task", + }, + Spec: kargoapi.PromotionTaskSpec{ + Inputs: []kargoapi.PromotionTaskInput{ + {Name: "input1", Default: "value1"}, + }, + }, + }, + }, + assertions: func(t *testing.T, result *kargoapi.PromotionTaskSpec, err error) { + require.NoError(t, err) + require.NotNil(t, result) + + assert.Len(t, result.Inputs, 1) + assert.Equal(t, "input1", result.Inputs[0].Name) + assert.Equal(t, "value1", result.Inputs[0].Default) + }, + }, + { + name: "empty kind defaults to PromotionTask", + project: "test-project", + ref: &kargoapi.PromotionTaskReference{ + Kind: "", + Name: "test-task", + }, + objects: []client.Object{ + &kargoapi.PromotionTask{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-task", + Namespace: "test-project", + }, + Spec: kargoapi.PromotionTaskSpec{ + Inputs: []kargoapi.PromotionTaskInput{ + {Name: "input1", Default: "value1"}, + }, + }, + }, + }, + assertions: func(t *testing.T, result *kargoapi.PromotionTaskSpec, err error) { + require.NoError(t, err) + require.NotNil(t, result) + + assert.Len(t, result.Inputs, 1) + assert.Equal(t, "input1", result.Inputs[0].Name) + assert.Equal(t, "value1", result.Inputs[0].Default) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := fake.NewClientBuilder(). + WithScheme(s). + WithObjects(tt.objects...). + WithInterceptorFuncs(tt.interceptor). + Build() + + b := NewPromotionBuilder(c) + result, err := b.getTaskSpec(context.Background(), tt.project, tt.ref) + tt.assertions(t, result, err) + }) + } +} + +func Test_generatePromotionName(t *testing.T) { + tests := []struct { + name string + stageName string + freight string + assertions func(t *testing.T, result string) + }{ + { + name: "standard input lengths", + stageName: "dev", + freight: "abc123def456", + assertions: func(t *testing.T, result string) { + components := strings.Split(result, ".") + assert.Len(t, components, 3) + assert.Equal(t, "dev", components[0]) + assert.Len(t, components[1], ulidLength) + assert.Equal(t, "abc123d", components[2]) + }, + }, + { + name: "short freight", + stageName: "prod", + freight: "abc", + assertions: func(t *testing.T, result string) { + components := strings.Split(result, ".") + assert.Len(t, components, 3) + assert.Equal(t, "prod", components[0]) + assert.Len(t, components[1], ulidLength) + assert.Equal(t, "abc", components[2]) + }, + }, + { + name: "long stage name gets truncated", + // nolint:lll + stageName: "this-is-a-very-long-stage-name-that-exceeds-the-maximum-allowed-length-for-kubernetes-resources-and-should-be-truncated-to-fit-within-the-limits-set-by-the-api-server-which-is-253-characters-including-the-generated-suffix", + freight: "abc123def456", + assertions: func(t *testing.T, result string) { + assert.Equal(t, len(result), 253) // Kubernetes resource name limit + assert.Equal(t, maxStageNamePrefixLength, len(result[:strings.Index(result, ".")])) + }, + }, + { + name: "long freight gets truncated", + stageName: "stage", + freight: "this-is-a-very-long-freight-hash-that-should-be-truncated", + assertions: func(t *testing.T, result string) { + shortHash := result[strings.LastIndex(result, ".")+1:] + assert.Equal(t, shortHashLength, len(shortHash)) + }, + }, + { + name: "all lowercase conversion", + stageName: "DEV-STAGE", + freight: "ABC123DEF456", + assertions: func(t *testing.T, result string) { + assert.Equal(t, "dev-stage", result[:len("dev-stage")]) + assert.Equal(t, "abc123d", result[len(result)-7:]) + }, + }, + { + name: "empty inputs", + stageName: "", + freight: "", + assertions: func(t *testing.T, result string) { + assert.Empty(t, result) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := generatePromotionName(tt.stageName, tt.freight) + tt.assertions(t, result) + }) + } +} + +func Test_generatePromotionTaskStepName(t *testing.T) { + tests := []struct { + name string + taskAlias string + stepAlias string + assertions func(t *testing.T, result string) + }{ + { + name: "standard aliases", + taskAlias: "deploy", + stepAlias: "apply", + assertions: func(t *testing.T, result string) { + assert.Equal(t, "deploy::apply", result) + }, + }, + { + name: "empty task alias", + taskAlias: "", + stepAlias: "apply", + assertions: func(t *testing.T, result string) { + assert.Equal(t, "::apply", result) + }, + }, + { + name: "empty step alias", + taskAlias: "deploy", + stepAlias: "", + assertions: func(t *testing.T, result string) { + assert.Equal(t, "deploy::", result) + }, + }, + { + name: "both aliases empty", + taskAlias: "", + stepAlias: "", + assertions: func(t *testing.T, result string) { + assert.Equal(t, "::", result) + }, + }, + { + name: "aliases with special characters", + taskAlias: "deploy-task", + stepAlias: "apply_config", + assertions: func(t *testing.T, result string) { + assert.Equal(t, "deploy-task::apply_config", result) + }, + }, + { + name: "aliases containing separator", + taskAlias: "deploy::task", + stepAlias: "apply::config", + assertions: func(t *testing.T, result string) { + assert.Equal(t, "deploy::task::apply::config", result) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := generatePromotionTaskStepAlias(tt.taskAlias, tt.stepAlias) + tt.assertions(t, result) + }) + } +} + +func Test_validateAndMapTaskInputs(t *testing.T) { + tests := []struct { + name string + taskInputs []kargoapi.PromotionTaskInput + config map[string]any + assertions func(t *testing.T, result map[string]string, err error) + }{ + { + name: "nil inputs returns nil map and no error", + taskInputs: nil, + config: nil, + assertions: func(t *testing.T, result map[string]string, err error) { + require.NoError(t, err) + assert.Nil(t, result) + }, + }, + { + name: "empty inputs returns nil map and no error", + taskInputs: []kargoapi.PromotionTaskInput{}, + config: nil, + assertions: func(t *testing.T, result map[string]string, err error) { + require.NoError(t, err) + assert.Nil(t, result) + }, + }, + { + name: "missing config when inputs required returns error", + taskInputs: []kargoapi.PromotionTaskInput{ + {Name: "input1"}, + }, + config: nil, + assertions: func(t *testing.T, result map[string]string, err error) { + assert.ErrorContains(t, err, "missing step config") + assert.Nil(t, result) + }, + }, + { + name: "non-string input value returns error", + taskInputs: []kargoapi.PromotionTaskInput{ + {Name: "input1"}, + }, + config: map[string]any{ + "input1": 123, // number instead of string + }, + assertions: func(t *testing.T, result map[string]string, err error) { + assert.ErrorContains(t, err, "input \"input1\" must be a string") + assert.Nil(t, result) + }, + }, + { + name: "missing required input returns error", + taskInputs: []kargoapi.PromotionTaskInput{ + {Name: "input1"}, + }, + config: map[string]any{ + "input1": "", // empty string is not allowed without default + }, + assertions: func(t *testing.T, result map[string]string, err error) { + assert.ErrorContains(t, err, "missing required input \"input1\"") + assert.Nil(t, result) + }, + }, + { + name: "default value used when config value not provided", + taskInputs: []kargoapi.PromotionTaskInput{ + {Name: "input1", Default: "default1"}, + }, + config: map[string]any{}, + assertions: func(t *testing.T, result map[string]string, err error) { + require.NoError(t, err) + assert.Equal(t, map[string]string{"input1": "default1"}, result) + }, + }, + { + name: "config value overrides default value", + taskInputs: []kargoapi.PromotionTaskInput{ + {Name: "input1", Default: "default1"}, + }, + config: map[string]any{ + "input1": "override1", + }, + assertions: func(t *testing.T, result map[string]string, err error) { + require.NoError(t, err) + assert.Equal(t, map[string]string{"input1": "override1"}, result) + }, + }, + { + name: "multiple inputs processed correctly", + taskInputs: []kargoapi.PromotionTaskInput{ + {Name: "input1", Default: "default1"}, + {Name: "input2", Default: "default2"}, + {Name: "input3"}, + }, + config: map[string]any{ + "input1": "override1", + "input3": "value3", + }, + assertions: func(t *testing.T, result map[string]string, err error) { + require.NoError(t, err) + assert.Equal(t, map[string]string{ + "input1": "override1", + "input2": "default2", + "input3": "value3", + }, result) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var configJSON *apiextensionsv1.JSON + if tt.config != nil { + configBytes, err := yaml.Marshal(tt.config) + require.NoError(t, err) + configJSON = &apiextensionsv1.JSON{Raw: configBytes} + } + + result, err := validateAndMapTaskInputs(tt.taskInputs, configJSON) + tt.assertions(t, result, err) + }) + } +} + +// makeJSONObj is a helper function to create an API extension JSON object from +// a map. +func makeJSONObj(t *testing.T, m map[string]any) *apiextensionsv1.JSON { + data, err := yaml.Marshal(m) + require.NoError(t, err) + return &apiextensionsv1.JSON{Raw: data} +} From 023465f89cb5a8e0ce41cbf102a5a021a032388a Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Thu, 12 Dec 2024 17:55:23 +0100 Subject: [PATCH 13/38] chore: fix broken tests Signed-off-by: Hidde Beydals --- .../api/promote_downstream_v1alpha1_test.go | 46 ++++-- .../api/promote_to_stage_v1alpha1_test.go | 96 ++++++++++-- .../controller/stages/regular_stages_test.go | 138 ++++++++++++++++++ 3 files changed, 257 insertions(+), 23 deletions(-) diff --git a/internal/api/promote_downstream_v1alpha1_test.go b/internal/api/promote_downstream_v1alpha1_test.go index 0782f9def..287b89549 100644 --- a/internal/api/promote_downstream_v1alpha1_test.go +++ b/internal/api/promote_downstream_v1alpha1_test.go @@ -30,6 +30,7 @@ func TestPromoteDownstream(t *testing.T) { }, }}, } + testCases := []struct { name string req *svcv1alpha1.PromoteDownstreamRequest @@ -74,8 +75,7 @@ func TestPromoteDownstream(t *testing.T) { _ *connect.Response[svcv1alpha1.PromoteDownstreamResponse], err error, ) { - require.Error(t, err) - require.Equal(t, "something went wrong", err.Error()) + require.ErrorContains(t, err, "something went wrong") }, }, { @@ -103,8 +103,7 @@ func TestPromoteDownstream(t *testing.T) { _ *connect.Response[svcv1alpha1.PromoteDownstreamResponse], err error, ) { - require.Error(t, err) - require.Equal(t, "get stage: something went wrong", err.Error()) + require.ErrorContains(t, err, "get stage: something went wrong") }, }, { @@ -174,8 +173,7 @@ func TestPromoteDownstream(t *testing.T) { _ *connect.Response[svcv1alpha1.PromoteDownstreamResponse], err error, ) { - require.Error(t, err) - require.Equal(t, "get freight: something went wrong", err.Error()) + require.ErrorContains(t, err, "get freight: something went wrong") }, }, { @@ -271,8 +269,7 @@ func TestPromoteDownstream(t *testing.T) { _ *connect.Response[svcv1alpha1.PromoteDownstreamResponse], err error, ) { - require.Error(t, err) - require.Equal(t, "find downstream stages: something went wrong", err.Error()) + require.ErrorContains(t, err, "find downstream stages: something went wrong") }, }, { @@ -396,8 +393,7 @@ func TestPromoteDownstream(t *testing.T) { _ *connect.Response[svcv1alpha1.PromoteDownstreamResponse], err error, ) { - require.Error(t, err) - require.Equal(t, "not authorized", err.Error()) + require.ErrorContains(t, err, "not authorized") }, }, { @@ -423,7 +419,9 @@ func TestPromoteDownstream(t *testing.T) { getFreightByNameOrAliasFn: func( context.Context, client.Client, - string, string, string, + string, + string, + string, ) (*kargoapi.Freight, error) { return &kargoapi.Freight{}, nil }, @@ -488,6 +486,10 @@ func TestPromoteDownstream(t *testing.T) { string, string, string, ) (*kargoapi.Freight, error) { return &kargoapi.Freight{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "fake-project", + Name: "fake-freight", + }, Status: kargoapi.FreightStatus{ VerifiedIn: map[string]kargoapi.VerifiedStage{ "fake-stage": {}, @@ -502,12 +504,21 @@ func TestPromoteDownstream(t *testing.T) { ) ([]kargoapi.Stage, error) { return []kargoapi.Stage{ { + ObjectMeta: metav1.ObjectMeta{ + Namespace: "fake-project", + Name: "fake-downstream-stage", + }, Spec: kargoapi.StageSpec{ RequestedFreight: []kargoapi.FreightRequest{{ Sources: kargoapi.FreightSources{ Stages: []string{"fake-stage"}, }, }}, + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{{}}, + }, + }, }, }, }, nil @@ -572,6 +583,10 @@ func TestPromoteDownstream(t *testing.T) { string, string, string, ) (*kargoapi.Freight, error) { return &kargoapi.Freight{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "fake-project", + Name: "fake-freight", + }, Status: kargoapi.FreightStatus{ VerifiedIn: map[string]kargoapi.VerifiedStage{ "fake-stage": {}, @@ -586,12 +601,21 @@ func TestPromoteDownstream(t *testing.T) { ) ([]kargoapi.Stage, error) { return []kargoapi.Stage{ { + ObjectMeta: metav1.ObjectMeta{ + Namespace: "fake-project", + Name: "fake-downstream-stage", + }, Spec: kargoapi.StageSpec{ RequestedFreight: []kargoapi.FreightRequest{{ Sources: kargoapi.FreightSources{ Stages: []string{"fake-stage"}, }, }}, + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{{}}, + }, + }, }, }, }, nil diff --git a/internal/api/promote_to_stage_v1alpha1_test.go b/internal/api/promote_to_stage_v1alpha1_test.go index 99fb960a0..bd1fdcb78 100644 --- a/internal/api/promote_to_stage_v1alpha1_test.go +++ b/internal/api/promote_to_stage_v1alpha1_test.go @@ -8,6 +8,7 @@ import ( "connectrpc.com/connect" "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" @@ -28,6 +29,11 @@ func TestPromoteToStage(t *testing.T) { Stages: []string{"fake-upstream-stage"}, }, }}, + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{{}}, + }, + }, } testCases := []struct { name string @@ -74,8 +80,7 @@ func TestPromoteToStage(t *testing.T) { _ *connect.Response[svcv1alpha1.PromoteToStageResponse], err error, ) { - require.Error(t, err) - require.Equal(t, "something went wrong", err.Error()) + require.ErrorContains(t, err, "something went wrong") }, }, { @@ -103,8 +108,7 @@ func TestPromoteToStage(t *testing.T) { _ *connect.Response[svcv1alpha1.PromoteToStageResponse], err error, ) { - require.Error(t, err) - require.Equal(t, "get stage: something went wrong", err.Error()) + require.ErrorContains(t, err, "get stage: something went wrong") }, }, { @@ -174,8 +178,7 @@ func TestPromoteToStage(t *testing.T) { _ *connect.Response[svcv1alpha1.PromoteToStageResponse], err error, ) { - require.Error(t, err) - require.Equal(t, "get freight: something went wrong", err.Error()) + require.ErrorContains(t, err, "get freight: something went wrong") }, }, { @@ -313,12 +316,11 @@ func TestPromoteToStage(t *testing.T) { _ *connect.Response[svcv1alpha1.PromoteToStageResponse], err error, ) { - require.Error(t, err) - require.Equal(t, "not authorized", err.Error()) + require.Error(t, err, "not authorized") }, }, { - name: "error creating Promotion", + name: "error building Promotion", req: &svcv1alpha1.PromoteToStageRequest{ Project: "fake-project", Stage: "fake-stage", @@ -334,6 +336,10 @@ func TestPromoteToStage(t *testing.T) { types.NamespacedName, ) (*kargoapi.Stage, error) { return &kargoapi.Stage{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "fake-project", + Name: "fake-stage", + }, Spec: testStageSpec, }, nil }, @@ -356,6 +362,64 @@ func TestPromoteToStage(t *testing.T) { ) error { return nil }, + }, + assertions: func( + t *testing.T, + _ *fakeevent.EventRecorder, + _ *connect.Response[svcv1alpha1.PromoteToStageResponse], + err error, + ) { + require.ErrorContains(t, err, "build promotion") + }, + }, + { + name: "error creating Promotion", + req: &svcv1alpha1.PromoteToStageRequest{ + Project: "fake-project", + Stage: "fake-stage", + Freight: "fake-freight", + }, + server: &server{ + validateProjectExistsFn: func(context.Context, string) error { + return nil + }, + getStageFn: func( + context.Context, + client.Client, + types.NamespacedName, + ) (*kargoapi.Stage, error) { + return &kargoapi.Stage{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "fake-project", + Name: "fake-stage", + }, + Spec: testStageSpec, + }, nil + }, + getFreightByNameOrAliasFn: func( + context.Context, + client.Client, + string, string, string, + ) (*kargoapi.Freight, error) { + return &kargoapi.Freight{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "fake-project", + Name: "fake-freight", + }, + }, nil + }, + isFreightAvailableFn: func(*kargoapi.Stage, *kargoapi.Freight) bool { + return true + }, + authorizeFn: func( + context.Context, + string, + schema.GroupVersionResource, + string, + client.ObjectKey, + ) error { + return nil + }, createPromotionFn: func( context.Context, client.Object, @@ -370,8 +434,7 @@ func TestPromoteToStage(t *testing.T) { _ *connect.Response[svcv1alpha1.PromoteToStageResponse], err error, ) { - require.Error(t, err) - require.Equal(t, "create promotion: something went wrong", err.Error()) + require.Error(t, err, "create promotion: something went wrong") }, }, { @@ -391,6 +454,10 @@ func TestPromoteToStage(t *testing.T) { types.NamespacedName, ) (*kargoapi.Stage, error) { return &kargoapi.Stage{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "fake-project", + Name: "fake-stage", + }, Spec: testStageSpec, }, nil }, @@ -399,7 +466,12 @@ func TestPromoteToStage(t *testing.T) { client.Client, string, string, string, ) (*kargoapi.Freight, error) { - return &kargoapi.Freight{}, nil + return &kargoapi.Freight{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "fake-project", + Name: "fake-freight", + }, + }, nil }, isFreightAvailableFn: func(*kargoapi.Stage, *kargoapi.Freight) bool { return true diff --git a/internal/controller/stages/regular_stages_test.go b/internal/controller/stages/regular_stages_test.go index 21c2bb31d..d1804c033 100644 --- a/internal/controller/stages/regular_stages_test.go +++ b/internal/controller/stages/regular_stages_test.go @@ -4497,6 +4497,15 @@ func TestRegularStageReconciler_autoPromoteFreight(t *testing.T) { }, }, }, + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + Uses: "fake-step", + }, + }, + }, + }, }, }, objects: []client.Object{ @@ -4736,6 +4745,15 @@ func TestRegularStageReconciler_autoPromoteFreight(t *testing.T) { }, }, }, + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + Uses: "fake-step", + }, + }, + }, + }, }, }, objects: []client.Object{ @@ -4811,6 +4829,15 @@ func TestRegularStageReconciler_autoPromoteFreight(t *testing.T) { }, }, }, + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + Uses: "fake-step", + }, + }, + }, + }, }, }, objects: []client.Object{ @@ -4918,6 +4945,15 @@ func TestRegularStageReconciler_autoPromoteFreight(t *testing.T) { }, }, }, + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + Uses: "fake-step", + }, + }, + }, + }, }, }, objects: []client.Object{ @@ -5001,6 +5037,15 @@ func TestRegularStageReconciler_autoPromoteFreight(t *testing.T) { }, }, }, + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + Uses: "fake-step", + }, + }, + }, + }, }, }, objects: []client.Object{ @@ -5097,6 +5142,15 @@ func TestRegularStageReconciler_autoPromoteFreight(t *testing.T) { }, }, }, + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + Uses: "fake-step", + }, + }, + }, + }, }, }, objects: []client.Object{ @@ -5168,6 +5222,15 @@ func TestRegularStageReconciler_autoPromoteFreight(t *testing.T) { }, }, }, + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + Uses: "fake-step", + }, + }, + }, + }, }, }, objects: []client.Object{ @@ -5225,6 +5288,72 @@ func TestRegularStageReconciler_autoPromoteFreight(t *testing.T) { assert.Len(t, promoList.Items, 1) }, }, + { + name: "handles promotion build error", + stage: &kargoapi.Stage{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "fake-project", + Name: "test-stage", + }, + Spec: kargoapi.StageSpec{ + RequestedFreight: []kargoapi.FreightRequest{ + { + Origin: kargoapi.FreightOrigin{ + Kind: kargoapi.FreightOriginKindWarehouse, + Name: "test-warehouse", + }, + Sources: kargoapi.FreightSources{ + Direct: true, + }, + }, + }, + // Missing template to build Promotion + PromotionTemplate: nil, + }, + }, + objects: []client.Object{ + &kargoapi.Project{ + ObjectMeta: metav1.ObjectMeta{ + Name: "fake-project", + }, + Spec: &kargoapi.ProjectSpec{ + PromotionPolicies: []kargoapi.PromotionPolicy{ + { + Stage: "test-stage", + AutoPromotionEnabled: true, + }, + }, + }, + }, + &kargoapi.Warehouse{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "fake-project", + Name: "test-warehouse", + }, + }, + &kargoapi.Freight{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "fake-project", + Name: "test-freight", + CreationTimestamp: metav1.Time{Time: now}, + }, + Origin: kargoapi.FreightOrigin{ + Kind: kargoapi.FreightOriginKindWarehouse, + Name: "test-warehouse", + }, + Status: kargoapi.FreightStatus{}, + }, + }, + assertions: func( + t *testing.T, + _ *fakeevent.EventRecorder, + _ client.Client, + _ kargoapi.StageStatus, + err error, + ) { + require.ErrorContains(t, err, "error building Promotion") + }, + }, { name: "handles promotion creation error", stage: &kargoapi.Stage{ @@ -5244,6 +5373,15 @@ func TestRegularStageReconciler_autoPromoteFreight(t *testing.T) { }, }, }, + PromotionTemplate: &kargoapi.PromotionTemplate{ + Spec: kargoapi.PromotionTemplateSpec{ + Steps: []kargoapi.PromotionStep{ + { + Uses: "fake-step", + }, + }, + }, + }, }, }, objects: []client.Object{ From a3702c76536095b79693a2e07b7c971c7358f0ce Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Fri, 13 Dec 2024 10:32:13 +0100 Subject: [PATCH 14/38] fix(api): make PromotionStep input field a list Signed-off-by: Hidde Beydals --- api/v1alpha1/promotion_task_types.go | 1 + api/v1alpha1/promotion_types.go | 16 +++++- internal/kargo/promotion_builder.go | 15 +++--- internal/kargo/promotion_builder_test.go | 66 ++++++++++++++---------- 4 files changed, 63 insertions(+), 35 deletions(-) diff --git a/api/v1alpha1/promotion_task_types.go b/api/v1alpha1/promotion_task_types.go index fa22b7f1b..281eb0b1f 100644 --- a/api/v1alpha1/promotion_task_types.go +++ b/api/v1alpha1/promotion_task_types.go @@ -45,6 +45,7 @@ type PromotionTaskInput struct { // // +kubebuilder:validation:Required // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Pattern=^[a-zA-Z_]\w*$ Name string `json:"name" protobuf:"bytes,1,opt,name=name"` // Default specifies a default value for the parameter. This value will be // used if the parameter is not specified in the PromotionTemplate. diff --git a/api/v1alpha1/promotion_types.go b/api/v1alpha1/promotion_types.go index ac72f9fcb..e318d49c5 100644 --- a/api/v1alpha1/promotion_types.go +++ b/api/v1alpha1/promotion_types.go @@ -195,6 +195,18 @@ func (r *PromotionStepRetry) GetErrorThreshold(fallback uint32) uint32 { return r.ErrorThreshold } +// PromotionStepInput describes a single input value for a PromotionStep that may +// be referenced by expressions in the step. +type PromotionStepInput struct { + // Name is the name of the input to which the value is assigned. + // + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Pattern=^[a-zA-Z_]\w*$ + Name string `json:"name" protobuf:"bytes,1,opt,name=name"` + // Value is the input value. + Value string `json:"value" protobuf:"bytes,2,opt,name=value"` +} + // PromotionStep describes a directive to be executed as part of a Promotion. // // +kubebuilder:validation:XValidation:message="inputs must not be set when task is set",rule="!(has(self.task) && self.inputs.size() > 0)" @@ -211,13 +223,13 @@ type PromotionStep struct { As string `json:"as,omitempty" protobuf:"bytes,2,opt,name=as"` // Retry is the retry policy for this step. Retry *PromotionStepRetry `json:"retry,omitempty" protobuf:"bytes,4,opt,name=retry"` - // Inputs is a map of inputs that can used to parameterize the execution + // Inputs is a list of inputs that can used to parameterize the execution // of the PromotionStep and can be referenced by expressions in the Config. // // When a PromotionStep is inflated from a PromotionTask, the inputs // specified in the PromotionTask are set based on the inputs specified // in the Config of the PromotionStep that references the PromotionTask. - Inputs map[string]string `json:"inputs,omitempty" protobuf:"bytes,6,rep,name=inputs" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Inputs []PromotionStepInput `json:"inputs,omitempty" protobuf:"bytes,6,rep,name=inputs"` // Config is opaque configuration for the PromotionStep that is understood // only by each PromotionStep's implementation. It is legal to utilize // expressions in defining values at any level of this block. diff --git a/internal/kargo/promotion_builder.go b/internal/kargo/promotion_builder.go index 74f743067..2deb446aa 100644 --- a/internal/kargo/promotion_builder.go +++ b/internal/kargo/promotion_builder.go @@ -128,7 +128,7 @@ func (b *PromotionBuilder) inflateTaskSteps( return nil, err } - inputs, err := validateAndMapTaskInputs(task.Inputs, taskStep.Config) + inputs, err := promotionTaskInputsToStepInputs(task.Inputs, taskStep.Config) if err != nil { return nil, err } @@ -215,12 +215,12 @@ func generatePromotionTaskStepAlias(taskAlias, stepAlias string) string { return fmt.Sprintf("%s%s%s", taskAlias, aliasSeparator, stepAlias) } -// validateAndMapTaskInputs validates the task step config against the task +// promotionTaskInputsToStepInputs validates the task step config against the task // inputs, and maps the config to inputs for the inflated steps. -func validateAndMapTaskInputs( +func promotionTaskInputsToStepInputs( taskInputs []kargoapi.PromotionTaskInput, stepConfig *apiextensionsv1.JSON, -) (map[string]string, error) { +) ([]kargoapi.PromotionStepInput, error) { if len(taskInputs) == 0 { return nil, nil } @@ -234,7 +234,7 @@ func validateAndMapTaskInputs( return nil, fmt.Errorf("unmarshal step config: %w", err) } - inputs := make(map[string]string, len(taskInputs)) + inputs := make([]kargoapi.PromotionStepInput, 0, len(taskInputs)) for _, input := range taskInputs { iv := input.Default if cv, exists := config[input.Name]; exists { @@ -247,7 +247,10 @@ func validateAndMapTaskInputs( if iv == "" { return nil, fmt.Errorf("missing required input %q", input.Name) } - inputs[input.Name] = iv + inputs = append(inputs, kargoapi.PromotionStepInput{ + Name: input.Name, + Value: iv, + }) } return inputs, nil } diff --git a/internal/kargo/promotion_builder_test.go b/internal/kargo/promotion_builder_test.go index 3a6b1732f..81411f17d 100644 --- a/internal/kargo/promotion_builder_test.go +++ b/internal/kargo/promotion_builder_test.go @@ -187,7 +187,9 @@ func TestPromotionBuilder_Build(t *testing.T) { require.Len(t, promotion.Spec.Steps, 1) assert.Equal(t, "task-step::sub-step", promotion.Spec.Steps[0].As) assert.Equal(t, "other-fake-step", promotion.Spec.Steps[0].Uses) - assert.Equal(t, map[string]string{"input1": "value1"}, promotion.Spec.Steps[0].Inputs) + assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + {Name: "input1", Value: "value1"}, + }, promotion.Spec.Steps[0].Inputs) }, }, } @@ -331,7 +333,9 @@ func TestPromotionBuilder_buildSteps(t *testing.T) { // Check inflated task step assert.Equal(t, "task-step::sub-step", steps[1].As) assert.Equal(t, "other-fake-step", steps[1].Uses) - assert.Equal(t, map[string]string{"input1": "value1"}, steps[1].Inputs) + assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + {Name: "input1", Value: "value1"}, + }, steps[1].Inputs) }, }, { @@ -410,11 +414,15 @@ func TestPromotionBuilder_buildSteps(t *testing.T) { assert.Equal(t, "task1::step1", steps[0].As) assert.Equal(t, "fake-step", steps[0].Uses) - assert.Equal(t, map[string]string{"input1": "value1"}, steps[0].Inputs) + assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + {Name: "input1", Value: "value1"}, + }, steps[0].Inputs) assert.Equal(t, "task2::step2", steps[1].As) assert.Equal(t, "other-fake-step", steps[1].Uses) - assert.Equal(t, map[string]string{"input2": "value2"}, steps[1].Inputs) + assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + {Name: "input2", Value: "value2"}, + }, steps[1].Inputs) }, }, } @@ -530,16 +538,16 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { assert.Equal(t, "task-1::step1", steps[0].As) assert.Equal(t, "fake-step", steps[0].Uses) - assert.Equal(t, map[string]string{ - "input1": "value1", - "input2": "value2", + assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + {Name: "input1", Value: "value1"}, + {Name: "input2", Value: "value2"}, }, steps[0].Inputs) assert.Equal(t, "task-1::step2", steps[1].As) assert.Equal(t, "other-fake-step", steps[1].Uses) - assert.Equal(t, map[string]string{ - "input1": "value1", - "input2": "value2", + assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + {Name: "input1", Value: "value1"}, + {Name: "input2", Value: "value2"}, }, steps[1].Inputs) }, }, @@ -961,18 +969,18 @@ func Test_generatePromotionTaskStepName(t *testing.T) { } } -func Test_validateAndMapTaskInputs(t *testing.T) { +func Test_promotionTaskInputsToStepInputs(t *testing.T) { tests := []struct { name string taskInputs []kargoapi.PromotionTaskInput config map[string]any - assertions func(t *testing.T, result map[string]string, err error) + assertions func(t *testing.T, result []kargoapi.PromotionStepInput, err error) }{ { name: "nil inputs returns nil map and no error", taskInputs: nil, config: nil, - assertions: func(t *testing.T, result map[string]string, err error) { + assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { require.NoError(t, err) assert.Nil(t, result) }, @@ -981,7 +989,7 @@ func Test_validateAndMapTaskInputs(t *testing.T) { name: "empty inputs returns nil map and no error", taskInputs: []kargoapi.PromotionTaskInput{}, config: nil, - assertions: func(t *testing.T, result map[string]string, err error) { + assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { require.NoError(t, err) assert.Nil(t, result) }, @@ -992,7 +1000,7 @@ func Test_validateAndMapTaskInputs(t *testing.T) { {Name: "input1"}, }, config: nil, - assertions: func(t *testing.T, result map[string]string, err error) { + assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { assert.ErrorContains(t, err, "missing step config") assert.Nil(t, result) }, @@ -1005,7 +1013,7 @@ func Test_validateAndMapTaskInputs(t *testing.T) { config: map[string]any{ "input1": 123, // number instead of string }, - assertions: func(t *testing.T, result map[string]string, err error) { + assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { assert.ErrorContains(t, err, "input \"input1\" must be a string") assert.Nil(t, result) }, @@ -1018,7 +1026,7 @@ func Test_validateAndMapTaskInputs(t *testing.T) { config: map[string]any{ "input1": "", // empty string is not allowed without default }, - assertions: func(t *testing.T, result map[string]string, err error) { + assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { assert.ErrorContains(t, err, "missing required input \"input1\"") assert.Nil(t, result) }, @@ -1029,9 +1037,11 @@ func Test_validateAndMapTaskInputs(t *testing.T) { {Name: "input1", Default: "default1"}, }, config: map[string]any{}, - assertions: func(t *testing.T, result map[string]string, err error) { + assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { require.NoError(t, err) - assert.Equal(t, map[string]string{"input1": "default1"}, result) + assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + {Name: "input1", Value: "default1"}, + }, result) }, }, { @@ -1042,9 +1052,11 @@ func Test_validateAndMapTaskInputs(t *testing.T) { config: map[string]any{ "input1": "override1", }, - assertions: func(t *testing.T, result map[string]string, err error) { + assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { require.NoError(t, err) - assert.Equal(t, map[string]string{"input1": "override1"}, result) + assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + {Name: "input1", Value: "override1"}, + }, result) }, }, { @@ -1058,12 +1070,12 @@ func Test_validateAndMapTaskInputs(t *testing.T) { "input1": "override1", "input3": "value3", }, - assertions: func(t *testing.T, result map[string]string, err error) { + assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { require.NoError(t, err) - assert.Equal(t, map[string]string{ - "input1": "override1", - "input2": "default2", - "input3": "value3", + assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + {Name: "input1", Value: "override1"}, + {Name: "input2", Value: "default2"}, + {Name: "input3", Value: "value3"}, }, result) }, }, @@ -1078,7 +1090,7 @@ func Test_validateAndMapTaskInputs(t *testing.T) { configJSON = &apiextensionsv1.JSON{Raw: configBytes} } - result, err := validateAndMapTaskInputs(tt.taskInputs, configJSON) + result, err := promotionTaskInputsToStepInputs(tt.taskInputs, configJSON) tt.assertions(t, result, err) }) } From 65cf54d35a65899950fca772d0ae7240d8b77c5b Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Fri, 13 Dec 2024 10:32:42 +0100 Subject: [PATCH 15/38] chore: run codegen Signed-off-by: Hidde Beydals --- api/v1alpha1/generated.pb.go | 907 ++++++++++-------- api/v1alpha1/generated.proto | 18 +- api/v1alpha1/zz_generated.deepcopy.go | 21 +- ...kargo.akuity.io_clusterpromotiontasks.yaml | 25 +- .../crds/kargo.akuity.io_promotions.yaml | 24 +- .../crds/kargo.akuity.io_promotiontasks.yaml | 25 +- .../crds/kargo.akuity.io_stages.yaml | 24 +- ...omotiontasks.kargo.akuity.io_v1alpha1.json | 26 +- .../promotions.kargo.akuity.io_v1alpha1.json | 25 +- ...omotiontasks.kargo.akuity.io_v1alpha1.json | 26 +- .../stages.kargo.akuity.io_v1alpha1.json | 25 +- ui/src/gen/v1alpha1/generated_pb.ts | 85 +- 12 files changed, 758 insertions(+), 473 deletions(-) diff --git a/api/v1alpha1/generated.pb.go b/api/v1alpha1/generated.pb.go index 40a6faa09..8c2fc4c00 100644 --- a/api/v1alpha1/generated.pb.go +++ b/api/v1alpha1/generated.pb.go @@ -1262,10 +1262,38 @@ func (m *PromotionStep) XXX_DiscardUnknown() { var xxx_messageInfo_PromotionStep proto.InternalMessageInfo +func (m *PromotionStepInput) Reset() { *m = PromotionStepInput{} } +func (*PromotionStepInput) ProtoMessage() {} +func (*PromotionStepInput) Descriptor() ([]byte, []int) { + return fileDescriptor_e26b7f7bbc391025, []int{44} +} +func (m *PromotionStepInput) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PromotionStepInput) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PromotionStepInput) XXX_Merge(src proto.Message) { + xxx_messageInfo_PromotionStepInput.Merge(m, src) +} +func (m *PromotionStepInput) XXX_Size() int { + return m.Size() +} +func (m *PromotionStepInput) XXX_DiscardUnknown() { + xxx_messageInfo_PromotionStepInput.DiscardUnknown(m) +} + +var xxx_messageInfo_PromotionStepInput proto.InternalMessageInfo + func (m *PromotionStepRetry) Reset() { *m = PromotionStepRetry{} } func (*PromotionStepRetry) ProtoMessage() {} func (*PromotionStepRetry) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{44} + return fileDescriptor_e26b7f7bbc391025, []int{45} } func (m *PromotionStepRetry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1293,7 +1321,7 @@ var xxx_messageInfo_PromotionStepRetry proto.InternalMessageInfo func (m *PromotionTask) Reset() { *m = PromotionTask{} } func (*PromotionTask) ProtoMessage() {} func (*PromotionTask) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{45} + return fileDescriptor_e26b7f7bbc391025, []int{46} } func (m *PromotionTask) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1321,7 +1349,7 @@ var xxx_messageInfo_PromotionTask proto.InternalMessageInfo func (m *PromotionTaskInput) Reset() { *m = PromotionTaskInput{} } func (*PromotionTaskInput) ProtoMessage() {} func (*PromotionTaskInput) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{46} + return fileDescriptor_e26b7f7bbc391025, []int{47} } func (m *PromotionTaskInput) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1349,7 +1377,7 @@ var xxx_messageInfo_PromotionTaskInput proto.InternalMessageInfo func (m *PromotionTaskList) Reset() { *m = PromotionTaskList{} } func (*PromotionTaskList) ProtoMessage() {} func (*PromotionTaskList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{47} + return fileDescriptor_e26b7f7bbc391025, []int{48} } func (m *PromotionTaskList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1377,7 +1405,7 @@ var xxx_messageInfo_PromotionTaskList proto.InternalMessageInfo func (m *PromotionTaskReference) Reset() { *m = PromotionTaskReference{} } func (*PromotionTaskReference) ProtoMessage() {} func (*PromotionTaskReference) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{48} + return fileDescriptor_e26b7f7bbc391025, []int{49} } func (m *PromotionTaskReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1405,7 +1433,7 @@ var xxx_messageInfo_PromotionTaskReference proto.InternalMessageInfo func (m *PromotionTaskSpec) Reset() { *m = PromotionTaskSpec{} } func (*PromotionTaskSpec) ProtoMessage() {} func (*PromotionTaskSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{49} + return fileDescriptor_e26b7f7bbc391025, []int{50} } func (m *PromotionTaskSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1433,7 +1461,7 @@ var xxx_messageInfo_PromotionTaskSpec proto.InternalMessageInfo func (m *PromotionTemplate) Reset() { *m = PromotionTemplate{} } func (*PromotionTemplate) ProtoMessage() {} func (*PromotionTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{50} + return fileDescriptor_e26b7f7bbc391025, []int{51} } func (m *PromotionTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1461,7 +1489,7 @@ var xxx_messageInfo_PromotionTemplate proto.InternalMessageInfo func (m *PromotionTemplateSpec) Reset() { *m = PromotionTemplateSpec{} } func (*PromotionTemplateSpec) ProtoMessage() {} func (*PromotionTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{51} + return fileDescriptor_e26b7f7bbc391025, []int{52} } func (m *PromotionTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1489,7 +1517,7 @@ var xxx_messageInfo_PromotionTemplateSpec proto.InternalMessageInfo func (m *PromotionVariable) Reset() { *m = PromotionVariable{} } func (*PromotionVariable) ProtoMessage() {} func (*PromotionVariable) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{52} + return fileDescriptor_e26b7f7bbc391025, []int{53} } func (m *PromotionVariable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1517,7 +1545,7 @@ var xxx_messageInfo_PromotionVariable proto.InternalMessageInfo func (m *RepoSubscription) Reset() { *m = RepoSubscription{} } func (*RepoSubscription) ProtoMessage() {} func (*RepoSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{53} + return fileDescriptor_e26b7f7bbc391025, []int{54} } func (m *RepoSubscription) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1545,7 +1573,7 @@ var xxx_messageInfo_RepoSubscription proto.InternalMessageInfo func (m *Stage) Reset() { *m = Stage{} } func (*Stage) ProtoMessage() {} func (*Stage) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{54} + return fileDescriptor_e26b7f7bbc391025, []int{55} } func (m *Stage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1573,7 +1601,7 @@ var xxx_messageInfo_Stage proto.InternalMessageInfo func (m *StageList) Reset() { *m = StageList{} } func (*StageList) ProtoMessage() {} func (*StageList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{55} + return fileDescriptor_e26b7f7bbc391025, []int{56} } func (m *StageList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1601,7 +1629,7 @@ var xxx_messageInfo_StageList proto.InternalMessageInfo func (m *StageSpec) Reset() { *m = StageSpec{} } func (*StageSpec) ProtoMessage() {} func (*StageSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{56} + return fileDescriptor_e26b7f7bbc391025, []int{57} } func (m *StageSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1629,7 +1657,7 @@ var xxx_messageInfo_StageSpec proto.InternalMessageInfo func (m *StageStatus) Reset() { *m = StageStatus{} } func (*StageStatus) ProtoMessage() {} func (*StageStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{57} + return fileDescriptor_e26b7f7bbc391025, []int{58} } func (m *StageStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1657,7 +1685,7 @@ var xxx_messageInfo_StageStatus proto.InternalMessageInfo func (m *StepExecutionMetadata) Reset() { *m = StepExecutionMetadata{} } func (*StepExecutionMetadata) ProtoMessage() {} func (*StepExecutionMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{58} + return fileDescriptor_e26b7f7bbc391025, []int{59} } func (m *StepExecutionMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1685,7 +1713,7 @@ var xxx_messageInfo_StepExecutionMetadata proto.InternalMessageInfo func (m *Verification) Reset() { *m = Verification{} } func (*Verification) ProtoMessage() {} func (*Verification) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{59} + return fileDescriptor_e26b7f7bbc391025, []int{60} } func (m *Verification) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1713,7 +1741,7 @@ var xxx_messageInfo_Verification proto.InternalMessageInfo func (m *VerificationInfo) Reset() { *m = VerificationInfo{} } func (*VerificationInfo) ProtoMessage() {} func (*VerificationInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{60} + return fileDescriptor_e26b7f7bbc391025, []int{61} } func (m *VerificationInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1741,7 +1769,7 @@ var xxx_messageInfo_VerificationInfo proto.InternalMessageInfo func (m *VerifiedStage) Reset() { *m = VerifiedStage{} } func (*VerifiedStage) ProtoMessage() {} func (*VerifiedStage) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{61} + return fileDescriptor_e26b7f7bbc391025, []int{62} } func (m *VerifiedStage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1769,7 +1797,7 @@ var xxx_messageInfo_VerifiedStage proto.InternalMessageInfo func (m *Warehouse) Reset() { *m = Warehouse{} } func (*Warehouse) ProtoMessage() {} func (*Warehouse) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{62} + return fileDescriptor_e26b7f7bbc391025, []int{63} } func (m *Warehouse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1797,7 +1825,7 @@ var xxx_messageInfo_Warehouse proto.InternalMessageInfo func (m *WarehouseList) Reset() { *m = WarehouseList{} } func (*WarehouseList) ProtoMessage() {} func (*WarehouseList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{63} + return fileDescriptor_e26b7f7bbc391025, []int{64} } func (m *WarehouseList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1825,7 +1853,7 @@ var xxx_messageInfo_WarehouseList proto.InternalMessageInfo func (m *WarehouseSpec) Reset() { *m = WarehouseSpec{} } func (*WarehouseSpec) ProtoMessage() {} func (*WarehouseSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{64} + return fileDescriptor_e26b7f7bbc391025, []int{65} } func (m *WarehouseSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1853,7 +1881,7 @@ var xxx_messageInfo_WarehouseSpec proto.InternalMessageInfo func (m *WarehouseStatus) Reset() { *m = WarehouseStatus{} } func (*WarehouseStatus) ProtoMessage() {} func (*WarehouseStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{65} + return fileDescriptor_e26b7f7bbc391025, []int{66} } func (m *WarehouseStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1929,7 +1957,7 @@ func init() { proto.RegisterType((*PromotionSpec)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionSpec") proto.RegisterType((*PromotionStatus)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStatus") proto.RegisterType((*PromotionStep)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStep") - proto.RegisterMapType((map[string]string)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStep.InputsEntry") + proto.RegisterType((*PromotionStepInput)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStepInput") proto.RegisterType((*PromotionStepRetry)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStepRetry") proto.RegisterType((*PromotionTask)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTask") proto.RegisterType((*PromotionTaskInput)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTaskInput") @@ -1959,266 +1987,266 @@ func init() { } var fileDescriptor_e26b7f7bbc391025 = []byte{ - // 4140 bytes of a gzipped FileDescriptorProto + // 4133 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0xcd, 0x6f, 0x23, 0x47, - 0x76, 0x9f, 0x26, 0x45, 0x4a, 0x7c, 0x94, 0x46, 0x52, 0x8d, 0xc6, 0xe6, 0x6a, 0x63, 0x69, 0xd2, - 0x36, 0x0c, 0x3b, 0xb6, 0xa9, 0x8c, 0xec, 0xb1, 0x67, 0xc6, 0x9b, 0x59, 0x88, 0xd4, 0x7c, 0x68, - 0x56, 0xeb, 0x51, 0x8a, 0xf2, 0x78, 0x3d, 0x1e, 0xc3, 0x5b, 0x22, 0x4b, 0x64, 0xaf, 0xc8, 0x6e, - 0xba, 0xbb, 0xa8, 0xb5, 0x92, 0x20, 0xd9, 0x7c, 0x01, 0x8b, 0x7c, 0x61, 0x0f, 0x06, 0xbc, 0x01, - 0x12, 0x20, 0x48, 0x8e, 0x8b, 0xe4, 0x1f, 0xc8, 0xc1, 0x87, 0x5c, 0x8c, 0xc0, 0x48, 0x8c, 0x24, - 0x40, 0x7c, 0xd8, 0x28, 0xb1, 0x0c, 0xe4, 0x98, 0x5b, 0x2e, 0x03, 0x04, 0x08, 0xea, 0xa3, 0xbb, - 0xab, 0x3f, 0x38, 0x62, 0x73, 0xa4, 0xc1, 0x24, 0x37, 0xa9, 0x5e, 0xbd, 0xdf, 0xab, 0x7a, 0x55, - 0xf5, 0xea, 0xbd, 0x57, 0xaf, 0x09, 0xaf, 0xb5, 0x2d, 0xd6, 0x19, 0xec, 0x54, 0x9b, 0x4e, 0x6f, - 0x85, 0xec, 0x0d, 0x2c, 0x76, 0xb0, 0xb2, 0x47, 0xdc, 0xb6, 0xb3, 0x42, 0xfa, 0xd6, 0xca, 0xfe, - 0x45, 0xd2, 0xed, 0x77, 0xc8, 0xc5, 0x95, 0x36, 0xb5, 0xa9, 0x4b, 0x18, 0x6d, 0x55, 0xfb, 0xae, - 0xc3, 0x1c, 0xf4, 0x5c, 0xc8, 0x55, 0x95, 0x5c, 0x55, 0xc1, 0x55, 0x25, 0x7d, 0xab, 0xea, 0x73, - 0x2d, 0xbe, 0xa2, 0x61, 0xb7, 0x9d, 0xb6, 0xb3, 0x22, 0x98, 0x77, 0x06, 0xbb, 0xe2, 0x3f, 0xf1, - 0x8f, 0xf8, 0x4b, 0x82, 0x2e, 0xde, 0xda, 0xbb, 0xec, 0x55, 0x2d, 0x21, 0x99, 0x7e, 0xc4, 0xa8, - 0xed, 0x59, 0x8e, 0xed, 0xbd, 0x42, 0xfa, 0x96, 0x47, 0xdd, 0x7d, 0xea, 0xae, 0xf4, 0xf7, 0xda, - 0x9c, 0xe6, 0x45, 0x3b, 0xac, 0xec, 0x27, 0x86, 0xb7, 0xf8, 0x5a, 0x88, 0xd4, 0x23, 0xcd, 0x8e, - 0x65, 0x53, 0xf7, 0x20, 0x64, 0xef, 0x51, 0x46, 0xd2, 0xb8, 0x56, 0x86, 0x71, 0xb9, 0x03, 0x9b, - 0x59, 0x3d, 0x9a, 0x60, 0x78, 0xfd, 0x38, 0x06, 0xaf, 0xd9, 0xa1, 0x3d, 0x12, 0xe7, 0x33, 0xef, - 0xc3, 0xb9, 0x35, 0x9b, 0x74, 0x0f, 0x3c, 0xcb, 0xc3, 0x03, 0x7b, 0xcd, 0x6d, 0x0f, 0x7a, 0xd4, - 0x66, 0xe8, 0x02, 0x4c, 0xd8, 0xa4, 0x47, 0x2b, 0xc6, 0x05, 0xe3, 0x85, 0x52, 0x6d, 0xfa, 0xb3, - 0xc3, 0xe5, 0x33, 0x47, 0x87, 0xcb, 0x13, 0x6f, 0x91, 0x1e, 0xc5, 0x82, 0x82, 0x9e, 0x85, 0xc2, - 0x3e, 0xe9, 0x0e, 0x68, 0x25, 0x27, 0xba, 0xcc, 0xa8, 0x2e, 0x85, 0xbb, 0xbc, 0x11, 0x4b, 0x9a, - 0xf9, 0xbb, 0xf9, 0x08, 0xfc, 0x77, 0x29, 0x23, 0x2d, 0xc2, 0x08, 0xea, 0x41, 0xb1, 0x4b, 0x76, - 0x68, 0xd7, 0xab, 0x18, 0x17, 0xf2, 0x2f, 0x94, 0x57, 0xaf, 0x57, 0x47, 0x59, 0xc4, 0x6a, 0x0a, - 0x54, 0x75, 0x53, 0xe0, 0x5c, 0xb7, 0x99, 0x7b, 0x50, 0x3b, 0xab, 0x06, 0x51, 0x94, 0x8d, 0x58, - 0x09, 0x41, 0xbf, 0x6d, 0x40, 0x99, 0xd8, 0xb6, 0xc3, 0x08, 0xe3, 0xcb, 0x54, 0xc9, 0x09, 0xa1, - 0xb7, 0xc7, 0x17, 0xba, 0x16, 0x82, 0x49, 0xc9, 0xe7, 0x94, 0xe4, 0xb2, 0x46, 0xc1, 0xba, 0xcc, - 0xc5, 0x2b, 0x50, 0xd6, 0x86, 0x8a, 0xe6, 0x20, 0xbf, 0x47, 0x0f, 0xa4, 0x7e, 0x31, 0xff, 0x13, - 0x2d, 0x44, 0x14, 0xaa, 0x34, 0x78, 0x35, 0x77, 0xd9, 0x58, 0xbc, 0x06, 0x73, 0x71, 0x81, 0x59, - 0xf8, 0xcd, 0x3f, 0x31, 0x60, 0x41, 0x9b, 0x05, 0xa6, 0xbb, 0xd4, 0xa5, 0x76, 0x93, 0xa2, 0x15, - 0x28, 0xf1, 0xb5, 0xf4, 0xfa, 0xa4, 0xe9, 0x2f, 0xf5, 0xbc, 0x9a, 0x48, 0xe9, 0x2d, 0x9f, 0x80, - 0xc3, 0x3e, 0xc1, 0xb6, 0xc8, 0x3d, 0x6c, 0x5b, 0xf4, 0x3b, 0xc4, 0xa3, 0x95, 0x7c, 0x74, 0x5b, - 0x6c, 0xf1, 0x46, 0x2c, 0x69, 0xe6, 0xaf, 0xc0, 0x37, 0xfc, 0xf1, 0x6c, 0xd3, 0x5e, 0xbf, 0x4b, - 0x18, 0x0d, 0x07, 0x75, 0xec, 0xd6, 0x33, 0xf7, 0x60, 0x66, 0xad, 0xdf, 0x77, 0x9d, 0x7d, 0xda, - 0x6a, 0x30, 0xd2, 0xa6, 0xe8, 0x1e, 0x00, 0x51, 0x0d, 0x6b, 0x4c, 0x30, 0x96, 0x57, 0x7f, 0xa9, - 0x2a, 0x4f, 0x44, 0x55, 0x3f, 0x11, 0xd5, 0xfe, 0x5e, 0x9b, 0x37, 0x78, 0x55, 0x7e, 0xf0, 0xaa, - 0xfb, 0x17, 0xab, 0xdb, 0x56, 0x8f, 0xd6, 0xce, 0x1e, 0x1d, 0x2e, 0xc3, 0x5a, 0x80, 0x80, 0x35, - 0x34, 0xf3, 0x77, 0x0c, 0x38, 0xbf, 0xe6, 0xb6, 0x9d, 0xfa, 0xfa, 0x5a, 0xbf, 0x7f, 0x8b, 0x92, - 0x2e, 0xeb, 0x34, 0x18, 0x61, 0x03, 0x0f, 0x5d, 0x83, 0xa2, 0x27, 0xfe, 0x52, 0x43, 0x7d, 0xde, - 0xdf, 0x7d, 0x92, 0xfe, 0xe0, 0x70, 0x79, 0x21, 0x85, 0x91, 0x62, 0xc5, 0x85, 0x5e, 0x84, 0xc9, - 0x1e, 0xf5, 0x3c, 0xd2, 0xf6, 0xf5, 0x39, 0xab, 0x00, 0x26, 0xbf, 0x2b, 0x9b, 0xb1, 0x4f, 0x37, - 0xff, 0x3e, 0x07, 0xb3, 0x01, 0x96, 0x12, 0x7f, 0x0a, 0x8b, 0x37, 0x80, 0xe9, 0x8e, 0x36, 0x43, - 0xb1, 0x86, 0xe5, 0xd5, 0x37, 0x47, 0x3c, 0x27, 0x69, 0x4a, 0xaa, 0x2d, 0x28, 0x31, 0xd3, 0x7a, - 0x2b, 0x8e, 0x88, 0x41, 0x3d, 0x00, 0xef, 0xc0, 0x6e, 0x2a, 0xa1, 0x13, 0x42, 0xe8, 0x95, 0x8c, - 0x42, 0x1b, 0x01, 0x40, 0x0d, 0x29, 0x91, 0x10, 0xb6, 0x61, 0x4d, 0x80, 0xf9, 0x37, 0x06, 0x9c, - 0x4b, 0xe1, 0x43, 0xdf, 0x8a, 0xad, 0xe7, 0x73, 0x89, 0xf5, 0x44, 0x09, 0xb6, 0x70, 0x35, 0x5f, - 0x86, 0x29, 0x97, 0xee, 0x5b, 0xfc, 0x1e, 0x50, 0x1a, 0x9e, 0x53, 0xfc, 0x53, 0x58, 0xb5, 0xe3, - 0xa0, 0x07, 0x7a, 0x09, 0x4a, 0xfe, 0xdf, 0x5c, 0xcd, 0x79, 0x7e, 0x54, 0xf8, 0xc2, 0xf9, 0x5d, - 0x3d, 0x1c, 0xd2, 0xcd, 0xdf, 0x82, 0x42, 0xbd, 0x43, 0x5c, 0xc6, 0x77, 0x8c, 0x4b, 0xfb, 0xce, - 0xdb, 0x78, 0x53, 0x0d, 0x31, 0xd8, 0x31, 0x58, 0x36, 0x63, 0x9f, 0x3e, 0xc2, 0x62, 0xbf, 0x08, - 0x93, 0xfb, 0xd4, 0x15, 0xe3, 0xcd, 0x47, 0xc1, 0xee, 0xca, 0x66, 0xec, 0xd3, 0xcd, 0x7f, 0x36, - 0x60, 0x41, 0x8c, 0x60, 0xdd, 0xf2, 0x9a, 0xce, 0x3e, 0x75, 0x0f, 0x30, 0xf5, 0x06, 0xdd, 0x13, - 0x1e, 0xd0, 0x3a, 0xcc, 0x79, 0xb4, 0xb7, 0x4f, 0xdd, 0xba, 0x63, 0x7b, 0xcc, 0x25, 0x96, 0xcd, - 0xd4, 0xc8, 0x2a, 0xaa, 0xf7, 0x5c, 0x23, 0x46, 0xc7, 0x09, 0x0e, 0xf4, 0x02, 0x4c, 0xa9, 0x61, - 0xf3, 0xad, 0xc4, 0x15, 0x3b, 0xcd, 0xd7, 0x40, 0xcd, 0xc9, 0xc3, 0x01, 0xd5, 0xfc, 0x4f, 0x03, - 0xe6, 0xc5, 0xac, 0x1a, 0x83, 0x1d, 0xaf, 0xe9, 0x5a, 0x7d, 0x6e, 0x5e, 0x9f, 0xc4, 0x29, 0x5d, - 0x83, 0xb3, 0x2d, 0x5f, 0xf1, 0x9b, 0x56, 0xcf, 0x62, 0xe2, 0x8c, 0x14, 0x6a, 0x4f, 0x29, 0x8c, - 0xb3, 0xeb, 0x11, 0x2a, 0x8e, 0xf5, 0x96, 0xcb, 0xd7, 0x1d, 0x78, 0x8c, 0xba, 0x5b, 0xae, 0xd3, - 0x73, 0xf8, 0x3c, 0xb7, 0x89, 0xb7, 0x87, 0xbe, 0x0f, 0x53, 0x3d, 0x75, 0xa5, 0x29, 0xab, 0xf9, - 0xcb, 0xa3, 0x59, 0xcd, 0x3b, 0x3b, 0x3f, 0xa0, 0x4d, 0xc6, 0xaf, 0xc3, 0xf0, 0xb4, 0x85, 0x6d, - 0x38, 0x40, 0x45, 0xef, 0xc2, 0x84, 0xd7, 0xa7, 0x4d, 0xa1, 0xa2, 0xf2, 0xea, 0x1b, 0xa3, 0x1d, - 0xea, 0xc8, 0x20, 0x1b, 0x7d, 0xda, 0x0c, 0x75, 0xcb, 0xff, 0xc3, 0x02, 0xd2, 0xfc, 0x37, 0x03, - 0x2a, 0x69, 0xb3, 0xda, 0xb4, 0x3c, 0x86, 0xee, 0x27, 0x66, 0x56, 0x1d, 0x6d, 0x66, 0x9c, 0x5b, - 0xcc, 0x2b, 0x38, 0xbd, 0x7e, 0x8b, 0x36, 0xab, 0x26, 0x14, 0x2c, 0x46, 0x7b, 0xbe, 0x23, 0x71, - 0x6d, 0xb4, 0x69, 0x0d, 0x1b, 0x6c, 0x78, 0x49, 0x6e, 0x70, 0x50, 0x2c, 0xb1, 0xcd, 0xf7, 0x60, - 0xba, 0x3e, 0x70, 0x5d, 0x6a, 0x33, 0x79, 0xc9, 0x7d, 0x07, 0x0a, 0x9e, 0x65, 0x2b, 0x5b, 0x9f, - 0xed, 0x7e, 0x2b, 0x71, 0xf0, 0x06, 0x67, 0xc6, 0x12, 0xc3, 0xfc, 0xb3, 0x3c, 0x9c, 0xf3, 0x77, - 0x0d, 0x6d, 0xad, 0xb9, 0xcc, 0xda, 0x25, 0x4d, 0xe6, 0xa1, 0x16, 0x4c, 0xb7, 0xc2, 0x66, 0xa6, - 0x8c, 0x71, 0x16, 0x59, 0x81, 0xc1, 0xd7, 0xe0, 0x19, 0x8e, 0xa0, 0xa2, 0x77, 0x20, 0xdf, 0xb6, - 0x98, 0xf2, 0xfd, 0x2e, 0x8f, 0xa6, 0xbd, 0x9b, 0x56, 0xdc, 0xfa, 0xd4, 0xca, 0x4a, 0x54, 0xfe, - 0xa6, 0xc5, 0x30, 0x47, 0x44, 0x3b, 0x50, 0xb4, 0x7a, 0xa4, 0x4d, 0xfd, 0x95, 0xb9, 0x3a, 0x1a, - 0xf6, 0x06, 0xe7, 0x89, 0xa3, 0x07, 0xce, 0xa4, 0xa0, 0x7a, 0x58, 0x21, 0x73, 0x19, 0x4d, 0x6e, - 0x35, 0xa4, 0xdd, 0x1e, 0x59, 0x46, 0x9a, 0xfd, 0x0c, 0x65, 0x08, 0xaa, 0x87, 0x15, 0xb2, 0xf9, - 0x65, 0x0e, 0xe6, 0x42, 0xfd, 0xd5, 0x9d, 0x5e, 0xcf, 0x62, 0x68, 0x11, 0x72, 0x56, 0x4b, 0x19, - 0x25, 0x50, 0x8c, 0xb9, 0x8d, 0x75, 0x9c, 0xb3, 0x5a, 0xe8, 0x79, 0x28, 0xee, 0xb8, 0xc4, 0x6e, - 0x76, 0x94, 0x31, 0x0a, 0x80, 0x6b, 0xa2, 0x15, 0x2b, 0x2a, 0x7a, 0x06, 0xf2, 0x8c, 0xb4, 0x95, - 0x0d, 0x0a, 0xf4, 0xb7, 0x4d, 0xda, 0x98, 0xb7, 0x73, 0xe3, 0xe7, 0x0d, 0xc4, 0x39, 0x16, 0x2b, - 0xaf, 0x19, 0xbf, 0x86, 0x6c, 0xc6, 0x3e, 0x9d, 0x4b, 0x24, 0x03, 0xd6, 0x71, 0xdc, 0x4a, 0x21, - 0x2a, 0x71, 0x4d, 0xb4, 0x62, 0x45, 0xe5, 0x6e, 0x4a, 0x53, 0x8c, 0x9f, 0x51, 0xb7, 0x52, 0x8c, - 0xba, 0x29, 0x75, 0x9f, 0x80, 0xc3, 0x3e, 0xe8, 0x7d, 0x28, 0x37, 0x5d, 0x4a, 0x98, 0xe3, 0xae, - 0x13, 0x46, 0x2b, 0x93, 0x99, 0x77, 0xe0, 0x2c, 0xf7, 0xc3, 0xeb, 0x21, 0x04, 0xd6, 0xf1, 0xcc, - 0xff, 0x32, 0xa0, 0x12, 0xaa, 0x56, 0xac, 0x6d, 0xe8, 0x7b, 0x2a, 0xf5, 0x18, 0x43, 0xd4, 0xf3, - 0x3c, 0x14, 0x5b, 0x56, 0x9b, 0x7a, 0x2c, 0xae, 0xe5, 0x75, 0xd1, 0x8a, 0x15, 0x15, 0xad, 0x02, - 0xb4, 0x2d, 0xa6, 0xee, 0x0b, 0xa5, 0xec, 0xc0, 0x4e, 0xde, 0x0c, 0x28, 0x58, 0xeb, 0x85, 0xde, - 0x81, 0x92, 0x18, 0xe6, 0x98, 0xc7, 0x4e, 0x78, 0x0f, 0x75, 0x1f, 0x00, 0x87, 0x58, 0xe6, 0x17, - 0x13, 0x30, 0x79, 0xc3, 0xa5, 0x56, 0xbb, 0xc3, 0x1e, 0x83, 0xc1, 0x7f, 0x16, 0x0a, 0xa4, 0x6b, - 0x11, 0x4f, 0xac, 0x9b, 0xe6, 0xff, 0xaf, 0xf1, 0x46, 0x2c, 0x69, 0xe8, 0x3d, 0x28, 0x3a, 0xae, - 0xd5, 0xb6, 0xec, 0x4a, 0x49, 0x0c, 0xe2, 0xd5, 0xd1, 0x8e, 0x90, 0x9a, 0xc5, 0x1d, 0xc1, 0x1a, - 0x2a, 0x5f, 0xfe, 0x8f, 0x15, 0x24, 0xba, 0x07, 0x93, 0x72, 0x33, 0xf9, 0x07, 0x74, 0x65, 0x64, - 0x03, 0x23, 0xf7, 0x63, 0xb8, 0xe9, 0xe5, 0xff, 0x1e, 0xf6, 0x01, 0x51, 0x23, 0xb0, 0x2f, 0x13, - 0x02, 0xfa, 0xa5, 0x0c, 0xf6, 0x65, 0xa8, 0x41, 0x69, 0x04, 0x06, 0xa5, 0x90, 0x05, 0x54, 0x98, - 0x8c, 0x61, 0x16, 0x84, 0xab, 0x58, 0x39, 0xb3, 0xc5, 0x31, 0x54, 0xac, 0x3c, 0xe9, 0xb3, 0x51, - 0x0f, 0xd8, 0xf7, 0x75, 0xcd, 0x8f, 0xf3, 0x30, 0xaf, 0x7a, 0xd6, 0x9d, 0x6e, 0x97, 0x36, 0x85, - 0xe7, 0x24, 0xed, 0x53, 0x3e, 0xd5, 0x3e, 0x59, 0xfe, 0x8d, 0x29, 0x6d, 0x7e, 0x2d, 0xd3, 0x68, - 0x42, 0x19, 0x55, 0x71, 0x43, 0xca, 0x90, 0x3b, 0x58, 0x25, 0xd5, 0x4b, 0xdd, 0x9b, 0xe8, 0xf7, - 0x0d, 0x38, 0xb7, 0x4f, 0x5d, 0x6b, 0xd7, 0x6a, 0x8a, 0x80, 0xf9, 0x96, 0xe5, 0x31, 0xc7, 0x3d, - 0x50, 0x37, 0xc2, 0xeb, 0xa3, 0x49, 0xbe, 0xab, 0x01, 0x6c, 0xd8, 0xbb, 0x4e, 0xed, 0x9b, 0x4a, - 0xda, 0xb9, 0xbb, 0x49, 0x68, 0x9c, 0x26, 0x6f, 0xb1, 0x0f, 0x10, 0x8e, 0x36, 0x25, 0x5e, 0xdf, - 0xd4, 0xe3, 0xf5, 0x91, 0x07, 0xe6, 0x4f, 0xd6, 0x37, 0x59, 0x7a, 0x9c, 0xff, 0xa9, 0x01, 0x65, - 0x45, 0x7f, 0x0c, 0x4e, 0x10, 0x8e, 0x3a, 0x41, 0xaf, 0x64, 0x1a, 0xff, 0x10, 0x9f, 0xc7, 0x85, - 0x99, 0xc8, 0x21, 0x47, 0x97, 0x60, 0x62, 0xcf, 0xb2, 0xfd, 0x5b, 0xef, 0x17, 0x7d, 0x37, 0xf0, - 0x3b, 0x96, 0xdd, 0x7a, 0x70, 0xb8, 0x3c, 0x1f, 0xe9, 0xcc, 0x1b, 0xb1, 0xe8, 0x7e, 0xbc, 0x67, - 0x7e, 0x75, 0xea, 0xa7, 0x7f, 0xb1, 0x7c, 0xe6, 0x47, 0x3f, 0xbf, 0x70, 0xc6, 0xfc, 0x24, 0x0f, - 0x73, 0x71, 0xad, 0x8e, 0x90, 0xff, 0x0a, 0x6d, 0xd8, 0xd4, 0xa9, 0xda, 0xb0, 0xdc, 0xe9, 0xd9, - 0xb0, 0xfc, 0x69, 0xd8, 0xb0, 0x89, 0x13, 0xb3, 0x61, 0xe6, 0x3f, 0x18, 0x70, 0x36, 0x58, 0x99, - 0x0f, 0x07, 0xfc, 0x66, 0x0d, 0xb5, 0x6e, 0x9c, 0xbc, 0xd6, 0x3f, 0x80, 0x49, 0xcf, 0x19, 0xb8, - 0x4d, 0xe1, 0x3e, 0x72, 0xf4, 0xd7, 0xb2, 0x19, 0x4d, 0xc9, 0xab, 0xf9, 0x4c, 0xb2, 0x01, 0xfb, - 0xa8, 0xfa, 0x84, 0x14, 0x4d, 0xba, 0x14, 0x2e, 0x77, 0xb8, 0xf8, 0x84, 0xa6, 0x74, 0x97, 0x82, - 0xb7, 0x62, 0x45, 0x45, 0xa6, 0xb0, 0xe7, 0xbe, 0x67, 0x5b, 0xaa, 0x81, 0x32, 0xcb, 0x62, 0x11, - 0x24, 0x05, 0xf5, 0x61, 0xce, 0xa5, 0x1f, 0x0e, 0x2c, 0x97, 0xb6, 0x1a, 0x0e, 0xd9, 0xe3, 0x7e, - 0x81, 0x4a, 0xe1, 0x8c, 0x78, 0xee, 0xd7, 0x07, 0xae, 0x30, 0x61, 0xb5, 0x05, 0x1e, 0x99, 0xe2, - 0x18, 0x16, 0x4e, 0xa0, 0x9b, 0xff, 0x5e, 0x08, 0x0e, 0xac, 0x4a, 0xa2, 0xfc, 0x3a, 0x94, 0x9b, - 0x32, 0x6a, 0xe9, 0x1e, 0x6c, 0xd8, 0x6a, 0x8b, 0xad, 0x8f, 0x71, 0xf9, 0x54, 0xeb, 0x21, 0x4c, - 0x2c, 0xc7, 0xaa, 0x51, 0xb0, 0x2e, 0x0d, 0xfd, 0x10, 0x40, 0x5a, 0x62, 0xda, 0xda, 0xb0, 0xd5, - 0x55, 0x53, 0x1f, 0x47, 0xf6, 0xdd, 0x00, 0x45, 0x8a, 0x0e, 0x7c, 0x9e, 0x90, 0x80, 0x35, 0x51, - 0x7c, 0xd6, 0x7e, 0xca, 0xf0, 0x86, 0xe3, 0xaa, 0x33, 0x3b, 0xd6, 0xac, 0xd7, 0x42, 0x98, 0x78, - 0x66, 0x39, 0xa4, 0x60, 0x5d, 0xda, 0xa2, 0x0b, 0x73, 0x71, 0x5d, 0xa5, 0x5c, 0x37, 0xb7, 0xa2, - 0xd7, 0xcd, 0xea, 0x88, 0x07, 0x54, 0x8b, 0x40, 0xf5, 0x94, 0xb4, 0x0b, 0xb3, 0x31, 0x1d, 0xa5, - 0x88, 0xdc, 0x88, 0x8a, 0x7c, 0x35, 0xcb, 0xd5, 0xab, 0x52, 0xbb, 0xba, 0x4c, 0x0f, 0xe6, 0xe2, - 0xda, 0x39, 0x31, 0xa1, 0x91, 0x7c, 0xb2, 0x7e, 0xa7, 0xfe, 0x79, 0x0e, 0x4a, 0x81, 0x55, 0xcd, - 0x92, 0x1c, 0x92, 0xde, 0x50, 0xee, 0x98, 0x68, 0x2d, 0x3f, 0x4a, 0xb4, 0x36, 0x31, 0x3c, 0x5a, - 0xf3, 0x13, 0xc8, 0xc5, 0x87, 0x27, 0x90, 0xb5, 0x68, 0x6d, 0x72, 0xf4, 0x68, 0x6d, 0xea, 0xf8, - 0x68, 0xcd, 0xfc, 0x4b, 0x03, 0x50, 0x32, 0x34, 0xcf, 0xa2, 0x28, 0x12, 0xbf, 0xeb, 0x46, 0xf4, - 0x84, 0xe2, 0xf1, 0xf1, 0xf0, 0x2b, 0xcf, 0xfc, 0xb4, 0x00, 0xb3, 0x37, 0xad, 0xb1, 0xf3, 0x7c, - 0x0c, 0x9e, 0x96, 0x48, 0x0d, 0xaa, 0xfc, 0xd0, 0x06, 0x73, 0x09, 0xa3, 0xed, 0x03, 0xb5, 0xbe, - 0x57, 0x15, 0xeb, 0xd3, 0xf5, 0xf4, 0x6e, 0x0f, 0x86, 0x93, 0xf0, 0x30, 0xe8, 0x91, 0x37, 0xc9, - 0x9b, 0x30, 0xe3, 0x31, 0xd7, 0x6a, 0x32, 0x99, 0x49, 0xf4, 0x2a, 0x65, 0x71, 0x91, 0x9c, 0x57, - 0xdd, 0x67, 0x1a, 0x3a, 0x11, 0x47, 0xfb, 0xa6, 0x26, 0x28, 0x27, 0x32, 0x27, 0x28, 0x57, 0xa0, - 0x44, 0xba, 0x5d, 0xe7, 0x87, 0xdb, 0xa4, 0xed, 0xa9, 0x74, 0x40, 0xb0, 0x6b, 0xd6, 0x7c, 0x02, - 0x0e, 0xfb, 0xa0, 0x2a, 0x80, 0xd5, 0xb6, 0x1d, 0x97, 0x0a, 0x8e, 0xa2, 0xb8, 0xd1, 0xc4, 0x23, - 0xcc, 0x46, 0xd0, 0x8a, 0xb5, 0x1e, 0xa8, 0x01, 0xe7, 0x2d, 0xdb, 0xa3, 0xcd, 0x81, 0x4b, 0x1b, - 0x7b, 0x56, 0x7f, 0x7b, 0xb3, 0x21, 0xac, 0xc4, 0x81, 0xd8, 0xcd, 0x53, 0xb5, 0x67, 0x94, 0xb0, - 0xf3, 0x1b, 0x69, 0x9d, 0x70, 0x3a, 0x2f, 0x7a, 0x0d, 0xa6, 0x2d, 0xbb, 0xd9, 0x1d, 0xb4, 0xe8, - 0x16, 0x61, 0x1d, 0xaf, 0x32, 0x25, 0x86, 0x31, 0x77, 0x74, 0xb8, 0x3c, 0xbd, 0xa1, 0xb5, 0xe3, - 0x48, 0x2f, 0xce, 0x45, 0x3f, 0xd2, 0xb8, 0x4a, 0x21, 0xd7, 0xf5, 0x8f, 0x74, 0x2e, 0xbd, 0x57, - 0x4a, 0x0a, 0x17, 0x32, 0xa5, 0x70, 0x7f, 0x96, 0x83, 0xa2, 0x7c, 0x41, 0x41, 0x97, 0x62, 0xcf, - 0x14, 0xcf, 0x24, 0x9e, 0x29, 0xca, 0x69, 0xaf, 0x4d, 0x26, 0x14, 0x2d, 0xcf, 0x1b, 0x44, 0x1d, - 0x88, 0x0d, 0xd1, 0x82, 0x15, 0x45, 0xa4, 0xb6, 0x1c, 0x7b, 0xd7, 0x6a, 0xab, 0x04, 0xc4, 0x35, - 0xcd, 0x6d, 0x08, 0x5f, 0xb9, 0x3f, 0x08, 0x9e, 0xc1, 0x43, 0x0f, 0x22, 0xd2, 0x81, 0xbb, 0x12, - 0xb7, 0x1b, 0x77, 0xde, 0x92, 0x32, 0xea, 0x02, 0x11, 0x2b, 0x64, 0x2e, 0xc3, 0x19, 0xb0, 0xfe, - 0x80, 0x89, 0x8d, 0x72, 0x42, 0x32, 0xee, 0x08, 0x44, 0xac, 0x90, 0xcd, 0x4f, 0x0c, 0x98, 0x95, - 0x3a, 0xa8, 0x77, 0x68, 0x73, 0xaf, 0xc1, 0x68, 0x9f, 0x7b, 0xf4, 0x03, 0x8f, 0x7a, 0x71, 0x8f, - 0xfe, 0x6d, 0x8f, 0x7a, 0x58, 0x50, 0xb4, 0xd9, 0xe7, 0x4e, 0x6b, 0xf6, 0xe6, 0x5f, 0x1b, 0x50, - 0x10, 0xae, 0x73, 0x16, 0xfb, 0x13, 0x4d, 0x27, 0xe5, 0x46, 0x4a, 0x27, 0x1d, 0x93, 0xe8, 0x0b, - 0x33, 0x59, 0x13, 0x0f, 0xcb, 0x64, 0x99, 0x5f, 0x1b, 0xb0, 0x90, 0x96, 0x1d, 0xcd, 0x32, 0xfc, - 0x97, 0x61, 0xaa, 0xdf, 0x25, 0x6c, 0xd7, 0x71, 0x7b, 0xf1, 0x97, 0xb1, 0x2d, 0xd5, 0x8e, 0x83, - 0x1e, 0xc8, 0x05, 0x70, 0xfd, 0x30, 0xcc, 0x0f, 0x51, 0xae, 0x65, 0xbd, 0x11, 0xa2, 0x69, 0xbd, - 0x50, 0x59, 0x41, 0x93, 0x87, 0x35, 0x29, 0xe6, 0x1f, 0x16, 0x60, 0x5e, 0xb0, 0x8c, 0x7b, 0x43, - 0x8c, 0xb3, 0x42, 0x7d, 0x78, 0x4a, 0x04, 0x4f, 0xc9, 0x4b, 0x45, 0x2e, 0xda, 0x65, 0xc5, 0xff, - 0xd4, 0x46, 0x6a, 0xaf, 0x07, 0x43, 0x29, 0x78, 0x08, 0x6e, 0xf2, 0xa6, 0x80, 0xff, 0x7f, 0x37, - 0x85, 0xbe, 0xd9, 0x26, 0x8f, 0xdd, 0x6c, 0x43, 0xef, 0x95, 0xa9, 0x47, 0xb8, 0x57, 0x92, 0xb6, - 0xbe, 0x94, 0xc9, 0xd6, 0xff, 0x69, 0x0e, 0x26, 0xb7, 0x5c, 0x47, 0x64, 0xd9, 0x4f, 0x3f, 0x61, - 0x7b, 0x27, 0xf2, 0x42, 0x77, 0x71, 0xe4, 0x17, 0x3a, 0x0e, 0x25, 0xde, 0xe6, 0xa6, 0xa2, 0xef, - 0x72, 0x5a, 0xe6, 0x31, 0x9f, 0xc5, 0x03, 0xf7, 0x21, 0x1f, 0x9e, 0x79, 0xfc, 0xd4, 0x80, 0xb2, - 0xea, 0xf9, 0xc4, 0xa6, 0xb8, 0xd4, 0xf8, 0x86, 0xa4, 0xb8, 0xfe, 0x38, 0x9c, 0x01, 0x57, 0x1a, - 0xfa, 0x4d, 0x98, 0xef, 0xfb, 0x2f, 0x82, 0x5b, 0x4e, 0xd7, 0x6a, 0x5a, 0xd4, 0xcf, 0x92, 0x5e, - 0xca, 0xf8, 0x5c, 0x2a, 0xd8, 0x0f, 0x6a, 0xdf, 0x50, 0x72, 0xe7, 0xb7, 0xe2, 0xb8, 0x38, 0x29, - 0xca, 0xfc, 0x17, 0x03, 0x66, 0x22, 0xba, 0x47, 0x4d, 0x80, 0xa6, 0x63, 0xb7, 0x2c, 0x16, 0x14, - 0x27, 0x94, 0x57, 0x57, 0x46, 0xd3, 0x6a, 0xdd, 0xe7, 0x0b, 0x37, 0x5d, 0xd0, 0xe4, 0x61, 0x0d, - 0x16, 0xbd, 0xea, 0xd7, 0x09, 0x45, 0x9d, 0x18, 0x59, 0x27, 0xf4, 0xe0, 0x70, 0x79, 0x5a, 0x8d, - 0x49, 0xaf, 0x1b, 0xca, 0x52, 0x31, 0xf3, 0x57, 0x39, 0x28, 0x05, 0xf3, 0x7f, 0x0c, 0xc7, 0xe8, - 0xed, 0xc8, 0x31, 0x7a, 0x35, 0xe3, 0xca, 0x0d, 0x7b, 0xe4, 0x46, 0xef, 0xc7, 0x0e, 0x53, 0xd6, - 0x2d, 0x71, 0xcc, 0x71, 0xfa, 0x3b, 0xb9, 0xf8, 0xb2, 0xef, 0x63, 0x38, 0x50, 0xdb, 0xd1, 0x03, - 0xb5, 0x92, 0x71, 0x36, 0x43, 0x8e, 0xd4, 0x8f, 0x0d, 0x98, 0x8d, 0x1d, 0x02, 0xf4, 0x2c, 0x14, - 0x44, 0x56, 0x4c, 0xed, 0xaf, 0x80, 0x51, 0x05, 0xf8, 0x82, 0x86, 0xb6, 0x60, 0x81, 0x0c, 0x98, - 0x13, 0xf0, 0x5e, 0xb7, 0xc9, 0x4e, 0x97, 0xca, 0xa8, 0x7d, 0xaa, 0xf6, 0x0b, 0x8a, 0x67, 0x61, - 0x2d, 0xa5, 0x0f, 0x4e, 0xe5, 0x34, 0x3f, 0xcf, 0x01, 0x0a, 0x1a, 0xb3, 0xa4, 0x93, 0xdf, 0x87, - 0xc9, 0x5d, 0x99, 0x08, 0x7a, 0xb4, 0xf7, 0x80, 0x5a, 0x59, 0x7f, 0x12, 0xf1, 0x31, 0xd1, 0xbb, - 0x27, 0xb3, 0x8f, 0x20, 0xb9, 0x87, 0xd0, 0x3d, 0x80, 0x5d, 0xcb, 0xb6, 0xbc, 0xce, 0x98, 0x2f, - 0x97, 0xe2, 0x36, 0xbf, 0x11, 0x20, 0x60, 0x0d, 0xcd, 0xfc, 0x38, 0xa7, 0xed, 0x4f, 0x61, 0x2e, - 0x47, 0x5a, 0xd7, 0x17, 0xa3, 0xca, 0x2c, 0x25, 0xdf, 0x8a, 0x34, 0xc5, 0x4c, 0xec, 0x13, 0xd7, - 0x4f, 0x5b, 0x67, 0x2d, 0x50, 0xb9, 0x4b, 0x5c, 0x8b, 0x2f, 0x7c, 0xb8, 0xa4, 0x77, 0x89, 0xeb, - 0x61, 0x01, 0x89, 0xbe, 0xc7, 0x87, 0x4a, 0xfb, 0xbe, 0x09, 0xcd, 0x6c, 0x13, 0x18, 0xed, 0xeb, - 0xf3, 0xa3, 0x7d, 0x0f, 0x4b, 0x40, 0xf3, 0xe3, 0x49, 0x6d, 0xc3, 0x2b, 0xab, 0x7d, 0x1b, 0x50, - 0x97, 0x78, 0xec, 0x16, 0xb1, 0x5b, 0x7c, 0x7b, 0xd2, 0x5d, 0x97, 0x7a, 0x1d, 0xe5, 0xa1, 0x2d, - 0x2a, 0x14, 0xb4, 0x99, 0xe8, 0x81, 0x53, 0xb8, 0xd0, 0xa5, 0xa8, 0x71, 0x5e, 0x8e, 0x1b, 0xe7, - 0xb3, 0xe1, 0x69, 0x1b, 0xcf, 0x3c, 0xeb, 0xdb, 0xbd, 0x70, 0x0a, 0xdb, 0xfd, 0x37, 0x60, 0x7e, - 0x37, 0xfe, 0x76, 0xa8, 0x2a, 0x09, 0xde, 0x18, 0xf3, 0xe9, 0xb1, 0x76, 0xfe, 0x28, 0x7c, 0x70, - 0x0a, 0x9b, 0x71, 0x52, 0x10, 0x72, 0xfc, 0x32, 0x4a, 0x11, 0x7d, 0xca, 0xc4, 0xc2, 0xc8, 0x47, - 0x2e, 0x16, 0xb7, 0xc6, 0x0b, 0x28, 0x25, 0x24, 0x8e, 0x08, 0x88, 0x1d, 0xc1, 0xe2, 0x49, 0x1e, - 0x41, 0x74, 0x29, 0x48, 0xe8, 0xf3, 0xe1, 0x08, 0x57, 0x36, 0x9f, 0x48, 0xc5, 0x73, 0x12, 0xd6, - 0xfb, 0xa1, 0x9f, 0x18, 0x70, 0x9e, 0x6f, 0xd6, 0xeb, 0x1f, 0xd1, 0xe6, 0x80, 0x6b, 0xc5, 0xaf, - 0x9d, 0xae, 0x94, 0x85, 0x36, 0x46, 0x2c, 0x2a, 0x6d, 0xa4, 0x41, 0x84, 0x7e, 0x79, 0x2a, 0x19, - 0xa7, 0x0b, 0x46, 0x1f, 0x08, 0xd3, 0xc1, 0xa8, 0x08, 0x7b, 0x1e, 0x3d, 0xbc, 0x2f, 0x29, 0xb3, - 0xc3, 0xa4, 0xd9, 0x61, 0xd4, 0xfc, 0xa3, 0x09, 0xdd, 0x5a, 0x8d, 0x96, 0x74, 0xb8, 0x07, 0x13, - 0x8c, 0x78, 0x7b, 0xea, 0x14, 0x7c, 0x6b, 0x8c, 0x02, 0xb9, 0xf0, 0x2c, 0x08, 0x4f, 0x5c, 0x34, - 0x09, 0x4c, 0xb4, 0x08, 0x39, 0xe2, 0xc5, 0x53, 0xd0, 0x6b, 0x1e, 0xce, 0x11, 0x0f, 0xbd, 0x0b, - 0x05, 0x97, 0x32, 0xf7, 0x40, 0x19, 0xec, 0xcb, 0x63, 0x18, 0x27, 0xcc, 0xf9, 0xa5, 0x1a, 0xc4, - 0x9f, 0x58, 0x22, 0xa2, 0x36, 0x14, 0x2d, 0xbb, 0x3f, 0x60, 0x32, 0x5c, 0x2b, 0xaf, 0x7e, 0x7b, - 0x0c, 0xec, 0xea, 0x86, 0x40, 0x88, 0x95, 0xf5, 0xcb, 0x46, 0xac, 0xe0, 0xb5, 0x84, 0x4d, 0xfe, - 0xb4, 0x12, 0x36, 0x8b, 0x57, 0xa0, 0xac, 0x0d, 0x25, 0x53, 0xd9, 0xfd, 0xcf, 0x0c, 0xcd, 0x17, - 0x08, 0x14, 0x86, 0xde, 0x86, 0x49, 0x66, 0xf5, 0xa8, 0x33, 0x60, 0xd9, 0x1c, 0xac, 0xe0, 0x71, - 0x4e, 0x98, 0xbc, 0x6d, 0x09, 0x81, 0x7d, 0x2c, 0x1e, 0x75, 0x52, 0xd7, 0x75, 0xdc, 0xed, 0x0e, - 0x37, 0xe1, 0x4e, 0x57, 0x7a, 0x31, 0x33, 0x61, 0xd4, 0x79, 0x3d, 0x42, 0xc5, 0xb1, 0xde, 0xe6, - 0xe7, 0xba, 0x2b, 0xf8, 0x7f, 0xbf, 0x3a, 0x94, 0x68, 0xba, 0xe7, 0x1d, 0xc5, 0x22, 0x8e, 0xe0, - 0x87, 0xbd, 0x08, 0x93, 0x2d, 0xba, 0x4b, 0x06, 0xdd, 0x84, 0xeb, 0xb0, 0x2e, 0x9b, 0xb1, 0x4f, - 0x37, 0xff, 0xd1, 0x80, 0xf9, 0xc7, 0x5d, 0x79, 0x7a, 0x3f, 0xea, 0x40, 0x8f, 0xa3, 0xb2, 0x87, - 0x94, 0x9c, 0xde, 0x87, 0xa7, 0xd2, 0x4d, 0xcb, 0x08, 0x8a, 0xbb, 0xa0, 0x2a, 0x35, 0x62, 0x25, - 0x17, 0x61, 0x51, 0x46, 0x52, 0x5f, 0xc2, 0xa1, 0xfb, 0x7e, 0x60, 0x2d, 0x32, 0x95, 0x83, 0x26, - 0x17, 0x77, 0xa8, 0x99, 0x08, 0xfc, 0xb0, 0xdc, 0x49, 0xfb, 0x61, 0xae, 0x3e, 0x21, 0xf5, 0x21, - 0x0b, 0x7a, 0x5f, 0x6d, 0x6a, 0x23, 0xcb, 0xc7, 0x13, 0x09, 0x98, 0xa1, 0x1b, 0xfb, 0x73, 0x03, - 0xce, 0xa7, 0xf6, 0x0e, 0x5c, 0xd9, 0xdc, 0x29, 0xba, 0xb2, 0xc6, 0x49, 0xab, 0xf0, 0x9e, 0xa6, - 0x42, 0x7f, 0x08, 0x27, 0xf5, 0xf5, 0xd9, 0x4f, 0x73, 0x30, 0x87, 0x69, 0xdf, 0x89, 0x64, 0x75, - 0xb7, 0xfc, 0xda, 0xe3, 0x0c, 0x61, 0x50, 0xec, 0xed, 0xb0, 0x36, 0x19, 0x29, 0x3a, 0xfe, 0x1e, - 0x14, 0x44, 0xc2, 0x35, 0x9b, 0x19, 0x4b, 0xe4, 0x9b, 0xe5, 0x4d, 0x2a, 0x33, 0xd7, 0x12, 0x90, - 0x23, 0x8b, 0x52, 0x18, 0x75, 0xbf, 0xbd, 0x91, 0xa1, 0xa8, 0x26, 0x89, 0x2c, 0x9a, 0xb1, 0x04, - 0x34, 0x3f, 0xc9, 0x81, 0x0c, 0x99, 0x1e, 0x83, 0x95, 0xff, 0xd5, 0x88, 0x95, 0x5f, 0x19, 0xd5, - 0xf1, 0xe3, 0xea, 0x19, 0x96, 0x16, 0x89, 0x87, 0xb3, 0x17, 0xb3, 0x80, 0x3e, 0x3c, 0x25, 0xf2, - 0xb7, 0x06, 0x94, 0x44, 0xbf, 0xc7, 0x60, 0xcd, 0xb7, 0xa2, 0xd6, 0xfc, 0xa5, 0x0c, 0xb3, 0x18, - 0x62, 0xc1, 0x3f, 0xce, 0xab, 0xd1, 0x07, 0xc1, 0x72, 0x87, 0xb8, 0x2d, 0x15, 0x06, 0x86, 0x27, - 0x90, 0x37, 0x62, 0x49, 0x43, 0xbf, 0x26, 0xab, 0x86, 0xa8, 0xc7, 0x68, 0xeb, 0x46, 0x10, 0x93, - 0xe5, 0x33, 0x97, 0x3f, 0xa9, 0x12, 0xad, 0xf0, 0x39, 0x00, 0xc7, 0x50, 0x71, 0x42, 0x0e, 0x8f, - 0xd3, 0xfa, 0x71, 0x5b, 0xa6, 0xe2, 0x97, 0x37, 0xc6, 0x34, 0x9c, 0x32, 0x4e, 0x4b, 0x34, 0xe3, - 0xa4, 0x20, 0xd4, 0x81, 0x69, 0xbd, 0x70, 0x53, 0xed, 0xa5, 0xd5, 0xec, 0x15, 0xa2, 0xf2, 0xf9, - 0x57, 0x6f, 0xc1, 0x11, 0x64, 0xf3, 0xb0, 0x08, 0x65, 0x6d, 0xf3, 0xc5, 0x52, 0xac, 0x33, 0xa7, - 0x93, 0x62, 0x4d, 0xcf, 0x08, 0x94, 0xc7, 0xca, 0x08, 0x5c, 0x8c, 0x66, 0x04, 0xbe, 0x19, 0xcf, - 0x08, 0x80, 0x98, 0x5d, 0x24, 0x1b, 0xe0, 0xc1, 0x59, 0x15, 0x1a, 0xfb, 0x15, 0xb8, 0x99, 0x72, - 0x2c, 0xc9, 0x00, 0x1c, 0x71, 0x2f, 0xf6, 0x46, 0x04, 0x12, 0xc7, 0x44, 0x70, 0x2f, 0x58, 0xb5, - 0x34, 0x06, 0xbd, 0x1e, 0x71, 0x0f, 0x2a, 0xd3, 0x62, 0xc0, 0x81, 0x17, 0x7c, 0x23, 0x42, 0xc5, - 0xb1, 0xde, 0x68, 0x0b, 0x8a, 0x32, 0xb2, 0x56, 0x55, 0x9d, 0x2f, 0x67, 0x09, 0xda, 0x65, 0x00, - 0x21, 0xff, 0xc6, 0x0a, 0x47, 0x4f, 0x8a, 0x94, 0x8e, 0x49, 0x8a, 0xdc, 0x06, 0xe4, 0xec, 0x88, - 0x50, 0xa5, 0x75, 0x53, 0x7e, 0xa6, 0xcd, 0x77, 0x65, 0x51, 0x44, 0xdc, 0xc1, 0x82, 0xdd, 0x49, - 0xf4, 0xc0, 0x29, 0x5c, 0xfc, 0x54, 0xab, 0x70, 0x3c, 0x38, 0x0a, 0x2a, 0x01, 0x92, 0xd5, 0xc1, - 0x0a, 0xe3, 0x4b, 0x51, 0x15, 0x58, 0x8f, 0xa1, 0xe2, 0x84, 0x1c, 0xf4, 0x21, 0xcc, 0xf0, 0x2d, - 0x14, 0x0a, 0x86, 0x47, 0x14, 0x3c, 0x7f, 0x74, 0xb8, 0x3c, 0xb3, 0xa9, 0x43, 0xe2, 0xa8, 0x04, - 0xf3, 0x0f, 0xf2, 0x90, 0x9e, 0x0c, 0x08, 0x3f, 0x48, 0x30, 0x1e, 0xf2, 0x41, 0xc2, 0x3b, 0x50, - 0xf2, 0x18, 0x71, 0xe5, 0xc7, 0x17, 0xb9, 0xf1, 0x3e, 0xbe, 0x68, 0xf8, 0x00, 0x38, 0xc4, 0x8a, - 0x65, 0x66, 0xf2, 0x27, 0x9a, 0x99, 0x59, 0x05, 0x10, 0x31, 0x5c, 0xdd, 0x19, 0xa8, 0xb7, 0xd8, - 0x99, 0xd0, 0x26, 0x5c, 0x0f, 0x28, 0x58, 0xeb, 0x85, 0x2e, 0x07, 0x17, 0xa7, 0x7c, 0x7c, 0xbd, - 0x90, 0x28, 0x1e, 0x89, 0xe7, 0xf6, 0x52, 0xbe, 0x56, 0x3e, 0xa6, 0xd8, 0xcc, 0xfc, 0x9f, 0x1c, - 0x44, 0x8c, 0x21, 0xfa, 0xb1, 0x01, 0xf3, 0x24, 0xf6, 0xc1, 0xb7, 0xef, 0x4b, 0x7e, 0x3b, 0xdb, - 0x57, 0xf8, 0x89, 0xef, 0xc5, 0xc3, 0xe7, 0xae, 0x78, 0x17, 0x0f, 0x27, 0x85, 0xa2, 0xdf, 0x33, - 0xe0, 0x1c, 0x49, 0x7e, 0xd1, 0xaf, 0x16, 0xfd, 0xca, 0xd8, 0x3f, 0x09, 0x50, 0x7b, 0xfa, 0xe8, - 0x70, 0x39, 0xed, 0xb7, 0x0e, 0x70, 0x9a, 0x38, 0xf4, 0x1e, 0x4c, 0x10, 0xb7, 0xed, 0xa7, 0x86, - 0xb3, 0x8b, 0xf5, 0x7f, 0xa8, 0x21, 0xf4, 0x8e, 0xd6, 0xdc, 0xb6, 0x87, 0x05, 0xa8, 0xf9, 0xf3, - 0x3c, 0xcc, 0xc5, 0x3f, 0x60, 0x50, 0xf5, 0x88, 0x13, 0xa9, 0xf5, 0x88, 0xfc, 0x8c, 0x34, 0x59, - 0x50, 0x1c, 0x18, 0x9e, 0x11, 0xde, 0x88, 0x25, 0x2d, 0x38, 0x23, 0xa2, 0xac, 0xb8, 0xf0, 0x08, - 0x67, 0x44, 0xd4, 0x12, 0x87, 0x58, 0xe8, 0x72, 0xf4, 0x6e, 0x31, 0xe3, 0x77, 0xcb, 0xbc, 0x3e, - 0x97, 0x71, 0x13, 0xce, 0x3d, 0x28, 0x6b, 0xeb, 0xa0, 0x4e, 0xe2, 0xd5, 0xcc, 0x7a, 0x0f, 0xb7, - 0xdd, 0xac, 0xfc, 0xb5, 0x87, 0x90, 0xa2, 0xe3, 0x87, 0xe7, 0x5e, 0x68, 0xeb, 0x91, 0x32, 0xb2, - 0x42, 0x5d, 0x1a, 0x9a, 0xf9, 0xaf, 0x06, 0xcc, 0x44, 0x8a, 0x64, 0xb9, 0x34, 0xbf, 0x18, 0x79, - 0xfc, 0xdf, 0x3f, 0xb8, 0x1b, 0x20, 0x60, 0x0d, 0x0d, 0xfd, 0x00, 0xca, 0x5d, 0xc7, 0x6e, 0x53, - 0x8f, 0x35, 0x1c, 0xb2, 0xa7, 0xce, 0x49, 0xd6, 0x94, 0x55, 0xe5, 0xe8, 0x70, 0x79, 0x61, 0x53, - 0xc2, 0xd4, 0x9d, 0x5e, 0xbf, 0x4b, 0x99, 0xac, 0x22, 0xc7, 0x3a, 0xb8, 0x78, 0xb4, 0x7d, 0x87, - 0xb8, 0xb4, 0xe3, 0x0c, 0x3c, 0xfa, 0xa4, 0x3e, 0xda, 0x06, 0x03, 0x3c, 0xe9, 0x47, 0xdb, 0x10, - 0xf8, 0xf8, 0x47, 0xdb, 0xa0, 0xef, 0x13, 0xfb, 0x68, 0x1b, 0x8c, 0x70, 0x48, 0xa4, 0xf2, 0xdf, - 0x39, 0x6d, 0x16, 0xd1, 0x68, 0x25, 0xf7, 0x90, 0x68, 0xe5, 0x3e, 0x4c, 0x59, 0x36, 0xa3, 0xee, - 0x3e, 0xe9, 0xaa, 0xd4, 0x75, 0xd6, 0xbd, 0x18, 0x4c, 0x75, 0x43, 0xe1, 0xe0, 0x00, 0x11, 0x75, - 0xe1, 0xbc, 0xff, 0x9c, 0xe3, 0x52, 0x12, 0x3e, 0x27, 0xab, 0x92, 0xac, 0xd7, 0xfd, 0x77, 0x87, - 0x1b, 0x69, 0x9d, 0x1e, 0x0c, 0x23, 0xe0, 0x74, 0x50, 0xe4, 0xc1, 0x8c, 0xa7, 0x85, 0xe9, 0xfe, - 0x8d, 0x38, 0xe2, 0x53, 0x58, 0x3c, 0xb3, 0xa1, 0xd5, 0x71, 0xe9, 0xa0, 0x38, 0x2a, 0xc3, 0xfc, - 0xa7, 0x3c, 0xcc, 0xc6, 0x76, 0x5a, 0x2c, 0x1c, 0x29, 0x3d, 0xce, 0x70, 0xa4, 0x38, 0x56, 0x38, - 0x92, 0xee, 0x29, 0x4f, 0x8c, 0xe5, 0x29, 0xbf, 0x29, 0xbd, 0x55, 0xb5, 0x72, 0x1b, 0xeb, 0xaa, - 0xec, 0x3d, 0xd0, 0xe6, 0xa6, 0x4e, 0xc4, 0xd1, 0xbe, 0xc2, 0x9d, 0x68, 0x25, 0xbf, 0xa3, 0x57, - 0xae, 0xf6, 0x95, 0xac, 0x75, 0x8b, 0x01, 0x80, 0x74, 0x27, 0x52, 0x08, 0x38, 0x4d, 0x5c, 0xed, - 0xf6, 0x67, 0x5f, 0x2d, 0x9d, 0xf9, 0xe2, 0xab, 0xa5, 0x33, 0x5f, 0x7e, 0xb5, 0x74, 0xe6, 0x47, - 0x47, 0x4b, 0xc6, 0x67, 0x47, 0x4b, 0xc6, 0x17, 0x47, 0x4b, 0xc6, 0x97, 0x47, 0x4b, 0xc6, 0x7f, - 0x1c, 0x2d, 0x19, 0x3f, 0xf9, 0x7a, 0xe9, 0xcc, 0xbd, 0xe7, 0x46, 0xf9, 0x7d, 0xad, 0xff, 0x0d, - 0x00, 0x00, 0xff, 0xff, 0x8a, 0x01, 0x34, 0x7d, 0x86, 0x4b, 0x00, 0x00, + 0x76, 0x9f, 0x26, 0x45, 0x4a, 0x7c, 0x94, 0x66, 0xa4, 0x1a, 0x8d, 0xad, 0xd5, 0xc6, 0xd2, 0xa4, + 0x6d, 0x18, 0x76, 0x6c, 0x53, 0x19, 0xd9, 0x63, 0x8f, 0xc7, 0x9b, 0x09, 0x44, 0x6a, 0x3e, 0x34, + 0xab, 0xf5, 0x28, 0x45, 0x79, 0xbc, 0x1e, 0x8f, 0xe1, 0x2d, 0x91, 0x25, 0xb2, 0x57, 0x64, 0x37, + 0xdd, 0x55, 0xd4, 0x5a, 0x49, 0x90, 0x6c, 0xbe, 0x80, 0x45, 0x82, 0x04, 0x7b, 0x30, 0xe0, 0x0d, + 0x90, 0x00, 0x41, 0x72, 0x5c, 0x24, 0xff, 0x40, 0x0e, 0x3e, 0xe4, 0x62, 0x2c, 0x8c, 0xc4, 0x48, + 0x02, 0xc4, 0x87, 0x8d, 0x12, 0xcb, 0x40, 0x8e, 0xb9, 0xe5, 0x32, 0x40, 0x80, 0xa0, 0x3e, 0xba, + 0xbb, 0xba, 0xd9, 0x1c, 0xb1, 0x39, 0xd2, 0xc0, 0xd9, 0x9b, 0x54, 0xaf, 0xde, 0xef, 0x55, 0xbd, + 0xaa, 0x7a, 0xf5, 0xde, 0xab, 0xd7, 0x84, 0x57, 0x5a, 0x0e, 0x6f, 0xf7, 0x77, 0x2a, 0x0d, 0xaf, + 0xbb, 0x42, 0xf6, 0xfa, 0x0e, 0x3f, 0x58, 0xd9, 0x23, 0x7e, 0xcb, 0x5b, 0x21, 0x3d, 0x67, 0x65, + 0xff, 0x12, 0xe9, 0xf4, 0xda, 0xe4, 0xd2, 0x4a, 0x8b, 0xba, 0xd4, 0x27, 0x9c, 0x36, 0x2b, 0x3d, + 0xdf, 0xe3, 0x1e, 0x7a, 0x26, 0xe2, 0xaa, 0x28, 0xae, 0x8a, 0xe4, 0xaa, 0x90, 0x9e, 0x53, 0x09, + 0xb8, 0x16, 0x5f, 0x32, 0xb0, 0x5b, 0x5e, 0xcb, 0x5b, 0x91, 0xcc, 0x3b, 0xfd, 0x5d, 0xf9, 0x9f, + 0xfc, 0x47, 0xfe, 0xa5, 0x40, 0x17, 0x6f, 0xed, 0x5d, 0x61, 0x15, 0x47, 0x4a, 0xa6, 0x1f, 0x72, + 0xea, 0x32, 0xc7, 0x73, 0xd9, 0x4b, 0xa4, 0xe7, 0x30, 0xea, 0xef, 0x53, 0x7f, 0xa5, 0xb7, 0xd7, + 0x12, 0x34, 0x16, 0xef, 0xb0, 0xb2, 0x3f, 0x30, 0xbc, 0xc5, 0x57, 0x22, 0xa4, 0x2e, 0x69, 0xb4, + 0x1d, 0x97, 0xfa, 0x07, 0x11, 0x7b, 0x97, 0x72, 0x92, 0xc6, 0xb5, 0x32, 0x8c, 0xcb, 0xef, 0xbb, + 0xdc, 0xe9, 0xd2, 0x01, 0x86, 0x57, 0x8f, 0x63, 0x60, 0x8d, 0x36, 0xed, 0x92, 0x24, 0x9f, 0x7d, + 0x1f, 0xce, 0xaf, 0xb9, 0xa4, 0x73, 0xc0, 0x1c, 0x86, 0xfb, 0xee, 0x9a, 0xdf, 0xea, 0x77, 0xa9, + 0xcb, 0xd1, 0x45, 0x98, 0x70, 0x49, 0x97, 0x2e, 0x58, 0x17, 0xad, 0xe7, 0x4a, 0xd5, 0xe9, 0x4f, + 0x0f, 0x97, 0xcf, 0x1c, 0x1d, 0x2e, 0x4f, 0xbc, 0x49, 0xba, 0x14, 0x4b, 0x0a, 0x7a, 0x1a, 0x0a, + 0xfb, 0xa4, 0xd3, 0xa7, 0x0b, 0x39, 0xd9, 0x65, 0x46, 0x77, 0x29, 0xdc, 0x15, 0x8d, 0x58, 0xd1, + 0xec, 0x3f, 0xc8, 0xc7, 0xe0, 0xbf, 0x43, 0x39, 0x69, 0x12, 0x4e, 0x50, 0x17, 0x8a, 0x1d, 0xb2, + 0x43, 0x3b, 0x6c, 0xc1, 0xba, 0x98, 0x7f, 0xae, 0xbc, 0x7a, 0xbd, 0x32, 0xca, 0x22, 0x56, 0x52, + 0xa0, 0x2a, 0x9b, 0x12, 0xe7, 0xba, 0xcb, 0xfd, 0x83, 0xea, 0x59, 0x3d, 0x88, 0xa2, 0x6a, 0xc4, + 0x5a, 0x08, 0xfa, 0x3d, 0x0b, 0xca, 0xc4, 0x75, 0x3d, 0x4e, 0xb8, 0x58, 0xa6, 0x85, 0x9c, 0x14, + 0x7a, 0x7b, 0x7c, 0xa1, 0x6b, 0x11, 0x98, 0x92, 0x7c, 0x5e, 0x4b, 0x2e, 0x1b, 0x14, 0x6c, 0xca, + 0x5c, 0x7c, 0x1d, 0xca, 0xc6, 0x50, 0xd1, 0x2c, 0xe4, 0xf7, 0xe8, 0x81, 0xd2, 0x2f, 0x16, 0x7f, + 0xa2, 0xf9, 0x98, 0x42, 0xb5, 0x06, 0xaf, 0xe6, 0xae, 0x58, 0x8b, 0xd7, 0x60, 0x36, 0x29, 0x30, + 0x0b, 0xbf, 0xfd, 0x67, 0x16, 0xcc, 0x1b, 0xb3, 0xc0, 0x74, 0x97, 0xfa, 0xd4, 0x6d, 0x50, 0xb4, + 0x02, 0x25, 0xb1, 0x96, 0xac, 0x47, 0x1a, 0xc1, 0x52, 0xcf, 0xe9, 0x89, 0x94, 0xde, 0x0c, 0x08, + 0x38, 0xea, 0x13, 0x6e, 0x8b, 0xdc, 0xc3, 0xb6, 0x45, 0xaf, 0x4d, 0x18, 0x5d, 0xc8, 0xc7, 0xb7, + 0xc5, 0x96, 0x68, 0xc4, 0x8a, 0x66, 0xff, 0x1a, 0x7c, 0x23, 0x18, 0xcf, 0x36, 0xed, 0xf6, 0x3a, + 0x84, 0xd3, 0x68, 0x50, 0xc7, 0x6e, 0x3d, 0x7b, 0x0f, 0x66, 0xd6, 0x7a, 0x3d, 0xdf, 0xdb, 0xa7, + 0xcd, 0x3a, 0x27, 0x2d, 0x8a, 0xee, 0x01, 0x10, 0xdd, 0xb0, 0xc6, 0x25, 0x63, 0x79, 0xf5, 0x57, + 0x2a, 0xea, 0x44, 0x54, 0xcc, 0x13, 0x51, 0xe9, 0xed, 0xb5, 0x44, 0x03, 0xab, 0x88, 0x83, 0x57, + 0xd9, 0xbf, 0x54, 0xd9, 0x76, 0xba, 0xb4, 0x7a, 0xf6, 0xe8, 0x70, 0x19, 0xd6, 0x42, 0x04, 0x6c, + 0xa0, 0xd9, 0xbf, 0x6f, 0xc1, 0x85, 0x35, 0xbf, 0xe5, 0xd5, 0xd6, 0xd7, 0x7a, 0xbd, 0x5b, 0x94, + 0x74, 0x78, 0xbb, 0xce, 0x09, 0xef, 0x33, 0x74, 0x0d, 0x8a, 0x4c, 0xfe, 0xa5, 0x87, 0xfa, 0x6c, + 0xb0, 0xfb, 0x14, 0xfd, 0xc1, 0xe1, 0xf2, 0x7c, 0x0a, 0x23, 0xc5, 0x9a, 0x0b, 0x3d, 0x0f, 0x93, + 0x5d, 0xca, 0x18, 0x69, 0x05, 0xfa, 0x3c, 0xa7, 0x01, 0x26, 0xbf, 0xa3, 0x9a, 0x71, 0x40, 0xb7, + 0x7f, 0x96, 0x83, 0x73, 0x21, 0x96, 0x16, 0x7f, 0x0a, 0x8b, 0xd7, 0x87, 0xe9, 0xb6, 0x31, 0x43, + 0xb9, 0x86, 0xe5, 0xd5, 0x37, 0x46, 0x3c, 0x27, 0x69, 0x4a, 0xaa, 0xce, 0x6b, 0x31, 0xd3, 0x66, + 0x2b, 0x8e, 0x89, 0x41, 0x5d, 0x00, 0x76, 0xe0, 0x36, 0xb4, 0xd0, 0x09, 0x29, 0xf4, 0xf5, 0x8c, + 0x42, 0xeb, 0x21, 0x40, 0x15, 0x69, 0x91, 0x10, 0xb5, 0x61, 0x43, 0x80, 0xfd, 0x77, 0x16, 0x9c, + 0x4f, 0xe1, 0x43, 0xdf, 0x4a, 0xac, 0xe7, 0x33, 0x03, 0xeb, 0x89, 0x06, 0xd8, 0xa2, 0xd5, 0x7c, + 0x11, 0xa6, 0x7c, 0xba, 0xef, 0x88, 0x7b, 0x40, 0x6b, 0x78, 0x56, 0xf3, 0x4f, 0x61, 0xdd, 0x8e, + 0xc3, 0x1e, 0xe8, 0x05, 0x28, 0x05, 0x7f, 0x0b, 0x35, 0xe7, 0xc5, 0x51, 0x11, 0x0b, 0x17, 0x74, + 0x65, 0x38, 0xa2, 0xdb, 0xbf, 0x0b, 0x85, 0x5a, 0x9b, 0xf8, 0x5c, 0xec, 0x18, 0x9f, 0xf6, 0xbc, + 0xb7, 0xf0, 0xa6, 0x1e, 0x62, 0xb8, 0x63, 0xb0, 0x6a, 0xc6, 0x01, 0x7d, 0x84, 0xc5, 0x7e, 0x1e, + 0x26, 0xf7, 0xa9, 0x2f, 0xc7, 0x9b, 0x8f, 0x83, 0xdd, 0x55, 0xcd, 0x38, 0xa0, 0xdb, 0xff, 0x62, + 0xc1, 0xbc, 0x1c, 0xc1, 0xba, 0xc3, 0x1a, 0xde, 0x3e, 0xf5, 0x0f, 0x30, 0x65, 0xfd, 0xce, 0x09, + 0x0f, 0x68, 0x1d, 0x66, 0x19, 0xed, 0xee, 0x53, 0xbf, 0xe6, 0xb9, 0x8c, 0xfb, 0xc4, 0x71, 0xb9, + 0x1e, 0xd9, 0x82, 0xee, 0x3d, 0x5b, 0x4f, 0xd0, 0xf1, 0x00, 0x07, 0x7a, 0x0e, 0xa6, 0xf4, 0xb0, + 0xc5, 0x56, 0x12, 0x8a, 0x9d, 0x16, 0x6b, 0xa0, 0xe7, 0xc4, 0x70, 0x48, 0xb5, 0xff, 0xcb, 0x82, + 0x39, 0x39, 0xab, 0x7a, 0x7f, 0x87, 0x35, 0x7c, 0xa7, 0x27, 0xcc, 0xeb, 0xd7, 0x71, 0x4a, 0xd7, + 0xe0, 0x6c, 0x33, 0x50, 0xfc, 0xa6, 0xd3, 0x75, 0xb8, 0x3c, 0x23, 0x85, 0xea, 0x13, 0x1a, 0xe3, + 0xec, 0x7a, 0x8c, 0x8a, 0x13, 0xbd, 0xd5, 0xf2, 0x75, 0xfa, 0x8c, 0x53, 0x7f, 0xcb, 0xf7, 0xba, + 0x9e, 0x98, 0xe7, 0x36, 0x61, 0x7b, 0xe8, 0x7b, 0x30, 0xd5, 0xd5, 0x57, 0x9a, 0xb6, 0x9a, 0xbf, + 0x3a, 0x9a, 0xd5, 0xbc, 0xb3, 0xf3, 0x7d, 0xda, 0xe0, 0xe2, 0x3a, 0x8c, 0x4e, 0x5b, 0xd4, 0x86, + 0x43, 0x54, 0xf4, 0x0e, 0x4c, 0xb0, 0x1e, 0x6d, 0x48, 0x15, 0x95, 0x57, 0x5f, 0x1b, 0xed, 0x50, + 0xc7, 0x06, 0x59, 0xef, 0xd1, 0x46, 0xa4, 0x5b, 0xf1, 0x1f, 0x96, 0x90, 0xf6, 0xbf, 0x5b, 0xb0, + 0x90, 0x36, 0xab, 0x4d, 0x87, 0x71, 0x74, 0x7f, 0x60, 0x66, 0x95, 0xd1, 0x66, 0x26, 0xb8, 0xe5, + 0xbc, 0xc2, 0xd3, 0x1b, 0xb4, 0x18, 0xb3, 0x6a, 0x40, 0xc1, 0xe1, 0xb4, 0x1b, 0x38, 0x12, 0xd7, + 0x46, 0x9b, 0xd6, 0xb0, 0xc1, 0x46, 0x97, 0xe4, 0x86, 0x00, 0xc5, 0x0a, 0xdb, 0x7e, 0x17, 0xa6, + 0x6b, 0x7d, 0xdf, 0xa7, 0x2e, 0x57, 0x97, 0xdc, 0xb7, 0xa1, 0xc0, 0x1c, 0x57, 0xdb, 0xfa, 0x6c, + 0xf7, 0x5b, 0x49, 0x80, 0xd7, 0x05, 0x33, 0x56, 0x18, 0xf6, 0x5f, 0xe4, 0xe1, 0x7c, 0xb0, 0x6b, + 0x68, 0x73, 0xcd, 0xe7, 0xce, 0x2e, 0x69, 0x70, 0x86, 0x9a, 0x30, 0xdd, 0x8c, 0x9a, 0xb9, 0x36, + 0xc6, 0x59, 0x64, 0x85, 0x06, 0xdf, 0x80, 0xe7, 0x38, 0x86, 0x8a, 0xde, 0x86, 0x7c, 0xcb, 0xe1, + 0xda, 0xf7, 0xbb, 0x32, 0x9a, 0xf6, 0x6e, 0x3a, 0x49, 0xeb, 0x53, 0x2d, 0x6b, 0x51, 0xf9, 0x9b, + 0x0e, 0xc7, 0x02, 0x11, 0xed, 0x40, 0xd1, 0xe9, 0x92, 0x16, 0x0d, 0x56, 0xe6, 0xea, 0x68, 0xd8, + 0x1b, 0x82, 0x27, 0x89, 0x1e, 0x3a, 0x93, 0x92, 0xca, 0xb0, 0x46, 0x16, 0x32, 0x1a, 0xc2, 0x6a, + 0x28, 0xbb, 0x3d, 0xb2, 0x8c, 0x34, 0xfb, 0x19, 0xc9, 0x90, 0x54, 0x86, 0x35, 0xb2, 0xfd, 0x45, + 0x0e, 0x66, 0x23, 0xfd, 0xd5, 0xbc, 0x6e, 0xd7, 0xe1, 0x68, 0x11, 0x72, 0x4e, 0x53, 0x1b, 0x25, + 0xd0, 0x8c, 0xb9, 0x8d, 0x75, 0x9c, 0x73, 0x9a, 0xe8, 0x59, 0x28, 0xee, 0xf8, 0xc4, 0x6d, 0xb4, + 0xb5, 0x31, 0x0a, 0x81, 0xab, 0xb2, 0x15, 0x6b, 0x2a, 0x7a, 0x0a, 0xf2, 0x9c, 0xb4, 0xb4, 0x0d, + 0x0a, 0xf5, 0xb7, 0x4d, 0x5a, 0x58, 0xb4, 0x0b, 0xe3, 0xc7, 0xfa, 0xf2, 0x1c, 0xcb, 0x95, 0x37, + 0x8c, 0x5f, 0x5d, 0x35, 0xe3, 0x80, 0x2e, 0x24, 0x92, 0x3e, 0x6f, 0x7b, 0xfe, 0x42, 0x21, 0x2e, + 0x71, 0x4d, 0xb6, 0x62, 0x4d, 0x15, 0x6e, 0x4a, 0x43, 0x8e, 0x9f, 0x53, 0x7f, 0xa1, 0x18, 0x77, + 0x53, 0x6a, 0x01, 0x01, 0x47, 0x7d, 0xd0, 0x7b, 0x50, 0x6e, 0xf8, 0x94, 0x70, 0xcf, 0x5f, 0x27, + 0x9c, 0x2e, 0x4c, 0x66, 0xde, 0x81, 0xe7, 0x84, 0x1f, 0x5e, 0x8b, 0x20, 0xb0, 0x89, 0x67, 0xff, + 0xb7, 0x05, 0x0b, 0x91, 0x6a, 0xe5, 0xda, 0x46, 0xbe, 0xa7, 0x56, 0x8f, 0x35, 0x44, 0x3d, 0xcf, + 0x42, 0xb1, 0xe9, 0xb4, 0x28, 0xe3, 0x49, 0x2d, 0xaf, 0xcb, 0x56, 0xac, 0xa9, 0x68, 0x15, 0xa0, + 0xe5, 0x70, 0x7d, 0x5f, 0x68, 0x65, 0x87, 0x76, 0xf2, 0x66, 0x48, 0xc1, 0x46, 0x2f, 0xf4, 0x36, + 0x94, 0xe4, 0x30, 0xc7, 0x3c, 0x76, 0xd2, 0x7b, 0xa8, 0x05, 0x00, 0x38, 0xc2, 0xb2, 0x3f, 0x9f, + 0x80, 0xc9, 0x1b, 0x3e, 0x75, 0x5a, 0x6d, 0xfe, 0x18, 0x0c, 0xfe, 0xd3, 0x50, 0x20, 0x1d, 0x87, + 0x30, 0xb9, 0x6e, 0x86, 0xff, 0xbf, 0x26, 0x1a, 0xb1, 0xa2, 0xa1, 0x77, 0xa1, 0xe8, 0xf9, 0x4e, + 0xcb, 0x71, 0x17, 0x4a, 0x72, 0x10, 0x2f, 0x8f, 0x76, 0x84, 0xf4, 0x2c, 0xee, 0x48, 0xd6, 0x48, + 0xf9, 0xea, 0x7f, 0xac, 0x21, 0xd1, 0x3d, 0x98, 0x54, 0x9b, 0x29, 0x38, 0xa0, 0x2b, 0x23, 0x1b, + 0x18, 0xb5, 0x1f, 0xa3, 0x4d, 0xaf, 0xfe, 0x67, 0x38, 0x00, 0x44, 0xf5, 0xd0, 0xbe, 0x4c, 0x48, + 0xe8, 0x17, 0x32, 0xd8, 0x97, 0xa1, 0x06, 0xa5, 0x1e, 0x1a, 0x94, 0x42, 0x16, 0x50, 0x69, 0x32, + 0x86, 0x59, 0x10, 0xa1, 0x62, 0xed, 0xcc, 0x16, 0xc7, 0x50, 0xb1, 0xf6, 0xa4, 0xcf, 0xc6, 0x3d, + 0xe0, 0xc0, 0xd7, 0xb5, 0x3f, 0xca, 0xc3, 0x9c, 0xee, 0x59, 0xf3, 0x3a, 0x1d, 0xda, 0x90, 0x9e, + 0x93, 0xb2, 0x4f, 0xf9, 0x54, 0xfb, 0xe4, 0x04, 0x37, 0xa6, 0xb2, 0xf9, 0xd5, 0x4c, 0xa3, 0x89, + 0x64, 0x54, 0xe4, 0x0d, 0xa9, 0x42, 0xee, 0x70, 0x95, 0x74, 0x2f, 0x7d, 0x6f, 0xa2, 0x3f, 0xb2, + 0xe0, 0xfc, 0x3e, 0xf5, 0x9d, 0x5d, 0xa7, 0x21, 0x03, 0xe6, 0x5b, 0x0e, 0xe3, 0x9e, 0x7f, 0xa0, + 0x6f, 0x84, 0x57, 0x47, 0x93, 0x7c, 0xd7, 0x00, 0xd8, 0x70, 0x77, 0xbd, 0xea, 0x37, 0xb5, 0xb4, + 0xf3, 0x77, 0x07, 0xa1, 0x71, 0x9a, 0xbc, 0xc5, 0x1e, 0x40, 0x34, 0xda, 0x94, 0x78, 0x7d, 0xd3, + 0x8c, 0xd7, 0x47, 0x1e, 0x58, 0x30, 0xd9, 0xc0, 0x64, 0x99, 0x71, 0xfe, 0x27, 0x16, 0x94, 0x35, + 0xfd, 0x31, 0x38, 0x41, 0x38, 0xee, 0x04, 0xbd, 0x94, 0x69, 0xfc, 0x43, 0x7c, 0x1e, 0x1f, 0x66, + 0x62, 0x87, 0x1c, 0x5d, 0x86, 0x89, 0x3d, 0xc7, 0x0d, 0x6e, 0xbd, 0x5f, 0x0e, 0xdc, 0xc0, 0x6f, + 0x3b, 0x6e, 0xf3, 0xc1, 0xe1, 0xf2, 0x5c, 0xac, 0xb3, 0x68, 0xc4, 0xb2, 0xfb, 0xf1, 0x9e, 0xf9, + 0xd5, 0xa9, 0x9f, 0xfc, 0xd5, 0xf2, 0x99, 0x1f, 0xfe, 0xfc, 0xe2, 0x19, 0xfb, 0xe3, 0x3c, 0xcc, + 0x26, 0xb5, 0x3a, 0x42, 0xfe, 0x2b, 0xb2, 0x61, 0x53, 0xa7, 0x6a, 0xc3, 0x72, 0xa7, 0x67, 0xc3, + 0xf2, 0xa7, 0x61, 0xc3, 0x26, 0x4e, 0xcc, 0x86, 0xd9, 0xff, 0x68, 0xc1, 0xd9, 0x70, 0x65, 0x3e, + 0xe8, 0x8b, 0x9b, 0x35, 0xd2, 0xba, 0x75, 0xf2, 0x5a, 0x7f, 0x1f, 0x26, 0x99, 0xd7, 0xf7, 0x1b, + 0xd2, 0x7d, 0x14, 0xe8, 0xaf, 0x64, 0x33, 0x9a, 0x8a, 0xd7, 0xf0, 0x99, 0x54, 0x03, 0x0e, 0x50, + 0xcd, 0x09, 0x69, 0x9a, 0x72, 0x29, 0x7c, 0xe1, 0x70, 0x89, 0x09, 0x4d, 0x99, 0x2e, 0x85, 0x68, + 0xc5, 0x9a, 0x8a, 0x6c, 0x69, 0xcf, 0x03, 0xcf, 0xb6, 0x54, 0x05, 0x6d, 0x96, 0xe5, 0x22, 0x28, + 0x0a, 0xea, 0xc1, 0xac, 0x4f, 0x3f, 0xe8, 0x3b, 0x3e, 0x6d, 0xd6, 0x3d, 0xb2, 0x27, 0xfc, 0x02, + 0x9d, 0xc2, 0x19, 0xf1, 0xdc, 0xaf, 0xf7, 0x7d, 0x69, 0xc2, 0xaa, 0xf3, 0x22, 0x32, 0xc5, 0x09, + 0x2c, 0x3c, 0x80, 0x6e, 0xff, 0x47, 0x21, 0x3c, 0xb0, 0x3a, 0x89, 0xf2, 0x5b, 0x50, 0x6e, 0xa8, + 0xa8, 0xa5, 0x73, 0xb0, 0xe1, 0xea, 0x2d, 0xb6, 0x3e, 0xc6, 0xe5, 0x53, 0xa9, 0x45, 0x30, 0x89, + 0x1c, 0xab, 0x41, 0xc1, 0xa6, 0x34, 0xf4, 0x03, 0x00, 0x65, 0x89, 0x69, 0x73, 0xc3, 0xd5, 0x57, + 0x4d, 0x6d, 0x1c, 0xd9, 0x77, 0x43, 0x14, 0x25, 0x3a, 0xf4, 0x79, 0x22, 0x02, 0x36, 0x44, 0x89, + 0x59, 0x07, 0x29, 0xc3, 0x1b, 0x9e, 0xaf, 0xcf, 0xec, 0x58, 0xb3, 0x5e, 0x8b, 0x60, 0x92, 0x99, + 0xe5, 0x88, 0x82, 0x4d, 0x69, 0x8b, 0x3e, 0xcc, 0x26, 0x75, 0x95, 0x72, 0xdd, 0xdc, 0x8a, 0x5f, + 0x37, 0xab, 0x23, 0x1e, 0x50, 0x23, 0x02, 0x35, 0x53, 0xd2, 0x3e, 0x9c, 0x4b, 0xe8, 0x28, 0x45, + 0xe4, 0x46, 0x5c, 0xe4, 0xcb, 0x59, 0xae, 0x5e, 0x9d, 0xda, 0x35, 0x65, 0x32, 0x98, 0x4d, 0x6a, + 0xe7, 0xc4, 0x84, 0xc6, 0xf2, 0xc9, 0xe6, 0x9d, 0xfa, 0x97, 0x39, 0x28, 0x85, 0x56, 0x35, 0x4b, + 0x72, 0x48, 0x79, 0x43, 0xb9, 0x63, 0xa2, 0xb5, 0xfc, 0x28, 0xd1, 0xda, 0xc4, 0xf0, 0x68, 0x2d, + 0x48, 0x20, 0x17, 0x1f, 0x9e, 0x40, 0x36, 0xa2, 0xb5, 0xc9, 0xd1, 0xa3, 0xb5, 0xa9, 0xe3, 0xa3, + 0x35, 0xfb, 0xaf, 0x2d, 0x40, 0x83, 0xa1, 0x79, 0x16, 0x45, 0x91, 0xe4, 0x5d, 0x37, 0xa2, 0x27, + 0x94, 0x8c, 0x8f, 0x87, 0x5f, 0x79, 0xf6, 0x27, 0x05, 0x38, 0x77, 0xd3, 0x19, 0x3b, 0xcf, 0xc7, + 0xe1, 0x49, 0x85, 0x54, 0xa7, 0xda, 0x0f, 0xad, 0x73, 0x9f, 0x70, 0xda, 0x3a, 0xd0, 0xeb, 0x7b, + 0x55, 0xb3, 0x3e, 0x59, 0x4b, 0xef, 0xf6, 0x60, 0x38, 0x09, 0x0f, 0x83, 0x1e, 0x79, 0x93, 0xbc, + 0x01, 0x33, 0x8c, 0xfb, 0x4e, 0x83, 0xab, 0x4c, 0x22, 0x5b, 0x28, 0xcb, 0x8b, 0xe4, 0x82, 0xee, + 0x3e, 0x53, 0x37, 0x89, 0x38, 0xde, 0x37, 0x35, 0x41, 0x39, 0x91, 0x39, 0x41, 0xb9, 0x02, 0x25, + 0xd2, 0xe9, 0x78, 0x3f, 0xd8, 0x26, 0x2d, 0xa6, 0xd3, 0x01, 0xe1, 0xae, 0x59, 0x0b, 0x08, 0x38, + 0xea, 0x83, 0x2a, 0x00, 0x4e, 0xcb, 0xf5, 0x7c, 0x2a, 0x39, 0x8a, 0xf2, 0x46, 0x93, 0x8f, 0x30, + 0x1b, 0x61, 0x2b, 0x36, 0x7a, 0xa0, 0x3a, 0x5c, 0x70, 0x5c, 0x46, 0x1b, 0x7d, 0x9f, 0xd6, 0xf7, + 0x9c, 0xde, 0xf6, 0x66, 0x5d, 0x5a, 0x89, 0x03, 0xb9, 0x9b, 0xa7, 0xaa, 0x4f, 0x69, 0x61, 0x17, + 0x36, 0xd2, 0x3a, 0xe1, 0x74, 0x5e, 0xf4, 0x0a, 0x4c, 0x3b, 0x6e, 0xa3, 0xd3, 0x6f, 0xd2, 0x2d, + 0xc2, 0xdb, 0x6c, 0x61, 0x4a, 0x0e, 0x63, 0xf6, 0xe8, 0x70, 0x79, 0x7a, 0xc3, 0x68, 0xc7, 0xb1, + 0x5e, 0x82, 0x8b, 0x7e, 0x68, 0x70, 0x95, 0x22, 0xae, 0xeb, 0x1f, 0x9a, 0x5c, 0x66, 0xaf, 0x94, + 0x14, 0x2e, 0x64, 0x4a, 0xe1, 0xfe, 0x34, 0x07, 0x45, 0xf5, 0x82, 0x82, 0x2e, 0x27, 0x9e, 0x29, + 0x9e, 0x1a, 0x78, 0xa6, 0x28, 0xa7, 0xbd, 0x36, 0xd9, 0x50, 0x74, 0x18, 0xeb, 0xc7, 0x1d, 0x88, + 0x0d, 0xd9, 0x82, 0x35, 0x45, 0xa6, 0xb6, 0x3c, 0x77, 0xd7, 0x69, 0xe9, 0x04, 0xc4, 0x35, 0xc3, + 0x6d, 0x88, 0x5e, 0xb9, 0xdf, 0x0f, 0x9f, 0xc1, 0x23, 0x0f, 0x22, 0xd6, 0x41, 0xb8, 0x12, 0xb7, + 0xeb, 0x77, 0xde, 0x54, 0x32, 0x6a, 0x12, 0x11, 0x6b, 0x64, 0x21, 0xc3, 0xeb, 0xf3, 0x5e, 0x9f, + 0xcb, 0x8d, 0x72, 0x42, 0x32, 0xee, 0x48, 0x44, 0xac, 0x91, 0xed, 0x8f, 0x2d, 0x38, 0xa7, 0x74, + 0x50, 0x6b, 0xd3, 0xc6, 0x5e, 0x9d, 0xd3, 0x9e, 0xf0, 0xe8, 0xfb, 0x8c, 0xb2, 0xa4, 0x47, 0xff, + 0x16, 0xa3, 0x0c, 0x4b, 0x8a, 0x31, 0xfb, 0xdc, 0x69, 0xcd, 0xde, 0xfe, 0x5b, 0x0b, 0x0a, 0xd2, + 0x75, 0xce, 0x62, 0x7f, 0xe2, 0xe9, 0xa4, 0xdc, 0x48, 0xe9, 0xa4, 0x63, 0x12, 0x7d, 0x51, 0x26, + 0x6b, 0xe2, 0x61, 0x99, 0x2c, 0xfb, 0x2b, 0x0b, 0xe6, 0xd3, 0xb2, 0xa3, 0x59, 0x86, 0xff, 0x22, + 0x4c, 0xf5, 0x3a, 0x84, 0xef, 0x7a, 0x7e, 0x37, 0xf9, 0x32, 0xb6, 0xa5, 0xdb, 0x71, 0xd8, 0x03, + 0xf9, 0x00, 0x7e, 0x10, 0x86, 0x05, 0x21, 0xca, 0xb5, 0xac, 0x37, 0x42, 0x3c, 0xad, 0x17, 0x29, + 0x2b, 0x6c, 0x62, 0xd8, 0x90, 0x62, 0xff, 0x49, 0x01, 0xe6, 0x24, 0xcb, 0xb8, 0x37, 0xc4, 0x38, + 0x2b, 0xd4, 0x83, 0x27, 0x64, 0xf0, 0x34, 0x78, 0xa9, 0xa8, 0x45, 0xbb, 0xa2, 0xf9, 0x9f, 0xd8, + 0x48, 0xed, 0xf5, 0x60, 0x28, 0x05, 0x0f, 0xc1, 0x1d, 0xbc, 0x29, 0xe0, 0x17, 0xef, 0xa6, 0x30, + 0x37, 0xdb, 0xe4, 0xb1, 0x9b, 0x6d, 0xe8, 0xbd, 0x32, 0xf5, 0x08, 0xf7, 0xca, 0xa0, 0xad, 0x2f, + 0x65, 0xb2, 0xf5, 0x7f, 0x9e, 0x83, 0xc9, 0x2d, 0xdf, 0x93, 0x59, 0xf6, 0xd3, 0x4f, 0xd8, 0xde, + 0x89, 0xbd, 0xd0, 0x5d, 0x1a, 0xf9, 0x85, 0x4e, 0x40, 0xc9, 0xb7, 0xb9, 0xa9, 0xf8, 0xbb, 0x9c, + 0x91, 0x79, 0xcc, 0x67, 0xf1, 0xc0, 0x03, 0xc8, 0x87, 0x67, 0x1e, 0x3f, 0xb1, 0xa0, 0xac, 0x7b, + 0x7e, 0x6d, 0x53, 0x5c, 0x7a, 0x7c, 0x43, 0x52, 0x5c, 0x7f, 0x1a, 0xcd, 0x40, 0x28, 0x0d, 0xfd, + 0x0e, 0xcc, 0xf5, 0x82, 0x17, 0xc1, 0x2d, 0xaf, 0xe3, 0x34, 0x1c, 0x1a, 0x64, 0x49, 0x2f, 0x67, + 0x7c, 0x2e, 0x95, 0xec, 0x07, 0xd5, 0x6f, 0x68, 0xb9, 0x73, 0x5b, 0x49, 0x5c, 0x3c, 0x28, 0xca, + 0xfe, 0x57, 0x0b, 0x66, 0x62, 0xba, 0x47, 0x0d, 0x80, 0x86, 0xe7, 0x36, 0x1d, 0x1e, 0x16, 0x27, + 0x94, 0x57, 0x57, 0x46, 0xd3, 0x6a, 0x2d, 0xe0, 0x8b, 0x36, 0x5d, 0xd8, 0xc4, 0xb0, 0x01, 0x8b, + 0x5e, 0x0e, 0xea, 0x84, 0xe2, 0x4e, 0x8c, 0xaa, 0x13, 0x7a, 0x70, 0xb8, 0x3c, 0xad, 0xc7, 0x64, + 0xd6, 0x0d, 0x65, 0xa9, 0x98, 0xf9, 0x9b, 0x1c, 0x94, 0xc2, 0xf9, 0x3f, 0x86, 0x63, 0xf4, 0x56, + 0xec, 0x18, 0xbd, 0x9c, 0x71, 0xe5, 0x86, 0x3d, 0x72, 0xa3, 0xf7, 0x12, 0x87, 0x29, 0xeb, 0x96, + 0x38, 0xe6, 0x38, 0xfd, 0x83, 0x5a, 0x7c, 0xd5, 0xf7, 0x31, 0x1c, 0xa8, 0xed, 0xf8, 0x81, 0x5a, + 0xc9, 0x38, 0x9b, 0x21, 0x47, 0xea, 0x47, 0x16, 0x9c, 0x4b, 0x1c, 0x02, 0xf4, 0x34, 0x14, 0x64, + 0x56, 0x4c, 0xef, 0xaf, 0x90, 0x51, 0x07, 0xf8, 0x92, 0x86, 0xb6, 0x60, 0x9e, 0xf4, 0xb9, 0x17, + 0xf2, 0x5e, 0x77, 0xc9, 0x4e, 0x87, 0xaa, 0xa8, 0x7d, 0xaa, 0xfa, 0x4b, 0x9a, 0x67, 0x7e, 0x2d, + 0xa5, 0x0f, 0x4e, 0xe5, 0xb4, 0x3f, 0xcb, 0x01, 0x0a, 0x1b, 0xb3, 0xa4, 0x93, 0xdf, 0x83, 0xc9, + 0x5d, 0x95, 0x08, 0x7a, 0xb4, 0xf7, 0x80, 0x6a, 0xd9, 0x7c, 0x12, 0x09, 0x30, 0xd1, 0x3b, 0x27, + 0xb3, 0x8f, 0x60, 0x70, 0x0f, 0xa1, 0x7b, 0x00, 0xbb, 0x8e, 0xeb, 0xb0, 0xf6, 0x98, 0x2f, 0x97, + 0xf2, 0x36, 0xbf, 0x11, 0x22, 0x60, 0x03, 0xcd, 0xfe, 0x28, 0x67, 0xec, 0x4f, 0x69, 0x2e, 0x47, + 0x5a, 0xd7, 0xe7, 0xe3, 0xca, 0x2c, 0x0d, 0xbe, 0x15, 0x19, 0x8a, 0x99, 0xd8, 0x27, 0x7e, 0x90, + 0xb6, 0xce, 0x5a, 0xa0, 0x72, 0x97, 0xf8, 0x8e, 0x58, 0xf8, 0x68, 0x49, 0xef, 0x12, 0x9f, 0x61, + 0x09, 0x89, 0xbe, 0x2b, 0x86, 0x4a, 0x7b, 0x81, 0x09, 0xcd, 0x6c, 0x13, 0x38, 0xed, 0x99, 0xf3, + 0xa3, 0x3d, 0x86, 0x15, 0xa0, 0xfd, 0xd1, 0xa4, 0xb1, 0xe1, 0xb5, 0xd5, 0xbe, 0x0d, 0xa8, 0x43, + 0x18, 0xbf, 0x45, 0xdc, 0xa6, 0xd8, 0x9e, 0x74, 0xd7, 0xa7, 0xac, 0xad, 0x3d, 0xb4, 0x45, 0x8d, + 0x82, 0x36, 0x07, 0x7a, 0xe0, 0x14, 0x2e, 0x74, 0x39, 0x6e, 0x9c, 0x97, 0x93, 0xc6, 0xf9, 0x6c, + 0x74, 0xda, 0xc6, 0x33, 0xcf, 0xe6, 0x76, 0x2f, 0x9c, 0xc2, 0x76, 0xff, 0x6d, 0x98, 0xdb, 0x4d, + 0xbe, 0x1d, 0xea, 0x4a, 0x82, 0xd7, 0xc6, 0x7c, 0x7a, 0xac, 0x5e, 0x38, 0x8a, 0x1e, 0x9c, 0xa2, + 0x66, 0x3c, 0x28, 0x08, 0x79, 0x41, 0x19, 0xa5, 0x8c, 0x3e, 0x55, 0x62, 0x61, 0xe4, 0x23, 0x97, + 0x88, 0x5b, 0x93, 0x05, 0x94, 0x0a, 0x12, 0xc7, 0x04, 0x24, 0x8e, 0x60, 0xf1, 0x24, 0x8f, 0x20, + 0xba, 0x1c, 0x26, 0xf4, 0xc5, 0x70, 0xa4, 0x2b, 0x9b, 0x1f, 0x48, 0xc5, 0x0b, 0x12, 0x36, 0xfb, + 0xa1, 0x1f, 0x5b, 0x70, 0x41, 0x6c, 0xd6, 0xeb, 0x1f, 0xd2, 0x46, 0x5f, 0x68, 0x25, 0xa8, 0x9d, + 0x5e, 0x28, 0x4b, 0x6d, 0x8c, 0x58, 0x54, 0x5a, 0x4f, 0x83, 0x88, 0xfc, 0xf2, 0x54, 0x32, 0x4e, + 0x17, 0x8c, 0xde, 0x97, 0xa6, 0x83, 0x53, 0x19, 0xf6, 0x3c, 0x7a, 0x78, 0x5f, 0xd2, 0x66, 0x87, + 0x2b, 0xb3, 0xc3, 0xa9, 0xfd, 0xb3, 0xbc, 0x69, 0xad, 0x46, 0x4b, 0x3a, 0xdc, 0x83, 0x09, 0x4e, + 0xd8, 0x9e, 0x3e, 0x05, 0xdf, 0x1a, 0xa3, 0x40, 0x2e, 0x3a, 0x0b, 0xd2, 0x13, 0x97, 0x4d, 0x12, + 0x13, 0x2d, 0x42, 0x8e, 0xb0, 0x64, 0x0a, 0x7a, 0x8d, 0xe1, 0x1c, 0x61, 0xe8, 0x1d, 0x28, 0xf8, + 0x94, 0xfb, 0x07, 0xda, 0x60, 0x5f, 0x19, 0xc3, 0x38, 0x61, 0xc1, 0xaf, 0xd4, 0x20, 0xff, 0xc4, + 0x0a, 0x11, 0x7d, 0x0f, 0x8a, 0x8e, 0xdb, 0xeb, 0x73, 0x15, 0xae, 0x8d, 0x87, 0xbd, 0x21, 0x00, + 0x8c, 0xd7, 0x46, 0x89, 0x87, 0x35, 0xae, 0x91, 0xa9, 0xc9, 0x9f, 0x5a, 0xa6, 0xe6, 0x5d, 0xe3, + 0x22, 0x0f, 0x47, 0x74, 0x52, 0xdf, 0x45, 0xfc, 0xd4, 0x4a, 0xa0, 0x4b, 0x05, 0xa2, 0xb7, 0x60, + 0x92, 0x3b, 0x5d, 0xea, 0xf5, 0x79, 0x36, 0xdf, 0x2b, 0x7c, 0xb7, 0x93, 0xd6, 0x70, 0x5b, 0x41, + 0xe0, 0x00, 0x4b, 0x04, 0xa4, 0xd4, 0xf7, 0x3d, 0x7f, 0xbb, 0x2d, 0xac, 0xbb, 0xd7, 0x51, 0x0e, + 0xce, 0x4c, 0x14, 0x90, 0x5e, 0x8f, 0x51, 0x71, 0xa2, 0xb7, 0xfd, 0x99, 0xe9, 0x25, 0xfe, 0xff, + 0x2f, 0x1c, 0x25, 0x86, 0xee, 0x45, 0xc7, 0x51, 0x57, 0xf6, 0x79, 0x98, 0x6c, 0xd2, 0x5d, 0xd2, + 0xef, 0x0c, 0x78, 0x15, 0xeb, 0xaa, 0x19, 0x07, 0x74, 0xfb, 0x9f, 0x2c, 0x98, 0x7b, 0xdc, 0x45, + 0xa9, 0xf7, 0xe3, 0xbe, 0xf5, 0x38, 0x2a, 0x7b, 0x48, 0x35, 0xea, 0x7d, 0x78, 0x22, 0xdd, 0xea, + 0x8c, 0xa0, 0xb8, 0x8b, 0xba, 0x88, 0x23, 0x51, 0x8d, 0x11, 0xd5, 0x6b, 0x0c, 0xea, 0x4b, 0xfa, + 0x7a, 0x91, 0x21, 0xb1, 0xc6, 0x32, 0x24, 0xe1, 0xe2, 0x0e, 0x35, 0x24, 0xa1, 0x8b, 0x96, 0x3b, + 0x69, 0x17, 0xcd, 0x37, 0x27, 0xa4, 0xbf, 0x71, 0x41, 0xef, 0xe9, 0x4d, 0x6d, 0x65, 0xf9, 0xae, + 0x62, 0x00, 0x66, 0xe8, 0xc6, 0xfe, 0xcc, 0x82, 0x0b, 0xa9, 0xbd, 0x43, 0x2f, 0x37, 0x77, 0x8a, + 0x5e, 0xae, 0x75, 0xd2, 0x2a, 0xbc, 0x67, 0xa8, 0x30, 0x18, 0xc2, 0x49, 0x19, 0xe0, 0x9f, 0xe4, + 0x60, 0x16, 0xd3, 0x9e, 0x17, 0x4b, 0xf8, 0x6e, 0x05, 0x65, 0xc9, 0x19, 0x22, 0xa4, 0xc4, 0xb3, + 0x62, 0x75, 0x32, 0x56, 0x8f, 0xfc, 0x5d, 0x28, 0xc8, 0x5c, 0x6c, 0x36, 0x33, 0x36, 0x90, 0x8a, + 0x56, 0x97, 0xac, 0x4a, 0x6a, 0x2b, 0x40, 0x81, 0x2c, 0xab, 0x64, 0xf4, 0x0d, 0xf8, 0x5a, 0x86, + 0x7a, 0x9b, 0x41, 0x64, 0xd9, 0x8c, 0x15, 0xa0, 0xfd, 0x71, 0x0e, 0x54, 0x34, 0xf5, 0x18, 0xac, + 0xfc, 0x6f, 0xc4, 0xac, 0xfc, 0xca, 0xa8, 0x3e, 0xa1, 0x50, 0xcf, 0xb0, 0x8c, 0x49, 0x32, 0xd2, + 0xbd, 0x94, 0x05, 0xf4, 0xe1, 0xd9, 0x92, 0xbf, 0xb7, 0xa0, 0x24, 0xfb, 0x3d, 0x06, 0x6b, 0xbe, + 0x15, 0xb7, 0xe6, 0x2f, 0x64, 0x98, 0xc5, 0x10, 0x0b, 0xfe, 0x51, 0x5e, 0x8f, 0x3e, 0x8c, 0xa3, + 0xdb, 0xc4, 0x6f, 0xea, 0x08, 0x31, 0x3a, 0x81, 0xa2, 0x11, 0x2b, 0x1a, 0xfa, 0x4d, 0x55, 0x50, + 0x44, 0x19, 0xa7, 0xcd, 0x1b, 0x61, 0xb8, 0x96, 0xcf, 0x5c, 0x19, 0xa5, 0xab, 0xb7, 0xa2, 0x97, + 0x02, 0x9c, 0x40, 0xc5, 0x03, 0x72, 0x44, 0x08, 0xd7, 0x4b, 0xda, 0x32, 0x1d, 0xda, 0xbc, 0x36, + 0xa6, 0xe1, 0x54, 0x21, 0xdc, 0x40, 0x33, 0x1e, 0x14, 0x84, 0xda, 0x30, 0x6d, 0xd6, 0x74, 0xea, + 0xbd, 0xb4, 0x9a, 0xbd, 0x78, 0x54, 0xbd, 0x0c, 0x9b, 0x2d, 0x38, 0x86, 0x6c, 0x1f, 0x16, 0xa1, + 0x6c, 0x6c, 0xbe, 0x44, 0xf6, 0x75, 0xe6, 0x74, 0xb2, 0xaf, 0xe9, 0xc9, 0x82, 0xf2, 0x58, 0xc9, + 0x82, 0x4b, 0xf1, 0x64, 0xc1, 0x37, 0x93, 0xc9, 0x02, 0x90, 0xb3, 0x8b, 0x25, 0x0a, 0x18, 0x9c, + 0xd5, 0x51, 0x73, 0x50, 0x9c, 0x9b, 0x29, 0xfd, 0x32, 0x18, 0x9b, 0x23, 0xe1, 0xc5, 0xde, 0x88, + 0x41, 0xe2, 0x84, 0x08, 0xe1, 0x05, 0xeb, 0x96, 0x7a, 0xbf, 0xdb, 0x25, 0xfe, 0xc1, 0xc2, 0xb4, + 0x1c, 0x70, 0xe8, 0x05, 0xdf, 0x88, 0x51, 0x71, 0xa2, 0x37, 0xda, 0x82, 0xa2, 0x0a, 0xba, 0x75, + 0xc1, 0xe7, 0x8b, 0x59, 0xe2, 0x79, 0x15, 0x62, 0xa8, 0xbf, 0xb1, 0xc6, 0x31, 0xf3, 0x25, 0xa5, + 0x63, 0xf2, 0x25, 0xb7, 0x01, 0x79, 0x3b, 0x32, 0x98, 0x69, 0xde, 0x54, 0x5f, 0x70, 0x8b, 0x5d, + 0x59, 0x94, 0xc1, 0x78, 0xb8, 0x60, 0x77, 0x06, 0x7a, 0xe0, 0x14, 0x2e, 0x71, 0xaa, 0x75, 0xa4, + 0x1e, 0x1e, 0x05, 0x9d, 0x1b, 0xc9, 0xea, 0x60, 0x45, 0xa1, 0xa7, 0x2c, 0x18, 0xac, 0x25, 0x50, + 0xf1, 0x80, 0x1c, 0xf4, 0x01, 0xcc, 0x88, 0x2d, 0x14, 0x09, 0x86, 0x47, 0x14, 0x3c, 0x77, 0x74, + 0xb8, 0x3c, 0xb3, 0x69, 0x42, 0xe2, 0xb8, 0x04, 0xfb, 0x8f, 0xf3, 0x90, 0x9e, 0x27, 0x88, 0xbe, + 0x55, 0xb0, 0x1e, 0xf2, 0xad, 0xc2, 0xdb, 0x50, 0x62, 0x9c, 0xf8, 0xea, 0xbb, 0x8c, 0xdc, 0x78, + 0xdf, 0x65, 0xd4, 0x03, 0x00, 0x1c, 0x61, 0x25, 0x92, 0x36, 0xf9, 0x13, 0x4d, 0xda, 0xac, 0x02, + 0xc8, 0x18, 0xae, 0xe6, 0xf5, 0xf5, 0x33, 0xed, 0x4c, 0x64, 0x13, 0xae, 0x87, 0x14, 0x6c, 0xf4, + 0x42, 0x57, 0xc2, 0x8b, 0x53, 0xbd, 0xcb, 0x5e, 0x1c, 0xa8, 0x2b, 0x49, 0xa6, 0xfd, 0x52, 0x3e, + 0x64, 0x3e, 0xa6, 0x0e, 0xcd, 0xfe, 0xdf, 0x1c, 0xc4, 0x8c, 0x21, 0xfa, 0x91, 0x05, 0x73, 0x24, + 0xf1, 0x2d, 0x78, 0xe0, 0x4b, 0xfe, 0x7a, 0xb6, 0x0f, 0xf4, 0x07, 0x3e, 0x25, 0x8f, 0x5e, 0xc2, + 0x92, 0x5d, 0x18, 0x1e, 0x14, 0x8a, 0xfe, 0xd0, 0x82, 0xf3, 0x64, 0xf0, 0x63, 0x7f, 0xbd, 0xe8, + 0xaf, 0x8f, 0xfd, 0x6b, 0x01, 0xd5, 0x27, 0x8f, 0x0e, 0x97, 0xd3, 0x7e, 0x06, 0x01, 0xa7, 0x89, + 0x43, 0xef, 0xc2, 0x04, 0xf1, 0x5b, 0x41, 0xd6, 0x38, 0xbb, 0xd8, 0xe0, 0x37, 0x1c, 0x22, 0xef, + 0x68, 0xcd, 0x6f, 0x31, 0x2c, 0x41, 0xed, 0x9f, 0xe7, 0x61, 0x36, 0xf9, 0x6d, 0x83, 0x2e, 0x55, + 0x9c, 0x48, 0x2d, 0x55, 0x14, 0x67, 0xa4, 0xc1, 0xc3, 0xba, 0xc1, 0xe8, 0x8c, 0x88, 0x46, 0xac, + 0x68, 0xe1, 0x19, 0x91, 0x15, 0xc7, 0x85, 0x47, 0x38, 0x23, 0xb2, 0xcc, 0x38, 0xc2, 0x42, 0x57, + 0xe2, 0x77, 0x8b, 0x9d, 0xbc, 0x5b, 0xe6, 0xcc, 0xb9, 0x8c, 0x9b, 0x8b, 0xee, 0x42, 0xd9, 0x58, + 0x07, 0x7d, 0x12, 0xaf, 0x66, 0xd6, 0x7b, 0xb4, 0xed, 0xce, 0xa9, 0x1f, 0x82, 0x88, 0x28, 0x26, + 0x7e, 0x74, 0xee, 0xa5, 0xb6, 0x1e, 0x29, 0x59, 0x2b, 0xd5, 0x65, 0xa0, 0xd9, 0xff, 0x66, 0xc1, + 0x4c, 0xac, 0x7e, 0x56, 0x48, 0x0b, 0xea, 0x94, 0xc7, 0xff, 0x69, 0x84, 0xbb, 0x21, 0x02, 0x36, + 0xd0, 0xd0, 0xf7, 0xa1, 0xdc, 0xf1, 0xdc, 0x16, 0x65, 0xbc, 0xee, 0x91, 0x3d, 0x7d, 0x4e, 0xb2, + 0xa6, 0xac, 0x16, 0x8e, 0x0e, 0x97, 0xe7, 0x37, 0x15, 0x4c, 0xcd, 0xeb, 0xf6, 0x3a, 0x94, 0xab, + 0x02, 0x73, 0x6c, 0x82, 0xcb, 0xf7, 0xdc, 0xb7, 0x89, 0x4f, 0xdb, 0x5e, 0x9f, 0xd1, 0xaf, 0xeb, + 0x7b, 0x6e, 0x38, 0xc0, 0x93, 0x7e, 0xcf, 0x8d, 0x80, 0x8f, 0x7f, 0xcf, 0x0d, 0xfb, 0x7e, 0x6d, + 0xdf, 0x73, 0xc3, 0x11, 0x0e, 0x89, 0x54, 0xfe, 0x27, 0x67, 0xcc, 0x22, 0x1e, 0xad, 0xe4, 0x1e, + 0x12, 0xad, 0xdc, 0x87, 0x29, 0xc7, 0xe5, 0xd4, 0xdf, 0x27, 0x1d, 0x9d, 0xd5, 0xce, 0xba, 0x17, + 0xc3, 0xa9, 0x6e, 0x68, 0x1c, 0x1c, 0x22, 0xa2, 0x0e, 0x5c, 0x08, 0x5e, 0x7a, 0x7c, 0x4a, 0xa2, + 0x97, 0x66, 0x5d, 0xad, 0xf5, 0x6a, 0xf0, 0x24, 0x71, 0x23, 0xad, 0xd3, 0x83, 0x61, 0x04, 0x9c, + 0x0e, 0x8a, 0x18, 0xcc, 0x30, 0x23, 0x4c, 0x0f, 0x6e, 0xc4, 0x11, 0x5f, 0xc9, 0x92, 0x99, 0x0d, + 0xa3, 0xc4, 0xcb, 0x04, 0xc5, 0x71, 0x19, 0xf6, 0x3f, 0xe7, 0xe1, 0x5c, 0x62, 0xa7, 0x25, 0xc2, + 0x91, 0xd2, 0xe3, 0x0c, 0x47, 0x8a, 0x63, 0x85, 0x23, 0xe9, 0x9e, 0xf2, 0xc4, 0x58, 0x9e, 0xf2, + 0x1b, 0xca, 0x5b, 0xd5, 0x2b, 0xb7, 0xb1, 0xae, 0x2b, 0xe2, 0x43, 0x6d, 0x6e, 0x9a, 0x44, 0x1c, + 0xef, 0x2b, 0xdd, 0x89, 0xe6, 0xe0, 0x27, 0xf6, 0xda, 0xd5, 0x7e, 0x3d, 0x6b, 0x49, 0x63, 0x08, + 0xa0, 0xdc, 0x89, 0x14, 0x02, 0x4e, 0x13, 0x57, 0xbd, 0xfd, 0xe9, 0x97, 0x4b, 0x67, 0x3e, 0xff, + 0x72, 0xe9, 0xcc, 0x17, 0x5f, 0x2e, 0x9d, 0xf9, 0xe1, 0xd1, 0x92, 0xf5, 0xe9, 0xd1, 0x92, 0xf5, + 0xf9, 0xd1, 0x92, 0xf5, 0xc5, 0xd1, 0x92, 0xf5, 0x9f, 0x47, 0x4b, 0xd6, 0x8f, 0xbf, 0x5a, 0x3a, + 0x73, 0xef, 0x99, 0x51, 0x7e, 0x7a, 0xeb, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xae, 0xe1, 0x2f, + 0xc6, 0xa1, 0x4b, 0x00, 0x00, } func (m *AnalysisRunArgument) Marshal() (dAtA []byte, err error) { @@ -4582,25 +4610,15 @@ func (m *PromotionStep) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if len(m.Inputs) > 0 { - keysForInputs := make([]string, 0, len(m.Inputs)) - for k := range m.Inputs { - keysForInputs = append(keysForInputs, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForInputs) - for iNdEx := len(keysForInputs) - 1; iNdEx >= 0; iNdEx-- { - v := m.Inputs[string(keysForInputs[iNdEx])] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintGenerated(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(keysForInputs[iNdEx]) - copy(dAtA[i:], keysForInputs[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(keysForInputs[iNdEx]))) - i-- - dAtA[i] = 0xa - i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + for iNdEx := len(m.Inputs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Inputs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0x32 } @@ -4654,6 +4672,39 @@ func (m *PromotionStep) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *PromotionStepInput) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PromotionStepInput) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PromotionStepInput) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *PromotionStepRetry) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6733,16 +6784,27 @@ func (m *PromotionStep) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } if len(m.Inputs) > 0 { - for k, v := range m.Inputs { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) - n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + for _, e := range m.Inputs { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) } } return n } +func (m *PromotionStepInput) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Value) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *PromotionStepRetry) Size() (n int) { if m == nil { return 0 @@ -7880,23 +7942,29 @@ func (this *PromotionStep) String() string { if this == nil { return "nil" } - keysForInputs := make([]string, 0, len(this.Inputs)) - for k := range this.Inputs { - keysForInputs = append(keysForInputs, k) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForInputs) - mapStringForInputs := "map[string]string{" - for _, k := range keysForInputs { - mapStringForInputs += fmt.Sprintf("%v: %v,", k, this.Inputs[k]) + repeatedStringForInputs := "[]PromotionStepInput{" + for _, f := range this.Inputs { + repeatedStringForInputs += strings.Replace(strings.Replace(f.String(), "PromotionStepInput", "PromotionStepInput", 1), `&`, ``, 1) + "," } - mapStringForInputs += "}" + repeatedStringForInputs += "}" s := strings.Join([]string{`&PromotionStep{`, `Uses:` + fmt.Sprintf("%v", this.Uses) + `,`, `As:` + fmt.Sprintf("%v", this.As) + `,`, `Config:` + strings.Replace(fmt.Sprintf("%v", this.Config), "JSON", "v11.JSON", 1) + `,`, `Retry:` + strings.Replace(this.Retry.String(), "PromotionStepRetry", "PromotionStepRetry", 1) + `,`, `Task:` + strings.Replace(this.Task.String(), "PromotionTaskReference", "PromotionTaskReference", 1) + `,`, - `Inputs:` + mapStringForInputs + `,`, + `Inputs:` + repeatedStringForInputs + `,`, + `}`, + }, "") + return s +} +func (this *PromotionStepInput) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PromotionStepInput{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, `}`, }, "") return s @@ -16106,103 +16174,124 @@ func (m *PromotionStep) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Inputs == nil { - m.Inputs = make(map[string]string) + m.Inputs = append(m.Inputs, PromotionStepInput{}) + if err := m.Inputs[len(m.Inputs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - var mapkey string - var mapvalue string - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PromotionStepInput) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PromotionStepInput: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PromotionStepInput: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthGenerated - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthGenerated - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break } } - m.Inputs[mapkey] = mapvalue + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/api/v1alpha1/generated.proto b/api/v1alpha1/generated.proto index 8033c89a4..cc1cea187 100644 --- a/api/v1alpha1/generated.proto +++ b/api/v1alpha1/generated.proto @@ -978,13 +978,13 @@ message PromotionStep { // Retry is the retry policy for this step. optional PromotionStepRetry retry = 4; - // Inputs is a map of inputs that can used to parameterize the execution + // Inputs is a list of inputs that can used to parameterize the execution // of the PromotionStep and can be referenced by expressions in the Config. // // When a PromotionStep is inflated from a PromotionTask, the inputs // specified in the PromotionTask are set based on the inputs specified // in the Config of the PromotionStep that references the PromotionTask. - map inputs = 6; + repeated PromotionStepInput inputs = 6; // Config is opaque configuration for the PromotionStep that is understood // only by each PromotionStep's implementation. It is legal to utilize @@ -993,6 +993,19 @@ message PromotionStep { optional .k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1.JSON config = 3; } +// PromotionStepInput describes a single input value for a PromotionStep that may +// be referenced by expressions in the step. +message PromotionStepInput { + // Name is the name of the input to which the value is assigned. + // + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Pattern=^[a-zA-Z_]\w*$ + optional string name = 1; + + // Value is the input value. + optional string value = 2; +} + // PromotionStepRetry describes the retry policy for a PromotionStep. message PromotionStepRetry { // Timeout is the soft maximum interval in which a step that returns a Running @@ -1053,6 +1066,7 @@ message PromotionTaskInput { // // +kubebuilder:validation:Required // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Pattern=^[a-zA-Z_]\w*$ optional string name = 1; // Default specifies a default value for the parameter. This value will be diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index aea33f347..2c14de54d 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -1081,10 +1081,8 @@ func (in *PromotionStep) DeepCopyInto(out *PromotionStep) { } if in.Inputs != nil { in, out := &in.Inputs, &out.Inputs - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } + *out = make([]PromotionStepInput, len(*in)) + copy(*out, *in) } if in.Config != nil { in, out := &in.Config, &out.Config @@ -1103,6 +1101,21 @@ func (in *PromotionStep) DeepCopy() *PromotionStep { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PromotionStepInput) DeepCopyInto(out *PromotionStepInput) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PromotionStepInput. +func (in *PromotionStepInput) DeepCopy() *PromotionStepInput { + if in == nil { + return nil + } + out := new(PromotionStepInput) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PromotionStepRetry) DeepCopyInto(out *PromotionStepRetry) { *out = *in diff --git a/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml b/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml index cb1324db2..b0099d3f7 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml @@ -71,6 +71,7 @@ spec: PromotionTask. This name can be used to reference the parameter in the PromotionTaskSpec.Steps. minLength: 1 + pattern: ^[a-zA-Z_]\w*$ type: string required: - name @@ -96,16 +97,32 @@ spec: See https://docs.kargo.io/references/expression-language for details. x-kubernetes-preserve-unknown-fields: true inputs: - additionalProperties: - type: string description: |- - Inputs is a map of inputs that can used to parameterize the execution + Inputs is a list of inputs that can used to parameterize the execution of the PromotionStep and can be referenced by expressions in the Config. When a PromotionStep is inflated from a PromotionTask, the inputs specified in the PromotionTask are set based on the inputs specified in the Config of the PromotionStep that references the PromotionTask. - type: object + items: + description: |- + PromotionStepInput describes a single input value for a PromotionStep that may + be referenced by expressions in the step. + properties: + name: + description: Name is the name of the input to which the + value is assigned. + minLength: 1 + pattern: ^[a-zA-Z_]\w*$ + type: string + value: + description: Value is the input value. + type: string + required: + - name + - value + type: object + type: array retry: description: Retry is the retry policy for this step. properties: diff --git a/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml b/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml index 746ed48e4..a7dc1ff8c 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml @@ -99,16 +99,32 @@ spec: See https://docs.kargo.io/references/expression-language for details. x-kubernetes-preserve-unknown-fields: true inputs: - additionalProperties: - type: string description: |- - Inputs is a map of inputs that can used to parameterize the execution + Inputs is a list of inputs that can used to parameterize the execution of the PromotionStep and can be referenced by expressions in the Config. When a PromotionStep is inflated from a PromotionTask, the inputs specified in the PromotionTask are set based on the inputs specified in the Config of the PromotionStep that references the PromotionTask. - type: object + items: + description: |- + PromotionStepInput describes a single input value for a PromotionStep that may + be referenced by expressions in the step. + properties: + name: + description: Name is the name of the input to which the + value is assigned. + minLength: 1 + pattern: ^[a-zA-Z_]\w*$ + type: string + value: + description: Value is the input value. + type: string + required: + - name + - value + type: object + type: array retry: description: Retry is the retry policy for this step. properties: diff --git a/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml b/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml index ef5c6d030..3103f5d06 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml @@ -71,6 +71,7 @@ spec: PromotionTask. This name can be used to reference the parameter in the PromotionTaskSpec.Steps. minLength: 1 + pattern: ^[a-zA-Z_]\w*$ type: string required: - name @@ -96,16 +97,32 @@ spec: See https://docs.kargo.io/references/expression-language for details. x-kubernetes-preserve-unknown-fields: true inputs: - additionalProperties: - type: string description: |- - Inputs is a map of inputs that can used to parameterize the execution + Inputs is a list of inputs that can used to parameterize the execution of the PromotionStep and can be referenced by expressions in the Config. When a PromotionStep is inflated from a PromotionTask, the inputs specified in the PromotionTask are set based on the inputs specified in the Config of the PromotionStep that references the PromotionTask. - type: object + items: + description: |- + PromotionStepInput describes a single input value for a PromotionStep that may + be referenced by expressions in the step. + properties: + name: + description: Name is the name of the input to which the + value is assigned. + minLength: 1 + pattern: ^[a-zA-Z_]\w*$ + type: string + value: + description: Value is the input value. + type: string + required: + - name + - value + type: object + type: array retry: description: Retry is the retry policy for this step. properties: diff --git a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml index a6b5a768f..7b90fc75d 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml @@ -89,16 +89,32 @@ spec: See https://docs.kargo.io/references/expression-language for details. x-kubernetes-preserve-unknown-fields: true inputs: - additionalProperties: - type: string description: |- - Inputs is a map of inputs that can used to parameterize the execution + Inputs is a list of inputs that can used to parameterize the execution of the PromotionStep and can be referenced by expressions in the Config. When a PromotionStep is inflated from a PromotionTask, the inputs specified in the PromotionTask are set based on the inputs specified in the Config of the PromotionStep that references the PromotionTask. - type: object + items: + description: |- + PromotionStepInput describes a single input value for a PromotionStep that may + be referenced by expressions in the step. + properties: + name: + description: Name is the name of the input to + which the value is assigned. + minLength: 1 + pattern: ^[a-zA-Z_]\w*$ + type: string + value: + description: Value is the input value. + type: string + required: + - name + - value + type: object + type: array retry: description: Retry is the retry policy for this step. properties: diff --git a/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json index a45070ad0..ad07ec6a6 100644 --- a/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json @@ -27,6 +27,7 @@ "name": { "description": "Name of the configuration parameter, which should be unique within the\nPromotionTask. This name can be used to reference the parameter in the\nPromotionTaskSpec.Steps.", "minLength": 1, + "pattern": "^[a-zA-Z_]\\w*$", "type": "string" } }, @@ -51,11 +52,28 @@ "x-kubernetes-preserve-unknown-fields": true }, "inputs": { - "additionalProperties": { - "type": "string" + "description": "Inputs is a list of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", + "items": { + "description": "PromotionStepInput describes a single input value for a PromotionStep that may\nbe referenced by expressions in the step.", + "properties": { + "name": { + "description": "Name is the name of the input to which the value is assigned.", + "minLength": 1, + "pattern": "^[a-zA-Z_]\\w*$", + "type": "string" + }, + "value": { + "description": "Value is the input value.", + "type": "string" + } + }, + "required": [ + "name", + "value" + ], + "type": "object" }, - "description": "Inputs is a map of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", - "type": "object" + "type": "array" }, "retry": { "description": "Retry is the retry policy for this step.", diff --git a/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json index 46fa32ae9..ad0bded19 100644 --- a/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json @@ -44,11 +44,28 @@ "x-kubernetes-preserve-unknown-fields": true }, "inputs": { - "additionalProperties": { - "type": "string" + "description": "Inputs is a list of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", + "items": { + "description": "PromotionStepInput describes a single input value for a PromotionStep that may\nbe referenced by expressions in the step.", + "properties": { + "name": { + "description": "Name is the name of the input to which the value is assigned.", + "minLength": 1, + "pattern": "^[a-zA-Z_]\\w*$", + "type": "string" + }, + "value": { + "description": "Value is the input value.", + "type": "string" + } + }, + "required": [ + "name", + "value" + ], + "type": "object" }, - "description": "Inputs is a map of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", - "type": "object" + "type": "array" }, "retry": { "description": "Retry is the retry policy for this step.", diff --git a/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json index 9823e792d..d717d227c 100644 --- a/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json @@ -27,6 +27,7 @@ "name": { "description": "Name of the configuration parameter, which should be unique within the\nPromotionTask. This name can be used to reference the parameter in the\nPromotionTaskSpec.Steps.", "minLength": 1, + "pattern": "^[a-zA-Z_]\\w*$", "type": "string" } }, @@ -51,11 +52,28 @@ "x-kubernetes-preserve-unknown-fields": true }, "inputs": { - "additionalProperties": { - "type": "string" + "description": "Inputs is a list of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", + "items": { + "description": "PromotionStepInput describes a single input value for a PromotionStep that may\nbe referenced by expressions in the step.", + "properties": { + "name": { + "description": "Name is the name of the input to which the value is assigned.", + "minLength": 1, + "pattern": "^[a-zA-Z_]\\w*$", + "type": "string" + }, + "value": { + "description": "Value is the input value.", + "type": "string" + } + }, + "required": [ + "name", + "value" + ], + "type": "object" }, - "description": "Inputs is a map of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", - "type": "object" + "type": "array" }, "retry": { "description": "Retry is the retry policy for this step.", diff --git a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json index 2e47fece7..a27a7ce6f 100644 --- a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json @@ -36,11 +36,28 @@ "x-kubernetes-preserve-unknown-fields": true }, "inputs": { - "additionalProperties": { - "type": "string" + "description": "Inputs is a list of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", + "items": { + "description": "PromotionStepInput describes a single input value for a PromotionStep that may\nbe referenced by expressions in the step.", + "properties": { + "name": { + "description": "Name is the name of the input to which the value is assigned.", + "minLength": 1, + "pattern": "^[a-zA-Z_]\\w*$", + "type": "string" + }, + "value": { + "description": "Value is the input value.", + "type": "string" + } + }, + "required": [ + "name", + "value" + ], + "type": "object" }, - "description": "Inputs is a map of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", - "type": "object" + "type": "array" }, "retry": { "description": "Retry is the retry policy for this step.", diff --git a/ui/src/gen/v1alpha1/generated_pb.ts b/ui/src/gen/v1alpha1/generated_pb.ts index 8c97d2db8..01b919ec3 100644 --- a/ui/src/gen/v1alpha1/generated_pb.ts +++ b/ui/src/gen/v1alpha1/generated_pb.ts @@ -18,7 +18,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file v1alpha1/generated.proto. */ export const file_v1alpha1_generated: GenFile = /*@__PURE__*/ - fileDesc("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKrAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEk0KBWl0ZW1zGAIgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrTGlzdCJJCgxDdXJyZW50U3RhZ2USOQoFc2luY2UYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSK2AgoTRGlzY292ZXJlZEFydGlmYWN0cxJACgxkaXNjb3ZlcmVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJFCgNnaXQYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0RGlzY292ZXJ5UmVzdWx0EkoKBmltYWdlcxgCIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZURpc2NvdmVyeVJlc3VsdBJKCgZjaGFydHMYAyADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnREaXNjb3ZlcnlSZXN1bHQisAEKEERpc2NvdmVyZWRDb21taXQSCgoCaWQYASABKAkSDgoGYnJhbmNoGAIgASgJEgsKA3RhZxgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEg4KBmF1dGhvchgFIAEoCRIRCgljb21taXR0ZXIYBiABKAkSPwoLY3JlYXRvckRhdGUYByABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKKAQoYRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlEgsKA3RhZxgBIAEoCRIOCgZkaWdlc3QYAiABKAkSEgoKZ2l0UmVwb1VSTBgDIAEoCRI9CgljcmVhdGVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKiAwoHRnJlaWdodBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEg0KBWFsaWFzGAcgASgJEkMKBm9yaWdpbhgJIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAyADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBSADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQSQwoGc3RhdHVzGAYgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMirQIKEUZyZWlnaHRDb2xsZWN0aW9uEgoKAmlkGAMgASgJElEKBWl0ZW1zGAEgAygLMkIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uLkl0ZW1zRW50cnkSUwoTdmVyaWZpY2F0aW9uSGlzdG9yeRgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb25JbmZvGmQKCkl0ZW1zRW50cnkSCwoDa2V5GAEgASgJEkUKBXZhbHVlGAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2U6AjgBIo0BCgtGcmVpZ2h0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0IisKDUZyZWlnaHRPcmlnaW4SDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJIqECChBGcmVpZ2h0UmVmZXJlbmNlEgwKBG5hbWUYASABKAkSQwoGb3JpZ2luGAggASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAMgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydCKcAQoORnJlaWdodFJlcXVlc3QSQwoGb3JpZ2luGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SRQoHc291cmNlcxgCIAEoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U291cmNlcyJ6Cg5GcmVpZ2h0U291cmNlcxIOCgZkaXJlY3QYASABKAgSDgoGc3RhZ2VzGAIgAygJEkgKEHJlcXVpcmVkU29ha1RpbWUYAyABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24i1wQKDUZyZWlnaHRTdGF0dXMSWQoLY3VycmVudGx5SW4YAyADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5DdXJyZW50bHlJbkVudHJ5ElcKCnZlcmlmaWVkSW4YASADKAsyQy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5WZXJpZmllZEluRW50cnkSWQoLYXBwcm92ZWRGb3IYAiADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5BcHByb3ZlZEZvckVudHJ5GmYKEEN1cnJlbnRseUluRW50cnkSCwoDa2V5GAEgASgJEkEKBXZhbHVlGAIgASgLMjIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkN1cnJlbnRTdGFnZToCOAEaZgoPVmVyaWZpZWRJbkVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmllZFN0YWdlOgI4ARpnChBBcHByb3ZlZEZvckVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BcHByb3ZlZFN0YWdlOgI4ASJ5CglHaXRDb21taXQSDwoHcmVwb1VSTBgBIAEoCRIKCgJpZBgCIAEoCRIOCgZicmFuY2gYAyABKAkSCwoDdGFnGAQgASgJEg8KB21lc3NhZ2UYBiABKAkSDgoGYXV0aG9yGAcgASgJEhEKCWNvbW1pdHRlchgIIAEoCSJuChJHaXREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRJHCgdjb21taXRzGAIgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRDb21taXQijgIKD0dpdFN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEh8KF2NvbW1pdFNlbGVjdGlvblN0cmF0ZWd5GAIgASgJEg4KBmJyYW5jaBgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAsgASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAcgASgIEhQKDGluY2x1ZGVQYXRocxgIIAMoCRIUCgxleGNsdWRlUGF0aHMYCSADKAkSFgoOZGlzY292ZXJ5TGltaXQYCiABKAUiyAEKBkhlYWx0aBIOCgZzdGF0dXMYASABKAkSDgoGaXNzdWVzGAIgAygJEk4KBmNvbmZpZxgEIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04STgoGb3V0cHV0GAUgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJvCg9IZWFsdGhDaGVja1N0ZXASDAoEdXNlcxgBIAEoCRJOCgZjb25maWcYAiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIkkKBUltYWdlEg8KB3JlcG9VUkwYASABKAkSEgoKZ2l0UmVwb1VSTBgCIAEoCRILCgN0YWcYAyABKAkSDgoGZGlnZXN0GAQgASgJIo0BChRJbWFnZURpc2NvdmVyeVJlc3VsdBIPCgdyZXBvVVJMGAEgASgJEhAKCHBsYXRmb3JtGAIgASgJElIKCnJlZmVyZW5jZXMYAyADKAsyPi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlIvkBChFJbWFnZVN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSHgoWaW1hZ2VTZWxlY3Rpb25TdHJhdGVneRgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAogASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSEAoIcGxhdGZvcm0YByABKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAggASgIEhYKDmRpc2NvdmVyeUxpbWl0GAkgASgFItMBCgdQcm9qZWN0EkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPwoEc3BlYxgCIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0U3BlYxJDCgZzdGF0dXMYAyABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFN0YXR1cyKNAQoLUHJvamVjdExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdCJfCgtQcm9qZWN0U3BlYxJQChFwcm9tb3Rpb25Qb2xpY2llcxgBIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25Qb2xpY3kidAoNUHJvamVjdFN0YXR1cxJDCgpjb25kaXRpb25zGAMgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJItkBCglQcm9tb3Rpb24SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cyKRAQoNUHJvbW90aW9uTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb24iPgoPUHJvbW90aW9uUG9saWN5Eg0KBXN0YWdlGAEgASgJEhwKFGF1dG9Qcm9tb3Rpb25FbmFibGVkGAIgASgIIvIBChJQcm9tb3Rpb25SZWZlcmVuY2USDAoEbmFtZRgBIAEoCRJHCgdmcmVpZ2h0GAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cxI+CgpmaW5pc2hlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiugEKDVByb21vdGlvblNwZWMSDQoFc3RhZ2UYASABKAkSDwoHZnJlaWdodBgCIAEoCRJFCgR2YXJzGAQgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAMgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAitwQKD1Byb21vdGlvblN0YXR1cxIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBCABKAkSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJHCgdmcmVpZ2h0GAUgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USUgoRZnJlaWdodENvbGxlY3Rpb24YByABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SSwoMaGVhbHRoQ2hlY2tzGAggAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aENoZWNrU3RlcBI+CgpmaW5pc2hlZEF0GAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSEwoLY3VycmVudFN0ZXAYCSABKAMSWgoVc3RlcEV4ZWN1dGlvbk1ldGFkYXRhGAsgAygLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0ZXBFeGVjdXRpb25NZXRhZGF0YRJNCgVzdGF0ZRgKIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ijgMKDVByb21vdGlvblN0ZXASDAoEdXNlcxgBIAEoCRJKCgR0YXNrGAUgASgLMjwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tSZWZlcmVuY2USCgoCYXMYAiABKAkSRwoFcmV0cnkYBCABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcFJldHJ5Ek8KBmlucHV0cxgGIAMoCzI/LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwLklucHV0c0VudHJ5Ek4KBmNvbmZpZxgDIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04aLQoLSW5wdXRzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJtChJQcm9tb3Rpb25TdGVwUmV0cnkSPwoHdGltZW91dBgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbhIWCg5lcnJvclRocmVzaG9sZBgCIAEoDSKaAQoNUHJvbW90aW9uVGFzaxJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkUKBHNwZWMYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza1NwZWMiMwoSUHJvbW90aW9uVGFza0lucHV0EgwKBG5hbWUYASABKAkSDwoHZGVmYXVsdBgCIAEoCSKdAQoRUHJvbW90aW9uVGFza0xpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESRgoFaXRlbXMYAiADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza0xpc3QiNAoWUHJvbW90aW9uVGFza1JlZmVyZW5jZRIMCgRuYW1lGAEgASgJEgwKBGtpbmQYAiABKAkioQEKEVByb21vdGlvblRhc2tTcGVjEkgKBmlucHV0cxgBIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrSW5wdXQSQgoFc3RlcHMYAiADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCJeChFQcm9tb3Rpb25UZW1wbGF0ZRJJCgRzcGVjGAEgASgLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRlbXBsYXRlU3BlYyKiAQoVUHJvbW90aW9uVGVtcGxhdGVTcGVjEkUKBHZhcnMYAiADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVmFyaWFibGUSQgoFc3RlcHMYASADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCIwChFQcm9tb3Rpb25WYXJpYWJsZRIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJIuYBChBSZXBvU3Vic2NyaXB0aW9uEkIKA2dpdBgBIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRTdWJzY3JpcHRpb24SRgoFaW1hZ2UYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2VTdWJzY3JpcHRpb24SRgoFY2hhcnQYAyABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnRTdWJzY3JpcHRpb24izQEKBVN0YWdlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPQoEc3BlYxgCIAEoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVNwZWMSQQoGc3RhdHVzGAMgASgLMjEuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlU3RhdHVzIokBCglTdGFnZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESOgoFaXRlbXMYAiADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2UiiAIKCVN0YWdlU3BlYxINCgVzaGFyZBgEIAEoCRJOChByZXF1ZXN0ZWRGcmVpZ2h0GAUgAygLMjQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZXF1ZXN0ElIKEXByb21vdGlvblRlbXBsYXRlGAYgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRlbXBsYXRlEkgKDHZlcmlmaWNhdGlvbhgDIAEoCzIyLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb24i9gMKC1N0YWdlU3RhdHVzEkMKCmNvbmRpdGlvbnMYDSADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgLIAEoCRINCgVwaGFzZRgBIAEoCRJPCg5mcmVpZ2h0SGlzdG9yeRgEIAMoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0Q29sbGVjdGlvbhIWCg5mcmVpZ2h0U3VtbWFyeRgMIAEoCRI8CgZoZWFsdGgYCCABKAsyLC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSGVhbHRoEg8KB21lc3NhZ2UYCSABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAYgASgDElIKEGN1cnJlbnRQcm9tb3Rpb24YByABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUmVmZXJlbmNlEk8KDWxhc3RQcm9tb3Rpb24YCiABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUmVmZXJlbmNlItoBChVTdGVwRXhlY3V0aW9uTWV0YWRhdGESDQoFYWxpYXMYASABKAkSPQoJc3RhcnRlZEF0GAIgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSPgoKZmluaXNoZWRBdBgDIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhIKCmVycm9yQ291bnQYBCABKA0SDgoGc3RhdHVzGAUgASgJEg8KB21lc3NhZ2UYBiABKAkiiwIKDFZlcmlmaWNhdGlvbhJaChFhbmFseXNpc1RlbXBsYXRlcxgBIAMoCzI/LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1RlbXBsYXRlUmVmZXJlbmNlElYKE2FuYWx5c2lzUnVuTWV0YWRhdGEYAiABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YRJHCgRhcmdzGAMgAygLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuQXJndW1lbnQinQIKEFZlcmlmaWNhdGlvbkluZm8SCgoCaWQYBCABKAkSDQoFYWN0b3IYByABKAkSPQoJc3RhcnRUaW1lGAUgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJPCgthbmFseXNpc1J1bhgDIAEoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1blJlZmVyZW5jZRI+CgpmaW5pc2hUaW1lGAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUilAEKDVZlcmlmaWVkU3RhZ2USPgoKdmVyaWZpZWRBdBgBIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEkMKC2xvbmdlc3RTb2FrGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uItkBCglXYXJlaG91c2USQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVN0YXR1cyKRAQoNV2FyZWhvdXNlTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2UizgEKDVdhcmVob3VzZVNwZWMSDQoFc2hhcmQYAiABKAkSQAoIaW50ZXJ2YWwYBCABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SHQoVZnJlaWdodENyZWF0aW9uUG9saWN5GAMgASgJEk0KDXN1YnNjcmlwdGlvbnMYASADKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUmVwb1N1YnNjcmlwdGlvbiL9AQoPV2FyZWhvdXNlU3RhdHVzEkMKCmNvbmRpdGlvbnMYCSADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgGIAEoCRIaChJvYnNlcnZlZEdlbmVyYXRpb24YBCABKAMSFQoNbGFzdEZyZWlnaHRJRBgIIAEoCRJWChNkaXNjb3ZlcmVkQXJ0aWZhY3RzGAcgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRBcnRpZmFjdHNClwIKKGNvbS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTFCDkdlbmVyYXRlZFByb3RvUAFaJGdpdGh1Yi5jb20vYWt1aXR5L2thcmdvL2FwaS92MWFscGhhMaICBUdDQUtBqgIkR2l0aHViLkNvbS5Ba3VpdHkuS2FyZ28uQXBpLlYxYWxwaGExygIkR2l0aHViXENvbVxBa3VpdHlcS2FyZ29cQXBpXFYxYWxwaGEx4gIwR2l0aHViXENvbVxBa3VpdHlcS2FyZ29cQXBpXFYxYWxwaGExXEdQQk1ldGFkYXRh6gIpR2l0aHViOjpDb206OkFrdWl0eTo6S2FyZ286OkFwaTo6VjFhbHBoYTE", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]); + fileDesc("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKrAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEk0KBWl0ZW1zGAIgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrTGlzdCJJCgxDdXJyZW50U3RhZ2USOQoFc2luY2UYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSK2AgoTRGlzY292ZXJlZEFydGlmYWN0cxJACgxkaXNjb3ZlcmVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJFCgNnaXQYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0RGlzY292ZXJ5UmVzdWx0EkoKBmltYWdlcxgCIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZURpc2NvdmVyeVJlc3VsdBJKCgZjaGFydHMYAyADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnREaXNjb3ZlcnlSZXN1bHQisAEKEERpc2NvdmVyZWRDb21taXQSCgoCaWQYASABKAkSDgoGYnJhbmNoGAIgASgJEgsKA3RhZxgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEg4KBmF1dGhvchgFIAEoCRIRCgljb21taXR0ZXIYBiABKAkSPwoLY3JlYXRvckRhdGUYByABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKKAQoYRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlEgsKA3RhZxgBIAEoCRIOCgZkaWdlc3QYAiABKAkSEgoKZ2l0UmVwb1VSTBgDIAEoCRI9CgljcmVhdGVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKiAwoHRnJlaWdodBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEg0KBWFsaWFzGAcgASgJEkMKBm9yaWdpbhgJIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAyADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBSADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQSQwoGc3RhdHVzGAYgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMirQIKEUZyZWlnaHRDb2xsZWN0aW9uEgoKAmlkGAMgASgJElEKBWl0ZW1zGAEgAygLMkIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uLkl0ZW1zRW50cnkSUwoTdmVyaWZpY2F0aW9uSGlzdG9yeRgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb25JbmZvGmQKCkl0ZW1zRW50cnkSCwoDa2V5GAEgASgJEkUKBXZhbHVlGAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2U6AjgBIo0BCgtGcmVpZ2h0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0IisKDUZyZWlnaHRPcmlnaW4SDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJIqECChBGcmVpZ2h0UmVmZXJlbmNlEgwKBG5hbWUYASABKAkSQwoGb3JpZ2luGAggASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAMgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydCKcAQoORnJlaWdodFJlcXVlc3QSQwoGb3JpZ2luGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SRQoHc291cmNlcxgCIAEoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U291cmNlcyJ6Cg5GcmVpZ2h0U291cmNlcxIOCgZkaXJlY3QYASABKAgSDgoGc3RhZ2VzGAIgAygJEkgKEHJlcXVpcmVkU29ha1RpbWUYAyABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24i1wQKDUZyZWlnaHRTdGF0dXMSWQoLY3VycmVudGx5SW4YAyADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5DdXJyZW50bHlJbkVudHJ5ElcKCnZlcmlmaWVkSW4YASADKAsyQy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5WZXJpZmllZEluRW50cnkSWQoLYXBwcm92ZWRGb3IYAiADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5BcHByb3ZlZEZvckVudHJ5GmYKEEN1cnJlbnRseUluRW50cnkSCwoDa2V5GAEgASgJEkEKBXZhbHVlGAIgASgLMjIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkN1cnJlbnRTdGFnZToCOAEaZgoPVmVyaWZpZWRJbkVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmllZFN0YWdlOgI4ARpnChBBcHByb3ZlZEZvckVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BcHByb3ZlZFN0YWdlOgI4ASJ5CglHaXRDb21taXQSDwoHcmVwb1VSTBgBIAEoCRIKCgJpZBgCIAEoCRIOCgZicmFuY2gYAyABKAkSCwoDdGFnGAQgASgJEg8KB21lc3NhZ2UYBiABKAkSDgoGYXV0aG9yGAcgASgJEhEKCWNvbW1pdHRlchgIIAEoCSJuChJHaXREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRJHCgdjb21taXRzGAIgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRDb21taXQijgIKD0dpdFN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEh8KF2NvbW1pdFNlbGVjdGlvblN0cmF0ZWd5GAIgASgJEg4KBmJyYW5jaBgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAsgASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAcgASgIEhQKDGluY2x1ZGVQYXRocxgIIAMoCRIUCgxleGNsdWRlUGF0aHMYCSADKAkSFgoOZGlzY292ZXJ5TGltaXQYCiABKAUiyAEKBkhlYWx0aBIOCgZzdGF0dXMYASABKAkSDgoGaXNzdWVzGAIgAygJEk4KBmNvbmZpZxgEIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04STgoGb3V0cHV0GAUgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJvCg9IZWFsdGhDaGVja1N0ZXASDAoEdXNlcxgBIAEoCRJOCgZjb25maWcYAiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIkkKBUltYWdlEg8KB3JlcG9VUkwYASABKAkSEgoKZ2l0UmVwb1VSTBgCIAEoCRILCgN0YWcYAyABKAkSDgoGZGlnZXN0GAQgASgJIo0BChRJbWFnZURpc2NvdmVyeVJlc3VsdBIPCgdyZXBvVVJMGAEgASgJEhAKCHBsYXRmb3JtGAIgASgJElIKCnJlZmVyZW5jZXMYAyADKAsyPi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlIvkBChFJbWFnZVN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSHgoWaW1hZ2VTZWxlY3Rpb25TdHJhdGVneRgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAogASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSEAoIcGxhdGZvcm0YByABKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAggASgIEhYKDmRpc2NvdmVyeUxpbWl0GAkgASgFItMBCgdQcm9qZWN0EkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPwoEc3BlYxgCIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0U3BlYxJDCgZzdGF0dXMYAyABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFN0YXR1cyKNAQoLUHJvamVjdExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdCJfCgtQcm9qZWN0U3BlYxJQChFwcm9tb3Rpb25Qb2xpY2llcxgBIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25Qb2xpY3kidAoNUHJvamVjdFN0YXR1cxJDCgpjb25kaXRpb25zGAMgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJItkBCglQcm9tb3Rpb24SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cyKRAQoNUHJvbW90aW9uTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb24iPgoPUHJvbW90aW9uUG9saWN5Eg0KBXN0YWdlGAEgASgJEhwKFGF1dG9Qcm9tb3Rpb25FbmFibGVkGAIgASgIIvIBChJQcm9tb3Rpb25SZWZlcmVuY2USDAoEbmFtZRgBIAEoCRJHCgdmcmVpZ2h0GAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cxI+CgpmaW5pc2hlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiugEKDVByb21vdGlvblNwZWMSDQoFc3RhZ2UYASABKAkSDwoHZnJlaWdodBgCIAEoCRJFCgR2YXJzGAQgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAMgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAitwQKD1Byb21vdGlvblN0YXR1cxIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBCABKAkSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJHCgdmcmVpZ2h0GAUgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USUgoRZnJlaWdodENvbGxlY3Rpb24YByABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SSwoMaGVhbHRoQ2hlY2tzGAggAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aENoZWNrU3RlcBI+CgpmaW5pc2hlZEF0GAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSEwoLY3VycmVudFN0ZXAYCSABKAMSWgoVc3RlcEV4ZWN1dGlvbk1ldGFkYXRhGAsgAygLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0ZXBFeGVjdXRpb25NZXRhZGF0YRJNCgVzdGF0ZRgKIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04i2AIKDVByb21vdGlvblN0ZXASDAoEdXNlcxgBIAEoCRJKCgR0YXNrGAUgASgLMjwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tSZWZlcmVuY2USCgoCYXMYAiABKAkSRwoFcmV0cnkYBCABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcFJldHJ5EkgKBmlucHV0cxgGIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwSW5wdXQSTgoGY29uZmlnGAMgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiIxChJQcm9tb3Rpb25TdGVwSW5wdXQSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSJtChJQcm9tb3Rpb25TdGVwUmV0cnkSPwoHdGltZW91dBgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbhIWCg5lcnJvclRocmVzaG9sZBgCIAEoDSKaAQoNUHJvbW90aW9uVGFzaxJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkUKBHNwZWMYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza1NwZWMiMwoSUHJvbW90aW9uVGFza0lucHV0EgwKBG5hbWUYASABKAkSDwoHZGVmYXVsdBgCIAEoCSKdAQoRUHJvbW90aW9uVGFza0xpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESRgoFaXRlbXMYAiADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza0xpc3QiNAoWUHJvbW90aW9uVGFza1JlZmVyZW5jZRIMCgRuYW1lGAEgASgJEgwKBGtpbmQYAiABKAkioQEKEVByb21vdGlvblRhc2tTcGVjEkgKBmlucHV0cxgBIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrSW5wdXQSQgoFc3RlcHMYAiADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCJeChFQcm9tb3Rpb25UZW1wbGF0ZRJJCgRzcGVjGAEgASgLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRlbXBsYXRlU3BlYyKiAQoVUHJvbW90aW9uVGVtcGxhdGVTcGVjEkUKBHZhcnMYAiADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVmFyaWFibGUSQgoFc3RlcHMYASADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCIwChFQcm9tb3Rpb25WYXJpYWJsZRIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJIuYBChBSZXBvU3Vic2NyaXB0aW9uEkIKA2dpdBgBIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRTdWJzY3JpcHRpb24SRgoFaW1hZ2UYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2VTdWJzY3JpcHRpb24SRgoFY2hhcnQYAyABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnRTdWJzY3JpcHRpb24izQEKBVN0YWdlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPQoEc3BlYxgCIAEoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVNwZWMSQQoGc3RhdHVzGAMgASgLMjEuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlU3RhdHVzIokBCglTdGFnZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESOgoFaXRlbXMYAiADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2UiiAIKCVN0YWdlU3BlYxINCgVzaGFyZBgEIAEoCRJOChByZXF1ZXN0ZWRGcmVpZ2h0GAUgAygLMjQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZXF1ZXN0ElIKEXByb21vdGlvblRlbXBsYXRlGAYgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRlbXBsYXRlEkgKDHZlcmlmaWNhdGlvbhgDIAEoCzIyLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb24i9gMKC1N0YWdlU3RhdHVzEkMKCmNvbmRpdGlvbnMYDSADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgLIAEoCRINCgVwaGFzZRgBIAEoCRJPCg5mcmVpZ2h0SGlzdG9yeRgEIAMoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0Q29sbGVjdGlvbhIWCg5mcmVpZ2h0U3VtbWFyeRgMIAEoCRI8CgZoZWFsdGgYCCABKAsyLC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSGVhbHRoEg8KB21lc3NhZ2UYCSABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAYgASgDElIKEGN1cnJlbnRQcm9tb3Rpb24YByABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUmVmZXJlbmNlEk8KDWxhc3RQcm9tb3Rpb24YCiABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUmVmZXJlbmNlItoBChVTdGVwRXhlY3V0aW9uTWV0YWRhdGESDQoFYWxpYXMYASABKAkSPQoJc3RhcnRlZEF0GAIgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSPgoKZmluaXNoZWRBdBgDIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhIKCmVycm9yQ291bnQYBCABKA0SDgoGc3RhdHVzGAUgASgJEg8KB21lc3NhZ2UYBiABKAkiiwIKDFZlcmlmaWNhdGlvbhJaChFhbmFseXNpc1RlbXBsYXRlcxgBIAMoCzI/LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1RlbXBsYXRlUmVmZXJlbmNlElYKE2FuYWx5c2lzUnVuTWV0YWRhdGEYAiABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YRJHCgRhcmdzGAMgAygLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuQXJndW1lbnQinQIKEFZlcmlmaWNhdGlvbkluZm8SCgoCaWQYBCABKAkSDQoFYWN0b3IYByABKAkSPQoJc3RhcnRUaW1lGAUgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJPCgthbmFseXNpc1J1bhgDIAEoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1blJlZmVyZW5jZRI+CgpmaW5pc2hUaW1lGAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUilAEKDVZlcmlmaWVkU3RhZ2USPgoKdmVyaWZpZWRBdBgBIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEkMKC2xvbmdlc3RTb2FrGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uItkBCglXYXJlaG91c2USQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVN0YXR1cyKRAQoNV2FyZWhvdXNlTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2UizgEKDVdhcmVob3VzZVNwZWMSDQoFc2hhcmQYAiABKAkSQAoIaW50ZXJ2YWwYBCABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SHQoVZnJlaWdodENyZWF0aW9uUG9saWN5GAMgASgJEk0KDXN1YnNjcmlwdGlvbnMYASADKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUmVwb1N1YnNjcmlwdGlvbiL9AQoPV2FyZWhvdXNlU3RhdHVzEkMKCmNvbmRpdGlvbnMYCSADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgGIAEoCRIaChJvYnNlcnZlZEdlbmVyYXRpb24YBCABKAMSFQoNbGFzdEZyZWlnaHRJRBgIIAEoCRJWChNkaXNjb3ZlcmVkQXJ0aWZhY3RzGAcgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRBcnRpZmFjdHNClwIKKGNvbS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTFCDkdlbmVyYXRlZFByb3RvUAFaJGdpdGh1Yi5jb20vYWt1aXR5L2thcmdvL2FwaS92MWFscGhhMaICBUdDQUtBqgIkR2l0aHViLkNvbS5Ba3VpdHkuS2FyZ28uQXBpLlYxYWxwaGExygIkR2l0aHViXENvbVxBa3VpdHlcS2FyZ29cQXBpXFYxYWxwaGEx4gIwR2l0aHViXENvbVxBa3VpdHlcS2FyZ29cQXBpXFYxYWxwaGExXEdQQk1ldGFkYXRh6gIpR2l0aHViOjpDb206OkFrdWl0eTo6S2FyZ286OkFwaTo6VjFhbHBoYTE", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]); /** * AnalysisRunArgument represents an argument to be added to an AnalysisRun. @@ -2072,16 +2072,16 @@ export type PromotionStep = Message<"github.com.akuity.kargo.api.v1alpha1.Promot retry?: PromotionStepRetry; /** - * Inputs is a map of inputs that can used to parameterize the execution + * Inputs is a list of inputs that can used to parameterize the execution * of the PromotionStep and can be referenced by expressions in the Config. * * When a PromotionStep is inflated from a PromotionTask, the inputs * specified in the PromotionTask are set based on the inputs specified * in the Config of the PromotionStep that references the PromotionTask. * - * @generated from field: map inputs = 6; + * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionStepInput inputs = 6; */ - inputs: { [key: string]: string }; + inputs: PromotionStepInput[]; /** * Config is opaque configuration for the PromotionStep that is understood @@ -2101,6 +2101,38 @@ export type PromotionStep = Message<"github.com.akuity.kargo.api.v1alpha1.Promot export const PromotionStepSchema: GenMessage = /*@__PURE__*/ messageDesc(file_v1alpha1_generated, 43); +/** + * PromotionStepInput describes a single input value for a PromotionStep that may + * be referenced by expressions in the step. + * + * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionStepInput + */ +export type PromotionStepInput = Message<"github.com.akuity.kargo.api.v1alpha1.PromotionStepInput"> & { + /** + * Name is the name of the input to which the value is assigned. + * + * +kubebuilder:validation:MinLength=1 + * +kubebuilder:validation:Pattern=^[a-zA-Z_]\w*$ + * + * @generated from field: optional string name = 1; + */ + name: string; + + /** + * Value is the input value. + * + * @generated from field: optional string value = 2; + */ + value: string; +}; + +/** + * Describes the message github.com.akuity.kargo.api.v1alpha1.PromotionStepInput. + * Use `create(PromotionStepInputSchema)` to create a new message. + */ +export const PromotionStepInputSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_v1alpha1_generated, 44); + /** * PromotionStepRetry describes the retry policy for a PromotionStep. * @@ -2158,7 +2190,7 @@ export type PromotionStepRetry = Message<"github.com.akuity.kargo.api.v1alpha1.P * Use `create(PromotionStepRetrySchema)` to create a new message. */ export const PromotionStepRetrySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 44); + messageDesc(file_v1alpha1_generated, 45); /** * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionTask @@ -2185,7 +2217,7 @@ export type PromotionTask = Message<"github.com.akuity.kargo.api.v1alpha1.Promot * Use `create(PromotionTaskSchema)` to create a new message. */ export const PromotionTaskSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 45); + messageDesc(file_v1alpha1_generated, 46); /** * PromotionTaskInput defines an input parameter for a PromotionTask. This input @@ -2202,6 +2234,7 @@ export type PromotionTaskInput = Message<"github.com.akuity.kargo.api.v1alpha1.P * * +kubebuilder:validation:Required * +kubebuilder:validation:MinLength=1 + * +kubebuilder:validation:Pattern=^[a-zA-Z_]\w*$ * * @generated from field: optional string name = 1; */ @@ -2225,7 +2258,7 @@ export type PromotionTaskInput = Message<"github.com.akuity.kargo.api.v1alpha1.P * Use `create(PromotionTaskInputSchema)` to create a new message. */ export const PromotionTaskInputSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 46); + messageDesc(file_v1alpha1_generated, 47); /** * PromotionTaskList contains a list of PromotionTasks. @@ -2249,7 +2282,7 @@ export type PromotionTaskList = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionTaskListSchema)` to create a new message. */ export const PromotionTaskListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 47); + messageDesc(file_v1alpha1_generated, 48); /** * PromotionTaskReference describes a reference to a PromotionTask. @@ -2286,7 +2319,7 @@ export type PromotionTaskReference = Message<"github.com.akuity.kargo.api.v1alph * Use `create(PromotionTaskReferenceSchema)` to create a new message. */ export const PromotionTaskReferenceSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 48); + messageDesc(file_v1alpha1_generated, 49); /** * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionTaskSpec @@ -2321,7 +2354,7 @@ export type PromotionTaskSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionTaskSpecSchema)` to create a new message. */ export const PromotionTaskSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 49); + messageDesc(file_v1alpha1_generated, 50); /** * PromotionTemplate defines a template for a Promotion that can be used to @@ -2341,7 +2374,7 @@ export type PromotionTemplate = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionTemplateSchema)` to create a new message. */ export const PromotionTemplateSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 50); + messageDesc(file_v1alpha1_generated, 51); /** * PromotionTemplateSpec describes the (partial) specification of a Promotion @@ -2377,7 +2410,7 @@ export type PromotionTemplateSpec = Message<"github.com.akuity.kargo.api.v1alpha * Use `create(PromotionTemplateSpecSchema)` to create a new message. */ export const PromotionTemplateSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 51); + messageDesc(file_v1alpha1_generated, 52); /** * PromotionVariable describes a single variable that may be referenced by @@ -2411,7 +2444,7 @@ export type PromotionVariable = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionVariableSchema)` to create a new message. */ export const PromotionVariableSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 52); + messageDesc(file_v1alpha1_generated, 53); /** * RepoSubscription describes a subscription to ONE OF a Git repository, a @@ -2447,7 +2480,7 @@ export type RepoSubscription = Message<"github.com.akuity.kargo.api.v1alpha1.Rep * Use `create(RepoSubscriptionSchema)` to create a new message. */ export const RepoSubscriptionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 53); + messageDesc(file_v1alpha1_generated, 54); /** * Stage is the Kargo API's main type. @@ -2483,7 +2516,7 @@ export type Stage = Message<"github.com.akuity.kargo.api.v1alpha1.Stage"> & { * Use `create(StageSchema)` to create a new message. */ export const StageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 54); + messageDesc(file_v1alpha1_generated, 55); /** * StageList is a list of Stage resources. @@ -2507,7 +2540,7 @@ export type StageList = Message<"github.com.akuity.kargo.api.v1alpha1.StageList" * Use `create(StageListSchema)` to create a new message. */ export const StageListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 55); + messageDesc(file_v1alpha1_generated, 56); /** * StageSpec describes the sources of Freight used by a Stage and how to @@ -2565,7 +2598,7 @@ export type StageSpec = Message<"github.com.akuity.kargo.api.v1alpha1.StageSpec" * Use `create(StageSpecSchema)` to create a new message. */ export const StageSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 56); + messageDesc(file_v1alpha1_generated, 57); /** * StageStatus describes a Stages's current and recent Freight, health, and @@ -2672,7 +2705,7 @@ export type StageStatus = Message<"github.com.akuity.kargo.api.v1alpha1.StageSta * Use `create(StageStatusSchema)` to create a new message. */ export const StageStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 57); + messageDesc(file_v1alpha1_generated, 58); /** * StepExecutionMetadata tracks metadata pertaining to the execution of @@ -2731,7 +2764,7 @@ export type StepExecutionMetadata = Message<"github.com.akuity.kargo.api.v1alpha * Use `create(StepExecutionMetadataSchema)` to create a new message. */ export const StepExecutionMetadataSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 58); + messageDesc(file_v1alpha1_generated, 59); /** * Verification describes how to verify that a Promotion has been successful @@ -2770,7 +2803,7 @@ export type Verification = Message<"github.com.akuity.kargo.api.v1alpha1.Verific * Use `create(VerificationSchema)` to create a new message. */ export const VerificationSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 59); + messageDesc(file_v1alpha1_generated, 60); /** * VerificationInfo contains the details of an instance of a Verification @@ -2840,7 +2873,7 @@ export type VerificationInfo = Message<"github.com.akuity.kargo.api.v1alpha1.Ver * Use `create(VerificationInfoSchema)` to create a new message. */ export const VerificationInfoSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 60); + messageDesc(file_v1alpha1_generated, 61); /** * VerifiedStage describes a Stage in which Freight has been verified. @@ -2872,7 +2905,7 @@ export type VerifiedStage = Message<"github.com.akuity.kargo.api.v1alpha1.Verifi * Use `create(VerifiedStageSchema)` to create a new message. */ export const VerifiedStageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 61); + messageDesc(file_v1alpha1_generated, 62); /** * Warehouse is a source of Freight. @@ -2907,7 +2940,7 @@ export type Warehouse = Message<"github.com.akuity.kargo.api.v1alpha1.Warehouse" * Use `create(WarehouseSchema)` to create a new message. */ export const WarehouseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 62); + messageDesc(file_v1alpha1_generated, 63); /** * WarehouseList is a list of Warehouse resources. @@ -2931,7 +2964,7 @@ export type WarehouseList = Message<"github.com.akuity.kargo.api.v1alpha1.Wareho * Use `create(WarehouseListSchema)` to create a new message. */ export const WarehouseListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 63); + messageDesc(file_v1alpha1_generated, 64); /** * WarehouseSpec describes sources of versioned artifacts to be included in @@ -2997,7 +3030,7 @@ export type WarehouseSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Wareho * Use `create(WarehouseSpecSchema)` to create a new message. */ export const WarehouseSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 64); + messageDesc(file_v1alpha1_generated, 65); /** * WarehouseStatus describes a Warehouse's most recently observed state. @@ -3056,5 +3089,5 @@ export type WarehouseStatus = Message<"github.com.akuity.kargo.api.v1alpha1.Ware * Use `create(WarehouseStatusSchema)` to create a new message. */ export const WarehouseStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 65); + messageDesc(file_v1alpha1_generated, 66); From 1510b7b0dd0b3f4416dff45960c564b4fb06a94d Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Fri, 13 Dec 2024 12:09:59 +0100 Subject: [PATCH 16/38] chore(directives): wire inputs into engine Signed-off-by: Hidde Beydals --- internal/controller/promotions/promotions.go | 1 + internal/directives/promotions.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/internal/controller/promotions/promotions.go b/internal/controller/promotions/promotions.go index 26604c080..3f950b75d 100644 --- a/internal/controller/promotions/promotions.go +++ b/internal/controller/promotions/promotions.go @@ -471,6 +471,7 @@ func (r *reconciler) promote( Kind: step.Uses, Alias: step.As, Retry: step.Retry, + Inputs: step.Inputs, Config: step.Config.Raw, } } diff --git a/internal/directives/promotions.go b/internal/directives/promotions.go index a4af12e14..f14caac46 100644 --- a/internal/directives/promotions.go +++ b/internal/directives/promotions.go @@ -96,6 +96,8 @@ type PromotionStep struct { Alias string // Retry is the retry configuration for the PromotionStep. Retry *kargoapi.PromotionStepRetry + // Inputs is a list of inputs to be made available to the Config of this step. + Inputs []kargoapi.PromotionStepInput // Config is an opaque JSON to be passed to the PromotionStepRunner executing // this step. Config []byte @@ -144,6 +146,8 @@ func (s *PromotionStep) GetConfig( return nil, err } + inputs := s.GetInputs() + evaledCfgJSON, err := expressions.EvaluateJSONTemplate( s.Config, map[string]any{ @@ -153,6 +157,7 @@ func (s *PromotionStep) GetConfig( "stage": promoCtx.Stage, }, "vars": vars, + "inputs": inputs, "secrets": promoCtx.Secrets, "outputs": state, }, @@ -212,6 +217,15 @@ func (s *PromotionStep) GetVars(promoCtx PromotionContext) (map[string]any, erro return vars, nil } +// GetInputs returns the inputs of the PromotionStep as a map. +func (s *PromotionStep) GetInputs() map[string]any { + inputs := make(map[string]any, len(s.Inputs)) + for _, i := range s.Inputs { + inputs[i.Name] = i.Value + } + return inputs +} + // PromotionResult is the result of a user-defined promotion process executed by // the Engine. It aggregates the status and output of the individual // PromotionStepResults returned by the PromotionStepRunner executing each From 72d06cb182325aad64ddf4ae0f3c59fb4d6ab909 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Fri, 13 Dec 2024 14:10:27 +0100 Subject: [PATCH 17/38] feat(directives): add `compose-output` directive Signed-off-by: Hidde Beydals --- internal/directives/output_composer.go | 70 +++++++++++++++++++ .../directives/schemas/compose-output.json | 6 ++ internal/directives/zz_config_types.go | 2 + ui/src/gen/directives/compose-output.json | 6 ++ 4 files changed, 84 insertions(+) create mode 100644 internal/directives/output_composer.go create mode 100644 internal/directives/schemas/compose-output.json create mode 100644 ui/src/gen/directives/compose-output.json diff --git a/internal/directives/output_composer.go b/internal/directives/output_composer.go new file mode 100644 index 000000000..3ece6bcdc --- /dev/null +++ b/internal/directives/output_composer.go @@ -0,0 +1,70 @@ +package directives + +import ( + "context" + "fmt" + "maps" + + "github.com/xeipuuv/gojsonschema" + + kargoapi "github.com/akuity/kargo/api/v1alpha1" +) + +func init() { + builtins.RegisterPromotionStepRunner(newOutputComposer(), nil) +} + +// outputComposer is an implementation of the PromotionStepRunner interface +// that allows composing outputs from previous steps into new outputs. +// +// It works based on the PromotionStepContext.Config field allowing to an +// arbitrary number of key-value pairs to be exported as outputs. +// Because the values are allowed to be expressions and can contain +// references to outputs from previous steps, this allows for remapping +// the outputs of previous steps to new keys, or even combining them +// into new structures. +type outputComposer struct { + schemaLoader gojsonschema.JSONLoader +} + +// newOutputComposer returns an implementation of the PromotionStepRunner +// interface that composes output from previous steps into new output. +func newOutputComposer() PromotionStepRunner { + r := &outputComposer{} + r.schemaLoader = getConfigSchemaLoader(r.Name()) + return r +} + +// Name implements the PromotionStepRunner interface. +func (c *outputComposer) Name() string { + return "compose-output" +} + +// RunPromotionStep implements the PromotionStepRunner interface. +func (c *outputComposer) RunPromotionStep( + _ context.Context, + stepCtx *PromotionStepContext, +) (PromotionStepResult, error) { + // Validate the configuration against the JSON Schema. + if err := validate(c.schemaLoader, gojsonschema.NewGoLoader(stepCtx.Config), c.Name()); err != nil { + return PromotionStepResult{Status: kargoapi.PromotionPhaseErrored}, err + } + + // Convert the configuration into a typed object. + cfg, err := ConfigToStruct[ComposeOutput](stepCtx.Config) + if err != nil { + return PromotionStepResult{Status: kargoapi.PromotionPhaseErrored}, + fmt.Errorf("could not convert config into %s config: %w", c.Name(), err) + } + + return c.runPromotionStep(cfg) +} + +func (c *outputComposer) runPromotionStep( + cfg ComposeOutput, +) (PromotionStepResult, error) { + return PromotionStepResult{ + Status: kargoapi.PromotionPhaseSucceeded, + Output: maps.Clone(cfg), + }, nil +} diff --git a/internal/directives/schemas/compose-output.json b/internal/directives/schemas/compose-output.json new file mode 100644 index 000000000..76421df1d --- /dev/null +++ b/internal/directives/schemas/compose-output.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ComposeOutput", + "type": "object", + "minProperties": 1 +} diff --git a/internal/directives/zz_config_types.go b/internal/directives/zz_config_types.go index e5c5e394c..9f8fb08bd 100644 --- a/internal/directives/zz_config_types.go +++ b/internal/directives/zz_config_types.go @@ -4,6 +4,8 @@ package directives type CommonDefs interface{} +type ComposeOutput map[string]interface{} + type ArgoCDUpdateConfig struct { Apps []ArgoCDAppUpdate `json:"apps"` FromOrigin *AppFromOrigin `json:"fromOrigin,omitempty"` diff --git a/ui/src/gen/directives/compose-output.json b/ui/src/gen/directives/compose-output.json new file mode 100644 index 000000000..b168b74f6 --- /dev/null +++ b/ui/src/gen/directives/compose-output.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ComposeOutput", + "type": "object", + "minProperties": 1 +} \ No newline at end of file From 87631ddde2ad28d321c16d35f591f295c58a4691 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Mon, 16 Dec 2024 17:24:34 +0100 Subject: [PATCH 18/38] chore(api): `Inputs` -> `Vars` Signed-off-by: Hidde Beydals --- api/v1alpha1/promotion_task_types.go | 36 ++++++---------------------- api/v1alpha1/promotion_types.go | 29 +++++----------------- 2 files changed, 13 insertions(+), 52 deletions(-) diff --git a/api/v1alpha1/promotion_task_types.go b/api/v1alpha1/promotion_task_types.go index 281eb0b1f..0b5f9eed3 100644 --- a/api/v1alpha1/promotion_task_types.go +++ b/api/v1alpha1/promotion_task_types.go @@ -12,50 +12,28 @@ type PromotionTask struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // Spec describes the composition of a PromotionTask, including the inputs - // available to the task and the steps. + // Spec describes the composition of a PromotionTask, including the + // variables available to the task and the steps. // // +kubebuilder:validation:Required Spec PromotionTaskSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"` } type PromotionTaskSpec struct { - // Inputs specifies the inputs available to the PromotionTask. These inputs - // can be specified in the PromotionTemplate as configuration for the task, - // and can be used in the Steps to parameterize the execution of the task. - Inputs []PromotionTaskInput `json:"inputs,omitempty" protobuf:"bytes,1,rep,name=inputs"` + // Vars specifies the variables available to the PromotionTask. The + // values of these variables are the default values that can be + // overridden by the step referencing the task. + Vars []PromotionVariable `json:"vars,omitempty" protobuf:"bytes,1,rep,name=vars"` // Steps specifies the directives to be executed as part of this - // PromotionTask. The steps as defined here are deflated into a + // PromotionTask. The steps as defined here are inflated into a // Promotion when it is built from a PromotionTemplate. // // +kubebuilder:validation:Required // +kubebuilder:validation:MinItems=1 // +kubebuilder:validation:items:XValidation:message="PromotionTask step must have uses set and must not reference another task",rule="has(self.uses) && !has(self.task)" - // +kubebuilder:validation:items:XValidation:message="PromotionTask step must not have inputs set",rule="self.inputs.size() == 0" Steps []PromotionStep `json:"steps" protobuf:"bytes,2,rep,name=steps"` } -// PromotionTaskInput defines an input parameter for a PromotionTask. This input -// can be specified in the PromotionTemplate as configuration for the task, and -// can be used in the Steps to parameterize the execution of the task. -type PromotionTaskInput struct { - // Name of the configuration parameter, which should be unique within the - // PromotionTask. This name can be used to reference the parameter in the - // PromotionTaskSpec.Steps. - // - // +kubebuilder:validation:Required - // +kubebuilder:validation:MinLength=1 - // +kubebuilder:validation:Pattern=^[a-zA-Z_]\w*$ - Name string `json:"name" protobuf:"bytes,1,opt,name=name"` - // Default specifies a default value for the parameter. This value will be - // used if the parameter is not specified in the PromotionTemplate. - // If left unspecified, the input value is required to be specified in the - // configuration of the step referencing this task. - // - // +kubebuilder:validation:Optional - Default string `json:"default,omitempty" protobuf:"bytes,2,opt,name=default"` -} - // +kubebuilder:object:root=true // PromotionTaskList contains a list of PromotionTasks. diff --git a/api/v1alpha1/promotion_types.go b/api/v1alpha1/promotion_types.go index e318d49c5..4e5acdc86 100644 --- a/api/v1alpha1/promotion_types.go +++ b/api/v1alpha1/promotion_types.go @@ -118,7 +118,7 @@ type PromotionVariable struct { // Value is the value of the variable. It is allowed to utilize expressions // in the value. // See https://docs.kargo.io/references/expression-language for details. - Value string `json:"value" protobuf:"bytes,2,opt,name=value"` + Value string `json:"value,omitempty" protobuf:"bytes,2,opt,name=value"` } // PromotionTaskReference describes a reference to a PromotionTask. @@ -195,41 +195,24 @@ func (r *PromotionStepRetry) GetErrorThreshold(fallback uint32) uint32 { return r.ErrorThreshold } -// PromotionStepInput describes a single input value for a PromotionStep that may -// be referenced by expressions in the step. -type PromotionStepInput struct { - // Name is the name of the input to which the value is assigned. - // - // +kubebuilder:validation:MinLength=1 - // +kubebuilder:validation:Pattern=^[a-zA-Z_]\w*$ - Name string `json:"name" protobuf:"bytes,1,opt,name=name"` - // Value is the input value. - Value string `json:"value" protobuf:"bytes,2,opt,name=value"` -} - // PromotionStep describes a directive to be executed as part of a Promotion. -// -// +kubebuilder:validation:XValidation:message="inputs must not be set when task is set",rule="!(has(self.task) && self.inputs.size() > 0)" type PromotionStep struct { // Uses identifies a runner that can execute this step. // // +kubebuilder:validation:Optional // +kubebuilder:validation:MinLength=1 Uses string `json:"uses,omitempty" protobuf:"bytes,1,opt,name=uses"` - // Task is a reference to a PromotionTask that should be deflated into a + // Task is a reference to a PromotionTask that should be inflated into a // Promotion when it is built from a PromotionTemplate. Task *PromotionTaskReference `json:"task,omitempty" protobuf:"bytes,5,opt,name=task"` // As is the alias this step can be referred to as. As string `json:"as,omitempty" protobuf:"bytes,2,opt,name=as"` // Retry is the retry policy for this step. Retry *PromotionStepRetry `json:"retry,omitempty" protobuf:"bytes,4,opt,name=retry"` - // Inputs is a list of inputs that can used to parameterize the execution - // of the PromotionStep and can be referenced by expressions in the Config. - // - // When a PromotionStep is inflated from a PromotionTask, the inputs - // specified in the PromotionTask are set based on the inputs specified - // in the Config of the PromotionStep that references the PromotionTask. - Inputs []PromotionStepInput `json:"inputs,omitempty" protobuf:"bytes,6,rep,name=inputs"` + // Vars is a list of variables that can be referenced by expressions in + // the step's Config. The values override the values specified in the + // PromotionSpec. + Vars []PromotionVariable `json:"vars,omitempty" protobuf:"bytes,6,rep,name=vars"` // Config is opaque configuration for the PromotionStep that is understood // only by each PromotionStep's implementation. It is legal to utilize // expressions in defining values at any level of this block. From 478ca822671b4cd2a2fd03e0351f4c19f1be6847 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Mon, 16 Dec 2024 17:46:17 +0100 Subject: [PATCH 19/38] chore: run codegen Signed-off-by: Hidde Beydals --- api/v1alpha1/generated.pb.go | 1008 +++++------------ api/v1alpha1/generated.proto | 65 +- api/v1alpha1/zz_generated.deepcopy.go | 42 +- ...kargo.akuity.io_clusterpromotiontasks.yaml | 115 +- .../crds/kargo.akuity.io_promotions.yaml | 57 +- .../crds/kargo.akuity.io_promotiontasks.yaml | 119 +- .../crds/kargo.akuity.io_stages.yaml | 57 +- ...omotiontasks.kargo.akuity.io_v1alpha1.json | 105 +- .../promotions.kargo.akuity.io_v1alpha1.json | 56 +- ...omotiontasks.kargo.akuity.io_v1alpha1.json | 107 +- .../stages.kargo.akuity.io_v1alpha1.json | 56 +- ui/src/gen/v1alpha1/generated_pb.ts | 151 +-- 12 files changed, 661 insertions(+), 1277 deletions(-) diff --git a/api/v1alpha1/generated.pb.go b/api/v1alpha1/generated.pb.go index 8c2fc4c00..74f81ea62 100644 --- a/api/v1alpha1/generated.pb.go +++ b/api/v1alpha1/generated.pb.go @@ -1262,38 +1262,10 @@ func (m *PromotionStep) XXX_DiscardUnknown() { var xxx_messageInfo_PromotionStep proto.InternalMessageInfo -func (m *PromotionStepInput) Reset() { *m = PromotionStepInput{} } -func (*PromotionStepInput) ProtoMessage() {} -func (*PromotionStepInput) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{44} -} -func (m *PromotionStepInput) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PromotionStepInput) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *PromotionStepInput) XXX_Merge(src proto.Message) { - xxx_messageInfo_PromotionStepInput.Merge(m, src) -} -func (m *PromotionStepInput) XXX_Size() int { - return m.Size() -} -func (m *PromotionStepInput) XXX_DiscardUnknown() { - xxx_messageInfo_PromotionStepInput.DiscardUnknown(m) -} - -var xxx_messageInfo_PromotionStepInput proto.InternalMessageInfo - func (m *PromotionStepRetry) Reset() { *m = PromotionStepRetry{} } func (*PromotionStepRetry) ProtoMessage() {} func (*PromotionStepRetry) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{45} + return fileDescriptor_e26b7f7bbc391025, []int{44} } func (m *PromotionStepRetry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1321,7 +1293,7 @@ var xxx_messageInfo_PromotionStepRetry proto.InternalMessageInfo func (m *PromotionTask) Reset() { *m = PromotionTask{} } func (*PromotionTask) ProtoMessage() {} func (*PromotionTask) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{46} + return fileDescriptor_e26b7f7bbc391025, []int{45} } func (m *PromotionTask) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1346,38 +1318,10 @@ func (m *PromotionTask) XXX_DiscardUnknown() { var xxx_messageInfo_PromotionTask proto.InternalMessageInfo -func (m *PromotionTaskInput) Reset() { *m = PromotionTaskInput{} } -func (*PromotionTaskInput) ProtoMessage() {} -func (*PromotionTaskInput) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{47} -} -func (m *PromotionTaskInput) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PromotionTaskInput) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *PromotionTaskInput) XXX_Merge(src proto.Message) { - xxx_messageInfo_PromotionTaskInput.Merge(m, src) -} -func (m *PromotionTaskInput) XXX_Size() int { - return m.Size() -} -func (m *PromotionTaskInput) XXX_DiscardUnknown() { - xxx_messageInfo_PromotionTaskInput.DiscardUnknown(m) -} - -var xxx_messageInfo_PromotionTaskInput proto.InternalMessageInfo - func (m *PromotionTaskList) Reset() { *m = PromotionTaskList{} } func (*PromotionTaskList) ProtoMessage() {} func (*PromotionTaskList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{48} + return fileDescriptor_e26b7f7bbc391025, []int{46} } func (m *PromotionTaskList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1405,7 +1349,7 @@ var xxx_messageInfo_PromotionTaskList proto.InternalMessageInfo func (m *PromotionTaskReference) Reset() { *m = PromotionTaskReference{} } func (*PromotionTaskReference) ProtoMessage() {} func (*PromotionTaskReference) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{49} + return fileDescriptor_e26b7f7bbc391025, []int{47} } func (m *PromotionTaskReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1433,7 +1377,7 @@ var xxx_messageInfo_PromotionTaskReference proto.InternalMessageInfo func (m *PromotionTaskSpec) Reset() { *m = PromotionTaskSpec{} } func (*PromotionTaskSpec) ProtoMessage() {} func (*PromotionTaskSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{50} + return fileDescriptor_e26b7f7bbc391025, []int{48} } func (m *PromotionTaskSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1461,7 +1405,7 @@ var xxx_messageInfo_PromotionTaskSpec proto.InternalMessageInfo func (m *PromotionTemplate) Reset() { *m = PromotionTemplate{} } func (*PromotionTemplate) ProtoMessage() {} func (*PromotionTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{51} + return fileDescriptor_e26b7f7bbc391025, []int{49} } func (m *PromotionTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1489,7 +1433,7 @@ var xxx_messageInfo_PromotionTemplate proto.InternalMessageInfo func (m *PromotionTemplateSpec) Reset() { *m = PromotionTemplateSpec{} } func (*PromotionTemplateSpec) ProtoMessage() {} func (*PromotionTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{52} + return fileDescriptor_e26b7f7bbc391025, []int{50} } func (m *PromotionTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1517,7 +1461,7 @@ var xxx_messageInfo_PromotionTemplateSpec proto.InternalMessageInfo func (m *PromotionVariable) Reset() { *m = PromotionVariable{} } func (*PromotionVariable) ProtoMessage() {} func (*PromotionVariable) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{53} + return fileDescriptor_e26b7f7bbc391025, []int{51} } func (m *PromotionVariable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1545,7 +1489,7 @@ var xxx_messageInfo_PromotionVariable proto.InternalMessageInfo func (m *RepoSubscription) Reset() { *m = RepoSubscription{} } func (*RepoSubscription) ProtoMessage() {} func (*RepoSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{54} + return fileDescriptor_e26b7f7bbc391025, []int{52} } func (m *RepoSubscription) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1573,7 +1517,7 @@ var xxx_messageInfo_RepoSubscription proto.InternalMessageInfo func (m *Stage) Reset() { *m = Stage{} } func (*Stage) ProtoMessage() {} func (*Stage) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{55} + return fileDescriptor_e26b7f7bbc391025, []int{53} } func (m *Stage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1601,7 +1545,7 @@ var xxx_messageInfo_Stage proto.InternalMessageInfo func (m *StageList) Reset() { *m = StageList{} } func (*StageList) ProtoMessage() {} func (*StageList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{56} + return fileDescriptor_e26b7f7bbc391025, []int{54} } func (m *StageList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1629,7 +1573,7 @@ var xxx_messageInfo_StageList proto.InternalMessageInfo func (m *StageSpec) Reset() { *m = StageSpec{} } func (*StageSpec) ProtoMessage() {} func (*StageSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{57} + return fileDescriptor_e26b7f7bbc391025, []int{55} } func (m *StageSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1657,7 +1601,7 @@ var xxx_messageInfo_StageSpec proto.InternalMessageInfo func (m *StageStatus) Reset() { *m = StageStatus{} } func (*StageStatus) ProtoMessage() {} func (*StageStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{58} + return fileDescriptor_e26b7f7bbc391025, []int{56} } func (m *StageStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1685,7 +1629,7 @@ var xxx_messageInfo_StageStatus proto.InternalMessageInfo func (m *StepExecutionMetadata) Reset() { *m = StepExecutionMetadata{} } func (*StepExecutionMetadata) ProtoMessage() {} func (*StepExecutionMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{59} + return fileDescriptor_e26b7f7bbc391025, []int{57} } func (m *StepExecutionMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1713,7 +1657,7 @@ var xxx_messageInfo_StepExecutionMetadata proto.InternalMessageInfo func (m *Verification) Reset() { *m = Verification{} } func (*Verification) ProtoMessage() {} func (*Verification) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{60} + return fileDescriptor_e26b7f7bbc391025, []int{58} } func (m *Verification) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1741,7 +1685,7 @@ var xxx_messageInfo_Verification proto.InternalMessageInfo func (m *VerificationInfo) Reset() { *m = VerificationInfo{} } func (*VerificationInfo) ProtoMessage() {} func (*VerificationInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{61} + return fileDescriptor_e26b7f7bbc391025, []int{59} } func (m *VerificationInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1769,7 +1713,7 @@ var xxx_messageInfo_VerificationInfo proto.InternalMessageInfo func (m *VerifiedStage) Reset() { *m = VerifiedStage{} } func (*VerifiedStage) ProtoMessage() {} func (*VerifiedStage) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{62} + return fileDescriptor_e26b7f7bbc391025, []int{60} } func (m *VerifiedStage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1797,7 +1741,7 @@ var xxx_messageInfo_VerifiedStage proto.InternalMessageInfo func (m *Warehouse) Reset() { *m = Warehouse{} } func (*Warehouse) ProtoMessage() {} func (*Warehouse) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{63} + return fileDescriptor_e26b7f7bbc391025, []int{61} } func (m *Warehouse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1825,7 +1769,7 @@ var xxx_messageInfo_Warehouse proto.InternalMessageInfo func (m *WarehouseList) Reset() { *m = WarehouseList{} } func (*WarehouseList) ProtoMessage() {} func (*WarehouseList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{64} + return fileDescriptor_e26b7f7bbc391025, []int{62} } func (m *WarehouseList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1853,7 +1797,7 @@ var xxx_messageInfo_WarehouseList proto.InternalMessageInfo func (m *WarehouseSpec) Reset() { *m = WarehouseSpec{} } func (*WarehouseSpec) ProtoMessage() {} func (*WarehouseSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{65} + return fileDescriptor_e26b7f7bbc391025, []int{63} } func (m *WarehouseSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1881,7 +1825,7 @@ var xxx_messageInfo_WarehouseSpec proto.InternalMessageInfo func (m *WarehouseStatus) Reset() { *m = WarehouseStatus{} } func (*WarehouseStatus) ProtoMessage() {} func (*WarehouseStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{66} + return fileDescriptor_e26b7f7bbc391025, []int{64} } func (m *WarehouseStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1957,10 +1901,8 @@ func init() { proto.RegisterType((*PromotionSpec)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionSpec") proto.RegisterType((*PromotionStatus)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStatus") proto.RegisterType((*PromotionStep)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStep") - proto.RegisterType((*PromotionStepInput)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStepInput") proto.RegisterType((*PromotionStepRetry)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionStepRetry") proto.RegisterType((*PromotionTask)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTask") - proto.RegisterType((*PromotionTaskInput)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTaskInput") proto.RegisterType((*PromotionTaskList)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTaskList") proto.RegisterType((*PromotionTaskReference)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTaskReference") proto.RegisterType((*PromotionTaskSpec)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTaskSpec") @@ -1987,266 +1929,262 @@ func init() { } var fileDescriptor_e26b7f7bbc391025 = []byte{ - // 4133 bytes of a gzipped FileDescriptorProto + // 4078 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0xcd, 0x6f, 0x23, 0x47, - 0x76, 0x9f, 0x26, 0x45, 0x4a, 0x7c, 0x94, 0x66, 0xa4, 0x1a, 0x8d, 0xad, 0xd5, 0xc6, 0xd2, 0xa4, - 0x6d, 0x18, 0x76, 0x6c, 0x53, 0x19, 0xd9, 0x63, 0x8f, 0xc7, 0x9b, 0x09, 0x44, 0x6a, 0x3e, 0x34, - 0xab, 0xf5, 0x28, 0x45, 0x79, 0xbc, 0x1e, 0x8f, 0xe1, 0x2d, 0x91, 0x25, 0xb2, 0x57, 0x64, 0x37, - 0xdd, 0x55, 0xd4, 0x5a, 0x49, 0x90, 0x6c, 0xbe, 0x80, 0x45, 0x82, 0x04, 0x7b, 0x30, 0xe0, 0x0d, - 0x90, 0x00, 0x41, 0x72, 0x5c, 0x24, 0xff, 0x40, 0x0e, 0x3e, 0xe4, 0x62, 0x2c, 0x8c, 0xc4, 0x48, - 0x02, 0xc4, 0x87, 0x8d, 0x12, 0xcb, 0x40, 0x8e, 0xb9, 0xe5, 0x32, 0x40, 0x80, 0xa0, 0x3e, 0xba, - 0xbb, 0xba, 0xd9, 0x1c, 0xb1, 0x39, 0xd2, 0xc0, 0xd9, 0x9b, 0x54, 0xaf, 0xde, 0xef, 0x55, 0xbd, - 0xaa, 0x7a, 0xf5, 0xde, 0xab, 0xd7, 0x84, 0x57, 0x5a, 0x0e, 0x6f, 0xf7, 0x77, 0x2a, 0x0d, 0xaf, - 0xbb, 0x42, 0xf6, 0xfa, 0x0e, 0x3f, 0x58, 0xd9, 0x23, 0x7e, 0xcb, 0x5b, 0x21, 0x3d, 0x67, 0x65, - 0xff, 0x12, 0xe9, 0xf4, 0xda, 0xe4, 0xd2, 0x4a, 0x8b, 0xba, 0xd4, 0x27, 0x9c, 0x36, 0x2b, 0x3d, - 0xdf, 0xe3, 0x1e, 0x7a, 0x26, 0xe2, 0xaa, 0x28, 0xae, 0x8a, 0xe4, 0xaa, 0x90, 0x9e, 0x53, 0x09, - 0xb8, 0x16, 0x5f, 0x32, 0xb0, 0x5b, 0x5e, 0xcb, 0x5b, 0x91, 0xcc, 0x3b, 0xfd, 0x5d, 0xf9, 0x9f, - 0xfc, 0x47, 0xfe, 0xa5, 0x40, 0x17, 0x6f, 0xed, 0x5d, 0x61, 0x15, 0x47, 0x4a, 0xa6, 0x1f, 0x72, - 0xea, 0x32, 0xc7, 0x73, 0xd9, 0x4b, 0xa4, 0xe7, 0x30, 0xea, 0xef, 0x53, 0x7f, 0xa5, 0xb7, 0xd7, - 0x12, 0x34, 0x16, 0xef, 0xb0, 0xb2, 0x3f, 0x30, 0xbc, 0xc5, 0x57, 0x22, 0xa4, 0x2e, 0x69, 0xb4, - 0x1d, 0x97, 0xfa, 0x07, 0x11, 0x7b, 0x97, 0x72, 0x92, 0xc6, 0xb5, 0x32, 0x8c, 0xcb, 0xef, 0xbb, - 0xdc, 0xe9, 0xd2, 0x01, 0x86, 0x57, 0x8f, 0x63, 0x60, 0x8d, 0x36, 0xed, 0x92, 0x24, 0x9f, 0x7d, - 0x1f, 0xce, 0xaf, 0xb9, 0xa4, 0x73, 0xc0, 0x1c, 0x86, 0xfb, 0xee, 0x9a, 0xdf, 0xea, 0x77, 0xa9, - 0xcb, 0xd1, 0x45, 0x98, 0x70, 0x49, 0x97, 0x2e, 0x58, 0x17, 0xad, 0xe7, 0x4a, 0xd5, 0xe9, 0x4f, - 0x0f, 0x97, 0xcf, 0x1c, 0x1d, 0x2e, 0x4f, 0xbc, 0x49, 0xba, 0x14, 0x4b, 0x0a, 0x7a, 0x1a, 0x0a, - 0xfb, 0xa4, 0xd3, 0xa7, 0x0b, 0x39, 0xd9, 0x65, 0x46, 0x77, 0x29, 0xdc, 0x15, 0x8d, 0x58, 0xd1, - 0xec, 0x3f, 0xc8, 0xc7, 0xe0, 0xbf, 0x43, 0x39, 0x69, 0x12, 0x4e, 0x50, 0x17, 0x8a, 0x1d, 0xb2, - 0x43, 0x3b, 0x6c, 0xc1, 0xba, 0x98, 0x7f, 0xae, 0xbc, 0x7a, 0xbd, 0x32, 0xca, 0x22, 0x56, 0x52, - 0xa0, 0x2a, 0x9b, 0x12, 0xe7, 0xba, 0xcb, 0xfd, 0x83, 0xea, 0x59, 0x3d, 0x88, 0xa2, 0x6a, 0xc4, - 0x5a, 0x08, 0xfa, 0x3d, 0x0b, 0xca, 0xc4, 0x75, 0x3d, 0x4e, 0xb8, 0x58, 0xa6, 0x85, 0x9c, 0x14, - 0x7a, 0x7b, 0x7c, 0xa1, 0x6b, 0x11, 0x98, 0x92, 0x7c, 0x5e, 0x4b, 0x2e, 0x1b, 0x14, 0x6c, 0xca, - 0x5c, 0x7c, 0x1d, 0xca, 0xc6, 0x50, 0xd1, 0x2c, 0xe4, 0xf7, 0xe8, 0x81, 0xd2, 0x2f, 0x16, 0x7f, - 0xa2, 0xf9, 0x98, 0x42, 0xb5, 0x06, 0xaf, 0xe6, 0xae, 0x58, 0x8b, 0xd7, 0x60, 0x36, 0x29, 0x30, - 0x0b, 0xbf, 0xfd, 0x67, 0x16, 0xcc, 0x1b, 0xb3, 0xc0, 0x74, 0x97, 0xfa, 0xd4, 0x6d, 0x50, 0xb4, - 0x02, 0x25, 0xb1, 0x96, 0xac, 0x47, 0x1a, 0xc1, 0x52, 0xcf, 0xe9, 0x89, 0x94, 0xde, 0x0c, 0x08, - 0x38, 0xea, 0x13, 0x6e, 0x8b, 0xdc, 0xc3, 0xb6, 0x45, 0xaf, 0x4d, 0x18, 0x5d, 0xc8, 0xc7, 0xb7, - 0xc5, 0x96, 0x68, 0xc4, 0x8a, 0x66, 0xff, 0x1a, 0x7c, 0x23, 0x18, 0xcf, 0x36, 0xed, 0xf6, 0x3a, - 0x84, 0xd3, 0x68, 0x50, 0xc7, 0x6e, 0x3d, 0x7b, 0x0f, 0x66, 0xd6, 0x7a, 0x3d, 0xdf, 0xdb, 0xa7, - 0xcd, 0x3a, 0x27, 0x2d, 0x8a, 0xee, 0x01, 0x10, 0xdd, 0xb0, 0xc6, 0x25, 0x63, 0x79, 0xf5, 0x57, - 0x2a, 0xea, 0x44, 0x54, 0xcc, 0x13, 0x51, 0xe9, 0xed, 0xb5, 0x44, 0x03, 0xab, 0x88, 0x83, 0x57, - 0xd9, 0xbf, 0x54, 0xd9, 0x76, 0xba, 0xb4, 0x7a, 0xf6, 0xe8, 0x70, 0x19, 0xd6, 0x42, 0x04, 0x6c, - 0xa0, 0xd9, 0xbf, 0x6f, 0xc1, 0x85, 0x35, 0xbf, 0xe5, 0xd5, 0xd6, 0xd7, 0x7a, 0xbd, 0x5b, 0x94, - 0x74, 0x78, 0xbb, 0xce, 0x09, 0xef, 0x33, 0x74, 0x0d, 0x8a, 0x4c, 0xfe, 0xa5, 0x87, 0xfa, 0x6c, - 0xb0, 0xfb, 0x14, 0xfd, 0xc1, 0xe1, 0xf2, 0x7c, 0x0a, 0x23, 0xc5, 0x9a, 0x0b, 0x3d, 0x0f, 0x93, - 0x5d, 0xca, 0x18, 0x69, 0x05, 0xfa, 0x3c, 0xa7, 0x01, 0x26, 0xbf, 0xa3, 0x9a, 0x71, 0x40, 0xb7, - 0x7f, 0x96, 0x83, 0x73, 0x21, 0x96, 0x16, 0x7f, 0x0a, 0x8b, 0xd7, 0x87, 0xe9, 0xb6, 0x31, 0x43, - 0xb9, 0x86, 0xe5, 0xd5, 0x37, 0x46, 0x3c, 0x27, 0x69, 0x4a, 0xaa, 0xce, 0x6b, 0x31, 0xd3, 0x66, - 0x2b, 0x8e, 0x89, 0x41, 0x5d, 0x00, 0x76, 0xe0, 0x36, 0xb4, 0xd0, 0x09, 0x29, 0xf4, 0xf5, 0x8c, - 0x42, 0xeb, 0x21, 0x40, 0x15, 0x69, 0x91, 0x10, 0xb5, 0x61, 0x43, 0x80, 0xfd, 0x77, 0x16, 0x9c, - 0x4f, 0xe1, 0x43, 0xdf, 0x4a, 0xac, 0xe7, 0x33, 0x03, 0xeb, 0x89, 0x06, 0xd8, 0xa2, 0xd5, 0x7c, - 0x11, 0xa6, 0x7c, 0xba, 0xef, 0x88, 0x7b, 0x40, 0x6b, 0x78, 0x56, 0xf3, 0x4f, 0x61, 0xdd, 0x8e, - 0xc3, 0x1e, 0xe8, 0x05, 0x28, 0x05, 0x7f, 0x0b, 0x35, 0xe7, 0xc5, 0x51, 0x11, 0x0b, 0x17, 0x74, - 0x65, 0x38, 0xa2, 0xdb, 0xbf, 0x0b, 0x85, 0x5a, 0x9b, 0xf8, 0x5c, 0xec, 0x18, 0x9f, 0xf6, 0xbc, - 0xb7, 0xf0, 0xa6, 0x1e, 0x62, 0xb8, 0x63, 0xb0, 0x6a, 0xc6, 0x01, 0x7d, 0x84, 0xc5, 0x7e, 0x1e, - 0x26, 0xf7, 0xa9, 0x2f, 0xc7, 0x9b, 0x8f, 0x83, 0xdd, 0x55, 0xcd, 0x38, 0xa0, 0xdb, 0xff, 0x62, - 0xc1, 0xbc, 0x1c, 0xc1, 0xba, 0xc3, 0x1a, 0xde, 0x3e, 0xf5, 0x0f, 0x30, 0x65, 0xfd, 0xce, 0x09, - 0x0f, 0x68, 0x1d, 0x66, 0x19, 0xed, 0xee, 0x53, 0xbf, 0xe6, 0xb9, 0x8c, 0xfb, 0xc4, 0x71, 0xb9, - 0x1e, 0xd9, 0x82, 0xee, 0x3d, 0x5b, 0x4f, 0xd0, 0xf1, 0x00, 0x07, 0x7a, 0x0e, 0xa6, 0xf4, 0xb0, - 0xc5, 0x56, 0x12, 0x8a, 0x9d, 0x16, 0x6b, 0xa0, 0xe7, 0xc4, 0x70, 0x48, 0xb5, 0xff, 0xcb, 0x82, - 0x39, 0x39, 0xab, 0x7a, 0x7f, 0x87, 0x35, 0x7c, 0xa7, 0x27, 0xcc, 0xeb, 0xd7, 0x71, 0x4a, 0xd7, - 0xe0, 0x6c, 0x33, 0x50, 0xfc, 0xa6, 0xd3, 0x75, 0xb8, 0x3c, 0x23, 0x85, 0xea, 0x13, 0x1a, 0xe3, - 0xec, 0x7a, 0x8c, 0x8a, 0x13, 0xbd, 0xd5, 0xf2, 0x75, 0xfa, 0x8c, 0x53, 0x7f, 0xcb, 0xf7, 0xba, - 0x9e, 0x98, 0xe7, 0x36, 0x61, 0x7b, 0xe8, 0x7b, 0x30, 0xd5, 0xd5, 0x57, 0x9a, 0xb6, 0x9a, 0xbf, - 0x3a, 0x9a, 0xd5, 0xbc, 0xb3, 0xf3, 0x7d, 0xda, 0xe0, 0xe2, 0x3a, 0x8c, 0x4e, 0x5b, 0xd4, 0x86, - 0x43, 0x54, 0xf4, 0x0e, 0x4c, 0xb0, 0x1e, 0x6d, 0x48, 0x15, 0x95, 0x57, 0x5f, 0x1b, 0xed, 0x50, - 0xc7, 0x06, 0x59, 0xef, 0xd1, 0x46, 0xa4, 0x5b, 0xf1, 0x1f, 0x96, 0x90, 0xf6, 0xbf, 0x5b, 0xb0, - 0x90, 0x36, 0xab, 0x4d, 0x87, 0x71, 0x74, 0x7f, 0x60, 0x66, 0x95, 0xd1, 0x66, 0x26, 0xb8, 0xe5, - 0xbc, 0xc2, 0xd3, 0x1b, 0xb4, 0x18, 0xb3, 0x6a, 0x40, 0xc1, 0xe1, 0xb4, 0x1b, 0x38, 0x12, 0xd7, - 0x46, 0x9b, 0xd6, 0xb0, 0xc1, 0x46, 0x97, 0xe4, 0x86, 0x00, 0xc5, 0x0a, 0xdb, 0x7e, 0x17, 0xa6, - 0x6b, 0x7d, 0xdf, 0xa7, 0x2e, 0x57, 0x97, 0xdc, 0xb7, 0xa1, 0xc0, 0x1c, 0x57, 0xdb, 0xfa, 0x6c, - 0xf7, 0x5b, 0x49, 0x80, 0xd7, 0x05, 0x33, 0x56, 0x18, 0xf6, 0x5f, 0xe4, 0xe1, 0x7c, 0xb0, 0x6b, - 0x68, 0x73, 0xcd, 0xe7, 0xce, 0x2e, 0x69, 0x70, 0x86, 0x9a, 0x30, 0xdd, 0x8c, 0x9a, 0xb9, 0x36, - 0xc6, 0x59, 0x64, 0x85, 0x06, 0xdf, 0x80, 0xe7, 0x38, 0x86, 0x8a, 0xde, 0x86, 0x7c, 0xcb, 0xe1, - 0xda, 0xf7, 0xbb, 0x32, 0x9a, 0xf6, 0x6e, 0x3a, 0x49, 0xeb, 0x53, 0x2d, 0x6b, 0x51, 0xf9, 0x9b, - 0x0e, 0xc7, 0x02, 0x11, 0xed, 0x40, 0xd1, 0xe9, 0x92, 0x16, 0x0d, 0x56, 0xe6, 0xea, 0x68, 0xd8, - 0x1b, 0x82, 0x27, 0x89, 0x1e, 0x3a, 0x93, 0x92, 0xca, 0xb0, 0x46, 0x16, 0x32, 0x1a, 0xc2, 0x6a, - 0x28, 0xbb, 0x3d, 0xb2, 0x8c, 0x34, 0xfb, 0x19, 0xc9, 0x90, 0x54, 0x86, 0x35, 0xb2, 0xfd, 0x45, - 0x0e, 0x66, 0x23, 0xfd, 0xd5, 0xbc, 0x6e, 0xd7, 0xe1, 0x68, 0x11, 0x72, 0x4e, 0x53, 0x1b, 0x25, - 0xd0, 0x8c, 0xb9, 0x8d, 0x75, 0x9c, 0x73, 0x9a, 0xe8, 0x59, 0x28, 0xee, 0xf8, 0xc4, 0x6d, 0xb4, - 0xb5, 0x31, 0x0a, 0x81, 0xab, 0xb2, 0x15, 0x6b, 0x2a, 0x7a, 0x0a, 0xf2, 0x9c, 0xb4, 0xb4, 0x0d, - 0x0a, 0xf5, 0xb7, 0x4d, 0x5a, 0x58, 0xb4, 0x0b, 0xe3, 0xc7, 0xfa, 0xf2, 0x1c, 0xcb, 0x95, 0x37, - 0x8c, 0x5f, 0x5d, 0x35, 0xe3, 0x80, 0x2e, 0x24, 0x92, 0x3e, 0x6f, 0x7b, 0xfe, 0x42, 0x21, 0x2e, - 0x71, 0x4d, 0xb6, 0x62, 0x4d, 0x15, 0x6e, 0x4a, 0x43, 0x8e, 0x9f, 0x53, 0x7f, 0xa1, 0x18, 0x77, - 0x53, 0x6a, 0x01, 0x01, 0x47, 0x7d, 0xd0, 0x7b, 0x50, 0x6e, 0xf8, 0x94, 0x70, 0xcf, 0x5f, 0x27, - 0x9c, 0x2e, 0x4c, 0x66, 0xde, 0x81, 0xe7, 0x84, 0x1f, 0x5e, 0x8b, 0x20, 0xb0, 0x89, 0x67, 0xff, - 0xb7, 0x05, 0x0b, 0x91, 0x6a, 0xe5, 0xda, 0x46, 0xbe, 0xa7, 0x56, 0x8f, 0x35, 0x44, 0x3d, 0xcf, - 0x42, 0xb1, 0xe9, 0xb4, 0x28, 0xe3, 0x49, 0x2d, 0xaf, 0xcb, 0x56, 0xac, 0xa9, 0x68, 0x15, 0xa0, - 0xe5, 0x70, 0x7d, 0x5f, 0x68, 0x65, 0x87, 0x76, 0xf2, 0x66, 0x48, 0xc1, 0x46, 0x2f, 0xf4, 0x36, - 0x94, 0xe4, 0x30, 0xc7, 0x3c, 0x76, 0xd2, 0x7b, 0xa8, 0x05, 0x00, 0x38, 0xc2, 0xb2, 0x3f, 0x9f, - 0x80, 0xc9, 0x1b, 0x3e, 0x75, 0x5a, 0x6d, 0xfe, 0x18, 0x0c, 0xfe, 0xd3, 0x50, 0x20, 0x1d, 0x87, - 0x30, 0xb9, 0x6e, 0x86, 0xff, 0xbf, 0x26, 0x1a, 0xb1, 0xa2, 0xa1, 0x77, 0xa1, 0xe8, 0xf9, 0x4e, - 0xcb, 0x71, 0x17, 0x4a, 0x72, 0x10, 0x2f, 0x8f, 0x76, 0x84, 0xf4, 0x2c, 0xee, 0x48, 0xd6, 0x48, - 0xf9, 0xea, 0x7f, 0xac, 0x21, 0xd1, 0x3d, 0x98, 0x54, 0x9b, 0x29, 0x38, 0xa0, 0x2b, 0x23, 0x1b, - 0x18, 0xb5, 0x1f, 0xa3, 0x4d, 0xaf, 0xfe, 0x67, 0x38, 0x00, 0x44, 0xf5, 0xd0, 0xbe, 0x4c, 0x48, - 0xe8, 0x17, 0x32, 0xd8, 0x97, 0xa1, 0x06, 0xa5, 0x1e, 0x1a, 0x94, 0x42, 0x16, 0x50, 0x69, 0x32, - 0x86, 0x59, 0x10, 0xa1, 0x62, 0xed, 0xcc, 0x16, 0xc7, 0x50, 0xb1, 0xf6, 0xa4, 0xcf, 0xc6, 0x3d, - 0xe0, 0xc0, 0xd7, 0xb5, 0x3f, 0xca, 0xc3, 0x9c, 0xee, 0x59, 0xf3, 0x3a, 0x1d, 0xda, 0x90, 0x9e, - 0x93, 0xb2, 0x4f, 0xf9, 0x54, 0xfb, 0xe4, 0x04, 0x37, 0xa6, 0xb2, 0xf9, 0xd5, 0x4c, 0xa3, 0x89, - 0x64, 0x54, 0xe4, 0x0d, 0xa9, 0x42, 0xee, 0x70, 0x95, 0x74, 0x2f, 0x7d, 0x6f, 0xa2, 0x3f, 0xb2, - 0xe0, 0xfc, 0x3e, 0xf5, 0x9d, 0x5d, 0xa7, 0x21, 0x03, 0xe6, 0x5b, 0x0e, 0xe3, 0x9e, 0x7f, 0xa0, - 0x6f, 0x84, 0x57, 0x47, 0x93, 0x7c, 0xd7, 0x00, 0xd8, 0x70, 0x77, 0xbd, 0xea, 0x37, 0xb5, 0xb4, - 0xf3, 0x77, 0x07, 0xa1, 0x71, 0x9a, 0xbc, 0xc5, 0x1e, 0x40, 0x34, 0xda, 0x94, 0x78, 0x7d, 0xd3, - 0x8c, 0xd7, 0x47, 0x1e, 0x58, 0x30, 0xd9, 0xc0, 0x64, 0x99, 0x71, 0xfe, 0x27, 0x16, 0x94, 0x35, - 0xfd, 0x31, 0x38, 0x41, 0x38, 0xee, 0x04, 0xbd, 0x94, 0x69, 0xfc, 0x43, 0x7c, 0x1e, 0x1f, 0x66, - 0x62, 0x87, 0x1c, 0x5d, 0x86, 0x89, 0x3d, 0xc7, 0x0d, 0x6e, 0xbd, 0x5f, 0x0e, 0xdc, 0xc0, 0x6f, - 0x3b, 0x6e, 0xf3, 0xc1, 0xe1, 0xf2, 0x5c, 0xac, 0xb3, 0x68, 0xc4, 0xb2, 0xfb, 0xf1, 0x9e, 0xf9, - 0xd5, 0xa9, 0x9f, 0xfc, 0xd5, 0xf2, 0x99, 0x1f, 0xfe, 0xfc, 0xe2, 0x19, 0xfb, 0xe3, 0x3c, 0xcc, - 0x26, 0xb5, 0x3a, 0x42, 0xfe, 0x2b, 0xb2, 0x61, 0x53, 0xa7, 0x6a, 0xc3, 0x72, 0xa7, 0x67, 0xc3, - 0xf2, 0xa7, 0x61, 0xc3, 0x26, 0x4e, 0xcc, 0x86, 0xd9, 0xff, 0x68, 0xc1, 0xd9, 0x70, 0x65, 0x3e, - 0xe8, 0x8b, 0x9b, 0x35, 0xd2, 0xba, 0x75, 0xf2, 0x5a, 0x7f, 0x1f, 0x26, 0x99, 0xd7, 0xf7, 0x1b, - 0xd2, 0x7d, 0x14, 0xe8, 0xaf, 0x64, 0x33, 0x9a, 0x8a, 0xd7, 0xf0, 0x99, 0x54, 0x03, 0x0e, 0x50, - 0xcd, 0x09, 0x69, 0x9a, 0x72, 0x29, 0x7c, 0xe1, 0x70, 0x89, 0x09, 0x4d, 0x99, 0x2e, 0x85, 0x68, - 0xc5, 0x9a, 0x8a, 0x6c, 0x69, 0xcf, 0x03, 0xcf, 0xb6, 0x54, 0x05, 0x6d, 0x96, 0xe5, 0x22, 0x28, - 0x0a, 0xea, 0xc1, 0xac, 0x4f, 0x3f, 0xe8, 0x3b, 0x3e, 0x6d, 0xd6, 0x3d, 0xb2, 0x27, 0xfc, 0x02, - 0x9d, 0xc2, 0x19, 0xf1, 0xdc, 0xaf, 0xf7, 0x7d, 0x69, 0xc2, 0xaa, 0xf3, 0x22, 0x32, 0xc5, 0x09, - 0x2c, 0x3c, 0x80, 0x6e, 0xff, 0x47, 0x21, 0x3c, 0xb0, 0x3a, 0x89, 0xf2, 0x5b, 0x50, 0x6e, 0xa8, - 0xa8, 0xa5, 0x73, 0xb0, 0xe1, 0xea, 0x2d, 0xb6, 0x3e, 0xc6, 0xe5, 0x53, 0xa9, 0x45, 0x30, 0x89, - 0x1c, 0xab, 0x41, 0xc1, 0xa6, 0x34, 0xf4, 0x03, 0x00, 0x65, 0x89, 0x69, 0x73, 0xc3, 0xd5, 0x57, - 0x4d, 0x6d, 0x1c, 0xd9, 0x77, 0x43, 0x14, 0x25, 0x3a, 0xf4, 0x79, 0x22, 0x02, 0x36, 0x44, 0x89, - 0x59, 0x07, 0x29, 0xc3, 0x1b, 0x9e, 0xaf, 0xcf, 0xec, 0x58, 0xb3, 0x5e, 0x8b, 0x60, 0x92, 0x99, - 0xe5, 0x88, 0x82, 0x4d, 0x69, 0x8b, 0x3e, 0xcc, 0x26, 0x75, 0x95, 0x72, 0xdd, 0xdc, 0x8a, 0x5f, - 0x37, 0xab, 0x23, 0x1e, 0x50, 0x23, 0x02, 0x35, 0x53, 0xd2, 0x3e, 0x9c, 0x4b, 0xe8, 0x28, 0x45, - 0xe4, 0x46, 0x5c, 0xe4, 0xcb, 0x59, 0xae, 0x5e, 0x9d, 0xda, 0x35, 0x65, 0x32, 0x98, 0x4d, 0x6a, - 0xe7, 0xc4, 0x84, 0xc6, 0xf2, 0xc9, 0xe6, 0x9d, 0xfa, 0x97, 0x39, 0x28, 0x85, 0x56, 0x35, 0x4b, - 0x72, 0x48, 0x79, 0x43, 0xb9, 0x63, 0xa2, 0xb5, 0xfc, 0x28, 0xd1, 0xda, 0xc4, 0xf0, 0x68, 0x2d, - 0x48, 0x20, 0x17, 0x1f, 0x9e, 0x40, 0x36, 0xa2, 0xb5, 0xc9, 0xd1, 0xa3, 0xb5, 0xa9, 0xe3, 0xa3, - 0x35, 0xfb, 0xaf, 0x2d, 0x40, 0x83, 0xa1, 0x79, 0x16, 0x45, 0x91, 0xe4, 0x5d, 0x37, 0xa2, 0x27, - 0x94, 0x8c, 0x8f, 0x87, 0x5f, 0x79, 0xf6, 0x27, 0x05, 0x38, 0x77, 0xd3, 0x19, 0x3b, 0xcf, 0xc7, - 0xe1, 0x49, 0x85, 0x54, 0xa7, 0xda, 0x0f, 0xad, 0x73, 0x9f, 0x70, 0xda, 0x3a, 0xd0, 0xeb, 0x7b, - 0x55, 0xb3, 0x3e, 0x59, 0x4b, 0xef, 0xf6, 0x60, 0x38, 0x09, 0x0f, 0x83, 0x1e, 0x79, 0x93, 0xbc, - 0x01, 0x33, 0x8c, 0xfb, 0x4e, 0x83, 0xab, 0x4c, 0x22, 0x5b, 0x28, 0xcb, 0x8b, 0xe4, 0x82, 0xee, - 0x3e, 0x53, 0x37, 0x89, 0x38, 0xde, 0x37, 0x35, 0x41, 0x39, 0x91, 0x39, 0x41, 0xb9, 0x02, 0x25, - 0xd2, 0xe9, 0x78, 0x3f, 0xd8, 0x26, 0x2d, 0xa6, 0xd3, 0x01, 0xe1, 0xae, 0x59, 0x0b, 0x08, 0x38, - 0xea, 0x83, 0x2a, 0x00, 0x4e, 0xcb, 0xf5, 0x7c, 0x2a, 0x39, 0x8a, 0xf2, 0x46, 0x93, 0x8f, 0x30, - 0x1b, 0x61, 0x2b, 0x36, 0x7a, 0xa0, 0x3a, 0x5c, 0x70, 0x5c, 0x46, 0x1b, 0x7d, 0x9f, 0xd6, 0xf7, - 0x9c, 0xde, 0xf6, 0x66, 0x5d, 0x5a, 0x89, 0x03, 0xb9, 0x9b, 0xa7, 0xaa, 0x4f, 0x69, 0x61, 0x17, - 0x36, 0xd2, 0x3a, 0xe1, 0x74, 0x5e, 0xf4, 0x0a, 0x4c, 0x3b, 0x6e, 0xa3, 0xd3, 0x6f, 0xd2, 0x2d, - 0xc2, 0xdb, 0x6c, 0x61, 0x4a, 0x0e, 0x63, 0xf6, 0xe8, 0x70, 0x79, 0x7a, 0xc3, 0x68, 0xc7, 0xb1, - 0x5e, 0x82, 0x8b, 0x7e, 0x68, 0x70, 0x95, 0x22, 0xae, 0xeb, 0x1f, 0x9a, 0x5c, 0x66, 0xaf, 0x94, - 0x14, 0x2e, 0x64, 0x4a, 0xe1, 0xfe, 0x34, 0x07, 0x45, 0xf5, 0x82, 0x82, 0x2e, 0x27, 0x9e, 0x29, - 0x9e, 0x1a, 0x78, 0xa6, 0x28, 0xa7, 0xbd, 0x36, 0xd9, 0x50, 0x74, 0x18, 0xeb, 0xc7, 0x1d, 0x88, - 0x0d, 0xd9, 0x82, 0x35, 0x45, 0xa6, 0xb6, 0x3c, 0x77, 0xd7, 0x69, 0xe9, 0x04, 0xc4, 0x35, 0xc3, - 0x6d, 0x88, 0x5e, 0xb9, 0xdf, 0x0f, 0x9f, 0xc1, 0x23, 0x0f, 0x22, 0xd6, 0x41, 0xb8, 0x12, 0xb7, - 0xeb, 0x77, 0xde, 0x54, 0x32, 0x6a, 0x12, 0x11, 0x6b, 0x64, 0x21, 0xc3, 0xeb, 0xf3, 0x5e, 0x9f, - 0xcb, 0x8d, 0x72, 0x42, 0x32, 0xee, 0x48, 0x44, 0xac, 0x91, 0xed, 0x8f, 0x2d, 0x38, 0xa7, 0x74, - 0x50, 0x6b, 0xd3, 0xc6, 0x5e, 0x9d, 0xd3, 0x9e, 0xf0, 0xe8, 0xfb, 0x8c, 0xb2, 0xa4, 0x47, 0xff, - 0x16, 0xa3, 0x0c, 0x4b, 0x8a, 0x31, 0xfb, 0xdc, 0x69, 0xcd, 0xde, 0xfe, 0x5b, 0x0b, 0x0a, 0xd2, - 0x75, 0xce, 0x62, 0x7f, 0xe2, 0xe9, 0xa4, 0xdc, 0x48, 0xe9, 0xa4, 0x63, 0x12, 0x7d, 0x51, 0x26, - 0x6b, 0xe2, 0x61, 0x99, 0x2c, 0xfb, 0x2b, 0x0b, 0xe6, 0xd3, 0xb2, 0xa3, 0x59, 0x86, 0xff, 0x22, - 0x4c, 0xf5, 0x3a, 0x84, 0xef, 0x7a, 0x7e, 0x37, 0xf9, 0x32, 0xb6, 0xa5, 0xdb, 0x71, 0xd8, 0x03, - 0xf9, 0x00, 0x7e, 0x10, 0x86, 0x05, 0x21, 0xca, 0xb5, 0xac, 0x37, 0x42, 0x3c, 0xad, 0x17, 0x29, - 0x2b, 0x6c, 0x62, 0xd8, 0x90, 0x62, 0xff, 0x49, 0x01, 0xe6, 0x24, 0xcb, 0xb8, 0x37, 0xc4, 0x38, - 0x2b, 0xd4, 0x83, 0x27, 0x64, 0xf0, 0x34, 0x78, 0xa9, 0xa8, 0x45, 0xbb, 0xa2, 0xf9, 0x9f, 0xd8, - 0x48, 0xed, 0xf5, 0x60, 0x28, 0x05, 0x0f, 0xc1, 0x1d, 0xbc, 0x29, 0xe0, 0x17, 0xef, 0xa6, 0x30, - 0x37, 0xdb, 0xe4, 0xb1, 0x9b, 0x6d, 0xe8, 0xbd, 0x32, 0xf5, 0x08, 0xf7, 0xca, 0xa0, 0xad, 0x2f, - 0x65, 0xb2, 0xf5, 0x7f, 0x9e, 0x83, 0xc9, 0x2d, 0xdf, 0x93, 0x59, 0xf6, 0xd3, 0x4f, 0xd8, 0xde, - 0x89, 0xbd, 0xd0, 0x5d, 0x1a, 0xf9, 0x85, 0x4e, 0x40, 0xc9, 0xb7, 0xb9, 0xa9, 0xf8, 0xbb, 0x9c, - 0x91, 0x79, 0xcc, 0x67, 0xf1, 0xc0, 0x03, 0xc8, 0x87, 0x67, 0x1e, 0x3f, 0xb1, 0xa0, 0xac, 0x7b, - 0x7e, 0x6d, 0x53, 0x5c, 0x7a, 0x7c, 0x43, 0x52, 0x5c, 0x7f, 0x1a, 0xcd, 0x40, 0x28, 0x0d, 0xfd, - 0x0e, 0xcc, 0xf5, 0x82, 0x17, 0xc1, 0x2d, 0xaf, 0xe3, 0x34, 0x1c, 0x1a, 0x64, 0x49, 0x2f, 0x67, - 0x7c, 0x2e, 0x95, 0xec, 0x07, 0xd5, 0x6f, 0x68, 0xb9, 0x73, 0x5b, 0x49, 0x5c, 0x3c, 0x28, 0xca, - 0xfe, 0x57, 0x0b, 0x66, 0x62, 0xba, 0x47, 0x0d, 0x80, 0x86, 0xe7, 0x36, 0x1d, 0x1e, 0x16, 0x27, - 0x94, 0x57, 0x57, 0x46, 0xd3, 0x6a, 0x2d, 0xe0, 0x8b, 0x36, 0x5d, 0xd8, 0xc4, 0xb0, 0x01, 0x8b, - 0x5e, 0x0e, 0xea, 0x84, 0xe2, 0x4e, 0x8c, 0xaa, 0x13, 0x7a, 0x70, 0xb8, 0x3c, 0xad, 0xc7, 0x64, - 0xd6, 0x0d, 0x65, 0xa9, 0x98, 0xf9, 0x9b, 0x1c, 0x94, 0xc2, 0xf9, 0x3f, 0x86, 0x63, 0xf4, 0x56, - 0xec, 0x18, 0xbd, 0x9c, 0x71, 0xe5, 0x86, 0x3d, 0x72, 0xa3, 0xf7, 0x12, 0x87, 0x29, 0xeb, 0x96, - 0x38, 0xe6, 0x38, 0xfd, 0x83, 0x5a, 0x7c, 0xd5, 0xf7, 0x31, 0x1c, 0xa8, 0xed, 0xf8, 0x81, 0x5a, - 0xc9, 0x38, 0x9b, 0x21, 0x47, 0xea, 0x47, 0x16, 0x9c, 0x4b, 0x1c, 0x02, 0xf4, 0x34, 0x14, 0x64, - 0x56, 0x4c, 0xef, 0xaf, 0x90, 0x51, 0x07, 0xf8, 0x92, 0x86, 0xb6, 0x60, 0x9e, 0xf4, 0xb9, 0x17, - 0xf2, 0x5e, 0x77, 0xc9, 0x4e, 0x87, 0xaa, 0xa8, 0x7d, 0xaa, 0xfa, 0x4b, 0x9a, 0x67, 0x7e, 0x2d, - 0xa5, 0x0f, 0x4e, 0xe5, 0xb4, 0x3f, 0xcb, 0x01, 0x0a, 0x1b, 0xb3, 0xa4, 0x93, 0xdf, 0x83, 0xc9, - 0x5d, 0x95, 0x08, 0x7a, 0xb4, 0xf7, 0x80, 0x6a, 0xd9, 0x7c, 0x12, 0x09, 0x30, 0xd1, 0x3b, 0x27, - 0xb3, 0x8f, 0x60, 0x70, 0x0f, 0xa1, 0x7b, 0x00, 0xbb, 0x8e, 0xeb, 0xb0, 0xf6, 0x98, 0x2f, 0x97, - 0xf2, 0x36, 0xbf, 0x11, 0x22, 0x60, 0x03, 0xcd, 0xfe, 0x28, 0x67, 0xec, 0x4f, 0x69, 0x2e, 0x47, - 0x5a, 0xd7, 0xe7, 0xe3, 0xca, 0x2c, 0x0d, 0xbe, 0x15, 0x19, 0x8a, 0x99, 0xd8, 0x27, 0x7e, 0x90, - 0xb6, 0xce, 0x5a, 0xa0, 0x72, 0x97, 0xf8, 0x8e, 0x58, 0xf8, 0x68, 0x49, 0xef, 0x12, 0x9f, 0x61, - 0x09, 0x89, 0xbe, 0x2b, 0x86, 0x4a, 0x7b, 0x81, 0x09, 0xcd, 0x6c, 0x13, 0x38, 0xed, 0x99, 0xf3, - 0xa3, 0x3d, 0x86, 0x15, 0xa0, 0xfd, 0xd1, 0xa4, 0xb1, 0xe1, 0xb5, 0xd5, 0xbe, 0x0d, 0xa8, 0x43, - 0x18, 0xbf, 0x45, 0xdc, 0xa6, 0xd8, 0x9e, 0x74, 0xd7, 0xa7, 0xac, 0xad, 0x3d, 0xb4, 0x45, 0x8d, - 0x82, 0x36, 0x07, 0x7a, 0xe0, 0x14, 0x2e, 0x74, 0x39, 0x6e, 0x9c, 0x97, 0x93, 0xc6, 0xf9, 0x6c, - 0x74, 0xda, 0xc6, 0x33, 0xcf, 0xe6, 0x76, 0x2f, 0x9c, 0xc2, 0x76, 0xff, 0x6d, 0x98, 0xdb, 0x4d, - 0xbe, 0x1d, 0xea, 0x4a, 0x82, 0xd7, 0xc6, 0x7c, 0x7a, 0xac, 0x5e, 0x38, 0x8a, 0x1e, 0x9c, 0xa2, - 0x66, 0x3c, 0x28, 0x08, 0x79, 0x41, 0x19, 0xa5, 0x8c, 0x3e, 0x55, 0x62, 0x61, 0xe4, 0x23, 0x97, - 0x88, 0x5b, 0x93, 0x05, 0x94, 0x0a, 0x12, 0xc7, 0x04, 0x24, 0x8e, 0x60, 0xf1, 0x24, 0x8f, 0x20, - 0xba, 0x1c, 0x26, 0xf4, 0xc5, 0x70, 0xa4, 0x2b, 0x9b, 0x1f, 0x48, 0xc5, 0x0b, 0x12, 0x36, 0xfb, - 0xa1, 0x1f, 0x5b, 0x70, 0x41, 0x6c, 0xd6, 0xeb, 0x1f, 0xd2, 0x46, 0x5f, 0x68, 0x25, 0xa8, 0x9d, - 0x5e, 0x28, 0x4b, 0x6d, 0x8c, 0x58, 0x54, 0x5a, 0x4f, 0x83, 0x88, 0xfc, 0xf2, 0x54, 0x32, 0x4e, - 0x17, 0x8c, 0xde, 0x97, 0xa6, 0x83, 0x53, 0x19, 0xf6, 0x3c, 0x7a, 0x78, 0x5f, 0xd2, 0x66, 0x87, - 0x2b, 0xb3, 0xc3, 0xa9, 0xfd, 0xb3, 0xbc, 0x69, 0xad, 0x46, 0x4b, 0x3a, 0xdc, 0x83, 0x09, 0x4e, - 0xd8, 0x9e, 0x3e, 0x05, 0xdf, 0x1a, 0xa3, 0x40, 0x2e, 0x3a, 0x0b, 0xd2, 0x13, 0x97, 0x4d, 0x12, - 0x13, 0x2d, 0x42, 0x8e, 0xb0, 0x64, 0x0a, 0x7a, 0x8d, 0xe1, 0x1c, 0x61, 0xe8, 0x1d, 0x28, 0xf8, - 0x94, 0xfb, 0x07, 0xda, 0x60, 0x5f, 0x19, 0xc3, 0x38, 0x61, 0xc1, 0xaf, 0xd4, 0x20, 0xff, 0xc4, - 0x0a, 0x11, 0x7d, 0x0f, 0x8a, 0x8e, 0xdb, 0xeb, 0x73, 0x15, 0xae, 0x8d, 0x87, 0xbd, 0x21, 0x00, - 0x8c, 0xd7, 0x46, 0x89, 0x87, 0x35, 0xae, 0x91, 0xa9, 0xc9, 0x9f, 0x5a, 0xa6, 0xe6, 0x5d, 0xe3, - 0x22, 0x0f, 0x47, 0x74, 0x52, 0xdf, 0x45, 0xfc, 0xd4, 0x4a, 0xa0, 0x4b, 0x05, 0xa2, 0xb7, 0x60, - 0x92, 0x3b, 0x5d, 0xea, 0xf5, 0x79, 0x36, 0xdf, 0x2b, 0x7c, 0xb7, 0x93, 0xd6, 0x70, 0x5b, 0x41, - 0xe0, 0x00, 0x4b, 0x04, 0xa4, 0xd4, 0xf7, 0x3d, 0x7f, 0xbb, 0x2d, 0xac, 0xbb, 0xd7, 0x51, 0x0e, - 0xce, 0x4c, 0x14, 0x90, 0x5e, 0x8f, 0x51, 0x71, 0xa2, 0xb7, 0xfd, 0x99, 0xe9, 0x25, 0xfe, 0xff, - 0x2f, 0x1c, 0x25, 0x86, 0xee, 0x45, 0xc7, 0x51, 0x57, 0xf6, 0x79, 0x98, 0x6c, 0xd2, 0x5d, 0xd2, - 0xef, 0x0c, 0x78, 0x15, 0xeb, 0xaa, 0x19, 0x07, 0x74, 0xfb, 0x9f, 0x2c, 0x98, 0x7b, 0xdc, 0x45, - 0xa9, 0xf7, 0xe3, 0xbe, 0xf5, 0x38, 0x2a, 0x7b, 0x48, 0x35, 0xea, 0x7d, 0x78, 0x22, 0xdd, 0xea, - 0x8c, 0xa0, 0xb8, 0x8b, 0xba, 0x88, 0x23, 0x51, 0x8d, 0x11, 0xd5, 0x6b, 0x0c, 0xea, 0x4b, 0xfa, - 0x7a, 0x91, 0x21, 0xb1, 0xc6, 0x32, 0x24, 0xe1, 0xe2, 0x0e, 0x35, 0x24, 0xa1, 0x8b, 0x96, 0x3b, - 0x69, 0x17, 0xcd, 0x37, 0x27, 0xa4, 0xbf, 0x71, 0x41, 0xef, 0xe9, 0x4d, 0x6d, 0x65, 0xf9, 0xae, - 0x62, 0x00, 0x66, 0xe8, 0xc6, 0xfe, 0xcc, 0x82, 0x0b, 0xa9, 0xbd, 0x43, 0x2f, 0x37, 0x77, 0x8a, - 0x5e, 0xae, 0x75, 0xd2, 0x2a, 0xbc, 0x67, 0xa8, 0x30, 0x18, 0xc2, 0x49, 0x19, 0xe0, 0x9f, 0xe4, - 0x60, 0x16, 0xd3, 0x9e, 0x17, 0x4b, 0xf8, 0x6e, 0x05, 0x65, 0xc9, 0x19, 0x22, 0xa4, 0xc4, 0xb3, - 0x62, 0x75, 0x32, 0x56, 0x8f, 0xfc, 0x5d, 0x28, 0xc8, 0x5c, 0x6c, 0x36, 0x33, 0x36, 0x90, 0x8a, - 0x56, 0x97, 0xac, 0x4a, 0x6a, 0x2b, 0x40, 0x81, 0x2c, 0xab, 0x64, 0xf4, 0x0d, 0xf8, 0x5a, 0x86, - 0x7a, 0x9b, 0x41, 0x64, 0xd9, 0x8c, 0x15, 0xa0, 0xfd, 0x71, 0x0e, 0x54, 0x34, 0xf5, 0x18, 0xac, - 0xfc, 0x6f, 0xc4, 0xac, 0xfc, 0xca, 0xa8, 0x3e, 0xa1, 0x50, 0xcf, 0xb0, 0x8c, 0x49, 0x32, 0xd2, - 0xbd, 0x94, 0x05, 0xf4, 0xe1, 0xd9, 0x92, 0xbf, 0xb7, 0xa0, 0x24, 0xfb, 0x3d, 0x06, 0x6b, 0xbe, - 0x15, 0xb7, 0xe6, 0x2f, 0x64, 0x98, 0xc5, 0x10, 0x0b, 0xfe, 0x51, 0x5e, 0x8f, 0x3e, 0x8c, 0xa3, - 0xdb, 0xc4, 0x6f, 0xea, 0x08, 0x31, 0x3a, 0x81, 0xa2, 0x11, 0x2b, 0x1a, 0xfa, 0x4d, 0x55, 0x50, - 0x44, 0x19, 0xa7, 0xcd, 0x1b, 0x61, 0xb8, 0x96, 0xcf, 0x5c, 0x19, 0xa5, 0xab, 0xb7, 0xa2, 0x97, - 0x02, 0x9c, 0x40, 0xc5, 0x03, 0x72, 0x44, 0x08, 0xd7, 0x4b, 0xda, 0x32, 0x1d, 0xda, 0xbc, 0x36, - 0xa6, 0xe1, 0x54, 0x21, 0xdc, 0x40, 0x33, 0x1e, 0x14, 0x84, 0xda, 0x30, 0x6d, 0xd6, 0x74, 0xea, - 0xbd, 0xb4, 0x9a, 0xbd, 0x78, 0x54, 0xbd, 0x0c, 0x9b, 0x2d, 0x38, 0x86, 0x6c, 0x1f, 0x16, 0xa1, - 0x6c, 0x6c, 0xbe, 0x44, 0xf6, 0x75, 0xe6, 0x74, 0xb2, 0xaf, 0xe9, 0xc9, 0x82, 0xf2, 0x58, 0xc9, - 0x82, 0x4b, 0xf1, 0x64, 0xc1, 0x37, 0x93, 0xc9, 0x02, 0x90, 0xb3, 0x8b, 0x25, 0x0a, 0x18, 0x9c, - 0xd5, 0x51, 0x73, 0x50, 0x9c, 0x9b, 0x29, 0xfd, 0x32, 0x18, 0x9b, 0x23, 0xe1, 0xc5, 0xde, 0x88, - 0x41, 0xe2, 0x84, 0x08, 0xe1, 0x05, 0xeb, 0x96, 0x7a, 0xbf, 0xdb, 0x25, 0xfe, 0xc1, 0xc2, 0xb4, - 0x1c, 0x70, 0xe8, 0x05, 0xdf, 0x88, 0x51, 0x71, 0xa2, 0x37, 0xda, 0x82, 0xa2, 0x0a, 0xba, 0x75, - 0xc1, 0xe7, 0x8b, 0x59, 0xe2, 0x79, 0x15, 0x62, 0xa8, 0xbf, 0xb1, 0xc6, 0x31, 0xf3, 0x25, 0xa5, - 0x63, 0xf2, 0x25, 0xb7, 0x01, 0x79, 0x3b, 0x32, 0x98, 0x69, 0xde, 0x54, 0x5f, 0x70, 0x8b, 0x5d, - 0x59, 0x94, 0xc1, 0x78, 0xb8, 0x60, 0x77, 0x06, 0x7a, 0xe0, 0x14, 0x2e, 0x71, 0xaa, 0x75, 0xa4, - 0x1e, 0x1e, 0x05, 0x9d, 0x1b, 0xc9, 0xea, 0x60, 0x45, 0xa1, 0xa7, 0x2c, 0x18, 0xac, 0x25, 0x50, - 0xf1, 0x80, 0x1c, 0xf4, 0x01, 0xcc, 0x88, 0x2d, 0x14, 0x09, 0x86, 0x47, 0x14, 0x3c, 0x77, 0x74, - 0xb8, 0x3c, 0xb3, 0x69, 0x42, 0xe2, 0xb8, 0x04, 0xfb, 0x8f, 0xf3, 0x90, 0x9e, 0x27, 0x88, 0xbe, - 0x55, 0xb0, 0x1e, 0xf2, 0xad, 0xc2, 0xdb, 0x50, 0x62, 0x9c, 0xf8, 0xea, 0xbb, 0x8c, 0xdc, 0x78, - 0xdf, 0x65, 0xd4, 0x03, 0x00, 0x1c, 0x61, 0x25, 0x92, 0x36, 0xf9, 0x13, 0x4d, 0xda, 0xac, 0x02, - 0xc8, 0x18, 0xae, 0xe6, 0xf5, 0xf5, 0x33, 0xed, 0x4c, 0x64, 0x13, 0xae, 0x87, 0x14, 0x6c, 0xf4, - 0x42, 0x57, 0xc2, 0x8b, 0x53, 0xbd, 0xcb, 0x5e, 0x1c, 0xa8, 0x2b, 0x49, 0xa6, 0xfd, 0x52, 0x3e, - 0x64, 0x3e, 0xa6, 0x0e, 0xcd, 0xfe, 0xdf, 0x1c, 0xc4, 0x8c, 0x21, 0xfa, 0x91, 0x05, 0x73, 0x24, - 0xf1, 0x2d, 0x78, 0xe0, 0x4b, 0xfe, 0x7a, 0xb6, 0x0f, 0xf4, 0x07, 0x3e, 0x25, 0x8f, 0x5e, 0xc2, - 0x92, 0x5d, 0x18, 0x1e, 0x14, 0x8a, 0xfe, 0xd0, 0x82, 0xf3, 0x64, 0xf0, 0x63, 0x7f, 0xbd, 0xe8, - 0xaf, 0x8f, 0xfd, 0x6b, 0x01, 0xd5, 0x27, 0x8f, 0x0e, 0x97, 0xd3, 0x7e, 0x06, 0x01, 0xa7, 0x89, - 0x43, 0xef, 0xc2, 0x04, 0xf1, 0x5b, 0x41, 0xd6, 0x38, 0xbb, 0xd8, 0xe0, 0x37, 0x1c, 0x22, 0xef, - 0x68, 0xcd, 0x6f, 0x31, 0x2c, 0x41, 0xed, 0x9f, 0xe7, 0x61, 0x36, 0xf9, 0x6d, 0x83, 0x2e, 0x55, - 0x9c, 0x48, 0x2d, 0x55, 0x14, 0x67, 0xa4, 0xc1, 0xc3, 0xba, 0xc1, 0xe8, 0x8c, 0x88, 0x46, 0xac, - 0x68, 0xe1, 0x19, 0x91, 0x15, 0xc7, 0x85, 0x47, 0x38, 0x23, 0xb2, 0xcc, 0x38, 0xc2, 0x42, 0x57, - 0xe2, 0x77, 0x8b, 0x9d, 0xbc, 0x5b, 0xe6, 0xcc, 0xb9, 0x8c, 0x9b, 0x8b, 0xee, 0x42, 0xd9, 0x58, - 0x07, 0x7d, 0x12, 0xaf, 0x66, 0xd6, 0x7b, 0xb4, 0xed, 0xce, 0xa9, 0x1f, 0x82, 0x88, 0x28, 0x26, - 0x7e, 0x74, 0xee, 0xa5, 0xb6, 0x1e, 0x29, 0x59, 0x2b, 0xd5, 0x65, 0xa0, 0xd9, 0xff, 0x66, 0xc1, - 0x4c, 0xac, 0x7e, 0x56, 0x48, 0x0b, 0xea, 0x94, 0xc7, 0xff, 0x69, 0x84, 0xbb, 0x21, 0x02, 0x36, - 0xd0, 0xd0, 0xf7, 0xa1, 0xdc, 0xf1, 0xdc, 0x16, 0x65, 0xbc, 0xee, 0x91, 0x3d, 0x7d, 0x4e, 0xb2, - 0xa6, 0xac, 0x16, 0x8e, 0x0e, 0x97, 0xe7, 0x37, 0x15, 0x4c, 0xcd, 0xeb, 0xf6, 0x3a, 0x94, 0xab, - 0x02, 0x73, 0x6c, 0x82, 0xcb, 0xf7, 0xdc, 0xb7, 0x89, 0x4f, 0xdb, 0x5e, 0x9f, 0xd1, 0xaf, 0xeb, - 0x7b, 0x6e, 0x38, 0xc0, 0x93, 0x7e, 0xcf, 0x8d, 0x80, 0x8f, 0x7f, 0xcf, 0x0d, 0xfb, 0x7e, 0x6d, - 0xdf, 0x73, 0xc3, 0x11, 0x0e, 0x89, 0x54, 0xfe, 0x27, 0x67, 0xcc, 0x22, 0x1e, 0xad, 0xe4, 0x1e, - 0x12, 0xad, 0xdc, 0x87, 0x29, 0xc7, 0xe5, 0xd4, 0xdf, 0x27, 0x1d, 0x9d, 0xd5, 0xce, 0xba, 0x17, - 0xc3, 0xa9, 0x6e, 0x68, 0x1c, 0x1c, 0x22, 0xa2, 0x0e, 0x5c, 0x08, 0x5e, 0x7a, 0x7c, 0x4a, 0xa2, - 0x97, 0x66, 0x5d, 0xad, 0xf5, 0x6a, 0xf0, 0x24, 0x71, 0x23, 0xad, 0xd3, 0x83, 0x61, 0x04, 0x9c, - 0x0e, 0x8a, 0x18, 0xcc, 0x30, 0x23, 0x4c, 0x0f, 0x6e, 0xc4, 0x11, 0x5f, 0xc9, 0x92, 0x99, 0x0d, - 0xa3, 0xc4, 0xcb, 0x04, 0xc5, 0x71, 0x19, 0xf6, 0x3f, 0xe7, 0xe1, 0x5c, 0x62, 0xa7, 0x25, 0xc2, - 0x91, 0xd2, 0xe3, 0x0c, 0x47, 0x8a, 0x63, 0x85, 0x23, 0xe9, 0x9e, 0xf2, 0xc4, 0x58, 0x9e, 0xf2, - 0x1b, 0xca, 0x5b, 0xd5, 0x2b, 0xb7, 0xb1, 0xae, 0x2b, 0xe2, 0x43, 0x6d, 0x6e, 0x9a, 0x44, 0x1c, - 0xef, 0x2b, 0xdd, 0x89, 0xe6, 0xe0, 0x27, 0xf6, 0xda, 0xd5, 0x7e, 0x3d, 0x6b, 0x49, 0x63, 0x08, - 0xa0, 0xdc, 0x89, 0x14, 0x02, 0x4e, 0x13, 0x57, 0xbd, 0xfd, 0xe9, 0x97, 0x4b, 0x67, 0x3e, 0xff, - 0x72, 0xe9, 0xcc, 0x17, 0x5f, 0x2e, 0x9d, 0xf9, 0xe1, 0xd1, 0x92, 0xf5, 0xe9, 0xd1, 0x92, 0xf5, - 0xf9, 0xd1, 0x92, 0xf5, 0xc5, 0xd1, 0x92, 0xf5, 0x9f, 0x47, 0x4b, 0xd6, 0x8f, 0xbf, 0x5a, 0x3a, - 0x73, 0xef, 0x99, 0x51, 0x7e, 0x7a, 0xeb, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xae, 0xe1, 0x2f, - 0xc6, 0xa1, 0x4b, 0x00, 0x00, + 0x76, 0x9f, 0x26, 0x45, 0x4a, 0x7c, 0x94, 0x46, 0x52, 0x8d, 0xc6, 0xd6, 0x6a, 0x63, 0x69, 0xd2, + 0x36, 0x0c, 0x3b, 0xb6, 0xa9, 0x8c, 0xfc, 0x35, 0x1e, 0x6f, 0x26, 0x10, 0xa9, 0xf9, 0xd0, 0xac, + 0xd6, 0xa3, 0x14, 0xe5, 0xf1, 0x7a, 0x3c, 0x86, 0xd3, 0x22, 0x4b, 0x64, 0xaf, 0xc8, 0x6e, 0xba, + 0xaa, 0xa8, 0xb5, 0x92, 0x20, 0xd9, 0x7c, 0x01, 0x8b, 0x04, 0x09, 0xf6, 0x60, 0xc0, 0x1b, 0x20, + 0x01, 0x82, 0xe4, 0xb8, 0x48, 0xfe, 0x81, 0x1c, 0x7c, 0xd8, 0x8b, 0x11, 0x18, 0x89, 0x91, 0x04, + 0x88, 0x0f, 0x1b, 0x25, 0xd6, 0x02, 0x39, 0xe6, 0x96, 0xcb, 0x00, 0x01, 0x82, 0xfa, 0xe8, 0xee, + 0xea, 0x66, 0x73, 0xc4, 0xe6, 0x48, 0x03, 0x27, 0x37, 0xaa, 0x5e, 0xd5, 0xef, 0x55, 0xbd, 0xaa, + 0xf7, 0xea, 0xbd, 0x57, 0xaf, 0x05, 0xaf, 0xb4, 0x5c, 0xde, 0xee, 0xef, 0x56, 0x1a, 0x7e, 0x77, + 0xd5, 0xd9, 0xef, 0xbb, 0xfc, 0x70, 0x75, 0xdf, 0xa1, 0x2d, 0x7f, 0xd5, 0xe9, 0xb9, 0xab, 0x07, + 0x97, 0x9d, 0x4e, 0xaf, 0xed, 0x5c, 0x5e, 0x6d, 0x11, 0x8f, 0x50, 0x87, 0x93, 0x66, 0xa5, 0x47, + 0x7d, 0xee, 0xa3, 0x67, 0xa2, 0x51, 0x15, 0x35, 0xaa, 0x22, 0x47, 0x55, 0x9c, 0x9e, 0x5b, 0x09, + 0x46, 0x2d, 0xbd, 0x64, 0x60, 0xb7, 0xfc, 0x96, 0xbf, 0x2a, 0x07, 0xef, 0xf6, 0xf7, 0xe4, 0x5f, + 0xf2, 0x0f, 0xf9, 0x4b, 0x81, 0x2e, 0xdd, 0xda, 0xbf, 0xc2, 0x2a, 0xae, 0xe4, 0x4c, 0x3e, 0xe2, + 0xc4, 0x63, 0xae, 0xef, 0xb1, 0x97, 0x9c, 0x9e, 0xcb, 0x08, 0x3d, 0x20, 0x74, 0xb5, 0xb7, 0xdf, + 0x12, 0x34, 0x16, 0xef, 0xb0, 0x7a, 0x30, 0x30, 0xbd, 0xa5, 0x57, 0x22, 0xa4, 0xae, 0xd3, 0x68, + 0xbb, 0x1e, 0xa1, 0x87, 0xd1, 0xf0, 0x2e, 0xe1, 0x4e, 0xda, 0xa8, 0xd5, 0x61, 0xa3, 0x68, 0xdf, + 0xe3, 0x6e, 0x97, 0x0c, 0x0c, 0x78, 0xed, 0xa4, 0x01, 0xac, 0xd1, 0x26, 0x5d, 0x27, 0x39, 0xce, + 0xbe, 0x0f, 0x17, 0xd6, 0x3d, 0xa7, 0x73, 0xc8, 0x5c, 0x86, 0xfb, 0xde, 0x3a, 0x6d, 0xf5, 0xbb, + 0xc4, 0xe3, 0xe8, 0x12, 0x4c, 0x78, 0x4e, 0x97, 0x2c, 0x5a, 0x97, 0xac, 0xe7, 0x4a, 0xd5, 0xe9, + 0xcf, 0x8e, 0x56, 0xce, 0x1d, 0x1f, 0xad, 0x4c, 0xbc, 0xe5, 0x74, 0x09, 0x96, 0x14, 0xf4, 0x34, + 0x14, 0x0e, 0x9c, 0x4e, 0x9f, 0x2c, 0xe6, 0x64, 0x97, 0x19, 0xdd, 0xa5, 0x70, 0x57, 0x34, 0x62, + 0x45, 0xb3, 0x7f, 0x3f, 0x1f, 0x83, 0xff, 0x0e, 0xe1, 0x4e, 0xd3, 0xe1, 0x0e, 0xea, 0x42, 0xb1, + 0xe3, 0xec, 0x92, 0x0e, 0x5b, 0xb4, 0x2e, 0xe5, 0x9f, 0x2b, 0xaf, 0x5d, 0xaf, 0x8c, 0xb2, 0x89, + 0x95, 0x14, 0xa8, 0xca, 0x96, 0xc4, 0xb9, 0xee, 0x71, 0x7a, 0x58, 0x3d, 0xaf, 0x27, 0x51, 0x54, + 0x8d, 0x58, 0x33, 0x41, 0xbf, 0x6b, 0x41, 0xd9, 0xf1, 0x3c, 0x9f, 0x3b, 0x5c, 0x6c, 0xd3, 0x62, + 0x4e, 0x32, 0xbd, 0x3d, 0x3e, 0xd3, 0xf5, 0x08, 0x4c, 0x71, 0xbe, 0xa0, 0x39, 0x97, 0x0d, 0x0a, + 0x36, 0x79, 0x2e, 0xbd, 0x01, 0x65, 0x63, 0xaa, 0x68, 0x0e, 0xf2, 0xfb, 0xe4, 0x50, 0xc9, 0x17, + 0x8b, 0x9f, 0x68, 0x21, 0x26, 0x50, 0x2d, 0xc1, 0xab, 0xb9, 0x2b, 0xd6, 0xd2, 0x35, 0x98, 0x4b, + 0x32, 0xcc, 0x32, 0xde, 0xfe, 0x53, 0x0b, 0x16, 0x8c, 0x55, 0x60, 0xb2, 0x47, 0x28, 0xf1, 0x1a, + 0x04, 0xad, 0x42, 0x49, 0xec, 0x25, 0xeb, 0x39, 0x8d, 0x60, 0xab, 0xe7, 0xf5, 0x42, 0x4a, 0x6f, + 0x05, 0x04, 0x1c, 0xf5, 0x09, 0x8f, 0x45, 0xee, 0x61, 0xc7, 0xa2, 0xd7, 0x76, 0x18, 0x59, 0xcc, + 0xc7, 0x8f, 0xc5, 0xb6, 0x68, 0xc4, 0x8a, 0x66, 0xff, 0x0a, 0x7c, 0x23, 0x98, 0xcf, 0x0e, 0xe9, + 0xf6, 0x3a, 0x0e, 0x27, 0xd1, 0xa4, 0x4e, 0x3c, 0x7a, 0xf6, 0x3e, 0xcc, 0xac, 0xf7, 0x7a, 0xd4, + 0x3f, 0x20, 0xcd, 0x3a, 0x77, 0x5a, 0x04, 0xdd, 0x03, 0x70, 0x74, 0xc3, 0x3a, 0x97, 0x03, 0xcb, + 0x6b, 0xbf, 0x54, 0x51, 0x1a, 0x51, 0x31, 0x35, 0xa2, 0xd2, 0xdb, 0x6f, 0x89, 0x06, 0x56, 0x11, + 0x8a, 0x57, 0x39, 0xb8, 0x5c, 0xd9, 0x71, 0xbb, 0xa4, 0x7a, 0xfe, 0xf8, 0x68, 0x05, 0xd6, 0x43, + 0x04, 0x6c, 0xa0, 0xd9, 0xbf, 0x67, 0xc1, 0xc5, 0x75, 0xda, 0xf2, 0x6b, 0x1b, 0xeb, 0xbd, 0xde, + 0x2d, 0xe2, 0x74, 0x78, 0xbb, 0xce, 0x1d, 0xde, 0x67, 0xe8, 0x1a, 0x14, 0x99, 0xfc, 0xa5, 0xa7, + 0xfa, 0x6c, 0x70, 0xfa, 0x14, 0xfd, 0xc1, 0xd1, 0xca, 0x42, 0xca, 0x40, 0x82, 0xf5, 0x28, 0xf4, + 0x3c, 0x4c, 0x76, 0x09, 0x63, 0x4e, 0x2b, 0x90, 0xe7, 0xac, 0x06, 0x98, 0xfc, 0x8e, 0x6a, 0xc6, + 0x01, 0xdd, 0xfe, 0xfb, 0x1c, 0xcc, 0x86, 0x58, 0x9a, 0xfd, 0x19, 0x6c, 0x5e, 0x1f, 0xa6, 0xdb, + 0xc6, 0x0a, 0xe5, 0x1e, 0x96, 0xd7, 0xde, 0x1c, 0x51, 0x4f, 0xd2, 0x84, 0x54, 0x5d, 0xd0, 0x6c, + 0xa6, 0xcd, 0x56, 0x1c, 0x63, 0x83, 0xba, 0x00, 0xec, 0xd0, 0x6b, 0x68, 0xa6, 0x13, 0x92, 0xe9, + 0x1b, 0x19, 0x99, 0xd6, 0x43, 0x80, 0x2a, 0xd2, 0x2c, 0x21, 0x6a, 0xc3, 0x06, 0x03, 0xfb, 0x6f, + 0x2d, 0xb8, 0x90, 0x32, 0x0e, 0x7d, 0x2b, 0xb1, 0x9f, 0xcf, 0x0c, 0xec, 0x27, 0x1a, 0x18, 0x16, + 0xed, 0xe6, 0x8b, 0x30, 0x45, 0xc9, 0x81, 0x2b, 0xee, 0x01, 0x2d, 0xe1, 0x39, 0x3d, 0x7e, 0x0a, + 0xeb, 0x76, 0x1c, 0xf6, 0x40, 0x2f, 0x40, 0x29, 0xf8, 0x2d, 0xc4, 0x9c, 0x17, 0xaa, 0x22, 0x36, + 0x2e, 0xe8, 0xca, 0x70, 0x44, 0xb7, 0x7f, 0x07, 0x0a, 0xb5, 0xb6, 0x43, 0xb9, 0x38, 0x31, 0x94, + 0xf4, 0xfc, 0xb7, 0xf1, 0x96, 0x9e, 0x62, 0x78, 0x62, 0xb0, 0x6a, 0xc6, 0x01, 0x7d, 0x84, 0xcd, + 0x7e, 0x1e, 0x26, 0x0f, 0x08, 0x95, 0xf3, 0xcd, 0xc7, 0xc1, 0xee, 0xaa, 0x66, 0x1c, 0xd0, 0xed, + 0x7f, 0xb6, 0x60, 0x41, 0xce, 0x60, 0xc3, 0x65, 0x0d, 0xff, 0x80, 0xd0, 0x43, 0x4c, 0x58, 0xbf, + 0x73, 0xca, 0x13, 0xda, 0x80, 0x39, 0x46, 0xba, 0x07, 0x84, 0xd6, 0x7c, 0x8f, 0x71, 0xea, 0xb8, + 0x1e, 0xd7, 0x33, 0x5b, 0xd4, 0xbd, 0xe7, 0xea, 0x09, 0x3a, 0x1e, 0x18, 0x81, 0x9e, 0x83, 0x29, + 0x3d, 0x6d, 0x71, 0x94, 0x84, 0x60, 0xa7, 0xc5, 0x1e, 0xe8, 0x35, 0x31, 0x1c, 0x52, 0xed, 0xff, + 0xb4, 0x60, 0x5e, 0xae, 0xaa, 0xde, 0xdf, 0x65, 0x0d, 0xea, 0xf6, 0x84, 0x79, 0xfd, 0x3a, 0x2e, + 0xe9, 0x1a, 0x9c, 0x6f, 0x06, 0x82, 0xdf, 0x72, 0xbb, 0x2e, 0x97, 0x3a, 0x52, 0xa8, 0x3e, 0xa1, + 0x31, 0xce, 0x6f, 0xc4, 0xa8, 0x38, 0xd1, 0x5b, 0x6d, 0x5f, 0xa7, 0xcf, 0x38, 0xa1, 0xdb, 0xd4, + 0xef, 0xfa, 0x62, 0x9d, 0x3b, 0x0e, 0xdb, 0x47, 0xbf, 0x0e, 0x53, 0x5d, 0x7d, 0xa5, 0x69, 0xab, + 0xf9, 0xcb, 0xa3, 0x59, 0xcd, 0x3b, 0xbb, 0xdf, 0x23, 0x0d, 0x2e, 0xae, 0xc3, 0x48, 0xdb, 0xa2, + 0x36, 0x1c, 0xa2, 0xa2, 0x77, 0x61, 0x82, 0xf5, 0x48, 0x43, 0x8a, 0xa8, 0xbc, 0xf6, 0xfa, 0x68, + 0x4a, 0x1d, 0x9b, 0x64, 0xbd, 0x47, 0x1a, 0x91, 0x6c, 0xc5, 0x5f, 0x58, 0x42, 0xda, 0xff, 0x66, + 0xc1, 0x62, 0xda, 0xaa, 0xb6, 0x5c, 0xc6, 0xd1, 0xfd, 0x81, 0x95, 0x55, 0x46, 0x5b, 0x99, 0x18, + 0x2d, 0xd7, 0x15, 0x6a, 0x6f, 0xd0, 0x62, 0xac, 0xaa, 0x01, 0x05, 0x97, 0x93, 0x6e, 0xe0, 0x48, + 0x5c, 0x1b, 0x6d, 0x59, 0xc3, 0x26, 0x1b, 0x5d, 0x92, 0x9b, 0x02, 0x14, 0x2b, 0x6c, 0xfb, 0x3d, + 0x98, 0xae, 0xf5, 0x29, 0x25, 0x1e, 0x57, 0x97, 0xdc, 0xb7, 0xa1, 0xc0, 0x5c, 0x4f, 0xdb, 0xfa, + 0x6c, 0xf7, 0x5b, 0x49, 0x80, 0xd7, 0xc5, 0x60, 0xac, 0x30, 0xec, 0x3f, 0xcf, 0xc3, 0x85, 0xe0, + 0xd4, 0x90, 0xe6, 0x3a, 0xe5, 0xee, 0x9e, 0xd3, 0xe0, 0x0c, 0x35, 0x61, 0xba, 0x19, 0x35, 0x73, + 0x6d, 0x8c, 0xb3, 0xf0, 0x0a, 0x0d, 0xbe, 0x01, 0xcf, 0x71, 0x0c, 0x15, 0xbd, 0x03, 0xf9, 0x96, + 0xcb, 0xb5, 0xef, 0x77, 0x65, 0x34, 0xe9, 0xdd, 0x74, 0x93, 0xd6, 0xa7, 0x5a, 0xd6, 0xac, 0xf2, + 0x37, 0x5d, 0x8e, 0x05, 0x22, 0xda, 0x85, 0xa2, 0xdb, 0x75, 0x5a, 0x24, 0xd8, 0x99, 0xab, 0xa3, + 0x61, 0x6f, 0x8a, 0x31, 0x49, 0xf4, 0xd0, 0x99, 0x94, 0x54, 0x86, 0x35, 0xb2, 0xe0, 0xd1, 0x10, + 0x56, 0x43, 0xd9, 0xed, 0x91, 0x79, 0xa4, 0xd9, 0xcf, 0x88, 0x87, 0xa4, 0x32, 0xac, 0x91, 0xed, + 0x2f, 0x73, 0x30, 0x17, 0xc9, 0xaf, 0xe6, 0x77, 0xbb, 0x2e, 0x47, 0x4b, 0x90, 0x73, 0x9b, 0xda, + 0x28, 0x81, 0x1e, 0x98, 0xdb, 0xdc, 0xc0, 0x39, 0xb7, 0x89, 0x9e, 0x85, 0xe2, 0x2e, 0x75, 0xbc, + 0x46, 0x5b, 0x1b, 0xa3, 0x10, 0xb8, 0x2a, 0x5b, 0xb1, 0xa6, 0xa2, 0xa7, 0x20, 0xcf, 0x9d, 0x96, + 0xb6, 0x41, 0xa1, 0xfc, 0x76, 0x9c, 0x16, 0x16, 0xed, 0xc2, 0xf8, 0xb1, 0xbe, 0xd4, 0x63, 0xb9, + 0xf3, 0x86, 0xf1, 0xab, 0xab, 0x66, 0x1c, 0xd0, 0x05, 0x47, 0xa7, 0xcf, 0xdb, 0x3e, 0x5d, 0x2c, + 0xc4, 0x39, 0xae, 0xcb, 0x56, 0xac, 0xa9, 0xc2, 0x4d, 0x69, 0xc8, 0xf9, 0x73, 0x42, 0x17, 0x8b, + 0x71, 0x37, 0xa5, 0x16, 0x10, 0x70, 0xd4, 0x07, 0xbd, 0x0f, 0xe5, 0x06, 0x25, 0x0e, 0xf7, 0xe9, + 0x86, 0xc3, 0xc9, 0xe2, 0x64, 0xe6, 0x13, 0x38, 0x2b, 0xfc, 0xf0, 0x5a, 0x04, 0x81, 0x4d, 0x3c, + 0xfb, 0xbf, 0x2c, 0x58, 0x8c, 0x44, 0x2b, 0xf7, 0x36, 0xf2, 0x3d, 0xb5, 0x78, 0xac, 0x21, 0xe2, + 0x79, 0x16, 0x8a, 0x4d, 0xb7, 0x45, 0x18, 0x4f, 0x4a, 0x79, 0x43, 0xb6, 0x62, 0x4d, 0x45, 0x6b, + 0x00, 0x2d, 0x97, 0xeb, 0xfb, 0x42, 0x0b, 0x3b, 0xb4, 0x93, 0x37, 0x43, 0x0a, 0x36, 0x7a, 0xa1, + 0x77, 0xa0, 0x24, 0xa7, 0x39, 0xa6, 0xda, 0x49, 0xef, 0xa1, 0x16, 0x00, 0xe0, 0x08, 0xcb, 0xfe, + 0x62, 0x02, 0x26, 0x6f, 0x50, 0xe2, 0xb6, 0xda, 0xfc, 0x31, 0x18, 0xfc, 0xa7, 0xa1, 0xe0, 0x74, + 0x5c, 0x87, 0xc9, 0x7d, 0x33, 0xfc, 0xff, 0x75, 0xd1, 0x88, 0x15, 0x0d, 0xbd, 0x07, 0x45, 0x9f, + 0xba, 0x2d, 0xd7, 0x5b, 0x2c, 0xc9, 0x49, 0xbc, 0x3c, 0x9a, 0x0a, 0xe9, 0x55, 0xdc, 0x91, 0x43, + 0x23, 0xe1, 0xab, 0xbf, 0xb1, 0x86, 0x44, 0xf7, 0x60, 0x52, 0x1d, 0xa6, 0x40, 0x41, 0x57, 0x47, + 0x36, 0x30, 0xea, 0x3c, 0x46, 0x87, 0x5e, 0xfd, 0xcd, 0x70, 0x00, 0x88, 0xea, 0xa1, 0x7d, 0x99, + 0x90, 0xd0, 0x2f, 0x64, 0xb0, 0x2f, 0x43, 0x0d, 0x4a, 0x3d, 0x34, 0x28, 0x85, 0x2c, 0xa0, 0xd2, + 0x64, 0x0c, 0xb3, 0x20, 0x42, 0xc4, 0xda, 0x99, 0x2d, 0x8e, 0x21, 0x62, 0xed, 0x49, 0x9f, 0x8f, + 0x7b, 0xc0, 0x81, 0xaf, 0x6b, 0x7f, 0x9c, 0x87, 0x79, 0xdd, 0xb3, 0xe6, 0x77, 0x3a, 0xa4, 0x21, + 0x3d, 0x27, 0x65, 0x9f, 0xf2, 0xa9, 0xf6, 0xc9, 0x0d, 0x6e, 0x4c, 0x65, 0xf3, 0xab, 0x99, 0x66, + 0x13, 0xf1, 0xa8, 0xc8, 0x1b, 0x52, 0x85, 0xdc, 0xe1, 0x2e, 0xe9, 0x5e, 0xfa, 0xde, 0x44, 0x7f, + 0x68, 0xc1, 0x85, 0x03, 0x42, 0xdd, 0x3d, 0xb7, 0x21, 0x03, 0xe6, 0x5b, 0x2e, 0xe3, 0x3e, 0x3d, + 0xd4, 0x37, 0xc2, 0x6b, 0xa3, 0x71, 0xbe, 0x6b, 0x00, 0x6c, 0x7a, 0x7b, 0x7e, 0xf5, 0x9b, 0x9a, + 0xdb, 0x85, 0xbb, 0x83, 0xd0, 0x38, 0x8d, 0xdf, 0x52, 0x0f, 0x20, 0x9a, 0x6d, 0x4a, 0xbc, 0xbe, + 0x65, 0xc6, 0xeb, 0x23, 0x4f, 0x2c, 0x58, 0x6c, 0x60, 0xb2, 0xcc, 0x38, 0xff, 0x53, 0x0b, 0xca, + 0x9a, 0xfe, 0x18, 0x9c, 0x20, 0x1c, 0x77, 0x82, 0x5e, 0xca, 0x34, 0xff, 0x21, 0x3e, 0x0f, 0x85, + 0x99, 0x98, 0x92, 0xa3, 0x57, 0x61, 0x62, 0xdf, 0xf5, 0x82, 0x5b, 0xef, 0x17, 0x03, 0x37, 0xf0, + 0xdb, 0xae, 0xd7, 0x7c, 0x70, 0xb4, 0x32, 0x1f, 0xeb, 0x2c, 0x1a, 0xb1, 0xec, 0x7e, 0xb2, 0x67, + 0x7e, 0x75, 0xea, 0xc7, 0x7f, 0xb9, 0x72, 0xee, 0x07, 0x3f, 0xbb, 0x74, 0xce, 0xfe, 0x24, 0x0f, + 0x73, 0x49, 0xa9, 0x8e, 0x90, 0xff, 0x8a, 0x6c, 0xd8, 0xd4, 0x99, 0xda, 0xb0, 0xdc, 0xd9, 0xd9, + 0xb0, 0xfc, 0x59, 0xd8, 0xb0, 0x89, 0x53, 0xb3, 0x61, 0xf6, 0x3f, 0x58, 0x70, 0x3e, 0xdc, 0x99, + 0x0f, 0xfb, 0xe2, 0x66, 0x8d, 0xa4, 0x6e, 0x9d, 0xbe, 0xd4, 0x3f, 0x80, 0x49, 0xe6, 0xf7, 0x69, + 0x43, 0xba, 0x8f, 0x02, 0xfd, 0x95, 0x6c, 0x46, 0x53, 0x8d, 0x35, 0x7c, 0x26, 0xd5, 0x80, 0x03, + 0x54, 0x73, 0x41, 0x9a, 0xa6, 0x5c, 0x0a, 0x2a, 0x1c, 0x2e, 0xb1, 0xa0, 0x29, 0xd3, 0xa5, 0x10, + 0xad, 0x58, 0x53, 0x91, 0x2d, 0xed, 0x79, 0xe0, 0xd9, 0x96, 0xaa, 0xa0, 0xcd, 0xb2, 0xdc, 0x04, + 0x45, 0x41, 0x3d, 0x98, 0xa3, 0xe4, 0xc3, 0xbe, 0x4b, 0x49, 0xb3, 0xee, 0x3b, 0xfb, 0xc2, 0x2f, + 0xd0, 0x29, 0x9c, 0x11, 0xf5, 0x7e, 0xa3, 0x4f, 0xa5, 0x09, 0xab, 0x2e, 0x88, 0xc8, 0x14, 0x27, + 0xb0, 0xf0, 0x00, 0xba, 0xfd, 0xef, 0x85, 0x50, 0x61, 0x75, 0x12, 0xe5, 0x37, 0xa1, 0xdc, 0x50, + 0x51, 0x4b, 0xe7, 0x70, 0xd3, 0xd3, 0x47, 0x6c, 0x63, 0x8c, 0xcb, 0xa7, 0x52, 0x8b, 0x60, 0x12, + 0x39, 0x56, 0x83, 0x82, 0x4d, 0x6e, 0xe8, 0xfb, 0x00, 0xca, 0x12, 0x93, 0xe6, 0xa6, 0xa7, 0xaf, + 0x9a, 0xda, 0x38, 0xbc, 0xef, 0x86, 0x28, 0x8a, 0x75, 0xe8, 0xf3, 0x44, 0x04, 0x6c, 0xb0, 0x12, + 0xab, 0x0e, 0x52, 0x86, 0x37, 0x7c, 0xaa, 0x75, 0x76, 0xac, 0x55, 0xaf, 0x47, 0x30, 0xc9, 0xcc, + 0x72, 0x44, 0xc1, 0x26, 0xb7, 0x25, 0x0a, 0x73, 0x49, 0x59, 0xa5, 0x5c, 0x37, 0xb7, 0xe2, 0xd7, + 0xcd, 0xda, 0x88, 0x0a, 0x6a, 0x44, 0xa0, 0x66, 0x4a, 0x9a, 0xc2, 0x6c, 0x42, 0x46, 0x29, 0x2c, + 0x37, 0xe3, 0x2c, 0x5f, 0xce, 0x72, 0xf5, 0xea, 0xd4, 0xae, 0xc9, 0x93, 0xc1, 0x5c, 0x52, 0x3a, + 0xa7, 0xc6, 0x34, 0x96, 0x4f, 0x36, 0xef, 0xd4, 0xbf, 0xc8, 0x41, 0x29, 0xb4, 0xaa, 0x59, 0x92, + 0x43, 0xca, 0x1b, 0xca, 0x9d, 0x10, 0xad, 0xe5, 0x47, 0x89, 0xd6, 0x26, 0x86, 0x47, 0x6b, 0x41, + 0x02, 0xb9, 0xf8, 0xf0, 0x04, 0xb2, 0x11, 0xad, 0x4d, 0x8e, 0x1e, 0xad, 0x4d, 0x9d, 0x1c, 0xad, + 0xd9, 0x7f, 0x65, 0x01, 0x1a, 0x0c, 0xcd, 0xb3, 0x08, 0xca, 0x49, 0xde, 0x75, 0x23, 0x7a, 0x42, + 0xc9, 0xf8, 0x78, 0xf8, 0x95, 0x67, 0x7f, 0x5a, 0x80, 0xd9, 0x9b, 0xee, 0xd8, 0x79, 0x3e, 0x0e, + 0x4f, 0x2a, 0xa4, 0x3a, 0xd1, 0x7e, 0x68, 0x9d, 0x53, 0x87, 0x93, 0xd6, 0xa1, 0xde, 0xdf, 0xab, + 0x7a, 0xe8, 0x93, 0xb5, 0xf4, 0x6e, 0x0f, 0x86, 0x93, 0xf0, 0x30, 0xe8, 0x91, 0x0f, 0xc9, 0x9b, + 0x30, 0xc3, 0x38, 0x75, 0x1b, 0x5c, 0x65, 0x12, 0xd9, 0x62, 0x59, 0x5e, 0x24, 0x17, 0x75, 0xf7, + 0x99, 0xba, 0x49, 0xc4, 0xf1, 0xbe, 0xa9, 0x09, 0xca, 0x89, 0xcc, 0x09, 0xca, 0x55, 0x28, 0x39, + 0x9d, 0x8e, 0xff, 0xfd, 0x1d, 0xa7, 0xc5, 0x74, 0x3a, 0x20, 0x3c, 0x35, 0xeb, 0x01, 0x01, 0x47, + 0x7d, 0x50, 0x05, 0xc0, 0x6d, 0x79, 0x3e, 0x25, 0x72, 0x44, 0x51, 0xde, 0x68, 0xf2, 0x11, 0x66, + 0x33, 0x6c, 0xc5, 0x46, 0x0f, 0x54, 0x87, 0x8b, 0xae, 0xc7, 0x48, 0xa3, 0x4f, 0x49, 0x7d, 0xdf, + 0xed, 0xed, 0x6c, 0xd5, 0xa5, 0x95, 0x38, 0x94, 0xa7, 0x79, 0xaa, 0xfa, 0x94, 0x66, 0x76, 0x71, + 0x33, 0xad, 0x13, 0x4e, 0x1f, 0x8b, 0x5e, 0x81, 0x69, 0xd7, 0x6b, 0x74, 0xfa, 0x4d, 0xb2, 0xed, + 0xf0, 0x36, 0x5b, 0x9c, 0x92, 0xd3, 0x98, 0x3b, 0x3e, 0x5a, 0x99, 0xde, 0x34, 0xda, 0x71, 0xac, + 0x97, 0x18, 0x45, 0x3e, 0x32, 0x46, 0x95, 0xa2, 0x51, 0xd7, 0x3f, 0x32, 0x47, 0x99, 0xbd, 0x52, + 0x52, 0xb8, 0x90, 0x29, 0x85, 0xfb, 0x93, 0x1c, 0x14, 0xd5, 0x0b, 0x0a, 0x7a, 0x35, 0xf1, 0x4c, + 0xf1, 0xd4, 0xc0, 0x33, 0x45, 0x39, 0xed, 0xb5, 0xc9, 0x86, 0xa2, 0xcb, 0x58, 0x3f, 0xee, 0x40, + 0x6c, 0xca, 0x16, 0xac, 0x29, 0x32, 0xb5, 0xe5, 0x7b, 0x7b, 0x6e, 0x4b, 0x27, 0x20, 0xae, 0x19, + 0x6e, 0x43, 0xf4, 0xca, 0xfd, 0x41, 0xf8, 0x0c, 0x1e, 0x79, 0x10, 0xb1, 0x0e, 0xc2, 0x95, 0xb8, + 0x5d, 0xbf, 0xf3, 0x96, 0xe2, 0x51, 0x93, 0x88, 0x58, 0x23, 0x0b, 0x1e, 0x7e, 0x9f, 0xf7, 0xfa, + 0x5c, 0x1e, 0x94, 0x53, 0xe2, 0x71, 0x47, 0x22, 0x62, 0x8d, 0x6c, 0x7f, 0x62, 0xc1, 0xac, 0x92, + 0x41, 0xad, 0x4d, 0x1a, 0xfb, 0x75, 0x4e, 0x7a, 0xc2, 0xa3, 0xef, 0x33, 0xc2, 0x92, 0x1e, 0xfd, + 0xdb, 0x8c, 0x30, 0x2c, 0x29, 0xc6, 0xea, 0x73, 0x67, 0xb5, 0x7a, 0xfb, 0x6f, 0x2c, 0x28, 0x48, + 0xd7, 0x39, 0x8b, 0xfd, 0x89, 0xa7, 0x93, 0x72, 0x23, 0xa5, 0x93, 0x4e, 0x48, 0xf4, 0x45, 0x99, + 0xac, 0x89, 0x87, 0x65, 0xb2, 0xec, 0x9f, 0x5b, 0xb0, 0x90, 0x96, 0x1d, 0xcd, 0x32, 0xfd, 0x17, + 0x61, 0xaa, 0xd7, 0x71, 0xf8, 0x9e, 0x4f, 0xbb, 0xc9, 0x97, 0xb1, 0x6d, 0xdd, 0x8e, 0xc3, 0x1e, + 0x88, 0x02, 0xd0, 0x20, 0x0c, 0x0b, 0x42, 0x94, 0x6b, 0x59, 0x6f, 0x84, 0x78, 0x5a, 0x2f, 0x12, + 0x56, 0xd8, 0xc4, 0xb0, 0xc1, 0xc5, 0xfe, 0xe3, 0x02, 0xcc, 0xcb, 0x21, 0xe3, 0xde, 0x10, 0xe3, + 0xec, 0x50, 0x0f, 0x9e, 0x90, 0xc1, 0xd3, 0xe0, 0xa5, 0xa2, 0x36, 0xed, 0x8a, 0x1e, 0xff, 0xc4, + 0x66, 0x6a, 0xaf, 0x07, 0x43, 0x29, 0x78, 0x08, 0xee, 0xe0, 0x4d, 0x01, 0xff, 0xff, 0x6e, 0x0a, + 0xf3, 0xb0, 0x4d, 0x9e, 0x78, 0xd8, 0x86, 0xde, 0x2b, 0x53, 0x8f, 0x70, 0xaf, 0x0c, 0xda, 0xfa, + 0x52, 0x26, 0x5b, 0xff, 0x67, 0x39, 0x98, 0xdc, 0xa6, 0xbe, 0xcc, 0xb2, 0x9f, 0x7d, 0xc2, 0xf6, + 0x4e, 0xec, 0x85, 0xee, 0xf2, 0xc8, 0x2f, 0x74, 0x02, 0x4a, 0xbe, 0xcd, 0x4d, 0xc5, 0xdf, 0xe5, + 0x8c, 0xcc, 0x63, 0x3e, 0x8b, 0x07, 0x1e, 0x40, 0x3e, 0x3c, 0xf3, 0xf8, 0xa9, 0x05, 0x65, 0xdd, + 0xf3, 0x6b, 0x9b, 0xe2, 0xd2, 0xf3, 0x1b, 0x92, 0xe2, 0xfa, 0x93, 0x68, 0x05, 0x42, 0x68, 0xe8, + 0xb7, 0x61, 0xbe, 0x17, 0xbc, 0x08, 0x6e, 0xfb, 0x1d, 0xb7, 0xe1, 0x92, 0x20, 0x4b, 0xfa, 0x6a, + 0xc6, 0xe7, 0x52, 0x39, 0xfc, 0xb0, 0xfa, 0x0d, 0xcd, 0x77, 0x7e, 0x3b, 0x89, 0x8b, 0x07, 0x59, + 0xd9, 0xff, 0x62, 0xc1, 0x4c, 0x4c, 0xf6, 0xa8, 0x01, 0xd0, 0xf0, 0xbd, 0xa6, 0xcb, 0xc3, 0xe2, + 0x84, 0xf2, 0xda, 0xea, 0x68, 0x52, 0xad, 0x05, 0xe3, 0xa2, 0x43, 0x17, 0x36, 0x31, 0x6c, 0xc0, + 0xa2, 0x97, 0x83, 0x3a, 0xa1, 0xb8, 0x13, 0xa3, 0xea, 0x84, 0x1e, 0x1c, 0xad, 0x4c, 0xeb, 0x39, + 0x99, 0x75, 0x43, 0x59, 0x2a, 0x66, 0xfe, 0x3a, 0x07, 0xa5, 0x70, 0xfd, 0x8f, 0x41, 0x8d, 0xde, + 0x8e, 0xa9, 0xd1, 0xcb, 0x19, 0x77, 0x6e, 0xd8, 0x23, 0x37, 0x7a, 0x3f, 0xa1, 0x4c, 0x59, 0x8f, + 0xc4, 0x09, 0xea, 0xf4, 0x53, 0xb5, 0xf9, 0xaa, 0xef, 0x63, 0x50, 0xa8, 0x9d, 0xb8, 0x42, 0xad, + 0x66, 0x5c, 0xcd, 0x10, 0x95, 0xfa, 0xa1, 0x05, 0xb3, 0x09, 0x25, 0x40, 0x4f, 0x43, 0x41, 0x66, + 0xc5, 0xf4, 0xf9, 0x0a, 0x07, 0xea, 0x00, 0x5f, 0xd2, 0xd0, 0x36, 0x2c, 0x38, 0x7d, 0xee, 0x87, + 0x63, 0xaf, 0x7b, 0xce, 0x6e, 0x87, 0xa8, 0xa8, 0x7d, 0xaa, 0xfa, 0x0b, 0x7a, 0xcc, 0xc2, 0x7a, + 0x4a, 0x1f, 0x9c, 0x3a, 0xd2, 0xfe, 0x3c, 0x07, 0x28, 0x6c, 0xcc, 0x92, 0x4e, 0x7e, 0x1f, 0x26, + 0xf7, 0x54, 0x22, 0xe8, 0xd1, 0xde, 0x03, 0xaa, 0x65, 0xf3, 0x49, 0x24, 0xc0, 0x44, 0xef, 0x9e, + 0xce, 0x39, 0x82, 0xc1, 0x33, 0x84, 0xee, 0x01, 0xec, 0xb9, 0x9e, 0xcb, 0xda, 0x63, 0xbe, 0x5c, + 0xca, 0xdb, 0xfc, 0x46, 0x88, 0x80, 0x0d, 0x34, 0xfb, 0xe3, 0x9c, 0x71, 0x3e, 0xa5, 0xb9, 0x1c, + 0x69, 0x5f, 0x9f, 0x8f, 0x0b, 0xb3, 0x34, 0xf8, 0x56, 0x64, 0x08, 0x66, 0xe2, 0xc0, 0xa1, 0x41, + 0xda, 0x3a, 0x6b, 0x81, 0xca, 0x5d, 0x87, 0xba, 0x62, 0xe3, 0xa3, 0x2d, 0xbd, 0xeb, 0x50, 0x86, + 0x25, 0x24, 0xfa, 0xae, 0x98, 0x2a, 0xe9, 0x05, 0x26, 0x34, 0xb3, 0x4d, 0xe0, 0xa4, 0x67, 0xae, + 0x8f, 0xf4, 0x18, 0x56, 0x80, 0xf6, 0xc7, 0x93, 0xc6, 0x81, 0xd7, 0x56, 0xfb, 0x36, 0xa0, 0x8e, + 0xc3, 0xf8, 0x2d, 0xc7, 0x6b, 0x8a, 0xe3, 0x49, 0xf6, 0x28, 0x61, 0x6d, 0xed, 0xa1, 0x2d, 0x69, + 0x14, 0xb4, 0x35, 0xd0, 0x03, 0xa7, 0x8c, 0x42, 0xaf, 0xc6, 0x8d, 0xf3, 0x4a, 0xd2, 0x38, 0x9f, + 0x8f, 0xb4, 0x6d, 0x3c, 0xf3, 0x6c, 0x1e, 0xf7, 0xc2, 0x19, 0x1c, 0xf7, 0xdf, 0x82, 0xf9, 0xbd, + 0xe4, 0xdb, 0xa1, 0xae, 0x24, 0x78, 0x7d, 0xcc, 0xa7, 0xc7, 0xea, 0xc5, 0xe3, 0xe8, 0xc1, 0x29, + 0x6a, 0xc6, 0x83, 0x8c, 0x90, 0x1f, 0x94, 0x51, 0xca, 0xe8, 0x53, 0x25, 0x16, 0x46, 0x56, 0xb9, + 0x44, 0xdc, 0x9a, 0x2c, 0xa0, 0x54, 0x90, 0x38, 0xc6, 0x20, 0xa1, 0x82, 0xc5, 0xd3, 0x54, 0x41, + 0xf4, 0x6a, 0x98, 0xd0, 0x17, 0xd3, 0x91, 0xae, 0x6c, 0x7e, 0x20, 0x15, 0x2f, 0x48, 0xd8, 0xec, + 0x87, 0x7e, 0x64, 0xc1, 0x45, 0x71, 0x58, 0xaf, 0x7f, 0x44, 0x1a, 0x7d, 0x21, 0x95, 0xa0, 0x76, + 0x7a, 0xb1, 0x2c, 0xa5, 0x31, 0x62, 0x51, 0x69, 0x3d, 0x0d, 0x22, 0xf2, 0xcb, 0x53, 0xc9, 0x38, + 0x9d, 0x31, 0xfa, 0x40, 0x9a, 0x0e, 0x4e, 0x64, 0xd8, 0xf3, 0xe8, 0xe1, 0x7d, 0x49, 0x9b, 0x1d, + 0xae, 0xcc, 0x0e, 0x27, 0xf6, 0x4f, 0xf3, 0xa6, 0xb5, 0x1a, 0x2d, 0xe9, 0x70, 0x0f, 0x26, 0xb8, + 0xc3, 0xf6, 0xb5, 0x16, 0x7c, 0x6b, 0x8c, 0x02, 0xb9, 0x48, 0x17, 0xa4, 0x27, 0x2e, 0x9b, 0x24, + 0x26, 0x5a, 0x82, 0x9c, 0xc3, 0x92, 0x29, 0xe8, 0x75, 0x86, 0x73, 0x0e, 0x43, 0xef, 0x42, 0x81, + 0x12, 0x4e, 0x0f, 0xb5, 0xc1, 0xbe, 0x32, 0x86, 0x71, 0xc2, 0x62, 0xbc, 0x12, 0x83, 0xfc, 0x89, + 0x15, 0x62, 0x68, 0x52, 0x8b, 0xa7, 0x6f, 0x52, 0xa3, 0x14, 0x4d, 0xfe, 0xcc, 0x52, 0x34, 0x3f, + 0xb1, 0x8c, 0x2b, 0x3c, 0x5c, 0x27, 0x7a, 0x1b, 0x26, 0xb9, 0xdb, 0x25, 0x7e, 0x9f, 0x67, 0xf3, + 0x8b, 0xc2, 0x37, 0x35, 0x69, 0xa9, 0x76, 0x14, 0x04, 0x0e, 0xb0, 0x44, 0xb0, 0x48, 0x28, 0xf5, + 0xe9, 0x4e, 0x5b, 0x58, 0x5e, 0xbf, 0xa3, 0x9c, 0x8f, 0x99, 0x28, 0x58, 0xbc, 0x1e, 0xa3, 0xe2, + 0x44, 0x6f, 0xfb, 0x73, 0xd3, 0x83, 0xfb, 0xbf, 0x5f, 0xd4, 0xf9, 0x8f, 0x16, 0xcc, 0x3f, 0xee, + 0x6a, 0xce, 0xfb, 0x71, 0xa7, 0x74, 0x9c, 0xf5, 0x3c, 0xa4, 0x8c, 0xf3, 0x3e, 0x3c, 0x91, 0xae, + 0xae, 0x23, 0x38, 0x85, 0x97, 0x74, 0xf5, 0x43, 0xa2, 0x8c, 0x21, 0x2a, 0x74, 0xb0, 0x3f, 0x4b, + 0xca, 0x4b, 0x3a, 0x49, 0x81, 0x06, 0x5a, 0x67, 0xe8, 0xd4, 0xe4, 0x4e, 0xdb, 0xa9, 0xa1, 0xe6, + 0x4a, 0xf4, 0x57, 0x21, 0xe8, 0x7d, 0x7d, 0xd4, 0xac, 0x2c, 0x5f, 0x22, 0x0c, 0xc0, 0x0c, 0x3d, + 0x6e, 0x9f, 0x5b, 0x70, 0x31, 0xb5, 0x77, 0x28, 0xc2, 0xdc, 0x19, 0x8a, 0xd0, 0x3a, 0x6d, 0x11, + 0xde, 0x33, 0x44, 0x18, 0x4c, 0xe1, 0xb4, 0x3e, 0xe5, 0xfa, 0x71, 0x0e, 0xe6, 0x30, 0xe9, 0xf9, + 0xb1, 0x14, 0xe9, 0x76, 0x50, 0xc8, 0x9b, 0x21, 0xa6, 0x48, 0x3c, 0xc4, 0x55, 0x27, 0x63, 0x15, + 0xbc, 0xdf, 0x85, 0x82, 0xcc, 0x5e, 0x66, 0x33, 0x2e, 0x03, 0xc9, 0x5b, 0x75, 0x2d, 0xa9, 0x34, + 0xb0, 0x02, 0x14, 0xc8, 0xb2, 0xae, 0x44, 0x5f, 0x1d, 0xaf, 0x67, 0xa8, 0x50, 0x19, 0x44, 0x96, + 0xcd, 0x58, 0x01, 0xda, 0x9f, 0xe4, 0x40, 0xc5, 0x1f, 0x8f, 0xc1, 0xf6, 0xfe, 0x5a, 0xcc, 0xf6, + 0xae, 0x8e, 0xea, 0x45, 0x09, 0xf1, 0x0c, 0xcb, 0x31, 0x24, 0x63, 0xc3, 0xcb, 0x59, 0x40, 0x1f, + 0x9e, 0x5f, 0xf8, 0x3b, 0x0b, 0x4a, 0xb2, 0xdf, 0x63, 0x30, 0xe3, 0xdb, 0x71, 0x33, 0xfe, 0x42, + 0x86, 0x55, 0x0c, 0x31, 0xdd, 0x1f, 0xe7, 0xf5, 0xec, 0xc3, 0xc8, 0xb3, 0xed, 0xd0, 0xa6, 0x8e, + 0xa9, 0x22, 0x0d, 0x14, 0x8d, 0x58, 0xd1, 0xd0, 0x6f, 0xa8, 0x12, 0x1c, 0xc2, 0x38, 0x69, 0xde, + 0x08, 0x03, 0x9c, 0x7c, 0xe6, 0x5a, 0x22, 0x5d, 0xef, 0x14, 0xe5, 0xd6, 0x71, 0x02, 0x15, 0x0f, + 0xf0, 0x11, 0x41, 0x4f, 0x2f, 0x69, 0xcb, 0x74, 0x30, 0xf0, 0xfa, 0x98, 0x86, 0x53, 0x05, 0x3d, + 0x03, 0xcd, 0x78, 0x90, 0x11, 0x6a, 0xc3, 0xb4, 0x59, 0x05, 0xa9, 0xcf, 0xd2, 0x5a, 0xf6, 0x72, + 0x4b, 0xf5, 0x96, 0x6a, 0xb6, 0xe0, 0x18, 0xb2, 0x7d, 0x54, 0x84, 0xb2, 0x71, 0xf8, 0x12, 0xf9, + 0xca, 0x99, 0xb3, 0xc9, 0x57, 0xa6, 0x87, 0xd7, 0xe5, 0xb1, 0xc2, 0xeb, 0xcb, 0xf1, 0xf0, 0xfa, + 0x9b, 0xc9, 0xf0, 0x1a, 0xe4, 0xea, 0x62, 0xa1, 0x35, 0x83, 0xf3, 0x3a, 0xce, 0x0c, 0xca, 0x59, + 0x33, 0x25, 0x2c, 0x06, 0xa3, 0x59, 0x24, 0x7c, 0xcb, 0x1b, 0x31, 0x48, 0x9c, 0x60, 0x21, 0x7c, + 0x53, 0xdd, 0x52, 0xef, 0x77, 0xbb, 0x0e, 0x3d, 0x5c, 0x9c, 0x96, 0x13, 0x0e, 0x7d, 0xd3, 0x1b, + 0x31, 0x2a, 0x4e, 0xf4, 0x46, 0xdb, 0x50, 0x54, 0x61, 0xaa, 0x2e, 0x91, 0x7c, 0x31, 0x4b, 0x04, + 0xac, 0x7c, 0x73, 0xf5, 0x1b, 0x6b, 0x1c, 0x33, 0xc3, 0x50, 0x3a, 0x21, 0xc3, 0x70, 0x1b, 0x90, + 0xbf, 0x2b, 0xa3, 0x80, 0xe6, 0x4d, 0xf5, 0xcd, 0xb3, 0x38, 0x95, 0x45, 0x19, 0xbe, 0x86, 0x1b, + 0x76, 0x67, 0xa0, 0x07, 0x4e, 0x19, 0x25, 0xb4, 0x5a, 0xc7, 0xb6, 0xa1, 0x2a, 0xe8, 0x6c, 0x42, + 0xd6, 0xb8, 0x29, 0x0a, 0xd6, 0x64, 0x89, 0x5d, 0x2d, 0x81, 0x8a, 0x07, 0xf8, 0xa0, 0x0f, 0x61, + 0x46, 0x1c, 0xa1, 0x88, 0x31, 0x3c, 0x22, 0xe3, 0xf9, 0xe3, 0xa3, 0x95, 0x99, 0x2d, 0x13, 0x12, + 0xc7, 0x39, 0xd8, 0x7f, 0x94, 0x87, 0xf4, 0xc8, 0x3a, 0xaa, 0xee, 0xb7, 0x1e, 0x52, 0xdd, 0xff, + 0x0e, 0x94, 0x18, 0x77, 0xa8, 0xfa, 0x92, 0x21, 0x37, 0xde, 0x97, 0x0c, 0xf5, 0x00, 0x00, 0x47, + 0x58, 0x89, 0x34, 0x47, 0xfe, 0x54, 0xd3, 0x1c, 0x6b, 0x00, 0x32, 0xb2, 0xaa, 0xf9, 0x7d, 0xfd, + 0xb0, 0x39, 0x13, 0xd9, 0x84, 0xeb, 0x21, 0x05, 0x1b, 0xbd, 0xd0, 0x95, 0xf0, 0xe2, 0x54, 0x2f, + 0x99, 0x97, 0x06, 0x2a, 0x31, 0x92, 0x89, 0xb2, 0x94, 0x4f, 0x7f, 0x4f, 0xa8, 0xdc, 0xb2, 0xff, + 0x27, 0x07, 0x31, 0x63, 0x88, 0x7e, 0x68, 0xc1, 0xbc, 0x93, 0xf8, 0x7a, 0x3a, 0xf0, 0x25, 0x7f, + 0x35, 0xdb, 0x27, 0xed, 0x03, 0x1f, 0x5f, 0x47, 0x6f, 0x47, 0xc9, 0x2e, 0x0c, 0x0f, 0x32, 0x45, + 0x7f, 0x60, 0xc1, 0x05, 0x67, 0xf0, 0xf3, 0x78, 0xbd, 0xe9, 0x6f, 0x8c, 0xfd, 0x7d, 0x7d, 0xf5, + 0xc9, 0xe3, 0xa3, 0x95, 0xb4, 0x7f, 0x1c, 0x80, 0xd3, 0xd8, 0xa1, 0xf7, 0x60, 0xc2, 0xa1, 0xad, + 0x20, 0xcf, 0x9a, 0x9d, 0x6d, 0xf0, 0x5f, 0x0f, 0x22, 0xef, 0x68, 0x9d, 0xb6, 0x18, 0x96, 0xa0, + 0xf6, 0xcf, 0xf2, 0x30, 0x97, 0xfc, 0x1a, 0x40, 0x17, 0xf7, 0x4d, 0xa4, 0x16, 0xf7, 0x09, 0x1d, + 0x69, 0xf0, 0xb0, 0xd2, 0x2e, 0xd2, 0x11, 0xd1, 0x88, 0x15, 0x2d, 0xd4, 0x11, 0x59, 0xa3, 0x5b, + 0x78, 0x04, 0x1d, 0x91, 0x85, 0xb9, 0x11, 0x16, 0xba, 0x12, 0xbf, 0x5b, 0xec, 0xe4, 0xdd, 0x32, + 0x6f, 0xae, 0x65, 0xdc, 0xec, 0x6d, 0x17, 0xca, 0xc6, 0x3e, 0x68, 0x4d, 0xbc, 0x9a, 0x59, 0xee, + 0xd1, 0xb1, 0x9b, 0x55, 0xff, 0x3a, 0x21, 0xa2, 0x98, 0xf8, 0x91, 0xde, 0x4b, 0x69, 0x3d, 0x52, + 0x7a, 0x53, 0x8a, 0xcb, 0x40, 0xb3, 0xff, 0xd5, 0x82, 0x99, 0x58, 0xc5, 0xa9, 0xe0, 0x16, 0x54, + 0xf6, 0x8e, 0xff, 0xcf, 0x04, 0xee, 0x86, 0x08, 0xd8, 0x40, 0x43, 0xdf, 0x83, 0x72, 0xc7, 0xf7, + 0x5a, 0x84, 0xf1, 0xba, 0xef, 0xec, 0x6b, 0x3d, 0xc9, 0x9a, 0x48, 0x5a, 0x3c, 0x3e, 0x5a, 0x59, + 0xd8, 0x52, 0x30, 0x35, 0xbf, 0xdb, 0xeb, 0x10, 0xae, 0x4a, 0xb2, 0xb1, 0x09, 0x2e, 0x5f, 0x40, + 0xdf, 0x71, 0x28, 0x69, 0xfb, 0x7d, 0x46, 0xbe, 0xae, 0x2f, 0xa0, 0xe1, 0x04, 0x4f, 0xfb, 0x05, + 0x34, 0x02, 0x3e, 0xf9, 0x05, 0x34, 0xec, 0xfb, 0xb5, 0x7d, 0x01, 0x0d, 0x67, 0x38, 0x24, 0x52, + 0xf9, 0xef, 0x9c, 0xb1, 0x8a, 0x78, 0xb4, 0x92, 0x7b, 0x48, 0xb4, 0x72, 0x1f, 0xa6, 0x5c, 0x8f, + 0x13, 0x7a, 0xe0, 0x74, 0x74, 0x1e, 0x38, 0xeb, 0x59, 0x0c, 0x97, 0xba, 0xa9, 0x71, 0x70, 0x88, + 0x88, 0x3a, 0x70, 0x31, 0x78, 0x1b, 0xa1, 0xc4, 0x89, 0xde, 0x66, 0x75, 0x7d, 0xd3, 0x6b, 0x41, + 0x12, 0xff, 0x46, 0x5a, 0xa7, 0x07, 0xc3, 0x08, 0x38, 0x1d, 0x14, 0x31, 0x98, 0x61, 0x46, 0x98, + 0x1e, 0xdc, 0x88, 0x23, 0xbe, 0x2b, 0x25, 0x33, 0x1b, 0x46, 0x51, 0x94, 0x09, 0x8a, 0xe3, 0x3c, + 0xec, 0x7f, 0xca, 0xc3, 0x6c, 0xe2, 0xa4, 0x25, 0xc2, 0x91, 0xd2, 0xe3, 0x0c, 0x47, 0x8a, 0x63, + 0x85, 0x23, 0xe9, 0x9e, 0xf2, 0xc4, 0x58, 0x9e, 0xf2, 0x9b, 0xca, 0x5b, 0xd5, 0x3b, 0xb7, 0xb9, + 0xa1, 0x6b, 0xc8, 0x43, 0x69, 0x6e, 0x99, 0x44, 0x1c, 0xef, 0x2b, 0xdd, 0x89, 0xe6, 0xe0, 0x47, + 0xe9, 0xda, 0xd5, 0x7e, 0x23, 0x6b, 0x11, 0x60, 0x08, 0xa0, 0xdc, 0x89, 0x14, 0x02, 0x4e, 0x63, + 0x57, 0xbd, 0xfd, 0xd9, 0x57, 0xcb, 0xe7, 0xbe, 0xf8, 0x6a, 0xf9, 0xdc, 0x97, 0x5f, 0x2d, 0x9f, + 0xfb, 0xc1, 0xf1, 0xb2, 0xf5, 0xd9, 0xf1, 0xb2, 0xf5, 0xc5, 0xf1, 0xb2, 0xf5, 0xe5, 0xf1, 0xb2, + 0xf5, 0x1f, 0xc7, 0xcb, 0xd6, 0x8f, 0x7e, 0xbe, 0x7c, 0xee, 0xde, 0x33, 0xa3, 0xfc, 0xb3, 0xaa, + 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xca, 0x19, 0x25, 0xa4, 0xd3, 0x4a, 0x00, 0x00, } func (m *AnalysisRunArgument) Marshal() (dAtA []byte, err error) { @@ -4609,10 +4547,10 @@ func (m *PromotionStep) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.Inputs) > 0 { - for iNdEx := len(m.Inputs) - 1; iNdEx >= 0; iNdEx-- { + if len(m.Vars) > 0 { + for iNdEx := len(m.Vars) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Inputs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Vars[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -4672,39 +4610,6 @@ func (m *PromotionStep) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *PromotionStepInput) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PromotionStepInput) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PromotionStepInput) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x12 - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - func (m *PromotionStepRetry) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -4786,39 +4691,6 @@ func (m *PromotionTask) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *PromotionTaskInput) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PromotionTaskInput) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PromotionTaskInput) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i -= len(m.Default) - copy(dAtA[i:], m.Default) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Default))) - i-- - dAtA[i] = 0x12 - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - func (m *PromotionTaskList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -4933,10 +4805,10 @@ func (m *PromotionTaskSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x12 } } - if len(m.Inputs) > 0 { - for iNdEx := len(m.Inputs) - 1; iNdEx >= 0; iNdEx-- { + if len(m.Vars) > 0 { + for iNdEx := len(m.Vars) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Inputs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Vars[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6783,8 +6655,8 @@ func (m *PromotionStep) Size() (n int) { l = m.Task.Size() n += 1 + l + sovGenerated(uint64(l)) } - if len(m.Inputs) > 0 { - for _, e := range m.Inputs { + if len(m.Vars) > 0 { + for _, e := range m.Vars { l = e.Size() n += 1 + l + sovGenerated(uint64(l)) } @@ -6792,19 +6664,6 @@ func (m *PromotionStep) Size() (n int) { return n } -func (m *PromotionStepInput) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Value) - n += 1 + l + sovGenerated(uint64(l)) - return n -} - func (m *PromotionStepRetry) Size() (n int) { if m == nil { return 0 @@ -6832,19 +6691,6 @@ func (m *PromotionTask) Size() (n int) { return n } -func (m *PromotionTaskInput) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Default) - n += 1 + l + sovGenerated(uint64(l)) - return n -} - func (m *PromotionTaskList) Size() (n int) { if m == nil { return 0 @@ -6881,8 +6727,8 @@ func (m *PromotionTaskSpec) Size() (n int) { } var l int _ = l - if len(m.Inputs) > 0 { - for _, e := range m.Inputs { + if len(m.Vars) > 0 { + for _, e := range m.Vars { l = e.Size() n += 1 + l + sovGenerated(uint64(l)) } @@ -7942,29 +7788,18 @@ func (this *PromotionStep) String() string { if this == nil { return "nil" } - repeatedStringForInputs := "[]PromotionStepInput{" - for _, f := range this.Inputs { - repeatedStringForInputs += strings.Replace(strings.Replace(f.String(), "PromotionStepInput", "PromotionStepInput", 1), `&`, ``, 1) + "," + repeatedStringForVars := "[]PromotionVariable{" + for _, f := range this.Vars { + repeatedStringForVars += strings.Replace(strings.Replace(f.String(), "PromotionVariable", "PromotionVariable", 1), `&`, ``, 1) + "," } - repeatedStringForInputs += "}" + repeatedStringForVars += "}" s := strings.Join([]string{`&PromotionStep{`, `Uses:` + fmt.Sprintf("%v", this.Uses) + `,`, `As:` + fmt.Sprintf("%v", this.As) + `,`, `Config:` + strings.Replace(fmt.Sprintf("%v", this.Config), "JSON", "v11.JSON", 1) + `,`, `Retry:` + strings.Replace(this.Retry.String(), "PromotionStepRetry", "PromotionStepRetry", 1) + `,`, `Task:` + strings.Replace(this.Task.String(), "PromotionTaskReference", "PromotionTaskReference", 1) + `,`, - `Inputs:` + repeatedStringForInputs + `,`, - `}`, - }, "") - return s -} -func (this *PromotionStepInput) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&PromotionStepInput{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `Vars:` + repeatedStringForVars + `,`, `}`, }, "") return s @@ -7991,17 +7826,6 @@ func (this *PromotionTask) String() string { }, "") return s } -func (this *PromotionTaskInput) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&PromotionTaskInput{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Default:` + fmt.Sprintf("%v", this.Default) + `,`, - `}`, - }, "") - return s -} func (this *PromotionTaskList) String() string { if this == nil { return "nil" @@ -8033,18 +7857,18 @@ func (this *PromotionTaskSpec) String() string { if this == nil { return "nil" } - repeatedStringForInputs := "[]PromotionTaskInput{" - for _, f := range this.Inputs { - repeatedStringForInputs += strings.Replace(strings.Replace(f.String(), "PromotionTaskInput", "PromotionTaskInput", 1), `&`, ``, 1) + "," + repeatedStringForVars := "[]PromotionVariable{" + for _, f := range this.Vars { + repeatedStringForVars += strings.Replace(strings.Replace(f.String(), "PromotionVariable", "PromotionVariable", 1), `&`, ``, 1) + "," } - repeatedStringForInputs += "}" + repeatedStringForVars += "}" repeatedStringForSteps := "[]PromotionStep{" for _, f := range this.Steps { repeatedStringForSteps += strings.Replace(strings.Replace(f.String(), "PromotionStep", "PromotionStep", 1), `&`, ``, 1) + "," } repeatedStringForSteps += "}" s := strings.Join([]string{`&PromotionTaskSpec{`, - `Inputs:` + repeatedStringForInputs + `,`, + `Vars:` + repeatedStringForVars + `,`, `Steps:` + repeatedStringForSteps + `,`, `}`, }, "") @@ -16147,7 +15971,7 @@ func (m *PromotionStep) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Inputs", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -16174,8 +15998,8 @@ func (m *PromotionStep) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Inputs = append(m.Inputs, PromotionStepInput{}) - if err := m.Inputs[len(m.Inputs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Vars = append(m.Vars, PromotionVariable{}) + if err := m.Vars[len(m.Vars)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -16200,120 +16024,6 @@ func (m *PromotionStep) Unmarshal(dAtA []byte) error { } return nil } -func (m *PromotionStepInput) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PromotionStepInput: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PromotionStepInput: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *PromotionStepRetry) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -16535,120 +16245,6 @@ func (m *PromotionTask) Unmarshal(dAtA []byte) error { } return nil } -func (m *PromotionTaskInput) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PromotionTaskInput: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PromotionTaskInput: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Default", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Default = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *PromotionTaskList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -16911,7 +16507,7 @@ func (m *PromotionTaskSpec) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Inputs", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -16938,8 +16534,8 @@ func (m *PromotionTaskSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Inputs = append(m.Inputs, PromotionTaskInput{}) - if err := m.Inputs[len(m.Inputs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Vars = append(m.Vars, PromotionVariable{}) + if err := m.Vars[len(m.Vars)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/api/v1alpha1/generated.proto b/api/v1alpha1/generated.proto index cc1cea187..5fd42b202 100644 --- a/api/v1alpha1/generated.proto +++ b/api/v1alpha1/generated.proto @@ -959,8 +959,6 @@ message PromotionStatus { } // PromotionStep describes a directive to be executed as part of a Promotion. -// -// +kubebuilder:validation:XValidation:message="inputs must not be set when task is set",rule="!(has(self.task) && self.inputs.size() > 0)" message PromotionStep { // Uses identifies a runner that can execute this step. // @@ -968,7 +966,7 @@ message PromotionStep { // +kubebuilder:validation:MinLength=1 optional string uses = 1; - // Task is a reference to a PromotionTask that should be deflated into a + // Task is a reference to a PromotionTask that should be inflated into a // Promotion when it is built from a PromotionTemplate. optional PromotionTaskReference task = 5; @@ -978,13 +976,10 @@ message PromotionStep { // Retry is the retry policy for this step. optional PromotionStepRetry retry = 4; - // Inputs is a list of inputs that can used to parameterize the execution - // of the PromotionStep and can be referenced by expressions in the Config. - // - // When a PromotionStep is inflated from a PromotionTask, the inputs - // specified in the PromotionTask are set based on the inputs specified - // in the Config of the PromotionStep that references the PromotionTask. - repeated PromotionStepInput inputs = 6; + // Vars is a list of variables that can be referenced by expressions in + // the step's Config. The values override the values specified in the + // PromotionSpec. + repeated PromotionVariable vars = 6; // Config is opaque configuration for the PromotionStep that is understood // only by each PromotionStep's implementation. It is legal to utilize @@ -993,19 +988,6 @@ message PromotionStep { optional .k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1.JSON config = 3; } -// PromotionStepInput describes a single input value for a PromotionStep that may -// be referenced by expressions in the step. -message PromotionStepInput { - // Name is the name of the input to which the value is assigned. - // - // +kubebuilder:validation:MinLength=1 - // +kubebuilder:validation:Pattern=^[a-zA-Z_]\w*$ - optional string name = 1; - - // Value is the input value. - optional string value = 2; -} - // PromotionStepRetry describes the retry policy for a PromotionStep. message PromotionStepRetry { // Timeout is the soft maximum interval in which a step that returns a Running @@ -1049,35 +1031,13 @@ message PromotionStepRetry { message PromotionTask { optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - // Spec describes the composition of a PromotionTask, including the inputs - // available to the task and the steps. + // Spec describes the composition of a PromotionTask, including the + // variables available to the task and the steps. // // +kubebuilder:validation:Required optional PromotionTaskSpec spec = 2; } -// PromotionTaskInput defines an input parameter for a PromotionTask. This input -// can be specified in the PromotionTemplate as configuration for the task, and -// can be used in the Steps to parameterize the execution of the task. -message PromotionTaskInput { - // Name of the configuration parameter, which should be unique within the - // PromotionTask. This name can be used to reference the parameter in the - // PromotionTaskSpec.Steps. - // - // +kubebuilder:validation:Required - // +kubebuilder:validation:MinLength=1 - // +kubebuilder:validation:Pattern=^[a-zA-Z_]\w*$ - optional string name = 1; - - // Default specifies a default value for the parameter. This value will be - // used if the parameter is not specified in the PromotionTemplate. - // If left unspecified, the input value is required to be specified in the - // configuration of the step referencing this task. - // - // +kubebuilder:validation:Optional - optional string default = 2; -} - // PromotionTaskList contains a list of PromotionTasks. message PromotionTaskList { optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; @@ -1104,19 +1064,18 @@ message PromotionTaskReference { } message PromotionTaskSpec { - // Inputs specifies the inputs available to the PromotionTask. These inputs - // can be specified in the PromotionTemplate as configuration for the task, - // and can be used in the Steps to parameterize the execution of the task. - repeated PromotionTaskInput inputs = 1; + // Vars specifies the variables available to the PromotionTask. The + // values of these variables are the default values that can be + // overridden by the step referencing the task. + repeated PromotionVariable vars = 1; // Steps specifies the directives to be executed as part of this - // PromotionTask. The steps as defined here are deflated into a + // PromotionTask. The steps as defined here are inflated into a // Promotion when it is built from a PromotionTemplate. // // +kubebuilder:validation:Required // +kubebuilder:validation:MinItems=1 // +kubebuilder:validation:items:XValidation:message="PromotionTask step must have uses set and must not reference another task",rule="has(self.uses) && !has(self.task)" - // +kubebuilder:validation:items:XValidation:message="PromotionTask step must not have inputs set",rule="self.inputs.size() == 0" repeated PromotionStep steps = 2; } diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index 2c14de54d..221f57a75 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -1079,9 +1079,9 @@ func (in *PromotionStep) DeepCopyInto(out *PromotionStep) { *out = new(PromotionStepRetry) (*in).DeepCopyInto(*out) } - if in.Inputs != nil { - in, out := &in.Inputs, &out.Inputs - *out = make([]PromotionStepInput, len(*in)) + if in.Vars != nil { + in, out := &in.Vars, &out.Vars + *out = make([]PromotionVariable, len(*in)) copy(*out, *in) } if in.Config != nil { @@ -1101,21 +1101,6 @@ func (in *PromotionStep) DeepCopy() *PromotionStep { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PromotionStepInput) DeepCopyInto(out *PromotionStepInput) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PromotionStepInput. -func (in *PromotionStepInput) DeepCopy() *PromotionStepInput { - if in == nil { - return nil - } - out := new(PromotionStepInput) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PromotionStepRetry) DeepCopyInto(out *PromotionStepRetry) { *out = *in @@ -1162,21 +1147,6 @@ func (in *PromotionTask) DeepCopyObject() runtime.Object { return nil } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PromotionTaskInput) DeepCopyInto(out *PromotionTaskInput) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PromotionTaskInput. -func (in *PromotionTaskInput) DeepCopy() *PromotionTaskInput { - if in == nil { - return nil - } - out := new(PromotionTaskInput) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PromotionTaskList) DeepCopyInto(out *PromotionTaskList) { *out = *in @@ -1227,9 +1197,9 @@ func (in *PromotionTaskReference) DeepCopy() *PromotionTaskReference { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PromotionTaskSpec) DeepCopyInto(out *PromotionTaskSpec) { *out = *in - if in.Inputs != nil { - in, out := &in.Inputs, &out.Inputs - *out = make([]PromotionTaskInput, len(*in)) + if in.Vars != nil { + in, out := &in.Vars, &out.Vars + *out = make([]PromotionVariable, len(*in)) copy(*out, *in) } if in.Steps != nil { diff --git a/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml b/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml index b0099d3f7..6e574b7c0 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_clusterpromotiontasks.yaml @@ -47,40 +47,10 @@ spec: Spec describes the desired transition of a specific Stage into a specific Freight. properties: - inputs: - description: |- - Inputs specifies the inputs available to the PromotionTask. These inputs - can be specified in the PromotionTemplate as configuration for the task, - and can be used in the Steps to parameterize the execution of the task. - items: - description: |- - PromotionTaskInput defines an input parameter for a PromotionTask. This input - can be specified in the PromotionTemplate as configuration for the task, and - can be used in the Steps to parameterize the execution of the task. - properties: - default: - description: |- - Default specifies a default value for the parameter. This value will be - used if the parameter is not specified in the PromotionTemplate. - If left unspecified, the input value is required to be specified in the - configuration of the step referencing this task. - type: string - name: - description: |- - Name of the configuration parameter, which should be unique within the - PromotionTask. This name can be used to reference the parameter in the - PromotionTaskSpec.Steps. - minLength: 1 - pattern: ^[a-zA-Z_]\w*$ - type: string - required: - - name - type: object - type: array steps: description: |- Steps specifies the directives to be executed as part of this - PromotionTask. The steps as defined here are deflated into a + PromotionTask. The steps as defined here are inflated into a Promotion when it is built from a PromotionTemplate. items: description: PromotionStep describes a directive to be executed @@ -96,33 +66,6 @@ spec: expressions in defining values at any level of this block. See https://docs.kargo.io/references/expression-language for details. x-kubernetes-preserve-unknown-fields: true - inputs: - description: |- - Inputs is a list of inputs that can used to parameterize the execution - of the PromotionStep and can be referenced by expressions in the Config. - - When a PromotionStep is inflated from a PromotionTask, the inputs - specified in the PromotionTask are set based on the inputs specified - in the Config of the PromotionStep that references the PromotionTask. - items: - description: |- - PromotionStepInput describes a single input value for a PromotionStep that may - be referenced by expressions in the step. - properties: - name: - description: Name is the name of the input to which the - value is assigned. - minLength: 1 - pattern: ^[a-zA-Z_]\w*$ - type: string - value: - description: Value is the input value. - type: string - required: - - name - - value - type: object - type: array retry: description: Retry is the retry policy for this step. properties: @@ -169,7 +112,7 @@ spec: type: object task: description: |- - Task is a reference to a PromotionTask that should be deflated into a + Task is a reference to a PromotionTask that should be inflated into a Promotion when it is built from a PromotionTemplate. properties: kind: @@ -194,17 +137,63 @@ spec: step. minLength: 1 type: string + vars: + description: |- + Vars is a list of variables that can be referenced by expressions in + the step's Config. The values override the values specified in the + PromotionSpec. + items: + description: |- + PromotionVariable describes a single variable that may be referenced by + expressions in promotion steps. + properties: + name: + description: Name is the name of the variable. + minLength: 1 + pattern: ^[a-zA-Z_]\w*$ + type: string + value: + description: |- + Value is the value of the variable. It is allowed to utilize expressions + in the value. + See https://docs.kargo.io/references/expression-language for details. + type: string + required: + - name + type: object + type: array type: object x-kubernetes-validations: - message: PromotionTask step must have uses set and must not reference another task rule: has(self.uses) && !has(self.task) - - message: PromotionTask step must not have inputs set - rule: self.inputs.size() == 0 - - message: inputs must not be set when task is set - rule: '!(has(self.task) && self.inputs.size() > 0)' minItems: 1 type: array + vars: + description: |- + Vars specifies the variables available to the PromotionTask. The + values of these variables are the default values that can be + overridden by the step referencing the task. + items: + description: |- + PromotionVariable describes a single variable that may be referenced by + expressions in promotion steps. + properties: + name: + description: Name is the name of the variable. + minLength: 1 + pattern: ^[a-zA-Z_]\w*$ + type: string + value: + description: |- + Value is the value of the variable. It is allowed to utilize expressions + in the value. + See https://docs.kargo.io/references/expression-language for details. + type: string + required: + - name + type: object + type: array required: - steps type: object diff --git a/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml b/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml index a7dc1ff8c..994a9f05e 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml @@ -98,33 +98,6 @@ spec: expressions in defining values at any level of this block. See https://docs.kargo.io/references/expression-language for details. x-kubernetes-preserve-unknown-fields: true - inputs: - description: |- - Inputs is a list of inputs that can used to parameterize the execution - of the PromotionStep and can be referenced by expressions in the Config. - - When a PromotionStep is inflated from a PromotionTask, the inputs - specified in the PromotionTask are set based on the inputs specified - in the Config of the PromotionStep that references the PromotionTask. - items: - description: |- - PromotionStepInput describes a single input value for a PromotionStep that may - be referenced by expressions in the step. - properties: - name: - description: Name is the name of the input to which the - value is assigned. - minLength: 1 - pattern: ^[a-zA-Z_]\w*$ - type: string - value: - description: Value is the input value. - type: string - required: - - name - - value - type: object - type: array retry: description: Retry is the retry policy for this step. properties: @@ -171,7 +144,7 @@ spec: type: object task: description: |- - Task is a reference to a PromotionTask that should be deflated into a + Task is a reference to a PromotionTask that should be inflated into a Promotion when it is built from a PromotionTemplate. properties: kind: @@ -196,13 +169,36 @@ spec: step. minLength: 1 type: string + vars: + description: |- + Vars is a list of variables that can be referenced by expressions in + the step's Config. The values override the values specified in the + PromotionSpec. + items: + description: |- + PromotionVariable describes a single variable that may be referenced by + expressions in promotion steps. + properties: + name: + description: Name is the name of the variable. + minLength: 1 + pattern: ^[a-zA-Z_]\w*$ + type: string + value: + description: |- + Value is the value of the variable. It is allowed to utilize expressions + in the value. + See https://docs.kargo.io/references/expression-language for details. + type: string + required: + - name + type: object + type: array type: object x-kubernetes-validations: - message: Promotion step must have uses set and must not reference a task rule: has(self.uses) && !has(self.task) - - message: inputs must not be set when task is set - rule: '!(has(self.task) && self.inputs.size() > 0)' minItems: 1 type: array vars: @@ -227,7 +223,6 @@ spec: type: string required: - name - - value type: object type: array required: diff --git a/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml b/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml index 3103f5d06..8705beb33 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_promotiontasks.yaml @@ -44,43 +44,13 @@ spec: type: object spec: description: |- - Spec describes the composition of a PromotionTask, including the inputs - available to the task and the steps. + Spec describes the composition of a PromotionTask, including the + variables available to the task and the steps. properties: - inputs: - description: |- - Inputs specifies the inputs available to the PromotionTask. These inputs - can be specified in the PromotionTemplate as configuration for the task, - and can be used in the Steps to parameterize the execution of the task. - items: - description: |- - PromotionTaskInput defines an input parameter for a PromotionTask. This input - can be specified in the PromotionTemplate as configuration for the task, and - can be used in the Steps to parameterize the execution of the task. - properties: - default: - description: |- - Default specifies a default value for the parameter. This value will be - used if the parameter is not specified in the PromotionTemplate. - If left unspecified, the input value is required to be specified in the - configuration of the step referencing this task. - type: string - name: - description: |- - Name of the configuration parameter, which should be unique within the - PromotionTask. This name can be used to reference the parameter in the - PromotionTaskSpec.Steps. - minLength: 1 - pattern: ^[a-zA-Z_]\w*$ - type: string - required: - - name - type: object - type: array steps: description: |- Steps specifies the directives to be executed as part of this - PromotionTask. The steps as defined here are deflated into a + PromotionTask. The steps as defined here are inflated into a Promotion when it is built from a PromotionTemplate. items: description: PromotionStep describes a directive to be executed @@ -96,33 +66,6 @@ spec: expressions in defining values at any level of this block. See https://docs.kargo.io/references/expression-language for details. x-kubernetes-preserve-unknown-fields: true - inputs: - description: |- - Inputs is a list of inputs that can used to parameterize the execution - of the PromotionStep and can be referenced by expressions in the Config. - - When a PromotionStep is inflated from a PromotionTask, the inputs - specified in the PromotionTask are set based on the inputs specified - in the Config of the PromotionStep that references the PromotionTask. - items: - description: |- - PromotionStepInput describes a single input value for a PromotionStep that may - be referenced by expressions in the step. - properties: - name: - description: Name is the name of the input to which the - value is assigned. - minLength: 1 - pattern: ^[a-zA-Z_]\w*$ - type: string - value: - description: Value is the input value. - type: string - required: - - name - - value - type: object - type: array retry: description: Retry is the retry policy for this step. properties: @@ -169,7 +112,7 @@ spec: type: object task: description: |- - Task is a reference to a PromotionTask that should be deflated into a + Task is a reference to a PromotionTask that should be inflated into a Promotion when it is built from a PromotionTemplate. properties: kind: @@ -194,17 +137,63 @@ spec: step. minLength: 1 type: string + vars: + description: |- + Vars is a list of variables that can be referenced by expressions in + the step's Config. The values override the values specified in the + PromotionSpec. + items: + description: |- + PromotionVariable describes a single variable that may be referenced by + expressions in promotion steps. + properties: + name: + description: Name is the name of the variable. + minLength: 1 + pattern: ^[a-zA-Z_]\w*$ + type: string + value: + description: |- + Value is the value of the variable. It is allowed to utilize expressions + in the value. + See https://docs.kargo.io/references/expression-language for details. + type: string + required: + - name + type: object + type: array type: object x-kubernetes-validations: - message: PromotionTask step must have uses set and must not reference another task rule: has(self.uses) && !has(self.task) - - message: PromotionTask step must not have inputs set - rule: self.inputs.size() == 0 - - message: inputs must not be set when task is set - rule: '!(has(self.task) && self.inputs.size() > 0)' minItems: 1 type: array + vars: + description: |- + Vars specifies the variables available to the PromotionTask. The + values of these variables are the default values that can be + overridden by the step referencing the task. + items: + description: |- + PromotionVariable describes a single variable that may be referenced by + expressions in promotion steps. + properties: + name: + description: Name is the name of the variable. + minLength: 1 + pattern: ^[a-zA-Z_]\w*$ + type: string + value: + description: |- + Value is the value of the variable. It is allowed to utilize expressions + in the value. + See https://docs.kargo.io/references/expression-language for details. + type: string + required: + - name + type: object + type: array required: - steps type: object diff --git a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml index 7b90fc75d..05b90103a 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml @@ -88,33 +88,6 @@ spec: expressions in defining values at any level of this block. See https://docs.kargo.io/references/expression-language for details. x-kubernetes-preserve-unknown-fields: true - inputs: - description: |- - Inputs is a list of inputs that can used to parameterize the execution - of the PromotionStep and can be referenced by expressions in the Config. - - When a PromotionStep is inflated from a PromotionTask, the inputs - specified in the PromotionTask are set based on the inputs specified - in the Config of the PromotionStep that references the PromotionTask. - items: - description: |- - PromotionStepInput describes a single input value for a PromotionStep that may - be referenced by expressions in the step. - properties: - name: - description: Name is the name of the input to - which the value is assigned. - minLength: 1 - pattern: ^[a-zA-Z_]\w*$ - type: string - value: - description: Value is the input value. - type: string - required: - - name - - value - type: object - type: array retry: description: Retry is the retry policy for this step. properties: @@ -161,7 +134,7 @@ spec: type: object task: description: |- - Task is a reference to a PromotionTask that should be deflated into a + Task is a reference to a PromotionTask that should be inflated into a Promotion when it is built from a PromotionTemplate. properties: kind: @@ -186,13 +159,36 @@ spec: this step. minLength: 1 type: string + vars: + description: |- + Vars is a list of variables that can be referenced by expressions in + the step's Config. The values override the values specified in the + PromotionSpec. + items: + description: |- + PromotionVariable describes a single variable that may be referenced by + expressions in promotion steps. + properties: + name: + description: Name is the name of the variable. + minLength: 1 + pattern: ^[a-zA-Z_]\w*$ + type: string + value: + description: |- + Value is the value of the variable. It is allowed to utilize expressions + in the value. + See https://docs.kargo.io/references/expression-language for details. + type: string + required: + - name + type: object + type: array type: object x-kubernetes-validations: - message: PromotionTemplate step must have exactly one of uses or task set rule: '(has(self.uses) ? !has(self.task) : has(self.task))' - - message: inputs must not be set when task is set - rule: '!(has(self.task) && self.inputs.size() > 0)' minItems: 1 type: array vars: @@ -217,7 +213,6 @@ spec: type: string required: - name - - value type: object type: array type: object diff --git a/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json index ad07ec6a6..c774fdb02 100644 --- a/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/clusterpromotiontasks.kargo.akuity.io_v1alpha1.json @@ -15,31 +15,8 @@ "spec": { "description": "Spec describes the desired transition of a specific Stage into a specific\nFreight.", "properties": { - "inputs": { - "description": "Inputs specifies the inputs available to the PromotionTask. These inputs\ncan be specified in the PromotionTemplate as configuration for the task,\nand can be used in the Steps to parameterize the execution of the task.", - "items": { - "description": "PromotionTaskInput defines an input parameter for a PromotionTask. This input\ncan be specified in the PromotionTemplate as configuration for the task, and\ncan be used in the Steps to parameterize the execution of the task.", - "properties": { - "default": { - "description": "Default specifies a default value for the parameter. This value will be\nused if the parameter is not specified in the PromotionTemplate.\nIf left unspecified, the input value is required to be specified in the\nconfiguration of the step referencing this task.", - "type": "string" - }, - "name": { - "description": "Name of the configuration parameter, which should be unique within the\nPromotionTask. This name can be used to reference the parameter in the\nPromotionTaskSpec.Steps.", - "minLength": 1, - "pattern": "^[a-zA-Z_]\\w*$", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "type": "array" - }, "steps": { - "description": "Steps specifies the directives to be executed as part of this\nPromotionTask. The steps as defined here are deflated into a\nPromotion when it is built from a PromotionTemplate.", + "description": "Steps specifies the directives to be executed as part of this\nPromotionTask. The steps as defined here are inflated into a\nPromotion when it is built from a PromotionTemplate.", "items": { "description": "PromotionStep describes a directive to be executed as part of a Promotion.", "properties": { @@ -51,30 +28,6 @@ "description": "Config is opaque configuration for the PromotionStep that is understood\nonly by each PromotionStep's implementation. It is legal to utilize\nexpressions in defining values at any level of this block.\nSee https://docs.kargo.io/references/expression-language for details.", "x-kubernetes-preserve-unknown-fields": true }, - "inputs": { - "description": "Inputs is a list of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", - "items": { - "description": "PromotionStepInput describes a single input value for a PromotionStep that may\nbe referenced by expressions in the step.", - "properties": { - "name": { - "description": "Name is the name of the input to which the value is assigned.", - "minLength": 1, - "pattern": "^[a-zA-Z_]\\w*$", - "type": "string" - }, - "value": { - "description": "Value is the input value.", - "type": "string" - } - }, - "required": [ - "name", - "value" - ], - "type": "object" - }, - "type": "array" - }, "retry": { "description": "Retry is the retry policy for this step.", "properties": { @@ -93,7 +46,7 @@ "type": "object" }, "task": { - "description": "Task is a reference to a PromotionTask that should be deflated into a\nPromotion when it is built from a PromotionTemplate.", + "description": "Task is a reference to a PromotionTask that should be inflated into a\nPromotion when it is built from a PromotionTemplate.", "properties": { "kind": { "description": "Kind is the type of the PromotionTask. Can be either PromotionTask or\nClusterPromotionTask, default is PromotionTask.", @@ -120,6 +73,29 @@ "description": "Uses identifies a runner that can execute this step.", "minLength": 1, "type": "string" + }, + "vars": { + "description": "Vars is a list of variables that can be referenced by expressions in\nthe step's Config. The values override the values specified in the\nPromotionSpec.", + "items": { + "description": "PromotionVariable describes a single variable that may be referenced by\nexpressions in promotion steps.", + "properties": { + "name": { + "description": "Name is the name of the variable.", + "minLength": 1, + "pattern": "^[a-zA-Z_]\\w*$", + "type": "string" + }, + "value": { + "description": "Value is the value of the variable. It is allowed to utilize expressions\nin the value.\nSee https://docs.kargo.io/references/expression-language for details.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" } }, "type": "object", @@ -127,19 +103,34 @@ { "message": "PromotionTask step must have uses set and must not reference another task", "rule": "has(self.uses) && !has(self.task)" - }, - { - "message": "PromotionTask step must not have inputs set", - "rule": "self.inputs.size() == 0" - }, - { - "message": "inputs must not be set when task is set", - "rule": "!(has(self.task) && self.inputs.size() > 0)" } ] }, "minItems": 1, "type": "array" + }, + "vars": { + "description": "Vars specifies the variables available to the PromotionTask. The\nvalues of these variables are the default values that can be\noverridden by the step referencing the task.", + "items": { + "description": "PromotionVariable describes a single variable that may be referenced by\nexpressions in promotion steps.", + "properties": { + "name": { + "description": "Name is the name of the variable.", + "minLength": 1, + "pattern": "^[a-zA-Z_]\\w*$", + "type": "string" + }, + "value": { + "description": "Value is the value of the variable. It is allowed to utilize expressions\nin the value.\nSee https://docs.kargo.io/references/expression-language for details.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" } }, "required": [ diff --git a/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json index ad0bded19..54663baf1 100644 --- a/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json @@ -43,30 +43,6 @@ "description": "Config is opaque configuration for the PromotionStep that is understood\nonly by each PromotionStep's implementation. It is legal to utilize\nexpressions in defining values at any level of this block.\nSee https://docs.kargo.io/references/expression-language for details.", "x-kubernetes-preserve-unknown-fields": true }, - "inputs": { - "description": "Inputs is a list of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", - "items": { - "description": "PromotionStepInput describes a single input value for a PromotionStep that may\nbe referenced by expressions in the step.", - "properties": { - "name": { - "description": "Name is the name of the input to which the value is assigned.", - "minLength": 1, - "pattern": "^[a-zA-Z_]\\w*$", - "type": "string" - }, - "value": { - "description": "Value is the input value.", - "type": "string" - } - }, - "required": [ - "name", - "value" - ], - "type": "object" - }, - "type": "array" - }, "retry": { "description": "Retry is the retry policy for this step.", "properties": { @@ -85,7 +61,7 @@ "type": "object" }, "task": { - "description": "Task is a reference to a PromotionTask that should be deflated into a\nPromotion when it is built from a PromotionTemplate.", + "description": "Task is a reference to a PromotionTask that should be inflated into a\nPromotion when it is built from a PromotionTemplate.", "properties": { "kind": { "description": "Kind is the type of the PromotionTask. Can be either PromotionTask or\nClusterPromotionTask, default is PromotionTask.", @@ -112,6 +88,29 @@ "description": "Uses identifies a runner that can execute this step.", "minLength": 1, "type": "string" + }, + "vars": { + "description": "Vars is a list of variables that can be referenced by expressions in\nthe step's Config. The values override the values specified in the\nPromotionSpec.", + "items": { + "description": "PromotionVariable describes a single variable that may be referenced by\nexpressions in promotion steps.", + "properties": { + "name": { + "description": "Name is the name of the variable.", + "minLength": 1, + "pattern": "^[a-zA-Z_]\\w*$", + "type": "string" + }, + "value": { + "description": "Value is the value of the variable. It is allowed to utilize expressions\nin the value.\nSee https://docs.kargo.io/references/expression-language for details.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" } }, "type": "object", @@ -119,10 +118,6 @@ { "message": "Promotion step must have uses set and must not reference a task", "rule": "has(self.uses) && !has(self.task)" - }, - { - "message": "inputs must not be set when task is set", - "rule": "!(has(self.task) && self.inputs.size() > 0)" } ] }, @@ -146,8 +141,7 @@ } }, "required": [ - "name", - "value" + "name" ], "type": "object" }, diff --git a/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json index d717d227c..1741088e3 100644 --- a/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/promotiontasks.kargo.akuity.io_v1alpha1.json @@ -13,33 +13,10 @@ "type": "object" }, "spec": { - "description": "Spec describes the composition of a PromotionTask, including the inputs\navailable to the task and the steps.", + "description": "Spec describes the composition of a PromotionTask, including the\nvariables available to the task and the steps.", "properties": { - "inputs": { - "description": "Inputs specifies the inputs available to the PromotionTask. These inputs\ncan be specified in the PromotionTemplate as configuration for the task,\nand can be used in the Steps to parameterize the execution of the task.", - "items": { - "description": "PromotionTaskInput defines an input parameter for a PromotionTask. This input\ncan be specified in the PromotionTemplate as configuration for the task, and\ncan be used in the Steps to parameterize the execution of the task.", - "properties": { - "default": { - "description": "Default specifies a default value for the parameter. This value will be\nused if the parameter is not specified in the PromotionTemplate.\nIf left unspecified, the input value is required to be specified in the\nconfiguration of the step referencing this task.", - "type": "string" - }, - "name": { - "description": "Name of the configuration parameter, which should be unique within the\nPromotionTask. This name can be used to reference the parameter in the\nPromotionTaskSpec.Steps.", - "minLength": 1, - "pattern": "^[a-zA-Z_]\\w*$", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "type": "array" - }, "steps": { - "description": "Steps specifies the directives to be executed as part of this\nPromotionTask. The steps as defined here are deflated into a\nPromotion when it is built from a PromotionTemplate.", + "description": "Steps specifies the directives to be executed as part of this\nPromotionTask. The steps as defined here are inflated into a\nPromotion when it is built from a PromotionTemplate.", "items": { "description": "PromotionStep describes a directive to be executed as part of a Promotion.", "properties": { @@ -51,30 +28,6 @@ "description": "Config is opaque configuration for the PromotionStep that is understood\nonly by each PromotionStep's implementation. It is legal to utilize\nexpressions in defining values at any level of this block.\nSee https://docs.kargo.io/references/expression-language for details.", "x-kubernetes-preserve-unknown-fields": true }, - "inputs": { - "description": "Inputs is a list of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", - "items": { - "description": "PromotionStepInput describes a single input value for a PromotionStep that may\nbe referenced by expressions in the step.", - "properties": { - "name": { - "description": "Name is the name of the input to which the value is assigned.", - "minLength": 1, - "pattern": "^[a-zA-Z_]\\w*$", - "type": "string" - }, - "value": { - "description": "Value is the input value.", - "type": "string" - } - }, - "required": [ - "name", - "value" - ], - "type": "object" - }, - "type": "array" - }, "retry": { "description": "Retry is the retry policy for this step.", "properties": { @@ -93,7 +46,7 @@ "type": "object" }, "task": { - "description": "Task is a reference to a PromotionTask that should be deflated into a\nPromotion when it is built from a PromotionTemplate.", + "description": "Task is a reference to a PromotionTask that should be inflated into a\nPromotion when it is built from a PromotionTemplate.", "properties": { "kind": { "description": "Kind is the type of the PromotionTask. Can be either PromotionTask or\nClusterPromotionTask, default is PromotionTask.", @@ -120,6 +73,29 @@ "description": "Uses identifies a runner that can execute this step.", "minLength": 1, "type": "string" + }, + "vars": { + "description": "Vars is a list of variables that can be referenced by expressions in\nthe step's Config. The values override the values specified in the\nPromotionSpec.", + "items": { + "description": "PromotionVariable describes a single variable that may be referenced by\nexpressions in promotion steps.", + "properties": { + "name": { + "description": "Name is the name of the variable.", + "minLength": 1, + "pattern": "^[a-zA-Z_]\\w*$", + "type": "string" + }, + "value": { + "description": "Value is the value of the variable. It is allowed to utilize expressions\nin the value.\nSee https://docs.kargo.io/references/expression-language for details.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" } }, "type": "object", @@ -127,19 +103,34 @@ { "message": "PromotionTask step must have uses set and must not reference another task", "rule": "has(self.uses) && !has(self.task)" - }, - { - "message": "PromotionTask step must not have inputs set", - "rule": "self.inputs.size() == 0" - }, - { - "message": "inputs must not be set when task is set", - "rule": "!(has(self.task) && self.inputs.size() > 0)" } ] }, "minItems": 1, "type": "array" + }, + "vars": { + "description": "Vars specifies the variables available to the PromotionTask. The\nvalues of these variables are the default values that can be\noverridden by the step referencing the task.", + "items": { + "description": "PromotionVariable describes a single variable that may be referenced by\nexpressions in promotion steps.", + "properties": { + "name": { + "description": "Name is the name of the variable.", + "minLength": 1, + "pattern": "^[a-zA-Z_]\\w*$", + "type": "string" + }, + "value": { + "description": "Value is the value of the variable. It is allowed to utilize expressions\nin the value.\nSee https://docs.kargo.io/references/expression-language for details.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" } }, "required": [ diff --git a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json index a27a7ce6f..4f6521351 100644 --- a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json @@ -35,30 +35,6 @@ "description": "Config is opaque configuration for the PromotionStep that is understood\nonly by each PromotionStep's implementation. It is legal to utilize\nexpressions in defining values at any level of this block.\nSee https://docs.kargo.io/references/expression-language for details.", "x-kubernetes-preserve-unknown-fields": true }, - "inputs": { - "description": "Inputs is a list of inputs that can used to parameterize the execution\nof the PromotionStep and can be referenced by expressions in the Config.\n\nWhen a PromotionStep is inflated from a PromotionTask, the inputs\nspecified in the PromotionTask are set based on the inputs specified\nin the Config of the PromotionStep that references the PromotionTask.", - "items": { - "description": "PromotionStepInput describes a single input value for a PromotionStep that may\nbe referenced by expressions in the step.", - "properties": { - "name": { - "description": "Name is the name of the input to which the value is assigned.", - "minLength": 1, - "pattern": "^[a-zA-Z_]\\w*$", - "type": "string" - }, - "value": { - "description": "Value is the input value.", - "type": "string" - } - }, - "required": [ - "name", - "value" - ], - "type": "object" - }, - "type": "array" - }, "retry": { "description": "Retry is the retry policy for this step.", "properties": { @@ -77,7 +53,7 @@ "type": "object" }, "task": { - "description": "Task is a reference to a PromotionTask that should be deflated into a\nPromotion when it is built from a PromotionTemplate.", + "description": "Task is a reference to a PromotionTask that should be inflated into a\nPromotion when it is built from a PromotionTemplate.", "properties": { "kind": { "description": "Kind is the type of the PromotionTask. Can be either PromotionTask or\nClusterPromotionTask, default is PromotionTask.", @@ -104,6 +80,29 @@ "description": "Uses identifies a runner that can execute this step.", "minLength": 1, "type": "string" + }, + "vars": { + "description": "Vars is a list of variables that can be referenced by expressions in\nthe step's Config. The values override the values specified in the\nPromotionSpec.", + "items": { + "description": "PromotionVariable describes a single variable that may be referenced by\nexpressions in promotion steps.", + "properties": { + "name": { + "description": "Name is the name of the variable.", + "minLength": 1, + "pattern": "^[a-zA-Z_]\\w*$", + "type": "string" + }, + "value": { + "description": "Value is the value of the variable. It is allowed to utilize expressions\nin the value.\nSee https://docs.kargo.io/references/expression-language for details.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" } }, "type": "object", @@ -111,10 +110,6 @@ { "message": "PromotionTemplate step must have exactly one of uses or task set", "rule": "(has(self.uses) ? !has(self.task) : has(self.task))" - }, - { - "message": "inputs must not be set when task is set", - "rule": "!(has(self.task) && self.inputs.size() > 0)" } ] }, @@ -138,8 +133,7 @@ } }, "required": [ - "name", - "value" + "name" ], "type": "object" }, diff --git a/ui/src/gen/v1alpha1/generated_pb.ts b/ui/src/gen/v1alpha1/generated_pb.ts index 01b919ec3..5aca14b04 100644 --- a/ui/src/gen/v1alpha1/generated_pb.ts +++ b/ui/src/gen/v1alpha1/generated_pb.ts @@ -18,7 +18,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file v1alpha1/generated.proto. */ export const file_v1alpha1_generated: GenFile = /*@__PURE__*/ - fileDesc("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKrAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEk0KBWl0ZW1zGAIgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrTGlzdCJJCgxDdXJyZW50U3RhZ2USOQoFc2luY2UYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSK2AgoTRGlzY292ZXJlZEFydGlmYWN0cxJACgxkaXNjb3ZlcmVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJFCgNnaXQYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0RGlzY292ZXJ5UmVzdWx0EkoKBmltYWdlcxgCIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZURpc2NvdmVyeVJlc3VsdBJKCgZjaGFydHMYAyADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnREaXNjb3ZlcnlSZXN1bHQisAEKEERpc2NvdmVyZWRDb21taXQSCgoCaWQYASABKAkSDgoGYnJhbmNoGAIgASgJEgsKA3RhZxgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEg4KBmF1dGhvchgFIAEoCRIRCgljb21taXR0ZXIYBiABKAkSPwoLY3JlYXRvckRhdGUYByABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKKAQoYRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlEgsKA3RhZxgBIAEoCRIOCgZkaWdlc3QYAiABKAkSEgoKZ2l0UmVwb1VSTBgDIAEoCRI9CgljcmVhdGVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKiAwoHRnJlaWdodBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEg0KBWFsaWFzGAcgASgJEkMKBm9yaWdpbhgJIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAyADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBSADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQSQwoGc3RhdHVzGAYgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMirQIKEUZyZWlnaHRDb2xsZWN0aW9uEgoKAmlkGAMgASgJElEKBWl0ZW1zGAEgAygLMkIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uLkl0ZW1zRW50cnkSUwoTdmVyaWZpY2F0aW9uSGlzdG9yeRgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb25JbmZvGmQKCkl0ZW1zRW50cnkSCwoDa2V5GAEgASgJEkUKBXZhbHVlGAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2U6AjgBIo0BCgtGcmVpZ2h0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0IisKDUZyZWlnaHRPcmlnaW4SDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJIqECChBGcmVpZ2h0UmVmZXJlbmNlEgwKBG5hbWUYASABKAkSQwoGb3JpZ2luGAggASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAMgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydCKcAQoORnJlaWdodFJlcXVlc3QSQwoGb3JpZ2luGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SRQoHc291cmNlcxgCIAEoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U291cmNlcyJ6Cg5GcmVpZ2h0U291cmNlcxIOCgZkaXJlY3QYASABKAgSDgoGc3RhZ2VzGAIgAygJEkgKEHJlcXVpcmVkU29ha1RpbWUYAyABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24i1wQKDUZyZWlnaHRTdGF0dXMSWQoLY3VycmVudGx5SW4YAyADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5DdXJyZW50bHlJbkVudHJ5ElcKCnZlcmlmaWVkSW4YASADKAsyQy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5WZXJpZmllZEluRW50cnkSWQoLYXBwcm92ZWRGb3IYAiADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5BcHByb3ZlZEZvckVudHJ5GmYKEEN1cnJlbnRseUluRW50cnkSCwoDa2V5GAEgASgJEkEKBXZhbHVlGAIgASgLMjIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkN1cnJlbnRTdGFnZToCOAEaZgoPVmVyaWZpZWRJbkVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmllZFN0YWdlOgI4ARpnChBBcHByb3ZlZEZvckVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BcHByb3ZlZFN0YWdlOgI4ASJ5CglHaXRDb21taXQSDwoHcmVwb1VSTBgBIAEoCRIKCgJpZBgCIAEoCRIOCgZicmFuY2gYAyABKAkSCwoDdGFnGAQgASgJEg8KB21lc3NhZ2UYBiABKAkSDgoGYXV0aG9yGAcgASgJEhEKCWNvbW1pdHRlchgIIAEoCSJuChJHaXREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRJHCgdjb21taXRzGAIgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRDb21taXQijgIKD0dpdFN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEh8KF2NvbW1pdFNlbGVjdGlvblN0cmF0ZWd5GAIgASgJEg4KBmJyYW5jaBgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAsgASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAcgASgIEhQKDGluY2x1ZGVQYXRocxgIIAMoCRIUCgxleGNsdWRlUGF0aHMYCSADKAkSFgoOZGlzY292ZXJ5TGltaXQYCiABKAUiyAEKBkhlYWx0aBIOCgZzdGF0dXMYASABKAkSDgoGaXNzdWVzGAIgAygJEk4KBmNvbmZpZxgEIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04STgoGb3V0cHV0GAUgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJvCg9IZWFsdGhDaGVja1N0ZXASDAoEdXNlcxgBIAEoCRJOCgZjb25maWcYAiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIkkKBUltYWdlEg8KB3JlcG9VUkwYASABKAkSEgoKZ2l0UmVwb1VSTBgCIAEoCRILCgN0YWcYAyABKAkSDgoGZGlnZXN0GAQgASgJIo0BChRJbWFnZURpc2NvdmVyeVJlc3VsdBIPCgdyZXBvVVJMGAEgASgJEhAKCHBsYXRmb3JtGAIgASgJElIKCnJlZmVyZW5jZXMYAyADKAsyPi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlIvkBChFJbWFnZVN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSHgoWaW1hZ2VTZWxlY3Rpb25TdHJhdGVneRgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAogASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSEAoIcGxhdGZvcm0YByABKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAggASgIEhYKDmRpc2NvdmVyeUxpbWl0GAkgASgFItMBCgdQcm9qZWN0EkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPwoEc3BlYxgCIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0U3BlYxJDCgZzdGF0dXMYAyABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFN0YXR1cyKNAQoLUHJvamVjdExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdCJfCgtQcm9qZWN0U3BlYxJQChFwcm9tb3Rpb25Qb2xpY2llcxgBIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25Qb2xpY3kidAoNUHJvamVjdFN0YXR1cxJDCgpjb25kaXRpb25zGAMgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJItkBCglQcm9tb3Rpb24SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cyKRAQoNUHJvbW90aW9uTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb24iPgoPUHJvbW90aW9uUG9saWN5Eg0KBXN0YWdlGAEgASgJEhwKFGF1dG9Qcm9tb3Rpb25FbmFibGVkGAIgASgIIvIBChJQcm9tb3Rpb25SZWZlcmVuY2USDAoEbmFtZRgBIAEoCRJHCgdmcmVpZ2h0GAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cxI+CgpmaW5pc2hlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiugEKDVByb21vdGlvblNwZWMSDQoFc3RhZ2UYASABKAkSDwoHZnJlaWdodBgCIAEoCRJFCgR2YXJzGAQgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAMgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAitwQKD1Byb21vdGlvblN0YXR1cxIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBCABKAkSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJHCgdmcmVpZ2h0GAUgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USUgoRZnJlaWdodENvbGxlY3Rpb24YByABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SSwoMaGVhbHRoQ2hlY2tzGAggAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aENoZWNrU3RlcBI+CgpmaW5pc2hlZEF0GAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSEwoLY3VycmVudFN0ZXAYCSABKAMSWgoVc3RlcEV4ZWN1dGlvbk1ldGFkYXRhGAsgAygLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0ZXBFeGVjdXRpb25NZXRhZGF0YRJNCgVzdGF0ZRgKIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04i2AIKDVByb21vdGlvblN0ZXASDAoEdXNlcxgBIAEoCRJKCgR0YXNrGAUgASgLMjwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tSZWZlcmVuY2USCgoCYXMYAiABKAkSRwoFcmV0cnkYBCABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcFJldHJ5EkgKBmlucHV0cxgGIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwSW5wdXQSTgoGY29uZmlnGAMgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiIxChJQcm9tb3Rpb25TdGVwSW5wdXQSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSJtChJQcm9tb3Rpb25TdGVwUmV0cnkSPwoHdGltZW91dBgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbhIWCg5lcnJvclRocmVzaG9sZBgCIAEoDSKaAQoNUHJvbW90aW9uVGFzaxJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkUKBHNwZWMYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza1NwZWMiMwoSUHJvbW90aW9uVGFza0lucHV0EgwKBG5hbWUYASABKAkSDwoHZGVmYXVsdBgCIAEoCSKdAQoRUHJvbW90aW9uVGFza0xpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESRgoFaXRlbXMYAiADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza0xpc3QiNAoWUHJvbW90aW9uVGFza1JlZmVyZW5jZRIMCgRuYW1lGAEgASgJEgwKBGtpbmQYAiABKAkioQEKEVByb21vdGlvblRhc2tTcGVjEkgKBmlucHV0cxgBIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrSW5wdXQSQgoFc3RlcHMYAiADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCJeChFQcm9tb3Rpb25UZW1wbGF0ZRJJCgRzcGVjGAEgASgLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRlbXBsYXRlU3BlYyKiAQoVUHJvbW90aW9uVGVtcGxhdGVTcGVjEkUKBHZhcnMYAiADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVmFyaWFibGUSQgoFc3RlcHMYASADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCIwChFQcm9tb3Rpb25WYXJpYWJsZRIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJIuYBChBSZXBvU3Vic2NyaXB0aW9uEkIKA2dpdBgBIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRTdWJzY3JpcHRpb24SRgoFaW1hZ2UYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2VTdWJzY3JpcHRpb24SRgoFY2hhcnQYAyABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnRTdWJzY3JpcHRpb24izQEKBVN0YWdlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPQoEc3BlYxgCIAEoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVNwZWMSQQoGc3RhdHVzGAMgASgLMjEuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlU3RhdHVzIokBCglTdGFnZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESOgoFaXRlbXMYAiADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2UiiAIKCVN0YWdlU3BlYxINCgVzaGFyZBgEIAEoCRJOChByZXF1ZXN0ZWRGcmVpZ2h0GAUgAygLMjQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZXF1ZXN0ElIKEXByb21vdGlvblRlbXBsYXRlGAYgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRlbXBsYXRlEkgKDHZlcmlmaWNhdGlvbhgDIAEoCzIyLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb24i9gMKC1N0YWdlU3RhdHVzEkMKCmNvbmRpdGlvbnMYDSADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgLIAEoCRINCgVwaGFzZRgBIAEoCRJPCg5mcmVpZ2h0SGlzdG9yeRgEIAMoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0Q29sbGVjdGlvbhIWCg5mcmVpZ2h0U3VtbWFyeRgMIAEoCRI8CgZoZWFsdGgYCCABKAsyLC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSGVhbHRoEg8KB21lc3NhZ2UYCSABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAYgASgDElIKEGN1cnJlbnRQcm9tb3Rpb24YByABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUmVmZXJlbmNlEk8KDWxhc3RQcm9tb3Rpb24YCiABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUmVmZXJlbmNlItoBChVTdGVwRXhlY3V0aW9uTWV0YWRhdGESDQoFYWxpYXMYASABKAkSPQoJc3RhcnRlZEF0GAIgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSPgoKZmluaXNoZWRBdBgDIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhIKCmVycm9yQ291bnQYBCABKA0SDgoGc3RhdHVzGAUgASgJEg8KB21lc3NhZ2UYBiABKAkiiwIKDFZlcmlmaWNhdGlvbhJaChFhbmFseXNpc1RlbXBsYXRlcxgBIAMoCzI/LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1RlbXBsYXRlUmVmZXJlbmNlElYKE2FuYWx5c2lzUnVuTWV0YWRhdGEYAiABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YRJHCgRhcmdzGAMgAygLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuQXJndW1lbnQinQIKEFZlcmlmaWNhdGlvbkluZm8SCgoCaWQYBCABKAkSDQoFYWN0b3IYByABKAkSPQoJc3RhcnRUaW1lGAUgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJPCgthbmFseXNpc1J1bhgDIAEoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1blJlZmVyZW5jZRI+CgpmaW5pc2hUaW1lGAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUilAEKDVZlcmlmaWVkU3RhZ2USPgoKdmVyaWZpZWRBdBgBIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEkMKC2xvbmdlc3RTb2FrGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uItkBCglXYXJlaG91c2USQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVN0YXR1cyKRAQoNV2FyZWhvdXNlTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2UizgEKDVdhcmVob3VzZVNwZWMSDQoFc2hhcmQYAiABKAkSQAoIaW50ZXJ2YWwYBCABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SHQoVZnJlaWdodENyZWF0aW9uUG9saWN5GAMgASgJEk0KDXN1YnNjcmlwdGlvbnMYASADKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUmVwb1N1YnNjcmlwdGlvbiL9AQoPV2FyZWhvdXNlU3RhdHVzEkMKCmNvbmRpdGlvbnMYCSADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgGIAEoCRIaChJvYnNlcnZlZEdlbmVyYXRpb24YBCABKAMSFQoNbGFzdEZyZWlnaHRJRBgIIAEoCRJWChNkaXNjb3ZlcmVkQXJ0aWZhY3RzGAcgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRBcnRpZmFjdHNClwIKKGNvbS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTFCDkdlbmVyYXRlZFByb3RvUAFaJGdpdGh1Yi5jb20vYWt1aXR5L2thcmdvL2FwaS92MWFscGhhMaICBUdDQUtBqgIkR2l0aHViLkNvbS5Ba3VpdHkuS2FyZ28uQXBpLlYxYWxwaGExygIkR2l0aHViXENvbVxBa3VpdHlcS2FyZ29cQXBpXFYxYWxwaGEx4gIwR2l0aHViXENvbVxBa3VpdHlcS2FyZ29cQXBpXFYxYWxwaGExXEdQQk1ldGFkYXRh6gIpR2l0aHViOjpDb206OkFrdWl0eTo6S2FyZ286OkFwaTo6VjFhbHBoYTE", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]); + fileDesc("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKrAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEk0KBWl0ZW1zGAIgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrTGlzdCJJCgxDdXJyZW50U3RhZ2USOQoFc2luY2UYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSK2AgoTRGlzY292ZXJlZEFydGlmYWN0cxJACgxkaXNjb3ZlcmVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJFCgNnaXQYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0RGlzY292ZXJ5UmVzdWx0EkoKBmltYWdlcxgCIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZURpc2NvdmVyeVJlc3VsdBJKCgZjaGFydHMYAyADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnREaXNjb3ZlcnlSZXN1bHQisAEKEERpc2NvdmVyZWRDb21taXQSCgoCaWQYASABKAkSDgoGYnJhbmNoGAIgASgJEgsKA3RhZxgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEg4KBmF1dGhvchgFIAEoCRIRCgljb21taXR0ZXIYBiABKAkSPwoLY3JlYXRvckRhdGUYByABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKKAQoYRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlEgsKA3RhZxgBIAEoCRIOCgZkaWdlc3QYAiABKAkSEgoKZ2l0UmVwb1VSTBgDIAEoCRI9CgljcmVhdGVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKiAwoHRnJlaWdodBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEg0KBWFsaWFzGAcgASgJEkMKBm9yaWdpbhgJIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAyADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBSADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQSQwoGc3RhdHVzGAYgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMirQIKEUZyZWlnaHRDb2xsZWN0aW9uEgoKAmlkGAMgASgJElEKBWl0ZW1zGAEgAygLMkIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uLkl0ZW1zRW50cnkSUwoTdmVyaWZpY2F0aW9uSGlzdG9yeRgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb25JbmZvGmQKCkl0ZW1zRW50cnkSCwoDa2V5GAEgASgJEkUKBXZhbHVlGAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2U6AjgBIo0BCgtGcmVpZ2h0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0IisKDUZyZWlnaHRPcmlnaW4SDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJIqECChBGcmVpZ2h0UmVmZXJlbmNlEgwKBG5hbWUYASABKAkSQwoGb3JpZ2luGAggASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAMgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydCKcAQoORnJlaWdodFJlcXVlc3QSQwoGb3JpZ2luGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SRQoHc291cmNlcxgCIAEoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U291cmNlcyJ6Cg5GcmVpZ2h0U291cmNlcxIOCgZkaXJlY3QYASABKAgSDgoGc3RhZ2VzGAIgAygJEkgKEHJlcXVpcmVkU29ha1RpbWUYAyABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24i1wQKDUZyZWlnaHRTdGF0dXMSWQoLY3VycmVudGx5SW4YAyADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5DdXJyZW50bHlJbkVudHJ5ElcKCnZlcmlmaWVkSW4YASADKAsyQy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5WZXJpZmllZEluRW50cnkSWQoLYXBwcm92ZWRGb3IYAiADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5BcHByb3ZlZEZvckVudHJ5GmYKEEN1cnJlbnRseUluRW50cnkSCwoDa2V5GAEgASgJEkEKBXZhbHVlGAIgASgLMjIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkN1cnJlbnRTdGFnZToCOAEaZgoPVmVyaWZpZWRJbkVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmllZFN0YWdlOgI4ARpnChBBcHByb3ZlZEZvckVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BcHByb3ZlZFN0YWdlOgI4ASJ5CglHaXRDb21taXQSDwoHcmVwb1VSTBgBIAEoCRIKCgJpZBgCIAEoCRIOCgZicmFuY2gYAyABKAkSCwoDdGFnGAQgASgJEg8KB21lc3NhZ2UYBiABKAkSDgoGYXV0aG9yGAcgASgJEhEKCWNvbW1pdHRlchgIIAEoCSJuChJHaXREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRJHCgdjb21taXRzGAIgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRDb21taXQijgIKD0dpdFN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEh8KF2NvbW1pdFNlbGVjdGlvblN0cmF0ZWd5GAIgASgJEg4KBmJyYW5jaBgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAsgASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAcgASgIEhQKDGluY2x1ZGVQYXRocxgIIAMoCRIUCgxleGNsdWRlUGF0aHMYCSADKAkSFgoOZGlzY292ZXJ5TGltaXQYCiABKAUiyAEKBkhlYWx0aBIOCgZzdGF0dXMYASABKAkSDgoGaXNzdWVzGAIgAygJEk4KBmNvbmZpZxgEIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04STgoGb3V0cHV0GAUgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJvCg9IZWFsdGhDaGVja1N0ZXASDAoEdXNlcxgBIAEoCRJOCgZjb25maWcYAiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIkkKBUltYWdlEg8KB3JlcG9VUkwYASABKAkSEgoKZ2l0UmVwb1VSTBgCIAEoCRILCgN0YWcYAyABKAkSDgoGZGlnZXN0GAQgASgJIo0BChRJbWFnZURpc2NvdmVyeVJlc3VsdBIPCgdyZXBvVVJMGAEgASgJEhAKCHBsYXRmb3JtGAIgASgJElIKCnJlZmVyZW5jZXMYAyADKAsyPi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlIvkBChFJbWFnZVN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSHgoWaW1hZ2VTZWxlY3Rpb25TdHJhdGVneRgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAogASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSEAoIcGxhdGZvcm0YByABKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAggASgIEhYKDmRpc2NvdmVyeUxpbWl0GAkgASgFItMBCgdQcm9qZWN0EkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPwoEc3BlYxgCIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0U3BlYxJDCgZzdGF0dXMYAyABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFN0YXR1cyKNAQoLUHJvamVjdExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdCJfCgtQcm9qZWN0U3BlYxJQChFwcm9tb3Rpb25Qb2xpY2llcxgBIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25Qb2xpY3kidAoNUHJvamVjdFN0YXR1cxJDCgpjb25kaXRpb25zGAMgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJItkBCglQcm9tb3Rpb24SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cyKRAQoNUHJvbW90aW9uTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb24iPgoPUHJvbW90aW9uUG9saWN5Eg0KBXN0YWdlGAEgASgJEhwKFGF1dG9Qcm9tb3Rpb25FbmFibGVkGAIgASgIIvIBChJQcm9tb3Rpb25SZWZlcmVuY2USDAoEbmFtZRgBIAEoCRJHCgdmcmVpZ2h0GAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cxI+CgpmaW5pc2hlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiugEKDVByb21vdGlvblNwZWMSDQoFc3RhZ2UYASABKAkSDwoHZnJlaWdodBgCIAEoCRJFCgR2YXJzGAQgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAMgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAitwQKD1Byb21vdGlvblN0YXR1cxIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBCABKAkSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJHCgdmcmVpZ2h0GAUgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USUgoRZnJlaWdodENvbGxlY3Rpb24YByABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SSwoMaGVhbHRoQ2hlY2tzGAggAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aENoZWNrU3RlcBI+CgpmaW5pc2hlZEF0GAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSEwoLY3VycmVudFN0ZXAYCSABKAMSWgoVc3RlcEV4ZWN1dGlvbk1ldGFkYXRhGAsgAygLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0ZXBFeGVjdXRpb25NZXRhZGF0YRJNCgVzdGF0ZRgKIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04i1QIKDVByb21vdGlvblN0ZXASDAoEdXNlcxgBIAEoCRJKCgR0YXNrGAUgASgLMjwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tSZWZlcmVuY2USCgoCYXMYAiABKAkSRwoFcmV0cnkYBCABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcFJldHJ5EkUKBHZhcnMYBiADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVmFyaWFibGUSTgoGY29uZmlnGAMgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJtChJQcm9tb3Rpb25TdGVwUmV0cnkSPwoHdGltZW91dBgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbhIWCg5lcnJvclRocmVzaG9sZBgCIAEoDSKaAQoNUHJvbW90aW9uVGFzaxJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkUKBHNwZWMYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza1NwZWMinQEKEVByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEkYKBWl0ZW1zGAIgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tMaXN0IjQKFlByb21vdGlvblRhc2tSZWZlcmVuY2USDAoEbmFtZRgBIAEoCRIMCgRraW5kGAIgASgJIp4BChFQcm9tb3Rpb25UYXNrU3BlYxJFCgR2YXJzGAEgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAIgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAiXgoRUHJvbW90aW9uVGVtcGxhdGUSSQoEc3BlYxgBIAEoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZVNwZWMiogEKFVByb21vdGlvblRlbXBsYXRlU3BlYxJFCgR2YXJzGAIgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAEgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAiMAoRUHJvbW90aW9uVmFyaWFibGUSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSLmAQoQUmVwb1N1YnNjcmlwdGlvbhJCCgNnaXQYASABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0U3Vic2NyaXB0aW9uEkYKBWltYWdlGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlU3Vic2NyaXB0aW9uEkYKBWNoYXJ0GAMgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0U3Vic2NyaXB0aW9uIs0BCgVTdGFnZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEj0KBHNwZWMYAiABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2VTcGVjEkEKBnN0YXR1cxgDIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVN0YXR1cyKJAQoJU3RhZ2VMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjoKBWl0ZW1zGAIgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlIogCCglTdGFnZVNwZWMSDQoFc2hhcmQYBCABKAkSTgoQcmVxdWVzdGVkRnJlaWdodBgFIAMoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVxdWVzdBJSChFwcm9tb3Rpb25UZW1wbGF0ZRgGIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZRJICgx2ZXJpZmljYXRpb24YAyABKAsyMi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpY2F0aW9uIvYDCgtTdGFnZVN0YXR1cxJDCgpjb25kaXRpb25zGA0gAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYCyABKAkSDQoFcGhhc2UYASABKAkSTwoOZnJlaWdodEhpc3RvcnkYBCADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SFgoOZnJlaWdodFN1bW1hcnkYDCABKAkSPAoGaGVhbHRoGAggASgLMiwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aBIPCgdtZXNzYWdlGAkgASgJEhoKEm9ic2VydmVkR2VuZXJhdGlvbhgGIAEoAxJSChBjdXJyZW50UHJvbW90aW9uGAcgASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZRJPCg1sYXN0UHJvbW90aW9uGAogASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZSLaAQoVU3RlcEV4ZWN1dGlvbk1ldGFkYXRhEg0KBWFsaWFzGAEgASgJEj0KCXN0YXJ0ZWRBdBgCIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEj4KCmZpbmlzaGVkQXQYAyABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRISCgplcnJvckNvdW50GAQgASgNEg4KBnN0YXR1cxgFIAEoCRIPCgdtZXNzYWdlGAYgASgJIosCCgxWZXJpZmljYXRpb24SWgoRYW5hbHlzaXNUZW1wbGF0ZXMYASADKAsyPy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNUZW1wbGF0ZVJlZmVyZW5jZRJWChNhbmFseXNpc1J1bk1ldGFkYXRhGAIgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGESRwoEYXJncxgDIAMoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1bkFyZ3VtZW50Ip0CChBWZXJpZmljYXRpb25JbmZvEgoKAmlkGAQgASgJEg0KBWFjdG9yGAcgASgJEj0KCXN0YXJ0VGltZRgFIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEg0KBXBoYXNlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSTwoLYW5hbHlzaXNSdW4YAyABKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5SZWZlcmVuY2USPgoKZmluaXNoVGltZRgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIpQBCg1WZXJpZmllZFN0YWdlEj4KCnZlcmlmaWVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJDCgtsb25nZXN0U29haxgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbiLZAQoJV2FyZWhvdXNlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESQQoEc3BlYxgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTcGVjEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTdGF0dXMikQEKDVdhcmVob3VzZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPgoFaXRlbXMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlIs4BCg1XYXJlaG91c2VTcGVjEg0KBXNoYXJkGAIgASgJEkAKCGludGVydmFsGAQgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uEh0KFWZyZWlnaHRDcmVhdGlvblBvbGljeRgDIAEoCRJNCg1zdWJzY3JpcHRpb25zGAEgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlJlcG9TdWJzY3JpcHRpb24i/QEKD1dhcmVob3VzZVN0YXR1cxJDCgpjb25kaXRpb25zGAkgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBiABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAQgASgDEhUKDWxhc3RGcmVpZ2h0SUQYCCABKAkSVgoTZGlzY292ZXJlZEFydGlmYWN0cxgHIAEoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQXJ0aWZhY3RzQpcCCihjb20uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExQg5HZW5lcmF0ZWRQcm90b1ABWiRnaXRodWIuY29tL2FrdWl0eS9rYXJnby9hcGkvdjFhbHBoYTGiAgVHQ0FLQaoCJEdpdGh1Yi5Db20uQWt1aXR5LkthcmdvLkFwaS5WMWFscGhhMcoCJEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMeICMEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMVxHUEJNZXRhZGF0YeoCKUdpdGh1Yjo6Q29tOjpBa3VpdHk6OkthcmdvOjpBcGk6OlYxYWxwaGEx", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]); /** * AnalysisRunArgument represents an argument to be added to an AnalysisRun. @@ -2034,8 +2034,6 @@ export const PromotionStatusSchema: GenMessage = /*@__PURE__*/ /** * PromotionStep describes a directive to be executed as part of a Promotion. * - * +kubebuilder:validation:XValidation:message="inputs must not be set when task is set",rule="!(has(self.task) && self.inputs.size() > 0)" - * * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionStep */ export type PromotionStep = Message<"github.com.akuity.kargo.api.v1alpha1.PromotionStep"> & { @@ -2050,7 +2048,7 @@ export type PromotionStep = Message<"github.com.akuity.kargo.api.v1alpha1.Promot uses: string; /** - * Task is a reference to a PromotionTask that should be deflated into a + * Task is a reference to a PromotionTask that should be inflated into a * Promotion when it is built from a PromotionTemplate. * * @generated from field: optional github.com.akuity.kargo.api.v1alpha1.PromotionTaskReference task = 5; @@ -2072,16 +2070,13 @@ export type PromotionStep = Message<"github.com.akuity.kargo.api.v1alpha1.Promot retry?: PromotionStepRetry; /** - * Inputs is a list of inputs that can used to parameterize the execution - * of the PromotionStep and can be referenced by expressions in the Config. - * - * When a PromotionStep is inflated from a PromotionTask, the inputs - * specified in the PromotionTask are set based on the inputs specified - * in the Config of the PromotionStep that references the PromotionTask. + * Vars is a list of variables that can be referenced by expressions in + * the step's Config. The values override the values specified in the + * PromotionSpec. * - * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionStepInput inputs = 6; + * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionVariable vars = 6; */ - inputs: PromotionStepInput[]; + vars: PromotionVariable[]; /** * Config is opaque configuration for the PromotionStep that is understood @@ -2101,38 +2096,6 @@ export type PromotionStep = Message<"github.com.akuity.kargo.api.v1alpha1.Promot export const PromotionStepSchema: GenMessage = /*@__PURE__*/ messageDesc(file_v1alpha1_generated, 43); -/** - * PromotionStepInput describes a single input value for a PromotionStep that may - * be referenced by expressions in the step. - * - * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionStepInput - */ -export type PromotionStepInput = Message<"github.com.akuity.kargo.api.v1alpha1.PromotionStepInput"> & { - /** - * Name is the name of the input to which the value is assigned. - * - * +kubebuilder:validation:MinLength=1 - * +kubebuilder:validation:Pattern=^[a-zA-Z_]\w*$ - * - * @generated from field: optional string name = 1; - */ - name: string; - - /** - * Value is the input value. - * - * @generated from field: optional string value = 2; - */ - value: string; -}; - -/** - * Describes the message github.com.akuity.kargo.api.v1alpha1.PromotionStepInput. - * Use `create(PromotionStepInputSchema)` to create a new message. - */ -export const PromotionStepInputSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 44); - /** * PromotionStepRetry describes the retry policy for a PromotionStep. * @@ -2190,7 +2153,7 @@ export type PromotionStepRetry = Message<"github.com.akuity.kargo.api.v1alpha1.P * Use `create(PromotionStepRetrySchema)` to create a new message. */ export const PromotionStepRetrySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 45); + messageDesc(file_v1alpha1_generated, 44); /** * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionTask @@ -2202,8 +2165,8 @@ export type PromotionTask = Message<"github.com.akuity.kargo.api.v1alpha1.Promot metadata?: ObjectMeta; /** - * Spec describes the composition of a PromotionTask, including the inputs - * available to the task and the steps. + * Spec describes the composition of a PromotionTask, including the + * variables available to the task and the steps. * * +kubebuilder:validation:Required * @@ -2217,48 +2180,7 @@ export type PromotionTask = Message<"github.com.akuity.kargo.api.v1alpha1.Promot * Use `create(PromotionTaskSchema)` to create a new message. */ export const PromotionTaskSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 46); - -/** - * PromotionTaskInput defines an input parameter for a PromotionTask. This input - * can be specified in the PromotionTemplate as configuration for the task, and - * can be used in the Steps to parameterize the execution of the task. - * - * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionTaskInput - */ -export type PromotionTaskInput = Message<"github.com.akuity.kargo.api.v1alpha1.PromotionTaskInput"> & { - /** - * Name of the configuration parameter, which should be unique within the - * PromotionTask. This name can be used to reference the parameter in the - * PromotionTaskSpec.Steps. - * - * +kubebuilder:validation:Required - * +kubebuilder:validation:MinLength=1 - * +kubebuilder:validation:Pattern=^[a-zA-Z_]\w*$ - * - * @generated from field: optional string name = 1; - */ - name: string; - - /** - * Default specifies a default value for the parameter. This value will be - * used if the parameter is not specified in the PromotionTemplate. - * If left unspecified, the input value is required to be specified in the - * configuration of the step referencing this task. - * - * +kubebuilder:validation:Optional - * - * @generated from field: optional string default = 2; - */ - default: string; -}; - -/** - * Describes the message github.com.akuity.kargo.api.v1alpha1.PromotionTaskInput. - * Use `create(PromotionTaskInputSchema)` to create a new message. - */ -export const PromotionTaskInputSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 47); + messageDesc(file_v1alpha1_generated, 45); /** * PromotionTaskList contains a list of PromotionTasks. @@ -2282,7 +2204,7 @@ export type PromotionTaskList = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionTaskListSchema)` to create a new message. */ export const PromotionTaskListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 48); + messageDesc(file_v1alpha1_generated, 46); /** * PromotionTaskReference describes a reference to a PromotionTask. @@ -2319,30 +2241,29 @@ export type PromotionTaskReference = Message<"github.com.akuity.kargo.api.v1alph * Use `create(PromotionTaskReferenceSchema)` to create a new message. */ export const PromotionTaskReferenceSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 49); + messageDesc(file_v1alpha1_generated, 47); /** * @generated from message github.com.akuity.kargo.api.v1alpha1.PromotionTaskSpec */ export type PromotionTaskSpec = Message<"github.com.akuity.kargo.api.v1alpha1.PromotionTaskSpec"> & { /** - * Inputs specifies the inputs available to the PromotionTask. These inputs - * can be specified in the PromotionTemplate as configuration for the task, - * and can be used in the Steps to parameterize the execution of the task. + * Vars specifies the variables available to the PromotionTask. The + * values of these variables are the default values that can be + * overridden by the step referencing the task. * - * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionTaskInput inputs = 1; + * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionVariable vars = 1; */ - inputs: PromotionTaskInput[]; + vars: PromotionVariable[]; /** * Steps specifies the directives to be executed as part of this - * PromotionTask. The steps as defined here are deflated into a + * PromotionTask. The steps as defined here are inflated into a * Promotion when it is built from a PromotionTemplate. * * +kubebuilder:validation:Required * +kubebuilder:validation:MinItems=1 * +kubebuilder:validation:items:XValidation:message="PromotionTask step must have uses set and must not reference another task",rule="has(self.uses) && !has(self.task)" - * +kubebuilder:validation:items:XValidation:message="PromotionTask step must not have inputs set",rule="self.inputs.size() == 0" * * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionStep steps = 2; */ @@ -2354,7 +2275,7 @@ export type PromotionTaskSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionTaskSpecSchema)` to create a new message. */ export const PromotionTaskSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 50); + messageDesc(file_v1alpha1_generated, 48); /** * PromotionTemplate defines a template for a Promotion that can be used to @@ -2374,7 +2295,7 @@ export type PromotionTemplate = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionTemplateSchema)` to create a new message. */ export const PromotionTemplateSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 51); + messageDesc(file_v1alpha1_generated, 49); /** * PromotionTemplateSpec describes the (partial) specification of a Promotion @@ -2410,7 +2331,7 @@ export type PromotionTemplateSpec = Message<"github.com.akuity.kargo.api.v1alpha * Use `create(PromotionTemplateSpecSchema)` to create a new message. */ export const PromotionTemplateSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 52); + messageDesc(file_v1alpha1_generated, 50); /** * PromotionVariable describes a single variable that may be referenced by @@ -2444,7 +2365,7 @@ export type PromotionVariable = Message<"github.com.akuity.kargo.api.v1alpha1.Pr * Use `create(PromotionVariableSchema)` to create a new message. */ export const PromotionVariableSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 53); + messageDesc(file_v1alpha1_generated, 51); /** * RepoSubscription describes a subscription to ONE OF a Git repository, a @@ -2480,7 +2401,7 @@ export type RepoSubscription = Message<"github.com.akuity.kargo.api.v1alpha1.Rep * Use `create(RepoSubscriptionSchema)` to create a new message. */ export const RepoSubscriptionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 54); + messageDesc(file_v1alpha1_generated, 52); /** * Stage is the Kargo API's main type. @@ -2516,7 +2437,7 @@ export type Stage = Message<"github.com.akuity.kargo.api.v1alpha1.Stage"> & { * Use `create(StageSchema)` to create a new message. */ export const StageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 55); + messageDesc(file_v1alpha1_generated, 53); /** * StageList is a list of Stage resources. @@ -2540,7 +2461,7 @@ export type StageList = Message<"github.com.akuity.kargo.api.v1alpha1.StageList" * Use `create(StageListSchema)` to create a new message. */ export const StageListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 56); + messageDesc(file_v1alpha1_generated, 54); /** * StageSpec describes the sources of Freight used by a Stage and how to @@ -2598,7 +2519,7 @@ export type StageSpec = Message<"github.com.akuity.kargo.api.v1alpha1.StageSpec" * Use `create(StageSpecSchema)` to create a new message. */ export const StageSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 57); + messageDesc(file_v1alpha1_generated, 55); /** * StageStatus describes a Stages's current and recent Freight, health, and @@ -2705,7 +2626,7 @@ export type StageStatus = Message<"github.com.akuity.kargo.api.v1alpha1.StageSta * Use `create(StageStatusSchema)` to create a new message. */ export const StageStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 58); + messageDesc(file_v1alpha1_generated, 56); /** * StepExecutionMetadata tracks metadata pertaining to the execution of @@ -2764,7 +2685,7 @@ export type StepExecutionMetadata = Message<"github.com.akuity.kargo.api.v1alpha * Use `create(StepExecutionMetadataSchema)` to create a new message. */ export const StepExecutionMetadataSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 59); + messageDesc(file_v1alpha1_generated, 57); /** * Verification describes how to verify that a Promotion has been successful @@ -2803,7 +2724,7 @@ export type Verification = Message<"github.com.akuity.kargo.api.v1alpha1.Verific * Use `create(VerificationSchema)` to create a new message. */ export const VerificationSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 60); + messageDesc(file_v1alpha1_generated, 58); /** * VerificationInfo contains the details of an instance of a Verification @@ -2873,7 +2794,7 @@ export type VerificationInfo = Message<"github.com.akuity.kargo.api.v1alpha1.Ver * Use `create(VerificationInfoSchema)` to create a new message. */ export const VerificationInfoSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 61); + messageDesc(file_v1alpha1_generated, 59); /** * VerifiedStage describes a Stage in which Freight has been verified. @@ -2905,7 +2826,7 @@ export type VerifiedStage = Message<"github.com.akuity.kargo.api.v1alpha1.Verifi * Use `create(VerifiedStageSchema)` to create a new message. */ export const VerifiedStageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 62); + messageDesc(file_v1alpha1_generated, 60); /** * Warehouse is a source of Freight. @@ -2940,7 +2861,7 @@ export type Warehouse = Message<"github.com.akuity.kargo.api.v1alpha1.Warehouse" * Use `create(WarehouseSchema)` to create a new message. */ export const WarehouseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 63); + messageDesc(file_v1alpha1_generated, 61); /** * WarehouseList is a list of Warehouse resources. @@ -2964,7 +2885,7 @@ export type WarehouseList = Message<"github.com.akuity.kargo.api.v1alpha1.Wareho * Use `create(WarehouseListSchema)` to create a new message. */ export const WarehouseListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 64); + messageDesc(file_v1alpha1_generated, 62); /** * WarehouseSpec describes sources of versioned artifacts to be included in @@ -3030,7 +2951,7 @@ export type WarehouseSpec = Message<"github.com.akuity.kargo.api.v1alpha1.Wareho * Use `create(WarehouseSpecSchema)` to create a new message. */ export const WarehouseSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 65); + messageDesc(file_v1alpha1_generated, 63); /** * WarehouseStatus describes a Warehouse's most recently observed state. @@ -3089,5 +3010,5 @@ export type WarehouseStatus = Message<"github.com.akuity.kargo.api.v1alpha1.Ware * Use `create(WarehouseStatusSchema)` to create a new message. */ export const WarehouseStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_v1alpha1_generated, 66); + messageDesc(file_v1alpha1_generated, 64); From 32dcabe4efbda43bddc8f81d5897f2427ce9a2b5 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Mon, 16 Dec 2024 21:34:42 +0100 Subject: [PATCH 20/38] chore(directives): implement step-level vars Signed-off-by: Hidde Beydals --- internal/controller/promotions/promotions.go | 2 +- internal/directives/promotions.go | 33 ++- internal/kargo/promotion_builder.go | 76 +++--- internal/kargo/promotion_builder_test.go | 265 +++++++++---------- 4 files changed, 181 insertions(+), 195 deletions(-) diff --git a/internal/controller/promotions/promotions.go b/internal/controller/promotions/promotions.go index 3f950b75d..580f069fe 100644 --- a/internal/controller/promotions/promotions.go +++ b/internal/controller/promotions/promotions.go @@ -471,7 +471,7 @@ func (r *reconciler) promote( Kind: step.Uses, Alias: step.As, Retry: step.Retry, - Inputs: step.Inputs, + Vars: step.Vars, Config: step.Config.Raw, } } diff --git a/internal/directives/promotions.go b/internal/directives/promotions.go index f14caac46..255016047 100644 --- a/internal/directives/promotions.go +++ b/internal/directives/promotions.go @@ -96,8 +96,9 @@ type PromotionStep struct { Alias string // Retry is the retry configuration for the PromotionStep. Retry *kargoapi.PromotionStepRetry - // Inputs is a list of inputs to be made available to the Config of this step. - Inputs []kargoapi.PromotionStepInput + // Vars is a list of variables definitions that can be used by the + // PromotionStep. + Vars []kargoapi.PromotionVariable // Config is an opaque JSON to be passed to the PromotionStepRunner executing // this step. Config []byte @@ -146,8 +147,6 @@ func (s *PromotionStep) GetConfig( return nil, err } - inputs := s.GetInputs() - evaledCfgJSON, err := expressions.EvaluateJSONTemplate( s.Config, map[string]any{ @@ -157,7 +156,6 @@ func (s *PromotionStep) GetConfig( "stage": promoCtx.Stage, }, "vars": vars, - "inputs": inputs, "secrets": promoCtx.Secrets, "outputs": state, }, @@ -196,10 +194,18 @@ func (s *PromotionStep) GetConfig( // GetVars returns the variables defined in the PromotionStep. The variables are // evaluated in the context of the provided PromotionContext. func (s *PromotionStep) GetVars(promoCtx PromotionContext) (map[string]any, error) { - vars := make(map[string]any, len(promoCtx.Vars)) + var rawVars = make(map[string]string, len(promoCtx.Vars)) for _, v := range promoCtx.Vars { + rawVars[v.Name] = v.Value + } + for _, v := range s.Vars { + rawVars[v.Name] = v.Value + } + + vars := make(map[string]any, len(rawVars)) + for k, v := range rawVars { newVar, err := expressions.EvaluateTemplate( - v.Value, + v, map[string]any{ "ctx": map[string]any{ "project": promoCtx.Project, @@ -210,22 +216,13 @@ func (s *PromotionStep) GetVars(promoCtx PromotionContext) (map[string]any, erro }, ) if err != nil { - return nil, fmt.Errorf("error pre-processing promotion variable %q: %w", v.Name, err) + return nil, fmt.Errorf("error pre-processing promotion variable %q: %w", k, err) } - vars[v.Name] = newVar + vars[k] = newVar } return vars, nil } -// GetInputs returns the inputs of the PromotionStep as a map. -func (s *PromotionStep) GetInputs() map[string]any { - inputs := make(map[string]any, len(s.Inputs)) - for _, i := range s.Inputs { - inputs[i.Name] = i.Value - } - return inputs -} - // PromotionResult is the result of a user-defined promotion process executed by // the Engine. It aggregates the status and output of the individual // PromotionStepResults returned by the PromotionStepRunner executing each diff --git a/internal/kargo/promotion_builder.go b/internal/kargo/promotion_builder.go index 2deb446aa..ff3386fc4 100644 --- a/internal/kargo/promotion_builder.go +++ b/internal/kargo/promotion_builder.go @@ -7,10 +7,8 @@ import ( "strings" "github.com/oklog/ulid/v2" - apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/yaml" kargoapi "github.com/akuity/kargo/api/v1alpha1" "github.com/akuity/kargo/internal/api/user" @@ -103,7 +101,13 @@ func (b *PromotionBuilder) buildSteps(ctx context.Context, stage kargoapi.Stage) switch { case step.Task != nil: alias := step.GetAlias(i) - taskSteps, err := b.inflateTaskSteps(ctx, stage.Namespace, alias, step) + taskSteps, err := b.inflateTaskSteps( + ctx, + stage.Namespace, + alias, + stage.Spec.PromotionTemplate.Spec.Vars, + step, + ) if err != nil { return nil, fmt.Errorf("inflate tasks steps for task %q (%q): %w", step.Task.Name, alias, err) } @@ -121,6 +125,7 @@ func (b *PromotionBuilder) buildSteps(ctx context.Context, stage kargoapi.Stage) func (b *PromotionBuilder) inflateTaskSteps( ctx context.Context, project, taskAlias string, + promoVars []kargoapi.PromotionVariable, taskStep kargoapi.PromotionStep, ) ([]kargoapi.PromotionStep, error) { task, err := b.getTaskSpec(ctx, project, taskStep.Task) @@ -128,7 +133,7 @@ func (b *PromotionBuilder) inflateTaskSteps( return nil, err } - inputs, err := promotionTaskInputsToStepInputs(task.Inputs, taskStep.Config) + vars, err := promotionTaskVarsToStepVars(task.Vars, promoVars, taskStep.Vars) if err != nil { return nil, err } @@ -142,9 +147,9 @@ func (b *PromotionBuilder) inflateTaskSteps( // the Promotion. step.As = generatePromotionTaskStepAlias(taskAlias, step.GetAlias(i)) - // With the inputs validated and mapped, they are now available to + // With the variables validated and mapped, they are now available to // the Config of the step during the Promotion execution. - step.Inputs = inputs + step.Vars = vars // Append the inflated step to the list of steps. steps = append(steps, *step) @@ -215,42 +220,45 @@ func generatePromotionTaskStepAlias(taskAlias, stepAlias string) string { return fmt.Sprintf("%s%s%s", taskAlias, aliasSeparator, stepAlias) } -// promotionTaskInputsToStepInputs validates the task step config against the task -// inputs, and maps the config to inputs for the inflated steps. -func promotionTaskInputsToStepInputs( - taskInputs []kargoapi.PromotionTaskInput, - stepConfig *apiextensionsv1.JSON, -) ([]kargoapi.PromotionStepInput, error) { - if len(taskInputs) == 0 { +// promotionTaskVarsToStepVars validates the presence of the PromotionTask +// variables and maps them to variables which can be used by the inflated +// PromotionStep. +func promotionTaskVarsToStepVars( + taskVars, promoVars, stepVars []kargoapi.PromotionVariable, +) ([]kargoapi.PromotionVariable, error) { + if len(taskVars) == 0 { return nil, nil } - if stepConfig == nil { - return nil, errors.New("missing step config") + promoVarsMap := make(map[string]kargoapi.PromotionVariable, len(promoVars)) + for _, v := range promoVars { + promoVarsMap[v.Name] = v } - config := make(map[string]any, len(taskInputs)) - if err := yaml.Unmarshal(stepConfig.Raw, &config); err != nil { - return nil, fmt.Errorf("unmarshal step config: %w", err) + stepVarsMap := make(map[string]kargoapi.PromotionVariable, len(stepVars)) + for _, v := range stepVars { + stepVarsMap[v.Name] = v } - inputs := make([]kargoapi.PromotionStepInput, 0, len(taskInputs)) - for _, input := range taskInputs { - iv := input.Default - if cv, exists := config[input.Name]; exists { - strVal, ok := cv.(string) - if !ok { - return nil, fmt.Errorf("input %q must be a string", input.Name) - } - iv = strVal + vars := make([]kargoapi.PromotionVariable, 0, len(taskVars)) + for _, v := range taskVars { + if stepVar, ok := stepVarsMap[v.Name]; ok && stepVar.Value != "" { + vars = append(vars, stepVar) + continue } - if iv == "" { - return nil, fmt.Errorf("missing required input %q", input.Name) + + if promoVar, ok := promoVarsMap[v.Name]; ok && promoVar.Value != "" { + // If the variable is defined in the Promotion, the engine will + // automatically use the value from the Promotion, and we do not + // have to explicitly set it here. + continue } - inputs = append(inputs, kargoapi.PromotionStepInput{ - Name: input.Name, - Value: iv, - }) + + if v.Value == "" { + return nil, fmt.Errorf("missing value for variable %q", v.Name) + } + + vars = append(vars, v) } - return inputs, nil + return vars, nil } diff --git a/internal/kargo/promotion_builder_test.go b/internal/kargo/promotion_builder_test.go index 81411f17d..a4b332d7d 100644 --- a/internal/kargo/promotion_builder_test.go +++ b/internal/kargo/promotion_builder_test.go @@ -8,14 +8,12 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" "sigs.k8s.io/controller-runtime/pkg/client/interceptor" - "sigs.k8s.io/yaml" kargoapi "github.com/akuity/kargo/api/v1alpha1" "github.com/akuity/kargo/internal/api/user" @@ -144,9 +142,9 @@ func TestPromotionBuilder_Build(t *testing.T) { Task: &kargoapi.PromotionTaskReference{ Name: "test-task", }, - Config: makeJSONObj(t, map[string]any{ - "input1": "value1", - }), + Vars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "value1"}, + }, }, }, }, @@ -164,7 +162,7 @@ func TestPromotionBuilder_Build(t *testing.T) { Namespace: "test-project", }, Spec: kargoapi.PromotionTaskSpec{ - Inputs: []kargoapi.PromotionTaskInput{ + Vars: []kargoapi.PromotionVariable{ {Name: "input1"}, }, Steps: []kargoapi.PromotionStep{ @@ -187,9 +185,9 @@ func TestPromotionBuilder_Build(t *testing.T) { require.Len(t, promotion.Spec.Steps, 1) assert.Equal(t, "task-step::sub-step", promotion.Spec.Steps[0].As) assert.Equal(t, "other-fake-step", promotion.Spec.Steps[0].Uses) - assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + assert.ElementsMatch(t, []kargoapi.PromotionVariable{ {Name: "input1", Value: "value1"}, - }, promotion.Spec.Steps[0].Inputs) + }, promotion.Spec.Steps[0].Vars) }, }, } @@ -294,9 +292,9 @@ func TestPromotionBuilder_buildSteps(t *testing.T) { Task: &kargoapi.PromotionTaskReference{ Name: "test-task", }, - Config: makeJSONObj(t, map[string]any{ - "input1": "value1", - }), + Vars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "value1"}, + }, }, }, }, @@ -310,7 +308,7 @@ func TestPromotionBuilder_buildSteps(t *testing.T) { Namespace: "test-project", }, Spec: kargoapi.PromotionTaskSpec{ - Inputs: []kargoapi.PromotionTaskInput{ + Vars: []kargoapi.PromotionVariable{ {Name: "input1"}, }, Steps: []kargoapi.PromotionStep{ @@ -333,9 +331,9 @@ func TestPromotionBuilder_buildSteps(t *testing.T) { // Check inflated task step assert.Equal(t, "task-step::sub-step", steps[1].As) assert.Equal(t, "other-fake-step", steps[1].Uses) - assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + assert.ElementsMatch(t, []kargoapi.PromotionVariable{ {Name: "input1", Value: "value1"}, - }, steps[1].Inputs) + }, steps[1].Vars) }, }, { @@ -354,9 +352,9 @@ func TestPromotionBuilder_buildSteps(t *testing.T) { Task: &kargoapi.PromotionTaskReference{ Name: "test-task-1", }, - Config: makeJSONObj(t, map[string]any{ - "input1": "value1", - }), + Vars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "value1"}, + }, }, { As: "task2", @@ -364,9 +362,9 @@ func TestPromotionBuilder_buildSteps(t *testing.T) { Kind: "ClusterPromotionTask", Name: "test-task-2", }, - Config: makeJSONObj(t, map[string]any{ - "input2": "value2", - }), + Vars: []kargoapi.PromotionVariable{ + {Name: "input2", Value: "value2"}, + }, }, }, }, @@ -380,7 +378,7 @@ func TestPromotionBuilder_buildSteps(t *testing.T) { Namespace: "test-project", }, Spec: kargoapi.PromotionTaskSpec{ - Inputs: []kargoapi.PromotionTaskInput{ + Vars: []kargoapi.PromotionVariable{ {Name: "input1"}, }, Steps: []kargoapi.PromotionStep{ @@ -396,7 +394,7 @@ func TestPromotionBuilder_buildSteps(t *testing.T) { Name: "test-task-2", }, Spec: kargoapi.PromotionTaskSpec{ - Inputs: []kargoapi.PromotionTaskInput{ + Vars: []kargoapi.PromotionVariable{ {Name: "input2"}, }, Steps: []kargoapi.PromotionStep{ @@ -414,15 +412,15 @@ func TestPromotionBuilder_buildSteps(t *testing.T) { assert.Equal(t, "task1::step1", steps[0].As) assert.Equal(t, "fake-step", steps[0].Uses) - assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + assert.ElementsMatch(t, []kargoapi.PromotionVariable{ {Name: "input1", Value: "value1"}, - }, steps[0].Inputs) + }, steps[0].Vars) assert.Equal(t, "task2::step2", steps[1].As) assert.Equal(t, "other-fake-step", steps[1].Uses) - assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + assert.ElementsMatch(t, []kargoapi.PromotionVariable{ {Name: "input2", Value: "value2"}, - }, steps[1].Inputs) + }, steps[1].Vars) }, }, } @@ -449,6 +447,7 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { name string project string taskAlias string + promoVars []kargoapi.PromotionVariable taskStep kargoapi.PromotionStep objects []client.Object assertions func(*testing.T, []kargoapi.PromotionStep, error) @@ -468,14 +467,15 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { }, }, { - name: "invalid config for task inputs", + name: "invalid config for task variables", project: "test-project", taskStep: kargoapi.PromotionStep{ Task: &kargoapi.PromotionTaskReference{ Name: "test-task", }, - Config: &apiextensionsv1.JSON{Raw: []byte(`{invalid json`)}, + // Missing values + Vars: nil, }, objects: []client.Object{ &kargoapi.PromotionTask{ @@ -484,14 +484,14 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { Namespace: "test-project", }, Spec: kargoapi.PromotionTaskSpec{ - Inputs: []kargoapi.PromotionTaskInput{ + Vars: []kargoapi.PromotionVariable{ {Name: "input1"}, }, }, }, }, assertions: func(t *testing.T, steps []kargoapi.PromotionStep, err error) { - assert.ErrorContains(t, err, "unmarshal step config") + assert.ErrorContains(t, err, "missing value for variable") assert.Nil(t, steps) }, }, @@ -499,14 +499,17 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { name: "successful task step inflation", project: "test-project", taskAlias: "task-1", + promoVars: []kargoapi.PromotionVariable{ + {Name: "input3", Value: "value1"}, + }, taskStep: kargoapi.PromotionStep{ Task: &kargoapi.PromotionTaskReference{ Name: "test-task", }, - Config: makeJSONObj(t, map[string]any{ - "input1": "value1", - "input2": "value2", - }), + Vars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "value1"}, + {Name: "input2", Value: "value2"}, + }, }, objects: []client.Object{ &kargoapi.PromotionTask{ @@ -515,9 +518,10 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { Namespace: "test-project", }, Spec: kargoapi.PromotionTaskSpec{ - Inputs: []kargoapi.PromotionTaskInput{ + Vars: []kargoapi.PromotionVariable{ {Name: "input1"}, - {Name: "input2", Default: "default2"}, + {Name: "input2", Value: "default2"}, + {Name: "input3"}, }, Steps: []kargoapi.PromotionStep{ { @@ -538,17 +542,17 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { assert.Equal(t, "task-1::step1", steps[0].As) assert.Equal(t, "fake-step", steps[0].Uses) - assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + assert.ElementsMatch(t, []kargoapi.PromotionVariable{ {Name: "input1", Value: "value1"}, {Name: "input2", Value: "value2"}, - }, steps[0].Inputs) + }, steps[0].Vars) assert.Equal(t, "task-1::step2", steps[1].As) assert.Equal(t, "other-fake-step", steps[1].Uses) - assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + assert.ElementsMatch(t, []kargoapi.PromotionVariable{ {Name: "input1", Value: "value1"}, {Name: "input2", Value: "value2"}, - }, steps[1].Inputs) + }, steps[1].Vars) }, }, { @@ -559,9 +563,9 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { Task: &kargoapi.PromotionTaskReference{ Name: "test-task", }, - Config: makeJSONObj(t, map[string]any{ - "input1": "value1", - }), + Vars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "value1"}, + }, }, objects: []client.Object{ &kargoapi.PromotionTask{ @@ -570,7 +574,7 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { Namespace: "test-project", }, Spec: kargoapi.PromotionTaskSpec{ - Inputs: []kargoapi.PromotionTaskInput{ + Vars: []kargoapi.PromotionVariable{ {Name: "input1"}, }, Steps: []kargoapi.PromotionStep{ @@ -601,9 +605,9 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { Kind: "ClusterPromotionTask", Name: "test-cluster-task", }, - Config: makeJSONObj(t, map[string]any{ - "input1": "value1", - }), + Vars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "value1"}, + }, }, objects: []client.Object{ &kargoapi.ClusterPromotionTask{ @@ -611,7 +615,7 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { Name: "test-cluster-task", }, Spec: kargoapi.PromotionTaskSpec{ - Inputs: []kargoapi.PromotionTaskInput{ + Vars: []kargoapi.PromotionVariable{ {Name: "input1"}, }, Steps: []kargoapi.PromotionStep{ @@ -639,7 +643,7 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { Build() b := NewPromotionBuilder(c) - steps, err := b.inflateTaskSteps(context.Background(), tt.project, tt.taskAlias, tt.taskStep) + steps, err := b.inflateTaskSteps(context.Background(), tt.project, tt.taskAlias, tt.promoVars, tt.taskStep) tt.assertions(t, steps, err) }) } @@ -738,8 +742,8 @@ func TestPromotionBuilder_getTaskSpec(t *testing.T) { Namespace: "test-project", }, Spec: kargoapi.PromotionTaskSpec{ - Inputs: []kargoapi.PromotionTaskInput{ - {Name: "input1", Default: "value1"}, + Vars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "value1"}, }, }, }, @@ -748,9 +752,9 @@ func TestPromotionBuilder_getTaskSpec(t *testing.T) { require.NoError(t, err) require.NotNil(t, result) - assert.Len(t, result.Inputs, 1) - assert.Equal(t, "input1", result.Inputs[0].Name) - assert.Equal(t, "value1", result.Inputs[0].Default) + assert.Len(t, result.Vars, 1) + assert.Equal(t, "input1", result.Vars[0].Name) + assert.Equal(t, "value1", result.Vars[0].Value) }, }, { @@ -766,8 +770,8 @@ func TestPromotionBuilder_getTaskSpec(t *testing.T) { Name: "test-cluster-task", }, Spec: kargoapi.PromotionTaskSpec{ - Inputs: []kargoapi.PromotionTaskInput{ - {Name: "input1", Default: "value1"}, + Vars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "value1"}, }, }, }, @@ -776,9 +780,9 @@ func TestPromotionBuilder_getTaskSpec(t *testing.T) { require.NoError(t, err) require.NotNil(t, result) - assert.Len(t, result.Inputs, 1) - assert.Equal(t, "input1", result.Inputs[0].Name) - assert.Equal(t, "value1", result.Inputs[0].Default) + assert.Len(t, result.Vars, 1) + assert.Equal(t, "input1", result.Vars[0].Name) + assert.Equal(t, "value1", result.Vars[0].Value) }, }, { @@ -795,8 +799,8 @@ func TestPromotionBuilder_getTaskSpec(t *testing.T) { Namespace: "test-project", }, Spec: kargoapi.PromotionTaskSpec{ - Inputs: []kargoapi.PromotionTaskInput{ - {Name: "input1", Default: "value1"}, + Vars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "value1"}, }, }, }, @@ -805,9 +809,9 @@ func TestPromotionBuilder_getTaskSpec(t *testing.T) { require.NoError(t, err) require.NotNil(t, result) - assert.Len(t, result.Inputs, 1) - assert.Equal(t, "input1", result.Inputs[0].Name) - assert.Equal(t, "value1", result.Inputs[0].Default) + assert.Len(t, result.Vars, 1) + assert.Equal(t, "input1", result.Vars[0].Name) + assert.Equal(t, "value1", result.Vars[0].Value) }, }, } @@ -969,110 +973,102 @@ func Test_generatePromotionTaskStepName(t *testing.T) { } } -func Test_promotionTaskInputsToStepInputs(t *testing.T) { +func Test_promotionTaskVarsToStepVars(t *testing.T) { tests := []struct { name string - taskInputs []kargoapi.PromotionTaskInput - config map[string]any - assertions func(t *testing.T, result []kargoapi.PromotionStepInput, err error) + taskVars []kargoapi.PromotionVariable + promoVars []kargoapi.PromotionVariable + stepVars []kargoapi.PromotionVariable + assertions func(t *testing.T, result []kargoapi.PromotionVariable, err error) }{ { - name: "nil inputs returns nil map and no error", - taskInputs: nil, - config: nil, - assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { + name: "nil inputs returns nil map and no error", + taskVars: nil, + stepVars: nil, + assertions: func(t *testing.T, result []kargoapi.PromotionVariable, err error) { require.NoError(t, err) assert.Nil(t, result) }, }, { - name: "empty inputs returns nil map and no error", - taskInputs: []kargoapi.PromotionTaskInput{}, - config: nil, - assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { + name: "empty inputs returns nil map and no error", + taskVars: []kargoapi.PromotionVariable{}, + stepVars: nil, + assertions: func(t *testing.T, result []kargoapi.PromotionVariable, err error) { require.NoError(t, err) assert.Nil(t, result) }, }, { - name: "missing config when inputs required returns error", - taskInputs: []kargoapi.PromotionTaskInput{ - {Name: "input1"}, - }, - config: nil, - assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { - assert.ErrorContains(t, err, "missing step config") - assert.Nil(t, result) - }, - }, - { - name: "non-string input value returns error", - taskInputs: []kargoapi.PromotionTaskInput{ + name: "missing required variable returns error", + taskVars: []kargoapi.PromotionVariable{ {Name: "input1"}, }, - config: map[string]any{ - "input1": 123, // number instead of string + stepVars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: ""}, }, - assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { - assert.ErrorContains(t, err, "input \"input1\" must be a string") - assert.Nil(t, result) - }, - }, - { - name: "missing required input returns error", - taskInputs: []kargoapi.PromotionTaskInput{ - {Name: "input1"}, - }, - config: map[string]any{ - "input1": "", // empty string is not allowed without default - }, - assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { - assert.ErrorContains(t, err, "missing required input \"input1\"") + assertions: func(t *testing.T, result []kargoapi.PromotionVariable, err error) { + assert.ErrorContains(t, err, "missing value for variable \"input1\"") assert.Nil(t, result) }, }, { name: "default value used when config value not provided", - taskInputs: []kargoapi.PromotionTaskInput{ - {Name: "input1", Default: "default1"}, + taskVars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "default1"}, }, - config: map[string]any{}, - assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { + stepVars: nil, + assertions: func(t *testing.T, result []kargoapi.PromotionVariable, err error) { require.NoError(t, err) - assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + assert.ElementsMatch(t, []kargoapi.PromotionVariable{ {Name: "input1", Value: "default1"}, }, result) }, }, { - name: "config value overrides default value", - taskInputs: []kargoapi.PromotionTaskInput{ - {Name: "input1", Default: "default1"}, + name: "step value overrides default value", + taskVars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "default1"}, }, - config: map[string]any{ - "input1": "override1", + stepVars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "override1"}, }, - assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { + assertions: func(t *testing.T, result []kargoapi.PromotionVariable, err error) { require.NoError(t, err) - assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + assert.ElementsMatch(t, []kargoapi.PromotionVariable{ {Name: "input1", Value: "override1"}, }, result) }, }, + { + name: "promotion variable overrides default value", + taskVars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "default1"}, + }, + promoVars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "override1"}, + }, + stepVars: nil, + assertions: func(t *testing.T, result []kargoapi.PromotionVariable, err error) { + require.NoError(t, err) + // Variable is set by engine at runtime + assert.Empty(t, result) + }, + }, { name: "multiple inputs processed correctly", - taskInputs: []kargoapi.PromotionTaskInput{ - {Name: "input1", Default: "default1"}, - {Name: "input2", Default: "default2"}, + taskVars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "default1"}, + {Name: "input2", Value: "default2"}, {Name: "input3"}, }, - config: map[string]any{ - "input1": "override1", - "input3": "value3", + stepVars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "override1"}, + {Name: "input3", Value: "value3"}, }, - assertions: func(t *testing.T, result []kargoapi.PromotionStepInput, err error) { + assertions: func(t *testing.T, result []kargoapi.PromotionVariable, err error) { require.NoError(t, err) - assert.ElementsMatch(t, []kargoapi.PromotionStepInput{ + assert.ElementsMatch(t, []kargoapi.PromotionVariable{ {Name: "input1", Value: "override1"}, {Name: "input2", Value: "default2"}, {Name: "input3", Value: "value3"}, @@ -1083,23 +1079,8 @@ func Test_promotionTaskInputsToStepInputs(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - var configJSON *apiextensionsv1.JSON - if tt.config != nil { - configBytes, err := yaml.Marshal(tt.config) - require.NoError(t, err) - configJSON = &apiextensionsv1.JSON{Raw: configBytes} - } - - result, err := promotionTaskInputsToStepInputs(tt.taskInputs, configJSON) + result, err := promotionTaskVarsToStepVars(tt.taskVars, tt.promoVars, tt.stepVars) tt.assertions(t, result, err) }) } } - -// makeJSONObj is a helper function to create an API extension JSON object from -// a map. -func makeJSONObj(t *testing.T, m map[string]any) *apiextensionsv1.JSON { - data, err := yaml.Marshal(m) - require.NoError(t, err) - return &apiextensionsv1.JSON{Raw: data} -} From d502374fa911af61099c3a444a8e3ebb960f95a3 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Mon, 16 Dec 2024 22:41:41 +0100 Subject: [PATCH 21/38] feat(directives): filter output for "namespaced" keys Signed-off-by: Hidde Beydals --- internal/directives/promotions.go | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/internal/directives/promotions.go b/internal/directives/promotions.go index 255016047..362ac84cd 100644 --- a/internal/directives/promotions.go +++ b/internal/directives/promotions.go @@ -3,6 +3,7 @@ package directives import ( "context" "fmt" + "strings" "time" "github.com/expr-lang/expr" @@ -147,6 +148,20 @@ func (s *PromotionStep) GetConfig( return nil, err } + // If the alias has a namespace, filter the state to only include keys that + // belong to that namespace. + outputs := state + if namespace := getAliasNamespace(s.Alias); namespace != "" { + outputs = make(State) + for k, v := range state.DeepCopy() { + if getAliasNamespace(k) == namespace { + // Strip the namespace from the key before adding it to the + // filtered outputs. + outputs[k[len(namespace)+2:]] = v + } + } + } + evaledCfgJSON, err := expressions.EvaluateJSONTemplate( s.Config, map[string]any{ @@ -157,7 +172,7 @@ func (s *PromotionStep) GetConfig( }, "vars": vars, "secrets": promoCtx.Secrets, - "outputs": state, + "outputs": outputs, }, expr.Function("warehouse", warehouseFunc, new(func(string) kargoapi.FreightOrigin)), expr.Function( @@ -427,3 +442,14 @@ func getChartFunc( ) } } + +// getAliasNamespace returns the namespace part of an alias, if it exists. +// The namespace part is the part before the first "::" separator. Typically, +// this is used for steps inflated from a task. +func getAliasNamespace(alias string) string { + parts := strings.Split(alias, "::") + if len(parts) != 2 { + return "" + } + return parts[0] +} From 82daebe67a0ff7ba3c1d5db01674adc42ef902d9 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Mon, 16 Dec 2024 23:11:40 +0100 Subject: [PATCH 22/38] fix(ui): type issue, vars cannot be optional Co-authored-by: Mayursinh Sarvaiya Signed-off-by: Hidde Beydals --- ui/src/features/stage/create-stage.tsx | 6 ++++-- .../use-promotion-wizard-steps-state.ts | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ui/src/features/stage/create-stage.tsx b/ui/src/features/stage/create-stage.tsx index 8f80bbbb6..c15134cf0 100644 --- a/ui/src/features/stage/create-stage.tsx +++ b/ui/src/features/stage/create-stage.tsx @@ -126,7 +126,8 @@ export const CreateStage = ({ promotionWizardStepsState.state?.map((step) => ({ uses: step?.identifier, as: step?.as || '', - config: step?.state as JSON // step.state is type 'object' and it is safe to fake JSON type because it doesn't matter for stageFormToYAML function + config: step?.state as JSON, // step.state is type 'object' and it is safe to fake JSON type because it doesn't matter for stageFormToYAML function + vars: [] })) ); setValue('value', unmarshalled); @@ -177,7 +178,8 @@ export const CreateStage = ({ promotionWizardStepsState.state?.map((step) => ({ uses: step?.identifier, as: step?.as || '', - config: step?.state as JSON // step.state is type 'object' and it is safe to fake JSON type because it doesn't matter for stageFormToYAML function + config: step?.state as JSON, // step.state is type 'object' and it is safe to fake JSON type because it doesn't matter for stageFormToYAML function + vars: [] })) ) ); diff --git a/ui/src/features/stage/promotion-steps-wizard/use-promotion-wizard-steps-state.ts b/ui/src/features/stage/promotion-steps-wizard/use-promotion-wizard-steps-state.ts index 24bdf859d..f35b1214f 100644 --- a/ui/src/features/stage/promotion-steps-wizard/use-promotion-wizard-steps-state.ts +++ b/ui/src/features/stage/promotion-steps-wizard/use-promotion-wizard-steps-state.ts @@ -78,7 +78,8 @@ const stateToYAML = (state: RunnerWithConfiguration[]): string => { uses: step.identifier, // @ts-expect-error this will be object but its hard to convey in types after migration of connectrpc to v2 config: step.state, - as: step.as || '' + as: step.as || '', + vars: [] }); } From b46b1fd25e13fad13a9e91bb9d880bf1bdc8e266 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Tue, 17 Dec 2024 00:15:54 +0100 Subject: [PATCH 23/38] WIP: magically write output of "namespaced" steps to namespace Signed-off-by: Hidde Beydals --- internal/directives/simple_engine_promote.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/internal/directives/simple_engine_promote.go b/internal/directives/simple_engine_promote.go index 0cf8fe2a4..26d3db30a 100644 --- a/internal/directives/simple_engine_promote.go +++ b/internal/directives/simple_engine_promote.go @@ -114,7 +114,21 @@ func (e *SimpleEngine) executeSteps( result, err := e.executeStep(ctx, promoCtx, step, reg, workDir, state) stepExecMeta.Status = result.Status stepExecMeta.Message = result.Message - state[step.Alias] = result.Output + + // TODO(hidde): until we have a better way to handle the output of steps + // inflated from tasks, we need to apply a special treatment to the output + // to allow it to become available under the alias of the "task". + aliasNamespace := getAliasNamespace(step.Alias) + if aliasNamespace != "" && reg.Runner.Name() == (&outputComposer{}).Name() { + if state[aliasNamespace] == nil { + state[aliasNamespace] = make(State) + } + for k, v := range result.Output { + state[aliasNamespace].(State)[k] = v // nolint: forcetypeassert + } + } else { + state[step.Alias] = result.Output + } switch result.Status { case kargoapi.PromotionPhaseErrored, kargoapi.PromotionPhaseFailed, From 5c1422db4bde4c689fb8b37851d5a308b8f6cabf Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Tue, 17 Dec 2024 13:58:22 +0100 Subject: [PATCH 24/38] feat(chart): add base permissions `(Cluster)PromotionTask` Signed-off-by: Hidde Beydals --- charts/kargo/templates/controller/cluster-roles.yaml | 2 ++ charts/kargo/templates/users/cluster-roles.yaml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/charts/kargo/templates/controller/cluster-roles.yaml b/charts/kargo/templates/controller/cluster-roles.yaml index f482a18cf..209e187a3 100644 --- a/charts/kargo/templates/controller/cluster-roles.yaml +++ b/charts/kargo/templates/controller/cluster-roles.yaml @@ -55,6 +55,8 @@ rules: - apiGroups: - kargo.akuity.io resources: + - clusterpromotiontasks + - promotiontasks - warehouses verbs: - get diff --git a/charts/kargo/templates/users/cluster-roles.yaml b/charts/kargo/templates/users/cluster-roles.yaml index 545ab1ad9..1f6b35cbc 100644 --- a/charts/kargo/templates/users/cluster-roles.yaml +++ b/charts/kargo/templates/users/cluster-roles.yaml @@ -105,9 +105,11 @@ rules: - apiGroups: - kargo.akuity.io resources: + - clusterpromotiontasks - freights - projects - promotions + - promotiontasks - stages - warehouses verbs: From 9ee906a87608a2dc362ab179374a8c2aed0d680b Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Tue, 17 Dec 2024 14:01:59 +0100 Subject: [PATCH 25/38] fix(api): use correct struct for list Signed-off-by: Hidde Beydals --- api/v1alpha1/cluster_promotion_task_types.go | 2 +- api/v1alpha1/generated.pb.go | 524 +++++++++---------- api/v1alpha1/generated.proto | 4 +- api/v1alpha1/promotion_task_types.go | 2 +- api/v1alpha1/zz_generated.deepcopy.go | 4 +- ui/src/gen/v1alpha1/generated_pb.ts | 10 +- 6 files changed, 273 insertions(+), 273 deletions(-) diff --git a/api/v1alpha1/cluster_promotion_task_types.go b/api/v1alpha1/cluster_promotion_task_types.go index 888701671..6f5383452 100644 --- a/api/v1alpha1/cluster_promotion_task_types.go +++ b/api/v1alpha1/cluster_promotion_task_types.go @@ -23,5 +23,5 @@ type ClusterPromotionTask struct { type ClusterPromotionTaskList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - Items []ClusterPromotionTaskList `json:"items" protobuf:"bytes,2,rep,name=items"` + Items []ClusterPromotionTask `json:"items" protobuf:"bytes,2,rep,name=items"` } diff --git a/api/v1alpha1/generated.pb.go b/api/v1alpha1/generated.pb.go index 74f81ea62..34c275d88 100644 --- a/api/v1alpha1/generated.pb.go +++ b/api/v1alpha1/generated.pb.go @@ -1929,262 +1929,262 @@ func init() { } var fileDescriptor_e26b7f7bbc391025 = []byte{ - // 4078 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0xcd, 0x6f, 0x23, 0x47, - 0x76, 0x9f, 0x26, 0x45, 0x4a, 0x7c, 0x94, 0x46, 0x52, 0x8d, 0xc6, 0xd6, 0x6a, 0x63, 0x69, 0xd2, - 0x36, 0x0c, 0x3b, 0xb6, 0xa9, 0x8c, 0xfc, 0x35, 0x1e, 0x6f, 0x26, 0x10, 0xa9, 0xf9, 0xd0, 0xac, - 0xd6, 0xa3, 0x14, 0xe5, 0xf1, 0x7a, 0x3c, 0x86, 0xd3, 0x22, 0x4b, 0x64, 0xaf, 0xc8, 0x6e, 0xba, - 0xaa, 0xa8, 0xb5, 0x92, 0x20, 0xd9, 0x7c, 0x01, 0x8b, 0x04, 0x09, 0xf6, 0x60, 0xc0, 0x1b, 0x20, - 0x01, 0x82, 0xe4, 0xb8, 0x48, 0xfe, 0x81, 0x1c, 0x7c, 0xd8, 0x8b, 0x11, 0x18, 0x89, 0x91, 0x04, - 0x88, 0x0f, 0x1b, 0x25, 0xd6, 0x02, 0x39, 0xe6, 0x96, 0xcb, 0x00, 0x01, 0x82, 0xfa, 0xe8, 0xee, - 0xea, 0x66, 0x73, 0xc4, 0xe6, 0x48, 0x03, 0x27, 0x37, 0xaa, 0x5e, 0xd5, 0xef, 0x55, 0xbd, 0xaa, - 0xf7, 0xea, 0xbd, 0x57, 0xaf, 0x05, 0xaf, 0xb4, 0x5c, 0xde, 0xee, 0xef, 0x56, 0x1a, 0x7e, 0x77, - 0xd5, 0xd9, 0xef, 0xbb, 0xfc, 0x70, 0x75, 0xdf, 0xa1, 0x2d, 0x7f, 0xd5, 0xe9, 0xb9, 0xab, 0x07, - 0x97, 0x9d, 0x4e, 0xaf, 0xed, 0x5c, 0x5e, 0x6d, 0x11, 0x8f, 0x50, 0x87, 0x93, 0x66, 0xa5, 0x47, - 0x7d, 0xee, 0xa3, 0x67, 0xa2, 0x51, 0x15, 0x35, 0xaa, 0x22, 0x47, 0x55, 0x9c, 0x9e, 0x5b, 0x09, - 0x46, 0x2d, 0xbd, 0x64, 0x60, 0xb7, 0xfc, 0x96, 0xbf, 0x2a, 0x07, 0xef, 0xf6, 0xf7, 0xe4, 0x5f, - 0xf2, 0x0f, 0xf9, 0x4b, 0x81, 0x2e, 0xdd, 0xda, 0xbf, 0xc2, 0x2a, 0xae, 0xe4, 0x4c, 0x3e, 0xe2, - 0xc4, 0x63, 0xae, 0xef, 0xb1, 0x97, 0x9c, 0x9e, 0xcb, 0x08, 0x3d, 0x20, 0x74, 0xb5, 0xb7, 0xdf, - 0x12, 0x34, 0x16, 0xef, 0xb0, 0x7a, 0x30, 0x30, 0xbd, 0xa5, 0x57, 0x22, 0xa4, 0xae, 0xd3, 0x68, - 0xbb, 0x1e, 0xa1, 0x87, 0xd1, 0xf0, 0x2e, 0xe1, 0x4e, 0xda, 0xa8, 0xd5, 0x61, 0xa3, 0x68, 0xdf, - 0xe3, 0x6e, 0x97, 0x0c, 0x0c, 0x78, 0xed, 0xa4, 0x01, 0xac, 0xd1, 0x26, 0x5d, 0x27, 0x39, 0xce, - 0xbe, 0x0f, 0x17, 0xd6, 0x3d, 0xa7, 0x73, 0xc8, 0x5c, 0x86, 0xfb, 0xde, 0x3a, 0x6d, 0xf5, 0xbb, - 0xc4, 0xe3, 0xe8, 0x12, 0x4c, 0x78, 0x4e, 0x97, 0x2c, 0x5a, 0x97, 0xac, 0xe7, 0x4a, 0xd5, 0xe9, - 0xcf, 0x8e, 0x56, 0xce, 0x1d, 0x1f, 0xad, 0x4c, 0xbc, 0xe5, 0x74, 0x09, 0x96, 0x14, 0xf4, 0x34, - 0x14, 0x0e, 0x9c, 0x4e, 0x9f, 0x2c, 0xe6, 0x64, 0x97, 0x19, 0xdd, 0xa5, 0x70, 0x57, 0x34, 0x62, - 0x45, 0xb3, 0x7f, 0x3f, 0x1f, 0x83, 0xff, 0x0e, 0xe1, 0x4e, 0xd3, 0xe1, 0x0e, 0xea, 0x42, 0xb1, - 0xe3, 0xec, 0x92, 0x0e, 0x5b, 0xb4, 0x2e, 0xe5, 0x9f, 0x2b, 0xaf, 0x5d, 0xaf, 0x8c, 0xb2, 0x89, - 0x95, 0x14, 0xa8, 0xca, 0x96, 0xc4, 0xb9, 0xee, 0x71, 0x7a, 0x58, 0x3d, 0xaf, 0x27, 0x51, 0x54, - 0x8d, 0x58, 0x33, 0x41, 0xbf, 0x6b, 0x41, 0xd9, 0xf1, 0x3c, 0x9f, 0x3b, 0x5c, 0x6c, 0xd3, 0x62, - 0x4e, 0x32, 0xbd, 0x3d, 0x3e, 0xd3, 0xf5, 0x08, 0x4c, 0x71, 0xbe, 0xa0, 0x39, 0x97, 0x0d, 0x0a, - 0x36, 0x79, 0x2e, 0xbd, 0x01, 0x65, 0x63, 0xaa, 0x68, 0x0e, 0xf2, 0xfb, 0xe4, 0x50, 0xc9, 0x17, - 0x8b, 0x9f, 0x68, 0x21, 0x26, 0x50, 0x2d, 0xc1, 0xab, 0xb9, 0x2b, 0xd6, 0xd2, 0x35, 0x98, 0x4b, - 0x32, 0xcc, 0x32, 0xde, 0xfe, 0x53, 0x0b, 0x16, 0x8c, 0x55, 0x60, 0xb2, 0x47, 0x28, 0xf1, 0x1a, - 0x04, 0xad, 0x42, 0x49, 0xec, 0x25, 0xeb, 0x39, 0x8d, 0x60, 0xab, 0xe7, 0xf5, 0x42, 0x4a, 0x6f, - 0x05, 0x04, 0x1c, 0xf5, 0x09, 0x8f, 0x45, 0xee, 0x61, 0xc7, 0xa2, 0xd7, 0x76, 0x18, 0x59, 0xcc, - 0xc7, 0x8f, 0xc5, 0xb6, 0x68, 0xc4, 0x8a, 0x66, 0xff, 0x0a, 0x7c, 0x23, 0x98, 0xcf, 0x0e, 0xe9, - 0xf6, 0x3a, 0x0e, 0x27, 0xd1, 0xa4, 0x4e, 0x3c, 0x7a, 0xf6, 0x3e, 0xcc, 0xac, 0xf7, 0x7a, 0xd4, - 0x3f, 0x20, 0xcd, 0x3a, 0x77, 0x5a, 0x04, 0xdd, 0x03, 0x70, 0x74, 0xc3, 0x3a, 0x97, 0x03, 0xcb, - 0x6b, 0xbf, 0x54, 0x51, 0x1a, 0x51, 0x31, 0x35, 0xa2, 0xd2, 0xdb, 0x6f, 0x89, 0x06, 0x56, 0x11, - 0x8a, 0x57, 0x39, 0xb8, 0x5c, 0xd9, 0x71, 0xbb, 0xa4, 0x7a, 0xfe, 0xf8, 0x68, 0x05, 0xd6, 0x43, - 0x04, 0x6c, 0xa0, 0xd9, 0xbf, 0x67, 0xc1, 0xc5, 0x75, 0xda, 0xf2, 0x6b, 0x1b, 0xeb, 0xbd, 0xde, - 0x2d, 0xe2, 0x74, 0x78, 0xbb, 0xce, 0x1d, 0xde, 0x67, 0xe8, 0x1a, 0x14, 0x99, 0xfc, 0xa5, 0xa7, - 0xfa, 0x6c, 0x70, 0xfa, 0x14, 0xfd, 0xc1, 0xd1, 0xca, 0x42, 0xca, 0x40, 0x82, 0xf5, 0x28, 0xf4, - 0x3c, 0x4c, 0x76, 0x09, 0x63, 0x4e, 0x2b, 0x90, 0xe7, 0xac, 0x06, 0x98, 0xfc, 0x8e, 0x6a, 0xc6, - 0x01, 0xdd, 0xfe, 0xfb, 0x1c, 0xcc, 0x86, 0x58, 0x9a, 0xfd, 0x19, 0x6c, 0x5e, 0x1f, 0xa6, 0xdb, - 0xc6, 0x0a, 0xe5, 0x1e, 0x96, 0xd7, 0xde, 0x1c, 0x51, 0x4f, 0xd2, 0x84, 0x54, 0x5d, 0xd0, 0x6c, - 0xa6, 0xcd, 0x56, 0x1c, 0x63, 0x83, 0xba, 0x00, 0xec, 0xd0, 0x6b, 0x68, 0xa6, 0x13, 0x92, 0xe9, - 0x1b, 0x19, 0x99, 0xd6, 0x43, 0x80, 0x2a, 0xd2, 0x2c, 0x21, 0x6a, 0xc3, 0x06, 0x03, 0xfb, 0x6f, - 0x2d, 0xb8, 0x90, 0x32, 0x0e, 0x7d, 0x2b, 0xb1, 0x9f, 0xcf, 0x0c, 0xec, 0x27, 0x1a, 0x18, 0x16, - 0xed, 0xe6, 0x8b, 0x30, 0x45, 0xc9, 0x81, 0x2b, 0xee, 0x01, 0x2d, 0xe1, 0x39, 0x3d, 0x7e, 0x0a, - 0xeb, 0x76, 0x1c, 0xf6, 0x40, 0x2f, 0x40, 0x29, 0xf8, 0x2d, 0xc4, 0x9c, 0x17, 0xaa, 0x22, 0x36, - 0x2e, 0xe8, 0xca, 0x70, 0x44, 0xb7, 0x7f, 0x07, 0x0a, 0xb5, 0xb6, 0x43, 0xb9, 0x38, 0x31, 0x94, - 0xf4, 0xfc, 0xb7, 0xf1, 0x96, 0x9e, 0x62, 0x78, 0x62, 0xb0, 0x6a, 0xc6, 0x01, 0x7d, 0x84, 0xcd, - 0x7e, 0x1e, 0x26, 0x0f, 0x08, 0x95, 0xf3, 0xcd, 0xc7, 0xc1, 0xee, 0xaa, 0x66, 0x1c, 0xd0, 0xed, - 0x7f, 0xb6, 0x60, 0x41, 0xce, 0x60, 0xc3, 0x65, 0x0d, 0xff, 0x80, 0xd0, 0x43, 0x4c, 0x58, 0xbf, - 0x73, 0xca, 0x13, 0xda, 0x80, 0x39, 0x46, 0xba, 0x07, 0x84, 0xd6, 0x7c, 0x8f, 0x71, 0xea, 0xb8, - 0x1e, 0xd7, 0x33, 0x5b, 0xd4, 0xbd, 0xe7, 0xea, 0x09, 0x3a, 0x1e, 0x18, 0x81, 0x9e, 0x83, 0x29, - 0x3d, 0x6d, 0x71, 0x94, 0x84, 0x60, 0xa7, 0xc5, 0x1e, 0xe8, 0x35, 0x31, 0x1c, 0x52, 0xed, 0xff, - 0xb4, 0x60, 0x5e, 0xae, 0xaa, 0xde, 0xdf, 0x65, 0x0d, 0xea, 0xf6, 0x84, 0x79, 0xfd, 0x3a, 0x2e, - 0xe9, 0x1a, 0x9c, 0x6f, 0x06, 0x82, 0xdf, 0x72, 0xbb, 0x2e, 0x97, 0x3a, 0x52, 0xa8, 0x3e, 0xa1, - 0x31, 0xce, 0x6f, 0xc4, 0xa8, 0x38, 0xd1, 0x5b, 0x6d, 0x5f, 0xa7, 0xcf, 0x38, 0xa1, 0xdb, 0xd4, - 0xef, 0xfa, 0x62, 0x9d, 0x3b, 0x0e, 0xdb, 0x47, 0xbf, 0x0e, 0x53, 0x5d, 0x7d, 0xa5, 0x69, 0xab, - 0xf9, 0xcb, 0xa3, 0x59, 0xcd, 0x3b, 0xbb, 0xdf, 0x23, 0x0d, 0x2e, 0xae, 0xc3, 0x48, 0xdb, 0xa2, - 0x36, 0x1c, 0xa2, 0xa2, 0x77, 0x61, 0x82, 0xf5, 0x48, 0x43, 0x8a, 0xa8, 0xbc, 0xf6, 0xfa, 0x68, - 0x4a, 0x1d, 0x9b, 0x64, 0xbd, 0x47, 0x1a, 0x91, 0x6c, 0xc5, 0x5f, 0x58, 0x42, 0xda, 0xff, 0x66, - 0xc1, 0x62, 0xda, 0xaa, 0xb6, 0x5c, 0xc6, 0xd1, 0xfd, 0x81, 0x95, 0x55, 0x46, 0x5b, 0x99, 0x18, - 0x2d, 0xd7, 0x15, 0x6a, 0x6f, 0xd0, 0x62, 0xac, 0xaa, 0x01, 0x05, 0x97, 0x93, 0x6e, 0xe0, 0x48, - 0x5c, 0x1b, 0x6d, 0x59, 0xc3, 0x26, 0x1b, 0x5d, 0x92, 0x9b, 0x02, 0x14, 0x2b, 0x6c, 0xfb, 0x3d, - 0x98, 0xae, 0xf5, 0x29, 0x25, 0x1e, 0x57, 0x97, 0xdc, 0xb7, 0xa1, 0xc0, 0x5c, 0x4f, 0xdb, 0xfa, - 0x6c, 0xf7, 0x5b, 0x49, 0x80, 0xd7, 0xc5, 0x60, 0xac, 0x30, 0xec, 0x3f, 0xcf, 0xc3, 0x85, 0xe0, - 0xd4, 0x90, 0xe6, 0x3a, 0xe5, 0xee, 0x9e, 0xd3, 0xe0, 0x0c, 0x35, 0x61, 0xba, 0x19, 0x35, 0x73, - 0x6d, 0x8c, 0xb3, 0xf0, 0x0a, 0x0d, 0xbe, 0x01, 0xcf, 0x71, 0x0c, 0x15, 0xbd, 0x03, 0xf9, 0x96, - 0xcb, 0xb5, 0xef, 0x77, 0x65, 0x34, 0xe9, 0xdd, 0x74, 0x93, 0xd6, 0xa7, 0x5a, 0xd6, 0xac, 0xf2, - 0x37, 0x5d, 0x8e, 0x05, 0x22, 0xda, 0x85, 0xa2, 0xdb, 0x75, 0x5a, 0x24, 0xd8, 0x99, 0xab, 0xa3, - 0x61, 0x6f, 0x8a, 0x31, 0x49, 0xf4, 0xd0, 0x99, 0x94, 0x54, 0x86, 0x35, 0xb2, 0xe0, 0xd1, 0x10, - 0x56, 0x43, 0xd9, 0xed, 0x91, 0x79, 0xa4, 0xd9, 0xcf, 0x88, 0x87, 0xa4, 0x32, 0xac, 0x91, 0xed, - 0x2f, 0x73, 0x30, 0x17, 0xc9, 0xaf, 0xe6, 0x77, 0xbb, 0x2e, 0x47, 0x4b, 0x90, 0x73, 0x9b, 0xda, - 0x28, 0x81, 0x1e, 0x98, 0xdb, 0xdc, 0xc0, 0x39, 0xb7, 0x89, 0x9e, 0x85, 0xe2, 0x2e, 0x75, 0xbc, - 0x46, 0x5b, 0x1b, 0xa3, 0x10, 0xb8, 0x2a, 0x5b, 0xb1, 0xa6, 0xa2, 0xa7, 0x20, 0xcf, 0x9d, 0x96, - 0xb6, 0x41, 0xa1, 0xfc, 0x76, 0x9c, 0x16, 0x16, 0xed, 0xc2, 0xf8, 0xb1, 0xbe, 0xd4, 0x63, 0xb9, - 0xf3, 0x86, 0xf1, 0xab, 0xab, 0x66, 0x1c, 0xd0, 0x05, 0x47, 0xa7, 0xcf, 0xdb, 0x3e, 0x5d, 0x2c, - 0xc4, 0x39, 0xae, 0xcb, 0x56, 0xac, 0xa9, 0xc2, 0x4d, 0x69, 0xc8, 0xf9, 0x73, 0x42, 0x17, 0x8b, - 0x71, 0x37, 0xa5, 0x16, 0x10, 0x70, 0xd4, 0x07, 0xbd, 0x0f, 0xe5, 0x06, 0x25, 0x0e, 0xf7, 0xe9, - 0x86, 0xc3, 0xc9, 0xe2, 0x64, 0xe6, 0x13, 0x38, 0x2b, 0xfc, 0xf0, 0x5a, 0x04, 0x81, 0x4d, 0x3c, - 0xfb, 0xbf, 0x2c, 0x58, 0x8c, 0x44, 0x2b, 0xf7, 0x36, 0xf2, 0x3d, 0xb5, 0x78, 0xac, 0x21, 0xe2, - 0x79, 0x16, 0x8a, 0x4d, 0xb7, 0x45, 0x18, 0x4f, 0x4a, 0x79, 0x43, 0xb6, 0x62, 0x4d, 0x45, 0x6b, - 0x00, 0x2d, 0x97, 0xeb, 0xfb, 0x42, 0x0b, 0x3b, 0xb4, 0x93, 0x37, 0x43, 0x0a, 0x36, 0x7a, 0xa1, - 0x77, 0xa0, 0x24, 0xa7, 0x39, 0xa6, 0xda, 0x49, 0xef, 0xa1, 0x16, 0x00, 0xe0, 0x08, 0xcb, 0xfe, - 0x62, 0x02, 0x26, 0x6f, 0x50, 0xe2, 0xb6, 0xda, 0xfc, 0x31, 0x18, 0xfc, 0xa7, 0xa1, 0xe0, 0x74, - 0x5c, 0x87, 0xc9, 0x7d, 0x33, 0xfc, 0xff, 0x75, 0xd1, 0x88, 0x15, 0x0d, 0xbd, 0x07, 0x45, 0x9f, - 0xba, 0x2d, 0xd7, 0x5b, 0x2c, 0xc9, 0x49, 0xbc, 0x3c, 0x9a, 0x0a, 0xe9, 0x55, 0xdc, 0x91, 0x43, - 0x23, 0xe1, 0xab, 0xbf, 0xb1, 0x86, 0x44, 0xf7, 0x60, 0x52, 0x1d, 0xa6, 0x40, 0x41, 0x57, 0x47, - 0x36, 0x30, 0xea, 0x3c, 0x46, 0x87, 0x5e, 0xfd, 0xcd, 0x70, 0x00, 0x88, 0xea, 0xa1, 0x7d, 0x99, - 0x90, 0xd0, 0x2f, 0x64, 0xb0, 0x2f, 0x43, 0x0d, 0x4a, 0x3d, 0x34, 0x28, 0x85, 0x2c, 0xa0, 0xd2, - 0x64, 0x0c, 0xb3, 0x20, 0x42, 0xc4, 0xda, 0x99, 0x2d, 0x8e, 0x21, 0x62, 0xed, 0x49, 0x9f, 0x8f, - 0x7b, 0xc0, 0x81, 0xaf, 0x6b, 0x7f, 0x9c, 0x87, 0x79, 0xdd, 0xb3, 0xe6, 0x77, 0x3a, 0xa4, 0x21, - 0x3d, 0x27, 0x65, 0x9f, 0xf2, 0xa9, 0xf6, 0xc9, 0x0d, 0x6e, 0x4c, 0x65, 0xf3, 0xab, 0x99, 0x66, - 0x13, 0xf1, 0xa8, 0xc8, 0x1b, 0x52, 0x85, 0xdc, 0xe1, 0x2e, 0xe9, 0x5e, 0xfa, 0xde, 0x44, 0x7f, - 0x68, 0xc1, 0x85, 0x03, 0x42, 0xdd, 0x3d, 0xb7, 0x21, 0x03, 0xe6, 0x5b, 0x2e, 0xe3, 0x3e, 0x3d, - 0xd4, 0x37, 0xc2, 0x6b, 0xa3, 0x71, 0xbe, 0x6b, 0x00, 0x6c, 0x7a, 0x7b, 0x7e, 0xf5, 0x9b, 0x9a, - 0xdb, 0x85, 0xbb, 0x83, 0xd0, 0x38, 0x8d, 0xdf, 0x52, 0x0f, 0x20, 0x9a, 0x6d, 0x4a, 0xbc, 0xbe, - 0x65, 0xc6, 0xeb, 0x23, 0x4f, 0x2c, 0x58, 0x6c, 0x60, 0xb2, 0xcc, 0x38, 0xff, 0x53, 0x0b, 0xca, - 0x9a, 0xfe, 0x18, 0x9c, 0x20, 0x1c, 0x77, 0x82, 0x5e, 0xca, 0x34, 0xff, 0x21, 0x3e, 0x0f, 0x85, - 0x99, 0x98, 0x92, 0xa3, 0x57, 0x61, 0x62, 0xdf, 0xf5, 0x82, 0x5b, 0xef, 0x17, 0x03, 0x37, 0xf0, - 0xdb, 0xae, 0xd7, 0x7c, 0x70, 0xb4, 0x32, 0x1f, 0xeb, 0x2c, 0x1a, 0xb1, 0xec, 0x7e, 0xb2, 0x67, - 0x7e, 0x75, 0xea, 0xc7, 0x7f, 0xb9, 0x72, 0xee, 0x07, 0x3f, 0xbb, 0x74, 0xce, 0xfe, 0x24, 0x0f, - 0x73, 0x49, 0xa9, 0x8e, 0x90, 0xff, 0x8a, 0x6c, 0xd8, 0xd4, 0x99, 0xda, 0xb0, 0xdc, 0xd9, 0xd9, - 0xb0, 0xfc, 0x59, 0xd8, 0xb0, 0x89, 0x53, 0xb3, 0x61, 0xf6, 0x3f, 0x58, 0x70, 0x3e, 0xdc, 0x99, - 0x0f, 0xfb, 0xe2, 0x66, 0x8d, 0xa4, 0x6e, 0x9d, 0xbe, 0xd4, 0x3f, 0x80, 0x49, 0xe6, 0xf7, 0x69, - 0x43, 0xba, 0x8f, 0x02, 0xfd, 0x95, 0x6c, 0x46, 0x53, 0x8d, 0x35, 0x7c, 0x26, 0xd5, 0x80, 0x03, - 0x54, 0x73, 0x41, 0x9a, 0xa6, 0x5c, 0x0a, 0x2a, 0x1c, 0x2e, 0xb1, 0xa0, 0x29, 0xd3, 0xa5, 0x10, - 0xad, 0x58, 0x53, 0x91, 0x2d, 0xed, 0x79, 0xe0, 0xd9, 0x96, 0xaa, 0xa0, 0xcd, 0xb2, 0xdc, 0x04, - 0x45, 0x41, 0x3d, 0x98, 0xa3, 0xe4, 0xc3, 0xbe, 0x4b, 0x49, 0xb3, 0xee, 0x3b, 0xfb, 0xc2, 0x2f, - 0xd0, 0x29, 0x9c, 0x11, 0xf5, 0x7e, 0xa3, 0x4f, 0xa5, 0x09, 0xab, 0x2e, 0x88, 0xc8, 0x14, 0x27, - 0xb0, 0xf0, 0x00, 0xba, 0xfd, 0xef, 0x85, 0x50, 0x61, 0x75, 0x12, 0xe5, 0x37, 0xa1, 0xdc, 0x50, - 0x51, 0x4b, 0xe7, 0x70, 0xd3, 0xd3, 0x47, 0x6c, 0x63, 0x8c, 0xcb, 0xa7, 0x52, 0x8b, 0x60, 0x12, - 0x39, 0x56, 0x83, 0x82, 0x4d, 0x6e, 0xe8, 0xfb, 0x00, 0xca, 0x12, 0x93, 0xe6, 0xa6, 0xa7, 0xaf, - 0x9a, 0xda, 0x38, 0xbc, 0xef, 0x86, 0x28, 0x8a, 0x75, 0xe8, 0xf3, 0x44, 0x04, 0x6c, 0xb0, 0x12, - 0xab, 0x0e, 0x52, 0x86, 0x37, 0x7c, 0xaa, 0x75, 0x76, 0xac, 0x55, 0xaf, 0x47, 0x30, 0xc9, 0xcc, - 0x72, 0x44, 0xc1, 0x26, 0xb7, 0x25, 0x0a, 0x73, 0x49, 0x59, 0xa5, 0x5c, 0x37, 0xb7, 0xe2, 0xd7, - 0xcd, 0xda, 0x88, 0x0a, 0x6a, 0x44, 0xa0, 0x66, 0x4a, 0x9a, 0xc2, 0x6c, 0x42, 0x46, 0x29, 0x2c, - 0x37, 0xe3, 0x2c, 0x5f, 0xce, 0x72, 0xf5, 0xea, 0xd4, 0xae, 0xc9, 0x93, 0xc1, 0x5c, 0x52, 0x3a, - 0xa7, 0xc6, 0x34, 0x96, 0x4f, 0x36, 0xef, 0xd4, 0xbf, 0xc8, 0x41, 0x29, 0xb4, 0xaa, 0x59, 0x92, - 0x43, 0xca, 0x1b, 0xca, 0x9d, 0x10, 0xad, 0xe5, 0x47, 0x89, 0xd6, 0x26, 0x86, 0x47, 0x6b, 0x41, - 0x02, 0xb9, 0xf8, 0xf0, 0x04, 0xb2, 0x11, 0xad, 0x4d, 0x8e, 0x1e, 0xad, 0x4d, 0x9d, 0x1c, 0xad, - 0xd9, 0x7f, 0x65, 0x01, 0x1a, 0x0c, 0xcd, 0xb3, 0x08, 0xca, 0x49, 0xde, 0x75, 0x23, 0x7a, 0x42, - 0xc9, 0xf8, 0x78, 0xf8, 0x95, 0x67, 0x7f, 0x5a, 0x80, 0xd9, 0x9b, 0xee, 0xd8, 0x79, 0x3e, 0x0e, - 0x4f, 0x2a, 0xa4, 0x3a, 0xd1, 0x7e, 0x68, 0x9d, 0x53, 0x87, 0x93, 0xd6, 0xa1, 0xde, 0xdf, 0xab, - 0x7a, 0xe8, 0x93, 0xb5, 0xf4, 0x6e, 0x0f, 0x86, 0x93, 0xf0, 0x30, 0xe8, 0x91, 0x0f, 0xc9, 0x9b, - 0x30, 0xc3, 0x38, 0x75, 0x1b, 0x5c, 0x65, 0x12, 0xd9, 0x62, 0x59, 0x5e, 0x24, 0x17, 0x75, 0xf7, - 0x99, 0xba, 0x49, 0xc4, 0xf1, 0xbe, 0xa9, 0x09, 0xca, 0x89, 0xcc, 0x09, 0xca, 0x55, 0x28, 0x39, - 0x9d, 0x8e, 0xff, 0xfd, 0x1d, 0xa7, 0xc5, 0x74, 0x3a, 0x20, 0x3c, 0x35, 0xeb, 0x01, 0x01, 0x47, - 0x7d, 0x50, 0x05, 0xc0, 0x6d, 0x79, 0x3e, 0x25, 0x72, 0x44, 0x51, 0xde, 0x68, 0xf2, 0x11, 0x66, - 0x33, 0x6c, 0xc5, 0x46, 0x0f, 0x54, 0x87, 0x8b, 0xae, 0xc7, 0x48, 0xa3, 0x4f, 0x49, 0x7d, 0xdf, - 0xed, 0xed, 0x6c, 0xd5, 0xa5, 0x95, 0x38, 0x94, 0xa7, 0x79, 0xaa, 0xfa, 0x94, 0x66, 0x76, 0x71, - 0x33, 0xad, 0x13, 0x4e, 0x1f, 0x8b, 0x5e, 0x81, 0x69, 0xd7, 0x6b, 0x74, 0xfa, 0x4d, 0xb2, 0xed, - 0xf0, 0x36, 0x5b, 0x9c, 0x92, 0xd3, 0x98, 0x3b, 0x3e, 0x5a, 0x99, 0xde, 0x34, 0xda, 0x71, 0xac, - 0x97, 0x18, 0x45, 0x3e, 0x32, 0x46, 0x95, 0xa2, 0x51, 0xd7, 0x3f, 0x32, 0x47, 0x99, 0xbd, 0x52, - 0x52, 0xb8, 0x90, 0x29, 0x85, 0xfb, 0x93, 0x1c, 0x14, 0xd5, 0x0b, 0x0a, 0x7a, 0x35, 0xf1, 0x4c, - 0xf1, 0xd4, 0xc0, 0x33, 0x45, 0x39, 0xed, 0xb5, 0xc9, 0x86, 0xa2, 0xcb, 0x58, 0x3f, 0xee, 0x40, - 0x6c, 0xca, 0x16, 0xac, 0x29, 0x32, 0xb5, 0xe5, 0x7b, 0x7b, 0x6e, 0x4b, 0x27, 0x20, 0xae, 0x19, - 0x6e, 0x43, 0xf4, 0xca, 0xfd, 0x41, 0xf8, 0x0c, 0x1e, 0x79, 0x10, 0xb1, 0x0e, 0xc2, 0x95, 0xb8, - 0x5d, 0xbf, 0xf3, 0x96, 0xe2, 0x51, 0x93, 0x88, 0x58, 0x23, 0x0b, 0x1e, 0x7e, 0x9f, 0xf7, 0xfa, - 0x5c, 0x1e, 0x94, 0x53, 0xe2, 0x71, 0x47, 0x22, 0x62, 0x8d, 0x6c, 0x7f, 0x62, 0xc1, 0xac, 0x92, - 0x41, 0xad, 0x4d, 0x1a, 0xfb, 0x75, 0x4e, 0x7a, 0xc2, 0xa3, 0xef, 0x33, 0xc2, 0x92, 0x1e, 0xfd, - 0xdb, 0x8c, 0x30, 0x2c, 0x29, 0xc6, 0xea, 0x73, 0x67, 0xb5, 0x7a, 0xfb, 0x6f, 0x2c, 0x28, 0x48, - 0xd7, 0x39, 0x8b, 0xfd, 0x89, 0xa7, 0x93, 0x72, 0x23, 0xa5, 0x93, 0x4e, 0x48, 0xf4, 0x45, 0x99, - 0xac, 0x89, 0x87, 0x65, 0xb2, 0xec, 0x9f, 0x5b, 0xb0, 0x90, 0x96, 0x1d, 0xcd, 0x32, 0xfd, 0x17, - 0x61, 0xaa, 0xd7, 0x71, 0xf8, 0x9e, 0x4f, 0xbb, 0xc9, 0x97, 0xb1, 0x6d, 0xdd, 0x8e, 0xc3, 0x1e, - 0x88, 0x02, 0xd0, 0x20, 0x0c, 0x0b, 0x42, 0x94, 0x6b, 0x59, 0x6f, 0x84, 0x78, 0x5a, 0x2f, 0x12, - 0x56, 0xd8, 0xc4, 0xb0, 0xc1, 0xc5, 0xfe, 0xe3, 0x02, 0xcc, 0xcb, 0x21, 0xe3, 0xde, 0x10, 0xe3, - 0xec, 0x50, 0x0f, 0x9e, 0x90, 0xc1, 0xd3, 0xe0, 0xa5, 0xa2, 0x36, 0xed, 0x8a, 0x1e, 0xff, 0xc4, - 0x66, 0x6a, 0xaf, 0x07, 0x43, 0x29, 0x78, 0x08, 0xee, 0xe0, 0x4d, 0x01, 0xff, 0xff, 0x6e, 0x0a, - 0xf3, 0xb0, 0x4d, 0x9e, 0x78, 0xd8, 0x86, 0xde, 0x2b, 0x53, 0x8f, 0x70, 0xaf, 0x0c, 0xda, 0xfa, - 0x52, 0x26, 0x5b, 0xff, 0x67, 0x39, 0x98, 0xdc, 0xa6, 0xbe, 0xcc, 0xb2, 0x9f, 0x7d, 0xc2, 0xf6, - 0x4e, 0xec, 0x85, 0xee, 0xf2, 0xc8, 0x2f, 0x74, 0x02, 0x4a, 0xbe, 0xcd, 0x4d, 0xc5, 0xdf, 0xe5, - 0x8c, 0xcc, 0x63, 0x3e, 0x8b, 0x07, 0x1e, 0x40, 0x3e, 0x3c, 0xf3, 0xf8, 0xa9, 0x05, 0x65, 0xdd, - 0xf3, 0x6b, 0x9b, 0xe2, 0xd2, 0xf3, 0x1b, 0x92, 0xe2, 0xfa, 0x93, 0x68, 0x05, 0x42, 0x68, 0xe8, - 0xb7, 0x61, 0xbe, 0x17, 0xbc, 0x08, 0x6e, 0xfb, 0x1d, 0xb7, 0xe1, 0x92, 0x20, 0x4b, 0xfa, 0x6a, - 0xc6, 0xe7, 0x52, 0x39, 0xfc, 0xb0, 0xfa, 0x0d, 0xcd, 0x77, 0x7e, 0x3b, 0x89, 0x8b, 0x07, 0x59, - 0xd9, 0xff, 0x62, 0xc1, 0x4c, 0x4c, 0xf6, 0xa8, 0x01, 0xd0, 0xf0, 0xbd, 0xa6, 0xcb, 0xc3, 0xe2, - 0x84, 0xf2, 0xda, 0xea, 0x68, 0x52, 0xad, 0x05, 0xe3, 0xa2, 0x43, 0x17, 0x36, 0x31, 0x6c, 0xc0, - 0xa2, 0x97, 0x83, 0x3a, 0xa1, 0xb8, 0x13, 0xa3, 0xea, 0x84, 0x1e, 0x1c, 0xad, 0x4c, 0xeb, 0x39, - 0x99, 0x75, 0x43, 0x59, 0x2a, 0x66, 0xfe, 0x3a, 0x07, 0xa5, 0x70, 0xfd, 0x8f, 0x41, 0x8d, 0xde, - 0x8e, 0xa9, 0xd1, 0xcb, 0x19, 0x77, 0x6e, 0xd8, 0x23, 0x37, 0x7a, 0x3f, 0xa1, 0x4c, 0x59, 0x8f, - 0xc4, 0x09, 0xea, 0xf4, 0x53, 0xb5, 0xf9, 0xaa, 0xef, 0x63, 0x50, 0xa8, 0x9d, 0xb8, 0x42, 0xad, - 0x66, 0x5c, 0xcd, 0x10, 0x95, 0xfa, 0xa1, 0x05, 0xb3, 0x09, 0x25, 0x40, 0x4f, 0x43, 0x41, 0x66, - 0xc5, 0xf4, 0xf9, 0x0a, 0x07, 0xea, 0x00, 0x5f, 0xd2, 0xd0, 0x36, 0x2c, 0x38, 0x7d, 0xee, 0x87, - 0x63, 0xaf, 0x7b, 0xce, 0x6e, 0x87, 0xa8, 0xa8, 0x7d, 0xaa, 0xfa, 0x0b, 0x7a, 0xcc, 0xc2, 0x7a, - 0x4a, 0x1f, 0x9c, 0x3a, 0xd2, 0xfe, 0x3c, 0x07, 0x28, 0x6c, 0xcc, 0x92, 0x4e, 0x7e, 0x1f, 0x26, - 0xf7, 0x54, 0x22, 0xe8, 0xd1, 0xde, 0x03, 0xaa, 0x65, 0xf3, 0x49, 0x24, 0xc0, 0x44, 0xef, 0x9e, - 0xce, 0x39, 0x82, 0xc1, 0x33, 0x84, 0xee, 0x01, 0xec, 0xb9, 0x9e, 0xcb, 0xda, 0x63, 0xbe, 0x5c, - 0xca, 0xdb, 0xfc, 0x46, 0x88, 0x80, 0x0d, 0x34, 0xfb, 0xe3, 0x9c, 0x71, 0x3e, 0xa5, 0xb9, 0x1c, - 0x69, 0x5f, 0x9f, 0x8f, 0x0b, 0xb3, 0x34, 0xf8, 0x56, 0x64, 0x08, 0x66, 0xe2, 0xc0, 0xa1, 0x41, - 0xda, 0x3a, 0x6b, 0x81, 0xca, 0x5d, 0x87, 0xba, 0x62, 0xe3, 0xa3, 0x2d, 0xbd, 0xeb, 0x50, 0x86, - 0x25, 0x24, 0xfa, 0xae, 0x98, 0x2a, 0xe9, 0x05, 0x26, 0x34, 0xb3, 0x4d, 0xe0, 0xa4, 0x67, 0xae, - 0x8f, 0xf4, 0x18, 0x56, 0x80, 0xf6, 0xc7, 0x93, 0xc6, 0x81, 0xd7, 0x56, 0xfb, 0x36, 0xa0, 0x8e, - 0xc3, 0xf8, 0x2d, 0xc7, 0x6b, 0x8a, 0xe3, 0x49, 0xf6, 0x28, 0x61, 0x6d, 0xed, 0xa1, 0x2d, 0x69, - 0x14, 0xb4, 0x35, 0xd0, 0x03, 0xa7, 0x8c, 0x42, 0xaf, 0xc6, 0x8d, 0xf3, 0x4a, 0xd2, 0x38, 0x9f, - 0x8f, 0xb4, 0x6d, 0x3c, 0xf3, 0x6c, 0x1e, 0xf7, 0xc2, 0x19, 0x1c, 0xf7, 0xdf, 0x82, 0xf9, 0xbd, - 0xe4, 0xdb, 0xa1, 0xae, 0x24, 0x78, 0x7d, 0xcc, 0xa7, 0xc7, 0xea, 0xc5, 0xe3, 0xe8, 0xc1, 0x29, - 0x6a, 0xc6, 0x83, 0x8c, 0x90, 0x1f, 0x94, 0x51, 0xca, 0xe8, 0x53, 0x25, 0x16, 0x46, 0x56, 0xb9, - 0x44, 0xdc, 0x9a, 0x2c, 0xa0, 0x54, 0x90, 0x38, 0xc6, 0x20, 0xa1, 0x82, 0xc5, 0xd3, 0x54, 0x41, - 0xf4, 0x6a, 0x98, 0xd0, 0x17, 0xd3, 0x91, 0xae, 0x6c, 0x7e, 0x20, 0x15, 0x2f, 0x48, 0xd8, 0xec, - 0x87, 0x7e, 0x64, 0xc1, 0x45, 0x71, 0x58, 0xaf, 0x7f, 0x44, 0x1a, 0x7d, 0x21, 0x95, 0xa0, 0x76, - 0x7a, 0xb1, 0x2c, 0xa5, 0x31, 0x62, 0x51, 0x69, 0x3d, 0x0d, 0x22, 0xf2, 0xcb, 0x53, 0xc9, 0x38, - 0x9d, 0x31, 0xfa, 0x40, 0x9a, 0x0e, 0x4e, 0x64, 0xd8, 0xf3, 0xe8, 0xe1, 0x7d, 0x49, 0x9b, 0x1d, - 0xae, 0xcc, 0x0e, 0x27, 0xf6, 0x4f, 0xf3, 0xa6, 0xb5, 0x1a, 0x2d, 0xe9, 0x70, 0x0f, 0x26, 0xb8, - 0xc3, 0xf6, 0xb5, 0x16, 0x7c, 0x6b, 0x8c, 0x02, 0xb9, 0x48, 0x17, 0xa4, 0x27, 0x2e, 0x9b, 0x24, - 0x26, 0x5a, 0x82, 0x9c, 0xc3, 0x92, 0x29, 0xe8, 0x75, 0x86, 0x73, 0x0e, 0x43, 0xef, 0x42, 0x81, - 0x12, 0x4e, 0x0f, 0xb5, 0xc1, 0xbe, 0x32, 0x86, 0x71, 0xc2, 0x62, 0xbc, 0x12, 0x83, 0xfc, 0x89, - 0x15, 0x62, 0x68, 0x52, 0x8b, 0xa7, 0x6f, 0x52, 0xa3, 0x14, 0x4d, 0xfe, 0xcc, 0x52, 0x34, 0x3f, - 0xb1, 0x8c, 0x2b, 0x3c, 0x5c, 0x27, 0x7a, 0x1b, 0x26, 0xb9, 0xdb, 0x25, 0x7e, 0x9f, 0x67, 0xf3, - 0x8b, 0xc2, 0x37, 0x35, 0x69, 0xa9, 0x76, 0x14, 0x04, 0x0e, 0xb0, 0x44, 0xb0, 0x48, 0x28, 0xf5, - 0xe9, 0x4e, 0x5b, 0x58, 0x5e, 0xbf, 0xa3, 0x9c, 0x8f, 0x99, 0x28, 0x58, 0xbc, 0x1e, 0xa3, 0xe2, - 0x44, 0x6f, 0xfb, 0x73, 0xd3, 0x83, 0xfb, 0xbf, 0x5f, 0xd4, 0xf9, 0x8f, 0x16, 0xcc, 0x3f, 0xee, - 0x6a, 0xce, 0xfb, 0x71, 0xa7, 0x74, 0x9c, 0xf5, 0x3c, 0xa4, 0x8c, 0xf3, 0x3e, 0x3c, 0x91, 0xae, - 0xae, 0x23, 0x38, 0x85, 0x97, 0x74, 0xf5, 0x43, 0xa2, 0x8c, 0x21, 0x2a, 0x74, 0xb0, 0x3f, 0x4b, - 0xca, 0x4b, 0x3a, 0x49, 0x81, 0x06, 0x5a, 0x67, 0xe8, 0xd4, 0xe4, 0x4e, 0xdb, 0xa9, 0xa1, 0xe6, - 0x4a, 0xf4, 0x57, 0x21, 0xe8, 0x7d, 0x7d, 0xd4, 0xac, 0x2c, 0x5f, 0x22, 0x0c, 0xc0, 0x0c, 0x3d, - 0x6e, 0x9f, 0x5b, 0x70, 0x31, 0xb5, 0x77, 0x28, 0xc2, 0xdc, 0x19, 0x8a, 0xd0, 0x3a, 0x6d, 0x11, - 0xde, 0x33, 0x44, 0x18, 0x4c, 0xe1, 0xb4, 0x3e, 0xe5, 0xfa, 0x71, 0x0e, 0xe6, 0x30, 0xe9, 0xf9, - 0xb1, 0x14, 0xe9, 0x76, 0x50, 0xc8, 0x9b, 0x21, 0xa6, 0x48, 0x3c, 0xc4, 0x55, 0x27, 0x63, 0x15, - 0xbc, 0xdf, 0x85, 0x82, 0xcc, 0x5e, 0x66, 0x33, 0x2e, 0x03, 0xc9, 0x5b, 0x75, 0x2d, 0xa9, 0x34, - 0xb0, 0x02, 0x14, 0xc8, 0xb2, 0xae, 0x44, 0x5f, 0x1d, 0xaf, 0x67, 0xa8, 0x50, 0x19, 0x44, 0x96, - 0xcd, 0x58, 0x01, 0xda, 0x9f, 0xe4, 0x40, 0xc5, 0x1f, 0x8f, 0xc1, 0xf6, 0xfe, 0x5a, 0xcc, 0xf6, - 0xae, 0x8e, 0xea, 0x45, 0x09, 0xf1, 0x0c, 0xcb, 0x31, 0x24, 0x63, 0xc3, 0xcb, 0x59, 0x40, 0x1f, - 0x9e, 0x5f, 0xf8, 0x3b, 0x0b, 0x4a, 0xb2, 0xdf, 0x63, 0x30, 0xe3, 0xdb, 0x71, 0x33, 0xfe, 0x42, - 0x86, 0x55, 0x0c, 0x31, 0xdd, 0x1f, 0xe7, 0xf5, 0xec, 0xc3, 0xc8, 0xb3, 0xed, 0xd0, 0xa6, 0x8e, - 0xa9, 0x22, 0x0d, 0x14, 0x8d, 0x58, 0xd1, 0xd0, 0x6f, 0xa8, 0x12, 0x1c, 0xc2, 0x38, 0x69, 0xde, - 0x08, 0x03, 0x9c, 0x7c, 0xe6, 0x5a, 0x22, 0x5d, 0xef, 0x14, 0xe5, 0xd6, 0x71, 0x02, 0x15, 0x0f, - 0xf0, 0x11, 0x41, 0x4f, 0x2f, 0x69, 0xcb, 0x74, 0x30, 0xf0, 0xfa, 0x98, 0x86, 0x53, 0x05, 0x3d, - 0x03, 0xcd, 0x78, 0x90, 0x11, 0x6a, 0xc3, 0xb4, 0x59, 0x05, 0xa9, 0xcf, 0xd2, 0x5a, 0xf6, 0x72, - 0x4b, 0xf5, 0x96, 0x6a, 0xb6, 0xe0, 0x18, 0xb2, 0x7d, 0x54, 0x84, 0xb2, 0x71, 0xf8, 0x12, 0xf9, - 0xca, 0x99, 0xb3, 0xc9, 0x57, 0xa6, 0x87, 0xd7, 0xe5, 0xb1, 0xc2, 0xeb, 0xcb, 0xf1, 0xf0, 0xfa, - 0x9b, 0xc9, 0xf0, 0x1a, 0xe4, 0xea, 0x62, 0xa1, 0x35, 0x83, 0xf3, 0x3a, 0xce, 0x0c, 0xca, 0x59, - 0x33, 0x25, 0x2c, 0x06, 0xa3, 0x59, 0x24, 0x7c, 0xcb, 0x1b, 0x31, 0x48, 0x9c, 0x60, 0x21, 0x7c, - 0x53, 0xdd, 0x52, 0xef, 0x77, 0xbb, 0x0e, 0x3d, 0x5c, 0x9c, 0x96, 0x13, 0x0e, 0x7d, 0xd3, 0x1b, - 0x31, 0x2a, 0x4e, 0xf4, 0x46, 0xdb, 0x50, 0x54, 0x61, 0xaa, 0x2e, 0x91, 0x7c, 0x31, 0x4b, 0x04, - 0xac, 0x7c, 0x73, 0xf5, 0x1b, 0x6b, 0x1c, 0x33, 0xc3, 0x50, 0x3a, 0x21, 0xc3, 0x70, 0x1b, 0x90, - 0xbf, 0x2b, 0xa3, 0x80, 0xe6, 0x4d, 0xf5, 0xcd, 0xb3, 0x38, 0x95, 0x45, 0x19, 0xbe, 0x86, 0x1b, - 0x76, 0x67, 0xa0, 0x07, 0x4e, 0x19, 0x25, 0xb4, 0x5a, 0xc7, 0xb6, 0xa1, 0x2a, 0xe8, 0x6c, 0x42, - 0xd6, 0xb8, 0x29, 0x0a, 0xd6, 0x64, 0x89, 0x5d, 0x2d, 0x81, 0x8a, 0x07, 0xf8, 0xa0, 0x0f, 0x61, - 0x46, 0x1c, 0xa1, 0x88, 0x31, 0x3c, 0x22, 0xe3, 0xf9, 0xe3, 0xa3, 0x95, 0x99, 0x2d, 0x13, 0x12, - 0xc7, 0x39, 0xd8, 0x7f, 0x94, 0x87, 0xf4, 0xc8, 0x3a, 0xaa, 0xee, 0xb7, 0x1e, 0x52, 0xdd, 0xff, - 0x0e, 0x94, 0x18, 0x77, 0xa8, 0xfa, 0x92, 0x21, 0x37, 0xde, 0x97, 0x0c, 0xf5, 0x00, 0x00, 0x47, - 0x58, 0x89, 0x34, 0x47, 0xfe, 0x54, 0xd3, 0x1c, 0x6b, 0x00, 0x32, 0xb2, 0xaa, 0xf9, 0x7d, 0xfd, - 0xb0, 0x39, 0x13, 0xd9, 0x84, 0xeb, 0x21, 0x05, 0x1b, 0xbd, 0xd0, 0x95, 0xf0, 0xe2, 0x54, 0x2f, - 0x99, 0x97, 0x06, 0x2a, 0x31, 0x92, 0x89, 0xb2, 0x94, 0x4f, 0x7f, 0x4f, 0xa8, 0xdc, 0xb2, 0xff, - 0x27, 0x07, 0x31, 0x63, 0x88, 0x7e, 0x68, 0xc1, 0xbc, 0x93, 0xf8, 0x7a, 0x3a, 0xf0, 0x25, 0x7f, - 0x35, 0xdb, 0x27, 0xed, 0x03, 0x1f, 0x5f, 0x47, 0x6f, 0x47, 0xc9, 0x2e, 0x0c, 0x0f, 0x32, 0x45, - 0x7f, 0x60, 0xc1, 0x05, 0x67, 0xf0, 0xf3, 0x78, 0xbd, 0xe9, 0x6f, 0x8c, 0xfd, 0x7d, 0x7d, 0xf5, - 0xc9, 0xe3, 0xa3, 0x95, 0xb4, 0x7f, 0x1c, 0x80, 0xd3, 0xd8, 0xa1, 0xf7, 0x60, 0xc2, 0xa1, 0xad, - 0x20, 0xcf, 0x9a, 0x9d, 0x6d, 0xf0, 0x5f, 0x0f, 0x22, 0xef, 0x68, 0x9d, 0xb6, 0x18, 0x96, 0xa0, - 0xf6, 0xcf, 0xf2, 0x30, 0x97, 0xfc, 0x1a, 0x40, 0x17, 0xf7, 0x4d, 0xa4, 0x16, 0xf7, 0x09, 0x1d, - 0x69, 0xf0, 0xb0, 0xd2, 0x2e, 0xd2, 0x11, 0xd1, 0x88, 0x15, 0x2d, 0xd4, 0x11, 0x59, 0xa3, 0x5b, - 0x78, 0x04, 0x1d, 0x91, 0x85, 0xb9, 0x11, 0x16, 0xba, 0x12, 0xbf, 0x5b, 0xec, 0xe4, 0xdd, 0x32, - 0x6f, 0xae, 0x65, 0xdc, 0xec, 0x6d, 0x17, 0xca, 0xc6, 0x3e, 0x68, 0x4d, 0xbc, 0x9a, 0x59, 0xee, - 0xd1, 0xb1, 0x9b, 0x55, 0xff, 0x3a, 0x21, 0xa2, 0x98, 0xf8, 0x91, 0xde, 0x4b, 0x69, 0x3d, 0x52, - 0x7a, 0x53, 0x8a, 0xcb, 0x40, 0xb3, 0xff, 0xd5, 0x82, 0x99, 0x58, 0xc5, 0xa9, 0xe0, 0x16, 0x54, - 0xf6, 0x8e, 0xff, 0xcf, 0x04, 0xee, 0x86, 0x08, 0xd8, 0x40, 0x43, 0xdf, 0x83, 0x72, 0xc7, 0xf7, - 0x5a, 0x84, 0xf1, 0xba, 0xef, 0xec, 0x6b, 0x3d, 0xc9, 0x9a, 0x48, 0x5a, 0x3c, 0x3e, 0x5a, 0x59, - 0xd8, 0x52, 0x30, 0x35, 0xbf, 0xdb, 0xeb, 0x10, 0xae, 0x4a, 0xb2, 0xb1, 0x09, 0x2e, 0x5f, 0x40, - 0xdf, 0x71, 0x28, 0x69, 0xfb, 0x7d, 0x46, 0xbe, 0xae, 0x2f, 0xa0, 0xe1, 0x04, 0x4f, 0xfb, 0x05, - 0x34, 0x02, 0x3e, 0xf9, 0x05, 0x34, 0xec, 0xfb, 0xb5, 0x7d, 0x01, 0x0d, 0x67, 0x38, 0x24, 0x52, - 0xf9, 0xef, 0x9c, 0xb1, 0x8a, 0x78, 0xb4, 0x92, 0x7b, 0x48, 0xb4, 0x72, 0x1f, 0xa6, 0x5c, 0x8f, - 0x13, 0x7a, 0xe0, 0x74, 0x74, 0x1e, 0x38, 0xeb, 0x59, 0x0c, 0x97, 0xba, 0xa9, 0x71, 0x70, 0x88, - 0x88, 0x3a, 0x70, 0x31, 0x78, 0x1b, 0xa1, 0xc4, 0x89, 0xde, 0x66, 0x75, 0x7d, 0xd3, 0x6b, 0x41, - 0x12, 0xff, 0x46, 0x5a, 0xa7, 0x07, 0xc3, 0x08, 0x38, 0x1d, 0x14, 0x31, 0x98, 0x61, 0x46, 0x98, - 0x1e, 0xdc, 0x88, 0x23, 0xbe, 0x2b, 0x25, 0x33, 0x1b, 0x46, 0x51, 0x94, 0x09, 0x8a, 0xe3, 0x3c, - 0xec, 0x7f, 0xca, 0xc3, 0x6c, 0xe2, 0xa4, 0x25, 0xc2, 0x91, 0xd2, 0xe3, 0x0c, 0x47, 0x8a, 0x63, - 0x85, 0x23, 0xe9, 0x9e, 0xf2, 0xc4, 0x58, 0x9e, 0xf2, 0x9b, 0xca, 0x5b, 0xd5, 0x3b, 0xb7, 0xb9, - 0xa1, 0x6b, 0xc8, 0x43, 0x69, 0x6e, 0x99, 0x44, 0x1c, 0xef, 0x2b, 0xdd, 0x89, 0xe6, 0xe0, 0x47, - 0xe9, 0xda, 0xd5, 0x7e, 0x23, 0x6b, 0x11, 0x60, 0x08, 0xa0, 0xdc, 0x89, 0x14, 0x02, 0x4e, 0x63, - 0x57, 0xbd, 0xfd, 0xd9, 0x57, 0xcb, 0xe7, 0xbe, 0xf8, 0x6a, 0xf9, 0xdc, 0x97, 0x5f, 0x2d, 0x9f, - 0xfb, 0xc1, 0xf1, 0xb2, 0xf5, 0xd9, 0xf1, 0xb2, 0xf5, 0xc5, 0xf1, 0xb2, 0xf5, 0xe5, 0xf1, 0xb2, - 0xf5, 0x1f, 0xc7, 0xcb, 0xd6, 0x8f, 0x7e, 0xbe, 0x7c, 0xee, 0xde, 0x33, 0xa3, 0xfc, 0xb3, 0xaa, - 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xca, 0x19, 0x25, 0xa4, 0xd3, 0x4a, 0x00, 0x00, + // 4077 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0xdd, 0x6f, 0x23, 0x47, + 0x72, 0xdf, 0x21, 0x25, 0x4a, 0x2c, 0x4a, 0x2b, 0xa9, 0x57, 0x6b, 0xf3, 0x74, 0xb1, 0xb4, 0x19, + 0x1b, 0x86, 0x1d, 0xdb, 0x54, 0x56, 0xf6, 0xda, 0xeb, 0xf5, 0x65, 0x03, 0x91, 0xda, 0x0f, 0xed, + 0xe9, 0xbc, 0x4a, 0x53, 0x5e, 0x9f, 0xd7, 0x36, 0x9c, 0x11, 0xd9, 0x22, 0xe7, 0x44, 0xce, 0xd0, + 0xdd, 0x4d, 0x9d, 0x95, 0x04, 0xc9, 0xe5, 0x0b, 0x38, 0x24, 0x48, 0x70, 0x0f, 0x06, 0x7c, 0x01, + 0x12, 0x20, 0x48, 0x1e, 0x0f, 0xc9, 0x3f, 0x90, 0x07, 0x3f, 0xdc, 0x8b, 0x91, 0x18, 0x81, 0x91, + 0x04, 0x88, 0x03, 0x1c, 0x94, 0x58, 0x07, 0xe4, 0x31, 0x6f, 0x79, 0x59, 0x20, 0x40, 0xd0, 0x1f, + 0x33, 0xd3, 0x33, 0x1c, 0xae, 0x38, 0x5c, 0x69, 0xe1, 0xe4, 0x8d, 0xea, 0xea, 0xfe, 0x55, 0x77, + 0x75, 0x57, 0x75, 0x55, 0x75, 0x8d, 0xe0, 0x95, 0x96, 0xcb, 0xdb, 0xfd, 0xdd, 0x4a, 0xc3, 0xef, + 0xae, 0x3a, 0xfb, 0x7d, 0x97, 0x1f, 0xae, 0xee, 0x3b, 0xb4, 0xe5, 0xaf, 0x3a, 0x3d, 0x77, 0xf5, + 0xe0, 0xb2, 0xd3, 0xe9, 0xb5, 0x9d, 0xcb, 0xab, 0x2d, 0xe2, 0x11, 0xea, 0x70, 0xd2, 0xac, 0xf4, + 0xa8, 0xcf, 0x7d, 0xf4, 0x4c, 0x34, 0xaa, 0xa2, 0x46, 0x55, 0xe4, 0xa8, 0x8a, 0xd3, 0x73, 0x2b, + 0xc1, 0xa8, 0xa5, 0x97, 0x0c, 0xec, 0x96, 0xdf, 0xf2, 0x57, 0xe5, 0xe0, 0xdd, 0xfe, 0x9e, 0xfc, + 0x4b, 0xfe, 0x21, 0x7f, 0x29, 0xd0, 0xa5, 0xdb, 0xfb, 0x57, 0x59, 0xc5, 0x95, 0x9c, 0xc9, 0x47, + 0x9c, 0x78, 0xcc, 0xf5, 0x3d, 0xf6, 0x92, 0xd3, 0x73, 0x19, 0xa1, 0x07, 0x84, 0xae, 0xf6, 0xf6, + 0x5b, 0x82, 0xc6, 0xe2, 0x1d, 0x56, 0x0f, 0x06, 0xa6, 0xb7, 0xf4, 0x4a, 0x84, 0xd4, 0x75, 0x1a, + 0x6d, 0xd7, 0x23, 0xf4, 0x30, 0x1a, 0xde, 0x25, 0xdc, 0x49, 0x1b, 0xb5, 0x3a, 0x6c, 0x14, 0xed, + 0x7b, 0xdc, 0xed, 0x92, 0x81, 0x01, 0xaf, 0x9e, 0x34, 0x80, 0x35, 0xda, 0xa4, 0xeb, 0x24, 0xc7, + 0xd9, 0xef, 0xc1, 0x85, 0x75, 0xcf, 0xe9, 0x1c, 0x32, 0x97, 0xe1, 0xbe, 0xb7, 0x4e, 0x5b, 0xfd, + 0x2e, 0xf1, 0x38, 0xba, 0x04, 0x13, 0x9e, 0xd3, 0x25, 0x65, 0xeb, 0x92, 0xf5, 0x5c, 0xb1, 0x3a, + 0xf3, 0xd9, 0xd1, 0xca, 0xb9, 0xe3, 0xa3, 0x95, 0x89, 0x37, 0x9d, 0x2e, 0xc1, 0x92, 0x82, 0x9e, + 0x86, 0xc9, 0x03, 0xa7, 0xd3, 0x27, 0xe5, 0x9c, 0xec, 0x32, 0xab, 0xbb, 0x4c, 0xde, 0x13, 0x8d, + 0x58, 0xd1, 0xec, 0xdf, 0xcf, 0xc7, 0xe0, 0xbf, 0x43, 0xb8, 0xd3, 0x74, 0xb8, 0x83, 0xba, 0x50, + 0xe8, 0x38, 0xbb, 0xa4, 0xc3, 0xca, 0xd6, 0xa5, 0xfc, 0x73, 0xa5, 0xb5, 0x1b, 0x95, 0x51, 0x36, + 0xb1, 0x92, 0x02, 0x55, 0xd9, 0x92, 0x38, 0x37, 0x3c, 0x4e, 0x0f, 0xab, 0xe7, 0xf5, 0x24, 0x0a, + 0xaa, 0x11, 0x6b, 0x26, 0xe8, 0x77, 0x2d, 0x28, 0x39, 0x9e, 0xe7, 0x73, 0x87, 0x8b, 0x6d, 0x2a, + 0xe7, 0x24, 0xd3, 0x3b, 0xe3, 0x33, 0x5d, 0x8f, 0xc0, 0x14, 0xe7, 0x0b, 0x9a, 0x73, 0xc9, 0xa0, + 0x60, 0x93, 0xe7, 0xd2, 0xeb, 0x50, 0x32, 0xa6, 0x8a, 0xe6, 0x21, 0xbf, 0x4f, 0x0e, 0x95, 0x7c, + 0xb1, 0xf8, 0x89, 0x16, 0x63, 0x02, 0xd5, 0x12, 0xbc, 0x96, 0xbb, 0x6a, 0x2d, 0x5d, 0x87, 0xf9, + 0x24, 0xc3, 0x2c, 0xe3, 0xed, 0x3f, 0xb5, 0x60, 0xd1, 0x58, 0x05, 0x26, 0x7b, 0x84, 0x12, 0xaf, + 0x41, 0xd0, 0x2a, 0x14, 0xc5, 0x5e, 0xb2, 0x9e, 0xd3, 0x08, 0xb6, 0x7a, 0x41, 0x2f, 0xa4, 0xf8, + 0x66, 0x40, 0xc0, 0x51, 0x9f, 0xf0, 0x58, 0xe4, 0x1e, 0x76, 0x2c, 0x7a, 0x6d, 0x87, 0x91, 0x72, + 0x3e, 0x7e, 0x2c, 0xb6, 0x45, 0x23, 0x56, 0x34, 0xfb, 0x57, 0xe0, 0x1b, 0xc1, 0x7c, 0x76, 0x48, + 0xb7, 0xd7, 0x71, 0x38, 0x89, 0x26, 0x75, 0xe2, 0xd1, 0xb3, 0xf7, 0x61, 0x76, 0xbd, 0xd7, 0xa3, + 0xfe, 0x01, 0x69, 0xd6, 0xb9, 0xd3, 0x22, 0xe8, 0x3e, 0x80, 0xa3, 0x1b, 0xd6, 0xb9, 0x1c, 0x58, + 0x5a, 0xfb, 0xa5, 0x8a, 0xd2, 0x88, 0x8a, 0xa9, 0x11, 0x95, 0xde, 0x7e, 0x4b, 0x34, 0xb0, 0x8a, + 0x50, 0xbc, 0xca, 0xc1, 0xe5, 0xca, 0x8e, 0xdb, 0x25, 0xd5, 0xf3, 0xc7, 0x47, 0x2b, 0xb0, 0x1e, + 0x22, 0x60, 0x03, 0xcd, 0xfe, 0x3d, 0x0b, 0x2e, 0xae, 0xd3, 0x96, 0x5f, 0xdb, 0x58, 0xef, 0xf5, + 0x6e, 0x13, 0xa7, 0xc3, 0xdb, 0x75, 0xee, 0xf0, 0x3e, 0x43, 0xd7, 0xa1, 0xc0, 0xe4, 0x2f, 0x3d, + 0xd5, 0x67, 0x83, 0xd3, 0xa7, 0xe8, 0x0f, 0x8e, 0x56, 0x16, 0x53, 0x06, 0x12, 0xac, 0x47, 0xa1, + 0xe7, 0x61, 0xaa, 0x4b, 0x18, 0x73, 0x5a, 0x81, 0x3c, 0xe7, 0x34, 0xc0, 0xd4, 0x77, 0x54, 0x33, + 0x0e, 0xe8, 0xf6, 0xdf, 0xe7, 0x60, 0x2e, 0xc4, 0xd2, 0xec, 0xcf, 0x60, 0xf3, 0xfa, 0x30, 0xd3, + 0x36, 0x56, 0x28, 0xf7, 0xb0, 0xb4, 0xf6, 0xc6, 0x88, 0x7a, 0x92, 0x26, 0xa4, 0xea, 0xa2, 0x66, + 0x33, 0x63, 0xb6, 0xe2, 0x18, 0x1b, 0xd4, 0x05, 0x60, 0x87, 0x5e, 0x43, 0x33, 0x9d, 0x90, 0x4c, + 0x5f, 0xcf, 0xc8, 0xb4, 0x1e, 0x02, 0x54, 0x91, 0x66, 0x09, 0x51, 0x1b, 0x36, 0x18, 0xd8, 0x7f, + 0x6b, 0xc1, 0x85, 0x94, 0x71, 0xe8, 0x5b, 0x89, 0xfd, 0x7c, 0x66, 0x60, 0x3f, 0xd1, 0xc0, 0xb0, + 0x68, 0x37, 0x5f, 0x84, 0x69, 0x4a, 0x0e, 0x5c, 0x71, 0x0f, 0x68, 0x09, 0xcf, 0xeb, 0xf1, 0xd3, + 0x58, 0xb7, 0xe3, 0xb0, 0x07, 0x7a, 0x01, 0x8a, 0xc1, 0x6f, 0x21, 0xe6, 0xbc, 0x50, 0x15, 0xb1, + 0x71, 0x41, 0x57, 0x86, 0x23, 0xba, 0xfd, 0x3b, 0x30, 0x59, 0x6b, 0x3b, 0x94, 0x8b, 0x13, 0x43, + 0x49, 0xcf, 0x7f, 0x0b, 0x6f, 0xe9, 0x29, 0x86, 0x27, 0x06, 0xab, 0x66, 0x1c, 0xd0, 0x47, 0xd8, + 0xec, 0xe7, 0x61, 0xea, 0x80, 0x50, 0x39, 0xdf, 0x7c, 0x1c, 0xec, 0x9e, 0x6a, 0xc6, 0x01, 0xdd, + 0xfe, 0x67, 0x0b, 0x16, 0xe5, 0x0c, 0x36, 0x5c, 0xd6, 0xf0, 0x0f, 0x08, 0x3d, 0xc4, 0x84, 0xf5, + 0x3b, 0xa7, 0x3c, 0xa1, 0x0d, 0x98, 0x67, 0xa4, 0x7b, 0x40, 0x68, 0xcd, 0xf7, 0x18, 0xa7, 0x8e, + 0xeb, 0x71, 0x3d, 0xb3, 0xb2, 0xee, 0x3d, 0x5f, 0x4f, 0xd0, 0xf1, 0xc0, 0x08, 0xf4, 0x1c, 0x4c, + 0xeb, 0x69, 0x8b, 0xa3, 0x24, 0x04, 0x3b, 0x23, 0xf6, 0x40, 0xaf, 0x89, 0xe1, 0x90, 0x6a, 0xff, + 0xa7, 0x05, 0x0b, 0x72, 0x55, 0xf5, 0xfe, 0x2e, 0x6b, 0x50, 0xb7, 0x27, 0xcc, 0xeb, 0xd7, 0x71, + 0x49, 0xd7, 0xe1, 0x7c, 0x33, 0x10, 0xfc, 0x96, 0xdb, 0x75, 0xb9, 0xd4, 0x91, 0xc9, 0xea, 0x13, + 0x1a, 0xe3, 0xfc, 0x46, 0x8c, 0x8a, 0x13, 0xbd, 0xd5, 0xf6, 0x75, 0xfa, 0x8c, 0x13, 0xba, 0x4d, + 0xfd, 0xae, 0x2f, 0xd6, 0xb9, 0xe3, 0xb0, 0x7d, 0xf4, 0xeb, 0x30, 0xdd, 0xd5, 0x57, 0x9a, 0xb6, + 0x9a, 0xbf, 0x3c, 0x9a, 0xd5, 0xbc, 0xbb, 0xfb, 0x3d, 0xd2, 0xe0, 0xe2, 0x3a, 0x8c, 0xb4, 0x2d, + 0x6a, 0xc3, 0x21, 0x2a, 0x7a, 0x07, 0x26, 0x58, 0x8f, 0x34, 0xa4, 0x88, 0x4a, 0x6b, 0xaf, 0x8d, + 0xa6, 0xd4, 0xb1, 0x49, 0xd6, 0x7b, 0xa4, 0x11, 0xc9, 0x56, 0xfc, 0x85, 0x25, 0xa4, 0xfd, 0x6f, + 0x16, 0x94, 0xd3, 0x56, 0xb5, 0xe5, 0x32, 0x8e, 0xde, 0x1b, 0x58, 0x59, 0x65, 0xb4, 0x95, 0x89, + 0xd1, 0x72, 0x5d, 0xa1, 0xf6, 0x06, 0x2d, 0xc6, 0xaa, 0x3e, 0x80, 0x49, 0x97, 0x93, 0x6e, 0xe0, + 0x48, 0x5c, 0x1b, 0x6d, 0x59, 0x69, 0x93, 0x8d, 0x2e, 0xc8, 0x4d, 0x01, 0x88, 0x15, 0xae, 0xfd, + 0x2e, 0xcc, 0xd4, 0xfa, 0x94, 0x12, 0x8f, 0xab, 0x0b, 0xee, 0xdb, 0x30, 0xc9, 0x5c, 0x4f, 0xdb, + 0xf9, 0x6c, 0x77, 0x5b, 0x51, 0x80, 0xd7, 0xc5, 0x60, 0xac, 0x30, 0xec, 0x3f, 0xcf, 0xc3, 0x85, + 0xe0, 0xc4, 0x90, 0xe6, 0x3a, 0xe5, 0xee, 0x9e, 0xd3, 0xe0, 0x0c, 0x35, 0x61, 0xa6, 0x19, 0x35, + 0x73, 0x6d, 0x88, 0xb3, 0xf0, 0x0a, 0x8d, 0xbd, 0x01, 0xcf, 0x71, 0x0c, 0x15, 0xbd, 0x0d, 0xf9, + 0x96, 0xcb, 0xb5, 0xdf, 0x77, 0x75, 0x34, 0xc9, 0xdd, 0x72, 0x93, 0x96, 0xa7, 0x5a, 0xd2, 0xac, + 0xf2, 0xb7, 0x5c, 0x8e, 0x05, 0x22, 0xda, 0x85, 0x82, 0xdb, 0x75, 0x5a, 0x24, 0xe3, 0xae, 0x6c, + 0x8a, 0x31, 0x49, 0xf4, 0xd0, 0x91, 0x94, 0x54, 0x86, 0x35, 0xb2, 0xe0, 0xd1, 0x10, 0x16, 0x43, + 0xd9, 0xec, 0xd1, 0x77, 0x3e, 0xc5, 0x76, 0x46, 0x3c, 0x24, 0x95, 0x61, 0x8d, 0x6c, 0x7f, 0x99, + 0x83, 0xf9, 0x48, 0x7e, 0x35, 0xbf, 0xdb, 0x75, 0x39, 0x5a, 0x82, 0x9c, 0xdb, 0xd4, 0x06, 0x09, + 0xf4, 0xc0, 0xdc, 0xe6, 0x06, 0xce, 0xb9, 0x4d, 0xf4, 0x2c, 0x14, 0x76, 0xa9, 0xe3, 0x35, 0xda, + 0xda, 0x10, 0x85, 0xc0, 0x55, 0xd9, 0x8a, 0x35, 0x15, 0x3d, 0x05, 0x79, 0xee, 0xb4, 0xb4, 0xfd, + 0x09, 0xe5, 0xb7, 0xe3, 0xb4, 0xb0, 0x68, 0x17, 0x86, 0x8f, 0xf5, 0xa5, 0x0e, 0xcb, 0x9d, 0x37, + 0x0c, 0x5f, 0x5d, 0x35, 0xe3, 0x80, 0x2e, 0x38, 0x3a, 0x7d, 0xde, 0xf6, 0x69, 0x79, 0x32, 0xce, + 0x71, 0x5d, 0xb6, 0x62, 0x4d, 0x15, 0x2e, 0x4a, 0x43, 0xce, 0x9f, 0x13, 0x5a, 0x2e, 0xc4, 0x5d, + 0x94, 0x5a, 0x40, 0xc0, 0x51, 0x1f, 0xf4, 0x3e, 0x94, 0x1a, 0x94, 0x38, 0xdc, 0xa7, 0x1b, 0x0e, + 0x27, 0xe5, 0xa9, 0xcc, 0x27, 0x70, 0x4e, 0xf8, 0xe0, 0xb5, 0x08, 0x02, 0x9b, 0x78, 0xf6, 0x7f, + 0x59, 0x50, 0x8e, 0x44, 0x2b, 0xf7, 0x36, 0xf2, 0x3b, 0xb5, 0x78, 0xac, 0x21, 0xe2, 0x79, 0x16, + 0x0a, 0x4d, 0xb7, 0x45, 0x18, 0x4f, 0x4a, 0x79, 0x43, 0xb6, 0x62, 0x4d, 0x45, 0x6b, 0x00, 0x2d, + 0x97, 0xeb, 0xbb, 0x42, 0x0b, 0x3b, 0xb4, 0x91, 0xb7, 0x42, 0x0a, 0x36, 0x7a, 0xa1, 0xb7, 0xa1, + 0x28, 0xa7, 0x39, 0xa6, 0xda, 0x49, 0xcf, 0xa1, 0x16, 0x00, 0xe0, 0x08, 0xcb, 0xfe, 0x62, 0x02, + 0xa6, 0x6e, 0x52, 0xe2, 0xb6, 0xda, 0xfc, 0x31, 0x18, 0xfb, 0xa7, 0x61, 0xd2, 0xe9, 0xb8, 0x0e, + 0x93, 0xfb, 0x66, 0xf8, 0xfe, 0xeb, 0xa2, 0x11, 0x2b, 0x1a, 0x7a, 0x17, 0x0a, 0x3e, 0x75, 0x5b, + 0xae, 0x57, 0x2e, 0xca, 0x49, 0xbc, 0x3c, 0x9a, 0x0a, 0xe9, 0x55, 0xdc, 0x95, 0x43, 0x23, 0xe1, + 0xab, 0xbf, 0xb1, 0x86, 0x44, 0xf7, 0x61, 0x4a, 0x1d, 0xa6, 0x40, 0x41, 0x57, 0x47, 0x36, 0x30, + 0xea, 0x3c, 0x46, 0x87, 0x5e, 0xfd, 0xcd, 0x70, 0x00, 0x88, 0xea, 0xa1, 0x7d, 0x99, 0x90, 0xd0, + 0x2f, 0x64, 0xb0, 0x2f, 0x43, 0x0d, 0x4a, 0x3d, 0x34, 0x28, 0x93, 0x59, 0x40, 0xa5, 0xc9, 0x18, + 0x66, 0x41, 0x84, 0x88, 0xb5, 0x23, 0x5b, 0x18, 0x43, 0xc4, 0xda, 0x8b, 0x3e, 0x1f, 0xf7, 0x7e, + 0x03, 0x3f, 0xd7, 0xfe, 0x38, 0x0f, 0x0b, 0xba, 0x67, 0xcd, 0xef, 0x74, 0x48, 0x43, 0x7a, 0x4d, + 0xca, 0x3e, 0xe5, 0x53, 0xed, 0x93, 0x1b, 0xdc, 0x96, 0xca, 0xe6, 0x57, 0x33, 0xcd, 0x26, 0xe2, + 0x51, 0x91, 0x37, 0xa4, 0x0a, 0xb7, 0xc3, 0x5d, 0xd2, 0xbd, 0xf4, 0xbd, 0x89, 0xfe, 0xd0, 0x82, + 0x0b, 0x07, 0x84, 0xba, 0x7b, 0x6e, 0x43, 0x06, 0xcb, 0xb7, 0x5d, 0xc6, 0x7d, 0x7a, 0xa8, 0x6f, + 0x84, 0x57, 0x47, 0xe3, 0x7c, 0xcf, 0x00, 0xd8, 0xf4, 0xf6, 0xfc, 0xea, 0x37, 0x35, 0xb7, 0x0b, + 0xf7, 0x06, 0xa1, 0x71, 0x1a, 0xbf, 0xa5, 0x1e, 0x40, 0x34, 0xdb, 0x94, 0x58, 0x7d, 0xcb, 0x8c, + 0xd5, 0x47, 0x9e, 0x58, 0xb0, 0xd8, 0xc0, 0x64, 0x99, 0x31, 0xfe, 0xa7, 0x16, 0x94, 0x34, 0xfd, + 0x31, 0x38, 0x40, 0x38, 0xee, 0x00, 0xbd, 0x94, 0x69, 0xfe, 0x43, 0x7c, 0x1e, 0x0a, 0xb3, 0x31, + 0x25, 0x47, 0x57, 0x60, 0x62, 0xdf, 0xf5, 0x82, 0x5b, 0xef, 0x17, 0x03, 0x17, 0xf0, 0xdb, 0xae, + 0xd7, 0x7c, 0x70, 0xb4, 0xb2, 0x10, 0xeb, 0x2c, 0x1a, 0xb1, 0xec, 0x7e, 0xb2, 0x57, 0x7e, 0x6d, + 0xfa, 0xc7, 0x7f, 0xb9, 0x72, 0xee, 0x07, 0x3f, 0xbb, 0x74, 0xce, 0xfe, 0x24, 0x0f, 0xf3, 0x49, + 0xa9, 0x8e, 0x90, 0xfb, 0x8a, 0x6c, 0xd8, 0xf4, 0x99, 0xda, 0xb0, 0xdc, 0xd9, 0xd9, 0xb0, 0xfc, + 0x59, 0xd8, 0xb0, 0x89, 0x53, 0xb3, 0x61, 0xf6, 0x3f, 0x5a, 0x70, 0x3e, 0xdc, 0x99, 0x0f, 0xfb, + 0xe2, 0x66, 0x8d, 0xa4, 0x6e, 0x9d, 0xbe, 0xd4, 0x3f, 0x80, 0x29, 0xe6, 0xf7, 0x69, 0x43, 0xba, + 0x8f, 0x02, 0xfd, 0x95, 0x6c, 0x46, 0x53, 0x8d, 0x35, 0x7c, 0x26, 0xd5, 0x80, 0x03, 0x54, 0x73, + 0x41, 0x9a, 0xa6, 0x5c, 0x0a, 0x2a, 0x1c, 0x2e, 0xb1, 0xa0, 0x69, 0xd3, 0xa5, 0x10, 0xad, 0x58, + 0x53, 0x91, 0x2d, 0xed, 0x79, 0xe0, 0xd9, 0x16, 0xab, 0xa0, 0xcd, 0xb2, 0xdc, 0x04, 0x45, 0x41, + 0x3d, 0x98, 0xa7, 0xe4, 0xc3, 0xbe, 0x4b, 0x49, 0xb3, 0xee, 0x3b, 0xfb, 0xc2, 0x2f, 0xd0, 0xe9, + 0x9b, 0x11, 0xf5, 0x7e, 0xa3, 0x4f, 0xa5, 0x09, 0xab, 0x2e, 0x8a, 0xa8, 0x14, 0x27, 0xb0, 0xf0, + 0x00, 0xba, 0xfd, 0xef, 0x93, 0xa1, 0xc2, 0xea, 0x04, 0xca, 0x6f, 0x42, 0xa9, 0xa1, 0xa2, 0x96, + 0xce, 0xe1, 0xa6, 0xa7, 0x8f, 0xd8, 0xc6, 0x18, 0x97, 0x4f, 0xa5, 0x16, 0xc1, 0x24, 0xf2, 0xab, + 0x06, 0x05, 0x9b, 0xdc, 0xd0, 0xf7, 0x01, 0x94, 0x25, 0x26, 0xcd, 0x4d, 0x4f, 0x5f, 0x35, 0xb5, + 0x71, 0x78, 0xdf, 0x0b, 0x51, 0x14, 0xeb, 0xd0, 0xe7, 0x89, 0x08, 0xd8, 0x60, 0x25, 0x56, 0x1d, + 0xa4, 0x0b, 0x6f, 0xfa, 0x54, 0xeb, 0xec, 0x58, 0xab, 0x5e, 0x8f, 0x60, 0x92, 0x59, 0xe5, 0x88, + 0x82, 0x4d, 0x6e, 0x4b, 0x14, 0xe6, 0x93, 0xb2, 0x4a, 0xb9, 0x6e, 0x6e, 0xc7, 0xaf, 0x9b, 0xb5, + 0x11, 0x15, 0xd4, 0x88, 0x40, 0xcd, 0x74, 0x34, 0x85, 0xb9, 0x84, 0x8c, 0x52, 0x58, 0x6e, 0xc6, + 0x59, 0xbe, 0x9c, 0xe5, 0xea, 0xd5, 0x69, 0x5d, 0x93, 0x27, 0x83, 0xf9, 0xa4, 0x74, 0x4e, 0x8d, + 0x69, 0x2c, 0x97, 0x6c, 0xde, 0xa9, 0x7f, 0x91, 0x83, 0x62, 0x68, 0x55, 0xb3, 0x24, 0x86, 0x94, + 0x37, 0x94, 0x3b, 0x21, 0x5a, 0xcb, 0x8f, 0x12, 0xad, 0x4d, 0x0c, 0x8f, 0xd6, 0x82, 0xe4, 0x71, + 0xe1, 0xe1, 0xc9, 0x63, 0x23, 0x5a, 0x9b, 0x1a, 0x3d, 0x5a, 0x9b, 0x3e, 0x39, 0x5a, 0xb3, 0xff, + 0xca, 0x02, 0x34, 0x18, 0x9a, 0x67, 0x11, 0x94, 0x93, 0xbc, 0xeb, 0x46, 0xf4, 0x84, 0x92, 0xf1, + 0xf1, 0xf0, 0x2b, 0xcf, 0xfe, 0x74, 0x12, 0xe6, 0x6e, 0xb9, 0x63, 0xe7, 0xf8, 0x38, 0x3c, 0xa9, + 0x90, 0xea, 0x44, 0xfb, 0xa1, 0x75, 0x4e, 0x1d, 0x4e, 0x5a, 0x87, 0x7a, 0x7f, 0xaf, 0xe9, 0xa1, + 0x4f, 0xd6, 0xd2, 0xbb, 0x3d, 0x18, 0x4e, 0xc2, 0xc3, 0xa0, 0x47, 0x3e, 0x24, 0x6f, 0xc0, 0x2c, + 0xe3, 0xd4, 0x6d, 0x70, 0x95, 0x45, 0x64, 0xe5, 0x92, 0xbc, 0x48, 0x2e, 0xea, 0xee, 0xb3, 0x75, + 0x93, 0x88, 0xe3, 0x7d, 0x53, 0x93, 0x93, 0x13, 0x99, 0x93, 0x93, 0xab, 0x50, 0x74, 0x3a, 0x1d, + 0xff, 0xfb, 0x3b, 0x4e, 0x8b, 0xe9, 0x74, 0x40, 0x78, 0x6a, 0xd6, 0x03, 0x02, 0x8e, 0xfa, 0xa0, + 0x0a, 0x80, 0xdb, 0xf2, 0x7c, 0x4a, 0xe4, 0x88, 0x82, 0xbc, 0xd1, 0xe4, 0x03, 0xcc, 0x66, 0xd8, + 0x8a, 0x8d, 0x1e, 0xa8, 0x0e, 0x17, 0x5d, 0x8f, 0x91, 0x46, 0x9f, 0x92, 0xfa, 0xbe, 0xdb, 0xdb, + 0xd9, 0xaa, 0x4b, 0x2b, 0x71, 0x28, 0x4f, 0xf3, 0x74, 0xf5, 0x29, 0xcd, 0xec, 0xe2, 0x66, 0x5a, + 0x27, 0x9c, 0x3e, 0x16, 0xbd, 0x02, 0x33, 0xae, 0xd7, 0xe8, 0xf4, 0x9b, 0x64, 0xdb, 0xe1, 0x6d, + 0x56, 0x9e, 0x96, 0xd3, 0x98, 0x3f, 0x3e, 0x5a, 0x99, 0xd9, 0x34, 0xda, 0x71, 0xac, 0x97, 0x18, + 0x45, 0x3e, 0x32, 0x46, 0x15, 0xa3, 0x51, 0x37, 0x3e, 0x32, 0x47, 0x99, 0xbd, 0x52, 0xd2, 0xb7, + 0x90, 0x29, 0x7d, 0xfb, 0x93, 0x1c, 0x14, 0xd4, 0xeb, 0x09, 0xba, 0x92, 0x78, 0xa2, 0x78, 0x6a, + 0xe0, 0x89, 0xa2, 0x94, 0xf6, 0xd2, 0x64, 0x43, 0xc1, 0x65, 0xac, 0x1f, 0x77, 0x20, 0x36, 0x65, + 0x0b, 0xd6, 0x14, 0x99, 0xda, 0xf2, 0xbd, 0x3d, 0xb7, 0xa5, 0x13, 0x10, 0xd7, 0x0d, 0xb7, 0x21, + 0x7a, 0xe1, 0xfe, 0x20, 0x7c, 0x02, 0x8f, 0x3c, 0x88, 0x58, 0x07, 0xe1, 0x4a, 0xdc, 0xa9, 0xdf, + 0x7d, 0x53, 0xf1, 0xa8, 0x49, 0x44, 0xac, 0x91, 0x05, 0x0f, 0xbf, 0xcf, 0x7b, 0x7d, 0x2e, 0x0f, + 0xca, 0x29, 0xf1, 0xb8, 0x2b, 0x11, 0xb1, 0x46, 0xb6, 0x3f, 0xb1, 0x60, 0x4e, 0xc9, 0xa0, 0xd6, + 0x26, 0x8d, 0xfd, 0x3a, 0x27, 0x3d, 0xe1, 0xd1, 0xf7, 0x19, 0x61, 0x49, 0x8f, 0xfe, 0x2d, 0x46, + 0x18, 0x96, 0x14, 0x63, 0xf5, 0xb9, 0xb3, 0x5a, 0xbd, 0xfd, 0x37, 0x16, 0x4c, 0x4a, 0xd7, 0x39, + 0x8b, 0xfd, 0x89, 0xa7, 0x93, 0x72, 0x23, 0xa5, 0x93, 0x4e, 0x48, 0xf4, 0x45, 0x99, 0xac, 0x89, + 0x87, 0x65, 0xb2, 0xec, 0x9f, 0x5b, 0xb0, 0x98, 0x96, 0x1d, 0xcd, 0x32, 0xfd, 0x17, 0x61, 0xba, + 0xd7, 0x71, 0xf8, 0x9e, 0x4f, 0xbb, 0xc9, 0x57, 0xb1, 0x6d, 0xdd, 0x8e, 0xc3, 0x1e, 0x88, 0x02, + 0xd0, 0x20, 0x0c, 0x0b, 0x42, 0x94, 0xeb, 0x59, 0x6f, 0x84, 0x78, 0x5a, 0x2f, 0x12, 0x56, 0xd8, + 0xc4, 0xb0, 0xc1, 0xc5, 0xfe, 0xe3, 0x49, 0x58, 0x90, 0x43, 0xc6, 0xbd, 0x21, 0xc6, 0xd9, 0xa1, + 0x1e, 0x3c, 0x21, 0x83, 0xa7, 0xc1, 0x4b, 0x45, 0x6d, 0xda, 0x55, 0x3d, 0xfe, 0x89, 0xcd, 0xd4, + 0x5e, 0x0f, 0x86, 0x52, 0xf0, 0x10, 0xdc, 0xc1, 0x9b, 0x02, 0xfe, 0xff, 0xdd, 0x14, 0xe6, 0x61, + 0x9b, 0x3a, 0xf1, 0xb0, 0x0d, 0xbd, 0x57, 0xa6, 0x1f, 0xe1, 0x5e, 0x19, 0xb4, 0xf5, 0xc5, 0x4c, + 0xb6, 0xfe, 0xcf, 0x72, 0x30, 0xb5, 0x4d, 0x7d, 0x99, 0x65, 0x3f, 0xfb, 0x84, 0xed, 0xdd, 0xd8, + 0xeb, 0xdc, 0xe5, 0x91, 0x5f, 0xe7, 0x04, 0x94, 0x7c, 0x97, 0x9b, 0x8e, 0xbf, 0xc9, 0x19, 0x99, + 0xc7, 0x7c, 0x16, 0x0f, 0x3c, 0x80, 0x7c, 0x78, 0xe6, 0xf1, 0x53, 0x0b, 0x4a, 0xba, 0xe7, 0xd7, + 0x36, 0xc5, 0xa5, 0xe7, 0x37, 0x24, 0xc5, 0xf5, 0x27, 0xd1, 0x0a, 0x84, 0xd0, 0xd0, 0x6f, 0xc3, + 0x42, 0x2f, 0x78, 0x0d, 0xdc, 0xf6, 0x3b, 0x6e, 0xc3, 0x25, 0x41, 0x96, 0xf4, 0x4a, 0xc6, 0xa7, + 0x52, 0x39, 0xfc, 0xb0, 0xfa, 0x0d, 0xcd, 0x77, 0x61, 0x3b, 0x89, 0x8b, 0x07, 0x59, 0xd9, 0xff, + 0x62, 0xc1, 0x6c, 0x4c, 0xf6, 0xa8, 0x01, 0xd0, 0xf0, 0xbd, 0xa6, 0xcb, 0xc3, 0xc2, 0x84, 0xd2, + 0xda, 0xea, 0x68, 0x52, 0xad, 0x05, 0xe3, 0xa2, 0x43, 0x17, 0x36, 0x31, 0x6c, 0xc0, 0xa2, 0x97, + 0x83, 0x1a, 0xa1, 0xb8, 0x13, 0xa3, 0x6a, 0x84, 0x1e, 0x1c, 0xad, 0xcc, 0xe8, 0x39, 0x99, 0x35, + 0x43, 0x59, 0xaa, 0x65, 0xfe, 0x3a, 0x07, 0xc5, 0x70, 0xfd, 0x8f, 0x41, 0x8d, 0xde, 0x8a, 0xa9, + 0xd1, 0xcb, 0x19, 0x77, 0x6e, 0xd8, 0x03, 0x37, 0x7a, 0x3f, 0xa1, 0x4c, 0x59, 0x8f, 0xc4, 0x09, + 0xea, 0xf4, 0x53, 0xb5, 0xf9, 0xaa, 0xef, 0x63, 0x50, 0xa8, 0x9d, 0xb8, 0x42, 0xad, 0x66, 0x5c, + 0xcd, 0x10, 0x95, 0xfa, 0xa1, 0x05, 0x73, 0x09, 0x25, 0x40, 0x4f, 0xc3, 0xa4, 0xcc, 0x8a, 0xe9, + 0xf3, 0x15, 0x0e, 0xd4, 0x01, 0xbe, 0xa4, 0xa1, 0x6d, 0x58, 0x74, 0xfa, 0xdc, 0x0f, 0xc7, 0xde, + 0xf0, 0x9c, 0xdd, 0x0e, 0x51, 0x51, 0xfb, 0x74, 0xf5, 0x17, 0xf4, 0x98, 0xc5, 0xf5, 0x94, 0x3e, + 0x38, 0x75, 0xa4, 0xfd, 0x79, 0x0e, 0x50, 0xd8, 0x98, 0x25, 0x9d, 0xfc, 0x3e, 0x4c, 0xed, 0xa9, + 0x44, 0xd0, 0xa3, 0xbd, 0x07, 0x54, 0x4b, 0xe6, 0x93, 0x48, 0x80, 0x89, 0xde, 0x39, 0x9d, 0x73, + 0x04, 0x83, 0x67, 0x08, 0xdd, 0x07, 0xd8, 0x73, 0x3d, 0x97, 0xb5, 0xc7, 0x7c, 0xb9, 0x94, 0xb7, + 0xf9, 0xcd, 0x10, 0x01, 0x1b, 0x68, 0xf6, 0xc7, 0x39, 0xe3, 0x7c, 0x4a, 0x73, 0x39, 0xd2, 0xbe, + 0x3e, 0x1f, 0x17, 0x66, 0x71, 0xf0, 0xad, 0xc8, 0x10, 0xcc, 0xc4, 0x81, 0x43, 0x83, 0xb4, 0x75, + 0xd6, 0xe2, 0x94, 0x7b, 0x0e, 0x75, 0xc5, 0xc6, 0x47, 0x5b, 0x7a, 0xcf, 0xa1, 0x0c, 0x4b, 0x48, + 0xf4, 0x5d, 0x31, 0x55, 0xd2, 0x0b, 0x4c, 0x68, 0x66, 0x9b, 0xc0, 0x49, 0xcf, 0x5c, 0x1f, 0xe9, + 0x31, 0xac, 0x00, 0xed, 0x8f, 0xa7, 0x8c, 0x03, 0xaf, 0xad, 0xf6, 0x1d, 0x40, 0x1d, 0x87, 0xf1, + 0xdb, 0x8e, 0xd7, 0x14, 0xc7, 0x93, 0xec, 0x51, 0xc2, 0xda, 0xda, 0x43, 0x5b, 0xd2, 0x28, 0x68, + 0x6b, 0xa0, 0x07, 0x4e, 0x19, 0x85, 0xae, 0xc4, 0x8d, 0xf3, 0x4a, 0xd2, 0x38, 0x9f, 0x8f, 0xb4, + 0x6d, 0x3c, 0xf3, 0x6c, 0x1e, 0xf7, 0xc9, 0x33, 0x38, 0xee, 0xbf, 0x05, 0x0b, 0x7b, 0xc9, 0xb7, + 0x43, 0x5d, 0x49, 0xf0, 0xda, 0x98, 0x4f, 0x8f, 0xd5, 0x8b, 0xc7, 0xd1, 0x83, 0x53, 0xd4, 0x8c, + 0x07, 0x19, 0x21, 0x3f, 0x28, 0xa1, 0x94, 0xd1, 0xa7, 0x4a, 0x2c, 0x8c, 0xac, 0x72, 0x89, 0xb8, + 0x35, 0x59, 0x3c, 0xa9, 0x20, 0x71, 0x8c, 0x41, 0x42, 0x05, 0x0b, 0xa7, 0xa9, 0x82, 0xe8, 0x4a, + 0x98, 0xd0, 0x17, 0xd3, 0x91, 0xae, 0x6c, 0x7e, 0x20, 0x15, 0x2f, 0x48, 0xd8, 0xec, 0x87, 0x7e, + 0x64, 0xc1, 0x45, 0x71, 0x58, 0x6f, 0x7c, 0x44, 0x1a, 0x7d, 0x21, 0x95, 0xa0, 0x6e, 0xba, 0x5c, + 0x92, 0xd2, 0x18, 0xb1, 0xa0, 0xb4, 0x9e, 0x06, 0x11, 0xf9, 0xe5, 0xa9, 0x64, 0x9c, 0xce, 0x18, + 0x7d, 0x20, 0x4d, 0x07, 0x27, 0x32, 0xec, 0x79, 0xf4, 0xf0, 0xbe, 0xa8, 0xcd, 0x0e, 0x57, 0x66, + 0x87, 0x13, 0xfb, 0xa7, 0x79, 0xd3, 0x5a, 0x8d, 0x96, 0x74, 0xb8, 0x0f, 0x13, 0xdc, 0x61, 0xfb, + 0x5a, 0x0b, 0xbe, 0x35, 0x46, 0x71, 0x5c, 0xa4, 0x0b, 0xd2, 0x13, 0x97, 0x4d, 0x12, 0x13, 0x2d, + 0x41, 0xce, 0x61, 0xc9, 0x14, 0xf4, 0x3a, 0xc3, 0x39, 0x87, 0xa1, 0x77, 0x60, 0x92, 0x12, 0x4e, + 0x0f, 0xb5, 0xc1, 0xbe, 0x3a, 0x86, 0x71, 0xc2, 0x62, 0xbc, 0x12, 0x83, 0xfc, 0x89, 0x15, 0x62, + 0x68, 0x52, 0x0b, 0xa7, 0x6f, 0x52, 0xa3, 0x14, 0x4d, 0xfe, 0xcc, 0x52, 0x34, 0x3f, 0xb1, 0x8c, + 0x2b, 0x3c, 0x5c, 0x27, 0x7a, 0x0b, 0xa6, 0xb8, 0xdb, 0x25, 0x7e, 0x9f, 0x67, 0xf3, 0x8b, 0xc2, + 0x37, 0x35, 0x69, 0xa9, 0x76, 0x14, 0x04, 0x0e, 0xb0, 0x44, 0xb0, 0x48, 0x28, 0xf5, 0xe9, 0x4e, + 0x5b, 0x58, 0x5e, 0xbf, 0xa3, 0x9c, 0x8f, 0xd9, 0x28, 0x58, 0xbc, 0x11, 0xa3, 0xe2, 0x44, 0x6f, + 0xfb, 0x73, 0xd3, 0x83, 0xfb, 0xbf, 0x5f, 0xd0, 0xf9, 0x0f, 0x16, 0x2c, 0x3c, 0xee, 0x4a, 0xce, + 0xef, 0xc6, 0x9d, 0xd2, 0x97, 0xc7, 0x58, 0xcf, 0x10, 0xc7, 0xf4, 0x3d, 0x78, 0x22, 0x5d, 0x55, + 0x47, 0x70, 0x08, 0x2f, 0xe9, 0xca, 0x87, 0x44, 0x09, 0x43, 0x54, 0xe4, 0x60, 0x7f, 0x96, 0x94, + 0x95, 0x74, 0x90, 0x02, 0xed, 0xb3, 0xce, 0xd0, 0xa1, 0xc9, 0x9d, 0xb6, 0x43, 0x43, 0xcd, 0x95, + 0xe8, 0xaf, 0x41, 0xd0, 0xfb, 0xfa, 0x98, 0x59, 0x59, 0xbe, 0x40, 0x18, 0x80, 0x19, 0x7a, 0xd4, + 0x3e, 0xb7, 0xe0, 0x62, 0x6a, 0xef, 0x50, 0x84, 0xb9, 0x33, 0x14, 0xa1, 0x75, 0xda, 0x22, 0xbc, + 0x6f, 0x88, 0x30, 0x98, 0xc2, 0x69, 0x7d, 0xc2, 0xf5, 0xe3, 0x1c, 0xcc, 0x63, 0xd2, 0xf3, 0x63, + 0xe9, 0xd1, 0xed, 0xa0, 0x88, 0x37, 0x43, 0x3c, 0x91, 0x78, 0x84, 0xab, 0x4e, 0xc5, 0xaa, 0x77, + 0x85, 0x22, 0x76, 0x03, 0xef, 0x71, 0x64, 0xc1, 0x0f, 0x24, 0x6e, 0xd5, 0x95, 0xa4, 0x52, 0xc0, + 0x0a, 0x50, 0x20, 0xcb, 0x9a, 0x12, 0x7d, 0x6d, 0xbc, 0x96, 0xa1, 0x3a, 0x65, 0x10, 0x59, 0x36, + 0x63, 0x05, 0x68, 0x7f, 0x92, 0x03, 0x15, 0x7b, 0x3c, 0x06, 0xbb, 0xfb, 0x6b, 0x31, 0xbb, 0xbb, + 0x3a, 0xaa, 0x07, 0x25, 0xc4, 0x33, 0x2c, 0xbf, 0x90, 0x8c, 0x0b, 0x2f, 0x67, 0x01, 0x7d, 0x78, + 0x6e, 0xe1, 0xef, 0x2c, 0x28, 0xca, 0x7e, 0x8f, 0xc1, 0x84, 0x6f, 0xc7, 0x4d, 0xf8, 0x0b, 0x19, + 0x56, 0x31, 0xc4, 0x74, 0x7f, 0x9c, 0xd7, 0xb3, 0x0f, 0xa3, 0xce, 0xb6, 0x43, 0x9b, 0x3a, 0x9e, + 0x8a, 0x34, 0x50, 0x34, 0x62, 0x45, 0x43, 0xbf, 0xa1, 0xca, 0x6f, 0x08, 0xe3, 0xa4, 0x79, 0x33, + 0x0c, 0x6e, 0xf2, 0x99, 0xeb, 0x88, 0x74, 0xad, 0x53, 0x94, 0x57, 0xc7, 0x09, 0x54, 0x3c, 0xc0, + 0x47, 0x04, 0x3c, 0xbd, 0xa4, 0x2d, 0xd3, 0x81, 0xc0, 0x6b, 0x63, 0x1a, 0x4e, 0x15, 0xf0, 0x0c, + 0x34, 0xe3, 0x41, 0x46, 0xa8, 0x0d, 0x33, 0x66, 0x05, 0xa4, 0x3e, 0x4b, 0x6b, 0xd9, 0x4b, 0x2d, + 0xd5, 0x3b, 0xaa, 0xd9, 0x82, 0x63, 0xc8, 0xf6, 0x51, 0x01, 0x4a, 0xc6, 0xe1, 0x4b, 0xe4, 0x2a, + 0x67, 0xcf, 0x26, 0x57, 0x99, 0x1e, 0x5a, 0x97, 0xc6, 0x0a, 0xad, 0x2f, 0xc7, 0x43, 0xeb, 0x6f, + 0x26, 0x43, 0x6b, 0x90, 0xab, 0x8b, 0x85, 0xd5, 0x0c, 0xce, 0xeb, 0x18, 0x33, 0x28, 0x65, 0xcd, + 0x94, 0xac, 0x18, 0x8c, 0x64, 0x91, 0xf0, 0x2b, 0x6f, 0xc6, 0x20, 0x71, 0x82, 0x85, 0xf0, 0x4b, + 0x75, 0x4b, 0xbd, 0xdf, 0xed, 0x3a, 0xf4, 0xb0, 0x3c, 0x23, 0x27, 0x1c, 0xfa, 0xa5, 0x37, 0x63, + 0x54, 0x9c, 0xe8, 0x8d, 0xb6, 0xa1, 0xa0, 0x42, 0x54, 0x5d, 0x1e, 0xf9, 0x62, 0x96, 0xe8, 0x57, + 0xf9, 0xe5, 0xea, 0x37, 0xd6, 0x38, 0x66, 0x76, 0xa1, 0x78, 0x42, 0x76, 0xe1, 0x0e, 0x20, 0x7f, + 0x57, 0x46, 0x00, 0xcd, 0x5b, 0xea, 0x5b, 0x67, 0x71, 0x2a, 0x0b, 0x32, 0x74, 0x0d, 0x37, 0xec, + 0xee, 0x40, 0x0f, 0x9c, 0x32, 0x4a, 0x68, 0xb5, 0x8e, 0x6b, 0x43, 0x55, 0xd0, 0x99, 0x84, 0xac, + 0x31, 0x53, 0x14, 0xa8, 0xc9, 0xf2, 0xba, 0x5a, 0x02, 0x15, 0x0f, 0xf0, 0x41, 0x1f, 0xc2, 0xac, + 0x38, 0x42, 0x11, 0x63, 0x78, 0x44, 0xc6, 0x0b, 0xc7, 0x47, 0x2b, 0xb3, 0x5b, 0x26, 0x24, 0x8e, + 0x73, 0xb0, 0xff, 0x28, 0x0f, 0xe9, 0x51, 0x75, 0x54, 0xd9, 0x6f, 0x3d, 0xa4, 0xb2, 0xff, 0x6d, + 0x28, 0x32, 0xee, 0x50, 0xf5, 0x15, 0x43, 0x6e, 0xbc, 0xaf, 0x18, 0xea, 0x01, 0x00, 0x8e, 0xb0, + 0x12, 0x29, 0x8e, 0xfc, 0xa9, 0xa6, 0x38, 0xd6, 0x00, 0x64, 0x54, 0x55, 0xf3, 0xfb, 0xfa, 0x51, + 0x73, 0x36, 0xb2, 0x09, 0x37, 0x42, 0x0a, 0x36, 0x7a, 0xa1, 0xab, 0xe1, 0xc5, 0xa9, 0x5e, 0x31, + 0x2f, 0x0d, 0x54, 0x61, 0x24, 0x93, 0x64, 0x29, 0x9f, 0xfc, 0x9e, 0x50, 0xb5, 0x65, 0xff, 0x4f, + 0x0e, 0x62, 0xc6, 0x10, 0xfd, 0xd0, 0x82, 0x05, 0x27, 0xf1, 0xd5, 0x74, 0xe0, 0x4b, 0xfe, 0x6a, + 0xb6, 0x4f, 0xd9, 0x07, 0x3e, 0xba, 0x8e, 0xde, 0x8d, 0x92, 0x5d, 0x18, 0x1e, 0x64, 0x8a, 0xfe, + 0xc0, 0x82, 0x0b, 0xce, 0xe0, 0x67, 0xf1, 0x7a, 0xd3, 0x5f, 0x1f, 0xfb, 0xbb, 0xfa, 0xea, 0x93, + 0xc7, 0x47, 0x2b, 0x69, 0xff, 0x30, 0x00, 0xa7, 0xb1, 0x43, 0xef, 0xc2, 0x84, 0x43, 0x5b, 0x41, + 0x8e, 0x35, 0x3b, 0xdb, 0xe0, 0xbf, 0x1d, 0x44, 0xde, 0xd1, 0x3a, 0x6d, 0x31, 0x2c, 0x41, 0xed, + 0x9f, 0xe5, 0x61, 0x3e, 0xf9, 0x25, 0x80, 0x2e, 0xec, 0x9b, 0x48, 0x2d, 0xec, 0x13, 0x3a, 0xd2, + 0xe0, 0x61, 0x95, 0x5d, 0xa4, 0x23, 0xa2, 0x11, 0x2b, 0x5a, 0xa8, 0x23, 0xb2, 0x3e, 0x77, 0xf2, + 0x11, 0x74, 0x44, 0x16, 0xe5, 0x46, 0x58, 0xe8, 0x6a, 0xfc, 0x6e, 0xb1, 0x93, 0x77, 0xcb, 0x82, + 0xb9, 0x96, 0x71, 0x33, 0xb7, 0x5d, 0x28, 0x19, 0xfb, 0xa0, 0x35, 0xf1, 0x5a, 0x66, 0xb9, 0x47, + 0xc7, 0x6e, 0x4e, 0xfd, 0xcb, 0x84, 0x88, 0x62, 0xe2, 0x47, 0x7a, 0x2f, 0xa5, 0xf5, 0x48, 0xa9, + 0x4d, 0x29, 0x2e, 0x03, 0xcd, 0xfe, 0x57, 0x0b, 0x66, 0x63, 0xd5, 0xa6, 0x82, 0x5b, 0x50, 0xd5, + 0x3b, 0xfe, 0x3f, 0x11, 0xb8, 0x17, 0x22, 0x60, 0x03, 0x0d, 0x7d, 0x0f, 0x4a, 0x1d, 0xdf, 0x6b, + 0x11, 0xc6, 0xeb, 0xbe, 0xb3, 0xaf, 0xf5, 0x24, 0x6b, 0x12, 0xa9, 0x7c, 0x7c, 0xb4, 0xb2, 0xb8, + 0xa5, 0x60, 0x6a, 0x7e, 0xb7, 0xd7, 0x21, 0x5c, 0x95, 0x63, 0x63, 0x13, 0x5c, 0xbe, 0x7e, 0xbe, + 0xed, 0x50, 0xd2, 0xf6, 0xfb, 0x8c, 0x7c, 0x5d, 0x5f, 0x3f, 0xc3, 0x09, 0x9e, 0xf6, 0xeb, 0x67, + 0x04, 0x7c, 0xf2, 0xeb, 0x67, 0xd8, 0xf7, 0x6b, 0xfb, 0xfa, 0x19, 0xce, 0x70, 0x48, 0xa4, 0xf2, + 0xdf, 0x39, 0x63, 0x15, 0xf1, 0x68, 0x25, 0xf7, 0x90, 0x68, 0xe5, 0x3d, 0x98, 0x76, 0x3d, 0x4e, + 0xe8, 0x81, 0xd3, 0xd1, 0x39, 0xe0, 0xac, 0x67, 0x31, 0x5c, 0xea, 0xa6, 0xc6, 0xc1, 0x21, 0x22, + 0xea, 0xc0, 0xc5, 0xe0, 0x5d, 0x84, 0x12, 0x27, 0x7a, 0x97, 0xd5, 0xb5, 0x4d, 0xaf, 0x06, 0x09, + 0xfc, 0x9b, 0x69, 0x9d, 0x1e, 0x0c, 0x23, 0xe0, 0x74, 0x50, 0xc4, 0x60, 0x96, 0x19, 0x61, 0x7a, + 0x70, 0x23, 0x8e, 0xf8, 0xa6, 0x94, 0xcc, 0x6c, 0x18, 0x05, 0x51, 0x26, 0x28, 0x8e, 0xf3, 0xb0, + 0xff, 0x29, 0x0f, 0x73, 0x89, 0x93, 0x96, 0x08, 0x47, 0x8a, 0x8f, 0x33, 0x1c, 0x29, 0x8c, 0x15, + 0x8e, 0xa4, 0x7b, 0xca, 0x13, 0x63, 0x79, 0xca, 0x6f, 0x28, 0x6f, 0x55, 0xef, 0xdc, 0xe6, 0x86, + 0xae, 0x1f, 0x0f, 0xa5, 0xb9, 0x65, 0x12, 0x71, 0xbc, 0xaf, 0x74, 0x27, 0x9a, 0x83, 0x1f, 0xa4, + 0x6b, 0x57, 0xfb, 0xf5, 0xac, 0x05, 0x80, 0x21, 0x80, 0x72, 0x27, 0x52, 0x08, 0x38, 0x8d, 0x5d, + 0xf5, 0xce, 0x67, 0x5f, 0x2d, 0x9f, 0xfb, 0xe2, 0xab, 0xe5, 0x73, 0x5f, 0x7e, 0xb5, 0x7c, 0xee, + 0x07, 0xc7, 0xcb, 0xd6, 0x67, 0xc7, 0xcb, 0xd6, 0x17, 0xc7, 0xcb, 0xd6, 0x97, 0xc7, 0xcb, 0xd6, + 0x7f, 0x1c, 0x2f, 0x5b, 0x3f, 0xfa, 0xf9, 0xf2, 0xb9, 0xfb, 0xcf, 0x8c, 0xf2, 0x4f, 0xaa, 0xfe, + 0x37, 0x00, 0x00, 0xff, 0xff, 0x9a, 0x6b, 0x62, 0x5c, 0xcb, 0x4a, 0x00, 0x00, } func (m *AnalysisRunArgument) Marshal() (dAtA []byte, err error) { @@ -7248,9 +7248,9 @@ func (this *ClusterPromotionTaskList) String() string { if this == nil { return "nil" } - repeatedStringForItems := "[]ClusterPromotionTaskList{" + repeatedStringForItems := "[]ClusterPromotionTask{" for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ClusterPromotionTaskList", "ClusterPromotionTaskList", 1), `&`, ``, 1) + "," + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ClusterPromotionTask", "ClusterPromotionTask", 1), `&`, ``, 1) + "," } repeatedStringForItems += "}" s := strings.Join([]string{`&ClusterPromotionTaskList{`, @@ -7830,9 +7830,9 @@ func (this *PromotionTaskList) String() string { if this == nil { return "nil" } - repeatedStringForItems := "[]PromotionTaskList{" + repeatedStringForItems := "[]PromotionTask{" for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "PromotionTaskList", "PromotionTaskList", 1), `&`, ``, 1) + "," + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "PromotionTask", "PromotionTask", 1), `&`, ``, 1) + "," } repeatedStringForItems += "}" s := strings.Join([]string{`&PromotionTaskList{`, @@ -10008,7 +10008,7 @@ func (m *ClusterPromotionTaskList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, ClusterPromotionTaskList{}) + m.Items = append(m.Items, ClusterPromotionTask{}) if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -16336,7 +16336,7 @@ func (m *PromotionTaskList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, PromotionTaskList{}) + m.Items = append(m.Items, PromotionTask{}) if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } diff --git a/api/v1alpha1/generated.proto b/api/v1alpha1/generated.proto index 5fd42b202..87efefb3c 100644 --- a/api/v1alpha1/generated.proto +++ b/api/v1alpha1/generated.proto @@ -195,7 +195,7 @@ message ClusterPromotionTask { message ClusterPromotionTaskList { optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - repeated ClusterPromotionTaskList items = 2; + repeated ClusterPromotionTask items = 2; } // CurrentStage reflects a Stage's current use of Freight. @@ -1042,7 +1042,7 @@ message PromotionTask { message PromotionTaskList { optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - repeated PromotionTaskList items = 2; + repeated PromotionTask items = 2; } // PromotionTaskReference describes a reference to a PromotionTask. diff --git a/api/v1alpha1/promotion_task_types.go b/api/v1alpha1/promotion_task_types.go index 0b5f9eed3..5c0fe35e3 100644 --- a/api/v1alpha1/promotion_task_types.go +++ b/api/v1alpha1/promotion_task_types.go @@ -40,5 +40,5 @@ type PromotionTaskSpec struct { type PromotionTaskList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - Items []PromotionTaskList `json:"items" protobuf:"bytes,2,rep,name=items"` + Items []PromotionTask `json:"items" protobuf:"bytes,2,rep,name=items"` } diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index 221f57a75..d478c6d61 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -238,7 +238,7 @@ func (in *ClusterPromotionTaskList) DeepCopyInto(out *ClusterPromotionTaskList) in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]ClusterPromotionTaskList, len(*in)) + *out = make([]ClusterPromotionTask, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -1154,7 +1154,7 @@ func (in *PromotionTaskList) DeepCopyInto(out *PromotionTaskList) { in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]PromotionTaskList, len(*in)) + *out = make([]PromotionTask, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } diff --git a/ui/src/gen/v1alpha1/generated_pb.ts b/ui/src/gen/v1alpha1/generated_pb.ts index 5aca14b04..30800b126 100644 --- a/ui/src/gen/v1alpha1/generated_pb.ts +++ b/ui/src/gen/v1alpha1/generated_pb.ts @@ -18,7 +18,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file v1alpha1/generated.proto. */ export const file_v1alpha1_generated: GenFile = /*@__PURE__*/ - fileDesc("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKrAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEk0KBWl0ZW1zGAIgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrTGlzdCJJCgxDdXJyZW50U3RhZ2USOQoFc2luY2UYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSK2AgoTRGlzY292ZXJlZEFydGlmYWN0cxJACgxkaXNjb3ZlcmVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJFCgNnaXQYASADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0RGlzY292ZXJ5UmVzdWx0EkoKBmltYWdlcxgCIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZURpc2NvdmVyeVJlc3VsdBJKCgZjaGFydHMYAyADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnREaXNjb3ZlcnlSZXN1bHQisAEKEERpc2NvdmVyZWRDb21taXQSCgoCaWQYASABKAkSDgoGYnJhbmNoGAIgASgJEgsKA3RhZxgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEg4KBmF1dGhvchgFIAEoCRIRCgljb21taXR0ZXIYBiABKAkSPwoLY3JlYXRvckRhdGUYByABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKKAQoYRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlEgsKA3RhZxgBIAEoCRIOCgZkaWdlc3QYAiABKAkSEgoKZ2l0UmVwb1VSTBgDIAEoCRI9CgljcmVhdGVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKiAwoHRnJlaWdodBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEg0KBWFsaWFzGAcgASgJEkMKBm9yaWdpbhgJIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAyADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBSADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQSQwoGc3RhdHVzGAYgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMirQIKEUZyZWlnaHRDb2xsZWN0aW9uEgoKAmlkGAMgASgJElEKBWl0ZW1zGAEgAygLMkIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uLkl0ZW1zRW50cnkSUwoTdmVyaWZpY2F0aW9uSGlzdG9yeRgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb25JbmZvGmQKCkl0ZW1zRW50cnkSCwoDa2V5GAEgASgJEkUKBXZhbHVlGAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2U6AjgBIo0BCgtGcmVpZ2h0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0IisKDUZyZWlnaHRPcmlnaW4SDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJIqECChBGcmVpZ2h0UmVmZXJlbmNlEgwKBG5hbWUYASABKAkSQwoGb3JpZ2luGAggASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAMgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydCKcAQoORnJlaWdodFJlcXVlc3QSQwoGb3JpZ2luGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SRQoHc291cmNlcxgCIAEoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U291cmNlcyJ6Cg5GcmVpZ2h0U291cmNlcxIOCgZkaXJlY3QYASABKAgSDgoGc3RhZ2VzGAIgAygJEkgKEHJlcXVpcmVkU29ha1RpbWUYAyABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24i1wQKDUZyZWlnaHRTdGF0dXMSWQoLY3VycmVudGx5SW4YAyADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5DdXJyZW50bHlJbkVudHJ5ElcKCnZlcmlmaWVkSW4YASADKAsyQy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5WZXJpZmllZEluRW50cnkSWQoLYXBwcm92ZWRGb3IYAiADKAsyRC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cy5BcHByb3ZlZEZvckVudHJ5GmYKEEN1cnJlbnRseUluRW50cnkSCwoDa2V5GAEgASgJEkEKBXZhbHVlGAIgASgLMjIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkN1cnJlbnRTdGFnZToCOAEaZgoPVmVyaWZpZWRJbkVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmllZFN0YWdlOgI4ARpnChBBcHByb3ZlZEZvckVudHJ5EgsKA2tleRgBIAEoCRJCCgV2YWx1ZRgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BcHByb3ZlZFN0YWdlOgI4ASJ5CglHaXRDb21taXQSDwoHcmVwb1VSTBgBIAEoCRIKCgJpZBgCIAEoCRIOCgZicmFuY2gYAyABKAkSCwoDdGFnGAQgASgJEg8KB21lc3NhZ2UYBiABKAkSDgoGYXV0aG9yGAcgASgJEhEKCWNvbW1pdHRlchgIIAEoCSJuChJHaXREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRJHCgdjb21taXRzGAIgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRDb21taXQijgIKD0dpdFN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEh8KF2NvbW1pdFNlbGVjdGlvblN0cmF0ZWd5GAIgASgJEg4KBmJyYW5jaBgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAsgASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAcgASgIEhQKDGluY2x1ZGVQYXRocxgIIAMoCRIUCgxleGNsdWRlUGF0aHMYCSADKAkSFgoOZGlzY292ZXJ5TGltaXQYCiABKAUiyAEKBkhlYWx0aBIOCgZzdGF0dXMYASABKAkSDgoGaXNzdWVzGAIgAygJEk4KBmNvbmZpZxgEIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04STgoGb3V0cHV0GAUgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJvCg9IZWFsdGhDaGVja1N0ZXASDAoEdXNlcxgBIAEoCRJOCgZjb25maWcYAiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIkkKBUltYWdlEg8KB3JlcG9VUkwYASABKAkSEgoKZ2l0UmVwb1VSTBgCIAEoCRILCgN0YWcYAyABKAkSDgoGZGlnZXN0GAQgASgJIo0BChRJbWFnZURpc2NvdmVyeVJlc3VsdBIPCgdyZXBvVVJMGAEgASgJEhAKCHBsYXRmb3JtGAIgASgJElIKCnJlZmVyZW5jZXMYAyADKAsyPi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRGlzY292ZXJlZEltYWdlUmVmZXJlbmNlIvkBChFJbWFnZVN1YnNjcmlwdGlvbhIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSHgoWaW1hZ2VTZWxlY3Rpb25TdHJhdGVneRgDIAEoCRIVCg1zdHJpY3RTZW12ZXJzGAogASgIEhgKEHNlbXZlckNvbnN0cmFpbnQYBCABKAkSEQoJYWxsb3dUYWdzGAUgASgJEhIKCmlnbm9yZVRhZ3MYBiADKAkSEAoIcGxhdGZvcm0YByABKAkSHQoVaW5zZWN1cmVTa2lwVExTVmVyaWZ5GAggASgIEhYKDmRpc2NvdmVyeUxpbWl0GAkgASgFItMBCgdQcm9qZWN0EkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESPwoEc3BlYxgCIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0U3BlYxJDCgZzdGF0dXMYAyABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFN0YXR1cyKNAQoLUHJvamVjdExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdCJfCgtQcm9qZWN0U3BlYxJQChFwcm9tb3Rpb25Qb2xpY2llcxgBIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25Qb2xpY3kidAoNUHJvamVjdFN0YXR1cxJDCgpjb25kaXRpb25zGAMgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJItkBCglQcm9tb3Rpb24SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cyKRAQoNUHJvbW90aW9uTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb24iPgoPUHJvbW90aW9uUG9saWN5Eg0KBXN0YWdlGAEgASgJEhwKFGF1dG9Qcm9tb3Rpb25FbmFibGVkGAIgASgIIvIBChJQcm9tb3Rpb25SZWZlcmVuY2USDAoEbmFtZRgBIAEoCRJHCgdmcmVpZ2h0GAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cxI+CgpmaW5pc2hlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiugEKDVByb21vdGlvblNwZWMSDQoFc3RhZ2UYASABKAkSDwoHZnJlaWdodBgCIAEoCRJFCgR2YXJzGAQgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAMgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAitwQKD1Byb21vdGlvblN0YXR1cxIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBCABKAkSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJHCgdmcmVpZ2h0GAUgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USUgoRZnJlaWdodENvbGxlY3Rpb24YByABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SSwoMaGVhbHRoQ2hlY2tzGAggAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aENoZWNrU3RlcBI+CgpmaW5pc2hlZEF0GAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSEwoLY3VycmVudFN0ZXAYCSABKAMSWgoVc3RlcEV4ZWN1dGlvbk1ldGFkYXRhGAsgAygLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0ZXBFeGVjdXRpb25NZXRhZGF0YRJNCgVzdGF0ZRgKIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04i1QIKDVByb21vdGlvblN0ZXASDAoEdXNlcxgBIAEoCRJKCgR0YXNrGAUgASgLMjwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tSZWZlcmVuY2USCgoCYXMYAiABKAkSRwoFcmV0cnkYBCABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcFJldHJ5EkUKBHZhcnMYBiADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVmFyaWFibGUSTgoGY29uZmlnGAMgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiJtChJQcm9tb3Rpb25TdGVwUmV0cnkSPwoHdGltZW91dBgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbhIWCg5lcnJvclRocmVzaG9sZBgCIAEoDSKaAQoNUHJvbW90aW9uVGFzaxJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkUKBHNwZWMYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza1NwZWMinQEKEVByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEkYKBWl0ZW1zGAIgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tMaXN0IjQKFlByb21vdGlvblRhc2tSZWZlcmVuY2USDAoEbmFtZRgBIAEoCRIMCgRraW5kGAIgASgJIp4BChFQcm9tb3Rpb25UYXNrU3BlYxJFCgR2YXJzGAEgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAIgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAiXgoRUHJvbW90aW9uVGVtcGxhdGUSSQoEc3BlYxgBIAEoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZVNwZWMiogEKFVByb21vdGlvblRlbXBsYXRlU3BlYxJFCgR2YXJzGAIgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblZhcmlhYmxlEkIKBXN0ZXBzGAEgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAiMAoRUHJvbW90aW9uVmFyaWFibGUSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSLmAQoQUmVwb1N1YnNjcmlwdGlvbhJCCgNnaXQYASABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0U3Vic2NyaXB0aW9uEkYKBWltYWdlGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlU3Vic2NyaXB0aW9uEkYKBWNoYXJ0GAMgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0U3Vic2NyaXB0aW9uIs0BCgVTdGFnZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEj0KBHNwZWMYAiABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2VTcGVjEkEKBnN0YXR1cxgDIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVN0YXR1cyKJAQoJU3RhZ2VMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjoKBWl0ZW1zGAIgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlIogCCglTdGFnZVNwZWMSDQoFc2hhcmQYBCABKAkSTgoQcmVxdWVzdGVkRnJlaWdodBgFIAMoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVxdWVzdBJSChFwcm9tb3Rpb25UZW1wbGF0ZRgGIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZRJICgx2ZXJpZmljYXRpb24YAyABKAsyMi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpY2F0aW9uIvYDCgtTdGFnZVN0YXR1cxJDCgpjb25kaXRpb25zGA0gAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYCyABKAkSDQoFcGhhc2UYASABKAkSTwoOZnJlaWdodEhpc3RvcnkYBCADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SFgoOZnJlaWdodFN1bW1hcnkYDCABKAkSPAoGaGVhbHRoGAggASgLMiwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aBIPCgdtZXNzYWdlGAkgASgJEhoKEm9ic2VydmVkR2VuZXJhdGlvbhgGIAEoAxJSChBjdXJyZW50UHJvbW90aW9uGAcgASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZRJPCg1sYXN0UHJvbW90aW9uGAogASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZSLaAQoVU3RlcEV4ZWN1dGlvbk1ldGFkYXRhEg0KBWFsaWFzGAEgASgJEj0KCXN0YXJ0ZWRBdBgCIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEj4KCmZpbmlzaGVkQXQYAyABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRISCgplcnJvckNvdW50GAQgASgNEg4KBnN0YXR1cxgFIAEoCRIPCgdtZXNzYWdlGAYgASgJIosCCgxWZXJpZmljYXRpb24SWgoRYW5hbHlzaXNUZW1wbGF0ZXMYASADKAsyPy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNUZW1wbGF0ZVJlZmVyZW5jZRJWChNhbmFseXNpc1J1bk1ldGFkYXRhGAIgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGESRwoEYXJncxgDIAMoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1bkFyZ3VtZW50Ip0CChBWZXJpZmljYXRpb25JbmZvEgoKAmlkGAQgASgJEg0KBWFjdG9yGAcgASgJEj0KCXN0YXJ0VGltZRgFIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEg0KBXBoYXNlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSTwoLYW5hbHlzaXNSdW4YAyABKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5SZWZlcmVuY2USPgoKZmluaXNoVGltZRgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIpQBCg1WZXJpZmllZFN0YWdlEj4KCnZlcmlmaWVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJDCgtsb25nZXN0U29haxgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbiLZAQoJV2FyZWhvdXNlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESQQoEc3BlYxgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTcGVjEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTdGF0dXMikQEKDVdhcmVob3VzZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPgoFaXRlbXMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlIs4BCg1XYXJlaG91c2VTcGVjEg0KBXNoYXJkGAIgASgJEkAKCGludGVydmFsGAQgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uEh0KFWZyZWlnaHRDcmVhdGlvblBvbGljeRgDIAEoCRJNCg1zdWJzY3JpcHRpb25zGAEgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlJlcG9TdWJzY3JpcHRpb24i/QEKD1dhcmVob3VzZVN0YXR1cxJDCgpjb25kaXRpb25zGAkgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBiABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAQgASgDEhUKDWxhc3RGcmVpZ2h0SUQYCCABKAkSVgoTZGlzY292ZXJlZEFydGlmYWN0cxgHIAEoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQXJ0aWZhY3RzQpcCCihjb20uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExQg5HZW5lcmF0ZWRQcm90b1ABWiRnaXRodWIuY29tL2FrdWl0eS9rYXJnby9hcGkvdjFhbHBoYTGiAgVHQ0FLQaoCJEdpdGh1Yi5Db20uQWt1aXR5LkthcmdvLkFwaS5WMWFscGhhMcoCJEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMeICMEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMVxHUEJNZXRhZGF0YeoCKUdpdGh1Yjo6Q29tOjpBa3VpdHk6OkthcmdvOjpBcGk6OlYxYWxwaGEx", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]); + fileDesc("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKnAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEkkKBWl0ZW1zGAIgAygLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrIkkKDEN1cnJlbnRTdGFnZRI5CgVzaW5jZRgBIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIrYCChNEaXNjb3ZlcmVkQXJ0aWZhY3RzEkAKDGRpc2NvdmVyZWRBdBgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEkUKA2dpdBgBIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXREaXNjb3ZlcnlSZXN1bHQSSgoGaW1hZ2VzGAIgAygLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlRGlzY292ZXJ5UmVzdWx0EkoKBmNoYXJ0cxgDIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydERpc2NvdmVyeVJlc3VsdCKwAQoQRGlzY292ZXJlZENvbW1pdBIKCgJpZBgBIAEoCRIOCgZicmFuY2gYAiABKAkSCwoDdGFnGAMgASgJEg8KB3N1YmplY3QYBCABKAkSDgoGYXV0aG9yGAUgASgJEhEKCWNvbW1pdHRlchgGIAEoCRI/CgtjcmVhdG9yRGF0ZRgHIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIooBChhEaXNjb3ZlcmVkSW1hZ2VSZWZlcmVuY2USCwoDdGFnGAEgASgJEg4KBmRpZ2VzdBgCIAEoCRISCgpnaXRSZXBvVVJMGAMgASgJEj0KCWNyZWF0ZWRBdBgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIqIDCgdGcmVpZ2h0EkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESDQoFYWxpYXMYByABKAkSQwoGb3JpZ2luGAkgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgDIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAQgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgFIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydBJDCgZzdGF0dXMYBiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFN0YXR1cyKtAgoRRnJlaWdodENvbGxlY3Rpb24SCgoCaWQYAyABKAkSUQoFaXRlbXMYASADKAsyQi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24uSXRlbXNFbnRyeRJTChN2ZXJpZmljYXRpb25IaXN0b3J5GAIgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlZlcmlmaWNhdGlvbkluZm8aZAoKSXRlbXNFbnRyeRILCgNrZXkYASABKAkSRQoFdmFsdWUYAiABKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFJlZmVyZW5jZToCOAEijQEKC0ZyZWlnaHRMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjwKBWl0ZW1zGAIgAygLMi0uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHQiKwoNRnJlaWdodE9yaWdpbhIMCgRraW5kGAEgASgJEgwKBG5hbWUYAiABKAkioQIKEEZyZWlnaHRSZWZlcmVuY2USDAoEbmFtZRgBIAEoCRJDCgZvcmlnaW4YCCABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodE9yaWdpbhJACgdjb21taXRzGAIgAygLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkdpdENvbW1pdBI7CgZpbWFnZXMYAyADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2USOwoGY2hhcnRzGAQgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0IpwBCg5GcmVpZ2h0UmVxdWVzdBJDCgZvcmlnaW4YASABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodE9yaWdpbhJFCgdzb3VyY2VzGAIgASgLMjQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTb3VyY2VzInoKDkZyZWlnaHRTb3VyY2VzEg4KBmRpcmVjdBgBIAEoCBIOCgZzdGFnZXMYAiADKAkSSAoQcmVxdWlyZWRTb2FrVGltZRgDIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbiLXBAoNRnJlaWdodFN0YXR1cxJZCgtjdXJyZW50bHlJbhgDIAMoCzJELmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U3RhdHVzLkN1cnJlbnRseUluRW50cnkSVwoKdmVyaWZpZWRJbhgBIAMoCzJDLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U3RhdHVzLlZlcmlmaWVkSW5FbnRyeRJZCgthcHByb3ZlZEZvchgCIAMoCzJELmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U3RhdHVzLkFwcHJvdmVkRm9yRW50cnkaZgoQQ3VycmVudGx5SW5FbnRyeRILCgNrZXkYASABKAkSQQoFdmFsdWUYAiABKAsyMi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ3VycmVudFN0YWdlOgI4ARpmCg9WZXJpZmllZEluRW50cnkSCwoDa2V5GAEgASgJEkIKBXZhbHVlGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlZlcmlmaWVkU3RhZ2U6AjgBGmcKEEFwcHJvdmVkRm9yRW50cnkSCwoDa2V5GAEgASgJEkIKBXZhbHVlGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFwcHJvdmVkU3RhZ2U6AjgBInkKCUdpdENvbW1pdBIPCgdyZXBvVVJMGAEgASgJEgoKAmlkGAIgASgJEg4KBmJyYW5jaBgDIAEoCRILCgN0YWcYBCABKAkSDwoHbWVzc2FnZRgGIAEoCRIOCgZhdXRob3IYByABKAkSEQoJY29tbWl0dGVyGAggASgJIm4KEkdpdERpc2NvdmVyeVJlc3VsdBIPCgdyZXBvVVJMGAEgASgJEkcKB2NvbW1pdHMYAiADKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRGlzY292ZXJlZENvbW1pdCKOAgoPR2l0U3Vic2NyaXB0aW9uEg8KB3JlcG9VUkwYASABKAkSHwoXY29tbWl0U2VsZWN0aW9uU3RyYXRlZ3kYAiABKAkSDgoGYnJhbmNoGAMgASgJEhUKDXN0cmljdFNlbXZlcnMYCyABKAgSGAoQc2VtdmVyQ29uc3RyYWludBgEIAEoCRIRCglhbGxvd1RhZ3MYBSABKAkSEgoKaWdub3JlVGFncxgGIAMoCRIdChVpbnNlY3VyZVNraXBUTFNWZXJpZnkYByABKAgSFAoMaW5jbHVkZVBhdGhzGAggAygJEhQKDGV4Y2x1ZGVQYXRocxgJIAMoCRIWCg5kaXNjb3ZlcnlMaW1pdBgKIAEoBSLIAQoGSGVhbHRoEg4KBnN0YXR1cxgBIAEoCRIOCgZpc3N1ZXMYAiADKAkSTgoGY29uZmlnGAQgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPThJOCgZvdXRwdXQYBSABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIm8KD0hlYWx0aENoZWNrU3RlcBIMCgR1c2VzGAEgASgJEk4KBmNvbmZpZxgCIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04iSQoFSW1hZ2USDwoHcmVwb1VSTBgBIAEoCRISCgpnaXRSZXBvVVJMGAIgASgJEgsKA3RhZxgDIAEoCRIOCgZkaWdlc3QYBCABKAkijQEKFEltYWdlRGlzY292ZXJ5UmVzdWx0Eg8KB3JlcG9VUkwYASABKAkSEAoIcGxhdGZvcm0YAiABKAkSUgoKcmVmZXJlbmNlcxgDIAMoCzI+LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkSW1hZ2VSZWZlcmVuY2Ui+QEKEUltYWdlU3Vic2NyaXB0aW9uEg8KB3JlcG9VUkwYASABKAkSEgoKZ2l0UmVwb1VSTBgCIAEoCRIeChZpbWFnZVNlbGVjdGlvblN0cmF0ZWd5GAMgASgJEhUKDXN0cmljdFNlbXZlcnMYCiABKAgSGAoQc2VtdmVyQ29uc3RyYWludBgEIAEoCRIRCglhbGxvd1RhZ3MYBSABKAkSEgoKaWdub3JlVGFncxgGIAMoCRIQCghwbGF0Zm9ybRgHIAEoCRIdChVpbnNlY3VyZVNraXBUTFNWZXJpZnkYCCABKAgSFgoOZGlzY292ZXJ5TGltaXQYCSABKAUi0wEKB1Byb2plY3QSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRI/CgRzcGVjGAIgASgLMjEuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3RTcGVjEkMKBnN0YXR1cxgDIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0U3RhdHVzIo0BCgtQcm9qZWN0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0Il8KC1Byb2plY3RTcGVjElAKEXByb21vdGlvblBvbGljaWVzGAEgAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblBvbGljeSJ0Cg1Qcm9qZWN0U3RhdHVzEkMKCmNvbmRpdGlvbnMYAyADKAsyLy5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuQ29uZGl0aW9uEg0KBXBoYXNlGAEgASgJEg8KB21lc3NhZ2UYAiABKAki2QEKCVByb21vdGlvbhJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkEKBHNwZWMYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3BlYxJFCgZzdGF0dXMYAyABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RhdHVzIpEBCg1Qcm9tb3Rpb25MaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEj4KBWl0ZW1zGAIgAygLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvbiI+Cg9Qcm9tb3Rpb25Qb2xpY3kSDQoFc3RhZ2UYASABKAkSHAoUYXV0b1Byb21vdGlvbkVuYWJsZWQYAiABKAgi8gEKElByb21vdGlvblJlZmVyZW5jZRIMCgRuYW1lGAEgASgJEkcKB2ZyZWlnaHQYAiABKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFJlZmVyZW5jZRJFCgZzdGF0dXMYAyABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RhdHVzEj4KCmZpbmlzaGVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSK6AQoNUHJvbW90aW9uU3BlYxINCgVzdGFnZRgBIAEoCRIPCgdmcmVpZ2h0GAIgASgJEkUKBHZhcnMYBCADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVmFyaWFibGUSQgoFc3RlcHMYAyADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCK3BAoPUHJvbW90aW9uU3RhdHVzEhoKEmxhc3RIYW5kbGVkUmVmcmVzaBgEIAEoCRINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEkcKB2ZyZWlnaHQYBSABKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFJlZmVyZW5jZRJSChFmcmVpZ2h0Q29sbGVjdGlvbhgHIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0Q29sbGVjdGlvbhJLCgxoZWFsdGhDaGVja3MYCCADKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSGVhbHRoQ2hlY2tTdGVwEj4KCmZpbmlzaGVkQXQYBiABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRITCgtjdXJyZW50U3RlcBgJIAEoAxJaChVzdGVwRXhlY3V0aW9uTWV0YWRhdGEYCyADKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RlcEV4ZWN1dGlvbk1ldGFkYXRhEk0KBXN0YXRlGAogASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiLVAgoNUHJvbW90aW9uU3RlcBIMCgR1c2VzGAEgASgJEkoKBHRhc2sYBSABKAsyPC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFza1JlZmVyZW5jZRIKCgJhcxgCIAEoCRJHCgVyZXRyeRgEIAEoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwUmV0cnkSRQoEdmFycxgGIAMoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25WYXJpYWJsZRJOCgZjb25maWcYAyABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIm0KElByb21vdGlvblN0ZXBSZXRyeRI/Cgd0aW1lb3V0GAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uEhYKDmVycm9yVGhyZXNob2xkGAIgASgNIpoBCg1Qcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKZAQoRUHJvbW90aW9uVGFza0xpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESQgoFaXRlbXMYAiADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFzayI0ChZQcm9tb3Rpb25UYXNrUmVmZXJlbmNlEgwKBG5hbWUYASABKAkSDAoEa2luZBgCIAEoCSKeAQoRUHJvbW90aW9uVGFza1NwZWMSRQoEdmFycxgBIAMoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25WYXJpYWJsZRJCCgVzdGVwcxgCIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwIl4KEVByb21vdGlvblRlbXBsYXRlEkkKBHNwZWMYASABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGVtcGxhdGVTcGVjIqIBChVQcm9tb3Rpb25UZW1wbGF0ZVNwZWMSRQoEdmFycxgCIAMoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25WYXJpYWJsZRJCCgVzdGVwcxgBIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwIjAKEVByb21vdGlvblZhcmlhYmxlEgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAki5gEKEFJlcG9TdWJzY3JpcHRpb24SQgoDZ2l0GAEgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkdpdFN1YnNjcmlwdGlvbhJGCgVpbWFnZRgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZVN1YnNjcmlwdGlvbhJGCgVjaGFydBgDIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydFN1YnNjcmlwdGlvbiLNAQoFU3RhZ2USQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRI9CgRzcGVjGAIgASgLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlU3BlYxJBCgZzdGF0dXMYAyABKAsyMS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2VTdGF0dXMiiQEKCVN0YWdlTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI6CgVpdGVtcxgCIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZSKIAgoJU3RhZ2VTcGVjEg0KBXNoYXJkGAQgASgJEk4KEHJlcXVlc3RlZEZyZWlnaHQYBSADKAsyNC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFJlcXVlc3QSUgoRcHJvbW90aW9uVGVtcGxhdGUYBiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGVtcGxhdGUSSAoMdmVyaWZpY2F0aW9uGAMgASgLMjIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlZlcmlmaWNhdGlvbiL2AwoLU3RhZ2VTdGF0dXMSQwoKY29uZGl0aW9ucxgNIAMoCzIvLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5Db25kaXRpb24SGgoSbGFzdEhhbmRsZWRSZWZyZXNoGAsgASgJEg0KBXBoYXNlGAEgASgJEk8KDmZyZWlnaHRIaXN0b3J5GAQgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uEhYKDmZyZWlnaHRTdW1tYXJ5GAwgASgJEjwKBmhlYWx0aBgIIAEoCzIsLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5IZWFsdGgSDwoHbWVzc2FnZRgJIAEoCRIaChJvYnNlcnZlZEdlbmVyYXRpb24YBiABKAMSUgoQY3VycmVudFByb21vdGlvbhgHIAEoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25SZWZlcmVuY2USTwoNbGFzdFByb21vdGlvbhgKIAEoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25SZWZlcmVuY2Ui2gEKFVN0ZXBFeGVjdXRpb25NZXRhZGF0YRINCgVhbGlhcxgBIAEoCRI9CglzdGFydGVkQXQYAiABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRI+CgpmaW5pc2hlZEF0GAMgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSEgoKZXJyb3JDb3VudBgEIAEoDRIOCgZzdGF0dXMYBSABKAkSDwoHbWVzc2FnZRgGIAEoCSKLAgoMVmVyaWZpY2F0aW9uEloKEWFuYWx5c2lzVGVtcGxhdGVzGAEgAygLMj8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USVgoTYW5hbHlzaXNSdW5NZXRhZGF0YRgCIAEoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1bk1ldGFkYXRhEkcKBGFyZ3MYAyADKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5Bcmd1bWVudCKdAgoQVmVyaWZpY2F0aW9uSW5mbxIKCgJpZBgEIAEoCRINCgVhY3RvchgHIAEoCRI9CglzdGFydFRpbWUYBSABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRINCgVwaGFzZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEk8KC2FuYWx5c2lzUnVuGAMgASgLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuUmVmZXJlbmNlEj4KCmZpbmlzaFRpbWUYBiABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSKUAQoNVmVyaWZpZWRTdGFnZRI+Cgp2ZXJpZmllZEF0GAEgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSQwoLbG9uZ2VzdFNvYWsYAiABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24i2QEKCVdhcmVob3VzZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkEKBHNwZWMYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlU3BlYxJFCgZzdGF0dXMYAyABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlU3RhdHVzIpEBCg1XYXJlaG91c2VMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEj4KBWl0ZW1zGAIgAygLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZSLOAQoNV2FyZWhvdXNlU3BlYxINCgVzaGFyZBgCIAEoCRJACghpbnRlcnZhbBgEIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbhIdChVmcmVpZ2h0Q3JlYXRpb25Qb2xpY3kYAyABKAkSTQoNc3Vic2NyaXB0aW9ucxgBIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5SZXBvU3Vic2NyaXB0aW9uIv0BCg9XYXJlaG91c2VTdGF0dXMSQwoKY29uZGl0aW9ucxgJIAMoCzIvLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5Db25kaXRpb24SGgoSbGFzdEhhbmRsZWRSZWZyZXNoGAYgASgJEhoKEm9ic2VydmVkR2VuZXJhdGlvbhgEIAEoAxIVCg1sYXN0RnJlaWdodElEGAggASgJElYKE2Rpc2NvdmVyZWRBcnRpZmFjdHMYByABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRGlzY292ZXJlZEFydGlmYWN0c0KXAgooY29tLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMUIOR2VuZXJhdGVkUHJvdG9QAVokZ2l0aHViLmNvbS9ha3VpdHkva2FyZ28vYXBpL3YxYWxwaGExogIFR0NBS0GqAiRHaXRodWIuQ29tLkFrdWl0eS5LYXJnby5BcGkuVjFhbHBoYTHKAiRHaXRodWJcQ29tXEFrdWl0eVxLYXJnb1xBcGlcVjFhbHBoYTHiAjBHaXRodWJcQ29tXEFrdWl0eVxLYXJnb1xBcGlcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAilHaXRodWI6OkNvbTo6QWt1aXR5OjpLYXJnbzo6QXBpOjpWMWFscGhhMQ", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]); /** * AnalysisRunArgument represents an argument to be added to an AnalysisRun. @@ -459,9 +459,9 @@ export type ClusterPromotionTaskList = Message<"github.com.akuity.kargo.api.v1al metadata?: ListMeta; /** - * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTaskList items = 2; + * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.ClusterPromotionTask items = 2; */ - items: ClusterPromotionTaskList[]; + items: ClusterPromotionTask[]; }; /** @@ -2194,9 +2194,9 @@ export type PromotionTaskList = Message<"github.com.akuity.kargo.api.v1alpha1.Pr metadata?: ListMeta; /** - * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionTaskList items = 2; + * @generated from field: repeated github.com.akuity.kargo.api.v1alpha1.PromotionTask items = 2; */ - items: PromotionTaskList[]; + items: PromotionTask[]; }; /** From 97cb4e62f55b63f3ef4416fdbe43d42d2b851c1c Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Tue, 17 Dec 2024 14:31:48 +0100 Subject: [PATCH 26/38] fix: small bug fixes Signed-off-by: Hidde Beydals --- .../{compose-output.json => compose-output-config.json} | 0 internal/directives/simple_engine_promote.go | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename internal/directives/schemas/{compose-output.json => compose-output-config.json} (100%) diff --git a/internal/directives/schemas/compose-output.json b/internal/directives/schemas/compose-output-config.json similarity index 100% rename from internal/directives/schemas/compose-output.json rename to internal/directives/schemas/compose-output-config.json diff --git a/internal/directives/simple_engine_promote.go b/internal/directives/simple_engine_promote.go index 26d3db30a..32ac4d817 100644 --- a/internal/directives/simple_engine_promote.go +++ b/internal/directives/simple_engine_promote.go @@ -121,10 +121,10 @@ func (e *SimpleEngine) executeSteps( aliasNamespace := getAliasNamespace(step.Alias) if aliasNamespace != "" && reg.Runner.Name() == (&outputComposer{}).Name() { if state[aliasNamespace] == nil { - state[aliasNamespace] = make(State) + state[aliasNamespace] = make(map[string]any) } for k, v := range result.Output { - state[aliasNamespace].(State)[k] = v // nolint: forcetypeassert + state[aliasNamespace].(map[string]any)[k] = v // nolint: forcetypeassert } } else { state[step.Alias] = result.Output From cb1907dce4b4930be11877e1ec3f62eb6cdabeb5 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Tue, 17 Dec 2024 21:33:46 +0100 Subject: [PATCH 27/38] fix: ensure (step) vars can access outputs Signed-off-by: Hidde Beydals --- internal/directives/promotions.go | 91 ++++++++++++++++++++----------- internal/indexer/indexer.go | 2 +- 2 files changed, 59 insertions(+), 34 deletions(-) diff --git a/internal/directives/promotions.go b/internal/directives/promotions.go index 362ac84cd..dc26adaf0 100644 --- a/internal/directives/promotions.go +++ b/internal/directives/promotions.go @@ -143,37 +143,35 @@ func (s *PromotionStep) GetConfig( return nil, nil } - vars, err := s.GetVars(promoCtx) + vars, err := s.GetVars(promoCtx, state) if err != nil { return nil, err } - // If the alias has a namespace, filter the state to only include keys that - // belong to that namespace. - outputs := state - if namespace := getAliasNamespace(s.Alias); namespace != "" { - outputs = make(State) - for k, v := range state.DeepCopy() { - if getAliasNamespace(k) == namespace { - // Strip the namespace from the key before adding it to the - // filtered outputs. - outputs[k[len(namespace)+2:]] = v - } + env := map[string]any{ + "ctx": map[string]any{ + "project": promoCtx.Project, + "promotion": promoCtx.Promotion, + "stage": promoCtx.Stage, + }, + "vars": vars, + "secrets": promoCtx.Secrets, + "outputs": state, + } + + // Ensure that if the PromotionStep originated from a task, the task outputs + // are available to the PromotionStep. This allows inflated steps to access + // the outputs of the other steps in the task without needing to know the + // alias (namespace) of the task. + if taskOutput := s.getTaskOutputs(state); taskOutput != nil { + env["task"] = map[string]any{ + "outputs": taskOutput, } } evaledCfgJSON, err := expressions.EvaluateJSONTemplate( s.Config, - map[string]any{ - "ctx": map[string]any{ - "project": promoCtx.Project, - "promotion": promoCtx.Promotion, - "stage": promoCtx.Stage, - }, - "vars": vars, - "secrets": promoCtx.Secrets, - "outputs": outputs, - }, + env, expr.Function("warehouse", warehouseFunc, new(func(string) kargoapi.FreightOrigin)), expr.Function( "commitFrom", @@ -208,7 +206,10 @@ func (s *PromotionStep) GetConfig( // GetVars returns the variables defined in the PromotionStep. The variables are // evaluated in the context of the provided PromotionContext. -func (s *PromotionStep) GetVars(promoCtx PromotionContext) (map[string]any, error) { +func (s *PromotionStep) GetVars( + promoCtx PromotionContext, + state State, +) (map[string]any, error) { var rawVars = make(map[string]string, len(promoCtx.Vars)) for _, v := range promoCtx.Vars { rawVars[v.Name] = v.Value @@ -217,19 +218,27 @@ func (s *PromotionStep) GetVars(promoCtx PromotionContext) (map[string]any, erro rawVars[v.Name] = v.Value } + taskOutput := s.getTaskOutputs(state) + vars := make(map[string]any, len(rawVars)) for k, v := range rawVars { - newVar, err := expressions.EvaluateTemplate( - v, - map[string]any{ - "ctx": map[string]any{ - "project": promoCtx.Project, - "promotion": promoCtx.Promotion, - "stage": promoCtx.Stage, - }, - "vars": vars, + env := map[string]any{ + "ctx": map[string]any{ + "project": promoCtx.Project, + "promotion": promoCtx.Promotion, + "stage": promoCtx.Stage, }, - ) + "vars": vars, + "outputs": state, + } + + if taskOutput != nil { + env["task"] = map[string]any{ + "outputs": taskOutput, + } + } + + newVar, err := expressions.EvaluateTemplate(v, env) if err != nil { return nil, fmt.Errorf("error pre-processing promotion variable %q: %w", k, err) } @@ -238,6 +247,22 @@ func (s *PromotionStep) GetVars(promoCtx PromotionContext) (map[string]any, erro return vars, nil } +// getTaskOutputs returns the outputs of a task that are relevant to the current +// step. This is useful when a step is inflated from a task and needs to access +// the outputs of that task. +func (s *PromotionStep) getTaskOutputs(state State) State { + if namespace := getAliasNamespace(s.Alias); namespace != "" { + taskOutputs := make(State) + for k, v := range state.DeepCopy() { + if getAliasNamespace(k) == namespace { + taskOutputs[k[len(namespace)+2:]] = v + } + } + return taskOutputs + } + return nil +} + // PromotionResult is the result of a user-defined promotion process executed by // the Engine. It aggregates the status and output of the individual // PromotionStepResults returned by the PromotionStepRunner executing each diff --git a/internal/indexer/indexer.go b/internal/indexer/indexer.go index 52f38a3cc..87fbdb336 100644 --- a/internal/indexer/indexer.go +++ b/internal/indexer/indexer.go @@ -169,7 +169,7 @@ func RunningPromotionsByArgoCDApplications( Promotion: promo.Name, Vars: promo.Spec.Vars, } - vars, err := dirStep.GetVars(promoCtx) + vars, err := dirStep.GetVars(promoCtx, promoCtx.State) if err != nil { logger.Error( err, From 8d4cae6f8387807200a40e2390e05891005992ba Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Tue, 17 Dec 2024 22:42:52 +0100 Subject: [PATCH 28/38] fix: add `task-` to reserved aliases Signed-off-by: Hidde Beydals --- internal/directives/promotions.go | 3 ++- internal/directives/simple_engine.go | 2 +- internal/kargo/promotion_builder.go | 10 +++++----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/internal/directives/promotions.go b/internal/directives/promotions.go index dc26adaf0..fda35fe12 100644 --- a/internal/directives/promotions.go +++ b/internal/directives/promotions.go @@ -15,6 +15,7 @@ import ( "github.com/akuity/kargo/internal/controller/freight" "github.com/akuity/kargo/internal/credentials" "github.com/akuity/kargo/internal/expressions" + "github.com/akuity/kargo/internal/kargo" ) // PromotionStepRunner is an interface for components that implement the logic for @@ -472,7 +473,7 @@ func getChartFunc( // The namespace part is the part before the first "::" separator. Typically, // this is used for steps inflated from a task. func getAliasNamespace(alias string) string { - parts := strings.Split(alias, "::") + parts := strings.Split(alias, kargo.PromotionAliasSeparator) if len(parts) != 2 { return "" } diff --git a/internal/directives/simple_engine.go b/internal/directives/simple_engine.go index b56a0871f..80c58862a 100644 --- a/internal/directives/simple_engine.go +++ b/internal/directives/simple_engine.go @@ -10,7 +10,7 @@ import ( // ReservedStepAliasRegex is a regular expression that matches step aliases that // are reserved for internal use. -var ReservedStepAliasRegex = regexp.MustCompile(`^step-\d+$`) +var ReservedStepAliasRegex = regexp.MustCompile(`^(step|task)-\d+$`) // SimpleEngine is a simple engine that executes a list of PromotionSteps in // sequence. diff --git a/internal/kargo/promotion_builder.go b/internal/kargo/promotion_builder.go index ff3386fc4..3513b42c0 100644 --- a/internal/kargo/promotion_builder.go +++ b/internal/kargo/promotion_builder.go @@ -15,13 +15,13 @@ import ( ) const ( + // PromotionAliasSeparator is the separator used in the Promotion step alias + // to separate the task alias from the step alias. + PromotionAliasSeparator = "::" + // nameSeparator is the separator used in the Promotion name. nameSeparator = "." - // aliasSeparator is the separator used in the Promotion step alias - // to separate the task alias from the step alias. - aliasSeparator = "::" - // ulidLength is the length of the ULID string. ulidLength = ulid.EncodedSize @@ -217,7 +217,7 @@ func generatePromotionName(stageName, freight string) string { // generatePromotionTaskStepAlias generates an alias for a PromotionTask step // by combining the task alias and the step alias. func generatePromotionTaskStepAlias(taskAlias, stepAlias string) string { - return fmt.Sprintf("%s%s%s", taskAlias, aliasSeparator, stepAlias) + return fmt.Sprintf("%s%s%s", taskAlias, PromotionAliasSeparator, stepAlias) } // promotionTaskVarsToStepVars validates the presence of the PromotionTask From 474288f7f10197b7f05c27f1e05a762fc98bee8a Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Tue, 17 Dec 2024 22:59:34 +0100 Subject: [PATCH 29/38] fix(chart): allow API permissions to `Cluster)PromotionTask` Signed-off-by: Hidde Beydals --- charts/kargo/templates/api/cluster-role.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/charts/kargo/templates/api/cluster-role.yaml b/charts/kargo/templates/api/cluster-role.yaml index f1b6b6d25..92393aa2a 100644 --- a/charts/kargo/templates/api/cluster-role.yaml +++ b/charts/kargo/templates/api/cluster-role.yaml @@ -76,7 +76,9 @@ rules: - apiGroups: - kargo.akuity.io resources: + - clusterpromotiontasks - projects + - promotiontasks - stages - warehouses verbs: From 18a666d77d24aaeee787a925ee9b7e6d5c756925 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Wed, 18 Dec 2024 15:49:55 +0100 Subject: [PATCH 30/38] feat: add validation webhook for PromotionTask Signed-off-by: Hidde Beydals --- charts/kargo/templates/webhooks/webhooks.yaml | 15 +++ cmd/controlplane/webhooks.go | 4 + internal/webhook/promotiontask/webhook.go | 51 ++++++++++ .../webhook/promotiontask/webhook_test.go | 94 +++++++++++++++++++ 4 files changed, 164 insertions(+) create mode 100644 internal/webhook/promotiontask/webhook.go create mode 100644 internal/webhook/promotiontask/webhook_test.go diff --git a/charts/kargo/templates/webhooks/webhooks.yaml b/charts/kargo/templates/webhooks/webhooks.yaml index 47200022a..2dec7d37f 100644 --- a/charts/kargo/templates/webhooks/webhooks.yaml +++ b/charts/kargo/templates/webhooks/webhooks.yaml @@ -39,6 +39,21 @@ webhooks: resources: ["promotions"] operations: ["CREATE", "UPDATE"] failurePolicy: Fail +- name: promotiontask.kargo.akuity.io + admissionReviewVersions: [ "v1" ] + sideEffects: None + clientConfig: + service: + namespace: {{ .Release.Namespace }} + name: kargo-webhooks-server + path: /validate-kargo-akuity-io-v1alpha1-promotiontask + rules: + - scope: Namespaced + apiGroups: ["kargo.akuity.io"] + apiVersions: ["v1alpha1"] + resources: ["promotiontasks"] + operations: ["CREATE"] + failurePolicy: Fail - name: stage.kargo.akuity.io admissionReviewVersions: ["v1"] sideEffects: None diff --git a/cmd/controlplane/webhooks.go b/cmd/controlplane/webhooks.go index 2d50bffe9..0d6780651 100644 --- a/cmd/controlplane/webhooks.go +++ b/cmd/controlplane/webhooks.go @@ -24,6 +24,7 @@ import ( "github.com/akuity/kargo/internal/webhook/freight" "github.com/akuity/kargo/internal/webhook/project" "github.com/akuity/kargo/internal/webhook/promotion" + "github.com/akuity/kargo/internal/webhook/promotiontask" "github.com/akuity/kargo/internal/webhook/stage" "github.com/akuity/kargo/internal/webhook/warehouse" ) @@ -135,6 +136,9 @@ func (o *webhooksServerOptions) run(ctx context.Context) error { if err = promotion.SetupWebhookWithManager(ctx, webhookCfg, mgr); err != nil { return fmt.Errorf("setup Promotion webhook: %w", err) } + if err = promotiontask.SetupWebhookWithManager(mgr); err != nil { + return fmt.Errorf("setup PromotionTask webhook: %w", err) + } if err = stage.SetupWebhookWithManager(webhookCfg, mgr); err != nil { return fmt.Errorf("setup Stage webhook: %w", err) } diff --git a/internal/webhook/promotiontask/webhook.go b/internal/webhook/promotiontask/webhook.go new file mode 100644 index 000000000..3b91a22e5 --- /dev/null +++ b/internal/webhook/promotiontask/webhook.go @@ -0,0 +1,51 @@ +package promotiontask + +import ( + "context" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" + + kargoapi "github.com/akuity/kargo/api/v1alpha1" + libWebhook "github.com/akuity/kargo/internal/webhook" +) + +var promotionTaskGroupKind = schema.GroupKind{ + Group: kargoapi.GroupVersion.Group, + Kind: "PromotionTask", +} + +type webhook struct { + client client.Client +} + +func SetupWebhookWithManager( + mgr ctrl.Manager, +) error { + w := &webhook{ + client: mgr.GetClient(), + } + return ctrl.NewWebhookManagedBy(mgr). + For(&kargoapi.PromotionTask{}). + WithValidator(w). + Complete() +} + +func (w *webhook) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { + template := obj.(*kargoapi.PromotionTask) // nolint: forcetypeassert + if err := libWebhook.ValidateProject(ctx, w.client, promotionTaskGroupKind, template); err != nil { + return nil, err + } + return nil, nil +} + +func (w *webhook) ValidateUpdate(context.Context, runtime.Object, runtime.Object) (admission.Warnings, error) { + return nil, nil +} + +func (w *webhook) ValidateDelete(context.Context, runtime.Object) (admission.Warnings, error) { + return nil, nil +} diff --git a/internal/webhook/promotiontask/webhook_test.go b/internal/webhook/promotiontask/webhook_test.go new file mode 100644 index 000000000..4c3cf1046 --- /dev/null +++ b/internal/webhook/promotiontask/webhook_test.go @@ -0,0 +1,94 @@ +package promotiontask + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + corev1 "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" + + kargoapi "github.com/akuity/kargo/api/v1alpha1" +) + +func Test_webhook_ValidateCreate(t *testing.T) { + scheme := runtime.NewScheme() + require.NoError(t, corev1.AddToScheme(scheme)) + require.NoError(t, kargoapi.AddToScheme(scheme)) + + tests := []struct { + name string + objects []client.Object + template *kargoapi.PromotionTask + assertions func(*testing.T, admission.Warnings, error) + }{ + { + name: "project does not exist", + objects: []client.Object{ + &corev1.Namespace{ + ObjectMeta: v1.ObjectMeta{ + Name: "fake-project", + }, + }, + }, + template: &kargoapi.PromotionTask{ + ObjectMeta: v1.ObjectMeta{ + Name: "fake-template", + Namespace: "fake-project", + }, + }, + assertions: func(t *testing.T, warnings admission.Warnings, err error) { + assert.Empty(t, warnings) + assert.ErrorContains(t, err, "namespace \"fake-project\" is not a project") + }, + }, + { + name: "project exists", + objects: []client.Object{ + &corev1.Namespace{ + ObjectMeta: v1.ObjectMeta{ + Name: "fake-project", + Labels: map[string]string{ + kargoapi.ProjectLabelKey: kargoapi.LabelTrueValue, + }, + }, + }, + &kargoapi.Project{ + ObjectMeta: v1.ObjectMeta{ + Name: "fake-project", + }, + }, + }, + template: &kargoapi.PromotionTask{ + ObjectMeta: v1.ObjectMeta{ + Name: "fake-template", + Namespace: "fake-project", + }, + }, + assertions: func(t *testing.T, warnings admission.Warnings, err error) { + assert.Empty(t, warnings) + assert.NoError(t, err) + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := fake.NewClientBuilder(). + WithObjects(tt.objects...). + WithScheme(scheme). + Build() + + w := &webhook{ + client: c, + } + + got, err := w.ValidateCreate(context.Background(), tt.template) + tt.assertions(t, got, err) + }) + } +} From 82d629cc9ceb8e04a1d654655066a2845c5dbaed Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Wed, 18 Dec 2024 15:52:47 +0100 Subject: [PATCH 31/38] chore: run codegen Signed-off-by: Hidde Beydals --- .../{compose-output.json => compose-output-config.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ui/src/gen/directives/{compose-output.json => compose-output-config.json} (100%) diff --git a/ui/src/gen/directives/compose-output.json b/ui/src/gen/directives/compose-output-config.json similarity index 100% rename from ui/src/gen/directives/compose-output.json rename to ui/src/gen/directives/compose-output-config.json From 51fc8052ada2c0a9ec81034f1adb016ec9dc30e5 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Wed, 18 Dec 2024 17:08:58 +0100 Subject: [PATCH 32/38] fix(chart): add permissions to kargo-admin role Signed-off-by: Hidde Beydals --- charts/kargo/templates/users/cluster-roles.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/charts/kargo/templates/users/cluster-roles.yaml b/charts/kargo/templates/users/cluster-roles.yaml index 1f6b35cbc..f0ebb9014 100644 --- a/charts/kargo/templates/users/cluster-roles.yaml +++ b/charts/kargo/templates/users/cluster-roles.yaml @@ -29,8 +29,10 @@ rules: - apiGroups: - kargo.akuity.io resources: + - clusterpromotiontasks - freights - projects + - promotiontasks - stages - warehouses verbs: From 68d62fe239f8018460b09f561fd1ba60ee8298a4 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Thu, 19 Dec 2024 20:45:38 +0100 Subject: [PATCH 33/38] chore: remove redundant test Signed-off-by: Hidde Beydals --- internal/kargo/kargo_test.go | 86 ------------------------------------ 1 file changed, 86 deletions(-) diff --git a/internal/kargo/kargo_test.go b/internal/kargo/kargo_test.go index da5abc9f7..7ae6f2a9e 100644 --- a/internal/kargo/kargo_test.go +++ b/internal/kargo/kargo_test.go @@ -1,8 +1,6 @@ package kargo import ( - "context" - "strings" "testing" "github.com/stretchr/testify/require" @@ -14,90 +12,6 @@ import ( "github.com/akuity/kargo/internal/logging" ) -func TestNewPromotion(t *testing.T) { - const ( - testFreight = "f08b2e72c9b2b7b263da6d55f9536e49b5ce972c" - veryLongResourceName = "the-kubernetes-maximum-length-of-a-label-value-is-only-sixty-" + - "three-characters-meanwhile-the-maximum-length-of-a-kubernetes-resource-name-" + - "is-two-hundred-and-fifty-three-characters-but-this-string-is-two-hundred-" + - "and-thirty-seven-characters" - ) - t.Parallel() - testCases := []struct { - name string - stage kargoapi.Stage - freight string - assertions func(*testing.T, kargoapi.Stage, kargoapi.Promotion) - }{ - { - name: "Promote stage", - stage: kargoapi.Stage{ - ObjectMeta: metav1.ObjectMeta{ - UID: "80b44831-ac8d-4900-9df9-ee95f80c0fae", - Name: "test", - Namespace: "kargo-demo", - }, - Spec: kargoapi.StageSpec{ - PromotionTemplate: &kargoapi.PromotionTemplate{ - Spec: kargoapi.PromotionTemplateSpec{ - Steps: []kargoapi.PromotionStep{ - { - Uses: "fake-step", - }, - }, - }, - }, - }, - }, - freight: testFreight, - assertions: func(t *testing.T, _ kargoapi.Stage, promo kargoapi.Promotion) { - parts := strings.Split(promo.Name, ".") - require.Equal(t, "test", parts[0]) - require.Equal(t, testFreight[0:7], parts[2]) - }, - }, - { - name: "Promote stage with very long name", - stage: kargoapi.Stage{ - ObjectMeta: metav1.ObjectMeta{ - UID: "80b44831-ac8d-4900-9df9-ee95f80c0fae", - Name: veryLongResourceName, - Namespace: "kargo-demo", - }, - Spec: kargoapi.StageSpec{ - PromotionTemplate: &kargoapi.PromotionTemplate{ - Spec: kargoapi.PromotionTemplateSpec{ - Steps: []kargoapi.PromotionStep{ - { - Uses: "fake-step", - }, - }, - }, - }, - }, - }, - freight: testFreight, - assertions: func(t *testing.T, _ kargoapi.Stage, promo kargoapi.Promotion) { - require.Len(t, promo.Name, 253) - parts := strings.Split(promo.Name, ".") - require.Equal(t, veryLongResourceName[0:maxStageNamePrefixLength], parts[0]) - require.Equal(t, testFreight[0:7], parts[2]) - }, - }, - } - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - promo, err := NewPromotionBuilder(nil).Build(context.TODO(), tc.stage, tc.freight) - require.NoError(t, err) - require.Equal(t, tc.freight, promo.Spec.Freight) - require.Equal(t, tc.stage.Name, promo.Spec.Stage) - require.Equal(t, tc.freight, promo.Spec.Freight) - require.LessOrEqual(t, len(promo.Name), 253) - tc.assertions(t, tc.stage, *promo) - }) - } -} - func TestPromoPhaseChanged_Update(t *testing.T) { tests := []struct { name string From 0891669d03233354264e9204ff0d7b3e003d1ceb Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Thu, 19 Dec 2024 21:03:32 +0100 Subject: [PATCH 34/38] chore: tiny bit of `compose-output` documentation Signed-off-by: Hidde Beydals --- internal/directives/output_composer.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/internal/directives/output_composer.go b/internal/directives/output_composer.go index 3ece6bcdc..59a9c6776 100644 --- a/internal/directives/output_composer.go +++ b/internal/directives/output_composer.go @@ -23,6 +23,18 @@ func init() { // references to outputs from previous steps, this allows for remapping // the outputs of previous steps to new keys, or even combining them // into new structures. +// +// An example configuration for this step would look like this: +// +// step: compose-output +// as: custom-outputs +// config: +// prURL: ${{ vars.repoURL }}/pull/${{ outputs['open-pr'].prNumber }} +// mergeCommit: ${{ outputs['wait-for-pr'].commit }} +// +// This would create a new output named `custom-outputs` with the keys +// `prURL` and `mergeCommit`, which could be used in subsequent steps +// using e.g. `${{ outputs.custom-outputs.prURL }}`. type outputComposer struct { schemaLoader gojsonschema.JSONLoader } From 06720fd4f91c8bfedc743fb6ac61a9c716d10260 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Thu, 19 Dec 2024 22:33:24 +0100 Subject: [PATCH 35/38] chore: move task inflation to mutating webhook Signed-off-by: Hidde Beydals --- .../webhooks-server/cluster-role.yaml | 2 + internal/directives/output_composer.go | 10 +- internal/kargo/promotion_builder.go | 29 ++-- internal/kargo/promotion_builder_test.go | 159 +++++++----------- internal/webhook/promotion/webhook.go | 15 +- 5 files changed, 85 insertions(+), 130 deletions(-) diff --git a/charts/kargo/templates/webhooks-server/cluster-role.yaml b/charts/kargo/templates/webhooks-server/cluster-role.yaml index 45a913626..ffe528fae 100644 --- a/charts/kargo/templates/webhooks-server/cluster-role.yaml +++ b/charts/kargo/templates/webhooks-server/cluster-role.yaml @@ -42,8 +42,10 @@ rules: - apiGroups: - kargo.akuity.io resources: + - clusterpromotiontasks - freights - projects + - promotiontasks - stages - warehouses verbs: diff --git a/internal/directives/output_composer.go b/internal/directives/output_composer.go index 59a9c6776..99dc9ec11 100644 --- a/internal/directives/output_composer.go +++ b/internal/directives/output_composer.go @@ -26,11 +26,11 @@ func init() { // // An example configuration for this step would look like this: // -// step: compose-output -// as: custom-outputs -// config: -// prURL: ${{ vars.repoURL }}/pull/${{ outputs['open-pr'].prNumber }} -// mergeCommit: ${{ outputs['wait-for-pr'].commit }} +// step: compose-output +// as: custom-outputs +// config: +// prURL: ${{ vars.repoURL }}/pull/${{ outputs['open-pr'].prNumber }} +// mergeCommit: ${{ outputs['wait-for-pr'].commit }} // // This would create a new output named `custom-outputs` with the keys // `prURL` and `mergeCommit`, which could be used in subsequent steps diff --git a/internal/kargo/promotion_builder.go b/internal/kargo/promotion_builder.go index 3513b42c0..fb5fb5200 100644 --- a/internal/kargo/promotion_builder.go +++ b/internal/kargo/promotion_builder.go @@ -70,12 +70,6 @@ func (b *PromotionBuilder) Build( annotations[kargoapi.AnnotationKeyCreateActor] = kargoapi.FormatEventUserActor(u) } - // Build steps - steps, err := b.buildSteps(ctx, stage) - if err != nil { - return nil, fmt.Errorf("failed to build promotion steps: %w", err) - } - promotion := kargoapi.Promotion{ ObjectMeta: metav1.ObjectMeta{ Name: generatePromotionName(stage.Name, freight), @@ -86,37 +80,38 @@ func (b *PromotionBuilder) Build( Stage: stage.Name, Freight: freight, Vars: stage.Spec.PromotionTemplate.Spec.Vars, - Steps: steps, + Steps: stage.Spec.PromotionTemplate.Spec.Steps, }, } return &promotion, nil } -// buildSteps processes the Promotion steps from the PromotionTemplate of the -// given Stage. If a PromotionStep references a PromotionTask, the task is -// retrieved and its steps are inflated with the given task inputs. -func (b *PromotionBuilder) buildSteps(ctx context.Context, stage kargoapi.Stage) ([]kargoapi.PromotionStep, error) { - steps := make([]kargoapi.PromotionStep, 0, len(stage.Spec.PromotionTemplate.Spec.Steps)) - for i, step := range stage.Spec.PromotionTemplate.Spec.Steps { +// InflateSteps inflates the Promotion steps by resolving any references to +// PromotionTasks and expanding them into their individual steps. The inflated +// steps are then set on the Promotion, replacing the original steps. +func (b *PromotionBuilder) InflateSteps(ctx context.Context, promo *kargoapi.Promotion) error { + steps := make([]kargoapi.PromotionStep, 0, len(promo.Spec.Steps)) + for i, step := range promo.Spec.Steps { switch { case step.Task != nil: alias := step.GetAlias(i) taskSteps, err := b.inflateTaskSteps( ctx, - stage.Namespace, + promo.Namespace, alias, - stage.Spec.PromotionTemplate.Spec.Vars, + promo.Spec.Vars, step, ) if err != nil { - return nil, fmt.Errorf("inflate tasks steps for task %q (%q): %w", step.Task.Name, alias, err) + return fmt.Errorf("inflate tasks steps for task %q (%q): %w", step.Task.Name, alias, err) } steps = append(steps, taskSteps...) default: steps = append(steps, step) } } - return steps, nil + promo.Spec.Steps = steps + return nil } // inflateTaskSteps inflates the PromotionSteps for the given PromotionStep diff --git a/internal/kargo/promotion_builder_test.go b/internal/kargo/promotion_builder_test.go index a4b332d7d..f40fbb015 100644 --- a/internal/kargo/promotion_builder_test.go +++ b/internal/kargo/promotion_builder_test.go @@ -28,7 +28,6 @@ func TestPromotionBuilder_Build(t *testing.T) { stage kargoapi.Stage freight string userInfo user.Info - objects []client.Object assertions func(*testing.T, *kargoapi.Promotion, error) }{ { @@ -127,7 +126,7 @@ func TestPromotionBuilder_Build(t *testing.T) { }, }, { - name: "successful build with task steps and user info", + name: "successful build with user info", stage: kargoapi.Stage{ ObjectMeta: metav1.ObjectMeta{ Name: "test-stage", @@ -155,39 +154,12 @@ func TestPromotionBuilder_Build(t *testing.T) { userInfo: user.Info{ IsAdmin: true, }, - objects: []client.Object{ - &kargoapi.PromotionTask{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-task", - Namespace: "test-project", - }, - Spec: kargoapi.PromotionTaskSpec{ - Vars: []kargoapi.PromotionVariable{ - {Name: "input1"}, - }, - Steps: []kargoapi.PromotionStep{ - { - As: "sub-step", - Uses: "other-fake-step", - }, - }, - }, - }, - }, assertions: func(t *testing.T, promotion *kargoapi.Promotion, err error) { require.NoError(t, err) require.NotNil(t, promotion) // Check metadata including user annotation assert.Equal(t, kargoapi.EventActorAdmin, promotion.Annotations[kargoapi.AnnotationKeyCreateActor]) - - // Check steps - require.Len(t, promotion.Spec.Steps, 1) - assert.Equal(t, "task-step::sub-step", promotion.Spec.Steps[0].As) - assert.Equal(t, "other-fake-step", promotion.Spec.Steps[0].Uses) - assert.ElementsMatch(t, []kargoapi.PromotionVariable{ - {Name: "input1", Value: "value1"}, - }, promotion.Spec.Steps[0].Vars) }, }, } @@ -198,7 +170,6 @@ func TestPromotionBuilder_Build(t *testing.T) { c := fake.NewClientBuilder(). WithScheme(s). - WithObjects(tt.objects...). Build() b := NewPromotionBuilder(c) @@ -208,58 +179,49 @@ func TestPromotionBuilder_Build(t *testing.T) { } } -func TestPromotionBuilder_buildSteps(t *testing.T) { +func TestPromotionBuilder_InflateSteps(t *testing.T) { s := runtime.NewScheme() require.NoError(t, kargoapi.AddToScheme(s)) tests := []struct { name string - stage kargoapi.Stage + promo kargoapi.Promotion objects []client.Object assertions func(*testing.T, []kargoapi.PromotionStep, error) }{ { name: "task not found returns error", - stage: kargoapi.Stage{ + promo: kargoapi.Promotion{ ObjectMeta: metav1.ObjectMeta{ - Name: "test-stage", + Name: "test-promotion", Namespace: "test-project", }, - Spec: kargoapi.StageSpec{ - PromotionTemplate: &kargoapi.PromotionTemplate{ - Spec: kargoapi.PromotionTemplateSpec{ - Steps: []kargoapi.PromotionStep{ - { - Task: &kargoapi.PromotionTaskReference{ - Name: "missing-task", - }, - }, + Spec: kargoapi.PromotionSpec{ + Steps: []kargoapi.PromotionStep{ + { + Task: &kargoapi.PromotionTaskReference{ + Name: "missing-task", }, }, }, }, }, - assertions: func(t *testing.T, steps []kargoapi.PromotionStep, err error) { + assertions: func(t *testing.T, _ []kargoapi.PromotionStep, err error) { assert.ErrorContains(t, err, "not found") - assert.Nil(t, steps) }, }, { name: "single direct step", - stage: kargoapi.Stage{ + promo: kargoapi.Promotion{ ObjectMeta: metav1.ObjectMeta{ - Name: "test-stage", + Name: "test-promotion", Namespace: "test-project", }, - Spec: kargoapi.StageSpec{ - PromotionTemplate: &kargoapi.PromotionTemplate{ - Spec: kargoapi.PromotionTemplateSpec{ - Steps: []kargoapi.PromotionStep{ - { - As: "direct-step", - Uses: "fake-step", - }, - }, + Spec: kargoapi.PromotionSpec{ + Steps: []kargoapi.PromotionStep{ + { + As: "direct-step", + Uses: "fake-step", }, }, }, @@ -274,28 +236,24 @@ func TestPromotionBuilder_buildSteps(t *testing.T) { }, { name: "mix of direct and task steps", - stage: kargoapi.Stage{ + promo: kargoapi.Promotion{ ObjectMeta: metav1.ObjectMeta{ - Name: "test-stage", + Name: "test-promotion", Namespace: "test-project", }, - Spec: kargoapi.StageSpec{ - PromotionTemplate: &kargoapi.PromotionTemplate{ - Spec: kargoapi.PromotionTemplateSpec{ - Steps: []kargoapi.PromotionStep{ - { - As: "direct-step", - Uses: "fake-step", - }, - { - As: "task-step", - Task: &kargoapi.PromotionTaskReference{ - Name: "test-task", - }, - Vars: []kargoapi.PromotionVariable{ - {Name: "input1", Value: "value1"}, - }, - }, + Spec: kargoapi.PromotionSpec{ + Steps: []kargoapi.PromotionStep{ + { + As: "direct-step", + Uses: "fake-step", + }, + { + As: "task-step", + Task: &kargoapi.PromotionTaskReference{ + Name: "test-task", + }, + Vars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "value1"}, }, }, }, @@ -338,34 +296,30 @@ func TestPromotionBuilder_buildSteps(t *testing.T) { }, { name: "multiple task steps", - stage: kargoapi.Stage{ + promo: kargoapi.Promotion{ ObjectMeta: metav1.ObjectMeta{ - Name: "test-stage", + Name: "test-promotion", Namespace: "test-project", }, - Spec: kargoapi.StageSpec{ - PromotionTemplate: &kargoapi.PromotionTemplate{ - Spec: kargoapi.PromotionTemplateSpec{ - Steps: []kargoapi.PromotionStep{ - { - As: "task1", - Task: &kargoapi.PromotionTaskReference{ - Name: "test-task-1", - }, - Vars: []kargoapi.PromotionVariable{ - {Name: "input1", Value: "value1"}, - }, - }, - { - As: "task2", - Task: &kargoapi.PromotionTaskReference{ - Kind: "ClusterPromotionTask", - Name: "test-task-2", - }, - Vars: []kargoapi.PromotionVariable{ - {Name: "input2", Value: "value2"}, - }, - }, + Spec: kargoapi.PromotionSpec{ + Steps: []kargoapi.PromotionStep{ + { + As: "task1", + Task: &kargoapi.PromotionTaskReference{ + Name: "test-task-1", + }, + Vars: []kargoapi.PromotionVariable{ + {Name: "input1", Value: "value1"}, + }, + }, + { + As: "task2", + Task: &kargoapi.PromotionTaskReference{ + Kind: "ClusterPromotionTask", + Name: "test-task-2", + }, + Vars: []kargoapi.PromotionVariable{ + {Name: "input2", Value: "value2"}, }, }, }, @@ -433,8 +387,9 @@ func TestPromotionBuilder_buildSteps(t *testing.T) { Build() b := NewPromotionBuilder(c) - steps, err := b.buildSteps(context.Background(), tt.stage) - tt.assertions(t, steps, err) + p := tt.promo.DeepCopy() + err := b.InflateSteps(context.Background(), p) + tt.assertions(t, p.Spec.Steps, err) }) } } diff --git a/internal/webhook/promotion/webhook.go b/internal/webhook/promotion/webhook.go index e0895ce81..4c539e23d 100644 --- a/internal/webhook/promotion/webhook.go +++ b/internal/webhook/promotion/webhook.go @@ -21,6 +21,7 @@ import ( kargoapi "github.com/akuity/kargo/api/v1alpha1" kargoEvent "github.com/akuity/kargo/internal/event" + "github.com/akuity/kargo/internal/kargo" libEvent "github.com/akuity/kargo/internal/kubernetes/event" "github.com/akuity/kargo/internal/logging" libWebhook "github.com/akuity/kargo/internal/webhook" @@ -116,8 +117,7 @@ func newWebhook( w.authorizeFn = w.authorize w.admissionRequestFromContextFn = admission.RequestFromContext w.createSubjectAccessReviewFn = w.client.Create - w.isRequestFromKargoControlplaneFn = - libWebhook.IsRequestFromKargoControlplane(cfg.ControlplaneUserRegex) + w.isRequestFromKargoControlplaneFn = libWebhook.IsRequestFromKargoControlplane(cfg.ControlplaneUserRegex) return w } @@ -146,12 +146,16 @@ func (w *webhook) Default(ctx context.Context, obj runtime.Object) error { // Set actor as an admission request's user info when the promotion is created // to allow controllers to track who created it. if !w.isRequestFromKargoControlplaneFn(req) { - promo.Annotations[kargoapi.AnnotationKeyCreateActor] = - kargoapi.FormatEventKubernetesUserActor(req.UserInfo) + promo.Annotations[kargoapi.AnnotationKeyCreateActor] = kargoapi.FormatEventKubernetesUserActor(req.UserInfo) } // Enrich the annotation with the actor and control plane information. w.setAbortAnnotationActor(req, nil, promo) + + // Inflate any PromotionTasks in the Promotion's steps + if err = kargo.NewPromotionBuilder(w.client).InflateSteps(ctx, promo); err != nil { + return fmt.Errorf("failed to inflate Promotion steps: %w", err) + } case admissionv1.Update: // Ensure actor annotation immutability if oldActor, ok := oldPromo.Annotations[kargoapi.AnnotationKeyCreateActor]; ok { @@ -205,8 +209,7 @@ func (w *webhook) Default(ctx context.Context, obj runtime.Object) error { delete(promo.Labels, kargoapi.ShardLabelKey) } - ownerRef := - metav1.NewControllerRef(stage, kargoapi.GroupVersion.WithKind("Stage")) + ownerRef := metav1.NewControllerRef(stage, kargoapi.GroupVersion.WithKind("Stage")) promo.ObjectMeta.OwnerReferences = []metav1.OwnerReference{*ownerRef} return nil } From c0f3c90de971a81fcbc1148d313ac1b55bd6d4df Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Thu, 19 Dec 2024 22:42:07 +0100 Subject: [PATCH 36/38] fix: ensure state is available to var getter Signed-off-by: Hidde Beydals --- internal/indexer/indexer.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/internal/indexer/indexer.go b/internal/indexer/indexer.go index 87fbdb336..2bcc9c88d 100644 --- a/internal/indexer/indexer.go +++ b/internal/indexer/indexer.go @@ -159,6 +159,7 @@ func RunningPromotionsByArgoCDApplications( dirStep := directives.PromotionStep{ Kind: step.Uses, Alias: step.As, + Vars: step.Vars, Config: step.Config.Raw, } // Build just enough context to extract the relevant config from the @@ -169,7 +170,9 @@ func RunningPromotionsByArgoCDApplications( Promotion: promo.Name, Vars: promo.Spec.Vars, } - vars, err := dirStep.GetVars(promoCtx, promoCtx.State) + // As we are not evaluating expressions in the entire config, we do not + // pass any state. + vars, err := dirStep.GetVars(promoCtx, promo.Status.GetState()) if err != nil { logger.Error( err, From ae4045025cc30eb98b4d5c9bf17d1f9aae71e99c Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Fri, 10 Jan 2025 13:13:57 +0100 Subject: [PATCH 37/38] fix: evaluate step vars and outputs in indexer Signed-off-by: Hidde Beydals --- internal/directives/promotions.go | 93 +++++++++++++++++++------------ internal/indexer/indexer.go | 42 +++++++------- internal/indexer/indexer_test.go | 68 +++++++++++++++++++++- 3 files changed, 146 insertions(+), 57 deletions(-) diff --git a/internal/directives/promotions.go b/internal/directives/promotions.go index fda35fe12..040bb952d 100644 --- a/internal/directives/promotions.go +++ b/internal/directives/promotions.go @@ -106,6 +106,26 @@ type PromotionStep struct { Config []byte } +// PromotionStepEnvOption is a functional option for customizing the +// environment of a PromotionStep built by BuildEnv. +type PromotionStepEnvOption func(map[string]any) + +// StepEnvWithVars returns a PromotionStepEnvOption that adds the provided vars to +// the environment of the PromotionStep. +func StepEnvWithVars(vars map[string]any) PromotionStepEnvOption { + return func(env map[string]any) { + env["vars"] = vars + } +} + +// StepEnvWithSecrets returns a PromotionStepEnvOption that adds the provided secrets +// to the environment of the PromotionStep. +func StepEnvWithSecrets(secrets map[string]map[string]string) PromotionStepEnvOption { + return func(env map[string]any) { + env["secrets"] = secrets + } +} + // GetTimeout returns the maximum interval the provided runner may spend // attempting to execute the step before retries are abandoned and the entire // Promotion is marked as failed. If the runner is a RetryableStepRunner, its @@ -131,32 +151,23 @@ func (s *PromotionStep) GetErrorThreshold(runner any) uint32 { return s.Retry.GetErrorThreshold(fallback) } -// GetConfig returns the Config unmarshalled into a map. Any expr-lang -// expressions are evaluated in the context of the provided arguments -// prior to unmarshaling. -func (s *PromotionStep) GetConfig( - ctx context.Context, - cl client.Client, +// BuildEnv returns the environment for the PromotionStep. The environment +// includes the context of the Promotion, the outputs of the previous steps, +// and any additional options provided. +// +// The environment is a (nested) map of string keys to any values. The keys +// are used as variables in the PromotionStep configuration. +func (s *PromotionStep) BuildEnv( promoCtx PromotionContext, state State, -) (Config, error) { - if s.Config == nil { - return nil, nil - } - - vars, err := s.GetVars(promoCtx, state) - if err != nil { - return nil, err - } - + opts ...PromotionStepEnvOption, +) map[string]any { env := map[string]any{ "ctx": map[string]any{ "project": promoCtx.Project, "promotion": promoCtx.Promotion, "stage": promoCtx.Stage, }, - "vars": vars, - "secrets": promoCtx.Secrets, "outputs": state, } @@ -170,6 +181,34 @@ func (s *PromotionStep) GetConfig( } } + // Apply all provided options + for _, opt := range opts { + opt(env) + } + + return env +} + +// GetConfig returns the Config unmarshalled into a map. Any expr-lang +// expressions are evaluated in the context of the provided arguments +// prior to unmarshaling. +func (s *PromotionStep) GetConfig( + ctx context.Context, + cl client.Client, + promoCtx PromotionContext, + state State, +) (Config, error) { + if s.Config == nil { + return nil, nil + } + + vars, err := s.GetVars(promoCtx, state) + if err != nil { + return nil, err + } + + env := s.BuildEnv(promoCtx, state, StepEnvWithVars(vars), StepEnvWithSecrets(promoCtx.Secrets)) + evaledCfgJSON, err := expressions.EvaluateJSONTemplate( s.Config, env, @@ -219,25 +258,9 @@ func (s *PromotionStep) GetVars( rawVars[v.Name] = v.Value } - taskOutput := s.getTaskOutputs(state) - vars := make(map[string]any, len(rawVars)) for k, v := range rawVars { - env := map[string]any{ - "ctx": map[string]any{ - "project": promoCtx.Project, - "promotion": promoCtx.Promotion, - "stage": promoCtx.Stage, - }, - "vars": vars, - "outputs": state, - } - - if taskOutput != nil { - env["task"] = map[string]any{ - "outputs": taskOutput, - } - } + env := s.BuildEnv(promoCtx, state, StepEnvWithVars(vars)) newVar, err := expressions.EvaluateTemplate(v, env) if err != nil { diff --git a/internal/indexer/indexer.go b/internal/indexer/indexer.go index 2bcc9c88d..5b91f1708 100644 --- a/internal/indexer/indexer.go +++ b/internal/indexer/indexer.go @@ -141,6 +141,16 @@ func RunningPromotionsByArgoCDApplications( return nil } + // Build just enough context to extract the relevant config from the + // argocd-update promotion step. + promoCtx := directives.PromotionContext{ + Project: promo.Namespace, + Stage: promo.Spec.Stage, + Promotion: promo.Name, + State: promo.Status.GetState(), + Vars: promo.Spec.Vars, + } + // Extract the Argo CD Applications from the promotion steps. // // TODO(hidde): This is not ideal as it requires parsing the directives and @@ -156,23 +166,17 @@ func RunningPromotionsByArgoCDApplications( if step.Uses != "argocd-update" || step.Config == nil { continue } + dirStep := directives.PromotionStep{ Kind: step.Uses, Alias: step.As, - Vars: step.Vars, + Vars: step.Vars, Config: step.Config.Raw, } - // Build just enough context to extract the relevant config from the - // argocd-update promotion step. - promoCtx := directives.PromotionContext{ - Project: promo.Namespace, - Stage: promo.Spec.Stage, - Promotion: promo.Name, - Vars: promo.Spec.Vars, - } - // As we are not evaluating expressions in the entire config, we do not - // pass any state. - vars, err := dirStep.GetVars(promoCtx, promo.Status.GetState()) + + // As step-level variables are allowed to reference to output, we + // need to provide the state. + vars, err := dirStep.GetVars(promoCtx, promoCtx.State) if err != nil { logger.Error( err, @@ -216,14 +220,12 @@ func RunningPromotionsByArgoCDApplications( for _, app := range appsList { if app, ok := app.(map[string]any); ok { if nameTemplate, ok := app["name"].(string); ok { - env := map[string]any{ - "ctx": map[string]any{ - "project": promoCtx.Project, - "promotion": promoCtx.Promotion, - "stage": promoCtx.Stage, - }, - "vars": vars, - } + env := dirStep.BuildEnv( + promoCtx, + promo.Status.GetState(), + directives.StepEnvWithVars(vars), + ) + var namespace any = libargocd.Namespace() if namespaceTemplate, ok := app["namespace"].(string); ok { if namespace, err = expressions.EvaluateTemplate(namespaceTemplate, env); err != nil { diff --git a/internal/indexer/indexer_test.go b/internal/indexer/indexer_test.go index 9526b1656..7e4ae63b8 100644 --- a/internal/indexer/indexer_test.go +++ b/internal/indexer/indexer_test.go @@ -329,6 +329,12 @@ func TestRunningPromotionsByArgoCDApplications(t *testing.T) { }, Spec: kargoapi.PromotionSpec{ Stage: "fake-stage", + Vars: []kargoapi.PromotionVariable{ + { + Name: "app", + Value: "fake-app-from-var", + }, + }, Steps: []kargoapi.PromotionStep{ { Uses: "argocd-update", @@ -346,16 +352,74 @@ func TestRunningPromotionsByArgoCDApplications(t *testing.T) { Raw: []byte(`{"apps":[{"name":"fake-app-${{ ctx.stage }}"}]}`), }, }, + { + Uses: "argocd-update", + Config: &apiextensionsv1.JSON{ + // Note that this uses a variable within the expression + Raw: []byte(`{"apps":[{"name":"${{ vars.app }}"}]}`), + }, + }, + { + Uses: "argocd-update", + Vars: []kargoapi.PromotionVariable{ + { + Name: "app", + Value: "fake-app-from-step-var", + }, + }, + Config: &apiextensionsv1.JSON{ + // Note that this uses a step-level variable within the expression + Raw: []byte(`{"apps":[{"name":"${{ vars.app }}"}]}`), + }, + }, + { + Uses: "argocd-update", + Config: &apiextensionsv1.JSON{ + // Note that this uses output from a (fake) previous step within the expression + Raw: []byte(`{"apps":[{"name":"fake-app-${{ outputs.push.branch }}"}]}`), + }, + }, + { + Uses: "argocd-update", + Vars: []kargoapi.PromotionVariable{ + { + Name: "input", + Value: "${{ outputs.composition.name }}", + }, + }, + Config: &apiextensionsv1.JSON{ + // Note that this uses output from a previous step through a variable + Raw: []byte(`{"apps":[{"name":"fake-app-${{ vars.input }}"}]}`), + }, + }, + { + Uses: "argocd-update", + As: "task-1::update", + Config: &apiextensionsv1.JSON{ + // Note that this uses output from a "task" step within the expression + Raw: []byte(`{"apps":[{"name":"fake-app-${{ task.outputs.fake.name }}"}]}`), + }, + }, }, }, Status: kargoapi.PromotionStatus{ - Phase: kargoapi.PromotionPhaseRunning, - CurrentStep: 2, // Ensure all steps above are considered + Phase: kargoapi.PromotionPhaseRunning, + State: &apiextensionsv1.JSON{ + // Mock the output of the previous steps + // nolint:lll + Raw: []byte(`{"push":{"branch":"from-branch"},"composition":{"name":"from-composition"},"task-1::fake":{"name":"from-task"}}`), + }, + CurrentStep: 7, // Ensure all steps above are considered }, }, expected: []string{ "fake-namespace:fake-app", fmt.Sprintf("%s:%s", argocd.Namespace(), "fake-app-fake-stage"), + fmt.Sprintf("%s:%s", argocd.Namespace(), "fake-app-from-var"), + fmt.Sprintf("%s:%s", argocd.Namespace(), "fake-app-from-step-var"), + fmt.Sprintf("%s:%s", argocd.Namespace(), "fake-app-from-branch"), + fmt.Sprintf("%s:%s", argocd.Namespace(), "fake-app-from-composition"), + fmt.Sprintf("%s:%s", argocd.Namespace(), "fake-app-from-task"), }, }, { From 911cc1385e6b140e1d263ba87ed780dc7472fcad Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Fri, 10 Jan 2025 18:29:32 +0100 Subject: [PATCH 38/38] refactor: improve inflation of task step vars Signed-off-by: Hidde Beydals --- internal/directives/promotions.go | 119 +++++++++++++++-------- internal/indexer/indexer.go | 3 +- internal/kargo/promotion_builder.go | 51 ++++++---- internal/kargo/promotion_builder_test.go | 12 ++- 4 files changed, 120 insertions(+), 65 deletions(-) diff --git a/internal/directives/promotions.go b/internal/directives/promotions.go index 040bb952d..cd7c344dd 100644 --- a/internal/directives/promotions.go +++ b/internal/directives/promotions.go @@ -126,6 +126,30 @@ func StepEnvWithSecrets(secrets map[string]map[string]string) PromotionStepEnvOp } } +// StepEnvWithOutputs returns a PromotionStepEnvOption that adds the provided outputs +// to the environment of the PromotionStep. +func StepEnvWithOutputs(outputs State) PromotionStepEnvOption { + return func(env map[string]any) { + env["outputs"] = outputs + } +} + +// StepEnvWithTaskOutputs returns a PromotionStepEnvOption that adds the provided +// task outputs to the environment of the PromotionStep. +func StepEnvWithTaskOutputs(alias string, outputs State) PromotionStepEnvOption { + return func(env map[string]any) { + // Ensure that if the PromotionStep originated from a task, the task outputs + // are available to the PromotionStep. This allows inflated steps to access + // the outputs of the other steps in the task without needing to know the + // alias (namespace) of the task. + if taskOutput := getTaskOutputs(alias, outputs); taskOutput != nil { + env["task"] = map[string]any{ + "outputs": taskOutput, + } + } + } +} + // GetTimeout returns the maximum interval the provided runner may spend // attempting to execute the step before retries are abandoned and the entire // Promotion is marked as failed. If the runner is a RetryableStepRunner, its @@ -152,14 +176,13 @@ func (s *PromotionStep) GetErrorThreshold(runner any) uint32 { } // BuildEnv returns the environment for the PromotionStep. The environment -// includes the context of the Promotion, the outputs of the previous steps, -// and any additional options provided. +// includes the context of the Promotion and any additional options provided +// (e.g. outputs, task outputs, vars, secrets). // // The environment is a (nested) map of string keys to any values. The keys // are used as variables in the PromotionStep configuration. func (s *PromotionStep) BuildEnv( promoCtx PromotionContext, - state State, opts ...PromotionStepEnvOption, ) map[string]any { env := map[string]any{ @@ -168,17 +191,6 @@ func (s *PromotionStep) BuildEnv( "promotion": promoCtx.Promotion, "stage": promoCtx.Stage, }, - "outputs": state, - } - - // Ensure that if the PromotionStep originated from a task, the task outputs - // are available to the PromotionStep. This allows inflated steps to access - // the outputs of the other steps in the task without needing to know the - // alias (namespace) of the task. - if taskOutput := s.getTaskOutputs(state); taskOutput != nil { - env["task"] = map[string]any{ - "outputs": taskOutput, - } } // Apply all provided options @@ -207,7 +219,13 @@ func (s *PromotionStep) GetConfig( return nil, err } - env := s.BuildEnv(promoCtx, state, StepEnvWithVars(vars), StepEnvWithSecrets(promoCtx.Secrets)) + env := s.BuildEnv( + promoCtx, + StepEnvWithOutputs(state), + StepEnvWithTaskOutputs(s.Alias, state), + StepEnvWithVars(vars), + StepEnvWithSecrets(promoCtx.Secrets), + ) evaledCfgJSON, err := expressions.EvaluateJSONTemplate( s.Config, @@ -250,41 +268,40 @@ func (s *PromotionStep) GetVars( promoCtx PromotionContext, state State, ) (map[string]any, error) { - var rawVars = make(map[string]string, len(promoCtx.Vars)) - for _, v := range promoCtx.Vars { - rawVars[v.Name] = v.Value - } - for _, v := range s.Vars { - rawVars[v.Name] = v.Value - } - - vars := make(map[string]any, len(rawVars)) - for k, v := range rawVars { - env := s.BuildEnv(promoCtx, state, StepEnvWithVars(vars)) + vars := make(map[string]any) - newVar, err := expressions.EvaluateTemplate(v, env) + // Evaluate the global variables defined in the Promotion itself, these + // variables DO NOT have access to the (task) outputs. + for _, v := range promoCtx.Vars { + newVar, err := expressions.EvaluateTemplate( + v.Value, + s.BuildEnv(promoCtx, StepEnvWithVars(vars)), + ) if err != nil { - return nil, fmt.Errorf("error pre-processing promotion variable %q: %w", k, err) + return nil, fmt.Errorf("error pre-processing promotion variable %q: %w", v.Name, err) } - vars[k] = newVar + vars[v.Name] = newVar } - return vars, nil -} -// getTaskOutputs returns the outputs of a task that are relevant to the current -// step. This is useful when a step is inflated from a task and needs to access -// the outputs of that task. -func (s *PromotionStep) getTaskOutputs(state State) State { - if namespace := getAliasNamespace(s.Alias); namespace != "" { - taskOutputs := make(State) - for k, v := range state.DeepCopy() { - if getAliasNamespace(k) == namespace { - taskOutputs[k[len(namespace)+2:]] = v - } + // Evaluate the variables defined in the PromotionStep, these variables + // DO have access to the (task) outputs. + for _, v := range s.Vars { + newVar, err := expressions.EvaluateTemplate( + v.Value, + s.BuildEnv( + promoCtx, + StepEnvWithOutputs(state), + StepEnvWithTaskOutputs(s.Alias, state), + StepEnvWithVars(vars), + ), + ) + if err != nil { + return nil, fmt.Errorf("error pre-processing promotion variable %q: %w", v.Name, err) } - return taskOutputs + vars[v.Name] = newVar } - return nil + + return vars, nil } // PromotionResult is the result of a user-defined promotion process executed by @@ -492,6 +509,22 @@ func getChartFunc( } } +// getTaskOutputs returns the outputs of a task that are relevant to the current +// step. This is useful when a step is inflated from a task and needs to access +// the outputs of that task. +func getTaskOutputs(alias string, state State) State { + if namespace := getAliasNamespace(alias); namespace != "" { + taskOutputs := make(State) + for k, v := range state.DeepCopy() { + if getAliasNamespace(k) == namespace { + taskOutputs[k[len(namespace)+2:]] = v + } + } + return taskOutputs + } + return nil +} + // getAliasNamespace returns the namespace part of an alias, if it exists. // The namespace part is the part before the first "::" separator. Typically, // this is used for steps inflated from a task. diff --git a/internal/indexer/indexer.go b/internal/indexer/indexer.go index 5b91f1708..d0593a138 100644 --- a/internal/indexer/indexer.go +++ b/internal/indexer/indexer.go @@ -222,7 +222,8 @@ func RunningPromotionsByArgoCDApplications( if nameTemplate, ok := app["name"].(string); ok { env := dirStep.BuildEnv( promoCtx, - promo.Status.GetState(), + directives.StepEnvWithOutputs(promoCtx.State), + directives.StepEnvWithTaskOutputs(dirStep.Alias, promoCtx.State), directives.StepEnvWithVars(vars), ) diff --git a/internal/kargo/promotion_builder.go b/internal/kargo/promotion_builder.go index fb5fb5200..6059002bd 100644 --- a/internal/kargo/promotion_builder.go +++ b/internal/kargo/promotion_builder.go @@ -144,7 +144,7 @@ func (b *PromotionBuilder) inflateTaskSteps( // With the variables validated and mapped, they are now available to // the Config of the step during the Promotion execution. - step.Vars = vars + step.Vars = append(vars, step.Vars...) // Append the inflated step to the list of steps. steps = append(steps, *step) @@ -221,39 +221,52 @@ func generatePromotionTaskStepAlias(taskAlias, stepAlias string) string { func promotionTaskVarsToStepVars( taskVars, promoVars, stepVars []kargoapi.PromotionVariable, ) ([]kargoapi.PromotionVariable, error) { - if len(taskVars) == 0 { - return nil, nil - } - - promoVarsMap := make(map[string]kargoapi.PromotionVariable, len(promoVars)) + // Promotion variables can be used to set (or override) the variables + // required by the PromotionTask, but they are not inflated into the + // variables for the step. This map is used to check if a variable is + // set on the Promotion, to avoid overriding it with the default value + // and to validate that the variable is set. + promoVarsMap := make(map[string]struct{}, len(promoVars)) for _, v := range promoVars { - promoVarsMap[v.Name] = v + if v.Value != "" { + promoVarsMap[v.Name] = struct{}{} + } } - stepVarsMap := make(map[string]kargoapi.PromotionVariable, len(stepVars)) + // Step variables are inflated into the variables for the step. This map + // is used to ensure all variables required by the PromotionTask without + // a default value are set. + stepVarsMap := make(map[string]struct{}, len(stepVars)) for _, v := range stepVars { - stepVarsMap[v.Name] = v + if v.Value != "" { + stepVarsMap[v.Name] = struct{}{} + } } - vars := make([]kargoapi.PromotionVariable, 0, len(taskVars)) + var vars []kargoapi.PromotionVariable + + // Set the PromotionTask variable default values, but only if the variable + // is not set on the Promotion. for _, v := range taskVars { - if stepVar, ok := stepVarsMap[v.Name]; ok && stepVar.Value != "" { - vars = append(vars, stepVar) + // Variable is set on the Promotion, we do not need to set the default. + if _, ok := promoVarsMap[v.Name]; ok { continue } - if promoVar, ok := promoVarsMap[v.Name]; ok && promoVar.Value != "" { - // If the variable is defined in the Promotion, the engine will - // automatically use the value from the Promotion, and we do not - // have to explicitly set it here. + // Set the variable if it has a default value. + if v.Value != "" { + vars = append(vars, v) continue } - if v.Value == "" { + // If not, the variable must be set in the step variables. + if _, ok := stepVarsMap[v.Name]; !ok { return nil, fmt.Errorf("missing value for variable %q", v.Name) } - - vars = append(vars, v) } + + // Set the step variables. + vars = append(vars, stepVars...) + return vars, nil } diff --git a/internal/kargo/promotion_builder_test.go b/internal/kargo/promotion_builder_test.go index f40fbb015..97ca8395d 100644 --- a/internal/kargo/promotion_builder_test.go +++ b/internal/kargo/promotion_builder_test.go @@ -486,6 +486,9 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { { As: "step2", Uses: "other-fake-step", + Vars: []kargoapi.PromotionVariable{ + {Name: "input4", Value: "value4"}, + }, }, }, }, @@ -498,6 +501,7 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { assert.Equal(t, "task-1::step1", steps[0].As) assert.Equal(t, "fake-step", steps[0].Uses) assert.ElementsMatch(t, []kargoapi.PromotionVariable{ + {Name: "input2", Value: "default2"}, {Name: "input1", Value: "value1"}, {Name: "input2", Value: "value2"}, }, steps[0].Vars) @@ -505,8 +509,10 @@ func TestPromotionBuilder_inflateTaskSteps(t *testing.T) { assert.Equal(t, "task-1::step2", steps[1].As) assert.Equal(t, "other-fake-step", steps[1].Uses) assert.ElementsMatch(t, []kargoapi.PromotionVariable{ + {Name: "input2", Value: "default2"}, {Name: "input1", Value: "value1"}, {Name: "input2", Value: "value2"}, + {Name: "input4", Value: "value4"}, }, steps[1].Vars) }, }, @@ -981,7 +987,7 @@ func Test_promotionTaskVarsToStepVars(t *testing.T) { }, }, { - name: "step value overrides default value", + name: "step value appends task default value", taskVars: []kargoapi.PromotionVariable{ {Name: "input1", Value: "default1"}, }, @@ -991,6 +997,7 @@ func Test_promotionTaskVarsToStepVars(t *testing.T) { assertions: func(t *testing.T, result []kargoapi.PromotionVariable, err error) { require.NoError(t, err) assert.ElementsMatch(t, []kargoapi.PromotionVariable{ + {Name: "input1", Value: "default1"}, {Name: "input1", Value: "override1"}, }, result) }, @@ -1024,8 +1031,9 @@ func Test_promotionTaskVarsToStepVars(t *testing.T) { assertions: func(t *testing.T, result []kargoapi.PromotionVariable, err error) { require.NoError(t, err) assert.ElementsMatch(t, []kargoapi.PromotionVariable{ - {Name: "input1", Value: "override1"}, + {Name: "input1", Value: "default1"}, {Name: "input2", Value: "default2"}, + {Name: "input1", Value: "override1"}, {Name: "input3", Value: "value3"}, }, result) },