From c6a9e6e7bbee5a60d43ddc0d3b69713a90e8de72 Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Tue, 8 Jun 2021 14:24:20 -0700 Subject: [PATCH] feat: add retryPolicy --- api/v1alpha1/generated.pb.go | 389 ++++++++++-------- api/v1alpha1/generated.proto | 3 + api/v1alpha1/retry_policy.go | 9 + api/v1alpha1/source.go | 2 + config/ci.yaml | 12 + .../bases/dataflow.argoproj.io_pipelines.yaml | 6 + .../crd/bases/dataflow.argoproj.io_steps.yaml | 6 + config/default.yaml | 12 + config/dev.yaml | 12 + config/quick-start.yaml | 12 + docs/EXAMPLES.md | 7 +- dsls/python/__init__.py | 57 ++- examples/101-hello-pipeline.py | 1 + examples/101-hello-pipeline.yaml | 1 + examples/101-two-node-pipeline.py | 1 + examples/101-two-node-pipeline.yaml | 4 +- examples/102-filter-pipeline.py | 1 + examples/102-filter-pipeline.yaml | 1 + examples/102-flatten-expand-pipeline.py | 1 + examples/102-flatten-expand-pipeline.yaml | 7 +- examples/102-map-pipeline.py | 1 + examples/102-map-pipeline.yaml | 1 + examples/103-autoscaling-pipeline.py | 1 + examples/103-autoscaling-pipeline.yaml | 1 + examples/103-scaling-pipeline.py | 3 +- examples/103-scaling-pipeline.yaml | 5 +- examples/104-go1-16-pipeline.py | 1 + examples/104-go1-16-pipeline.yaml | 1 + examples/104-java16-pipeline.py | 1 + examples/104-java16-pipeline.yaml | 1 + examples/104-python3-9-pipeline.py | 1 + examples/104-python3-9-pipeline.yaml | 1 + examples/106-git-pipeline.py | 1 + examples/106-git-pipeline.yaml | 1 + examples/107-completion-pipeline.py | 1 + examples/107-completion-pipeline.yaml | 1 + examples/108-container-pipeline.py | 1 + examples/108-container-pipeline.yaml | 1 + examples/108-fifos-pipeline.py | 1 + examples/108-fifos-pipeline.yaml | 1 + examples/109-group-pipeline.py | 1 + examples/109-group-pipeline.yaml | 1 + examples/201-vetinary-pipeline.py | 1 + examples/201-vetinary-pipeline.yaml | 13 +- examples/201-word-count-pipeline.py | 1 + examples/201-word-count-pipeline.yaml | 7 +- examples/301-cron-log-pipeline.py | 1 + examples/301-cron-log-pipeline.yaml | 1 + examples/301-erroring-pipeline.py | 24 ++ examples/301-erroring-pipeline.yaml | 35 +- examples/301-http-pipeline.py | 1 + examples/301-http-pipeline.yaml | 1 + examples/301-kafka-pipeline.py | 1 + examples/301-kafka-pipeline.yaml | 1 + examples/301-parallel-pipeline.py | 5 +- examples/301-parallel-pipeline.yaml | 5 +- examples/301-stan-pipeline.py | 1 + examples/301-stan-pipeline.yaml | 4 +- runner/sidecar/handler.go | 7 +- runner/sidecar/sidecar.go | 34 +- 60 files changed, 471 insertions(+), 244 deletions(-) create mode 100644 api/v1alpha1/retry_policy.go create mode 100644 examples/301-erroring-pipeline.py diff --git a/api/v1alpha1/generated.pb.go b/api/v1alpha1/generated.pb.go index bfde884a..bbcf2623 100644 --- a/api/v1alpha1/generated.pb.go +++ b/api/v1alpha1/generated.pb.go @@ -1075,180 +1075,181 @@ func init() { } var fileDescriptor_7a4218a80d7ff35f = []byte{ - // 2761 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x59, 0xcd, 0x73, 0x23, 0xc5, - 0x15, 0xdf, 0xb1, 0xbe, 0x9f, 0x6c, 0xb3, 0xdb, 0x50, 0x95, 0x89, 0x0b, 0x6c, 0xd7, 0x24, 0x90, - 0x25, 0x05, 0x32, 0x6b, 0xa0, 0x6a, 0x17, 0x02, 0x94, 0x25, 0xbc, 0x8b, 0x83, 0xd6, 0x2b, 0x5a, - 0xda, 0x25, 0x09, 0x24, 0x4e, 0x7b, 0xd4, 0x92, 0x07, 0x8d, 0x66, 0x86, 0x9e, 0x96, 0xb3, 0xbe, - 0x51, 0x29, 0x92, 0xaa, 0xdc, 0x38, 0xe6, 0x90, 0x6b, 0x52, 0x54, 0x71, 0xcb, 0x1f, 0x90, 0xf3, - 0x1e, 0x39, 0xa5, 0x38, 0xb9, 0x82, 0xa9, 0xfc, 0x05, 0xa9, 0xe4, 0xe0, 0x53, 0xaa, 0xbf, 0xe6, - 0xc3, 0xd6, 0x66, 0xbd, 0x52, 0xe0, 0x24, 0xcd, 0x7b, 0xaf, 0x7f, 0xdd, 0xfd, 0x5e, 0xf7, 0x7b, - 0xbf, 0xee, 0x86, 0xd6, 0xd0, 0xe3, 0x07, 0x93, 0xfd, 0x86, 0x1b, 0x8e, 0x37, 0x08, 0x1b, 0x86, - 0x11, 0x0b, 0x3f, 0x7a, 0xd1, 0x27, 0xfb, 0xb1, 0xfc, 0x7a, 0xb1, 0x4f, 0x38, 0x19, 0xf8, 0xe1, - 0x6f, 0x36, 0x48, 0xe4, 0x6d, 0x1c, 0x5e, 0x23, 0x7e, 0x74, 0x40, 0xae, 0x6d, 0x0c, 0x69, 0x40, - 0x19, 0xe1, 0xb4, 0xdf, 0x88, 0x58, 0xc8, 0x43, 0xf4, 0x72, 0x0a, 0xd2, 0x30, 0x20, 0x7b, 0x02, - 0x44, 0x7e, 0xed, 0x19, 0x90, 0x06, 0x89, 0xbc, 0x86, 0x01, 0x59, 0x79, 0x31, 0xd3, 0xf3, 0x30, - 0x1c, 0x86, 0x1b, 0x12, 0x6b, 0x7f, 0x32, 0x90, 0x5f, 0xf2, 0x43, 0xfe, 0x53, 0x7d, 0xac, 0x38, - 0xa3, 0xeb, 0x71, 0xc3, 0x0b, 0xe5, 0x40, 0xdc, 0x90, 0xd1, 0x8d, 0xc3, 0x73, 0xe3, 0x58, 0x79, - 0x25, 0xb5, 0x19, 0x13, 0xf7, 0xc0, 0x0b, 0x28, 0x3b, 0xda, 0x88, 0x46, 0x43, 0xd9, 0x88, 0xd1, - 0x38, 0x9c, 0x30, 0x97, 0x3e, 0x56, 0xab, 0x78, 0x63, 0x4c, 0x39, 0x99, 0xd2, 0x97, 0x53, 0x82, - 0x42, 0x8b, 0x70, 0xe7, 0x9b, 0x05, 0xa8, 0xb5, 0xc2, 0x80, 0x13, 0xd1, 0x0c, 0xfd, 0x00, 0x4a, - 0xde, 0x98, 0x0c, 0xa9, 0x6d, 0xad, 0x5b, 0x57, 0x6b, 0xcd, 0xa5, 0x07, 0xc7, 0x6b, 0x97, 0x4e, - 0x8e, 0xd7, 0x4a, 0x3b, 0x42, 0x88, 0x95, 0x0e, 0xfd, 0x1c, 0x16, 0x0f, 0x43, 0x7f, 0x32, 0xa6, - 0xb7, 0xc3, 0x49, 0xc0, 0x63, 0xbb, 0xb4, 0x5e, 0xb8, 0x5a, 0xdf, 0x5c, 0x6b, 0xa8, 0x61, 0x48, - 0x27, 0x89, 0x09, 0x36, 0x0e, 0xaf, 0x35, 0xee, 0xa5, 0x76, 0xcd, 0xa7, 0x34, 0xd8, 0x62, 0x46, - 0x18, 0xe3, 0x1c, 0x14, 0xba, 0x07, 0x0b, 0x5e, 0x60, 0x17, 0xd6, 0xad, 0xab, 0xf5, 0xcd, 0x37, - 0x1b, 0x33, 0x44, 0xa5, 0xb1, 0x13, 0x70, 0xca, 0x06, 0xc4, 0xa5, 0xcd, 0xf2, 0xc9, 0xf1, 0xda, - 0xc2, 0x4e, 0x80, 0x17, 0xbc, 0x00, 0x3d, 0x0b, 0x15, 0x37, 0x1c, 0x8f, 0x49, 0xd0, 0xb7, 0xcb, - 0xeb, 0x85, 0xab, 0xb5, 0x66, 0xfd, 0xe4, 0x78, 0xad, 0xd2, 0x52, 0x22, 0x6c, 0x74, 0xe8, 0x69, - 0x28, 0x12, 0x36, 0x8c, 0xed, 0x8a, 0xb4, 0xa9, 0x9e, 0x1c, 0xaf, 0x15, 0xb7, 0xd8, 0x30, 0xc6, - 0x52, 0x8a, 0x6e, 0x40, 0x81, 0x06, 0x87, 0x76, 0x55, 0x4e, 0x77, 0x65, 0xda, 0x74, 0xb7, 0x83, - 0xc3, 0x7b, 0x84, 0x35, 0xeb, 0x7a, 0xa6, 0x85, 0xed, 0xe0, 0x10, 0x8b, 0x36, 0xce, 0x87, 0x50, - 0x6c, 0xb1, 0x30, 0x40, 0x2f, 0x40, 0x35, 0x76, 0x0f, 0x68, 0x7f, 0xe2, 0x1b, 0x17, 0x5f, 0xd6, - 0xb6, 0xd5, 0xae, 0x96, 0xe3, 0xc4, 0x02, 0x3d, 0x07, 0x65, 0x9f, 0x1c, 0x85, 0x13, 0x6e, 0x2f, - 0x48, 0xdb, 0x65, 0x6d, 0x5b, 0x6e, 0x4b, 0x29, 0xd6, 0x5a, 0xe7, 0x13, 0x0b, 0x4a, 0xdb, 0x8c, - 0x85, 0x0c, 0x3d, 0x0f, 0x95, 0x31, 0x8d, 0xe3, 0x34, 0x82, 0x4f, 0xe8, 0x26, 0x95, 0xdb, 0x4a, - 0x8c, 0x8d, 0x1e, 0xb5, 0xa1, 0xc8, 0xbd, 0x31, 0x95, 0xd0, 0xf5, 0xcd, 0x1f, 0x67, 0xa6, 0x93, - 0x2c, 0xa2, 0x46, 0x34, 0x1a, 0x0a, 0x41, 0xdc, 0x10, 0x8b, 0x48, 0x4c, 0xb0, 0xe7, 0x8d, 0x69, - 0x73, 0x51, 0x63, 0x16, 0xc5, 0x17, 0x96, 0x28, 0x4e, 0x15, 0xca, 0xdb, 0xf7, 0x23, 0x12, 0xf4, - 0x9d, 0x1a, 0x54, 0x6e, 0xfa, 0x84, 0x73, 0x1a, 0x38, 0xff, 0x2c, 0xc2, 0xd2, 0x2d, 0xca, 0x3b, - 0x61, 0xbf, 0x1b, 0x51, 0x17, 0xd3, 0x8f, 0xd1, 0x75, 0x58, 0x8c, 0xbc, 0x88, 0xfa, 0x5e, 0x40, - 0x77, 0xc9, 0xd8, 0x0c, 0x32, 0x59, 0x19, 0x9d, 0x8c, 0x0e, 0xe7, 0x2c, 0xd1, 0x06, 0xd4, 0x02, - 0x32, 0xa6, 0x71, 0x44, 0x5c, 0xaa, 0xdd, 0x71, 0x45, 0x37, 0xab, 0xed, 0x1a, 0x05, 0x4e, 0x6d, - 0x84, 0x2b, 0x18, 0x8d, 0x7c, 0xcf, 0x25, 0x72, 0x3d, 0x95, 0x52, 0x57, 0x60, 0x25, 0xc6, 0x46, - 0x8f, 0x5e, 0x85, 0xba, 0x5c, 0xd9, 0x37, 0x43, 0x36, 0x26, 0xdc, 0x2e, 0x4a, 0xf4, 0x27, 0xb5, - 0x79, 0x7d, 0x27, 0x55, 0xe1, 0xac, 0x9d, 0x68, 0xc6, 0x26, 0x41, 0x40, 0x99, 0xb4, 0xb0, 0x4b, - 0xf9, 0x66, 0x38, 0x55, 0xe1, 0xac, 0x1d, 0xea, 0x02, 0x44, 0x13, 0xdf, 0xef, 0x84, 0xbe, 0xe7, - 0x1e, 0xd9, 0x65, 0xd9, 0xea, 0x65, 0xdd, 0x0a, 0x3a, 0x89, 0xe6, 0xf4, 0x78, 0xed, 0x99, 0xf3, - 0x29, 0xa3, 0x91, 0x1a, 0xe0, 0x0c, 0x0c, 0xba, 0x03, 0xcb, 0x93, 0xa8, 0x4f, 0x38, 0x95, 0xeb, - 0xff, 0x90, 0xf8, 0x76, 0x65, 0xdd, 0xba, 0x5a, 0x68, 0xfe, 0x48, 0x03, 0x2f, 0xdf, 0xcd, 0x69, - 0x4f, 0x8f, 0xd7, 0x96, 0x44, 0xdc, 0x1a, 0x6f, 0x4f, 0x18, 0xe1, 0x5e, 0x18, 0xe0, 0x33, 0xcd, - 0x51, 0x0c, 0x10, 0x73, 0x1a, 0x75, 0x39, 0xe1, 0x93, 0xd8, 0xae, 0xca, 0x45, 0xf2, 0xd6, 0x4c, - 0x3b, 0xb2, 0x9b, 0xc0, 0x34, 0x91, 0x99, 0x66, 0x2a, 0xc3, 0x99, 0x6e, 0x84, 0x47, 0xf7, 0x29, - 0x61, 0x94, 0xf5, 0xc2, 0x11, 0x0d, 0xec, 0x5a, 0xde, 0xa3, 0xcd, 0x54, 0x85, 0xb3, 0x76, 0xce, - 0xbf, 0x2d, 0x28, 0xdc, 0xf2, 0xf8, 0xc5, 0xb2, 0xd7, 0x05, 0x53, 0xc1, 0x33, 0x50, 0x98, 0x30, - 0x5f, 0xaf, 0xb4, 0x64, 0x43, 0xdf, 0xc5, 0x6d, 0x2c, 0xe4, 0x68, 0x1d, 0x8a, 0x11, 0xe1, 0x07, - 0x72, 0x69, 0xd5, 0xd2, 0x1d, 0xd1, 0x21, 0xfc, 0x00, 0x4b, 0x8d, 0xd8, 0xbc, 0xfb, 0x8c, 0x04, - 0xee, 0x81, 0x5e, 0x4f, 0xc9, 0xe6, 0x6d, 0x4a, 0x29, 0xd6, 0x5a, 0x93, 0x55, 0x4a, 0x33, 0x64, - 0x95, 0xff, 0x58, 0x50, 0xba, 0xc5, 0xc2, 0x49, 0x24, 0x46, 0x3b, 0xa2, 0x47, 0x7a, 0xde, 0x89, - 0xe1, 0xbb, 0xf4, 0x08, 0x0b, 0x39, 0xda, 0x04, 0xa0, 0x41, 0xff, 0xce, 0x40, 0x1a, 0xeb, 0x39, - 0x25, 0xb1, 0xd8, 0x4e, 0x34, 0x38, 0x63, 0x85, 0x5e, 0x85, 0xf2, 0x40, 0xed, 0x07, 0x35, 0xc7, - 0x67, 0xcc, 0xf8, 0xd5, 0xea, 0x3f, 0x3d, 0x5e, 0xab, 0x4b, 0x43, 0xbd, 0x33, 0xb4, 0x31, 0x72, - 0xa1, 0x12, 0xf3, 0x90, 0x89, 0x28, 0x14, 0xe5, 0xa2, 0xf9, 0xc9, 0x8c, 0x8b, 0x46, 0x62, 0xa8, - 0xe0, 0xe8, 0x0f, 0x6c, 0x90, 0x9d, 0x32, 0x14, 0xdf, 0xe9, 0xf5, 0x3a, 0xce, 0xf3, 0x50, 0x15, - 0xbf, 0x5d, 0x2f, 0x18, 0x99, 0x80, 0x59, 0xd3, 0x03, 0xe6, 0x2c, 0x02, 0x48, 0x53, 0x59, 0x42, - 0x1d, 0x02, 0x95, 0x77, 0x48, 0xd0, 0xf7, 0x29, 0x43, 0xaf, 0x40, 0x85, 0x4d, 0x02, 0x99, 0x0a, - 0x55, 0xa0, 0x56, 0x92, 0x3c, 0xa1, 0xc4, 0xa7, 0xe9, 0x5f, 0x6c, 0x4c, 0x45, 0xfc, 0xdd, 0xb0, - 0x4f, 0xcf, 0xc6, 0xbf, 0x15, 0xf6, 0x29, 0x96, 0x1a, 0xe7, 0xf7, 0x16, 0xd4, 0x92, 0x62, 0x24, - 0xec, 0x07, 0xde, 0x20, 0x94, 0xc3, 0xab, 0xa6, 0xf6, 0x37, 0x77, 0x6e, 0xde, 0xc1, 0x52, 0x83, - 0xde, 0x87, 0xe2, 0x01, 0xe7, 0x91, 0xce, 0xc7, 0x37, 0x66, 0xf2, 0x9a, 0x98, 0xa1, 0x2a, 0x5b, - 0xe2, 0x1f, 0x96, 0x80, 0xce, 0xe7, 0x0b, 0x50, 0x7a, 0x97, 0x0c, 0x46, 0x44, 0x0c, 0x22, 0x48, - 0xb3, 0x6e, 0x32, 0x08, 0x99, 0x6d, 0xa5, 0x46, 0x6c, 0x8e, 0x7d, 0x16, 0x8e, 0x28, 0x8b, 0xed, - 0x85, 0x74, 0x73, 0x34, 0x95, 0x08, 0x1b, 0x9d, 0xd8, 0x68, 0x3c, 0x8c, 0x3c, 0x57, 0x4f, 0x3f, - 0xd9, 0x68, 0x3d, 0x21, 0xc4, 0x4a, 0x27, 0x12, 0xf0, 0x21, 0x65, 0xb1, 0x17, 0x06, 0xda, 0xb1, - 0x49, 0x02, 0xbe, 0xa7, 0xc4, 0xd8, 0xe8, 0xd1, 0xcf, 0xa0, 0x10, 0x50, 0x2e, 0x33, 0x68, 0x7d, - 0xf3, 0x8d, 0x99, 0xa6, 0x2e, 0x67, 0xb8, 0xbb, 0xdd, 0x6b, 0x56, 0x44, 0xd8, 0x77, 0xb7, 0x7b, - 0x58, 0x40, 0x8a, 0x82, 0x1b, 0x11, 0x46, 0x7c, 0x9f, 0xfa, 0x32, 0xd5, 0x2e, 0xa5, 0x05, 0xb7, - 0xa3, 0xe5, 0x38, 0xb1, 0x70, 0xf6, 0xa0, 0x6a, 0x70, 0x50, 0x17, 0x0a, 0xdc, 0x8f, 0xa5, 0xaf, - 0xea, 0x9b, 0xd7, 0x67, 0x1a, 0x53, 0xaf, 0xdd, 0x55, 0xc3, 0xe9, 0xb5, 0xbb, 0x58, 0xa0, 0x09, - 0xd2, 0xd5, 0x0e, 0x87, 0xce, 0x11, 0x98, 0x7a, 0x2c, 0x62, 0x22, 0x1a, 0x9f, 0x8d, 0xc9, 0xdb, - 0x84, 0x13, 0x2c, 0x35, 0xff, 0xe7, 0x42, 0xfd, 0x49, 0x01, 0xaa, 0xb7, 0x29, 0x27, 0x12, 0xfa, - 0x77, 0x16, 0xd4, 0x49, 0x10, 0x84, 0x5c, 0xd6, 0x00, 0x31, 0x59, 0x91, 0x84, 0x76, 0x67, 0x9a, - 0xac, 0x01, 0x6d, 0x6c, 0xa5, 0x80, 0xdb, 0x01, 0x67, 0x47, 0x69, 0x02, 0xcf, 0x68, 0x70, 0xb6, - 0x5f, 0xf4, 0xb1, 0x20, 0x3a, 0xfb, 0xd4, 0x57, 0xab, 0xae, 0xbe, 0xb9, 0x33, 0xdf, 0x08, 0xda, - 0x12, 0x4b, 0x75, 0x9e, 0xe1, 0x4c, 0x42, 0x88, 0x75, 0x47, 0x2b, 0x6f, 0xc2, 0xe5, 0xb3, 0x03, - 0x45, 0x97, 0x33, 0x59, 0x54, 0x25, 0xce, 0xa7, 0xa0, 0x74, 0x48, 0xfc, 0x89, 0x66, 0x1c, 0x58, - 0x7d, 0xbc, 0xb6, 0x70, 0xdd, 0x5a, 0xb9, 0x01, 0xf5, 0x4c, 0x37, 0x8f, 0xd3, 0xd4, 0xf9, 0xdc, - 0x12, 0xe1, 0xe7, 0xcc, 0x73, 0xf5, 0x4e, 0xe2, 0x44, 0xe5, 0xad, 0x62, 0x76, 0x27, 0x71, 0xe2, - 0x63, 0xa5, 0x13, 0xa5, 0x84, 0x0a, 0x7a, 0x17, 0xcb, 0x1d, 0x52, 0x4c, 0xe7, 0x24, 0x49, 0x5f, - 0x8c, 0xb5, 0x16, 0x75, 0xa0, 0x28, 0x18, 0xbe, 0x5c, 0xe8, 0xf5, 0xcd, 0xc6, 0xff, 0x5a, 0x29, - 0x0d, 0x73, 0x9a, 0x68, 0xbc, 0x37, 0x21, 0x01, 0xf7, 0xf8, 0x51, 0xba, 0x5a, 0x30, 0xe1, 0x14, - 0x4b, 0x24, 0xe7, 0x6f, 0x0b, 0x50, 0x35, 0xa4, 0x0c, 0xfd, 0x1a, 0xaa, 0x63, 0xed, 0x62, 0xbd, - 0x2d, 0x5e, 0xba, 0xd8, 0x62, 0xbc, 0xb3, 0xff, 0x11, 0x75, 0xb9, 0x08, 0x4f, 0x5a, 0x75, 0x52, - 0x19, 0x4e, 0x50, 0x91, 0x0b, 0xc5, 0x38, 0xa2, 0xae, 0x5e, 0xea, 0x5b, 0x33, 0xad, 0x02, 0x33, - 0x5c, 0x41, 0x39, 0xd3, 0x39, 0x49, 0x02, 0x2a, 0xc1, 0xd1, 0x08, 0xca, 0xb1, 0x62, 0x35, 0xea, - 0x9c, 0xd1, 0x9a, 0xaf, 0x1b, 0xc5, 0x6c, 0x92, 0x90, 0x68, 0x56, 0xa3, 0xbb, 0x70, 0xbe, 0xb4, - 0x20, 0x61, 0xb5, 0x6d, 0x2f, 0xe6, 0xe8, 0xc3, 0x73, 0x4e, 0x6c, 0x5c, 0xcc, 0x89, 0xa2, 0xb5, - 0x74, 0x61, 0x92, 0xc0, 0x8c, 0x24, 0xe3, 0xc0, 0x7d, 0x28, 0x79, 0x9c, 0x8e, 0xcd, 0x3e, 0x7a, - 0x63, 0xae, 0xa9, 0x65, 0x08, 0x94, 0xc0, 0xc4, 0x0a, 0xda, 0x61, 0xe9, 0x8c, 0x84, 0x57, 0x45, - 0x9f, 0x82, 0xc2, 0x99, 0xec, 0xf1, 0xc6, 0xec, 0x24, 0x51, 0x44, 0x2c, 0xe9, 0x53, 0x48, 0x62, - 0xac, 0xa0, 0x9d, 0xbf, 0x5b, 0xb0, 0x9c, 0xf7, 0x38, 0x7a, 0x05, 0x4a, 0xd1, 0x01, 0x89, 0x4d, - 0x35, 0x5b, 0x35, 0xed, 0x3a, 0x42, 0x28, 0xf8, 0xad, 0xb1, 0x97, 0x02, 0xac, 0x8c, 0xb3, 0x07, - 0xa4, 0x85, 0x47, 0x1c, 0x90, 0x5c, 0x00, 0x37, 0x0c, 0xfa, 0x9e, 0x4a, 0x8d, 0x05, 0x39, 0xb9, - 0x8d, 0x8b, 0xc5, 0xaa, 0x65, 0xda, 0xa5, 0xeb, 0x3d, 0x11, 0xc5, 0x38, 0x03, 0xeb, 0x7c, 0xb1, - 0x00, 0xc5, 0x6e, 0x6f, 0x6b, 0xf7, 0x02, 0xb5, 0xf9, 0x79, 0xa8, 0x04, 0x84, 0xc7, 0x77, 0x99, - 0x7f, 0xb6, 0x9e, 0xee, 0x6e, 0xf5, 0xba, 0x82, 0xe8, 0x18, 0xbd, 0x38, 0x2c, 0xb9, 0xfe, 0x24, - 0xe6, 0x94, 0xed, 0xf4, 0xf5, 0xb9, 0x24, 0x39, 0x2c, 0xb5, 0xb4, 0xe2, 0x6d, 0x9c, 0xda, 0x08, - 0xec, 0x78, 0x22, 0x77, 0xa4, 0x2e, 0xe9, 0x09, 0x76, 0x57, 0x89, 0xb1, 0xd1, 0xa3, 0x36, 0x2c, - 0xe9, 0xbf, 0x1d, 0x46, 0x07, 0xde, 0x7d, 0x7d, 0x82, 0x79, 0x4e, 0x37, 0x58, 0xea, 0x66, 0x95, - 0xa7, 0x67, 0x05, 0x38, 0xdf, 0x38, 0x57, 0x9f, 0x2b, 0x8f, 0xac, 0xcf, 0x5f, 0x58, 0x50, 0xea, - 0xba, 0xc4, 0xa7, 0xe2, 0xa4, 0x30, 0xf6, 0x02, 0x7d, 0x92, 0x53, 0x55, 0xba, 0x94, 0x16, 0x9a, - 0xdb, 0xa9, 0x0a, 0x67, 0xed, 0xd0, 0x35, 0xa8, 0x8f, 0xc9, 0xfd, 0xa4, 0xd9, 0x82, 0xec, 0xf1, - 0x09, 0xd9, 0x24, 0x15, 0xe3, 0xac, 0x8d, 0x38, 0xb2, 0xea, 0x73, 0x22, 0x16, 0xb5, 0x42, 0xfa, - 0x67, 0x29, 0x3d, 0xb2, 0xe2, 0x8c, 0x0e, 0xe7, 0x2c, 0x9d, 0xcf, 0x0a, 0x50, 0x94, 0xd4, 0xf4, - 0xd1, 0xb1, 0x7d, 0x1f, 0x8a, 0x31, 0x27, 0xc1, 0x5c, 0xe4, 0x4f, 0x2c, 0x23, 0x45, 0xfe, 0xc4, - 0x3f, 0x2c, 0x01, 0xd1, 0x07, 0x50, 0x1a, 0x09, 0x46, 0xa3, 0x73, 0xdd, 0x6b, 0xb3, 0x73, 0xab, - 0x66, 0x4d, 0xec, 0x2e, 0xf9, 0x17, 0x2b, 0x4c, 0x41, 0x91, 0xfc, 0x70, 0xa8, 0x79, 0xfe, 0x6c, - 0x14, 0xa9, 0x1d, 0x0e, 0x15, 0x45, 0x6a, 0x87, 0x43, 0x2c, 0xd0, 0xd0, 0x07, 0x9a, 0x07, 0xcf, - 0x43, 0x06, 0xcd, 0xa1, 0xe0, 0x1c, 0x17, 0xfe, 0x63, 0x01, 0xca, 0xea, 0x08, 0x70, 0xb1, 0xa0, - 0xb8, 0x2c, 0x9c, 0x2f, 0x28, 0x2d, 0x16, 0x06, 0x6a, 0x14, 0xe2, 0x1f, 0x96, 0x80, 0x49, 0xb4, - 0x0b, 0xdf, 0x5a, 0xb4, 0x8b, 0xdf, 0x42, 0xb4, 0x7f, 0x99, 0x0b, 0xcc, 0x5b, 0xb3, 0x07, 0x46, - 0xfa, 0xff, 0x5c, 0x68, 0x3e, 0x2d, 0xc2, 0xa2, 0x52, 0xe9, 0x04, 0x1f, 0x42, 0xdd, 0x27, 0xa2, - 0xc2, 0xa5, 0xe9, 0x7a, 0xd6, 0xd3, 0xa4, 0xc6, 0x50, 0x3b, 0xbd, 0x9d, 0x82, 0xe2, 0x6c, 0x0f, - 0x68, 0x08, 0x35, 0xf1, 0x29, 0x49, 0x95, 0x9e, 0xe5, 0x6c, 0x1e, 0x94, 0x08, 0xcd, 0x25, 0x91, - 0x6d, 0xdb, 0x06, 0x10, 0xa7, 0xd8, 0xe2, 0x94, 0x15, 0xd1, 0xa0, 0xef, 0x05, 0x43, 0xb9, 0x04, - 0x8a, 0xea, 0x94, 0xd5, 0x51, 0x22, 0x6c, 0x74, 0xe8, 0x48, 0xd4, 0x2a, 0x49, 0x13, 0xed, 0xe2, - 0x1c, 0xc4, 0x3c, 0xeb, 0xd4, 0x86, 0xe6, 0x9d, 0x8a, 0x1b, 0x67, 0x6a, 0x9f, 0x94, 0x62, 0xd3, - 0xdf, 0xca, 0x7d, 0x58, 0xcc, 0x5a, 0x4e, 0xa1, 0xb7, 0x38, 0x4b, 0x6f, 0x67, 0x8f, 0x8b, 0xea, - 0x37, 0x43, 0x8e, 0xff, 0x2a, 0x0a, 0x22, 0xa7, 0xd1, 0x77, 0xc0, 0x36, 0xf7, 0x72, 0x6c, 0x73, - 0x4e, 0xde, 0x32, 0x8d, 0x69, 0x0e, 0xcf, 0x30, 0xcd, 0xb9, 0xef, 0xcf, 0x1e, 0xc6, 0x32, 0x1f, - 0x58, 0x50, 0x15, 0x66, 0xdf, 0x01, 0xc3, 0xfc, 0x55, 0x9e, 0x61, 0xde, 0x98, 0x79, 0x4a, 0x0f, - 0x61, 0x97, 0xff, 0x5a, 0x56, 0x53, 0x91, 0xd4, 0xd2, 0xe4, 0xe8, 0xf2, 0x43, 0x73, 0x74, 0x17, - 0x0a, 0x2e, 0xe1, 0xf6, 0x13, 0x73, 0x94, 0xa0, 0x16, 0xe1, 0xaa, 0x04, 0xb5, 0x08, 0xc7, 0x02, - 0x0d, 0x8d, 0xa0, 0xe6, 0x9a, 0x27, 0x11, 0xed, 0xc2, 0xd9, 0x1e, 0x23, 0x92, 0x87, 0x15, 0x95, - 0x0c, 0x92, 0x4f, 0x9c, 0xe2, 0x23, 0x17, 0x2a, 0x07, 0xea, 0x2a, 0x4a, 0x12, 0xa0, 0x59, 0xb7, - 0x92, 0xbe, 0xce, 0x52, 0xa9, 0x44, 0x7f, 0x60, 0x83, 0x2c, 0xdc, 0x34, 0xf4, 0xb8, 0xbd, 0x38, - 0x87, 0x9b, 0x6e, 0x79, 0xda, 0x4d, 0xb7, 0x3c, 0x8e, 0x05, 0x1a, 0x7a, 0x09, 0xca, 0x03, 0xcf, - 0xe7, 0x94, 0xc9, 0xeb, 0xe1, 0x5a, 0xd3, 0x4e, 0x6e, 0x08, 0xa5, 0xf4, 0x34, 0xf9, 0x87, 0xb5, - 0x1d, 0xfa, 0x21, 0x14, 0xc6, 0x24, 0xd2, 0xf7, 0xba, 0x66, 0x73, 0x16, 0x6e, 0x93, 0xe8, 0x54, - 0xfd, 0x60, 0xa1, 0x16, 0x55, 0x6c, 0x28, 0x2f, 0x2a, 0xeb, 0x73, 0xe4, 0x60, 0x79, 0x37, 0xa9, - 0xaa, 0x98, 0xba, 0xdb, 0x54, 0x98, 0xc2, 0xdd, 0x03, 0xf5, 0x3c, 0x61, 0x7f, 0x7f, 0x0e, 0x77, - 0xeb, 0x27, 0x0e, 0xe5, 0x6e, 0xfd, 0x81, 0x0d, 0x32, 0xda, 0x83, 0x32, 0x95, 0xaf, 0x21, 0xf6, - 0x8a, 0xec, 0xe3, 0xf5, 0xd9, 0xca, 0x88, 0x84, 0x68, 0x82, 0x3c, 0xe9, 0xcb, 0xff, 0x58, 0xc3, - 0x0a, 0xda, 0xcc, 0x0c, 0x89, 0xfd, 0x5e, 0x9e, 0x36, 0x27, 0x2c, 0x36, 0xb1, 0x10, 0x0e, 0x8d, - 0x05, 0x6b, 0xb6, 0xed, 0x39, 0x1c, 0x2a, 0x79, 0xb7, 0x72, 0xa8, 0xfc, 0x8b, 0x15, 0x26, 0x1a, - 0x40, 0x45, 0xdd, 0x24, 0x98, 0x33, 0xd2, 0xeb, 0x73, 0x54, 0xa9, 0xcc, 0xb9, 0x43, 0x61, 0x62, - 0x03, 0x2e, 0x12, 0x4f, 0xec, 0x05, 0x23, 0x53, 0x0b, 0x67, 0x4c, 0x3c, 0x82, 0x14, 0xa6, 0x47, - 0x4c, 0x81, 0x87, 0x15, 0x2c, 0xda, 0x83, 0x25, 0x46, 0x63, 0x4e, 0x18, 0xd7, 0x2f, 0x33, 0xea, - 0xdc, 0x74, 0xc3, 0x9c, 0x6b, 0x70, 0x56, 0x79, 0x7a, 0xbc, 0xb6, 0x3e, 0xe5, 0x71, 0x26, 0x67, - 0x83, 0xf3, 0x78, 0x68, 0x13, 0x80, 0x53, 0x36, 0xf6, 0x02, 0xc2, 0x43, 0x66, 0x83, 0xbc, 0x08, - 0x4e, 0x0a, 0x54, 0x2f, 0xd1, 0xe0, 0x8c, 0x15, 0xda, 0x86, 0x8a, 0x7a, 0x1f, 0x8d, 0xed, 0xa5, - 0x87, 0x3f, 0x10, 0xa8, 0x07, 0xd5, 0xcc, 0xfd, 0xaa, 0x6a, 0x82, 0x4d, 0x5b, 0xf4, 0x53, 0x40, - 0x31, 0x65, 0x87, 0x9e, 0x4b, 0xb7, 0x5c, 0x37, 0x9c, 0x04, 0x5c, 0x3e, 0xbe, 0x2d, 0xe7, 0xae, - 0xbb, 0x51, 0xf7, 0x9c, 0x05, 0x9e, 0xd2, 0x0a, 0x0d, 0x33, 0xe5, 0xe5, 0xf2, 0x1c, 0x95, 0xd3, - 0xdc, 0xd6, 0x35, 0x17, 0xc5, 0xaa, 0x35, 0x5f, 0x99, 0x4a, 0xf3, 0x07, 0x0b, 0x16, 0x83, 0xb0, - 0x4f, 0xbb, 0xd4, 0xa7, 0xae, 0x70, 0xd9, 0x15, 0xe9, 0x81, 0x3b, 0x73, 0xd5, 0xe9, 0xc6, 0x6e, - 0x06, 0x51, 0xb1, 0xa0, 0xe4, 0x28, 0x97, 0x55, 0xe1, 0x5c, 0xd7, 0xe8, 0x26, 0x54, 0xc9, 0x60, - 0xe0, 0x05, 0x1e, 0x3f, 0xb2, 0x91, 0x9c, 0xf4, 0xd3, 0xd3, 0x02, 0xb1, 0xa5, 0x6d, 0xd4, 0x9c, - 0xcc, 0x17, 0x4e, 0xda, 0xa2, 0xbb, 0x50, 0xe7, 0xa1, 0x4f, 0x99, 0xbe, 0x6f, 0x7d, 0x52, 0xce, - 0x68, 0x75, 0x1a, 0x54, 0x2f, 0x31, 0x4b, 0x8f, 0xb5, 0xa9, 0x2c, 0xc6, 0x59, 0x9c, 0x95, 0xb7, - 0xe0, 0xca, 0xb9, 0x79, 0x3d, 0xd6, 0x95, 0xe4, 0x5f, 0x2a, 0x90, 0x79, 0x93, 0x43, 0x2f, 0xe5, - 0xef, 0x56, 0x56, 0xce, 0xde, 0xad, 0xd4, 0x84, 0x6d, 0xee, 0x5e, 0xe5, 0x39, 0x28, 0x33, 0x4a, - 0xe2, 0x30, 0xd0, 0xb5, 0x20, 0x61, 0x2a, 0x58, 0x4a, 0xb1, 0xd6, 0x3e, 0xce, 0xfd, 0x4b, 0x36, - 0xc7, 0x95, 0x1e, 0x99, 0xe3, 0x5e, 0x80, 0x6a, 0x6c, 0x16, 0x4a, 0xe5, 0xcc, 0xcb, 0xba, 0x89, - 0x69, 0x62, 0x81, 0xfa, 0xb0, 0x28, 0xe8, 0xb8, 0x4c, 0x64, 0xfd, 0x2d, 0xae, 0x6f, 0x4c, 0x1f, - 0xe7, 0x6e, 0x3d, 0x59, 0x35, 0xed, 0x0c, 0x0e, 0xce, 0xa1, 0xa2, 0x3f, 0x5b, 0xb0, 0x1c, 0x67, - 0xd8, 0x77, 0x92, 0x22, 0xbb, 0x73, 0x12, 0xc1, 0x1c, 0xa7, 0xa7, 0x9a, 0xcd, 0x5f, 0x35, 0x4f, - 0xbd, 0x79, 0xe5, 0xe9, 0x39, 0x09, 0x3e, 0x33, 0x28, 0xf4, 0x27, 0x0b, 0x16, 0x45, 0x12, 0x4c, - 0x46, 0xa9, 0x52, 0xec, 0x7b, 0x73, 0x8f, 0x32, 0x83, 0xa9, 0xc6, 0xf8, 0xac, 0x59, 0xca, 0x89, - 0x6a, 0xea, 0x00, 0x73, 0xa3, 0x59, 0xf9, 0xd4, 0x82, 0x27, 0xa7, 0x4c, 0x78, 0xca, 0x02, 0x7f, - 0x3f, 0x7f, 0x28, 0xd9, 0x9a, 0xfb, 0xbc, 0x94, 0xbd, 0xf1, 0xff, 0xad, 0x05, 0x57, 0xce, 0xcd, - 0xe8, 0x3b, 0x1e, 0x84, 0x73, 0x0f, 0xcc, 0x6b, 0xe8, 0xc5, 0x6e, 0x0c, 0xe3, 0xc9, 0x7e, 0x87, - 0xf0, 0x83, 0xb3, 0x9b, 0xad, 0xab, 0xc4, 0xd8, 0xe8, 0x9d, 0x12, 0x14, 0x7a, 0xed, 0x6e, 0xb3, - 0xf1, 0xe0, 0xeb, 0xd5, 0x4b, 0x5f, 0x7e, 0xbd, 0x7a, 0xe9, 0xab, 0xaf, 0x57, 0x2f, 0x7d, 0x72, - 0xb2, 0x6a, 0x3d, 0x38, 0x59, 0xb5, 0xbe, 0x3c, 0x59, 0xb5, 0xbe, 0x3a, 0x59, 0xb5, 0xfe, 0x71, - 0xb2, 0x6a, 0x7d, 0xf6, 0xcd, 0xea, 0xa5, 0x5f, 0x54, 0xcd, 0x30, 0xff, 0x1b, 0x00, 0x00, 0xff, - 0xff, 0x8e, 0xd2, 0x86, 0x38, 0x7e, 0x25, 0x00, 0x00, + // 2783 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x59, 0xcf, 0x6f, 0x1b, 0xc7, + 0xf5, 0xf7, 0x8a, 0xbf, 0x1f, 0x25, 0xc5, 0x9e, 0x04, 0xf8, 0xee, 0x57, 0x48, 0x24, 0x61, 0xdb, + 0xa4, 0x4e, 0x91, 0x50, 0xb1, 0x92, 0x00, 0x76, 0xd2, 0x24, 0x10, 0x65, 0xd9, 0x51, 0x43, 0xcb, + 0xcc, 0x90, 0x76, 0xda, 0x26, 0xad, 0x3a, 0x5a, 0x0e, 0xa9, 0x0d, 0x97, 0xbb, 0x9b, 0xd9, 0xa1, + 0x6a, 0xdd, 0x82, 0x22, 0x2d, 0xd0, 0x5b, 0xfe, 0x80, 0x5e, 0x5b, 0x04, 0xc8, 0xad, 0x7f, 0x40, + 0xcf, 0x3e, 0xe6, 0x54, 0xe4, 0x24, 0x34, 0x0a, 0xfa, 0x17, 0x14, 0xed, 0x41, 0xa7, 0x62, 0x7e, + 0xed, 0x0f, 0x8a, 0xae, 0x65, 0xb2, 0xc9, 0x89, 0xdc, 0xf7, 0xde, 0x7c, 0x66, 0xe6, 0xbd, 0x99, + 0xf7, 0x3e, 0x33, 0x03, 0xdb, 0x03, 0x8f, 0x1f, 0x8e, 0x0f, 0x1a, 0x6e, 0x38, 0xda, 0x20, 0x6c, + 0x10, 0x46, 0x2c, 0xfc, 0xf8, 0x65, 0x9f, 0x1c, 0xc4, 0xf2, 0xeb, 0xe5, 0x1e, 0xe1, 0xa4, 0xef, + 0x87, 0xbf, 0xd9, 0x20, 0x91, 0xb7, 0x71, 0x74, 0x8d, 0xf8, 0xd1, 0x21, 0xb9, 0xb6, 0x31, 0xa0, + 0x01, 0x65, 0x84, 0xd3, 0x5e, 0x23, 0x62, 0x21, 0x0f, 0xd1, 0xab, 0x29, 0x48, 0xc3, 0x80, 0xec, + 0x0b, 0x10, 0xf9, 0xb5, 0x6f, 0x40, 0x1a, 0x24, 0xf2, 0x1a, 0x06, 0x64, 0xe5, 0xe5, 0x4c, 0xcf, + 0x83, 0x70, 0x10, 0x6e, 0x48, 0xac, 0x83, 0x71, 0x5f, 0x7e, 0xc9, 0x0f, 0xf9, 0x4f, 0xf5, 0xb1, + 0xe2, 0x0c, 0xaf, 0xc7, 0x0d, 0x2f, 0x94, 0x03, 0x71, 0x43, 0x46, 0x37, 0x8e, 0xce, 0x8d, 0x63, + 0xe5, 0xb5, 0xd4, 0x66, 0x44, 0xdc, 0x43, 0x2f, 0xa0, 0xec, 0x78, 0x23, 0x1a, 0x0e, 0x64, 0x23, + 0x46, 0xe3, 0x70, 0xcc, 0x5c, 0xfa, 0x44, 0xad, 0xe2, 0x8d, 0x11, 0xe5, 0x64, 0x4a, 0x5f, 0x4e, + 0x09, 0x0a, 0xdb, 0x84, 0x3b, 0xdf, 0x2e, 0x40, 0x6d, 0x3b, 0x0c, 0x38, 0x11, 0xcd, 0xd0, 0x0f, + 0xa0, 0xe4, 0x8d, 0xc8, 0x80, 0xda, 0xd6, 0xba, 0x75, 0xb5, 0xd6, 0x5c, 0x7a, 0x78, 0xb2, 0x76, + 0xe9, 0xf4, 0x64, 0xad, 0xb4, 0x2b, 0x84, 0x58, 0xe9, 0xd0, 0xcf, 0x61, 0xf1, 0x28, 0xf4, 0xc7, + 0x23, 0x7a, 0x27, 0x1c, 0x07, 0x3c, 0xb6, 0x4b, 0xeb, 0x85, 0xab, 0xf5, 0xcd, 0xb5, 0x86, 0x1a, + 0x86, 0x74, 0x92, 0x98, 0x60, 0xe3, 0xe8, 0x5a, 0xe3, 0x7e, 0x6a, 0xd7, 0x7c, 0x46, 0x83, 0x2d, + 0x66, 0x84, 0x31, 0xce, 0x41, 0xa1, 0xfb, 0xb0, 0xe0, 0x05, 0x76, 0x61, 0xdd, 0xba, 0x5a, 0xdf, + 0x7c, 0xbb, 0x31, 0x43, 0x54, 0x1a, 0xbb, 0x01, 0xa7, 0xac, 0x4f, 0x5c, 0xda, 0x2c, 0x9f, 0x9e, + 0xac, 0x2d, 0xec, 0x06, 0x78, 0xc1, 0x0b, 0xd0, 0xf3, 0x50, 0x71, 0xc3, 0xd1, 0x88, 0x04, 0x3d, + 0xbb, 0xbc, 0x5e, 0xb8, 0x5a, 0x6b, 0xd6, 0x4f, 0x4f, 0xd6, 0x2a, 0xdb, 0x4a, 0x84, 0x8d, 0x0e, + 0x3d, 0x0b, 0x45, 0xc2, 0x06, 0xb1, 0x5d, 0x91, 0x36, 0xd5, 0xd3, 0x93, 0xb5, 0xe2, 0x16, 0x1b, + 0xc4, 0x58, 0x4a, 0xd1, 0x0d, 0x28, 0xd0, 0xe0, 0xc8, 0xae, 0xca, 0xe9, 0xae, 0x4c, 0x9b, 0xee, + 0x4e, 0x70, 0x74, 0x9f, 0xb0, 0x66, 0x5d, 0xcf, 0xb4, 0xb0, 0x13, 0x1c, 0x61, 0xd1, 0xc6, 0xf9, + 0x08, 0x8a, 0xdb, 0x2c, 0x0c, 0xd0, 0x4b, 0x50, 0x8d, 0xdd, 0x43, 0xda, 0x1b, 0xfb, 0xc6, 0xc5, + 0x97, 0xb5, 0x6d, 0xb5, 0xa3, 0xe5, 0x38, 0xb1, 0x40, 0x2f, 0x40, 0xd9, 0x27, 0xc7, 0xe1, 0x98, + 0xdb, 0x0b, 0xd2, 0x76, 0x59, 0xdb, 0x96, 0x5b, 0x52, 0x8a, 0xb5, 0xd6, 0xf9, 0xd4, 0x82, 0xd2, + 0x0e, 0x63, 0x21, 0x43, 0x2f, 0x42, 0x65, 0x44, 0xe3, 0x38, 0x8d, 0xe0, 0x53, 0xba, 0x49, 0xe5, + 0x8e, 0x12, 0x63, 0xa3, 0x47, 0x2d, 0x28, 0x72, 0x6f, 0x44, 0x25, 0x74, 0x7d, 0xf3, 0xc7, 0x99, + 0xe9, 0x24, 0x8b, 0xa8, 0x11, 0x0d, 0x07, 0x42, 0x10, 0x37, 0xc4, 0x22, 0x12, 0x13, 0xec, 0x7a, + 0x23, 0xda, 0x5c, 0xd4, 0x98, 0x45, 0xf1, 0x85, 0x25, 0x8a, 0x53, 0x85, 0xf2, 0xce, 0x83, 0x88, + 0x04, 0x3d, 0xa7, 0x06, 0x95, 0x5b, 0x3e, 0xe1, 0x9c, 0x06, 0xce, 0x3f, 0x8a, 0xb0, 0x74, 0x9b, + 0xf2, 0x76, 0xd8, 0xeb, 0x44, 0xd4, 0xc5, 0xf4, 0x13, 0x74, 0x1d, 0x16, 0x23, 0x2f, 0xa2, 0xbe, + 0x17, 0xd0, 0x3d, 0x32, 0x32, 0x83, 0x4c, 0x56, 0x46, 0x3b, 0xa3, 0xc3, 0x39, 0x4b, 0xb4, 0x01, + 0xb5, 0x80, 0x8c, 0x68, 0x1c, 0x11, 0x97, 0x6a, 0x77, 0x5c, 0xd1, 0xcd, 0x6a, 0x7b, 0x46, 0x81, + 0x53, 0x1b, 0xe1, 0x0a, 0x46, 0x23, 0xdf, 0x73, 0x89, 0x5c, 0x4f, 0xa5, 0xd4, 0x15, 0x58, 0x89, + 0xb1, 0xd1, 0xa3, 0xd7, 0xa1, 0x2e, 0x57, 0xf6, 0xad, 0x90, 0x8d, 0x08, 0xb7, 0x8b, 0x12, 0xfd, + 0x69, 0x6d, 0x5e, 0xdf, 0x4d, 0x55, 0x38, 0x6b, 0x27, 0x9a, 0xb1, 0x71, 0x10, 0x50, 0x26, 0x2d, + 0xec, 0x52, 0xbe, 0x19, 0x4e, 0x55, 0x38, 0x6b, 0x87, 0x3a, 0x00, 0xd1, 0xd8, 0xf7, 0xdb, 0xa1, + 0xef, 0xb9, 0xc7, 0x76, 0x59, 0xb6, 0x7a, 0x55, 0xb7, 0x82, 0x76, 0xa2, 0x39, 0x3b, 0x59, 0x7b, + 0xee, 0x7c, 0xca, 0x68, 0xa4, 0x06, 0x38, 0x03, 0x83, 0xee, 0xc2, 0xf2, 0x38, 0xea, 0x11, 0x4e, + 0xe5, 0xfa, 0x3f, 0x22, 0xbe, 0x5d, 0x59, 0xb7, 0xae, 0x16, 0x9a, 0x3f, 0xd2, 0xc0, 0xcb, 0xf7, + 0x72, 0xda, 0xb3, 0x93, 0xb5, 0x25, 0x11, 0xb7, 0xc6, 0xcd, 0x31, 0x23, 0xdc, 0x0b, 0x03, 0x3c, + 0xd1, 0x1c, 0xc5, 0x00, 0x31, 0xa7, 0x51, 0x87, 0x13, 0x3e, 0x8e, 0xed, 0xaa, 0x5c, 0x24, 0xef, + 0xcc, 0xb4, 0x23, 0x3b, 0x09, 0x4c, 0x13, 0x99, 0x69, 0xa6, 0x32, 0x9c, 0xe9, 0x46, 0x78, 0xf4, + 0x80, 0x12, 0x46, 0x59, 0x37, 0x1c, 0xd2, 0xc0, 0xae, 0xe5, 0x3d, 0xda, 0x4c, 0x55, 0x38, 0x6b, + 0xe7, 0xfc, 0xcb, 0x82, 0xc2, 0x6d, 0x8f, 0x5f, 0x2c, 0x7b, 0x5d, 0x30, 0x15, 0x3c, 0x07, 0x85, + 0x31, 0xf3, 0xf5, 0x4a, 0x4b, 0x36, 0xf4, 0x3d, 0xdc, 0xc2, 0x42, 0x8e, 0xd6, 0xa1, 0x18, 0x11, + 0x7e, 0x28, 0x97, 0x56, 0x2d, 0xdd, 0x11, 0x6d, 0xc2, 0x0f, 0xb1, 0xd4, 0x88, 0xcd, 0x7b, 0xc0, + 0x48, 0xe0, 0x1e, 0xea, 0xf5, 0x94, 0x6c, 0xde, 0xa6, 0x94, 0x62, 0xad, 0x35, 0x59, 0xa5, 0x34, + 0x43, 0x56, 0xf9, 0xb7, 0x05, 0xa5, 0xdb, 0x2c, 0x1c, 0x47, 0x62, 0xb4, 0x43, 0x7a, 0xac, 0xe7, + 0x9d, 0x18, 0xbe, 0x47, 0x8f, 0xb1, 0x90, 0xa3, 0x4d, 0x00, 0x1a, 0xf4, 0xee, 0xf6, 0xa5, 0xb1, + 0x9e, 0x53, 0x12, 0x8b, 0x9d, 0x44, 0x83, 0x33, 0x56, 0xe8, 0x75, 0x28, 0xf7, 0xd5, 0x7e, 0x50, + 0x73, 0x7c, 0xce, 0x8c, 0x5f, 0xad, 0xfe, 0xb3, 0x93, 0xb5, 0xba, 0x34, 0xd4, 0x3b, 0x43, 0x1b, + 0x23, 0x17, 0x2a, 0x31, 0x0f, 0x99, 0x88, 0x42, 0x51, 0x2e, 0x9a, 0x9f, 0xcc, 0xb8, 0x68, 0x24, + 0x86, 0x0a, 0x8e, 0xfe, 0xc0, 0x06, 0xd9, 0x29, 0x43, 0xf1, 0xdd, 0x6e, 0xb7, 0xed, 0xbc, 0x08, + 0x55, 0xf1, 0xdb, 0xf1, 0x82, 0xa1, 0x09, 0x98, 0x35, 0x3d, 0x60, 0xce, 0x22, 0x80, 0x34, 0x95, + 0x25, 0xd4, 0x21, 0x50, 0x79, 0x97, 0x04, 0x3d, 0x9f, 0x32, 0xf4, 0x1a, 0x54, 0xd8, 0x38, 0x90, + 0xa9, 0x50, 0x05, 0x6a, 0x25, 0xc9, 0x13, 0x4a, 0x7c, 0x96, 0xfe, 0xc5, 0xc6, 0x54, 0xc4, 0xdf, + 0x0d, 0x7b, 0x74, 0x32, 0xfe, 0xdb, 0x61, 0x8f, 0x62, 0xa9, 0x71, 0x7e, 0x6f, 0x41, 0x2d, 0x29, + 0x46, 0xc2, 0xbe, 0xef, 0xf5, 0x43, 0x39, 0xbc, 0x6a, 0x6a, 0x7f, 0x6b, 0xf7, 0xd6, 0x5d, 0x2c, + 0x35, 0xe8, 0x03, 0x28, 0x1e, 0x72, 0x1e, 0xe9, 0x7c, 0x7c, 0x63, 0x26, 0xaf, 0x89, 0x19, 0xaa, + 0xb2, 0x25, 0xfe, 0x61, 0x09, 0xe8, 0x7c, 0xb1, 0x00, 0xa5, 0xf7, 0x48, 0x7f, 0x48, 0xc4, 0x20, + 0x82, 0x34, 0xeb, 0x26, 0x83, 0x90, 0xd9, 0x56, 0x6a, 0xc4, 0xe6, 0x38, 0x60, 0xe1, 0x90, 0xb2, + 0xd8, 0x5e, 0x48, 0x37, 0x47, 0x53, 0x89, 0xb0, 0xd1, 0x89, 0x8d, 0xc6, 0xc3, 0xc8, 0x73, 0xf5, + 0xf4, 0x93, 0x8d, 0xd6, 0x15, 0x42, 0xac, 0x74, 0x22, 0x01, 0x1f, 0x51, 0x16, 0x7b, 0x61, 0xa0, + 0x1d, 0x9b, 0x24, 0xe0, 0xfb, 0x4a, 0x8c, 0x8d, 0x1e, 0xfd, 0x0c, 0x0a, 0x01, 0xe5, 0x32, 0x83, + 0xd6, 0x37, 0xdf, 0x9a, 0x69, 0xea, 0x72, 0x86, 0x7b, 0x3b, 0xdd, 0x66, 0x45, 0x84, 0x7d, 0x6f, + 0xa7, 0x8b, 0x05, 0xa4, 0x28, 0xb8, 0x11, 0x61, 0xc4, 0xf7, 0xa9, 0x2f, 0x53, 0xed, 0x52, 0x5a, + 0x70, 0xdb, 0x5a, 0x8e, 0x13, 0x0b, 0x67, 0x1f, 0xaa, 0x06, 0x07, 0x75, 0xa0, 0xc0, 0xfd, 0x58, + 0xfa, 0xaa, 0xbe, 0x79, 0x7d, 0xa6, 0x31, 0x75, 0x5b, 0x1d, 0x35, 0x9c, 0x6e, 0xab, 0x83, 0x05, + 0x9a, 0x20, 0x5d, 0xad, 0x70, 0xe0, 0x1c, 0x83, 0xa9, 0xc7, 0x22, 0x26, 0xa2, 0xf1, 0x64, 0x4c, + 0x6e, 0x12, 0x4e, 0xb0, 0xd4, 0xfc, 0x8f, 0x0b, 0xf5, 0xa7, 0x05, 0xa8, 0xde, 0xa1, 0x9c, 0x48, + 0xe8, 0xdf, 0x59, 0x50, 0x27, 0x41, 0x10, 0x72, 0x59, 0x03, 0xc4, 0x64, 0x45, 0x12, 0xda, 0x9b, + 0x69, 0xb2, 0x06, 0xb4, 0xb1, 0x95, 0x02, 0xee, 0x04, 0x9c, 0x1d, 0xa7, 0x09, 0x3c, 0xa3, 0xc1, + 0xd9, 0x7e, 0xd1, 0x27, 0x82, 0xe8, 0x1c, 0x50, 0x5f, 0xad, 0xba, 0xfa, 0xe6, 0xee, 0x7c, 0x23, + 0x68, 0x49, 0x2c, 0xd5, 0x79, 0x86, 0x33, 0x09, 0x21, 0xd6, 0x1d, 0xad, 0xbc, 0x0d, 0x97, 0x27, + 0x07, 0x8a, 0x2e, 0x67, 0xb2, 0xa8, 0x4a, 0x9c, 0xcf, 0x40, 0xe9, 0x88, 0xf8, 0x63, 0xcd, 0x38, + 0xb0, 0xfa, 0x78, 0x63, 0xe1, 0xba, 0xb5, 0x72, 0x03, 0xea, 0x99, 0x6e, 0x9e, 0xa4, 0xa9, 0xf3, + 0x85, 0x25, 0xc2, 0xcf, 0x99, 0xe7, 0xea, 0x9d, 0xc4, 0x89, 0xca, 0x5b, 0xc5, 0xec, 0x4e, 0xe2, + 0xc4, 0xc7, 0x4a, 0x27, 0x4a, 0x09, 0x15, 0xf4, 0x2e, 0x96, 0x3b, 0xa4, 0x98, 0xce, 0x49, 0x92, + 0xbe, 0x18, 0x6b, 0x2d, 0x6a, 0x43, 0x51, 0x30, 0x7c, 0xb9, 0xd0, 0xeb, 0x9b, 0x8d, 0xff, 0xb6, + 0x52, 0x1a, 0xe6, 0x34, 0xd1, 0x78, 0x7f, 0x4c, 0x02, 0xee, 0xf1, 0xe3, 0x74, 0xb5, 0x60, 0xc2, + 0x29, 0x96, 0x48, 0xce, 0x5f, 0x17, 0xa0, 0x6a, 0x48, 0x19, 0xfa, 0x35, 0x54, 0x47, 0xda, 0xc5, + 0x7a, 0x5b, 0xbc, 0x72, 0xb1, 0xc5, 0x78, 0xf7, 0xe0, 0x63, 0xea, 0x72, 0x11, 0x9e, 0xb4, 0xea, + 0xa4, 0x32, 0x9c, 0xa0, 0x22, 0x17, 0x8a, 0x71, 0x44, 0x5d, 0xbd, 0xd4, 0xb7, 0x66, 0x5a, 0x05, + 0x66, 0xb8, 0x82, 0x72, 0xa6, 0x73, 0x92, 0x04, 0x54, 0x82, 0xa3, 0x21, 0x94, 0x63, 0xc5, 0x6a, + 0xd4, 0x39, 0x63, 0x7b, 0xbe, 0x6e, 0x14, 0xb3, 0x49, 0x42, 0xa2, 0x59, 0x8d, 0xee, 0xc2, 0xf9, + 0xca, 0x82, 0x84, 0xd5, 0xb6, 0xbc, 0x98, 0xa3, 0x8f, 0xce, 0x39, 0xb1, 0x71, 0x31, 0x27, 0x8a, + 0xd6, 0xd2, 0x85, 0x49, 0x02, 0x33, 0x92, 0x8c, 0x03, 0x0f, 0xa0, 0xe4, 0x71, 0x3a, 0x32, 0xfb, + 0xe8, 0xad, 0xb9, 0xa6, 0x96, 0x21, 0x50, 0x02, 0x13, 0x2b, 0x68, 0x87, 0xa5, 0x33, 0x12, 0x5e, + 0x15, 0x7d, 0x0a, 0x0a, 0x67, 0xb2, 0xc7, 0x5b, 0xb3, 0x93, 0x44, 0x11, 0xb1, 0xa4, 0x4f, 0x21, + 0x89, 0xb1, 0x82, 0x76, 0xfe, 0x66, 0xc1, 0x72, 0xde, 0xe3, 0xe8, 0x35, 0x28, 0x45, 0x87, 0x24, + 0x36, 0xd5, 0x6c, 0xd5, 0xb4, 0x6b, 0x0b, 0xa1, 0xe0, 0xb7, 0xc6, 0x5e, 0x0a, 0xb0, 0x32, 0xce, + 0x1e, 0x90, 0x16, 0x1e, 0x73, 0x40, 0x72, 0x01, 0xdc, 0x30, 0xe8, 0x79, 0x2a, 0x35, 0x16, 0xe4, + 0xe4, 0x36, 0x2e, 0x16, 0xab, 0x6d, 0xd3, 0x2e, 0x5d, 0xef, 0x89, 0x28, 0xc6, 0x19, 0x58, 0xe7, + 0xcb, 0x05, 0x28, 0x76, 0xba, 0x5b, 0x7b, 0x17, 0xa8, 0xcd, 0x2f, 0x42, 0x25, 0x20, 0x3c, 0xbe, + 0xc7, 0xfc, 0xc9, 0x7a, 0xba, 0xb7, 0xd5, 0xed, 0x08, 0xa2, 0x63, 0xf4, 0xe2, 0xb0, 0xe4, 0xfa, + 0xe3, 0x98, 0x53, 0xb6, 0xdb, 0xd3, 0xe7, 0x92, 0xe4, 0xb0, 0xb4, 0xad, 0x15, 0x37, 0x71, 0x6a, + 0x23, 0xb0, 0xe3, 0xb1, 0xdc, 0x91, 0xba, 0xa4, 0x27, 0xd8, 0x1d, 0x25, 0xc6, 0x46, 0x8f, 0x5a, + 0xb0, 0xa4, 0xff, 0xb6, 0x19, 0xed, 0x7b, 0x0f, 0xf4, 0x09, 0xe6, 0x05, 0xdd, 0x60, 0xa9, 0x93, + 0x55, 0x9e, 0x4d, 0x0a, 0x70, 0xbe, 0x71, 0xae, 0x3e, 0x57, 0x1e, 0x5b, 0x9f, 0xbf, 0xb4, 0xa0, + 0xd4, 0x71, 0x89, 0x4f, 0xc5, 0x49, 0x61, 0xe4, 0x05, 0xfa, 0x24, 0xa7, 0xaa, 0x74, 0x29, 0x2d, + 0x34, 0x77, 0x52, 0x15, 0xce, 0xda, 0xa1, 0x6b, 0x50, 0x1f, 0x91, 0x07, 0x49, 0xb3, 0x05, 0xd9, + 0xe3, 0x53, 0xb2, 0x49, 0x2a, 0xc6, 0x59, 0x1b, 0x71, 0x64, 0xd5, 0xe7, 0x44, 0x2c, 0x6a, 0x85, + 0xf4, 0xcf, 0x52, 0x7a, 0x64, 0xc5, 0x19, 0x1d, 0xce, 0x59, 0x3a, 0x9f, 0x17, 0xa0, 0x28, 0xa9, + 0xe9, 0xe3, 0x63, 0xfb, 0x01, 0x14, 0x63, 0x4e, 0x82, 0xb9, 0xc8, 0x9f, 0x58, 0x46, 0x8a, 0xfc, + 0x89, 0x7f, 0x58, 0x02, 0xa2, 0x0f, 0xa1, 0x34, 0x14, 0x8c, 0x46, 0xe7, 0xba, 0x37, 0x66, 0xe7, + 0x56, 0xcd, 0x9a, 0xd8, 0x5d, 0xf2, 0x2f, 0x56, 0x98, 0x82, 0x22, 0xf9, 0xe1, 0x40, 0xf3, 0xfc, + 0xd9, 0x28, 0x52, 0x2b, 0x1c, 0x28, 0x8a, 0xd4, 0x0a, 0x07, 0x58, 0xa0, 0xa1, 0x0f, 0x35, 0x0f, + 0x9e, 0x87, 0x0c, 0x9a, 0x43, 0xc1, 0x39, 0x2e, 0x7c, 0x52, 0x80, 0xb2, 0x3a, 0x02, 0x5c, 0x2c, + 0x28, 0x2e, 0x0b, 0xe7, 0x0b, 0xca, 0x36, 0x0b, 0x03, 0x35, 0x0a, 0xf1, 0x0f, 0x4b, 0xc0, 0x24, + 0xda, 0x85, 0xef, 0x2c, 0xda, 0xc5, 0xef, 0x20, 0xda, 0xbf, 0xcc, 0x05, 0xe6, 0x9d, 0xd9, 0x03, + 0x23, 0xfd, 0x3f, 0x19, 0x1a, 0x74, 0x13, 0xea, 0x8c, 0x72, 0x76, 0x9c, 0xbb, 0x17, 0x71, 0x92, + 0xdb, 0x94, 0x54, 0x75, 0x96, 0xff, 0xc4, 0xd9, 0x66, 0xce, 0x67, 0x45, 0x58, 0x54, 0x1d, 0xe8, + 0x32, 0x11, 0x42, 0xdd, 0x27, 0xa2, 0x4e, 0xa6, 0x49, 0x7f, 0xd6, 0x33, 0xa9, 0xc6, 0x50, 0xf9, + 0xa2, 0x95, 0x82, 0xe2, 0x6c, 0x0f, 0x68, 0x00, 0x35, 0xf1, 0x29, 0xa9, 0x99, 0xf6, 0xd5, 0x6c, + 0x71, 0x90, 0x08, 0xcd, 0x25, 0x91, 0xb3, 0x5b, 0x06, 0x10, 0xa7, 0xd8, 0xe2, 0xac, 0x16, 0xd1, + 0xa0, 0xe7, 0x05, 0x03, 0xb9, 0x90, 0x8a, 0xea, 0xac, 0xd6, 0x56, 0x22, 0x6c, 0x74, 0xe8, 0x58, + 0x54, 0x3c, 0x49, 0x36, 0xed, 0xe2, 0x1c, 0xf4, 0x3e, 0xeb, 0xd4, 0x86, 0x66, 0xaf, 0x8a, 0x61, + 0x67, 0x2a, 0xa8, 0x94, 0x62, 0xd3, 0xdf, 0xca, 0x03, 0x58, 0xcc, 0x5a, 0x4e, 0x21, 0xc9, 0x38, + 0x4b, 0x92, 0x67, 0x8f, 0x8b, 0xea, 0x37, 0x43, 0xb1, 0xff, 0x22, 0xca, 0x2a, 0xa7, 0xd1, 0xf7, + 0xc0, 0x59, 0xf7, 0x73, 0x9c, 0x75, 0x4e, 0xf6, 0x33, 0x8d, 0xaf, 0x0e, 0x26, 0xf8, 0xea, 0xdc, + 0xb7, 0x70, 0x8f, 0xe2, 0xaa, 0x0f, 0x2d, 0xa8, 0x0a, 0xb3, 0xef, 0x81, 0xa7, 0xfe, 0x2a, 0xcf, + 0x53, 0x6f, 0xcc, 0x3c, 0xa5, 0x47, 0x70, 0xd4, 0x7f, 0x2e, 0xab, 0xa9, 0x48, 0x82, 0x6a, 0x32, + 0x7d, 0xf9, 0x91, 0x99, 0xbe, 0x03, 0x05, 0x97, 0x70, 0xfb, 0xa9, 0x39, 0x0a, 0xd9, 0x36, 0xe1, + 0xaa, 0x90, 0x6d, 0x13, 0x8e, 0x05, 0x1a, 0x1a, 0x42, 0xcd, 0x35, 0x0f, 0x2b, 0xda, 0x85, 0xb3, + 0x3d, 0x69, 0x24, 0xcf, 0x33, 0x2a, 0x19, 0x24, 0x9f, 0x38, 0xc5, 0x47, 0x2e, 0x54, 0x0e, 0xd5, + 0x85, 0x96, 0xa4, 0x51, 0xb3, 0x6e, 0x25, 0x7d, 0x29, 0xa6, 0x52, 0x89, 0xfe, 0xc0, 0x06, 0x59, + 0xb8, 0x69, 0xe0, 0x71, 0x7b, 0x71, 0x0e, 0x37, 0xdd, 0xf6, 0xb4, 0x9b, 0x6e, 0x7b, 0x1c, 0x0b, + 0x34, 0xf4, 0x0a, 0x94, 0xfb, 0x9e, 0xcf, 0x29, 0x93, 0x97, 0xcc, 0xb5, 0xa6, 0x9d, 0xdc, 0x33, + 0x4a, 0xe9, 0x59, 0xf2, 0x0f, 0x6b, 0x3b, 0xf4, 0x43, 0x28, 0x8c, 0x48, 0xa4, 0x6f, 0x87, 0xcd, + 0xe6, 0x2c, 0xdc, 0x21, 0xd1, 0x99, 0xfa, 0xc1, 0x42, 0x2d, 0x6a, 0xe1, 0x40, 0x5e, 0x77, 0xd6, + 0xe7, 0xc8, 0xc1, 0xf2, 0x86, 0x53, 0xd5, 0x42, 0x75, 0x43, 0xaa, 0x30, 0x85, 0xbb, 0xfb, 0xea, + 0x91, 0xc3, 0xfe, 0xff, 0x39, 0xdc, 0xad, 0x1f, 0x4a, 0x94, 0xbb, 0xf5, 0x07, 0x36, 0xc8, 0x68, + 0x1f, 0xca, 0x54, 0xbe, 0xa9, 0xd8, 0x2b, 0xb2, 0x8f, 0x37, 0x67, 0x2b, 0x23, 0x12, 0xa2, 0x09, + 0xf2, 0xbe, 0x40, 0xfe, 0xc7, 0x1a, 0x56, 0x90, 0x6f, 0x66, 0xa8, 0xf0, 0xff, 0xe5, 0xc9, 0x77, + 0xc2, 0x85, 0x13, 0x0b, 0xe1, 0xd0, 0x58, 0x70, 0x6f, 0xdb, 0x9e, 0xc3, 0xa1, 0x92, 0xbd, 0x2b, + 0x87, 0xca, 0xbf, 0x58, 0x61, 0xa2, 0x3e, 0x54, 0xd4, 0x7d, 0x84, 0x39, 0x69, 0xbd, 0x39, 0x47, + 0x95, 0xca, 0x9c, 0x5e, 0x14, 0x26, 0x36, 0xe0, 0x22, 0xf1, 0xc4, 0x5e, 0x30, 0x34, 0xb5, 0x70, + 0xc6, 0xc4, 0x23, 0xa8, 0x65, 0x7a, 0x50, 0x15, 0x78, 0x58, 0xc1, 0xa2, 0x7d, 0x58, 0x62, 0x34, + 0xe6, 0x84, 0x71, 0xcd, 0x63, 0xd4, 0xe9, 0xeb, 0x86, 0x39, 0x1d, 0xe1, 0xac, 0xf2, 0xec, 0x64, + 0x6d, 0x7d, 0xca, 0x13, 0x4f, 0xce, 0x06, 0xe7, 0xf1, 0xd0, 0x26, 0x00, 0xa7, 0x6c, 0xe4, 0x05, + 0x84, 0x87, 0xcc, 0x06, 0x79, 0x9d, 0x9c, 0x14, 0xa8, 0x6e, 0xa2, 0xc1, 0x19, 0x2b, 0xb4, 0x03, + 0x15, 0xf5, 0xca, 0x1a, 0xdb, 0x4b, 0x8f, 0x7e, 0x66, 0x50, 0xcf, 0xb2, 0x99, 0x5b, 0x5a, 0xd5, + 0x04, 0x9b, 0xb6, 0xe8, 0xa7, 0x80, 0x62, 0xca, 0x8e, 0x3c, 0x97, 0x6e, 0xb9, 0x6e, 0x38, 0x0e, + 0xb8, 0x7c, 0xc2, 0x5b, 0xce, 0x5d, 0x9a, 0xa3, 0xce, 0x39, 0x0b, 0x3c, 0xa5, 0x15, 0x1a, 0x64, + 0xca, 0xcb, 0xe5, 0x39, 0x2a, 0xa7, 0xb9, 0xf3, 0x6b, 0x2e, 0x8a, 0x55, 0x6b, 0xbe, 0x32, 0x95, + 0xe6, 0x0f, 0x16, 0x2c, 0x06, 0x61, 0x8f, 0x76, 0xa8, 0x4f, 0x5d, 0xe1, 0xb2, 0x2b, 0xd2, 0x03, + 0x77, 0xe7, 0xaa, 0xd3, 0x8d, 0xbd, 0x0c, 0xa2, 0x62, 0x41, 0xc9, 0x81, 0x30, 0xab, 0xc2, 0xb9, + 0xae, 0xd1, 0x2d, 0xa8, 0x92, 0x7e, 0xdf, 0x0b, 0x3c, 0x7e, 0x6c, 0x23, 0x39, 0xe9, 0x67, 0xa7, + 0x05, 0x62, 0x4b, 0xdb, 0xa8, 0x39, 0x99, 0x2f, 0x9c, 0xb4, 0x45, 0xf7, 0xa0, 0xce, 0x43, 0x9f, + 0x32, 0x7d, 0x6b, 0xfb, 0xb4, 0x9c, 0xd1, 0xea, 0x34, 0xa8, 0x6e, 0x62, 0x96, 0x1e, 0x8e, 0x53, + 0x59, 0x8c, 0xb3, 0x38, 0x2b, 0xef, 0xc0, 0x95, 0x73, 0xf3, 0x7a, 0xa2, 0x8b, 0xcd, 0x3f, 0x57, + 0x20, 0xf3, 0xb2, 0x87, 0x5e, 0xc9, 0xdf, 0xd0, 0xac, 0x4c, 0xde, 0xd0, 0xd4, 0x84, 0x6d, 0xee, + 0x76, 0xe6, 0x05, 0x28, 0x33, 0x4a, 0xe2, 0x30, 0xd0, 0xb5, 0x20, 0x61, 0x2a, 0x58, 0x4a, 0xb1, + 0xd6, 0x3e, 0xc9, 0x2d, 0x4e, 0x36, 0xc7, 0x95, 0x1e, 0x9b, 0xe3, 0x5e, 0x82, 0x6a, 0x6c, 0x16, + 0x4a, 0x65, 0xe2, 0x7d, 0xde, 0xc4, 0x34, 0xb1, 0x40, 0x3d, 0x58, 0x14, 0x74, 0x5c, 0x26, 0xb2, + 0xde, 0x16, 0xd7, 0xf7, 0xae, 0x4f, 0x72, 0x43, 0x9f, 0xac, 0x9a, 0x56, 0x06, 0x07, 0xe7, 0x50, + 0xd1, 0x9f, 0x2c, 0x58, 0x8e, 0x33, 0xec, 0x3b, 0x49, 0x91, 0x9d, 0x39, 0x89, 0x60, 0x8e, 0xd3, + 0x53, 0xcd, 0xe6, 0xaf, 0x9a, 0x07, 0xe3, 0xbc, 0xf2, 0xec, 0x9c, 0x04, 0x4f, 0x0c, 0x0a, 0xfd, + 0xd1, 0x82, 0x45, 0x91, 0x04, 0x93, 0x51, 0xaa, 0x14, 0xfb, 0xfe, 0xdc, 0xa3, 0xcc, 0x60, 0xaa, + 0x31, 0x3e, 0x6f, 0x96, 0x72, 0xa2, 0x9a, 0x3a, 0xc0, 0xdc, 0x68, 0x56, 0x3e, 0xb3, 0xe0, 0xe9, + 0x29, 0x13, 0x9e, 0xb2, 0xc0, 0x3f, 0xc8, 0x1f, 0x4a, 0xb6, 0xe6, 0x3e, 0x2f, 0x65, 0xdf, 0x0d, + 0x7e, 0x6b, 0xc1, 0x95, 0x73, 0x33, 0xfa, 0x9e, 0x07, 0xe1, 0xdc, 0x07, 0xf3, 0xa6, 0x7a, 0xb1, + 0x7b, 0xc7, 0x78, 0x7c, 0xd0, 0x26, 0xfc, 0x70, 0x72, 0xb3, 0x75, 0x94, 0x18, 0x1b, 0xbd, 0x53, + 0x82, 0x42, 0xb7, 0xd5, 0x69, 0x36, 0x1e, 0x7e, 0xb3, 0x7a, 0xe9, 0xab, 0x6f, 0x56, 0x2f, 0x7d, + 0xfd, 0xcd, 0xea, 0xa5, 0x4f, 0x4f, 0x57, 0xad, 0x87, 0xa7, 0xab, 0xd6, 0x57, 0xa7, 0xab, 0xd6, + 0xd7, 0xa7, 0xab, 0xd6, 0xdf, 0x4f, 0x57, 0xad, 0xcf, 0xbf, 0x5d, 0xbd, 0xf4, 0x8b, 0xaa, 0x19, + 0xe6, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x5f, 0xef, 0x95, 0x4c, 0xc4, 0x25, 0x00, 0x00, } func (m *Cat) Marshal() (dAtA []byte, err error) { @@ -2445,6 +2446,11 @@ func (m *Source) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i -= len(m.RetryPolicy) + copy(dAtA[i:], m.RetryPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.RetryPolicy))) + i-- + dAtA[i] = 0x32 if m.HTTP != nil { { size, err := m.HTTP.MarshalToSizedBuffer(dAtA[:i]) @@ -3609,6 +3615,8 @@ func (m *Source) Size() (n int) { l = m.HTTP.Size() n += 1 + l + sovGenerated(uint64(l)) } + l = len(m.RetryPolicy) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -4206,6 +4214,7 @@ func (this *Source) String() string { `STAN:` + strings.Replace(this.STAN.String(), "STAN", "STAN", 1) + `,`, `Kafka:` + strings.Replace(this.Kafka.String(), "Kafka", "Kafka", 1) + `,`, `HTTP:` + strings.Replace(this.HTTP.String(), "HTTPSource", "HTTPSource", 1) + `,`, + `RetryPolicy:` + fmt.Sprintf("%v", this.RetryPolicy) + `,`, `}`, }, "") return s @@ -8332,6 +8341,38 @@ func (m *Source) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RetryPolicy", 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.RetryPolicy = RetryPolicy(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 46a50977..b0e801ac 100644 --- a/api/v1alpha1/generated.proto +++ b/api/v1alpha1/generated.proto @@ -259,6 +259,9 @@ message Source { optional Kafka kafka = 4; optional HTTPSource http = 5; + + // +kubebuilder:default=Never + optional string retryPolicy = 6; } message SourceStatus { diff --git a/api/v1alpha1/retry_policy.go b/api/v1alpha1/retry_policy.go new file mode 100644 index 00000000..a8498421 --- /dev/null +++ b/api/v1alpha1/retry_policy.go @@ -0,0 +1,9 @@ +package v1alpha1 + +// +kubebuilder:validation:Enum=Always;Never +type RetryPolicy string + +const ( + RetryNever RetryPolicy = "Never" + RetryAlways RetryPolicy = "Always" +) diff --git a/api/v1alpha1/source.go b/api/v1alpha1/source.go index bf590039..5856358a 100644 --- a/api/v1alpha1/source.go +++ b/api/v1alpha1/source.go @@ -7,4 +7,6 @@ type Source struct { STAN *STAN `json:"stan,omitempty" protobuf:"bytes,3,opt,name=stan"` Kafka *Kafka `json:"kafka,omitempty" protobuf:"bytes,4,opt,name=kafka"` HTTP *HTTPSource `json:"http,omitempty" protobuf:"bytes,5,opt,name=http"` + // +kubebuilder:default=Never + RetryPolicy RetryPolicy `json:"retryPolicy,omitempty" protobuf:"bytes,6,opt,name=retryPolicy,casttype=RetryPolicy"` } diff --git a/config/ci.yaml b/config/ci.yaml index 0607dd8e..ff1daad5 100644 --- a/config/ci.yaml +++ b/config/ci.yaml @@ -820,6 +820,12 @@ spec: name: default: default type: string + retryPolicy: + default: Never + enum: + - Always + - Never + type: string stan: properties: clusterId: @@ -2670,6 +2676,12 @@ spec: name: default: default type: string + retryPolicy: + default: Never + enum: + - Always + - Never + type: string stan: properties: clusterId: diff --git a/config/crd/bases/dataflow.argoproj.io_pipelines.yaml b/config/crd/bases/dataflow.argoproj.io_pipelines.yaml index c0da17e9..de1118da 100644 --- a/config/crd/bases/dataflow.argoproj.io_pipelines.yaml +++ b/config/crd/bases/dataflow.argoproj.io_pipelines.yaml @@ -1186,6 +1186,12 @@ spec: name: default: default type: string + retryPolicy: + default: Never + enum: + - Always + - Never + type: string stan: properties: clusterId: diff --git a/config/crd/bases/dataflow.argoproj.io_steps.yaml b/config/crd/bases/dataflow.argoproj.io_steps.yaml index 16312c89..ed1a0759 100644 --- a/config/crd/bases/dataflow.argoproj.io_steps.yaml +++ b/config/crd/bases/dataflow.argoproj.io_steps.yaml @@ -1146,6 +1146,12 @@ spec: name: default: default type: string + retryPolicy: + default: Never + enum: + - Always + - Never + type: string stan: properties: clusterId: diff --git a/config/default.yaml b/config/default.yaml index bbd6715a..61273b06 100644 --- a/config/default.yaml +++ b/config/default.yaml @@ -820,6 +820,12 @@ spec: name: default: default type: string + retryPolicy: + default: Never + enum: + - Always + - Never + type: string stan: properties: clusterId: @@ -2670,6 +2676,12 @@ spec: name: default: default type: string + retryPolicy: + default: Never + enum: + - Always + - Never + type: string stan: properties: clusterId: diff --git a/config/dev.yaml b/config/dev.yaml index d934334e..7fb3fbf1 100644 --- a/config/dev.yaml +++ b/config/dev.yaml @@ -820,6 +820,12 @@ spec: name: default: default type: string + retryPolicy: + default: Never + enum: + - Always + - Never + type: string stan: properties: clusterId: @@ -2670,6 +2676,12 @@ spec: name: default: default type: string + retryPolicy: + default: Never + enum: + - Always + - Never + type: string stan: properties: clusterId: diff --git a/config/quick-start.yaml b/config/quick-start.yaml index 7c737f6e..0f2e700b 100644 --- a/config/quick-start.yaml +++ b/config/quick-start.yaml @@ -820,6 +820,12 @@ spec: name: default: default type: string + retryPolicy: + default: Never + enum: + - Always + - Never + type: string stan: properties: clusterId: @@ -2670,6 +2676,12 @@ spec: name: default: default type: string + retryPolicy: + default: Never + enum: + - Always + - Never + type: string stan: properties: clusterId: diff --git a/docs/EXAMPLES.md b/docs/EXAMPLES.md index 09717c30..9f267d36 100644 --- a/docs/EXAMPLES.md +++ b/docs/EXAMPLES.md @@ -94,7 +94,7 @@ kubectl apply -f https://raw.githubusercontent.com/argoproj-labs/argo-dataflow/m ### [103-scaling](https://raw.githubusercontent.com/argoproj-labs/argo-dataflow/main/examples/103-scaling-pipeline.yaml) - This is an example of having multiple replicas for a single step. +This is an example of having multiple replicas for a single step. Steps can be manually scaled using `kubectl`: @@ -265,10 +265,9 @@ This logs the message. kubectl apply -f https://raw.githubusercontent.com/argoproj-labs/argo-dataflow/main/examples/301-cron-log-pipeline.yaml ``` -### [erroring](https://raw.githubusercontent.com/argoproj-labs/argo-dataflow/main/examples/301-erroring-pipeline.yaml) - -This example creates errors randomly +### [301-erroring](https://raw.githubusercontent.com/argoproj-labs/argo-dataflow/main/examples/301-erroring-pipeline.yaml) +This example showcases retry policies. ``` kubectl apply -f https://raw.githubusercontent.com/argoproj-labs/argo-dataflow/main/examples/301-erroring-pipeline.yaml diff --git a/dsls/python/__init__.py b/dsls/python/__init__.py index e6deb324..7ea5cce8 100644 --- a/dsls/python/__init__.py +++ b/dsls/python/__init__.py @@ -1,9 +1,10 @@ +import getpass import inspect import yaml DEFAULT_RUNTIME = 'python3-9' - GROUPS_VOLUME_NAME = 'groups' +USER = getpass.getuser() def str_presenter(dumper, data): @@ -20,11 +21,15 @@ def __init__(self, name): self._name = name self._annotations = {} self._steps = [] + self.owner(USER) def annotate(self, name, value): self._annotations[name] = value return self + def owner(self, value): + return self.annotate('dataflow.argoproj.io/owner', value) + def describe(self, value): return self.annotate('dataflow.argoproj.io/description', value) @@ -324,13 +329,16 @@ def dump(self): class Source: - def __init__(self, name=None): + def __init__(self, name=None, retryPolicy=None): self._name = name + self._retryPolicy = retryPolicy def dump(self): x = {} if self._name: x['name'] = self._name + if self._retryPolicy: + x['retryPolicy'] = self._retryPolicy return x def cat(self, name): @@ -400,22 +408,23 @@ def map(name, map): class CronSource(Source): - def __init__(self, schedule, layout, name=None): - super().__init__(name) + def __init__(self, schedule, layout, name=None, retryPolicy=None): + super().__init__(name=name, retryPolicy=retryPolicy) self._schedule = schedule self._layout = layout def dump(self): x = super().dump() - x['schedule'] = self._schedule + y = {'schedule': self._schedule} if self._layout: - x['layout'] = self._layout - return {'cron': x} + y['layout'] = self._layout + x['cron'] = y + return x class HTTPSource(Source): - def __init__(self, name=None): - super().__init__(name) + def __init__(self, name=None, retryPolicy=None): + super().__init__(name=name, retryPolicy=retryPolicy) def dump(self): x = super().dump() @@ -424,8 +433,8 @@ def dump(self): class KafkaSource(Source): - def __init__(self, topic, parallel=None, name=None): - super().__init__(name) + def __init__(self, topic, parallel=None, name=None, retryPolicy=None): + super().__init__(name=name, retryPolicy=retryPolicy) self._topic = topic self._parallel = parallel @@ -438,27 +447,31 @@ def dump(self): class STANSource(Source): - def __init__(self, subject, name=None): - super().__init__(name) + def __init__(self, subject, name=None, parallel=None, retryPolicy=None): + super().__init__(name=name, retryPolicy=retryPolicy) self._subject = subject + self._parallel = parallel def dump(self): x = super().dump() - x['stan'] = {'subject': self._subject} + y = {'subject': self._subject} + if self._parallel: + y['parallel'] = self._parallel + x['stan'] = y return x -def cron(schedule, layout=None, name=None): - return CronSource(schedule, layout=layout, name=name) +def cron(schedule, layout=None, name=None, retryPolicy=None): + return CronSource(schedule, layout=layout, name=name, retryPolicy=retryPolicy) -def http(name=None): - return HTTPSource(name=name) +def http(name=None, retryPolicy=None): + return HTTPSource(name=name, retryPolicy=retryPolicy) -def kafka(topic, parallel=None, name=None): - return KafkaSource(topic, parallel, name=name) +def kafka(topic, parallel=None, name=None, retryPolicy=None): + return KafkaSource(topic, parallel, name=name, retryPolicy=retryPolicy) -def stan(subject, name=None): - return STANSource(subject, name=name) +def stan(subject, name=None, parallel=None, retryPolicy=None): + return STANSource(subject, name=name, parallel=parallel, retryPolicy=retryPolicy) diff --git a/examples/101-hello-pipeline.py b/examples/101-hello-pipeline.py index cc3e886f..ac70a3c9 100644 --- a/examples/101-hello-pipeline.py +++ b/examples/101-hello-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("101-hello") + .owner('argoproj-labs') .describe("""This is the hello world of pipelines. It uses a cron schedule as a source and then just cat the message to a log""") diff --git a/examples/101-hello-pipeline.yaml b/examples/101-hello-pipeline.yaml index 09430435..2caf831e 100644 --- a/examples/101-hello-pipeline.yaml +++ b/examples/101-hello-pipeline.yaml @@ -6,6 +6,7 @@ metadata: This is the hello world of pipelines. It uses a cron schedule as a source and then just cat the message to a log + dataflow.argoproj.io/owner: argoproj-labs dataflow.argoproj.io/test: 'true' name: 101-hello spec: diff --git a/examples/101-two-node-pipeline.py b/examples/101-two-node-pipeline.py index 631ac8b3..f868bd29 100644 --- a/examples/101-two-node-pipeline.py +++ b/examples/101-two-node-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("101-two-node") + .owner('argoproj-labs') .describe("""This example shows a example of having two nodes in a pipeline. While they read from Kafka, they are connected by a NATS Streaming subject.""") diff --git a/examples/101-two-node-pipeline.yaml b/examples/101-two-node-pipeline.yaml index 18fb9d99..833971c3 100644 --- a/examples/101-two-node-pipeline.yaml +++ b/examples/101-two-node-pipeline.yaml @@ -6,6 +6,7 @@ metadata: This example shows a example of having two nodes in a pipeline. While they read from Kafka, they are connected by a NATS Streaming subject. + dataflow.argoproj.io/owner: argoproj-labs name: 101-two-node spec: steps: @@ -23,5 +24,4 @@ spec: - kafka: topic: output-topic sources: - - stan: - subject: a-b + - {} diff --git a/examples/102-filter-pipeline.py b/examples/102-filter-pipeline.py index 17328d50..60e62f07 100644 --- a/examples/102-filter-pipeline.py +++ b/examples/102-filter-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("102-filter") + .owner('argoproj-labs') .describe("""This is an example of built-in filtering. Filters are written using expression syntax and must return a boolean. diff --git a/examples/102-filter-pipeline.yaml b/examples/102-filter-pipeline.yaml index 9d7b0b2d..5c8392bb 100644 --- a/examples/102-filter-pipeline.yaml +++ b/examples/102-filter-pipeline.yaml @@ -10,6 +10,7 @@ metadata: They have a single variable, `msg`, which is a byte array. [Learn about expressions](../docs/EXPRESSIONS.md) + dataflow.argoproj.io/owner: argoproj-labs name: 102-filter spec: steps: diff --git a/examples/102-flatten-expand-pipeline.py b/examples/102-flatten-expand-pipeline.py index a69d350a..16d9f11e 100644 --- a/examples/102-flatten-expand-pipeline.py +++ b/examples/102-flatten-expand-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("102-flatten-expand") + .owner('argoproj-labs') .describe("""This is an example of built-in flattening and expanding.""") .step( cron('*/3 * * * * *') diff --git a/examples/102-flatten-expand-pipeline.yaml b/examples/102-flatten-expand-pipeline.yaml index 4b855d10..a632ef85 100644 --- a/examples/102-flatten-expand-pipeline.yaml +++ b/examples/102-flatten-expand-pipeline.yaml @@ -4,6 +4,7 @@ metadata: annotations: dataflow.argoproj.io/description: This is an example of built-in flattening and expanding. + dataflow.argoproj.io/owner: argoproj-labs name: 102-flatten-expand spec: steps: @@ -22,12 +23,10 @@ spec: - stan: subject: flattened sources: - - stan: - subject: data + - {} - expand: {} name: expand sinks: - log: {} sources: - - stan: - subject: flattened + - {} diff --git a/examples/102-map-pipeline.py b/examples/102-map-pipeline.py index c5dbeb2b..510d7c2b 100644 --- a/examples/102-map-pipeline.py +++ b/examples/102-map-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("102-map") + .owner('argoproj-labs') .describe("""This is an example of built-in mapping. Maps are written using expression syntax and must return a byte array. diff --git a/examples/102-map-pipeline.yaml b/examples/102-map-pipeline.yaml index 9bac17e6..34ed73a8 100644 --- a/examples/102-map-pipeline.yaml +++ b/examples/102-map-pipeline.yaml @@ -10,6 +10,7 @@ metadata: They have a single variable, `msg`, which is a byte array. [Learn about expressions](../docs/EXPRESSIONS.md) + dataflow.argoproj.io/owner: argoproj-labs name: 102-map spec: steps: diff --git a/examples/103-autoscaling-pipeline.py b/examples/103-autoscaling-pipeline.py index 1df07a1f..ea53b3a4 100644 --- a/examples/103-autoscaling-pipeline.py +++ b/examples/103-autoscaling-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("103-autoscaling") + .owner('argoproj-labs') .describe("""This is an example of having multiple replicas for a single step. Replicas are automatically scaled up and down depending on the number of messages pending processing. diff --git a/examples/103-autoscaling-pipeline.yaml b/examples/103-autoscaling-pipeline.yaml index ee8f8b85..643ba17a 100644 --- a/examples/103-autoscaling-pipeline.yaml +++ b/examples/103-autoscaling-pipeline.yaml @@ -32,6 +32,7 @@ metadata: You can scale to zero by setting `minReplicas: 0`. The number of replicas will start at zero, and periodically be scaled to 1 so it can "peek" the the message queue. The number of pending messages is measured and the target number of replicas re-calculated. + dataflow.argoproj.io/owner: argoproj-labs name: 103-autoscaling spec: steps: diff --git a/examples/103-scaling-pipeline.py b/examples/103-scaling-pipeline.py index e95d2e3a..5aca260e 100644 --- a/examples/103-scaling-pipeline.py +++ b/examples/103-scaling-pipeline.py @@ -2,7 +2,8 @@ if __name__ == '__main__': (pipeline("103-scaling") - .describe(""" This is an example of having multiple replicas for a single step. + .owner('argoproj-labs') + .describe("""This is an example of having multiple replicas for a single step. Steps can be manually scaled using `kubectl`: diff --git a/examples/103-scaling-pipeline.yaml b/examples/103-scaling-pipeline.yaml index 6e50ee00..38b20381 100644 --- a/examples/103-scaling-pipeline.yaml +++ b/examples/103-scaling-pipeline.yaml @@ -2,14 +2,15 @@ apiVersion: dataflow.argoproj.io/v1alpha1 kind: Pipeline metadata: annotations: - dataflow.argoproj.io/description: |2- - This is an example of having multiple replicas for a single step. + dataflow.argoproj.io/description: |- + This is an example of having multiple replicas for a single step. Steps can be manually scaled using `kubectl`: ``` kubectl scale step/scaling-main --replicas 3 ``` + dataflow.argoproj.io/owner: argoproj-labs name: 103-scaling spec: steps: diff --git a/examples/104-go1-16-pipeline.py b/examples/104-go1-16-pipeline.py index 43d44888..baeb94f2 100644 --- a/examples/104-go1-16-pipeline.py +++ b/examples/104-go1-16-pipeline.py @@ -7,6 +7,7 @@ def handler(msg): if __name__ == '__main__': (pipeline("104-go1-16") + .owner('argoproj-labs') .describe("""This example of Go 1.16 handler. [Learn about handlers](../docs/HANDLERS.md)""") diff --git a/examples/104-go1-16-pipeline.yaml b/examples/104-go1-16-pipeline.yaml index 45636f40..ce50dc22 100644 --- a/examples/104-go1-16-pipeline.yaml +++ b/examples/104-go1-16-pipeline.yaml @@ -6,6 +6,7 @@ metadata: This example of Go 1.16 handler. [Learn about handlers](../docs/HANDLERS.md) + dataflow.argoproj.io/owner: argoproj-labs name: 104-go1-16 spec: steps: diff --git a/examples/104-java16-pipeline.py b/examples/104-java16-pipeline.py index f1e7977e..cd3386be 100644 --- a/examples/104-java16-pipeline.py +++ b/examples/104-java16-pipeline.py @@ -7,6 +7,7 @@ def handler(msg): if __name__ == '__main__': (pipeline("104-java16") + .owner('argoproj-labs') .describe("""This example is of the Java 16 handler. [Learn about handlers](../docs/HANDLERS.md)""") diff --git a/examples/104-java16-pipeline.yaml b/examples/104-java16-pipeline.yaml index cb34d0f5..795fa3de 100644 --- a/examples/104-java16-pipeline.yaml +++ b/examples/104-java16-pipeline.yaml @@ -6,6 +6,7 @@ metadata: This example is of the Java 16 handler. [Learn about handlers](../docs/HANDLERS.md) + dataflow.argoproj.io/owner: argoproj-labs name: 104-java16 spec: steps: diff --git a/examples/104-python3-9-pipeline.py b/examples/104-python3-9-pipeline.py index b2f29c3e..fe2ac309 100644 --- a/examples/104-python3-9-pipeline.py +++ b/examples/104-python3-9-pipeline.py @@ -7,6 +7,7 @@ def handler(msg): if __name__ == '__main__': (pipeline("104-python3-9") + .owner('argoproj-labs') .describe("""This example is of the Python 3.9 handler. [Learn about handlers](../docs/HANDLERS.md)""") diff --git a/examples/104-python3-9-pipeline.yaml b/examples/104-python3-9-pipeline.yaml index 88247829..073f36e7 100644 --- a/examples/104-python3-9-pipeline.yaml +++ b/examples/104-python3-9-pipeline.yaml @@ -6,6 +6,7 @@ metadata: This example is of the Python 3.9 handler. [Learn about handlers](../docs/HANDLERS.md) + dataflow.argoproj.io/owner: argoproj-labs dataflow.argoproj.io/timeout: 2m name: 104-python3-9 spec: diff --git a/examples/106-git-pipeline.py b/examples/106-git-pipeline.py index 9ff1653e..c706d56a 100644 --- a/examples/106-git-pipeline.py +++ b/examples/106-git-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("106-git") + .owner('argoproj-labs') .describe("""This example of a pipeline using Git. The Git handler allows you to check your application source code into Git. Dataflow will checkout and build diff --git a/examples/106-git-pipeline.yaml b/examples/106-git-pipeline.yaml index c60ae0ca..9086da81 100644 --- a/examples/106-git-pipeline.yaml +++ b/examples/106-git-pipeline.yaml @@ -9,6 +9,7 @@ metadata: your code when the step starts. [Learn about Git steps](../docs/GIT.md) + dataflow.argoproj.io/owner: argoproj-labs name: 106-git spec: steps: diff --git a/examples/107-completion-pipeline.py b/examples/107-completion-pipeline.py index c5329a3c..3f5fe693 100644 --- a/examples/107-completion-pipeline.py +++ b/examples/107-completion-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("107-completion") + .owner('argoproj-labs') .describe("""This example shows a pipeline running to completion. A pipeline that run to completion (aka "terminating") is one that will finish. diff --git a/examples/107-completion-pipeline.yaml b/examples/107-completion-pipeline.yaml index 89970ba2..c2180ca4 100644 --- a/examples/107-completion-pipeline.yaml +++ b/examples/107-completion-pipeline.yaml @@ -11,6 +11,7 @@ metadata: * Every steps exits successfully (i.e. with exit code 0). * One step exits successfully, and is marked with `terminator: true`. When this happens, all other steps are killed. + dataflow.argoproj.io/owner: argoproj-labs dataflow.argoproj.io/wait-for: Completed name: 107-completion spec: diff --git a/examples/108-container-pipeline.py b/examples/108-container-pipeline.py index 2f57f66e..af2dbdee 100644 --- a/examples/108-container-pipeline.py +++ b/examples/108-container-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("108-container") + .owner('argoproj-labs') .describe("""This example showcases container options.""") .step( (container('main', diff --git a/examples/108-container-pipeline.yaml b/examples/108-container-pipeline.yaml index dd02fa47..f216e4fe 100644 --- a/examples/108-container-pipeline.yaml +++ b/examples/108-container-pipeline.yaml @@ -3,6 +3,7 @@ kind: Pipeline metadata: annotations: dataflow.argoproj.io/description: This example showcases container options. + dataflow.argoproj.io/owner: argoproj-labs name: 108-container spec: steps: diff --git a/examples/108-fifos-pipeline.py b/examples/108-fifos-pipeline.py index f2fd6021..5f9ce399 100644 --- a/examples/108-fifos-pipeline.py +++ b/examples/108-fifos-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("108-fifos") + .owner('argoproj-labs') .describe("""This example use named pipe to send and receive messages. Two named pipes are made available: diff --git a/examples/108-fifos-pipeline.yaml b/examples/108-fifos-pipeline.yaml index f7ebb3b2..c82142a6 100644 --- a/examples/108-fifos-pipeline.yaml +++ b/examples/108-fifos-pipeline.yaml @@ -11,6 +11,7 @@ metadata: * The contain can write to `/var/run/argo-dataflow/out`. Each line MUST be a single message. You MUST escape new lines. + dataflow.argoproj.io/owner: argoproj-labs name: 108-fifos spec: steps: diff --git a/examples/109-group-pipeline.py b/examples/109-group-pipeline.py index 384ab0e5..f99e5dca 100644 --- a/examples/109-group-pipeline.py +++ b/examples/109-group-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("109-group") + .owner('argoproj-labs') .describe("""This is an example of built-in grouping. WARNING: The spec/syntax not been finalized yet. Please tell us how you think it should work! diff --git a/examples/109-group-pipeline.yaml b/examples/109-group-pipeline.yaml index 66a4b338..1fb9b3e6 100644 --- a/examples/109-group-pipeline.yaml +++ b/examples/109-group-pipeline.yaml @@ -22,6 +22,7 @@ metadata: * An ephemeral volume - you don't mind loosing some or all messages (e.g. development or pre-production). * A persistent volume - you want to be to recover (e.g. production). + dataflow.argoproj.io/owner: argoproj-labs name: 109-group spec: steps: diff --git a/examples/201-vetinary-pipeline.py b/examples/201-vetinary-pipeline.py index f8a324bf..802e20e1 100644 --- a/examples/201-vetinary-pipeline.py +++ b/examples/201-vetinary-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("201-vetinary") + .owner('argoproj-labs') .describe("""This pipeline processes pets (cats and dogs).""") .annotate("dataflow.argoproj.io/test", "false") .annotate("dataflow.argoproj.io/needs", "pets-configmap.yaml") diff --git a/examples/201-vetinary-pipeline.yaml b/examples/201-vetinary-pipeline.yaml index cf5eb46d..b03d3748 100644 --- a/examples/201-vetinary-pipeline.yaml +++ b/examples/201-vetinary-pipeline.yaml @@ -4,6 +4,7 @@ metadata: annotations: dataflow.argoproj.io/description: This pipeline processes pets (cats and dogs). dataflow.argoproj.io/needs: pets-configmap.yaml + dataflow.argoproj.io/owner: argoproj-labs dataflow.argoproj.io/test: 'false' name: 201-vetinary spec: @@ -32,8 +33,7 @@ spec: - stan: subject: cats sources: - - stan: - subject: pets + - {} - map: |- json("Meow! " + object(msg).name) name: process-cats @@ -41,8 +41,7 @@ spec: - kafka: topic: output-topic sources: - - stan: - subject: cats + - {} - filter: |- string(msg) contains "dog" name: filter-dogs @@ -50,8 +49,7 @@ spec: - stan: subject: dogs sources: - - stan: - subject: pets + - {} - map: |- json("Woof! " + object(msg).name) name: process-dogs @@ -59,5 +57,4 @@ spec: - kafka: topic: output-topic sources: - - stan: - subject: dogs + - {} diff --git a/examples/201-word-count-pipeline.py b/examples/201-word-count-pipeline.py index 79190357..d97ff880 100644 --- a/examples/201-word-count-pipeline.py +++ b/examples/201-word-count-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("201-word-count") + .owner('argoproj-labs') .describe("""This pipeline count the number of words in a document, not the number of count of each word as you might expect. It also shows an example of a pipelines terminates based on a single step's status.""") diff --git a/examples/201-word-count-pipeline.yaml b/examples/201-word-count-pipeline.yaml index 43505cb3..29469940 100644 --- a/examples/201-word-count-pipeline.yaml +++ b/examples/201-word-count-pipeline.yaml @@ -7,6 +7,7 @@ metadata: It also shows an example of a pipelines terminates based on a single step's status. dataflow.argoproj.io/needs: word-count-input-configmap.yaml + dataflow.argoproj.io/owner: argoproj-labs dataflow.argoproj.io/test: 'false' name: 201-word-count spec: @@ -54,8 +55,7 @@ spec: - stan: subject: words sources: - - stan: - subject: lines + - {} - container: args: - bash @@ -75,6 +75,5 @@ spec: - kafka: topic: output-topic sources: - - stan: - subject: words + - {} terminator: true diff --git a/examples/301-cron-log-pipeline.py b/examples/301-cron-log-pipeline.py index 4730ffda..8b5ea8d6 100644 --- a/examples/301-cron-log-pipeline.py +++ b/examples/301-cron-log-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("301-cron-log") + .owner('argoproj-labs') .describe("""This example uses a cron source and a log sink. ## Cron diff --git a/examples/301-cron-log-pipeline.yaml b/examples/301-cron-log-pipeline.yaml index 794ebc92..253fbfb0 100644 --- a/examples/301-cron-log-pipeline.yaml +++ b/examples/301-cron-log-pipeline.yaml @@ -19,6 +19,7 @@ metadata: ## Log This logs the message. + dataflow.argoproj.io/owner: argoproj-labs name: 301-cron-log spec: steps: diff --git a/examples/301-erroring-pipeline.py b/examples/301-erroring-pipeline.py new file mode 100644 index 00000000..930f2cd0 --- /dev/null +++ b/examples/301-erroring-pipeline.py @@ -0,0 +1,24 @@ +from dsls.python import pipeline, cron + + +def handler(msg): + import random + if random.randint(0, 1) == 1: + raise Exception("random error") + return msg + + +if __name__ == '__main__': + (pipeline("301-erroring") + .owner('argoproj-labs') + .describe("""This example showcases retry policies.""") + .step( + (cron('*/3 * * * * *', retryPolicy='Always') + .handler('always', handler=handler) + .log()) + ) + .step( + (cron('*/3 * * * * *', retryPolicy='Never') + .handler('never', handler=handler) + .log()) + ).save()) diff --git a/examples/301-erroring-pipeline.yaml b/examples/301-erroring-pipeline.yaml index a552deef..c1005407 100644 --- a/examples/301-erroring-pipeline.yaml +++ b/examples/301-erroring-pipeline.yaml @@ -2,19 +2,38 @@ apiVersion: dataflow.argoproj.io/v1alpha1 kind: Pipeline metadata: annotations: - dataflow.argoproj.io/description: | - This example creates errors randomly - dataflow.argoproj.io/wait-for: Errors - creationTimestamp: null - name: erroring + dataflow.argoproj.io/description: This example showcases retry policies. + dataflow.argoproj.io/owner: argoproj-labs + name: 301-erroring spec: steps: - handler: - code: "package main\n\nimport (\n\t\"fmt\"\n\t\"math/rand\"\n)\n\nfunc Handler(m []byte) ([]byte, error) {\n\tif rand.Int()%2 == 0 {\n\t\treturn nil, fmt.Errorf(\"random error\")\n\t}\n\treturn []byte(\"hi \" + string(m)), nil\n}\n" - runtime: go1-16 - name: main + code: | + def handler(msg): + import random + if random.randint(0, 1) == 1: + raise Exception("random error") + return msg + runtime: python3-9 + name: always sinks: - log: {} sources: - cron: schedule: '*/3 * * * * *' + retryPolicy: Always + - handler: + code: | + def handler(msg): + import random + if random.randint(0, 1) == 1: + raise Exception("random error") + return msg + runtime: python3-9 + name: never + sinks: + - log: {} + sources: + - cron: + schedule: '*/3 * * * * *' + retryPolicy: Never diff --git a/examples/301-http-pipeline.py b/examples/301-http-pipeline.py index f260988a..27fb7eeb 100644 --- a/examples/301-http-pipeline.py +++ b/examples/301-http-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("301-http") + .owner('argoproj-labs') .describe("""This example uses a HTTP sources and sinks. HTTP has the advantage that it is stateless and therefore cheap. You not need to set-up any storage for your diff --git a/examples/301-http-pipeline.yaml b/examples/301-http-pipeline.yaml index 24c1405e..2a306d3e 100644 --- a/examples/301-http-pipeline.yaml +++ b/examples/301-http-pipeline.yaml @@ -7,6 +7,7 @@ metadata: \ to set-up any storage for your\nmessages between steps. \n\n* HTTP sinks are\ \ *unreliable* because it is possible for messages to not get delivered when\ \ the receiving service is down.\n" + dataflow.argoproj.io/owner: argoproj-labs dataflow.argoproj.io/test: 'true' name: 301-http spec: diff --git a/examples/301-kafka-pipeline.py b/examples/301-kafka-pipeline.py index 513e475e..656830e4 100644 --- a/examples/301-kafka-pipeline.py +++ b/examples/301-kafka-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("301-kafka") + .owner('argoproj-labs') .describe("""This example shows reading and writing to a Kafka topic""") .annotate("dataflow.argoproj.io/test", "true") .step( diff --git a/examples/301-kafka-pipeline.yaml b/examples/301-kafka-pipeline.yaml index aaf880fa..3546dfc0 100644 --- a/examples/301-kafka-pipeline.yaml +++ b/examples/301-kafka-pipeline.yaml @@ -4,6 +4,7 @@ metadata: annotations: dataflow.argoproj.io/description: This example shows reading and writing to a Kafka topic + dataflow.argoproj.io/owner: argoproj-labs dataflow.argoproj.io/test: 'true' name: 301-kafka spec: diff --git a/examples/301-parallel-pipeline.py b/examples/301-parallel-pipeline.py index 20305b88..cae06dc9 100644 --- a/examples/301-parallel-pipeline.py +++ b/examples/301-parallel-pipeline.py @@ -1,11 +1,12 @@ -from dsls.python import pipeline, kafka +from dsls.python import pipeline, stan if __name__ == '__main__': (pipeline("301-parallel") + .owner('argoproj-labs') .describe("""This example uses parallel to 2x the amount of data it processes.""") .annotate("dataflow.argoproj.io/test", "false") .step( - (kafka('input-topic', parallel=2) + (stan('input-subject', parallel=2) .cat('main') .log() )) diff --git a/examples/301-parallel-pipeline.yaml b/examples/301-parallel-pipeline.yaml index ef9f4b24..eca8b468 100644 --- a/examples/301-parallel-pipeline.yaml +++ b/examples/301-parallel-pipeline.yaml @@ -4,6 +4,7 @@ metadata: annotations: dataflow.argoproj.io/description: This example uses parallel to 2x the amount of data it processes. + dataflow.argoproj.io/owner: argoproj-labs dataflow.argoproj.io/test: 'false' name: 301-parallel spec: @@ -13,6 +14,6 @@ spec: sinks: - log: {} sources: - - kafka: + - stan: parallel: 2 - topic: input-topic + subject: input-subject diff --git a/examples/301-stan-pipeline.py b/examples/301-stan-pipeline.py index 894fbbe7..d014310f 100644 --- a/examples/301-stan-pipeline.py +++ b/examples/301-stan-pipeline.py @@ -2,6 +2,7 @@ if __name__ == '__main__': (pipeline("301-stan") + .owner('argoproj-labs') .describe("""This example shows reading and writing to a STAN subject""") .step( (stan('input-subject') diff --git a/examples/301-stan-pipeline.yaml b/examples/301-stan-pipeline.yaml index 7978cef6..d6809b65 100644 --- a/examples/301-stan-pipeline.yaml +++ b/examples/301-stan-pipeline.yaml @@ -4,6 +4,7 @@ metadata: annotations: dataflow.argoproj.io/description: This example shows reading and writing to a STAN subject + dataflow.argoproj.io/owner: argoproj-labs name: 301-stan spec: steps: @@ -13,5 +14,4 @@ spec: - stan: subject: output-subject sources: - - stan: - subject: input-subject + - {} diff --git a/runner/sidecar/handler.go b/runner/sidecar/handler.go index cb517107..6c453ecf 100644 --- a/runner/sidecar/handler.go +++ b/runner/sidecar/handler.go @@ -32,8 +32,11 @@ func (h *handler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.Co for m := range claim.Messages() { h.partition = m.Partition h.offset = m.Offset - _ = h.f(m.Value) // TODO we should provide a way to deal with errors here, e.g. retries - sess.MarkMessage(m, "") + if err := h.f(m.Value); err != nil { + // noop + } else { + sess.MarkMessage(m, "") + } } return nil } diff --git a/runner/sidecar/sidecar.go b/runner/sidecar/sidecar.go index a879205c..31579d86 100644 --- a/runner/sidecar/sidecar.go +++ b/runner/sidecar/sidecar.go @@ -311,8 +311,6 @@ func connectSources(ctx context.Context, toMain func([]byte) error) error { } sources[sourceName] = true - rateCounter := ratecounter.NewRateCounter(updateInterval) - if replica == 0 { // only replica zero updates this value, so it the only replica that can be accurate promauto.NewCounterFunc(prometheus.CounterOpts{ Subsystem: "sources", @@ -336,21 +334,42 @@ func connectSources(ctx context.Context, toMain func([]byte) error) error { }, func() float64 { return float64(step.Status.SourceStatuses.Get(sourceName).GetErrors()) }) } + rateCounter := ratecounter.NewRateCounter(updateInterval) + retryPolicy := source.RetryPolicy f := func(msg []byte) error { rateCounter.Incr(1) withLock(func() { step.Status.SourceStatuses.Set(sourceName, replica, printable(msg), rateToResourceQuantity(rateCounter)) }) - if err := toMain(msg); err != nil { - logger.Error(err, "⚠ →", "source", sourceName) + err := wait.ExponentialBackoff(wait.Backoff{ + Duration: 100 * time.Millisecond, + Factor: 2, + Cap: time.Second, + }, func() (done bool, err error) { + select { + case <-ctx.Done(): + return true, ctx.Err() + default: + if err := toMain(msg); err != nil { + logger.Error(err, "⚠ →", "source", sourceName) + switch retryPolicy { + case dfv1.RetryNever: + return true, err + default: + return false, nil + } + } + } + return true, nil + }) + if err != nil { withLock(func() { step.Status.SourceStatuses.IncErrors(sourceName, replica, err) }) - return err } - return nil + return err } if x := source.Cron; x != nil { _, err := crn.AddFunc(x.Schedule, func() { - _ = f([]byte(time.Now().Format(x.Layout))) + _ = f([]byte(time.Now().Format(x.Layout))) // TODO }) if err != nil { return fmt.Errorf("failed to schedule cron %q: %w", x.Schedule, err) @@ -396,6 +415,7 @@ func connectSources(ctx context.Context, toMain func([]byte) error) error { } config.Consumer.Return.Errors = true config.Consumer.Offsets.Initial = sarama.OffsetNewest + config.Consumer.Offsets.AutoCommit.Enable = false client, err := sarama.NewClient(x.Brokers, config) // I am not giving any configuration if err != nil { return err