From c6645f08cffb5d2f95b56a56c1d8a8782323ae99 Mon Sep 17 00:00:00 2001 From: Aidan Rowe Date: Sat, 11 Jan 2025 15:51:32 +1100 Subject: [PATCH] feat: add support for only promoting Freight that has been verified in all upstream Stages --- api/v1alpha1/freight_helpers.go | 13 + api/v1alpha1/freight_helpers_test.go | 63 +++ api/v1alpha1/generated.pb.go | 533 ++++++++++-------- api/v1alpha1/generated.proto | 7 + api/v1alpha1/stage_helpers.go | 7 +- api/v1alpha1/stage_types.go | 14 + api/v1alpha1/warehouse_helpers.go | 60 +- api/v1alpha1/warehouse_helpers_test.go | 108 +++- .../crds/kargo.akuity.io_stages.yaml | 11 + .../stages.kargo.akuity.io_v1alpha1.json | 10 + ui/src/gen/v1alpha1/generated_pb.ts | 13 +- 11 files changed, 585 insertions(+), 254 deletions(-) diff --git a/api/v1alpha1/freight_helpers.go b/api/v1alpha1/freight_helpers.go index 6d8de7f5ba..7854e72d5c 100644 --- a/api/v1alpha1/freight_helpers.go +++ b/api/v1alpha1/freight_helpers.go @@ -129,6 +129,19 @@ func (f *Freight) IsVerifiedIn(stage string) bool { return verified } +// IsVerifiedInAll returns whether the Freight has been verified in all +// Stages. +func (f *Freight) IsVerifiedInAll(stages []string) bool { + // NB: This method exists for convenience. It doesn't require the caller to + // know anything about the Freight status' internal data structure. + for _, s := range stages { + if !f.IsVerifiedIn(s) { + return false + } + } + return true +} + // IsApprovedFor returns whether the Freight has been approved for the specified // Stage. func (f *Freight) IsApprovedFor(stage string) bool { diff --git a/api/v1alpha1/freight_helpers_test.go b/api/v1alpha1/freight_helpers_test.go index ac4e518049..15ce6b9248 100644 --- a/api/v1alpha1/freight_helpers_test.go +++ b/api/v1alpha1/freight_helpers_test.go @@ -234,6 +234,69 @@ func TestFreight_IsVerifiedIn(t *testing.T) { require.True(t, freight.IsVerifiedIn(testStage)) } +func TestFreight_IsVerifiedInAll(t *testing.T) { + testCases := []struct { + name string + freight Freight + stages []string + expected bool + }{ + { + name: "Freight is not verified in any stage", + freight: Freight{ + Status: FreightStatus{ + VerifiedIn: map[string]VerifiedStage{}, + }, + }, + stages: []string{"stage1", "stage2"}, + expected: false, + }, + { + name: "Freight is verified in all stages", + freight: Freight{ + Status: FreightStatus{ + VerifiedIn: map[string]VerifiedStage{ + "stage1": {}, + "stage2": {}, + }, + }, + }, + stages: []string{"stage1", "stage2"}, + expected: true, + }, + { + name: "Freight is verified in some stages", + freight: Freight{ + Status: FreightStatus{ + VerifiedIn: map[string]VerifiedStage{ + "stage1": {}, + }, + }, + }, + stages: []string{"stage1", "stage2"}, + expected: false, + }, + { + name: "Freight is verified in all stages but not in the same order", + freight: Freight{ + Status: FreightStatus{ + VerifiedIn: map[string]VerifiedStage{ + "stage2": {}, + "stage1": {}, + }, + }, + }, + stages: []string{"stage1", "stage2"}, + expected: true, + }, + } + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + require.Equal(t, testCase.expected, testCase.freight.IsVerifiedInAll(testCase.stages)) + }) + } +} + func TestFreight_IsApprovedFor(t *testing.T) { const testStage = "fake-stage" freight := &Freight{} diff --git a/api/v1alpha1/generated.pb.go b/api/v1alpha1/generated.pb.go index ab5ab173ae..bc528be5a3 100644 --- a/api/v1alpha1/generated.pb.go +++ b/api/v1alpha1/generated.pb.go @@ -1755,253 +1755,256 @@ func init() { } var fileDescriptor_e26b7f7bbc391025 = []byte{ - // 3936 bytes of a gzipped FileDescriptorProto + // 3974 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, + 0x76, 0x9f, 0x26, 0x45, 0x4a, 0x7c, 0x94, 0x46, 0x52, 0x8d, 0xc6, 0xd6, 0xca, 0xb1, 0x34, 0xe9, + 0x35, 0x0c, 0x3b, 0xb6, 0xa9, 0xcc, 0xd8, 0xe3, 0x19, 0x8f, 0x93, 0x09, 0x48, 0x6a, 0x3e, 0x34, + 0xab, 0xf5, 0x28, 0xc5, 0xf1, 0x78, 0x77, 0x6c, 0xc3, 0x29, 0x91, 0x25, 0xb2, 0x57, 0x64, 0x37, + 0x5d, 0x5d, 0xd4, 0x5a, 0x49, 0x90, 0x6c, 0xbe, 0x80, 0x45, 0xbe, 0xb0, 0x07, 0x03, 0xde, 0x00, + 0x09, 0x10, 0x24, 0xc7, 0x45, 0xf2, 0x0f, 0xe4, 0xe0, 0x43, 0x2e, 0x46, 0xb0, 0x08, 0x8c, 0x24, + 0x40, 0x7c, 0x58, 0x28, 0xb1, 0x16, 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, + 0xf5, 0x5e, 0xbd, 0xf7, 0xaa, 0x5a, 0xf0, 0x46, 0xdb, 0xe1, 0x9d, 0xc1, 0x4e, 0xa5, 0xe9, 0xf5, + 0xd6, 0xc9, 0xde, 0xc0, 0xe1, 0x07, 0xeb, 0x7b, 0x84, 0xb5, 0xbd, 0x75, 0xd2, 0x77, 0xd6, 0xf7, + 0x2f, 0x92, 0x6e, 0xbf, 0x43, 0x2e, 0xae, 0xb7, 0xa9, 0x4b, 0x19, 0xe1, 0xb4, 0x55, 0xe9, 0x33, + 0x8f, 0x7b, 0xe8, 0x85, 0x88, 0xab, 0xa2, 0xb8, 0x2a, 0x92, 0xab, 0x42, 0xfa, 0x4e, 0x25, 0xe0, + 0x5a, 0x79, 0xcd, 0xc0, 0x6e, 0x7b, 0x6d, 0x6f, 0x5d, 0x32, 0xef, 0x0c, 0x76, 0xe5, 0x5f, 0xf2, + 0x0f, 0xf9, 0x4b, 0x81, 0xae, 0xdc, 0xde, 0xbb, 0xea, 0x57, 0x1c, 0x29, 0x99, 0x7e, 0xc2, 0xa9, + 0xeb, 0x3b, 0x9e, 0xeb, 0xbf, 0x46, 0xfa, 0x8e, 0x4f, 0xd9, 0x3e, 0x65, 0xeb, 0xfd, 0xbd, 0xb6, + 0xa0, 0xf9, 0xf1, 0x0e, 0xeb, 0xfb, 0x43, 0xc3, 0x5b, 0x79, 0x23, 0x42, 0xea, 0x91, 0x66, 0xc7, + 0x71, 0x29, 0x3b, 0x88, 0xd8, 0x7b, 0x94, 0x93, 0x34, 0xae, 0xf5, 0x51, 0x5c, 0x6c, 0xe0, 0x72, + 0xa7, 0x47, 0x87, 0x18, 0xde, 0x3c, 0x8e, 0xc1, 0x6f, 0x76, 0x68, 0x8f, 0x24, 0xf9, 0xec, 0x0f, + 0xe0, 0x5c, 0xd5, 0x25, 0xdd, 0x03, 0xdf, 0xf1, 0xf1, 0xc0, 0xad, 0xb2, 0xf6, 0xa0, 0x47, 0x5d, + 0x8e, 0x2e, 0xc0, 0x94, 0x4b, 0x7a, 0x74, 0xd9, 0xba, 0x60, 0xbd, 0x54, 0xaa, 0xcd, 0x7e, 0x71, + 0xb8, 0x76, 0xe6, 0xe8, 0x70, 0x6d, 0xea, 0x1d, 0xd2, 0xa3, 0x58, 0x52, 0xd0, 0x37, 0xa1, 0xb0, + 0x4f, 0xba, 0x03, 0xba, 0x9c, 0x93, 0x5d, 0xe6, 0x74, 0x97, 0xc2, 0x7d, 0xd1, 0x88, 0x15, 0xcd, + 0xfe, 0x83, 0x7c, 0x0c, 0xfe, 0xdb, 0x94, 0x93, 0x16, 0xe1, 0x04, 0xf5, 0xa0, 0xd8, 0x25, 0x3b, + 0xb4, 0xeb, 0x2f, 0x5b, 0x17, 0xf2, 0x2f, 0x95, 0x2f, 0xdd, 0xa8, 0x8c, 0xb3, 0x88, 0x95, 0x14, + 0xa8, 0xca, 0x96, 0xc4, 0xb9, 0xe1, 0x72, 0x76, 0x50, 0x3b, 0xab, 0x07, 0x51, 0x54, 0x8d, 0x58, + 0x0b, 0x41, 0xbf, 0x67, 0x41, 0x99, 0xb8, 0xae, 0xc7, 0x09, 0x17, 0xcb, 0xb4, 0x9c, 0x93, 0x42, + 0xef, 0x4c, 0x2e, 0xb4, 0x1a, 0x81, 0x29, 0xc9, 0xe7, 0xb4, 0xe4, 0xb2, 0x41, 0xc1, 0xa6, 0xcc, + 0x95, 0xb7, 0xa0, 0x6c, 0x0c, 0x15, 0x2d, 0x40, 0x7e, 0x8f, 0x1e, 0x28, 0xfd, 0x62, 0xf1, 0x13, + 0x2d, 0xc5, 0x14, 0xaa, 0x35, 0x78, 0x2d, 0x77, 0xd5, 0x5a, 0xb9, 0x0e, 0x0b, 0x49, 0x81, 0x59, + 0xf8, 0xed, 0x3f, 0xb7, 0x60, 0xc9, 0x98, 0x05, 0xa6, 0xbb, 0x94, 0x51, 0xb7, 0x49, 0xd1, 0x3a, + 0x94, 0xc4, 0x5a, 0xfa, 0x7d, 0xd2, 0x0c, 0x96, 0x7a, 0x51, 0x4f, 0xa4, 0xf4, 0x4e, 0x40, 0xc0, + 0x51, 0x9f, 0x70, 0x5b, 0xe4, 0x1e, 0xb5, 0x2d, 0xfa, 0x1d, 0xe2, 0xd3, 0xe5, 0x7c, 0x7c, 0x5b, + 0x6c, 0x8b, 0x46, 0xac, 0x68, 0xf6, 0xaf, 0xc2, 0x37, 0x82, 0xf1, 0xdc, 0xa3, 0xbd, 0x7e, 0x97, + 0x70, 0x1a, 0x0d, 0xea, 0xd8, 0xad, 0x67, 0xef, 0xc1, 0x5c, 0xb5, 0xdf, 0x67, 0xde, 0x3e, 0x6d, + 0x35, 0x38, 0x69, 0x53, 0xf4, 0x00, 0x80, 0xe8, 0x86, 0x2a, 0x97, 0x8c, 0xe5, 0x4b, 0xbf, 0x54, + 0x51, 0x16, 0x51, 0x31, 0x2d, 0xa2, 0xd2, 0xdf, 0x6b, 0x8b, 0x06, 0xbf, 0x22, 0x0c, 0xaf, 0xb2, + 0x7f, 0xb1, 0x72, 0xcf, 0xe9, 0xd1, 0xda, 0xd9, 0xa3, 0xc3, 0x35, 0xa8, 0x86, 0x08, 0xd8, 0x40, + 0xb3, 0x7f, 0xdf, 0x82, 0xf3, 0x55, 0xd6, 0xf6, 0xea, 0x1b, 0xd5, 0x7e, 0xff, 0x36, 0x25, 0x5d, + 0xde, 0x69, 0x70, 0xc2, 0x07, 0x3e, 0xba, 0x0e, 0x45, 0x5f, 0xfe, 0xd2, 0x43, 0x7d, 0x31, 0xd8, + 0x7d, 0x8a, 0xfe, 0xf0, 0x70, 0x6d, 0x29, 0x85, 0x91, 0x62, 0xcd, 0x85, 0x5e, 0x86, 0xe9, 0x1e, + 0xf5, 0x7d, 0xd2, 0x0e, 0xf4, 0x39, 0xaf, 0x01, 0xa6, 0xbf, 0xad, 0x9a, 0x71, 0x40, 0xb7, 0xff, + 0x29, 0x07, 0xf3, 0x21, 0x96, 0x16, 0x7f, 0x0a, 0x8b, 0x37, 0x80, 0xd9, 0x8e, 0x31, 0x43, 0xb9, + 0x86, 0xe5, 0x4b, 0x6f, 0x8f, 0x69, 0x27, 0x69, 0x4a, 0xaa, 0x2d, 0x69, 0x31, 0xb3, 0x66, 0x2b, + 0x8e, 0x89, 0x41, 0x3d, 0x00, 0xff, 0xc0, 0x6d, 0x6a, 0xa1, 0x53, 0x52, 0xe8, 0x5b, 0x19, 0x85, + 0x36, 0x42, 0x80, 0x1a, 0xd2, 0x22, 0x21, 0x6a, 0xc3, 0x86, 0x00, 0xfb, 0xef, 0x2d, 0x38, 0x97, + 0xc2, 0x87, 0x7e, 0x25, 0xb1, 0x9e, 0x2f, 0x0c, 0xad, 0x27, 0x1a, 0x62, 0x8b, 0x56, 0xf3, 0x55, + 0x98, 0x61, 0x74, 0xdf, 0x11, 0xe7, 0x80, 0xd6, 0xf0, 0x82, 0xe6, 0x9f, 0xc1, 0xba, 0x1d, 0x87, + 0x3d, 0xd0, 0x2b, 0x50, 0x0a, 0x7e, 0x0b, 0x35, 0xe7, 0x85, 0xa9, 0x88, 0x85, 0x0b, 0xba, 0xfa, + 0x38, 0xa2, 0xdb, 0xbf, 0x0b, 0x85, 0x7a, 0x87, 0x30, 0x2e, 0x76, 0x0c, 0xa3, 0x7d, 0xef, 0x5d, + 0xbc, 0xa5, 0x87, 0x18, 0xee, 0x18, 0xac, 0x9a, 0x71, 0x40, 0x1f, 0x63, 0xb1, 0x5f, 0x86, 0xe9, + 0x7d, 0xca, 0xe4, 0x78, 0xf3, 0x71, 0xb0, 0xfb, 0xaa, 0x19, 0x07, 0x74, 0xfb, 0x5f, 0x2d, 0x58, + 0x92, 0x23, 0xd8, 0x70, 0xfc, 0xa6, 0xb7, 0x4f, 0xd9, 0x01, 0xa6, 0xfe, 0xa0, 0x7b, 0xc2, 0x03, + 0xda, 0x80, 0x05, 0x9f, 0xf6, 0xf6, 0x29, 0xab, 0x7b, 0xae, 0xcf, 0x19, 0x71, 0x5c, 0xae, 0x47, + 0xb6, 0xac, 0x7b, 0x2f, 0x34, 0x12, 0x74, 0x3c, 0xc4, 0x81, 0x5e, 0x82, 0x19, 0x3d, 0x6c, 0xb1, + 0x95, 0x84, 0x62, 0x67, 0xc5, 0x1a, 0xe8, 0x39, 0xf9, 0x38, 0xa4, 0xda, 0xff, 0x65, 0xc1, 0xa2, + 0x9c, 0x55, 0x63, 0xb0, 0xe3, 0x37, 0x99, 0xd3, 0x17, 0xee, 0xf5, 0x69, 0x9c, 0xd2, 0x75, 0x38, + 0xdb, 0x0a, 0x14, 0xbf, 0xe5, 0xf4, 0x1c, 0x2e, 0x6d, 0xa4, 0x50, 0x7b, 0x46, 0x63, 0x9c, 0xdd, + 0x88, 0x51, 0x71, 0xa2, 0xb7, 0xfd, 0x3e, 0xcc, 0xd6, 0x07, 0x8c, 0x51, 0x97, 0x2b, 0x77, 0xf9, + 0x2d, 0x28, 0xf8, 0x8e, 0xab, 0xbd, 0x46, 0x36, 0x4f, 0x59, 0x12, 0xbe, 0xbc, 0x21, 0x98, 0xb1, + 0xc2, 0xb0, 0xff, 0x32, 0x0f, 0xe7, 0x02, 0xf9, 0xb4, 0x55, 0x65, 0xdc, 0xd9, 0x25, 0x4d, 0xee, + 0xa3, 0x16, 0xcc, 0xb6, 0xa2, 0x66, 0xae, 0xcd, 0x3a, 0x8b, 0xac, 0xd0, 0x75, 0x18, 0xf0, 0x1c, + 0xc7, 0x50, 0xd1, 0x7b, 0x90, 0x6f, 0x3b, 0x5c, 0x47, 0x11, 0x57, 0xc7, 0xf3, 0x19, 0xb7, 0x9c, + 0xe4, 0x3e, 0xae, 0x95, 0xb5, 0xa8, 0xfc, 0x2d, 0x87, 0x63, 0x81, 0x88, 0x76, 0xa0, 0xe8, 0xf4, + 0x48, 0x9b, 0x06, 0xc1, 0xc2, 0xb5, 0xf1, 0xb0, 0x37, 0x05, 0x4f, 0x12, 0x3d, 0x0c, 0x4b, 0x24, + 0xd5, 0xc7, 0x1a, 0x59, 0xc8, 0x68, 0x8a, 0xfd, 0xa7, 0x3c, 0xc0, 0xd8, 0x32, 0xd2, 0x2c, 0x31, + 0x92, 0x21, 0xa9, 0x3e, 0xd6, 0xc8, 0xf6, 0x57, 0x39, 0x58, 0x88, 0xf4, 0x57, 0xf7, 0x7a, 0x3d, + 0x87, 0xa3, 0x15, 0xc8, 0x39, 0x2d, 0xbd, 0xbd, 0x41, 0x33, 0xe6, 0x36, 0x37, 0x70, 0xce, 0x69, + 0xa1, 0x17, 0xa1, 0xb8, 0xc3, 0x88, 0xdb, 0xec, 0xe8, 0x6d, 0x1d, 0x02, 0xd7, 0x64, 0x2b, 0xd6, + 0x54, 0xf4, 0x3c, 0xe4, 0x39, 0x69, 0xeb, 0xdd, 0x1c, 0xea, 0xef, 0x1e, 0x69, 0x63, 0xd1, 0x2e, + 0xcc, 0xc8, 0x1f, 0xec, 0x7c, 0x8f, 0x36, 0xd5, 0xca, 0x1b, 0x66, 0xd4, 0x50, 0xcd, 0x38, 0xa0, + 0x0b, 0x89, 0x64, 0xc0, 0x3b, 0x1e, 0x5b, 0x2e, 0xc4, 0x25, 0x56, 0x65, 0x2b, 0xd6, 0x54, 0x71, + 0xe0, 0x35, 0xe5, 0xf8, 0x39, 0x65, 0xcb, 0xc5, 0xf8, 0x81, 0x57, 0x0f, 0x08, 0x38, 0xea, 0x83, + 0x3e, 0x84, 0x72, 0x93, 0x51, 0xc2, 0x3d, 0xb6, 0x41, 0x38, 0x5d, 0x9e, 0xce, 0xbc, 0x03, 0xe7, + 0x45, 0x44, 0x57, 0x8f, 0x20, 0xb0, 0x89, 0x67, 0xff, 0xb7, 0x05, 0xcb, 0x91, 0x6a, 0xe5, 0xda, + 0x46, 0x51, 0x8c, 0x56, 0x8f, 0x35, 0x42, 0x3d, 0x2f, 0x42, 0xb1, 0xe5, 0xb4, 0xa9, 0xcf, 0x93, + 0x5a, 0xde, 0x90, 0xad, 0x58, 0x53, 0xd1, 0x25, 0x80, 0xb6, 0xc3, 0xb5, 0xe7, 0xd1, 0xca, 0x0e, + 0xcf, 0xb7, 0x5b, 0x21, 0x05, 0x1b, 0xbd, 0xd0, 0x7b, 0x50, 0x92, 0xc3, 0x9c, 0xd0, 0xec, 0xe4, + 0x39, 0x54, 0x0f, 0x00, 0x70, 0x84, 0x65, 0x7f, 0x39, 0x05, 0xd3, 0x37, 0x19, 0x75, 0xda, 0x1d, + 0x8e, 0x7e, 0x03, 0x66, 0x7a, 0x3a, 0x1a, 0xd6, 0x6e, 0xe4, 0x97, 0xc7, 0x93, 0x71, 0x57, 0x2e, + 0xba, 0x88, 0xa4, 0xa3, 0x89, 0x44, 0x6d, 0x38, 0x44, 0x15, 0x91, 0x24, 0xe9, 0x3a, 0xc4, 0x97, + 0xeb, 0x66, 0x44, 0x92, 0x55, 0xd1, 0x88, 0x15, 0x0d, 0xbd, 0x0f, 0x45, 0x8f, 0x39, 0x6d, 0xc7, + 0x5d, 0x2e, 0xc9, 0x41, 0xbc, 0x3e, 0x9e, 0x09, 0xe9, 0x59, 0xdc, 0x95, 0xac, 0x91, 0xf2, 0xd5, + 0xdf, 0x58, 0x43, 0xa2, 0x07, 0x30, 0xad, 0x36, 0x53, 0x60, 0xa0, 0xeb, 0x63, 0x3b, 0x18, 0xb5, + 0x1f, 0xa3, 0x4d, 0xaf, 0xfe, 0xf6, 0x71, 0x00, 0x88, 0x1a, 0xa1, 0x7f, 0x99, 0x92, 0xd0, 0xaf, + 0x64, 0xf0, 0x2f, 0x23, 0x1d, 0x4a, 0x23, 0x74, 0x28, 0x85, 0x2c, 0xa0, 0xd2, 0x65, 0x8c, 0xf2, + 0x20, 0x42, 0xc5, 0x3a, 0x2c, 0x2a, 0x4e, 0xa0, 0x62, 0x1d, 0x93, 0x9d, 0x8d, 0xc7, 0x52, 0x41, + 0xd4, 0x64, 0x7f, 0x9a, 0x87, 0x45, 0xdd, 0xb3, 0xee, 0x75, 0xbb, 0xb4, 0x29, 0xcf, 0x60, 0xe5, + 0x9f, 0xf2, 0xa9, 0xfe, 0xc9, 0x81, 0x82, 0xc3, 0x69, 0x2f, 0xc8, 0x1c, 0x6b, 0x99, 0x46, 0x13, + 0xc9, 0xa8, 0x6c, 0x0a, 0x10, 0x95, 0xbc, 0x85, 0xab, 0xa4, 0x7b, 0x61, 0x25, 0x01, 0xfd, 0x91, + 0x05, 0xe7, 0xf6, 0x29, 0x73, 0x76, 0x9d, 0xa6, 0x4c, 0xbd, 0x6e, 0x3b, 0x3e, 0xf7, 0xd8, 0x81, + 0x3e, 0x11, 0xde, 0x1c, 0x4f, 0xf2, 0x7d, 0x03, 0x60, 0xd3, 0xdd, 0xf5, 0x6a, 0xcf, 0x69, 0x69, + 0xe7, 0xee, 0x0f, 0x43, 0xe3, 0x34, 0x79, 0x2b, 0x7d, 0x80, 0x68, 0xb4, 0x29, 0x99, 0xdf, 0x96, + 0x99, 0xf9, 0x8d, 0x3d, 0xb0, 0x60, 0xb2, 0x81, 0xcb, 0x32, 0x33, 0xc6, 0xcf, 0x2d, 0x28, 0x6b, + 0xfa, 0x96, 0xe3, 0x73, 0xf4, 0xc1, 0x90, 0xb5, 0x57, 0xc6, 0xb3, 0x76, 0xc1, 0x2d, 0x6d, 0x3d, + 0x0c, 0x86, 0x83, 0x16, 0xc3, 0xd2, 0x71, 0xb0, 0xa4, 0x4a, 0xb1, 0xaf, 0x65, 0x1a, 0x7f, 0xe4, + 0x18, 0xa4, 0x8e, 0xf4, 0xda, 0xd9, 0x0c, 0xe6, 0x62, 0x46, 0x8e, 0x2e, 0xc3, 0xd4, 0x9e, 0xe3, + 0x06, 0xa7, 0xde, 0x2f, 0x06, 0xc1, 0xda, 0xb7, 0x1c, 0xb7, 0xf5, 0xf0, 0x70, 0x6d, 0x31, 0xd6, + 0x59, 0x34, 0x62, 0xd9, 0xfd, 0xf8, 0x18, 0xef, 0xda, 0xcc, 0x8f, 0xff, 0x7a, 0xed, 0xcc, 0x0f, + 0x7e, 0x76, 0xe1, 0x8c, 0xfd, 0x59, 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, 0xcf, 0x73, 0x70, 0x36, 0x5c, 0x99, 0x8f, 0x07, 0xe2, 0x64, 0x8d, 0xb4, 0x6e, 0x9d, 0xbc, + 0xd6, 0x3f, 0x82, 0x69, 0xdf, 0x1b, 0xb0, 0xa6, 0x0c, 0x1f, 0x05, 0xfa, 0x1b, 0xd9, 0x9c, 0xa6, + 0xe2, 0x35, 0x62, 0x26, 0xd5, 0x80, 0x03, 0x54, 0xe4, 0xc1, 0x12, 0xd9, 0x27, 0x4e, 0x97, 0xec, + 0x38, 0x5d, 0x87, 0x1f, 0x34, 0x38, 0x23, 0x9c, 0xb6, 0x0f, 0xb4, 0xcf, 0x7c, 0x5b, 0xf3, 0x2d, + 0x55, 0x53, 0xfa, 0x3c, 0x3c, 0x5c, 0x7b, 0x4e, 0xcb, 0x49, 0x23, 0xe3, 0x54, 0x60, 0xfb, 0x9f, + 0xad, 0x50, 0x83, 0x7a, 0x30, 0x2a, 0x86, 0x61, 0x22, 0xc2, 0x13, 0x1a, 0x9c, 0x31, 0x63, 0x18, + 0xd1, 0x8a, 0x35, 0x15, 0xd9, 0xf2, 0x00, 0x09, 0x42, 0xe9, 0x52, 0x0d, 0xf4, 0x39, 0x20, 0x57, + 0x5d, 0x51, 0x50, 0x1f, 0x16, 0x18, 0xfd, 0x78, 0xe0, 0x30, 0xda, 0x6a, 0x78, 0x64, 0x4f, 0x04, + 0x22, 0xba, 0xfa, 0x30, 0xa6, 0xa3, 0xd9, 0x18, 0x30, 0xe9, 0x33, 0x6b, 0x4b, 0x22, 0xa9, 0xc2, + 0x09, 0x2c, 0x3c, 0x84, 0x6e, 0xff, 0x47, 0x21, 0xf4, 0x10, 0x3a, 0xff, 0xff, 0x2d, 0x28, 0x37, + 0x55, 0x9a, 0xd4, 0x3d, 0xd8, 0x74, 0xf5, 0x9e, 0xde, 0x98, 0xe0, 0xb4, 0xab, 0xd4, 0x23, 0x98, + 0x44, 0x79, 0xd0, 0xa0, 0x60, 0x53, 0x1a, 0xfa, 0x3e, 0x80, 0x72, 0xfd, 0xb4, 0xb5, 0xe9, 0xea, + 0xb3, 0xad, 0x3e, 0x89, 0xec, 0xfb, 0x21, 0x8a, 0x12, 0x1d, 0x06, 0x59, 0x11, 0x01, 0x1b, 0xa2, + 0xc4, 0xac, 0x83, 0x6a, 0xd7, 0x4d, 0x8f, 0x69, 0x27, 0x31, 0xd1, 0xac, 0xab, 0x11, 0x4c, 0xb2, + 0x28, 0x1a, 0x51, 0xb0, 0x29, 0x6d, 0x85, 0xc1, 0x42, 0x52, 0x57, 0x29, 0xe7, 0xdb, 0xed, 0xf8, + 0xf9, 0x76, 0x69, 0x4c, 0x8f, 0x60, 0xa4, 0xbc, 0x66, 0x35, 0x95, 0xc1, 0x7c, 0x42, 0x47, 0x29, + 0x22, 0x37, 0xe3, 0x22, 0x5f, 0xcf, 0x72, 0xd6, 0xeb, 0xaa, 0xa4, 0x29, 0xd3, 0x87, 0x85, 0xa4, + 0x76, 0x4e, 0x4c, 0x68, 0xac, 0x14, 0x6a, 0x1e, 0xe2, 0x7f, 0x95, 0x83, 0x52, 0xe8, 0xc6, 0xb3, + 0xd4, 0x35, 0x54, 0xf8, 0x95, 0x3b, 0x26, 0x3d, 0xcc, 0x8f, 0x93, 0x1e, 0x4e, 0x8d, 0x4e, 0x0f, + 0x83, 0xda, 0x67, 0xf1, 0xd1, 0xb5, 0x4f, 0x23, 0x3d, 0x9c, 0x1e, 0x3f, 0x3d, 0x9c, 0x39, 0x3e, + 0x3d, 0xb4, 0xff, 0xc6, 0x02, 0x34, 0x5c, 0x0b, 0xc8, 0xa2, 0x28, 0x92, 0x3c, 0x5c, 0xc7, 0x0c, + 0xbd, 0x92, 0x09, 0xf9, 0xe8, 0x33, 0xd6, 0xfe, 0xbc, 0x00, 0xf3, 0xb7, 0x9c, 0x89, 0x4b, 0x54, + 0x1c, 0x9e, 0x55, 0x48, 0x0d, 0xaa, 0x03, 0xdf, 0xf0, 0xa8, 0x50, 0xeb, 0x7b, 0x4d, 0xb3, 0x3e, + 0x5b, 0x4f, 0xef, 0xf6, 0x70, 0x34, 0x09, 0x8f, 0x82, 0x1e, 0x7b, 0x93, 0xbc, 0x0d, 0x73, 0x3e, + 0x67, 0x4e, 0x93, 0xab, 0x22, 0x98, 0xbf, 0x5c, 0x96, 0x07, 0xc9, 0x79, 0xdd, 0x7d, 0xae, 0x61, + 0x12, 0x71, 0xbc, 0x6f, 0x6a, 0x6d, 0x6d, 0x2a, 0x73, 0x6d, 0x6d, 0x1d, 0x4a, 0xa4, 0xdb, 0xf5, + 0xbe, 0x7f, 0x8f, 0xb4, 0x7d, 0x5d, 0x7f, 0x08, 0x77, 0x4d, 0x35, 0x20, 0xe0, 0xa8, 0x0f, 0xaa, + 0x00, 0x38, 0x6d, 0xd7, 0x63, 0x54, 0x72, 0x14, 0xe5, 0x89, 0x26, 0xef, 0x0f, 0x36, 0xc3, 0x56, + 0x6c, 0xf4, 0x40, 0x0d, 0x38, 0xef, 0xb8, 0x3e, 0x6d, 0x0e, 0x18, 0x6d, 0xec, 0x39, 0xfd, 0x7b, + 0x5b, 0x0d, 0xe9, 0x25, 0x0e, 0xe4, 0x6e, 0x9e, 0xa9, 0x3d, 0xaf, 0x85, 0x9d, 0xdf, 0x4c, 0xeb, + 0x84, 0xd3, 0x79, 0xd1, 0x1b, 0x30, 0xeb, 0xb8, 0xcd, 0xee, 0xa0, 0x45, 0xb7, 0x09, 0xef, 0xf8, + 0xcb, 0x33, 0x72, 0x18, 0x0b, 0x47, 0x87, 0x6b, 0xb3, 0x9b, 0x46, 0x3b, 0x8e, 0xf5, 0x12, 0x5c, + 0xf4, 0x13, 0x83, 0xab, 0x14, 0x71, 0xdd, 0xf8, 0xc4, 0xe4, 0x32, 0x7b, 0xa5, 0x54, 0x1f, 0x21, + 0x53, 0xf5, 0xf1, 0x27, 0x39, 0x28, 0xaa, 0xe2, 0x3f, 0xba, 0x9c, 0xa8, 0xb0, 0x3f, 0x3f, 0x54, + 0x61, 0x2f, 0xa7, 0x5d, 0x94, 0xd8, 0x50, 0x74, 0x7c, 0x7f, 0x10, 0x0f, 0x20, 0x36, 0x65, 0x0b, + 0xd6, 0x14, 0x59, 0x4b, 0xf3, 0xdc, 0x5d, 0xa7, 0xad, 0x2b, 0x1e, 0xd7, 0x8d, 0xb0, 0x21, 0xba, + 0xa0, 0xfd, 0x28, 0xbc, 0xc1, 0x8d, 0x22, 0x88, 0x58, 0x07, 0x11, 0x4a, 0xdc, 0x69, 0xdc, 0x7d, + 0x47, 0xc9, 0xa8, 0x4b, 0x44, 0xac, 0x91, 0x85, 0x0c, 0x6f, 0xc0, 0xfb, 0x03, 0x2e, 0x37, 0xca, + 0x09, 0xc9, 0xb8, 0x2b, 0x11, 0xb1, 0x46, 0xb6, 0x3f, 0xb3, 0x60, 0x5e, 0xe9, 0xa0, 0xde, 0xa1, + 0xcd, 0xbd, 0x06, 0xa7, 0x7d, 0x91, 0x42, 0x0c, 0x7c, 0xea, 0x27, 0x53, 0x88, 0x77, 0x7d, 0xea, + 0x63, 0x49, 0x31, 0x66, 0x9f, 0x3b, 0xad, 0xd9, 0xdb, 0x7f, 0x67, 0x41, 0x41, 0xc6, 0xea, 0x59, + 0xfc, 0x4f, 0xbc, 0x7e, 0x95, 0x1b, 0xab, 0x7e, 0x75, 0x4c, 0x65, 0x31, 0x2a, 0x9d, 0x4d, 0x3d, + 0xaa, 0x74, 0x66, 0xff, 0xdc, 0x82, 0xa5, 0xb4, 0x72, 0x6c, 0x96, 0xe1, 0xbf, 0x0a, 0x33, 0xfd, + 0x2e, 0xe1, 0xbb, 0x1e, 0xeb, 0x25, 0x2f, 0x75, 0xb6, 0x75, 0x3b, 0x0e, 0x7b, 0x20, 0x06, 0xc0, + 0x82, 0xbc, 0x2f, 0xc8, 0x89, 0xae, 0x67, 0x3d, 0x11, 0xe2, 0x75, 0xc4, 0x48, 0x59, 0x61, 0x93, + 0x8f, 0x0d, 0x29, 0xf6, 0x9f, 0x14, 0x60, 0x51, 0xb2, 0x4c, 0x7a, 0x42, 0x4c, 0xb2, 0x42, 0x7d, + 0x78, 0x46, 0x66, 0x6b, 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, 0xcd, 0x3c, 0x59, 0xd6, 0x3f, 0xfd, 0x0a, 0xf1, 0x5d, 0x98, 0xf2, + 0xfb, 0xb4, 0xa9, 0x7d, 0xde, 0xc5, 0xf1, 0x2c, 0x4d, 0x0f, 0xaf, 0xd1, 0xa7, 0xcd, 0xda, 0x8c, + 0x70, 0xa3, 0xe2, 0x17, 0x96, 0x40, 0x46, 0xa9, 0x33, 0x9f, 0x25, 0x02, 0x0f, 0x20, 0x1f, 0x5d, + 0xea, 0xfc, 0xdc, 0x82, 0xb2, 0xee, 0xf9, 0xd4, 0xd6, 0xd4, 0xf4, 0xf8, 0x46, 0xd4, 0xd4, 0xfe, + 0x2c, 0x9a, 0x81, 0x50, 0x1a, 0xfa, 0x1d, 0x58, 0xec, 0x33, 0xaf, 0xe7, 0x09, 0x4b, 0xdd, 0xf6, + 0xba, 0x4e, 0xd3, 0xa1, 0x41, 0x59, 0xf6, 0xf2, 0xd8, 0xf2, 0x0c, 0xf6, 0x83, 0xda, 0x37, 0xb4, + 0xdc, 0xc5, 0xed, 0x24, 0x2e, 0x1e, 0x16, 0x65, 0xff, 0x9b, 0x05, 0x73, 0x31, 0xdd, 0xa3, 0x26, + 0x40, 0xd3, 0x73, 0x5b, 0x0e, 0x0f, 0xef, 0xd5, 0xcb, 0x97, 0xd6, 0xc7, 0xd3, 0x6a, 0x3d, 0xe0, + 0x8b, 0x36, 0x5d, 0xd8, 0xe4, 0x63, 0x03, 0x16, 0xbd, 0x1e, 0x3c, 0x71, 0x89, 0x07, 0x31, 0xea, + 0x89, 0xcb, 0xc3, 0xc3, 0xb5, 0x59, 0x3d, 0x26, 0xf3, 0xc9, 0x4b, 0x96, 0xc7, 0x1e, 0x7f, 0x9b, + 0x83, 0x52, 0x38, 0xff, 0x27, 0x60, 0x46, 0xef, 0xc6, 0xcc, 0xe8, 0xf5, 0x8c, 0x2b, 0x27, 0x0d, + 0x29, 0x8c, 0x49, 0x0c, 0x63, 0xfa, 0x30, 0x61, 0x4c, 0x59, 0xb7, 0xc4, 0x31, 0xe6, 0xf4, 0x8f, + 0x6a, 0xf1, 0x55, 0xdf, 0x27, 0x60, 0x50, 0xf7, 0xe2, 0x06, 0xb5, 0x9e, 0x71, 0x36, 0x23, 0x4c, + 0xea, 0x87, 0x16, 0xcc, 0x27, 0x8c, 0x00, 0x7d, 0x13, 0x0a, 0xb2, 0x2a, 0xa6, 0xf7, 0x57, 0xc8, + 0xa8, 0x13, 0x7c, 0x49, 0x43, 0xdb, 0xb0, 0x44, 0x06, 0xdc, 0x0b, 0x79, 0x6f, 0xb8, 0x64, 0xa7, + 0x4b, 0x55, 0xd6, 0x3e, 0x53, 0xfb, 0x85, 0xb0, 0x00, 0x98, 0xd2, 0x07, 0xa7, 0x72, 0xda, 0x3f, + 0xcd, 0x01, 0x0a, 0x1b, 0xb3, 0xd4, 0xaf, 0x3f, 0x84, 0xe9, 0x5d, 0x55, 0x08, 0x7a, 0xbc, 0x0b, + 0x88, 0x5a, 0xd9, 0xbc, 0x83, 0x09, 0x30, 0xd1, 0x77, 0x4f, 0x66, 0x1f, 0xc1, 0xf0, 0x1e, 0x42, + 0x0f, 0x00, 0x76, 0x1d, 0xd7, 0xf1, 0x3b, 0x13, 0x5e, 0x95, 0xca, 0xd3, 0xfc, 0x66, 0x88, 0x80, + 0x0d, 0x34, 0xfb, 0xd3, 0x9c, 0xb1, 0x3f, 0xa5, 0xbb, 0x1c, 0x6b, 0x5d, 0x5f, 0x8e, 0x2b, 0xb3, + 0x34, 0x7c, 0x39, 0x65, 0x28, 0x66, 0x6a, 0x9f, 0xb0, 0xa0, 0x4e, 0x7e, 0x25, 0xa3, 0x5a, 0xee, + 0x13, 0xe6, 0x88, 0x85, 0x8f, 0x96, 0xf4, 0x3e, 0x61, 0x3e, 0x96, 0x90, 0xe8, 0x3b, 0x62, 0xa8, + 0xb4, 0x1f, 0xb8, 0xd0, 0xcc, 0x3e, 0x81, 0xd3, 0xbe, 0x39, 0x3f, 0xda, 0xf7, 0xb1, 0x02, 0xb4, + 0x3f, 0x9d, 0x36, 0x36, 0xbc, 0xf6, 0xda, 0x77, 0x00, 0x75, 0x89, 0xcf, 0x6f, 0x13, 0xb7, 0x25, + 0xb6, 0x27, 0xdd, 0x65, 0xd4, 0xef, 0xe8, 0x08, 0x6d, 0x45, 0xa3, 0xa0, 0xad, 0xa1, 0x1e, 0x38, + 0x85, 0x0b, 0x5d, 0x8e, 0x3b, 0xe7, 0xb5, 0xa4, 0x73, 0x3e, 0x1b, 0x59, 0xdb, 0x64, 0xee, 0xd9, + 0xdc, 0xee, 0x85, 0x53, 0xd8, 0xee, 0xbf, 0x0d, 0x8b, 0xbb, 0xc9, 0xcb, 0x4a, 0xfd, 0x74, 0xe1, + 0xca, 0x84, 0x77, 0x9d, 0xb5, 0xf3, 0x47, 0xd1, 0x0d, 0x57, 0xd4, 0x8c, 0x87, 0x05, 0x21, 0x2f, + 0x78, 0x01, 0x28, 0xb3, 0x4f, 0x55, 0x58, 0x18, 0xdb, 0xe4, 0x12, 0x79, 0x6b, 0xf2, 0xed, 0x9f, + 0x82, 0xc4, 0x31, 0x01, 0x09, 0x13, 0x2c, 0x9e, 0xa4, 0x09, 0xa2, 0xcb, 0x61, 0x41, 0x5f, 0x0c, + 0x47, 0x86, 0xb2, 0xf9, 0xa1, 0x52, 0xbc, 0x20, 0x61, 0xb3, 0x1f, 0xfa, 0x91, 0x05, 0xe7, 0xc5, + 0x66, 0xbd, 0xf1, 0x09, 0x6d, 0x0e, 0x84, 0x56, 0x82, 0x67, 0xbf, 0xcb, 0x65, 0xa9, 0x8d, 0x31, + 0xdf, 0x43, 0x36, 0xd2, 0x20, 0xa2, 0xb8, 0x3c, 0x95, 0x8c, 0xd3, 0x05, 0xa3, 0x8f, 0xa4, 0xeb, + 0xe0, 0x54, 0xa6, 0x3d, 0x8f, 0x9f, 0xde, 0x97, 0xb4, 0xdb, 0xe1, 0xca, 0xed, 0x70, 0x6a, 0xff, + 0x69, 0xcc, 0x5b, 0x8d, 0x57, 0x74, 0x58, 0x81, 0x1c, 0xf1, 0x93, 0x65, 0xe2, 0xaa, 0x8f, 0x73, + 0xc4, 0x47, 0xdf, 0x85, 0x02, 0xa3, 0x9c, 0x1d, 0x68, 0xa7, 0x7a, 0x75, 0x02, 0x07, 0x82, 0x05, + 0xbf, 0x1a, 0xaa, 0xfc, 0x89, 0x15, 0xa2, 0x51, 0xeb, 0xc8, 0x9f, 0x5a, 0xad, 0xe3, 0x27, 0x96, + 0x71, 0x16, 0x86, 0x83, 0x41, 0xef, 0xc2, 0x34, 0x77, 0x7a, 0xd4, 0x1b, 0xf0, 0x6c, 0x01, 0x46, + 0x78, 0x39, 0x25, 0x4d, 0xfe, 0x9e, 0x82, 0xc0, 0x01, 0x96, 0xc8, 0xba, 0x28, 0x63, 0x1e, 0xbb, + 0xd7, 0x11, 0x2e, 0xcc, 0xeb, 0xaa, 0x53, 0x7c, 0x2e, 0xca, 0xba, 0x6e, 0xc4, 0xa8, 0x38, 0xd1, + 0xdb, 0x66, 0x10, 0xc5, 0xcb, 0xc1, 0x7b, 0x6a, 0xf4, 0xa1, 0x8e, 0xea, 0xac, 0x2c, 0x6f, 0x78, + 0x87, 0x60, 0x46, 0x45, 0x77, 0xf6, 0x4f, 0x2d, 0x38, 0x9f, 0xda, 0x3b, 0x3c, 0x96, 0x72, 0xa7, + 0x78, 0x2c, 0x59, 0x27, 0x7d, 0x2c, 0x3d, 0x30, 0x54, 0x18, 0x0c, 0xe1, 0xa4, 0x3e, 0x82, 0xf8, + 0x71, 0x0e, 0x16, 0x30, 0xed, 0x7b, 0xb1, 0x0a, 0xcd, 0x76, 0xf0, 0x70, 0x31, 0x43, 0x48, 0x93, + 0xb8, 0x07, 0xa8, 0x4d, 0xc7, 0x5e, 0x2c, 0x7e, 0x07, 0x0a, 0xb2, 0x78, 0xa2, 0x83, 0xb0, 0x2b, + 0x19, 0x2e, 0xe3, 0x63, 0xa8, 0xd2, 0xe2, 0x54, 0x15, 0x4a, 0x01, 0x0a, 0x64, 0x79, 0x8f, 0xae, + 0x0d, 0xee, 0x4a, 0x86, 0x1b, 0xf9, 0x61, 0x64, 0xd9, 0x8c, 0x15, 0xa0, 0xfd, 0x59, 0x0e, 0x54, + 0xf8, 0xf3, 0x04, 0xd2, 0x9c, 0x5f, 0x8f, 0xa5, 0x39, 0xeb, 0xe3, 0x3a, 0x71, 0xa1, 0x9e, 0x51, + 0x29, 0x4e, 0x32, 0x34, 0xbd, 0x98, 0x05, 0xf4, 0xd1, 0xe9, 0xcd, 0x3f, 0x58, 0x50, 0x92, 0xfd, + 0x9e, 0x40, 0x6a, 0xb3, 0x1d, 0x4f, 0x6d, 0x5e, 0xc9, 0x30, 0x8b, 0x11, 0x69, 0xcd, 0xa7, 0x79, + 0x3d, 0xfa, 0x30, 0xf0, 0xed, 0x10, 0xd6, 0xd2, 0x21, 0x5d, 0x64, 0x81, 0xa2, 0x11, 0x2b, 0x1a, + 0xfa, 0x4d, 0xf5, 0x02, 0x80, 0xfa, 0x9c, 0xb6, 0x6e, 0x86, 0xf1, 0x55, 0x3e, 0xf3, 0xdb, 0x09, + 0xfd, 0xbe, 0x23, 0x2a, 0xed, 0xe1, 0x04, 0x2a, 0x1e, 0x92, 0x23, 0x62, 0xae, 0x7e, 0xd2, 0x97, + 0xe9, 0x58, 0xe4, 0xca, 0x84, 0x8e, 0x53, 0xc5, 0x5c, 0x43, 0xcd, 0x78, 0x58, 0x10, 0xea, 0xc0, + 0xac, 0xf9, 0xea, 0x4b, 0xef, 0xa5, 0x4b, 0xd9, 0x9f, 0x97, 0xa9, 0xab, 0x1c, 0xb3, 0x05, 0xc7, + 0x90, 0xed, 0xc3, 0x22, 0x94, 0x8d, 0xcd, 0x97, 0x28, 0x97, 0xcc, 0x9d, 0x4e, 0xb9, 0x24, 0x3d, + 0xba, 0x2f, 0x4f, 0x14, 0xdd, 0x5f, 0x8c, 0x47, 0xf7, 0xcf, 0x25, 0xa3, 0x7b, 0x90, 0xb3, 0x8b, + 0x45, 0xf6, 0x3e, 0x9c, 0xd5, 0x61, 0x6e, 0xf0, 0x7c, 0x2f, 0x53, 0xbe, 0x34, 0x1c, 0x4c, 0x23, + 0x71, 0x22, 0xdf, 0x8c, 0x41, 0xe2, 0x84, 0x08, 0x71, 0xa2, 0xeb, 0x96, 0xc6, 0xa0, 0xd7, 0x23, + 0xec, 0x60, 0x79, 0x56, 0x0e, 0x38, 0x3c, 0xd1, 0x6f, 0xc6, 0xa8, 0x38, 0xd1, 0x1b, 0x6d, 0x43, + 0x51, 0x45, 0xc9, 0xfa, 0x49, 0xd8, 0xab, 0x59, 0x02, 0x70, 0x15, 0xd1, 0xa8, 0xdf, 0x58, 0xe3, + 0x98, 0x09, 0x4e, 0xe9, 0x98, 0x04, 0xe7, 0x0e, 0x20, 0x6f, 0x47, 0xc6, 0x4e, 0xad, 0x5b, 0xea, + 0x6b, 0x41, 0xb1, 0x2b, 0x8b, 0x32, 0x7a, 0x0e, 0x17, 0xec, 0xee, 0x50, 0x0f, 0x9c, 0xc2, 0x25, + 0xac, 0x5a, 0x87, 0xd6, 0xa1, 0x29, 0xe8, 0x64, 0x26, 0x6b, 0x48, 0x18, 0xe5, 0x4d, 0xf2, 0x85, + 0x4f, 0x3d, 0x81, 0x8a, 0x87, 0xe4, 0xa0, 0x8f, 0x61, 0x4e, 0x6c, 0xa1, 0x48, 0x30, 0x3c, 0xa6, + 0xe0, 0xc5, 0xa3, 0xc3, 0xb5, 0xb9, 0x2d, 0x13, 0x12, 0xc7, 0x25, 0xd8, 0x7f, 0x9c, 0x87, 0xf4, + 0xc0, 0x3e, 0x7a, 0xcd, 0x6c, 0x3d, 0xe2, 0x35, 0xf3, 0x7b, 0x50, 0xf2, 0x39, 0x61, 0xea, 0xe5, + 0x76, 0x6e, 0xb2, 0x97, 0xdb, 0x8d, 0x00, 0x00, 0x47, 0x58, 0x89, 0x2c, 0x2b, 0x7f, 0xa2, 0x59, + 0xd6, 0x25, 0x00, 0x19, 0x8f, 0xd6, 0xbd, 0x81, 0xbe, 0x57, 0x99, 0x8b, 0x7c, 0xc2, 0x8d, 0x90, + 0x82, 0x8d, 0x5e, 0xe8, 0x6a, 0x78, 0x70, 0xaa, 0x8b, 0x94, 0x0b, 0x43, 0x17, 0xc1, 0xc9, 0x3c, + 0x3d, 0xe5, 0xa3, 0xb9, 0x63, 0x1e, 0x8e, 0xd8, 0xff, 0x9b, 0x83, 0x98, 0x33, 0x44, 0x3f, 0xb4, + 0x60, 0x91, 0x24, 0xbe, 0x3b, 0x0c, 0x62, 0xc9, 0x5f, 0xcb, 0xf6, 0x31, 0xe8, 0xd0, 0x67, 0x8b, + 0x51, 0xe9, 0x3a, 0xd9, 0xc5, 0xc7, 0xc3, 0x42, 0xd1, 0x1f, 0x5a, 0x70, 0x8e, 0x0c, 0x7f, 0x58, + 0xaa, 0x17, 0xfd, 0xad, 0x89, 0xbf, 0x4c, 0xad, 0x3d, 0x7b, 0x74, 0xb8, 0x96, 0xf6, 0xc9, 0x2d, + 0x4e, 0x13, 0x87, 0xde, 0x87, 0x29, 0xc2, 0xda, 0x41, 0x99, 0x27, 0xbb, 0xd8, 0xe0, 0x7b, 0xe1, + 0x28, 0x3a, 0xaa, 0xb2, 0xb6, 0x8f, 0x25, 0xa8, 0xfd, 0xb3, 0x3c, 0x2c, 0x24, 0x5f, 0x3f, 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, 0x74, 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, 0x33, 0xdc, 0xfb, 0x21, 0x02, + 0x36, 0xd0, 0xd0, 0xf7, 0xa0, 0xdc, 0xf5, 0xdc, 0x36, 0xf5, 0x79, 0xc3, 0x23, 0x7b, 0xda, 0x4e, + 0xb2, 0xa6, 0xdf, 0xcb, 0x47, 0x87, 0x6b, 0x4b, 0x5b, 0x0a, 0xa6, 0xee, 0xf5, 0xfa, 0x5d, 0xca, + 0xd5, 0x8b, 0x50, 0x6c, 0x82, 0xcb, 0x0b, 0x98, 0xf7, 0x08, 0xa3, 0x1d, 0x6f, 0xe0, 0xd3, 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, 0x1f, 0xc0, 0x8c, 0xe3, 0x72, 0xca, 0xf6, 0x49, 0x57, 0x97, 0xb8, 0xb2, 0xee, + 0xc5, 0x70, 0xaa, 0x9b, 0x1a, 0x07, 0x87, 0x88, 0xa8, 0x0b, 0xe7, 0x83, 0xd2, 0x2c, 0xa3, 0x24, + 0xba, 0x1a, 0xd2, 0xcf, 0x2b, 0xde, 0x0c, 0x6a, 0x88, 0x37, 0xd3, 0x3a, 0x3d, 0x1c, 0x45, 0xc0, + 0xe9, 0xa0, 0xc8, 0x87, 0x39, 0xdf, 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, 0x5b, 0x45, 0xab, 0x7a, 0xe5, 0x36, 0x37, 0xf4, 0x13, 0xd6, 0x50, 0x9b, 0x5b, 0x26, 0x11, + 0xc7, 0xfb, 0xca, 0x70, 0xa2, 0x35, 0xfc, 0x11, 0xae, 0x0e, 0xb5, 0xdf, 0xca, 0xfa, 0x06, 0x29, + 0x04, 0x50, 0xe1, 0x44, 0x0a, 0x01, 0xa7, 0x89, 0xab, 0xdd, 0xf9, 0xe2, 0xeb, 0xd5, 0x33, 0x5f, + 0x7e, 0xbd, 0x7a, 0xe6, 0xab, 0xaf, 0x57, 0xcf, 0xfc, 0xe0, 0x68, 0xd5, 0xfa, 0xe2, 0x68, 0xd5, + 0xfa, 0xf2, 0x68, 0xd5, 0xfa, 0xea, 0x68, 0xd5, 0xfa, 0xcf, 0xa3, 0x55, 0xeb, 0x47, 0x3f, 0x5f, + 0x3d, 0xf3, 0xe0, 0x85, 0x71, 0xfe, 0xcd, 0xcb, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x12, 0x90, + 0x59, 0xec, 0x0d, 0x46, 0x00, 0x00, } func (m *AnalysisRunArgument) Marshal() (dAtA []byte, err error) { @@ -3039,6 +3042,11 @@ func (m *FreightRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i -= len(m.AvailabilityStrategy) + copy(dAtA[i:], m.AvailabilityStrategy) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.AvailabilityStrategy))) + i-- + dAtA[i] = 0x1a { size, err := m.Sources.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -5681,6 +5689,8 @@ func (m *FreightRequest) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.Sources.Size() n += 1 + l + sovGenerated(uint64(l)) + l = len(m.AvailabilityStrategy) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -6833,6 +6843,7 @@ func (this *FreightRequest) String() string { s := strings.Join([]string{`&FreightRequest{`, `Origin:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Origin), "FreightOrigin", "FreightOrigin", 1), `&`, ``, 1) + `,`, `Sources:` + strings.Replace(strings.Replace(this.Sources.String(), "FreightSources", "FreightSources", 1), `&`, ``, 1) + `,`, + `AvailabilityStrategy:` + fmt.Sprintf("%v", this.AvailabilityStrategy) + `,`, `}`, }, "") return s @@ -10933,6 +10944,38 @@ func (m *FreightRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AvailabilityStrategy", 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.AvailabilityStrategy = FreightAvailabilityStrategy(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/api/v1alpha1/generated.proto b/api/v1alpha1/generated.proto index 4b94f28247..beacfe733f 100644 --- a/api/v1alpha1/generated.proto +++ b/api/v1alpha1/generated.proto @@ -382,6 +382,13 @@ message FreightRequest { // Sources describes where the requested Freight may be obtained from. This is // a required field. optional FreightSources sources = 2; + + // AvailabilityStrategy specifies the semantics for how requested Freight is + // made available to the Stage. This field is optional. When left unspecified, + // the field is implicitly treated as if its value were "AnyUpstream". + // + // +kubebuilder:default=AnyUpstream + optional string availabilityStrategy = 3; } message FreightSources { diff --git a/api/v1alpha1/stage_helpers.go b/api/v1alpha1/stage_helpers.go index d62a363304..e7318b162d 100644 --- a/api/v1alpha1/stage_helpers.go +++ b/api/v1alpha1/stage_helpers.go @@ -103,7 +103,7 @@ func GetStage( // This includes: // // 1. Any Freight from a Warehouse that the Stage subscribes to directly -// 2. Any Freight that is verified in any upstream Stages (with any applicable soak time elapsed) +// 2. Any Freight that is verified in upstream Stages matching configured AvailabilityStrategy (with any applicable soak time elapsed) // 3. Any Freight that is approved for the Stage func (s *Stage) ListAvailableFreight( ctx context.Context, @@ -135,8 +135,9 @@ func (s *Stage) ListAvailableFreight( var listOpts *ListWarehouseFreightOptions if !req.Sources.Direct { listOpts = &ListWarehouseFreightOptions{ - ApprovedFor: s.Name, - VerifiedIn: req.Sources.Stages, + ApprovedFor: s.Name, + VerifiedIn: req.Sources.Stages, + RequireAllVerifiedIn: req.AvailabilityStrategy == FreightAvailabilityStrategyAllUpstream, } if requiredSoak := req.Sources.RequiredSoakTime; requiredSoak != nil { listOpts.VerifiedBefore = &metav1.Time{Time: time.Now().Add(-requiredSoak.Duration)} diff --git a/api/v1alpha1/stage_types.go b/api/v1alpha1/stage_types.go index c8ba86ce7b..ec76a80b50 100644 --- a/api/v1alpha1/stage_types.go +++ b/api/v1alpha1/stage_types.go @@ -128,6 +128,14 @@ type FreightOriginKind string const FreightOriginKindWarehouse FreightOriginKind = "Warehouse" +// +kubebuilder:validation:Enum={AllUpstream,AnyUpstream} +type FreightAvailabilityStrategy string + +const ( + FreightAvailabilityStrategyAllUpstream FreightAvailabilityStrategy = "AllUpstream" + FreightAvailabilityStrategyAnyUpstream FreightAvailabilityStrategy = "AnyUpstream" +) + // +kubebuilder:object:root=true // +kubebuilder:subresource:status // +kubebuilder:printcolumn:name=Shard,type=string,JSONPath=`.spec.shard` @@ -205,6 +213,12 @@ type FreightRequest struct { // Sources describes where the requested Freight may be obtained from. This is // a required field. Sources FreightSources `json:"sources" protobuf:"bytes,2,opt,name=sources"` + // AvailabilityStrategy specifies the semantics for how requested Freight is + // made available to the Stage. This field is optional. When left unspecified, + // the field is implicitly treated as if its value were "AnyUpstream". + // + // +kubebuilder:default=AnyUpstream + AvailabilityStrategy FreightAvailabilityStrategy `json:"availabilityStrategy" protobuf:"bytes,3,opt,name=availabilityStrategy"` } // FreightOrigin describes a kind of Freight in terms of where it may have diff --git a/api/v1alpha1/warehouse_helpers.go b/api/v1alpha1/warehouse_helpers.go index 0435932bfa..2d93ea5a5d 100644 --- a/api/v1alpha1/warehouse_helpers.go +++ b/api/v1alpha1/warehouse_helpers.go @@ -10,6 +10,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/sets" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -86,6 +87,11 @@ type ListWarehouseFreightOptions struct { // This is useful for filtering out Freight whose soak time has not yet // elapsed. VerifiedBefore *metav1.Time + // RequireAllVerifiedIn specifies whether ALL of the Stages defined in VerifiedIn + // must have verified a given Freight for it to match. + // IMPORTANT: This is also applied to Freight matched using the VerifiedBefore + // condition. + RequireAllVerifiedIn bool } // ListFreight returns a list of all Freight resources that originated from the @@ -149,6 +155,32 @@ func (w *Warehouse) ListFreight( freight = append(freight, res.Items...) } + // Filter out identified Freight that has not been verified in all of the + // specified VerifiedIn Stages if RequireAllVerifiedIn is true. + // Default behavior is to return Freight that is verified in any of the + // specified VerifiedIn Stages. + if opts.RequireAllVerifiedIn && len(opts.VerifiedIn) > 0 { + // Reduce Freight to only items that are verified in ALL upstream + // Stages. Freight that has been approved for a Stage is considered + // verified in this check. + filtered := make([]Freight, 0, len(freight)) + + for _, f := range freight { + if opts.ApprovedFor != "" { + if f.IsApprovedFor(opts.ApprovedFor) { + filtered = append(filtered, f) + continue + } + } + if f.IsVerifiedInAll(opts.VerifiedIn) { + filtered = append(filtered, f) + continue + } + } + + freight = filtered + } + // Sort and de-dupe slices.SortFunc(freight, func(lhs, rhs Freight) int { return strings.Compare(lhs.Name, rhs.Name) @@ -164,7 +196,6 @@ func (w *Warehouse) ListFreight( // Filter out Freight whose soak time has not yet elapsed filtered := make([]Freight, 0, len(freight)) -freightLoop: for _, f := range freight { if opts.ApprovedFor != "" { if f.IsApprovedFor(opts.ApprovedFor) { @@ -172,14 +203,35 @@ freightLoop: continue } } - for _, ver := range f.Status.VerifiedIn { + + // Track set of Stages that have passed the verification soak time + // for the Freight. + verifiedStages := sets.New[string]() + for stage, ver := range f.Status.VerifiedIn { if verifiedAt := ver.VerifiedAt; verifiedAt != nil { if verifiedAt.Time.Before(opts.VerifiedBefore.Time) { - filtered = append(filtered, f) - continue freightLoop + verifiedStages.Insert(stage) } } } + + // Filter out Freight that has not been verified in all of the specified + // VerifiedIn Stages if RequireAllVerifiedIn is true. + // Otherwise, include Freight if it has passed the soak time in a single + // Stage. + if opts.RequireAllVerifiedIn { + // If Freight is verified in ALL upstream Stages, then it is + // available. + if verifiedStages.Equal(sets.New(opts.VerifiedIn...)) { + filtered = append(filtered, f) + } + continue + } + + // If Freight is verified in ANY upstream Stage, then it is available. + if verifiedStages.Len() > 0 { + filtered = append(filtered, f) + } } return filtered, nil } diff --git a/api/v1alpha1/warehouse_helpers_test.go b/api/v1alpha1/warehouse_helpers_test.go index 93d11dd7ff..7642a711d4 100644 --- a/api/v1alpha1/warehouse_helpers_test.go +++ b/api/v1alpha1/warehouse_helpers_test.go @@ -103,6 +103,7 @@ func TestWarehouse_ListFreight(t *testing.T) { const testWarehouse = "fake-warehouse" const testStage = "fake-stage" const testUpstreamStage = "fake-upstream-stage" + const testUpstreamStage2 = "fake-upstream-stage2" testCases := []struct { name string @@ -171,7 +172,7 @@ func TestWarehouse_ListFreight(t *testing.T) { }, }, { - name: "success with options", + name: "success with VerifiedIn and VerifiedBefore options", opts: &ListWarehouseFreightOptions{ ApprovedFor: testStage, VerifiedIn: []string{testUpstreamStage}, @@ -269,6 +270,111 @@ func TestWarehouse_ListFreight(t *testing.T) { require.Equal(t, "fake-freight-5", freight[1].Name) }, }, + { + name: "success with RequireAllVerifiedIn set to true", + opts: &ListWarehouseFreightOptions{ + RequireAllVerifiedIn: true, + ApprovedFor: testStage, + VerifiedIn: []string{testUpstreamStage, testUpstreamStage2}, + VerifiedBefore: &metav1.Time{Time: time.Now().Add(-1 * time.Hour)}, + }, + objects: []client.Object{ + &Freight{ // This should be returned as its approved for the Stage + ObjectMeta: metav1.ObjectMeta{ + Namespace: testProject, + Name: "fake-freight-1", + }, + Origin: FreightOrigin{ + Kind: FreightOriginKindWarehouse, + Name: testWarehouse, + }, + Status: FreightStatus{ + // This is approved for the Stage + ApprovedFor: map[string]ApprovedStage{testStage: {}}, + // This is only verified in a single upstream Stage + VerifiedIn: map[string]VerifiedStage{ + testUpstreamStage: { + VerifiedAt: ptr.To(metav1.Now()), + }, + }, + }, + }, + &Freight{ // This should be returned because its verified in both upstream Stages and soak time has lapsed + ObjectMeta: metav1.ObjectMeta{ + Namespace: testProject, + Name: "fake-freight-2", + }, + Origin: FreightOrigin{ + Kind: FreightOriginKindWarehouse, + Name: testWarehouse, + }, + Status: FreightStatus{ + // This is not approved for any Stage + ApprovedFor: map[string]ApprovedStage{}, + // This is verified in all of the upstream Stages and the soak time has lapsed + VerifiedIn: map[string]VerifiedStage{ + testUpstreamStage: { + VerifiedAt: ptr.To(metav1.NewTime(time.Now().Add(-2 * time.Hour))), + }, + testUpstreamStage2: { + VerifiedAt: ptr.To(metav1.NewTime(time.Now().Add(-2 * time.Hour))), + }, + }, + }, + }, + &Freight{ // This should not be returned because it's not verified in all of the upstream Stages + ObjectMeta: metav1.ObjectMeta{ + Namespace: testProject, + Name: "fake-freight-3", + }, + Origin: FreightOrigin{ + Kind: FreightOriginKindWarehouse, + Name: testWarehouse, + }, + Status: FreightStatus{ + // This is not approved for any Stage + ApprovedFor: map[string]ApprovedStage{}, + // This is not verified in all of the upstream Stages + VerifiedIn: map[string]VerifiedStage{ + testUpstreamStage: { + VerifiedAt: ptr.To(metav1.Now()), + }, + }, + }, + }, + &Freight{ // This should not be returned because its not passed the soak time in all Stages + ObjectMeta: metav1.ObjectMeta{ + Namespace: testProject, + Name: "fake-freight-4", + }, + Origin: FreightOrigin{ + Kind: FreightOriginKindWarehouse, + Name: testWarehouse, + }, + Status: FreightStatus{ + // This is not approved for any Stage + ApprovedFor: map[string]ApprovedStage{}, + // This is verified in all of the upstream Stages but only passed the soak time of one + VerifiedIn: map[string]VerifiedStage{ + testUpstreamStage: { + VerifiedAt: ptr.To(metav1.NewTime(time.Now().Add(-2 * time.Hour))), + }, + testUpstreamStage2: { + VerifiedAt: ptr.To(metav1.Now()), + }, + }, + }, + }, + }, + assertions: func(t *testing.T, freight []Freight, err error) { + require.NoError(t, err) + require.Len(t, freight, 2) + require.Equal(t, testProject, freight[0].Namespace) + require.Equal(t, "fake-freight-1", freight[0].Name) + require.Equal(t, testProject, freight[1].Namespace) + require.Equal(t, "fake-freight-2", freight[1].Name) + }, + }, } testScheme := k8sruntime.NewScheme() diff --git a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml index f10b055aad..925cbfa3c1 100644 --- a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml +++ b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml @@ -186,6 +186,16 @@ spec: FreightRequest expresses a Stage's need for Freight having originated from a particular Warehouse. properties: + availabilityStrategy: + default: AnyUpstream + description: |- + AvailabilityStrategy specifies the semantics for how requested Freight is + made available to the Stage. This field is optional. When left unspecified, + the field is implicitly treated as if its value were "AnyUpstream". + enum: + - AllUpstream + - AnyUpstream + type: string origin: description: |- Origin specifies from where the requested Freight must have originated. @@ -242,6 +252,7 @@ spec: type: array type: object required: + - availabilityStrategy - origin - sources type: object 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 ebdd3ccb24..d681c489f6 100644 --- a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json +++ b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json @@ -104,6 +104,15 @@ "items": { "description": "FreightRequest expresses a Stage's need for Freight having originated from a\nparticular Warehouse.", "properties": { + "availabilityStrategy": { + "default": "AnyUpstream", + "description": "AvailabilityStrategy specifies the semantics for how requested Freight is\nmade available to the Stage. This field is optional. When left unspecified,\nthe field is implicitly treated as if its value were \"AnyUpstream\".", + "enum": [ + "AllUpstream", + "AnyUpstream" + ], + "type": "string" + }, "origin": { "description": "Origin specifies from where the requested Freight must have originated.\nThis is a required field.", "properties": { @@ -149,6 +158,7 @@ } }, "required": [ + "availabilityStrategy", "origin", "sources" ], diff --git a/ui/src/gen/v1alpha1/generated_pb.ts b/ui/src/gen/v1alpha1/generated_pb.ts index 27ef3419ef..5c511b9813 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("Chh2MWFscGhhMS9nZW5lcmF0ZWQucHJvdG8SJGdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMSIyChNBbmFseXNpc1J1bkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkisAIKE0FuYWx5c2lzUnVuTWV0YWRhdGESVQoGbGFiZWxzGAEgAygLMkUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuTGFiZWxzRW50cnkSXwoLYW5ub3RhdGlvbnMYAiADKAsySi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YS5Bbm5vdGF0aW9uc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaMgoQQW5ub3RhdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFEFuYWx5c2lzUnVuUmVmZXJlbmNlEhEKCW5hbWVzcGFjZRgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBXBoYXNlGAMgASgJIikKGUFuYWx5c2lzVGVtcGxhdGVSZWZlcmVuY2USDAoEbmFtZRgBIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUiSQoMQ3VycmVudFN0YWdlEjkKBXNpbmNlGAEgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUitgIKE0Rpc2NvdmVyZWRBcnRpZmFjdHMSQAoMZGlzY292ZXJlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSRQoDZ2l0GAEgAygLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkdpdERpc2NvdmVyeVJlc3VsdBJKCgZpbWFnZXMYAiADKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2VEaXNjb3ZlcnlSZXN1bHQSSgoGY2hhcnRzGAMgAygLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0RGlzY292ZXJ5UmVzdWx0IrABChBEaXNjb3ZlcmVkQ29tbWl0EgoKAmlkGAEgASgJEg4KBmJyYW5jaBgCIAEoCRILCgN0YWcYAyABKAkSDwoHc3ViamVjdBgEIAEoCRIOCgZhdXRob3IYBSABKAkSEQoJY29tbWl0dGVyGAYgASgJEj8KC2NyZWF0b3JEYXRlGAcgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiigEKGERpc2NvdmVyZWRJbWFnZVJlZmVyZW5jZRILCgN0YWcYASABKAkSDgoGZGlnZXN0GAIgASgJEhIKCmdpdFJlcG9VUkwYAyABKAkSPQoJY3JlYXRlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiogMKB0ZyZWlnaHQSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRINCgVhbGlhcxgHIAEoCRJDCgZvcmlnaW4YCSABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodE9yaWdpbhJACgdjb21taXRzGAMgAygLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkdpdENvbW1pdBI7CgZpbWFnZXMYBCADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSW1hZ2USOwoGY2hhcnRzGAUgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0EkMKBnN0YXR1cxgGIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U3RhdHVzIq0CChFGcmVpZ2h0Q29sbGVjdGlvbhIKCgJpZBgDIAEoCRJRCgVpdGVtcxgBIAMoCzJCLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0Q29sbGVjdGlvbi5JdGVtc0VudHJ5ElMKE3ZlcmlmaWNhdGlvbkhpc3RvcnkYAiADKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpY2F0aW9uSW5mbxpkCgpJdGVtc0VudHJ5EgsKA2tleRgBIAEoCRJFCgV2YWx1ZRgCIAEoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVmZXJlbmNlOgI4ASKNAQoLRnJlaWdodExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodCIrCg1GcmVpZ2h0T3JpZ2luEgwKBGtpbmQYASABKAkSDAoEbmFtZRgCIAEoCSKhAgoQRnJlaWdodFJlZmVyZW5jZRIMCgRuYW1lGAEgASgJEkMKBm9yaWdpbhgIIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgDIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBCADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQiugEKDkZyZWlnaHRSZXF1ZXN0EkMKBm9yaWdpbhgBIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkUKB3NvdXJjZXMYAiABKAsyNC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFNvdXJjZXMSHAoUYXZhaWxhYmlsaXR5U3RyYXRlZ3kYAyABKAkiegoORnJlaWdodFNvdXJjZXMSDgoGZGlyZWN0GAEgASgIEg4KBnN0YWdlcxgCIAMoCRJIChByZXF1aXJlZFNvYWtUaW1lGAMgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uItcECg1GcmVpZ2h0U3RhdHVzElkKC2N1cnJlbnRseUluGAMgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQ3VycmVudGx5SW5FbnRyeRJXCgp2ZXJpZmllZEluGAEgAygLMkMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuVmVyaWZpZWRJbkVudHJ5ElkKC2FwcHJvdmVkRm9yGAIgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQXBwcm92ZWRGb3JFbnRyeRpmChBDdXJyZW50bHlJbkVudHJ5EgsKA2tleRgBIAEoCRJBCgV2YWx1ZRgCIAEoCzIyLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DdXJyZW50U3RhZ2U6AjgBGmYKD1ZlcmlmaWVkSW5FbnRyeRILCgNrZXkYASABKAkSQgoFdmFsdWUYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpZWRTdGFnZToCOAEaZwoQQXBwcm92ZWRGb3JFbnRyeRILCgNrZXkYASABKAkSQgoFdmFsdWUYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXBwcm92ZWRTdGFnZToCOAEieQoJR2l0Q29tbWl0Eg8KB3JlcG9VUkwYASABKAkSCgoCaWQYAiABKAkSDgoGYnJhbmNoGAMgASgJEgsKA3RhZxgEIAEoCRIPCgdtZXNzYWdlGAYgASgJEg4KBmF1dGhvchgHIAEoCRIRCgljb21taXR0ZXIYCCABKAkibgoSR2l0RGlzY292ZXJ5UmVzdWx0Eg8KB3JlcG9VUkwYASABKAkSRwoHY29tbWl0cxgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQ29tbWl0Io4CCg9HaXRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIfChdjb21taXRTZWxlY3Rpb25TdHJhdGVneRgCIAEoCRIOCgZicmFuY2gYAyABKAkSFQoNc3RyaWN0U2VtdmVycxgLIAEoCBIYChBzZW12ZXJDb25zdHJhaW50GAQgASgJEhEKCWFsbG93VGFncxgFIAEoCRISCgppZ25vcmVUYWdzGAYgAygJEh0KFWluc2VjdXJlU2tpcFRMU1ZlcmlmeRgHIAEoCBIUCgxpbmNsdWRlUGF0aHMYCCADKAkSFAoMZXhjbHVkZVBhdGhzGAkgAygJEhYKDmRpc2NvdmVyeUxpbWl0GAogASgFIsgBCgZIZWFsdGgSDgoGc3RhdHVzGAEgASgJEg4KBmlzc3VlcxgCIAMoCRJOCgZjb25maWcYBCABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OEk4KBm91dHB1dBgFIAEoCzI+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]); /** * AnalysisRunArgument represents an argument to be added to an AnalysisRun. @@ -869,6 +869,17 @@ export type FreightRequest = Message<"github.com.akuity.kargo.api.v1alpha1.Freig * @generated from field: optional github.com.akuity.kargo.api.v1alpha1.FreightSources sources = 2; */ sources?: FreightSources; + + /** + * AvailabilityStrategy specifies the semantics for how requested Freight is + * made available to the Stage. This field is optional. When left unspecified, + * the field is implicitly treated as if its value were "AnyUpstream". + * + * +kubebuilder:default=AnyUpstream + * + * @generated from field: optional string availabilityStrategy = 3; + */ + availabilityStrategy: string; }; /**